www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home
Занимательная история, выдающиеся люди, малоизвестные факты, находки, открытия, фальсификации. Присоединяйся!

Интуитивное руководство по пониманию Word2vec

Дата публикации Jun 5, 2018

Вот третья запись в блоге из сериисвет на математике машинного обучения A-Z, Эта статья будет посвящена алгоритмам Word2vec. Алгоритмы Word2vec выводят векторы слов. Векторы слова лежат в основе многих систем обработки естественного языка (NLP), которые покорили мир (Amazon Alexa, Google translate и т. Д.). О подробностях мы поговорим в следующих разделах. Но сначала позвольте мне изложить алфавит со ссылками на другие мои сообщения в блоге.

A BСD* E Fг* H I JКL* МNO P Q R S T U V W X Y Z

* обозначает статьи за Средним платным доступом

Векторы слов, в чем основная идея? Это все об этом контексте

Без дальнейших подробностей, давайте смиримся. Векторы слов - это числовые представления слов, которые сохраняют семантические отношения между словами. Например, вектор словаКот, будет очень похож на вектор словасобака, Тем не менее, вектор длякарандашбудет сильно отличаться от слова вектораКот, И это сходство определяется частотой двух рассматриваемых слов (т. Е. [Котопес] или [кошка, карандаш]), используются в одном контексте. Например, рассмотрим следующие предложения,

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

Воздействие и последствия Word2vec

Чтобы получить представление о значении методов Word2vec, попробуйте следующее. Давай и воспитыватьGoogle ученый, Введите некоторые задачи, связанные с НЛП (например, ответ на вопрос, чат-боты, машинный перевод и т. Д.). Фильтруйте статьи, опубликованные после 2013 года (тогда появились методы Word2vec). Получите соотношение статей с использованием векторов слов к общему количеству статей. Могу поспорить, что эта пропорция будет довольно высокой. Чтобы сделать утверждение конкретным, используются векторы слов для,

  • Языковое моделирование
  • Chatbots
  • Машинный перевод
  • Ответ на вопрос
  • ... и многое другое

Вы можете видеть, что все захватывающие границы НЛП на самом деле сильно зависят от векторов слов. Теперь давайте обсудим, какое значение имеют векторы слова, чтобы сделать модель лучше. При использовании векторов слов семантически близкие слова будут казаться похожими вычислениями в модели, где другие слова будут выполнять вычисления другого вида. Это желательное свойство, поскольку при кодировании такой информации в самом вводе модель будет работать с меньшими данными.

От необработанного текста к векторам слов: подход высокого уровня

Теперь, с твердой интуицией в сумке, мы собираемся сначала обсудить механику высокого уровня алгоритмов Word2vec. Мы уточним детали в следующих разделах, пока не будем уверены, что знаем, как реализовать алгоритм Word2vec. Чтобы изучать векторы слов без присмотра (то есть без данных о человеке), мы должны определить и выполнить определенные задачи. Вот список высокого уровня этих задач.

  1. Создайте кортежи данных в формате [входное слово, выходное слово], где каждое слово представлено как горячие векторы из исходного текста
  2. Определите модель, которая может принимать векторы с одним горячим током в качестве входов и выходов для обучения
  3. Определите функцию потерь, которая предсказывает правильное слово, которое фактически находится в контексте входного слова, чтобы оптимизировать модель
  4. Оцените модель, убедившись, что похожие слова имеют одинаковые векторы слов

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

Создание структурированных данных из необработанного текста

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

Кот отодвинул стекло от стола

Данные, созданные из этого предложения, будут выглядеть следующим образом. Каждая строка после предложения представляет одну точку данных. Синее поле представляет горячее входное слово (среднее слово, называемое целевым словом), а красное поле представляет горячее выходное слово (любое слово в контекстном окне, кроме среднего слова, называемое контекстными словами). Две точки данных создаются из одного контекстного окна. Размер окна контекста определяется пользователем. Чем больше размер окна контекста, тем выше производительность модели Но, имея большой размер окна контекста, вы будете платить за вычислительное время по мере увеличения объема данных.Не путайте целевое слово с целевым (правильный вывод) для нейронной сети, это две совершенно разные вещи.

Создание данных для Word2vec

Определение слоя встраивания и нейронной сети

