Самостоятельная реализация word2vec (модель Skip-gram)

искусственный интеллект алгоритм Нейронные сети

Изучите реализацию word2vec со скип-граммой в дополнение к модели со скип-граммой и модели CBOW. Режим Skip-gram предсказывает переднее и заднее слова на основе среднего слова, а модель CBOW наоборот предсказывает среднее слово по переднему и задним словам.

Так что жесреднее словоШерстяная ткань? какое словодо и после словШерстяная ткань?

Прежде всего, нам нужно определить размер окна.Для слов в окне у нас есть определения средних слов, а также передних и задних слов. Обычно размер этого окна составляет от 5 до 10. Например, давайте установим размер окна равным 2:

|The|quick|brown|fox|jump|

Так,brownнаше среднее слово,The,quick,fox,jumpТолько до и после слов.

Мы знаем, что word2vec на самом деле является нейронной сетью (что будет объяснено позже), так какой же формат мы используем для обучения таких данных? Глядя на картинку, вы поймете:

word2vec window

Как видите, мы всегда начинаем ссреднее словов первой позиции, за которой следуют наши соседние слова. Как видите, каждая пара слов — это пара данных (X, Y), состоящая из входа и выхода. где X — функция, а Y — метка.

Поэтому, прежде чем мы будем обучать модель, нам нужно отсортировать все входные данные, подобные приведенным выше, для обучения по корпусу.

word2vec — это нейронная сеть.

word2vec — это простая нейронная сеть, состоящая из следующих слоев:

  • 1 входной слой
  • 1 скрытый слой
  • 1 выходной слой

Входной слой вводит цифровое представление пары данных, о которой мы упоминали выше, и выводит его на скрытый слой. Количество единиц нейронной сети в скрытом слое на самом деле то, что мы называемembedding size, только почему, мы узнаем после несложного расчета. Важно отметить, что нам не нужно использовать функцию активации за нашим скрытым слоем. Для выходного слоя мы используем операцию softmax, чтобы получить вероятность каждого прогноза.

Вот схема, представляющая эту сеть:

skip-gram-net-arhc

входной слой

Теперь вопрос в том, что мы только что сказали, что ввод входного слоя — это цифровое представление пары данных, которую мы подготовили ранее, так как же нам представить текстовые данные с числами?

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

Глядя на рисунок выше, мы обнаруживаем, что его ввод используетone-hotкодирование. Что такое горячее кодирование? Как показано на рисунке, при наличии n слов каждое слово может быть представлено n-мерным вектором, только одна позиция этого n-мерного вектора равна 1, а остальные позиции равны 0.

Так зачем использовать такую ​​кодировку для ее представления? Ответ станет известен позже.

скрытый слой

Количество нейронных единиц в скрытом слое представляет размерность каждого слова, представленного вектором. Предположим, нашhidden_sizeВозьмем 300, то есть наш скрытый слой имеет 300 нейронов, тогда для каждого слова наше векторное представление представляет собой1*Nвектор. Таких векторов столько, сколько слов!

Таким образом, длявходной слойискрытый слойвесовая матрица междуW, его форма должна быть[vocab_size, hidden_size]матрица,

выходной слой

Так как же должен выглядеть наш выходной слой? Как видно из рисунка выше, выходной слой представляет собой[vocab_size]Вектор размеров, каждое значение представляет вероятность вывода слова.

Почему вы хотите выводить так? Потому что мы хотим знать для входного слова, какие слова с наибольшей вероятностью последуют за ним, другими словами, нам нужно знать распределение вероятностей его следующих слов.

Вы можете взглянуть на диаграмму структуры сети выше.

Вы увидите очень распространенную функциюsoftmaxа почему softmax вместо других функций? Давайте посмотрим, как выглядит функция softmax:

softmax(x) = \frac{e^x}{\sum_{i}^{N}e^{x_i}}

Очевидно, что его диапазон значений равен (0,1), а сумма всех значений равна 1. Разве это не естественное вероятностное представление?

Конечно, у softmax тоже есть свойство, потому что он работает экспоненциально, еслиФункция потерь использует логарифмическую функцию, то вы можете отменить экспоненциальный расчет.

Дополнительные сведения о softmax см. в Стэнфорде.Softmax Regression

Математическое представление всего процесса

До сих пор мы знали структуру всей нейронной сети, так как же нам выразить ее математически?

Оглядываясь назад на нашу структурную диаграмму, становится ясно, что между тремя слоями будет две матрицы весов.W, в то же время два члена смещенияb. Таким образом, построение всей нашей сети можно выполнить с помощью следующего псевдокода:

import tensorflow as tf

# 假设vocab_size = 1000
VOCAB_SIZE = 1000
# 假设embedding_size = 300
EMBEDDINGS_SIZE = 300

# 输入单词x是一个[1,vocab_size]大小的矩阵。当然实际上我们一般会用一批单词作为输入,那么就是[N, vocab_size]的矩阵了
x = tf.placeholder(tf.float32, shape=(1,VOCAB_SIZE))
# W1是一个[vocab_size, embedding_size]大小的矩阵
W1 = tf.Variable(tf.random_normal([VOCAB_SIZE, EMBEDDING_SIZE]))
# b1是一个[1,embedding_size]大小的矩阵
b1 = tf.Variable(tf.random_normal([EMBEDDING_SIZE]))
# 简单的矩阵乘法和加法
hidden = tf.add(tf.mutmul(x,W1),b1)

W2 = tf.Variable(tf.random_normal([EMBEDDING_SIZE,VOCAB_SIZE]))
b2 = tf.Variable(tf.random_normal([VOCAB_SIZE]))
# 输出是一个vocab_size大小的矩阵,每个值都是一个词的概率值
prediction = tf.nn.softmax(tf.add(tf.mutmul(hidden,w2),b2))

функция потерь

Теперь, когда сеть определена, нам нужно выбрать функцию потерь для оптимизации модели с использованием градиентного спуска.

Наш выходной слой на самом деле является классификатором softmax. Таким образом, в соответствии с общепринятой процедурой выбирается функция потерьФункция кросс-энтропийных потерь.

Ха-ха, помните, что такое перекрестная энтропия?

H(p,q)=-\sum_{x}p(x)logq(x)

p, q — истинные распределения вероятностей и оценочные распределения вероятностей.

# 损失函数 
cross_entropy_loss = tf.reduce_mean(-tf.reduce_sum(y_label * tf.log(prediction), reduction_indices=[1]))
# 训练操作
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(cross_entropy_loss)

Далее можно подготовить числовые данные и приступить к обучению!

Почему на входе используется однократное кодирование?

Мы знаем, что word2vec после обучения получит матрицу весов W1 (пока игнорируем b1), эта матрица является векторным представлением всех наших слов! Каждая строка этой матрицы представляет собой векторное представление слова. Если две матрицы перемножить...

matrix_mult_w_one_hot

видеть это? Характеристики горячего кодирования,Когда матрица умножается, выбирается строка в матрице, и эта строка является представлением word2vec введенного нами слова!.

Как насчет этого? Разве это не прекрасно?

Отсюда мы видим, что так называемый word2vec на самом деле являетсяСправочная таблица,ЯвляетсядвухмерныйМатрица поплавков!

Выше приведен полный анализ модели word2vec со скип-граммой Как насчет того, разобрались ли вы с принципом и деталями word2vec?

Пожалуйста, смотрите полный кодluozhouyang/word2vec

свяжитесь со мной

  • Email: stupidme.me.lzy@gmail.com

  • WeChat: luozhouyang0528

  • Личный публичный аккаунт, возможно вас заинтересует: