我试图了解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]))两者都是随机初始化的,而且(据我所知)都是在学习期间进行更新的。
# 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))我想他们俩都应该是受过训练的模特。然而,权重和偏差在以后的相似度计算中永远不会使用。相反,只使用一个组件:
# 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)那么模型的第二部分呢?为什么体重和偏见被忽视了?
谢谢。
发布于 2016-06-27 20:52:11
在word2vec中,您想要的是单词的向量表示。为了做到这一点,除其他外,你可以使用神经网络。所以你有输入,神经元,输出和隐藏层。要学习向量表示,你要做的是有一个隐藏层,其中神经元的数量与你想要的向量中的维数相同。每个字有一个输入,每个字有一个输出。然后你训练网络从输出中学习输入,但是在中间你有一个较小的层,你可以把它看作是向量中输入的编码。这是重量和偏差。但是你以后不需要它们了,你用来测试的是一本字典,它包含了这个词和表示那个词的向量。这比运行神经网络来获得表示要快。所以你以后才看不见。
关于余弦距离的最后一段代码是知道哪些向量与计算的向量接近。你有一些单词(向量),你做一些运算(比如:国王-男人+女人),然后你有一个向量,你想在结果中转换。这是在所有向量之间运行的余弦函数(皇后与操作的结果向量有最小的距离)。
总之,在验证阶段,您没有看到权重和偏见,因为您不需要它们。您使用您在培训中创建的词典。
UPDATE s0urcer更好地解释了如何创建向量表示。
网络的输入层和输出层代表文字。这意味着如果单词不存在,则值为0,如果单词在那里,则为1。第一个位置是一个单词,其次是另一个单词,等等。你有作为输入/输出神经元的单词。
中间层是上下文,或者是你矢量表示的单词。
现在你用句子或一组连续的单词来训练网络。从这个组中,您取一个单词并将其设置在输入中,另一个单词是网络的输出。因此,基本上,网络学习一个单词如何在其上下文中与其他单词相关联。
要获得每个单词的向量表示,您可以将该单词的输入神经元设置为1,并查看上下文层(中间层)的值。这些值是向量的值。由于除了单词1之外,所有输入都是0,这些值是输入神经元与上下文连接的权重。
以后不使用网络,因为不需要计算上下文层的所有值,这样会慢一些。您只需要在字典中检查单词的值是什么。
发布于 2016-11-27 13:52:06
skip的概念是根据上下文对单词进行比较。因此,如果词语出现在相同的语境中,我们认为它们是平等的。NN的第一层表示文字向量编码(基本上称为嵌入)。第二层表示上下文。每次我们只取一行(Ri)的第一层(因为输入向量总是看起来像0,.,0,0,.,.,0,0,.),然后乘以第二层的所有列(Cj,j= 1..num ),这个积就是NN的输出。我们训练神经网络有最大输出分量Ri * Cj,如果单词I和j经常出现在附近(在相同的上下文中)。在每个训练周期中,我们只调整一个Ri (同样是因为选择输入向量的方式)和所有的Cj,j=1.w。当训练结束时,我们抛出第二层的矩阵,因为它代表上下文。我们只使用第一层的矩阵来表示单词的向量编码。
发布于 2016-06-28 21:50:56
在此更新权重和偏差:
_, loss_val = session.run([optimizer, loss], feed_dict=feed_dict)
优化器执行以下操作--计算梯度,然后执行更新步骤。
相似度是一个单独的计算,在不同的位置调用,并用于验证结果。它发生在代码的以下部分:
if step % 10000 == 0: sim = similarity.eval()
嵌入的验证依赖于相似度的嵌入。
https://stackoverflow.com/questions/37982478
复制相似问题