Изменения

Перейти к: навигация, поиск

Векторное представление слов

7804 байта добавлено, 19:15, 4 сентября 2022
м
rollbackEdits.php mass rollback
'''Векторное представление слов''' (англ. ''word embedding'') {{- --}} общее название для различных подходов к моделированию языка и обучению представлений в обработке естественного языка, направленных на сопоставление словам из некоторого словаря векторов небольшой размерности.
== One-hot encoding ==
[[Файл:One-hot-encoding.png|thumb|right|250px220px| Рисунок 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>-тая координата равна единице, а все остальные {{- --}} нулям(рис. 1). Недостатком one-hot encoding является то, что по векторным представлениям нельзя судить о схожести смысла слов. Также вектора имеют очень большой размер, из-за чего их неэффективно хранить в памяти.         
== word2vec ==
[[Файл: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}\|} = word2vec \frac{ \sum\limits_{i=1}^{n}{A_i B_i} }{ \sqrt{\sum\limits_{i=word2vec - способ построения сжатого пространства векторов слов, использующий нейронные сети. Принимает на вход большой текстовый корпус и сопоставляет каждому слову вектор. Сначала он создает словарь, а затем вычисляет векторное представление слов. Векторное представление основывается на контекстной близости: слова, встречающиеся в тексте рядом с одинаковыми словами (а следовательно, имеющие схожий смысл)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 subsamplingsampling'', позволяющие вычислять распределение вероятностей быстрее, чем за линейное время от размера словаря.
{|align="center"
|-valign="top"
|[[Файл:skip-gram.png|270px|thumb|Рисунок 3. [http://www.claudiobellei.com/2018/01/06/backprop-word2vec/ Схема сети для модели Skip-gram]]] |[[Файл:cbow.png|260px|thumb|Схема сети для модели CBOW]] |[Рисунок 4. [Файлhttp:Words-space//www.png|thumb|right|500px|Полученные векторы-слова могут быть использованы для вычисления семантического расстояния между словамиclaudiobellei. После обучения векторы отражают различные грамматические и семантические концепции.<br><math>W_{king} + (W_{woman} - W_{man}) = W_{queen}<com/2018/01/06/math><br><math>W_{walked} backprop- W_{walking} = W_{swam} - W_{swimming}<word2vec/math>Схема сети для модели CBOW]]]
|}
== fastText ==
Недостатком word2vec является то, что с его помощью не могут быть представлены слова, не встречающиеся в обучающей выборке. fastText решает эту проблему с помощью <math>N</math>-грамм символов. Например, <math>3</math>-граммами для слова ''яблоко'' являются ''ябл'', ''бло'', ''лок'', ''око''. Модель теперь fastText строит векторные представления <math>N</math>-грамм, а векторным представлением слова будет является сумма векторных представлений для всех его <math>N</math>-грамм. Части слов с большой вероятностью встречаются и в других словах, что позволяет выдавать векторные представления и для редких слов тоже.
== Примеры кода с использованием библиотеки Gensim ==
'''import''' gensim.downloader '''as''' download_api
russian_model = download_api.load(<font color="green">'word2vec-ruscorpora-300'</font>)<br>
<font color="greengrey"># ''Первые Выведем первые 10 слов корпуса.<br># ''В модели "word2vec-ruscorpora-300" после слова указывается часть речи: NOUN (существительное), ADJ (прилагательное) и так далее.''<br># ''Но существуют также предоубученные модели без разделения слов по частям речи, смотри [https://github.com/RaRe-Technologies/gensim-data репозиторий]''</font>
list(russian_model.vocab.keys())[:<font color="blue">10</font>]
[ ''<font color="greengrey"># ['весь_DET'</font>, <font color="green">'человек_NOUN'</font>, <font color="green">'мочь_VERB'</font>, <font color="green">'год_NOUN'</font>, <font color="green">'сказать_VERB'</font>, <font color="green">'время_NOUN'</font>, <font color="green">'говорить_VERB'</font>, <font color="green">'становиться_VERB'</font>, <font color="green">'знать_VERB'</font>, <font color="green">'самый_DET']</font>]''<br> <font color="greengrey"># ''Поиск наиболее близких по смыслу слов. После слова указывается часть речи: NOUN, ADJ, VERB, DET''</font>
russian_model.most_similar(<font color="green">'кошка_NOUN'</font>)
[( <font color="greengrey">''# [('кот_NOUN'</font>, <font color="blue">0.7570087909698486</font>), (<font color="green">'котенок_NOUN'</font>, <font color="blue">0.7261239290237427</font>), (<font color="green">'собака_NOUN'</font>, <font color="blue">0.6963180303573608</font>),'' # ''(<font color="green">'мяукать_VERB'</font>, <font color="blue">0.6411399841308594</font>), (<font color="green">'крыса_NOUN'</font>, <font color="blue">0.6355636119842529</font>), (<font color="green">'собачка_NOUN'</font>, <font color="blue">0.6092042922973633</font>),'' # ''(<font color="green">'щенок_NOUN'</font>, <font color="blue">0.6028496026992798</font>), (<font color="green">'мышь_NOUN'</font>, <font color="blue">0.5975362062454224</font>), (<font color="green">'пес_NOUN'</font>, <font color="blue">0.5956044793128967</font>),'' # ''(<font color="green">'кошечка_NOUN'</font>, <font color="blue">0.5920293927192688)]''</font>)]<br> <font color="greengrey"># ''Вычисление сходства слов''</font>
russian_model.similarity(<font color="green">'мужчина_NOUN'</font>, <font color="green">'женщина_NOUN'</font>)
<font color="bluegrey">''# 0.85228276''</font><br> <font color="greengrey"># ''Поиск лишнего слова''</font>
russian_model.doesnt_match(<font color="green">'завтрак_NOUN хлопья_NOUN обед_NOUN ужин_NOUN'</font>.split())
<font color="grey"># ''хлопья_NOUN''</font><br> <font color="grey"># ''Аналогия: Женщина + (Король - Мужчина) = Королева''</font> russian_model.most_similar(positive=[<font color="green">'король_NOUN'</font>,<font color="green">'женщина_NOUN'</font>], negative=[<font color="green">'мужчина_NOUN'</font>], topn=1) <font color="grey"># ''[('королева_NOUN', 0.7313904762268066)]''</font><br> <font color="grey"># ''Аналогия: Франция = Париж + (Германия - Берлин)''</font> russian_model.most_similar(positive=[<font color="green">'париж_NOUN'</font>,<font color="green">'германия_NOUN'</font>], negative=[<font color="green">'берлин_NOUN'</font>], topn=1) <font color="grey"># ''[('франция_NOUN', 0.8673800230026245)]''</font>
=== Обучение модели word2vec и fastText на текстовом корпусе ===
'''from''' gensim.models.fasttext '''import''' FastText
'''import''' gensim.downloader '''as''' download_api<br>
<font color="greengrey"># ''Скачаем небольшой текстовый корпус (32 Мб) и откроем его как итерируемый набор предложений: iterable(list(string))''</font> <font color="grey"># ''В этом текстовом корпусе часть речи для слов не указывается''</font>
corpus = download_api.load(<font color="green">'text8'</font>)<br>
<font color="greengrey"># ''Обучим модели word2vec и fastText''</font>
word2vec_model = Word2Vec(corpus, size=<font color="blue">100</font>, workers=<font color="blue">4</font>)
fastText_model = FastText(corpus, size=<font color="blue">100</font>, workers=<font color="blue">4</font>)<br>
word2vec_model.most_similar(<font color="green">'car'</font>)[:<font color="blue">3</font>]
[( ''<font color="greengrey"># [('driver'</font>, <font color="blue">0.8033335208892822</font>), (<font color="green">'motorcycle'</font>, <font color="blue">0.7368553876876831</font>), (<font color="green">'cars'</font>, <font color="blue">0.7001584768295288)]</font>)]''<br> fastText_model.most_similar('car')[:3] ''<font color="greengrey"># [('lcar'car, 0.8733218908309937), ('boxcar', 0.8559106588363647), ('ccar', 0.8268736004829407)]</font>) == ELMO ==[[File:ElmoExplain.jpg|600px|thumb| Рисунок 5. [https://www.topbots.com/generalized-language-models-cove-elmo/ Архитектура и принцип работы ELMO]]]<font color="blue"i>3ELMO</fonti>{{---}} это многослойная двунаправленная [[:Рекуррентные_нейронные_сети|рекуррентная нейронная сеть]] c [[:Долгая_краткосрочная_память|LSTM]](рис. 5).При использовании word2vec или fastText не учитывается семантическая неоднозначность слов. Так, word2vec назначает слову один вектор независимо от контекста.<i>ELMO</i> решает эту проблему. В основе стоит идея использовать скрытые состояния языковой модели многослойной [([:Долгая_краткосрочная_память|LSTM]]. Было замечено, что нижние слои сети отвечают за синтаксис и грамматику, а верхние {{---}} за смысл слов.Пусть даны токены <math>t_{1}, ..., t_{N}</math>, на которые поделено предложение. Будем считать логарифм правдоподобия метки слова в обоих направлениях, учитывая контекст слева и контекст справа, то есть на основании данных от начала строки до текущего символа и данных от текущего символа и до конца строки.Таким образом, модель предсказывает вероятность следующего токена с учетом истории. Пусть есть <math>L</math> слоев сети. Входные и выходные данные будем представлять в виде векторов, кодируя слова. Тогда каждый результирующий вектор будем считать на основании множества: <font colormath>\left \{ {x_{k}^{LM}}, \overrightarrow{h_{k, j}^{LM}}, \overleftarrow{h_{k, j}^{LM}} | j = 1, ..., L \right \} = \left \{ h_{k, j}^{LM} | j ="green"1, ..., L \right \}</math>. Здесь <math>x_{k}^{LM}</math> {{---}} входящий токен, а <math>'lcar'\overrightarrow{h_{k, j}^{LM}}</fontmath> и <math>\overleftarrow{h_{k, j}^{LM}}</math> {{---}} скрытые слои в одном и в другом направлении. Тогда результат работы ELMO будет представлять из себя выражение:<font colormath>ELMO_{k}^{task} = \gamma^{taks}\sum_{j="blue"0}^{L} s_{i}^{task}h_{k,j}^{LM}</math>. Обучаемый общий масштабирующий коэффициент <math>\gamma^{task}</math> регулирует то, как могут отличаться друг от друга по норме векторные представления слов. Коэффициенты <math>s_{i}^{task}</math> {{---}} это обучаемые параметры, нормализованные функцией <math>Softmax</math>0.8733218908309937 Модель применяют дообучая ее: изначально берут предобученную <i>ELMO</i>, а затем корректируют <math>\gamma</math> и <math>s_{i}</fontmath>)под конкретную задачу. Тогда вектор, который подается в используемую модель для обучения, будет представлять собой взвешенную сумму значений этого векторах на всех скрытых слоях <i>ELMO</i>. На данный момент предобученную модель ELMO можно [https://tfhub.dev/google/elmo/3 загрузить] и использовать в языке программирования Python. == BERT =={{main|BERT (языковая модель)}}[[File:Bert.png|500px|thumb|Рисунок 6. [https://towardsdatascience.com/bert-why-its-been-revolutionizing-nlp-5d1bcae76a13 Архитектура BERT]]]<font color="green"i>'boxcar'BERT</fonti>{{---}} это многослойный двунаправленный [[:Автокодировщик|кодировщик]] Transformer. В данной архитектуре (рис. 6) используется двунаправленное [[:Механизм внимания|самовнимание]] (англ. self-attention). Модель используется в совокупности с некоторым классификатором, на вход которого подается результат работы <i>BERT<font color="blue"/i>0{{---}} векторное представление входных данных.В основе обучения модели лежат две идеи.8559106588363647 Первая заключается в том, чтобы заменить <math>15\%</fontmath>)слов масками и обучить сеть предсказывать эти слова.  Второй трюк состоит в том, (чтобы дополнительно научить <font color="green"i>'ccar'BERT</fonti>определять, может ли одно предложение идти после другого.  Точно так же, как и в обычном трансформере, <font color="blue"i>BERT</i>0принимает на вход последовательность слов, которая затем продвигается вверх по стеку энкодеров.Каждый слой энкодера применяет самовнимание и передает результаты в сеть прямого распространения, после чего направляет его следующему энкодеру.8268736004829407 Для каждой позиции на выход подается вектор размерностью <math>hiddenSize</math> (<math>768</fontmath>в базовой модели).Этот вектор может быть использован как входной вектор для классификатора. Bert поддерживается в качестве модели в языке Python, которую можно [https://github.com/google-research/bert загрузить].
== См. также ==
* [https://github.com/RaRe-Technologies/gensim-data Gensim Datasets] {{---}} репозиторий предобученных моделей для библиотеки Gensim
* [https://fasttext.cc/ fastText] {{---}} NLP библиотека от Facebook
* [https://arxiv.org/pdf/1607.04606.pdf fastText article] {{---}} оригинальная статья по fastText от Piotr Bojanowski
* [https://rusvectores.org/ru/ RusVectōrēs] {{---}} онлайн сервис для работы с семантическими отношениями русского языка
* [https://arxiv.org/abs/1810.04805/ Cornell univerity arxiv] {{---}} оригинальная статья про Bert
* [https://arxiv.org/abs/1802.05365/ Cornell univerity arxiv] {{---}} оригинальная статья с описанием ELMO
[[Категория: Машинное обучение]] [[Категория: Обработка естественного языка]]
1632
правки

Навигация