Нейронная сеть используется для изучения структурированных данных, определенных выше. Тем не менее, это идет с изюминкой! Чтобы прояснить, у вас есть следующие компоненты.

  • Пакет входов представлен в виде горячих векторов
  • Пакет выходов, представленных в виде векторов с одним горячим током (только на этапе обучения)
  • Слой встраивания
  • Нейронная сеть

Не нужно бояться, если вы не почувствовали, что и как выполняют последние два компонента. Мы исследуем каждый из этих компонентов, чтобы понять, что они делают.

Слой встраивания: хранит все векторы слов

Первое в нашей повестке днявстраиваемый слой, Слой встраивания хранит векторы слов всех слов, найденных в словаре. Как вы можете визуализировать это огромная матрица (размером[размер словаря x размер вложения]). Этот размер вложения является настраиваемым пользователем параметром. Чем оно выше, тем лучше будет работать ваша модель. Но вы не получите большого выигрыша в производительности / размере, превышающем определенный уровень (скажем, размер вложения 500). Эта гигантская матрица инициализируется случайным образом (точно так же, как нейронная сеть) и корректируется в процессе оптимизации, чтобы выявить мощные векторы слов. Вот как это выглядит.

Как выглядит слой для встраивания

Нейронная сеть: сопоставляет векторы слов с выходами

Следующим в очереди является последний блок LEGO нашей модели; нейронная сеть. Во время обучения нейронная сеть принимает входное слово и пытается предсказать выходное слово. Затем, используя функцию потерь, мы штрафуем модель за неправильную классификацию и вознаграждаем модель за правильную классификацию. Мы будем ограничивать наш разговор обработкой одного ввода и одного вывода за раз. Однако в действительности вы обрабатываете данные партиями (скажем, 64 точки данных). Давайте опишем точный процесс, используемый во время обучения:

  1. Для заданного входного слова (целевого слова) найдите соответствующий вектор слова из слоя внедрения
  2. Подайте слово вектор в нейронную сеть, затем попытайтесь предсказать правильное выходное слово (контекстное слово)
  3. Сравнивая прогноз и истинное контекстное слово, вычисляем потери
  4. Используйте потери вместе со стохастическим оптимизатором, чтобы оптимизировать нейронную сеть и слой внедрения

Стоит отметить, что при вычислении прогноза мы используем активацию softmax, чтобы нормализовать прогнозы для действительного распределения вероятности.

Подгонка всего вместе: входы в модель и выходы

Зная все основные моменты алгоритма Word2vec, мы можем собрать все части вместе. Так что, как только эта модель обучена, все, что нам нужно сделать, этосохранить встроенный слой на диск, Тогда мы можем наслаждаться семантически сохраненными векторами слов в любое время суток. Ниже мы видим, как выглядит полная картина.

Как выглядит модель в окончательном виде

Такое частичное расположение данных и макет модели известны какалгоритм скип-грамм; алгоритм Word2vec. И это то, на чем мы собираемся сосредоточиться. Другой алгоритм называется моделью непрерывного набора слов (CBOW).

Определение функции потерь: оптимизировать модель

Одна важная часть информации, которую мы до сих пор не обсуждали, но очень важна - это функция потерь. Обычно, стандартSoftmax перекрестная потеря энтропииявляется хорошей функцией потерь для задачи классификации. Использование этой потери не очень практично для модели Word2vec, как для более простой задачи, такой как анализ настроений (где у вас есть 2 возможных результата: положительный или отрицательный). Здесь все может стать веселее. В реальном словесном задании, которое потребляет миллиарды слов, размер словарного запаса может легко увеличиться до 100 000 или даже больше. Это делает вычисление нормализации softmax тяжелым. Это связано с тем, что для полного расчета softmax требуется рассчитать перекрестные энтропийные потери по отношению ко всем выходным узлам.

Таким образом, мы идем с более разумной альтернативой, называемойОтобранные потери Softmax, При выборочной потере softmax вы делаете следующее. Обратите внимание, что по сравнению со стандартной кросс-энтропийной потерей softmax происходит довольно много изменений. Сначала вы вычисляете кросс-энтропийную потерю между истинным идентификатором слова контекста для заданного целевого слова и прогнозным значением, соответствующим истинному идентификатору слова контекста. Затем к этому мы добавим кросс-энтропийную потерюKОтрицательные образцы мы отбирали в соответствии с некоторым распределением шума. На высоком уровне мы определяем потери следующим образом:

