2017-01-15 3 views
1

Я следую this tutorial, чтобы понять CNN в НЛП. Есть несколько вещей, которые я не понимаю, несмотря на то, что код передо мной. Надеюсь, кто-то может прояснить ситуацию.Попытка понять CNN для учебника NLP с использованием Tensorflow


Первая довольно незначительная вещь является sequence_length параметр TextCNN объекта. В примере на github это всего лишь 56, который, я думаю, является максимальной длиной всех предложений в данных обучения. Это означает, что self.input_x является 56-мерным вектором, который будет содержать только индексы из словаря предложения для каждого слова.

Этот список перейдет в tf.nn.embedding_lookup(W, self.intput_x), который вернет матрицу, состоящую из слов вставки этих слов, заданных self.input_x. Согласно this answer эта операция похожа на использование индексации с NumPy:

matrix = np.random.random([1024, 64]) 
ids = np.array([0, 5, 17, 33]) 
print matrix[ids] 

Но проблема в том, что self.input_x большую часть времени выглядит [1 3 44 25 64 0 0 0 0 0 0 0 .. 0 0]. Правильно ли, если я предполагаю, что tf.nn.embedding_lookup игнорирует значение 0?


Другое дело, я не понимаю, как tf.nn.embedding_lookup работает здесь:

# Embedding layer 
with tf.device('/cpu:0'), tf.name_scope("embedding"): 
    W = tf.Variable(
     tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0), 
      name="W") 
    self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x) 
    self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1) 

Я полагаю, TAHT self.embedded_chars является матрицей, которая является фактическим входа на CNN, где каждая строка представляет собой слово вложение один слово. Но как может tf.nn.embedding_lookup узнать об этих показателях, указанных self.input_x?


Последняя вещь, которую я не понимаю, здесь

W наша матрица вложение, что мы учимся в процессе обучения. Мы инициализируем его, используя случайное равномерное распределение. tf.nn.embedding_lookup создает фактическую операцию вложения. Результатом операции вложения является трехмерный тензор формы [None, sequence_length, embedding_size].

Означает ли это, что мы на самом деле обучения слово вложения здесь? В начале учебного пособия указано:

Мы не будем использовать предварительно подготовленные векторы word2vec для наших словесных вложений. Вместо этого мы изучаем вложения с нуля.

Но я не вижу строки кода, где это происходит на самом деле. code of the embedding layer не выглядит так, как будто есть что-то подготовленное или узнанное - так, где это происходит?

ответ

3

Ответ на Ques 1 (Так что я правильно, если я предполагаю, что tf.nn.embedding_lookup игнорирует значение 0?):

В 0 'во входном векторе является индекс символа 0-го в словаре, который является символом PAD. Я не думаю, что это игнорируется при выполнении поиска.Будет возвращена 0-я строка матрицы встраивания.

Ответ на Ques 2 (Но как tf.nn.embedding_lookup знать об этих индексов, заданных self.input_x?):

Размер матрицы вложения является [V * E] где размер словаря и E - размерность вектора вложения. 0-я строка матрицы является вектором вложения для 0-го элемента словаря, 1-я строка матрицы является вектором вложения для 1-го элемента лексики. Из входного вектора x мы получаем индексы слов в словаре, которые используются для индексации матрицы вложения.

Ответ на вопрос 3 (Означает ли это, что мы действительно изучаем здесь вложения слов?).

Да, мы на самом деле изучаем матрицу внедрения. В слое внедрения в строке W = tf.Variable( tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),name="W") W является матрицей встраивания и по умолчанию в тензорном потоке trainable=TRUE для переменной. Таким образом, W также будет изученным параметром. Чтобы использовать предварительно подготовленную модель, установите trainable = False.

Для детального объяснения кода вы можете следить в блоге: https://agarnitin86.github.io/blog/2016/12/23/text-classification-cnn

+0

Спасибо! Также для ссылки - я собираюсь изучить это как можно скорее :) – displayname

Смежные вопросы