了解 Word2Vec 的 Skip-Gram 结构和输出
Understanding Word2Vec's Skip-Gram Structure and Output
我的问题有两个方面,但希望不要太复杂。并且这两部分都与 Word2Vec 中的 Skip-Gram 模型有关:
第一部分是关于结构的:据我了解,Skip-Gram模型是基于一个神经网络和一个输入权重矩阵W,一个大小为 N 的隐藏层,以及 C 个输出权重矩阵 W',每个矩阵用于生成 C 个输出向量之一。这是正确的吗?
第二部分是关于输出向量:据我了解,每个输出向量的大小为 V,并且是 Softmax 函数的结果。每个输出向量 node 对应一个词在词汇表中的索引,每个节点的值是相应词在该上下文位置出现的概率(对于给定的输入词) .然而,目标输出向量不是单热编码的,即使训练实例是。这是正确的吗?
我想象的方式大致如下(虚构的示例):
假设词汇表 ['quick'、'fox'、'jumped'、'lazy'、'dog'] 和上下文 C=1,并假设对于输入词 'jumped' 我看到两个输出向量如下所示:
[0.2 0.6 0.01 0.1 0.09]
[0.2 0.2 0.01 0.16 0.43]
我会将其解释为 'fox' 是最有可能出现在 'jumped' 之前的词 (p=0.6),而 'dog' 最有可能出现在它之后(p=0.43).
我有这个权利吗?还是我完全离开了?感谢您的帮助。
没有。
您可以自由设置向量的长度。
那么,向量是什么?
是词义的分布式表示。
我不明白它究竟是如何训练的。但是,训练有素的意思如下。
如果像这样的向量表示,
[0.2 0.6 0.2]
比[0.7 0.2 0.5]更接近[0.2 0.7 0.2]。
这是另一个例子。
哭 [0.5 0.7 0.2]
快乐 [-0.4 0.3 0.1]
悲伤 [0.4 0.6 0.2]
'CRY' 比 'HAPPY' 更接近 'SAD' 因为方法(CBOW 或 SKIP-GRAM 等)可以使向量在意义(或语法)时更接近position) 的词是相似的。
其实,准确取决于很多事情,相当。选择方法也很重要。还有大量的好数据(语料库)。
如果你想检查一些词的相似度,你先做词的向量,然后检查那些词的余弦相似度。
论文(https://arxiv.org/pdf/1301.3781.pdf)解释了一些方法并列出了准确度。
能看懂c代码,word2vec程序(https://code.google.com/archive/p/word2vec/)很有用。它实现了 CBOW(Continuous Bag-Of-Words) 和 SKIP-gram。
ps) 请纠正我的英语不好。
ps) 评论,如果你还有问题。
这是我在 SO 的第一个答案,所以就这样吧..
根据本文,您对这两部分的理解似乎都是正确的:
http://arxiv.org/abs/1411.2738
这篇论文详细解释了 word2vec,同时又非常简单 - 值得一读以透彻理解 word2vec 中使用的神经网络架构。
- Skip Gram 的结构确实使用单个神经网络,输入为单热编码目标词,预期输出 作为单热编码上下文词。在文本语料库上训练神经网络后,输入权重矩阵 W 用作语料库中单词的输入向量表示,输出权重矩阵 W' 在所有 C 输出中共享(问题术语中的输出向量,但要避免与接下来使用的输出向量表示混淆..),成为单词的输出向量表示。通常忽略输出向量表示,并使用输入向量表示 W 作为词嵌入。为了进入矩阵的维数,如果我们假设词汇表大小为 V,隐藏层的大小为 N,我们将有 W 为 (V,N) 矩阵,每一行代表词汇表中索引词的输入向量。 W' 将是一个 (N,V) 矩阵,每一列代表索引词的输出向量。这样我们就得到了单词的N维向量。
- 如您所述,每个输出(避免使用术语输出向量)的大小为 V,并且是 softmax 函数的结果,输出中的每个节点给出单词作为给定目标词的上下文词出现的概率,导致输出不是 one-hot encoded.But 预期输出确实是 one-hot 编码的,即在训练阶段,计算误差通过从神经网络输出中减去在该上下文位置出现的实际单词的单热编码向量,然后使用梯度下降更新权重。
参考你说的例子,C=1,词汇表['quick','fox','jumped', 'lazy', 'dog']
如果 skip-gram 的输出是 [0.2 0.6 0.01 0.1 0.09],其中正确的目标词是 'fox',那么误差计算为 -
[0 1 0 0 0] - [0.2 0.6 0.01 0.1 0.09] = [-0.2 0.4 -0.01 -0.1 -0.09]
并更新权重矩阵以最小化此错误。
希望对您有所帮助!
我的问题有两个方面,但希望不要太复杂。并且这两部分都与 Word2Vec 中的 Skip-Gram 模型有关:
第一部分是关于结构的:据我了解,Skip-Gram模型是基于一个神经网络和一个输入权重矩阵W,一个大小为 N 的隐藏层,以及 C 个输出权重矩阵 W',每个矩阵用于生成 C 个输出向量之一。这是正确的吗?
第二部分是关于输出向量:据我了解,每个输出向量的大小为 V,并且是 Softmax 函数的结果。每个输出向量 node 对应一个词在词汇表中的索引,每个节点的值是相应词在该上下文位置出现的概率(对于给定的输入词) .然而,目标输出向量不是单热编码的,即使训练实例是。这是正确的吗?
我想象的方式大致如下(虚构的示例):
假设词汇表 ['quick'、'fox'、'jumped'、'lazy'、'dog'] 和上下文 C=1,并假设对于输入词 'jumped' 我看到两个输出向量如下所示:
[0.2 0.6 0.01 0.1 0.09]
[0.2 0.2 0.01 0.16 0.43]
我会将其解释为 'fox' 是最有可能出现在 'jumped' 之前的词 (p=0.6),而 'dog' 最有可能出现在它之后(p=0.43).
我有这个权利吗?还是我完全离开了?感谢您的帮助。
没有。 您可以自由设置向量的长度。
那么,向量是什么?
是词义的分布式表示。
我不明白它究竟是如何训练的。但是,训练有素的意思如下。
如果像这样的向量表示,
[0.2 0.6 0.2]
比[0.7 0.2 0.5]更接近[0.2 0.7 0.2]。
这是另一个例子。
哭 [0.5 0.7 0.2]
快乐 [-0.4 0.3 0.1]
悲伤 [0.4 0.6 0.2]
'CRY' 比 'HAPPY' 更接近 'SAD' 因为方法(CBOW 或 SKIP-GRAM 等)可以使向量在意义(或语法)时更接近position) 的词是相似的。
其实,准确取决于很多事情,相当。选择方法也很重要。还有大量的好数据(语料库)。
如果你想检查一些词的相似度,你先做词的向量,然后检查那些词的余弦相似度。
论文(https://arxiv.org/pdf/1301.3781.pdf)解释了一些方法并列出了准确度。
能看懂c代码,word2vec程序(https://code.google.com/archive/p/word2vec/)很有用。它实现了 CBOW(Continuous Bag-Of-Words) 和 SKIP-gram。
ps) 请纠正我的英语不好。 ps) 评论,如果你还有问题。
这是我在 SO 的第一个答案,所以就这样吧..
根据本文,您对这两部分的理解似乎都是正确的:
http://arxiv.org/abs/1411.2738
这篇论文详细解释了 word2vec,同时又非常简单 - 值得一读以透彻理解 word2vec 中使用的神经网络架构。
- Skip Gram 的结构确实使用单个神经网络,输入为单热编码目标词,预期输出 作为单热编码上下文词。在文本语料库上训练神经网络后,输入权重矩阵 W 用作语料库中单词的输入向量表示,输出权重矩阵 W' 在所有 C 输出中共享(问题术语中的输出向量,但要避免与接下来使用的输出向量表示混淆..),成为单词的输出向量表示。通常忽略输出向量表示,并使用输入向量表示 W 作为词嵌入。为了进入矩阵的维数,如果我们假设词汇表大小为 V,隐藏层的大小为 N,我们将有 W 为 (V,N) 矩阵,每一行代表词汇表中索引词的输入向量。 W' 将是一个 (N,V) 矩阵,每一列代表索引词的输出向量。这样我们就得到了单词的N维向量。
- 如您所述,每个输出(避免使用术语输出向量)的大小为 V,并且是 softmax 函数的结果,输出中的每个节点给出单词作为给定目标词的上下文词出现的概率,导致输出不是 one-hot encoded.But 预期输出确实是 one-hot 编码的,即在训练阶段,计算误差通过从神经网络输出中减去在该上下文位置出现的实际单词的单热编码向量,然后使用梯度下降更新权重。
参考你说的例子,C=1,词汇表['quick','fox','jumped', 'lazy', 'dog']
如果 skip-gram 的输出是 [0.2 0.6 0.01 0.1 0.09],其中正确的目标词是 'fox',那么误差计算为 -
[0 1 0 0 0] - [0.2 0.6 0.01 0.1 0.09] = [-0.2 0.4 -0.01 -0.1 -0.09]
并更新权重矩阵以最小化此错误。
希望对您有所帮助!