web-dev-qa-db-ja.com

Tensorflow:Word2vec CBOWモデル

私はテンソルフローとWord2vecが初めてです。私は、Skip-Gramアルゴリズムを使用してモデルをトレーニングする Word2vec_basic.py を調査しました。ここで、CBOWアルゴリズムを使用してトレーニングしたいと思います。これを単にtrain_inputstrain_labelsを逆にしただけで達成できるのは本当ですか?

12
gladys0313

CBOWモデルアーキテクチャはベクトルの合計を使用するため、CBOWモデルはtrain_inputstrain_labelsSkip-gramを反転するだけでは達成できないと思います分類子が予測する単一のインスタンスとして周囲の単語の。たとえば、quickを使用してtheを予測するのではなく、[the, brown]を一緒に使用してquickを予測する必要があります。

enter image description here

CBOWを実装するには、新しいgenerate_batchジェネレーター関数を記述し、ロジスティック回帰を適用する前に周囲の単語のベクトルを合計する必要があります。参照できる例を書きました: https://github.com/wangz10/tensorflow-playground/blob/master/Word2vec.py#L105

14
Zichen Wang

CBOWの場合、コードの一部のみを変更する必要があります Word2vec_basic.py 。全体的なトレーニングの構造と方法は同じです。

Word2vec_basic.pyのどの部分を変更すればよいですか?

1)トレーニングデータのペアを生成する方法。 CBOWでは、コンテキストワードではなく、中央のワードを予測しているためです。

generate_batchの新しいバージョンは

def generate_batch(batch_size, bag_window):
  global data_index
  span = 2 * bag_window + 1 # [ bag_window target bag_window ]
  batch = np.ndarray(shape=(batch_size, span - 1), dtype=np.int32)
  labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)  
  buffer = collections.deque(maxlen=span)
  for _ in range(span):
    buffer.append(data[data_index])
    data_index = (data_index + 1) % len(data)
  for i in range(batch_size):
    # just for testing
    buffer_list = list(buffer)
    labels[i, 0] = buffer_list.pop(bag_window)
    batch[i] = buffer_list
    # iterate to the next buffer
    buffer.append(data[data_index])
    data_index = (data_index + 1) % len(data)
  return batch, labels

次に、CBOWの新しいトレーニングデータは

data: ['anarchism', 'originated', 'as', 'a', 'term', 'of', 'abuse', 'first', 'used', 'against', 'early', 'working', 'class', 'radicals', 'including', 'the']

#with bag_window = 1:
    batch: [['anarchism', 'as'], ['originated', 'a'], ['as', 'term'], ['a', 'of']]
    labels: ['originated', 'as', 'a', 'term']

スキップグラムのデータと比較

#with num_skips = 2 and skip_window = 1:
    batch: ['originated', 'originated', 'as', 'as', 'a', 'a', 'term', 'term', 'of', 'of', 'abuse', 'abuse', 'first', 'first', 'used', 'used']
    labels: ['as', 'anarchism', 'originated', 'a', 'term', 'as', 'a', 'of', 'term', 'abuse', 'of', 'first', 'used', 'abuse', 'against', 'first']

2)したがって、変数の形状も変更する必要があります

train_dataset = tf.placeholder(tf.int32, shape=[batch_size])

train_dataset = tf.placeholder(tf.int32, shape=[batch_size, bag_window * 2])

3)損失関数

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

Zichen Wangが言及したように、inputs = tf.reduce_sum(embed、1)に注意してください。

これだよ!

9
Aerin

基本的に、はい:

指定されたテキストthe quick brown fox jumped over the lazy dog:、ウィンドウサイズ1のCBOWインスタンスは

([the, brown], quick), ([quick, fox], brown), ([brown, jumped], fox), ...
6
Sung Kim