张量流word2vec例子中权重和偏差的目的是什么?

War*_*oth 9 machine-learning deep-learning tensorflow

我试图理解word2vec示例是如何工作的,并不真正理解传递给nse_loss函数的权重和偏差的目的是什么.函数有两个变量输入:权重(加偏差)和嵌入.

# Look up embeddings for inputs.
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]))
Run Code Online (Sandbox Code Playgroud)

两者都是随机初始化的(据我所知)两者都在学习期间受到更新.

# Compute the average NCE loss for the batch.
loss = tf.reduce_mean(
  tf.nn.nce_loss(nce_weights, nce_biases, embed, train_labels,
                 num_sampled, vocabulary_size))
Run Code Online (Sandbox Code Playgroud)

我想他们两个都应该代表训练有素的模型.然而,重量和偏差以后从未用于相似性计算.相反,只使用一个组件:

# Compute the cosine similarity between minibatch examples and all embeddings.
norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))
normalized_embeddings = embeddings / norm
valid_embeddings = tf.nn.embedding_lookup(
  normalized_embeddings, valid_dataset)
similarity = tf.matmul(
  valid_embeddings, normalized_embeddings, transpose_b=True)
Run Code Online (Sandbox Code Playgroud)

那么模型的第二个组成部分呢?为什么重量和偏差被忽略了?

谢谢.

jor*_*emf 4

在 word2vec 中,您想要的是单词的向量表示。为此,您可以使用神经网络等。所以你有输入神经元、输出和隐藏层。学习向量表示的方法是建立一个隐藏层,其神经元数量与向量中所需的维度相同。每个字有一个输入,每个字有一个输出。然后训练网络从输出中学习输入,但在中间有一个较小的层,您可以将其视为向量中输入的编码。这是权重和偏差。但稍后您不需要它们,您用于测试的是一个字典,其中包含单词和代表该单词的向量。这比运行神经网络来获取表示更快。这就是为什么你以后看不到它。

您编写的关于余弦距离的最后一个代码是为了了解哪些向量与您计算的向量接近。您有一些单词(向量),您进行了一些操作(例如:国王 - 男人 + 女人),然后您有一个要在结果中转换的向量。这是在所有向量之间运行的余弦函数(皇后与运算结果向量的距离最小)。

总而言之,您在验证阶段看不到权重和偏差,因为您不需要它们。您使用在培训中创建的词典。

UPDATE s0urcer 更好地解释了如何创建向量表示。

网络的输入层和输出层代表单词。这意味着如果该单词不存在,则该值为 0;如果该单词存在,则该值为 1。第一个位置是一个单词,第二个位置是另一个单词,依此类推。输入/输出神经元就像单词一样。

中间层是上下文,或者是单词的向量表示。

现在,您可以使用句子或一组连续单词来训练网络。从这一组中,您取出一个单词并将其设置为输入,其他单词作为网络的输出。所以基本上网络会学习一个单词如何与其上下文中的其他单词相关。

要获得每个单词的向量表示,您将该单词的输入神经元设置为 1 并查看上下文层(中间层)的值。这些值是向量的值。由于除了单词为 1 之外的所有输入均为 0,因此这些值是输入神经元与上下文的连接权重。

稍后你不再使用网络,因为你不需要计算上下文层的所有值,那样会更慢。您只需要在字典中检查该单词的这些值是什么即可。