一、基础:语言模型:
语言模型形式化的描述就是给定一个字符串,看它是自然语言的概率 P(w1,w2,…,wt)。w1w1 到 wtwt 依次表示这句话中的各个词。有个很简单的推论是:
P(w1,w2,…,wt)=P(w1)×P(w2|w1)×P(w3|w1,w2)×…×P(wt|w1,w2,…,wt−1)P(w1,w2,…,wt)=P(w1)×P(w2|w1)×P(w3|w1,w2)×…×P(wt|w1,w2,…,wt−1) 常用的语言模型都是在近似地求 P(wt|w1,w2,…,wt−1)。比如n-gram模型就是用 P(wt|wt−n+1,…,wt−1) 近似表示前者。
二、实现方式
2.1 基本框架
2.1.1 CBOW
根据上下文预测当前词
2.1.2 skip_gram
根据当前词预测上下文
Cbow和skip-gram的比较:
两者建模的都是词共现的一个关系,并没有考虑词序;
skip-gram的计算量更大(跟输出层相比,输入层的计算量是比较小的),也更精确。
2.2 优化方式
主要是优化输出层,不做优化的话,原始输出层的维度是V,计算量比较大(特别是训练词向量的语料都很大,但一般的生成任务比如翻译,语料不会太大,就不需要做这个优化,充分利用每一条数据)。
2.2.1 hierarchical softmax
通过构建一个haffman树,最后输出层是一个层次softmax,最大化从根节点走到目标词节点的路径概率,每个节点是一次二分类(具体的是逻辑回归)。所以计算量最多是log2V,并且越高频的词的路径需要走的路径越短,需要的计算量也越小。
层次softmax的示意 霍夫曼树额生成2.2.2 negative sampling
随机的采样k个词,进行softmax,当然越频繁的词被采样采中的概率越高。(在词向量c语言的实现版本中,这个采样的实现有点意思,其首先定义一个100M长的数组,然后用词表中的词的编号填满这个数组,每个词填充的次数=词频*100M。然后采样的时候只要生产一个介于0到100M的随机数进行取数就行了,效率很高)
负采样跟hierarchical softmax是类似的,都是频率越高的词被迭代的次数越多。
网友评论