word2vec
词袋模型
对一个句子的向量,其构造方法为:构造一个长度为语料库中所有不同单词个数的向量,每一维度为句子中单词的出现次数
缺点:
- 维度灾难
- 无法保留词序信息:仅仅具有词频信息
- 语义鸿沟
传统语言模型
定义:计算一个句子出现概率的模型
给定一个句子 $S=w_1,w_2,…,w_n$ , ($w_i$是单词)
其出现的概率 $P(S)=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)…P(w_n|w_1,w_2,…,w_{n-1})$
以上模型的缺点:
- 參数空间过大:条件概率 $P(w_n/w_1,w_2,..,w_{n-1})$ 的可能性太多,无法估算,不可能有用
- 数据稀疏严重:对于非常多词对的组合,在语料库中都没有出现,依据最大似然估计得到的概率将会是0
- 计算耗时:假设词汇表单词数V = 10000,句子平均长度为M = 20,则时间复杂度为$O(V^M)$,即$O(10^{80})$ , 时间复杂度可参考下边n-gram模型中的例图。因此,我们常常使用n-gram模型来近似求解$P(S)$
n-gram模型
为了解决以上问题,引入了马尔科夫假设:随意一个词出现的概率只与它前面出现的有限的一个或者几个词有关
- 如果一个词的出现与它周围的词是独立的,那么我们就称之为unigram也就是一元语言模型
- 如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为bigram
- 假设一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为trigram
- N元模型就是假设当前词的出现概率只与它前面的N-1个词有关
而这些概率参数都是可以通过大规模语料库来计算,比如三元模型有:
$P(w_i|w_{i-1},w_{i-2})=count(w_{i-2},w_{i-1},w_i)/count(w_{i-2},w_{i-1})$
若语料库中word个数为v,采用n元模型,则计算的个数为$(|V|^n)$,所以为节省时间,常常选用二元或三元模型
因为n-gram是基于统计单词和句子出现次数来进行概率估计的,所以n-gram是基于统计的语言模型
bigram的例图:

- 首先统计语料库中每个词出现的次数
- 再对每一个词后边接着另一个词的出现次数进行统计(在此处2-gram的时间复杂度为句子长度的平方,若为3-gram则还要统计在前两个词后接着第三个词出现的次数,时间复杂度还要乘以句长平方,故若为n-gram则为$V^n$)
- 通过统计次数来计算条件概率,进而通过公式来计算即可
神经语言模型(NNLM)
词向量
若想用计算机来处理自然语言,首先要将语言转换成计算机能理解处理的形式,所以最初人们用one-hot进行编码表示,但是由于word的数量很大,用onehot表示的向量长度很大,并且两个向量之间没有关系
故人们又用向量来进行表征,其与one-hot相比在于其向量维度比one-hot小,两个向量之间是存在关系的
比如有 [好,不错]两个词,用one-hot进行编码就是01,10,两个向量是完全正交没有关系的,但是我们知道它们是有近义词关系的,用word2vec就可以表示为 [0.1,0.7],[0.2,0.6],可以看出这两个向量的距离是很近的,可以认为是同义词
word embedding词嵌入:将word映射到另一个向量空间,就像是将word嵌入到另一个空间,故叫做词嵌入
神经语言模型
神经语言模型就是基于神经网络和词向量的一种模型,输入为上下文词向量(随机初始化的),输出为预测单词的概率和副产物–词向量(训练完较准确的)
该模型分为特征映射和计算条件概率分布两部分:
- 特征映射 1.
传统语言模型n-gram与神经原语言模型比较:神经语言模型的泛化能力较强,比如语料库中有黑汽车、白汽车,那么对黄汽车就会有比较好的预测,而传统语言模型则会判断为不是一个合适的词;但也不能说这是优势,比如预料库中有黑马、白马,当出现蓝马时(蓝马几乎不存在,所以其概率应远远小于黑马和白马),NNLM就会判断为与黑马和白马相似的概率
word2vec
上述的NNLM训练过程收敛太慢,需要拟合出一个靠谱的NNLM太麻烦了
NNLM是为了寻找一种语言模型的解决方法,而词向量只是副产物,但这给了人们一种不错的思路来表示词,所以如果我们只想得到词向量,能否进行问题的简化呢,于实就有了word2vec
两种实现模型:CBOW、skip-gram
-
连续词袋模型:
根据上下文的词来预测当前词的概率

-
skip-gram:
根据当前词来预测上下文的词
两种优化方法:hierarchical softmax、negative sampling
分层softmax:
构造哈夫曼树(带权路径最短,也称为最优树),节点为语料库中的词,权重为词频,在每一层进行判断这个词是属于左边还是右边,故对每一层而言就是逻辑回归,对于整棵树来说就是多分类即softmax
当语料库很大时,哈夫曼树的层数会比较深,时间复杂度就会比较高



负采样:
根据词频将线段分段,产生随机数,落到哪个区间就选择哪个单词作为负样本

