人工智能A7论坛 >> Tensorflow和深度学习笔记_论坛版 >> 4.深度学习预备知识 >> 4.4 Word embedding

4.4.4 tensorflow训练词向量

     Word2vec要实现并行有一定难度,在tensorflow中,Word2vec目前只能用CPU训练,不支持GPU训练。因此需要使用with tf.device(/cpu:0)将计算限定在CPU中进行。

Tensorflow实现word2vec步骤如下

定义占位符

确定每次训练的时候,batch的形式每次输入多少个训练样本

1

2

3

# Placeholders for inputs

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

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

定义参数

整个过程中,有两部分参数需要学习,一部分是所有词向量组成的矩阵,另一部分是链接隐层和输出层的权重矩阵和对应的偏置。 用下面三组变量分别表示为:

1

2

3

4

5

6

7

8

9

   embeddings = tf.Variable(

        tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))

    embed = tf.nn.embedding_lookup(embeddings, train_inputs)

 

    # Construct the variables for the NCE loss

    nce_weights = tf.Variable(

        tf.truncated_normal([vocabulary_size, embedding_size],

                            stddev=1.0 / math.sqrt(embedding_size)))

    nce_biases = tf.Variable(tf.zeros([vocabulary_size]))

设置损失函数和优化算法

正常情况下需要通过tf.Operation类定义节点计算,但是由于要配合负采样操作,系统默认提供了一个默认实现,只要简单设置一下参数即可。

1

2

3

4

5

6

7

# Compute the NCE loss, using a sample of the negative labels each time.

loss = tf.reduce_mean(

  tf.nn.nce_loss(nce_weights, nce_biases, embed, train_labels,

                 num_sampled, vocabulary_size))

 

# We use the SGD optimizer.

optimizer = tf.train.GradientDescentOptimizer(learning_rate=1.0).minimize(loss)

迭代训练

1

2

3

for inputs, labels in generate_batch(...):

  feed_dict = {training_inputsinputs, training_labelslabels}

  _, cur_loss = session.run([optimizer, loss], feed_dict=feed_dict)

 

原始代码:

https://github.com/tensorflow/tensorflow/blob/r0.7/tensorflow/examples/tutorials/word2vec/word2vec_basic.py