SigmoidCrossEntropyэто потеря, которую мы можем определить на одном выходном узле, независимо от остальных узлов. Это делает его идеальным для нашей проблемы, так как наш словарный запас может стать довольно большим. Я не буду вдаваться в подробности этой потери Вам не нужно понимать, как именно это реализовано, поскольку они доступны как встроенная функция в TensorFlow. Но понимание параметров, связанных с потерей (например,K) является важным. Выводное сообщение состоит в том, что выборочная потеря softmax вычисляет потерю, рассматривая два типа объектов:

  • Индекс, заданный истинным ID слова контекста в векторе предсказания (слова в окне контекста)
  • Kиндексы, которые указывают идентификаторы слов и считаются шумом (слова вне контекстного окна)

Я далее визуализирую это, иллюстрируя пример.

Получение положительных и отрицательных образцов для выборочного слоя softmax

Реализация TensorFlow: алгоритм Skip-грамм

Здесь мы извергнем то, что мы только что обсудили, в реализацию. Это доступно как упражнениеВот, В этом разделе мы собираемся реализовать следующее.

  • Генератор данных
  • Модель скип-граммы (с TensorFlow)
  • Запуск алгоритма пропуска

Генератор данных

Сначала давайте поймем, как генерировать данные. Мы не будем вдаваться в подробности этого кода, так как мы уже обсуждали внутреннюю механику генерации данных. Это просто преобразование этой логики в реализацию.

def generate_batch(batch_size, window_size):
global data_index

# two numpy arras to hold target words (batch)
# and context words (labels)
batch = np.ndarray(shape=(batch_size), dtype=np.int32)
labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)

# span defines the total window size
span = 2 * window_size + 1

# The buffer holds the data contained within the span
queue = collections.deque(maxlen=span)

# Fill the buffer and update the data_index
for _ in range(span):
queue.append(data[data_index])
data_index = (data_index + 1) % len(data)


for i in range(batch_size // (2*window_size)):
k=0
# Avoid the target word itself as a prediction
for j in list(range(window_size))+list(range(window_size+1,2*window_size+1)):
batch[i * (2*window_size) + k] = queue[window_size]
labels[i * (2*window_size) + k, 0] = queue[j]
k += 1

# Everytime we read num_samples data points, update the queue
queue.append(data[data_index])

# If end is reached, circle back to the beginning
data_index = (data_index + np.random.randint(window_size)) % len(data)

return batch, labels

Определение модели скип-граммы

Сначала мы определим некоторые гиперпараметры, необходимые для модели.

batch_size = 128 
embedding_size = 64
window_size = 4
num_sampled = 32 # Number of negative examples to sample.

batch_sizeопределяет количество точек данных, которые мы обрабатываем в данный момент времени. Тогдаembedding_sizeразмер слова вектора. Следующий гиперпараметрwindow_sizeопределяет размер контекстного окна, которое мы визуализировали выше. в заключениеnum_sampledопределяет количество отрицательных выборок в функции потерь (K). Затем мы определяем заполнители TensorFlow для входов и выходов.

tf.reset_default_graph() 
# Training input data (target word IDs).
train_dataset = tf.placeholder(tf.int32, shape=[batch_size]) # Training input label data (context word IDs)
train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])

Здесьtrain_datasetпринимает список идентификаторов словbatch_sizeкоторый представляет выбранный набор целевых слов. В заключение,train_labelsпредставляетbatch_sizeсписок соответствующих контекстных слов для выбранных целевых слов. Далее мы определяем параметры модели, необходимые для определения модели: слой внедрения, а также веса и смещения нейронной сети.

################################################
# Model variables #
################################################

# Embedding layer
embeddings = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))

# Neural network weights and biases
softmax_weights = tf.Variable(
tf.truncated_normal([vocabulary_size, embedding_size],
stddev=0.1 / math.sqrt(embedding_size))
)
softmax_biases = tf.Variable(tf.random_uniform([vocabulary_size],-0.01,0.01))

