私はテンソルフローとWord2vecが初めてです。私は、Skip-Gram
アルゴリズムを使用してモデルをトレーニングする Word2vec_basic.py を調査しました。ここで、CBOW
アルゴリズムを使用してトレーニングしたいと思います。これを単にtrain_inputs
とtrain_labels
を逆にしただけで達成できるのは本当ですか?
CBOW
モデルアーキテクチャはベクトルの合計を使用するため、CBOW
モデルはtrain_inputs
のtrain_labels
とSkip-gram
を反転するだけでは達成できないと思います分類子が予測する単一のインスタンスとして周囲の単語の。たとえば、quick
を使用してthe
を予測するのではなく、[the, brown]
を一緒に使用してquick
を予測する必要があります。
CBOWを実装するには、新しいgenerate_batch
ジェネレーター関数を記述し、ロジスティック回帰を適用する前に周囲の単語のベクトルを合計する必要があります。参照できる例を書きました: https://github.com/wangz10/tensorflow-playground/blob/master/Word2vec.py#L105
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)に注意してください。
これだよ!
基本的に、はい:
指定されたテキストthe quick brown fox jumped over the lazy dog:
、ウィンドウサイズ1のCBOWインスタンスは
([the, brown], quick), ([quick, fox], brown), ([brown, jumped], fox), ...