大致聊一下word2vec
word2vec分别有输入层,隐藏层,输出层;输入的是单词的one-hot表示,隐层的激活函数是线性的,输出的是词表中每个单词的预测概率;word2vec有skip-gram,CBOW两种网络模型,skip-gram的思想是通过中心词来预测上下文,CBOW的思想是通过上下文来预测中心词;
word2vec的目标函数是将条件概率最大化:(和语言模型很像)
P
(
上下文
∣
中心词
)
,
P
(中心词
∣
上下文)
P(上下文|中心词),P(中心词|上下文)
P(上下文∣中心词),P(中心词∣上下文)
word2vec有两种优化方法:分层softmax和负采样。
详细说一下分层softmax和负采样
问题:不经过优化的skip-gram和CBOW,在每个单词的训练过程中都要遍历整个词表,复杂度为O(V),在输出层都要经过softmax归一化,计算量很大;在更新参数时,也需要计算所有参数的梯度,分层softmax和负采样就是对此进行优化,只计算和当前预测词有关的参数的梯度。
分层softmax:在标准的softmax回归中,要计算属于某类的概率,需要计算所有类别的概率,这非常耗时。基本思想是用树的层级结构替代标准的softmax,只计算一条路径上的结点的概率值,本质是在一条路径上不停的做二分类,将N分类转化为logN分类。
使用最优二叉树来表示所有的单词,每个叶子结点表示一个单词,每个单词可以由哈夫曼编码表示,词频高的词在离根节点越近,哈夫曼树保证了词频高的单词路径短,词频低的单词路径长,这种方式很大程度上减少了计算量。哈夫曼树是带权路径最短的树
每个分支都是通过sigmoid来计算概率的,用于判断在哈夫曼树中走左子树还是右子树。
负采样:预测总体类别的一个子集,本质在于生成K个噪声,基于中心词生成上下文(窗口内单词)的概率为1,生成噪声的概率为0,复杂度为O(K)
负采样的目的是在优化参数时,不需要对所有的向量矩阵进行优化,只需要对涉及到的词向量优化。
word2vec如何获取词向量
word2vec有输入层,隐藏层,输出层;在输入层,单词是以one-hot的形式表示的,当训练完成时,输入层和隐藏层之间的权重参数就是所有单词的词向量,输入层只有一个神经元是1,该神经元到所有隐层神经元的权重组成该单词的词向量,词向量的维度和隐层的神经元数量有关。
一个词在经过word2vec之后,将会得到两种词向量:作为中心词的词向量和作为背景词的词向量。
怎么理解词向量
世界上本没有什么embedding,有的只是one-hot。词向量就是one-hot的降维表示。
计算句子相似度
word2vec:可以将句子中所有单词的embedding相加起来作为句子向量,计算两个句子向量的余弦距离cosine
在你的项目中word2vec是怎么用的
fastText与word2vec的区别
使用了字符级别的n-gram来表示一个单词:
< apple >
<ap,app,ppl,ple,le>
好处:对于低频词生成的词向量效果会更好,因为可以和其他词共享n-gram。
对于oov的单词,我们可以通过叠加字符级别的n-gram来构建词向量。
输入输出:
fastText的输入是文档中所有的单词的embedding及其n-gram特征,word2vec的输入是滑动窗口内的单词。
fastText的输出是文本对应的类别,word2vec的输出是目标词汇。
词袋法叠加词向量:将文档所有的词向量及其n-gram特征词向量相加取平均。