Мы определили слой внедрения как переменную TensorFlow:embeddings, Затем мы определяем веса нейронной сети (softmax_weights) и уклоны (softmax_biases). После этого мы определяем ключевую операцию, необходимую для соединения уровня внедрения с нейронной сетью для совместной оптимизации уровня внедрения и нейронной сети.

# Look up embeddings for a batch of inputs. 
embed = tf.nn.embedding_lookup(embeddings, train_dataset)

tf.nn.embedding_lookupфункция принимает наш слой встраивания в качестве входных данных и набор идентификаторов слов (train_dataset) и выводит соответствующие векторы слов в переменнуюembed, Определяя встроенную функцию поиска, мы можем определить выборочную функцию потерь softmax, которую мы обсуждали выше.

################################################ 
# Computes loss #
################################################
loss = tf.reduce_mean(tf.nn.sampled_softmax_loss( weights=softmax_weights, biases=softmax_biases, inputs=embed, labels=train_labels, num_sampled=num_sampled, num_classes=vocabulary_size) )

Здесьtf.nn.sampled_softmax_lossфункция принимает в наборе весов (softmax_weights), уклоны (softmax_biases), набор векторов слов, соответствующих идентификаторам слов, найденным вtrain_dataset, Идентификаторы правильных контекстных слов (train_labels), количество образцов шума (num_sampled) и размер словаря (vocabulary_size). С определенными операциями расчета выходных данных и определенными потерями мы можем определить оптимизатор для оптимизации потерь по отношению к параметрам уровня внедрения и нейронной сети.

################################################ 
# Optimization #
################################################
optimizer = tf.train.AdamOptimizer(0.001).minimize(loss)

Затем мы получаем нормализованный слой вложения, делая величину вектора равной 1.

################################################ 
# For evaluation # ################################################
norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keepdims=True))
normalized_embeddings = embeddings / norm

Выполнение кода

Здесь мы собираемся обсудить детали того, как запустить ранее определенную модель TensorFlow. Сначала мы определяемsessionа затем случайным образом инициализировать все переменные TensorFlow.

num_steps = 250001 
session = tf.InteractiveSession()
# Initialize the variables in the graph
tf.global_variables_initializer().run()
print('Initialized')
average_loss = 0

Теперь для заданного количества шагов мы генерируем пакеты данных: целевые слова (batch_data) и контекстные слова (batch_labels).

for step in range(num_steps): 
# Generate a single batch of data
batch_data, batch_labels = generate_batch( batch_size, window_size)

Затем для каждого сгенерированного пакета мы оптимизируем слой внедрения и нейронную сеть, запустивsession.run([optimize, loss],...), Мы также выводим полученную в результате потерю, чтобы убедиться, что она со временем уменьшается.

    # Optimize the embedding layer and neural network
# compute loss
feed_dict = {train_dataset : batch_data, train_labels : batch_labels}
_, l = session.run([optimizer, loss], feed_dict=feed_dict)

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

    if (step+1) % 5000 == 0:
if step > 0:
average_loss = average_loss / 5000

print('Average loss at step %d: %f' % (step+1, average_loss))
average_loss = 0

Наконец, мы получаем последние вложения, которые мы позже используем для визуализации определенных слов.

sg_embeddings = normalized_embeddings.eval() 
session.close()

Наконец, если вы визуализируете вложения, используя алгоритм обучения многообразия, такой как t-SNE, вы получите следующее.

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

Вывод

Это подводит нас к концу нашего разговора. Векторы слов - это очень мощное представление слов, которое помогает моделям машинного обучения работать лучше. Мы прошли процесс генерации данных, а также различные компоненты, найденные в модели Word2vec. Затем мы обсудили один конкретный вариант алгоритма Word2vec; модель скип-грамм. Мы прошли реализацию алгоритма в TensorFlow. Наконец, мы визуализировали вложения и увидели, что выученные вложения действительно отображают некоторую полезную семантику. Вы можете найти файл упражненияВот

Небольшая заметка: Я рад сообщить, что моя книга по обработке естественного языка с TensorFlow была выпущена и готова к использованию! Книга идеально подходит для читателей начального / среднего уровня, ищущих практическую перспективу современных решений для глубокого обучения. Книга сопровождается упражнениями, помогающими читателю реализовать различные приложения НЛП.

Не забудьте хлопать в ладоши, если вы узнали или получили удовольствие от статьи. Ура!

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map