Векторное представление слов — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (ELMO)
м (rollbackEdits.php mass rollback)
 
(не показана 21 промежуточная версия 4 участников)
Строка 2: Строка 2:
  
 
== One-hot encoding ==
 
== One-hot encoding ==
[[Файл:One-hot-encoding.png|thumb|right|250px|[https://www.shanelynn.ie/get-busy-with-word-embeddings-introduction/ Источник]]]  
+
[[Файл:One-hot-encoding.png|thumb|right|220px| Рисунок 1. Пример one-hot encoding для словаря из 9 слов. [https://www.shanelynn.ie/get-busy-with-word-embeddings-introduction/ Источник]]]  
Пусть число различных слов равно <math>K</math>. Сопоставим слову с номером <math>i</math> вектор длины <math>K</math>, в котором <math>i</math>-тая координата равна единице, а все остальные {{---}} нулям. Недостатком one-hot encoding является то, что по векторным представлениям нельзя судить о схожести смысла слов. Также вектора имеют очень большой размер, из-за чего их неэффективно хранить в памяти.
+
Пусть число различных слов равно <math>K</math>. Сопоставим слову с номером <math>i</math> вектор длины <math>K</math>, в котором <math>i</math>-тая координата равна единице, а все остальные {{---}} нулям (рис. 1). Недостатком one-hot encoding является то, что по векторным представлениям нельзя судить о схожести смысла слов. Также вектора имеют очень большой размер, из-за чего их неэффективно хранить в памяти.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
 
== word2vec ==
 
== word2vec ==
word2vec {{---}} способ построения сжатого пространства векторов слов, использующий нейронные сети. Принимает на вход большой текстовый корпус и сопоставляет каждому слову вектор. Сначала он создает словарь, а затем вычисляет векторное представление слов. Векторное представление основывается на контекстной близости: слова, встречающиеся в тексте рядом с одинаковыми словами (а следовательно, имеющие схожий смысл), в векторном представлении имеют высокое ''косинусное сходство'' (англ. [https://en.wikipedia.org/wiki/Cosine_similarity cosine similarity]):
+
[[Файл:Words-space.png|thumb|right|400px|Рисунок 2. Полученные векторы-слова отражают различные грамматические и семантические [https://towardsdatascience.com/word-embedding-with-word2vec-and-fasttext-a209c1d3e12c концепции].<br>
 +
<math>W_{king} + (W_{woman} - W_{man}) = W_{queen}</math><br>
 +
<math>W_{walked} - W_{walking} = W_{swam} - W_{swimming}</math>]]
 +
word2vec {{---}} способ построения сжатого пространства векторов слов, использующий нейронные сети. Принимает на вход большой текстовый корпус и сопоставляет каждому слову вектор. Сначала он создает словарь, а затем вычисляет векторное представление слов. Векторное представление основывается на контекстной близости: слова, встречающиеся в тексте рядом с одинаковыми словами (а следовательно, имеющие схожий смысл) (рис. 2), в векторном представлении имеют высокое ''косинусное сходство'' (англ. [https://en.wikipedia.org/wiki/Cosine_similarity cosine similarity]):
  
 
:<math>\text{similarity}(\mathbf{A}, \mathbf{B}) = \cos(\theta) = {\mathbf{A} \cdot \mathbf{B} \over \|\mathbf{A}\| \|\mathbf{B}\|} = \frac{ \sum\limits_{i=1}^{n}{A_i  B_i} }{ \sqrt{\sum\limits_{i=1}^{n}{A_i^2}}  \sqrt{\sum\limits_{i=1}^{n}{B_i^2}} },</math>
 
:<math>\text{similarity}(\mathbf{A}, \mathbf{B}) = \cos(\theta) = {\mathbf{A} \cdot \mathbf{B} \over \|\mathbf{A}\| \|\mathbf{B}\|} = \frac{ \sum\limits_{i=1}^{n}{A_i  B_i} }{ \sqrt{\sum\limits_{i=1}^{n}{A_i^2}}  \sqrt{\sum\limits_{i=1}^{n}{B_i^2}} },</math>
  
 
+
В word2vec существуют две основных модели обучения: ''Skip-gram'' (рис. 3) и ''CBOW'' (англ. ''Continuous Bag of Words'') (рис. 4). В модели ''Skip-gram'' по слову предсказываются слова из его контекста, а в модели ''CBOW'' по контексту подбирается наиболее вероятное слово. На выходном слое используется функция <math>softmax</math> или его вариация, чтобы получить на выходе распределение вероятности каждого слова. В обеих моделях входные и выходные слова подаются в one-hot encoding, благодаря чему при умножении на матрицу <math>W</math>, соединяющую входной и скрытый слои, происходит выбор одной строки <math>W</math>. Размерность <math>N</math> является гиперпараметром алгоритма, а обученная матрица <math>W</math> {{---}} выходом, так как ее строки содержат векторные представления слов.
В word2vec существуют две основных модели обучения: ''Skip-gram'' и ''CBOW'' (англ. ''Continuous Bag of Words''). В модели ''Skip-gram'' по слову предсказываются слова из его контекста, а в модели ''CBOW'' по контексту подбирается наиболее вероятное слово. На выходном слое используется функция <math>softmax</math> или его вариация, чтобы получить на выходе распределение вероятности каждого слова. В обеих моделях входные и выходные слова подаются в one-hot encoding, благодаря чему при умножении на матрицу <math>W</math>, соединяющую входной и скрытый слои, происходит выбор одной строки <math>W</math>. Размерность <math>N</math> является гиперпараметром алгоритма, а обученная матрица <math>W</math> {{---}} выходом, так как ее строки содержат векторные представления слов.
 
  
 
Для ускорения обучения моделей ''Skip-gram'' и CBOW используются модификации <math>softmax</math>, такие как иерархический <math>softmax</math> и ''negative sampling'', позволяющие вычислять распределение вероятностей быстрее, чем за линейное время от размера словаря.
 
Для ускорения обучения моделей ''Skip-gram'' и CBOW используются модификации <math>softmax</math>, такие как иерархический <math>softmax</math> и ''negative sampling'', позволяющие вычислять распределение вероятностей быстрее, чем за линейное время от размера словаря.
Строка 27: Строка 19:
 
{|align="center"
 
{|align="center"
 
  |-valign="top"
 
  |-valign="top"
  |[[Файл:skip-gram.png|270px|thumb|[http://www.claudiobellei.com/2018/01/06/backprop-word2vec/ Схема сети для модели Skip-gram]]]
+
  |[[Файл:skip-gram.png|270px|thumb|Рисунок 3. [http://www.claudiobellei.com/2018/01/06/backprop-word2vec/ Схема сети для модели Skip-gram]]]
  |[[Файл:cbow.png|260px|thumb|[http://www.claudiobellei.com/2018/01/06/backprop-word2vec/ Схема сети для модели CBOW]]]
+
  |[[Файл:cbow.png|260px|thumb|Рисунок 4. [http://www.claudiobellei.com/2018/01/06/backprop-word2vec/ Схема сети для модели CBOW]]]
|[[Файл:Words-space.png|thumb|right|500px|Полученные векторы-слова отражают различные грамматические и семантические [https://towardsdatascience.com/word-embedding-with-word2vec-and-fasttext-a209c1d3e12c концепции].<br>
 
<math>W_{king} + (W_{woman} - W_{man}) = W_{queen}</math><br>
 
<math>W_{walked} - W_{walking} = W_{swam} - W_{swimming}</math>]]
 
 
  |}
 
  |}
  
Строка 80: Строка 69:
  
 
== ELMO ==
 
== ELMO ==
[[File:ElmoExplain.jpg|600px|thumb|Архитектура и принцип работы ELMO]]
+
[[File:ElmoExplain.jpg|600px|thumb| Рисунок 5. [https://www.topbots.com/generalized-language-models-cove-elmo/ Архитектура и принцип работы ELMO]]]
<i>ELMO</i> {{---}} это многослойная двунаправленная [[:Рекуррентные_нейронные_сети|рекуррентная нейронная сеть]] c [[:Долгая_краткосрочная_память|LSTM]].
+
<i>ELMO</i> {{---}} это многослойная двунаправленная [[:Рекуррентные_нейронные_сети|рекуррентная нейронная сеть]] c [[:Долгая_краткосрочная_память|LSTM]] (рис. 5).
 
При использовании word2vec или fastText не учитывается семантическая неоднозначность слов.
 
При использовании word2vec или fastText не учитывается семантическая неоднозначность слов.
 
Так, word2vec назначает слову один вектор независимо от контекста.
 
Так, word2vec назначает слову один вектор независимо от контекста.
Строка 94: Строка 83:
 
<math>\left \{ {x_{k}^{LM}}, \overrightarrow{h_{k, j}^{LM}}, \overleftarrow{h_{k, j}^{LM}} | j = 1, ..., L \right \} = \left \{ h_{k, j}^{LM} | j = 1, ..., L \right \}</math>.
 
<math>\left \{ {x_{k}^{LM}}, \overrightarrow{h_{k, j}^{LM}}, \overleftarrow{h_{k, j}^{LM}} | j = 1, ..., L \right \} = \left \{ h_{k, j}^{LM} | j = 1, ..., L \right \}</math>.
  
Здесь <math>x_{k}^{LM}</math> {{---}}, входящий токен, а <math>\overrightarrow{h_{k, j}^{LM}}</math> и <math>\overleftarrow{h_{k, j}^{LM}}</math> {{---}} скрытые слои в одном и в другом направлении.
+
Здесь <math>x_{k}^{LM}</math> {{---}} входящий токен, а <math>\overrightarrow{h_{k, j}^{LM}}</math> и <math>\overleftarrow{h_{k, j}^{LM}}</math> {{---}} скрытые слои в одном и в другом направлении.
  
 
Тогда результат работы ELMO будет представлять из себя выражение:
 
Тогда результат работы ELMO будет представлять из себя выражение:
Строка 101: Строка 90:
 
Обучаемый общий масштабирующий коэффициент <math>\gamma^{task}</math> регулирует то, как могут отличаться друг от друга по норме векторные представления слов.
 
Обучаемый общий масштабирующий коэффициент <math>\gamma^{task}</math> регулирует то, как могут отличаться друг от друга по норме векторные представления слов.
  
Коэффициенты <math>s_{i}^{task}</math> {{---}} это обучаемые параметры, нормализованные функцией <math>softMax</math>.
+
Коэффициенты <math>s_{i}^{task}</math> {{---}} это обучаемые параметры, нормализованные функцией <math>Softmax</math>.
  
 
Модель применяют дообучая ее: изначально берут предобученную <i>ELMO</i>, а затем корректируют <math>\gamma</math> и <math>s_{i}</math> под конкретную задачу. Тогда вектор, который подается в используемую модель для обучения, будет представлять собой взвешенную сумму значений этого векторах на всех скрытых слоях <i>ELMO</i>.
 
Модель применяют дообучая ее: изначально берут предобученную <i>ELMO</i>, а затем корректируют <math>\gamma</math> и <math>s_{i}</math> под конкретную задачу. Тогда вектор, который подается в используемую модель для обучения, будет представлять собой взвешенную сумму значений этого векторах на всех скрытых слоях <i>ELMO</i>.
  
На данный момент предобученную модель ELMO можно загрузить и использовать в языке программирования Python.
+
На данный момент предобученную модель ELMO можно [https://tfhub.dev/google/elmo/3 загрузить] и использовать в языке программирования Python.
  
 
== BERT ==
 
== BERT ==
{{main|BERT}}
+
{{main|BERT (языковая модель)}}
[[File:Bert.png|500px|thumb|Архитектура BERT]]
+
[[File:Bert.png|500px|thumb|Рисунок 6. [https://towardsdatascience.com/bert-why-its-been-revolutionizing-nlp-5d1bcae76a13 Архитектура BERT]]]
<i>BERT</i> {{---}} это многослойный двунаправленный [[:Автокодировщик|кодировщик]] Transformer. В данной архитектуре используется двунаправленное [[:Механизм внимания|самовнимание]].  
+
<i>BERT</i> {{---}} это многослойный двунаправленный [[:Автокодировщик|кодировщик]] Transformer. В данной архитектуре (рис. 6) используется двунаправленное [[:Механизм внимания|самовнимание]] (англ. self-attention).  
 
Модель используется в совокупности с некоторым классификатором, на вход которого подается результат работы <i>BERT</i> {{---}} векторное представление входных данных.
 
Модель используется в совокупности с некоторым классификатором, на вход которого подается результат работы <i>BERT</i> {{---}} векторное представление входных данных.
В основе обучения модели лежат две идеи для обучения.
+
В основе обучения модели лежат две идеи.
  
 
Первая заключается в том, чтобы заменить <math>15\%</math> слов масками и обучить сеть предсказывать эти слова.  
 
Первая заключается в том, чтобы заменить <math>15\%</math> слов масками и обучить сеть предсказывать эти слова.  
Строка 119: Строка 108:
  
 
Точно так же, как и в обычном трансформере, <i>BERT</i> принимает на вход последовательность слов, которая затем продвигается вверх по стеку энкодеров.
 
Точно так же, как и в обычном трансформере, <i>BERT</i> принимает на вход последовательность слов, которая затем продвигается вверх по стеку энкодеров.
Каждый слой энкодера применяет внутреннее внимание (self-attention) и передает результаты в сеть прямого распространения, после чего направляет его следующему энкодеру.
+
Каждый слой энкодера применяет самовнимание и передает результаты в сеть прямого распространения, после чего направляет его следующему энкодеру.
  
 
Для каждой позиции на выход подается вектор размерностью <math>hiddenSize</math> (<math>768</math> в базовой модели).
 
Для каждой позиции на выход подается вектор размерностью <math>hiddenSize</math> (<math>768</math> в базовой модели).
 
Этот вектор может быть использован как входной вектор для классификатора.
 
Этот вектор может быть использован как входной вектор для классификатора.
  
Bert поддерживается в качестве модели, которую можно загрузить, в языке Python.
+
Bert поддерживается в качестве модели в языке Python, которую можно [https://github.com/google-research/bert загрузить].
  
 
== См. также ==
 
== См. также ==

Текущая версия на 19:15, 4 сентября 2022

Векторное представление слов (англ. word embedding) — общее название для различных подходов к моделированию языка и обучению представлений в обработке естественного языка, направленных на сопоставление словам из некоторого словаря векторов небольшой размерности.

One-hot encoding

Рисунок 1. Пример one-hot encoding для словаря из 9 слов. Источник

Пусть число различных слов равно [math]K[/math]. Сопоставим слову с номером [math]i[/math] вектор длины [math]K[/math], в котором [math]i[/math]-тая координата равна единице, а все остальные — нулям (рис. 1). Недостатком one-hot encoding является то, что по векторным представлениям нельзя судить о схожести смысла слов. Также вектора имеют очень большой размер, из-за чего их неэффективно хранить в памяти.

word2vec

Рисунок 2. Полученные векторы-слова отражают различные грамматические и семантические концепции.
[math]W_{king} + (W_{woman} - W_{man}) = W_{queen}[/math]
[math]W_{walked} - W_{walking} = W_{swam} - W_{swimming}[/math]

word2vec — способ построения сжатого пространства векторов слов, использующий нейронные сети. Принимает на вход большой текстовый корпус и сопоставляет каждому слову вектор. Сначала он создает словарь, а затем вычисляет векторное представление слов. Векторное представление основывается на контекстной близости: слова, встречающиеся в тексте рядом с одинаковыми словами (а следовательно, имеющие схожий смысл) (рис. 2), в векторном представлении имеют высокое косинусное сходство (англ. cosine similarity):

[math]\text{similarity}(\mathbf{A}, \mathbf{B}) = \cos(\theta) = {\mathbf{A} \cdot \mathbf{B} \over \|\mathbf{A}\| \|\mathbf{B}\|} = \frac{ \sum\limits_{i=1}^{n}{A_i B_i} }{ \sqrt{\sum\limits_{i=1}^{n}{A_i^2}} \sqrt{\sum\limits_{i=1}^{n}{B_i^2}} },[/math]

В word2vec существуют две основных модели обучения: Skip-gram (рис. 3) и CBOW (англ. Continuous Bag of Words) (рис. 4). В модели Skip-gram по слову предсказываются слова из его контекста, а в модели CBOW по контексту подбирается наиболее вероятное слово. На выходном слое используется функция [math]softmax[/math] или его вариация, чтобы получить на выходе распределение вероятности каждого слова. В обеих моделях входные и выходные слова подаются в one-hot encoding, благодаря чему при умножении на матрицу [math]W[/math], соединяющую входной и скрытый слои, происходит выбор одной строки [math]W[/math]. Размерность [math]N[/math] является гиперпараметром алгоритма, а обученная матрица [math]W[/math] — выходом, так как ее строки содержат векторные представления слов.

Для ускорения обучения моделей Skip-gram и CBOW используются модификации [math]softmax[/math], такие как иерархический [math]softmax[/math] и negative sampling, позволяющие вычислять распределение вероятностей быстрее, чем за линейное время от размера словаря.

fastText

Недостатком word2vec является то, что с его помощью не могут быть представлены слова, не встречающиеся в обучающей выборке. fastText решает эту проблему с помощью [math]N[/math]-грамм символов. Например, [math]3[/math]-граммами для слова яблоко являются ябл, бло, лок, око. Модель fastText строит векторные представления [math]N[/math]-грамм, а векторным представлением слова является сумма векторных представлений всех его [math]N[/math]-грамм. Части слов с большой вероятностью встречаются и в других словах, что позволяет выдавать векторные представления и для редких слов.

Примеры кода с использованием библиотеки Gensim

Загрузка предобученной модели русского корпуса

import gensim
import gensim.downloader as download_api
russian_model = download_api.load('word2vec-ruscorpora-300')
# Выведем первые 10 слов корпуса.
#
В модели "word2vec-ruscorpora-300" после слова указывается часть речи: NOUN (существительное), ADJ (прилагательное) и так далее.
#
Но существуют также предоубученные модели без разделения слов по частям речи, смотри репозиторий
list(russian_model.vocab.keys())[:10] # ['весь_DET', 'человек_NOUN', 'мочь_VERB', 'год_NOUN', 'сказать_VERB', 'время_NOUN', 'говорить_VERB', 'становиться_VERB', 'знать_VERB', 'самый_DET']
# Поиск наиболее близких по смыслу слов. russian_model.most_similar('кошка_NOUN') # [('кот_NOUN', 0.7570087909698486), ('котенок_NOUN', 0.7261239290237427), ('собака_NOUN', 0.6963180303573608), # ('мяукать_VERB', 0.6411399841308594), ('крыса_NOUN', 0.6355636119842529), ('собачка_NOUN', 0.6092042922973633), # ('щенок_NOUN', 0.6028496026992798), ('мышь_NOUN', 0.5975362062454224), ('пес_NOUN', 0.5956044793128967), # ('кошечка_NOUN', 0.5920293927192688)]
# Вычисление сходства слов russian_model.similarity('мужчина_NOUN', 'женщина_NOUN') # 0.85228276
# Поиск лишнего слова russian_model.doesnt_match('завтрак_NOUN хлопья_NOUN обед_NOUN ужин_NOUN'.split()) # хлопья_NOUN
# Аналогия: Женщина + (Король - Мужчина) = Королева russian_model.most_similar(positive=['король_NOUN','женщина_NOUN'], negative=['мужчина_NOUN'], topn=1) # [('королева_NOUN', 0.7313904762268066)]
# Аналогия: Франция = Париж + (Германия - Берлин) russian_model.most_similar(positive=['париж_NOUN','германия_NOUN'], negative=['берлин_NOUN'], topn=1) # [('франция_NOUN', 0.8673800230026245)]

Обучение модели word2vec и fastText на текстовом корпусе

from gensim.models.word2vec import Word2Vec
from gensim.models.fasttext import FastText
import gensim.downloader as download_api
# Скачаем небольшой текстовый корпус (32 Мб) и откроем его как итерируемый набор предложений: iterable(list(string)) # В этом текстовом корпусе часть речи для слов не указывается corpus = download_api.load('text8')
# Обучим модели word2vec и fastText word2vec_model = Word2Vec(corpus, size=100, workers=4) fastText_model = FastText(corpus, size=100, workers=4)
word2vec_model.most_similar('car')[:3] # [('driver', 0.8033335208892822), ('motorcycle', 0.7368553876876831), ('cars', 0.7001584768295288)]
fastText_model.most_similar('car')[:3] # [('lcar', 0.8733218908309937), ('boxcar', 0.8559106588363647), ('ccar', 0.8268736004829407)]

ELMO

ELMO — это многослойная двунаправленная рекуррентная нейронная сеть c LSTM (рис. 5). При использовании word2vec или fastText не учитывается семантическая неоднозначность слов. Так, word2vec назначает слову один вектор независимо от контекста. ELMO решает эту проблему. В основе стоит идея использовать скрытые состояния языковой модели многослойной LSTM.

Было замечено, что нижние слои сети отвечают за синтаксис и грамматику, а верхние — за смысл слов. Пусть даны токены [math]t_{1}, ..., t_{N}[/math], на которые поделено предложение. Будем считать логарифм правдоподобия метки слова в обоих направлениях, учитывая контекст слева и контекст справа, то есть на основании данных от начала строки до текущего символа и данных от текущего символа и до конца строки. Таким образом, модель предсказывает вероятность следующего токена с учетом истории.

Пусть есть [math]L[/math] слоев сети. Входные и выходные данные будем представлять в виде векторов, кодируя слова. Тогда каждый результирующий вектор будем считать на основании множества:

[math]\left \{ {x_{k}^{LM}}, \overrightarrow{h_{k, j}^{LM}}, \overleftarrow{h_{k, j}^{LM}} | j = 1, ..., L \right \} = \left \{ h_{k, j}^{LM} | j = 1, ..., L \right \}[/math].

Здесь [math]x_{k}^{LM}[/math] — входящий токен, а [math]\overrightarrow{h_{k, j}^{LM}}[/math] и [math]\overleftarrow{h_{k, j}^{LM}}[/math] — скрытые слои в одном и в другом направлении.

Тогда результат работы ELMO будет представлять из себя выражение: [math]ELMO_{k}^{task} = \gamma^{taks}\sum_{j=0}^{L} s_{i}^{task}h_{k,j}^{LM}[/math].

Обучаемый общий масштабирующий коэффициент [math]\gamma^{task}[/math] регулирует то, как могут отличаться друг от друга по норме векторные представления слов.

Коэффициенты [math]s_{i}^{task}[/math] — это обучаемые параметры, нормализованные функцией [math]Softmax[/math].

Модель применяют дообучая ее: изначально берут предобученную ELMO, а затем корректируют [math]\gamma[/math] и [math]s_{i}[/math] под конкретную задачу. Тогда вектор, который подается в используемую модель для обучения, будет представлять собой взвешенную сумму значений этого векторах на всех скрытых слоях ELMO.

На данный момент предобученную модель ELMO можно загрузить и использовать в языке программирования Python.

BERT

Основная статья: BERT (языковая модель)
Рисунок 6. Архитектура BERT

BERT — это многослойный двунаправленный кодировщик Transformer. В данной архитектуре (рис. 6) используется двунаправленное самовнимание (англ. self-attention). Модель используется в совокупности с некоторым классификатором, на вход которого подается результат работы BERT — векторное представление входных данных. В основе обучения модели лежат две идеи.

Первая заключается в том, чтобы заменить [math]15\%[/math] слов масками и обучить сеть предсказывать эти слова.

Второй трюк состоит в том, чтобы дополнительно научить BERT определять, может ли одно предложение идти после другого.

Точно так же, как и в обычном трансформере, BERT принимает на вход последовательность слов, которая затем продвигается вверх по стеку энкодеров. Каждый слой энкодера применяет самовнимание и передает результаты в сеть прямого распространения, после чего направляет его следующему энкодеру.

Для каждой позиции на выход подается вектор размерностью [math]hiddenSize[/math] ([math]768[/math] в базовой модели). Этот вектор может быть использован как входной вектор для классификатора.

Bert поддерживается в качестве модели в языке Python, которую можно загрузить.

См. также

Источники информации