Слова тоже векторы
До этого мы рассматривали работу с какими-то абстрактными данными.
Сейчас будет целый урок про достаточно конкретный пример (просто мне он показался хорошим примером интересного использования геометрии данных).
Пусть мы хотим написать что-нибудь, работающее со словами.
Это может быть сервис с синонимами, большая языковая модель, переводчик, анализатор статей и так далее, примеров можно много придумать
В общем те задачи, где нам желательно, чтобы компьютер понималсмысл слов, видел между ними связи и тому подобное.
Мы будем заходить через нашу любимую науку - линейную алгебру.
Каждому слову сопоставим вектор из, допустим, 100 чисел
Но как к ним привязать смысл?
Главная идея всех алгоритмов (например, Word2Vec или GloVe) звучит очень просто:
«Слова, которые встречаются в похожих контекстах, должны иметь близкие векторы».
Как это превращается в геометрию?
- Изначально все векторы слов разбросаны случайно.
- Алгоритм «смотрит» на текст: если слова «кот» и «собака» часто появляются рядом со словами «кормить», «пушистый», «ветеринар», то он начинает подтягивать их векторы друг к другу.
- Одновременно он отталкивает их от случайных слов (например, от слова «компьютер»).
Это похоже на то, как если бы в пространстве действовали силы притяжения и отталкивания — в итоге образуются кластеры по темам.
При этом, оценка их «близости» работает через косинусное сходство, ведь как мы поняли в прошлых уроках, обычное расстояние начинает ломаться в высоких размерностях.
Так как наборы слов формируют честное векторное пространство, над ними работают все правила линейной алгебры: сложение, вычитание и сдвиги
Возьмём знаменитый пример:
Разберём, что происходит с геометрической точки зрения:
- Операция вычитания
Мы берем вектор слова **«король»**и вычитаем из него вектор «мужчина». В результате получается вектор разности, который выделяет абстрактное смысловое направление — королевский титул / монархия безотносительно пола 2. Операция сложения :
Мы прибавляем полученную разность к вектору «женщина», сдвигая точку в пространстве вдоль условного направления «гендера» 3. Поиск результата:
Итоговая точка в пространстве почти никогда не совпадёт идеально с координатой какого-то конкретного слова. Поэтому алгоритм ищет ближайший вектор по косинусному сходству среди всех слов в словаре. И этим ближайшим соседом оказывается вектор слова «королева».
Похожим принципом работают и многие современные нейросети.
Их задача найти ближайшее по смыслу слово в данном контексте.
И нужный смысл это точка в пространстве.
А нейросеть выдаёт ближайшее к этой точке слово.
Такой подход так же помогает просто искать скрытые зависимости между смыслами слов, которые в обычной речи могут быть не так очевидны
У статичных эмбеддингов (где у каждого слова один вектор) есть очевидная проблема - омонимы: слово «ключ» (дверной и скрипичный) получает один вектор, хотя смыслы разные. Из-за этого система может вообще перестать работать и постоянно путать смысла.
Ещё, это может привести к полному ломанию некоторых контекстов.
Так как слова между друг другом связаны в похожих контекстах, этот «ключ» от двери может начать в тему строительства **“утаскивать”**и всю музыку.
Получится, что у нас музыка похожа на строительство, что кажется чуть-чуть бредом (так и есть).
Поэтому более современные модели пошли дальше: они выдают разные векторы для одного и того же слова в разных контекстах.
Модель смотрит на то, в каких контекстах появляется слово. Если есть какие-то два(или больше) сильно различающихся контекста, где используется одно слово, модель просто выдаёт для этого слова два вектора для каждого из контекстов.
Получается, условно, **«ключ_1»**и «ключ_2»
Это позволяет частично решить ранее обсуждаемые проблемы.
Ещё более современные модели пересчитывают слова под каждый контекст отдельно каждый раз, называется данная технология “динамический эмбенддинг”, но этот материал уже за рамками данного курса.
Основные из таких: ELMo, BERT