Практически уроци

Тълкуване на семантична текстова прилика от трансформаторни модели

Можем ли да визуализираме контекста, използван за търсене?

Използването на базирани на трансформатор модели за търсене на текстови документи е страхотно; в днешно време е лесно да се приложи с помощта на библиотеката huggingface и резултатите често са много впечатляващи. Наскоро исках да разбера защодаден резултат беше върнат – първоначалните ми мисли бяха насочени към различни статии и публикации в блогове, свързани с копаене в механизмите за внимание вътре в трансформаторите, което изглежда малко намесено. В тази публикация изпробвам много прост подход, за да надникна в контекстните прилики, открити от тези модели, когато правя контекстно търсене с някаква проста векторна математика. Нека да го изпробваме.

За целите на тази публикация ще използвам модел от библиотеката sentence-transformers, която е специално оптимизирана за извършване на семантични текстови търсения за сходство. Моделът по същество създава 1024-измерно вграждане за всяко изречение, предадено към него, и приликата между две такива изречения след това може да бъде изчислена чрез косинусната прилика между съответните два вектора. Да кажем, че имаме два въпроса A и B, които се вграждат в 1024-измерни вектори Aи B, съответно, косинусното сходство между изреченията се изчислява, както следва:

т.е. косинусово сходство 1 означава, че въпросите са идентични (ъгълът е 0), а косинусово сходство -1 означава, че въпросите са много различни. За целите на демонстрацията вградих набор от 1700 въпроса от ARC набор от данни за класификация на въпроси. Пълният бележник може да бъде намерен в google colab тук. Съществената част от извършването на вграждането на изречения може да се види в следния фрагмент:

С това можем лесно да извършваме търсения в нашата база данни с въпроси; да кажем, че имаме база данни от 1700 въпроса, които сме вградили в матрица 1700 × 1024, използвайки горния фрагмент. Първата стъпка би била L2 да нормализира всеки ред — това по същество означава, че нормализираме всеки въпросителен вектор, за да има дължина 1, което опростява нашето предишно уравнение, така че косинусното подобие между A и B е просто точковото произведение на двата вектора. Следвайки вгражданията, създадени в предишния фрагмент, можем да се преструваме, че първият въпрос в нашия набор от данни е нашата заявка и да се опитаме да намерим най-близкия съответстващ запис от останалите въпроси:

В моя примерен набор от данни първият въпрос (заявка) беше „Кой фактор най-вероятно ще накара човек да развие треска?“, а идентифицираният най-сходен въпрос беше „Кой най-добре обяснява защо човек заразен с бактерии може да има треска?”. Това е доста добро съвпадение 🙌— и двете изречения се отнасят за човек, който развива треска. Как обаче да знаем, че причината алгоритъмът да избере това конкретно съвпадение не е само защото и двете започват с думата „Кое“?

Нещото, което трябва да запомните е, че по дизайн трансформаторните модели всъщност извеждат 1024-измерен вектор за всеки токен в нашите изречения — тези вграждания на токени се обединяват, за да генерират нашето изречение вграждания. По този начин, за да получим повече информация относно контекста, използван за намиране на съвпадението в нашата заявка за търсене, бихме могли да изчислим косинусното разстояние между всеки токен в нашата заявка и нашето съвпадение при търсене и да начертаем получената 2D матрица:

Което води до следния сюжет:

Сега можем да видим косинусното сходство между всеки токен в заявката и всеки токен в най-добрия резултат от търсенето. Ясно е, че наистина ключовата дума „треска“ е взета и е основна част от „семантичния контекст“, който е довел до резултата от търсенето — но също така е ясно, че има допълнителни компоненти, влизащи в семантичния контекст, напр. „да разработят“ и „имат“ се комбинират с висок резултат за сходство по косинус и ключовата дума „лице“ също е взета, докато началната дума „което“, присъстваща и в двете изречения, е по-малко важна.

Тази проста техника за изчисляване на косинусното сходство между всички вграждания на токени дава представа за приноса на всеки токен към крайния резултат за сходство и по този начин е бърз начин да се обясни какво прави моделът, когато връща даден резултат от търсенето. Трябва да се отбележи, че когато извършваме действителното търсене, ние вземаме средната стойност на всички вграждания на токени, преди да изчислим косинусното сходство между различни вграждания на изречения, което е различно от това, което правим тук – дори и така, виждайки как всяко вграждане на токени от заявката е подравнена спрямо вгражданията на токени в най-доброто съвпадение, дава представа какво съставлява тези вграждания на изречения, използвани за семантично търсене.