目录
进入新的领域 加油!
1.统计语言模型
语言模型 本质就是让机器学会说话
但是机器本质上是只会1+1
统计语言模型是所有 NLP的基础,被广泛应用与语音识别、机器翻译、分词、词性标注和信息检索等任务。
传统的统计语言模型是表示语言基本单位(一般为句子)的概率分布函数,这个概率分布也是该语言
的生成模型。通俗的讲,如果一句话没有在语料库中出现,可以模拟句子的生成的方式,生
成句子在语料库中的概率。一般语言模型可以使用各个词语条件概率的形式表示:
其中,Context 为 w_i 的上下文。根据Context的表示差异,统计语言模型又可以分为不同的类别
2. N-gram
统计语言模型实际上是一个概率模型,
常见的概率模型有:N-gram 模型、决策树、最大熵模型、隐马尔可夫模型、条件随机场、神经网络等,目前常用于语言模型的是 N-gram 模型和神经语言模型
我 今天 下午 打 篮球
p(S)=p(w1,w2,w3,w4,w5,...,wn)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)
p(S)被称为语言模型,即用来计算一个句子概率的模型
马尔可夫(Markov)假设——未来的事件,只取决于有限的历史
基于马尔可夫假设,N-gram 语言模型认为一个词出现的概率只与它前面的 n-1 个词相关
假设下一个词的出现依赖它前面的一个词:
p(S)=p(w1,w2,w3,w4,w5,...,wn)=p(w1)p(w2|w1)p(w3|w2)...p(wn|wn-1)
假设下一个词的出现依赖它前面的两个词:
p(S)=p(w1,w2,w3,w4,w5,...,wn)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|wn-1,wn-2)
我们管这样的叫 n-gram 模型
当 N=1 的时候,为一元模型(Unigram model): (自己独立出现 与前后词无关)
P(S)=P(w1,w2,w3,..,wn)=P(W1)P(W2)…*P(Wn)
当 N=2 的时候,叫二元模型(Bigram model):(只与前面一个词有关)
P(S)=P(w1,w2,w3,..,wn)=P(W1|start)P(W2|W1)…*P(Wn|Wn-1)
当 N=3 的时候,叫三元模型(trigram model):(只与前面两个词有关)
P(S)=P(w1,w2,w3,..,wn)=P(W2|start,W1)P(W3|W1,W2)…*P(Wn|Wn-1,Wn-2)
举例:
假设语料库里面 经过统计 每个词出现的次数:
二元单词分布情况表:
i后面跟want一共出现了 827 次
频率分布表:
“i”一共出现了 2533 次,而其后出现“want”的情况一共有 827次,所以 P(want|i)=827/2533≈0.33
p(I want chinese food)=p(want|I)p(chinese|want)p(food|chinese)
假设没有计算和存储限制,n 是不是越大越好?早期因为计算性能的限制,一般最大取到 n=4;如今,即使 n>10 也没有问题,但是,随着 n 的增大,模型的性能增大却不显著,这里涉及了可靠性与可区别性的题参数越多,模型的可区别性越好,但是可靠性却在下降——因为语料的规模是有限的,导致 count(W) 的实例数量不够,从而降低了可靠性。
总结:
该语言模型只看当前词的前 n-1 个词对当前词的影响。所有该模型的优势为:
(1)该模型包含了前 n-1 个词所能提供的全部信息,这些词对当前词的出现具有很强的约束能;
(2)只看前 n-1 个词而非所有词,所以使得模型的效率较高。
该模型也有很多缺陷:
(1)n-gram 语言模型无法建模更远的关系,语料的不足使得无法训练更高阶的语言模型(通常n=2 或 3);
(2)该模型无法建模出词与词之间的相似度,比如“白色汽车”和“白色轿车”;
(3)训练语料中有些 n 元组没有出现过,其对应的条件概率为 0,导致计算一整句话的概率为 0!
3. NPLM神经语言模型
Neural Probalistic Language Model
沿用了 N-gram 模型中的思路,将 w 的前 n-1 个词作为 w 的上下文 context(w),
其中 c(w) 表示 w 的词向量
【输入层】首先,将 context(w) 中的每个词映射为一个长为 m 的词向量,词向量在训练开始时是随机的,并参与训练;
【投影层】将所有上下文词向量收尾相连拼接为一个长向量
,作为 w 的特征向量,该向量的维度为 1X(n-1)m 也就是一个长度为(n-1)m的向量
【隐藏层】拼接后的向量会经过一个规模为 h 隐藏层,该隐层使用的激活函数为 tanh
【输出层】最后会经过一个规模为 N 的 Softmax 输出层,从而得到词表中每个词作为下一个词的概率分布
其中 m, n, h 为超参数,N 为词表大小,视训练集规模而定,也可以人为设置阈值
训练时,使用交叉熵作为损失函数
当训练完成时,就得到了 N-gram 神经语言模型,以及副产品词向量,
模型概括为:
模型的超参数:m, n, h, N
m 为词向量的维度,通常在 10^1 ~ 10^2 例如:128
n 为 n-gram 的规模,一般小于 5 例如:3 也就是只跟前2个词有关 作为上下文
h 为隐藏的单元数,一般在 10^2
N 位词表的数量,一般在 10^4 ~ 10^5,甚至 10^6,词表的长度
网络参数包括两部分:
词向量 C: 一个 N * m 的矩阵——其中 N 为词表大小,m 为词向量的维度,通过该表可以查询每个词 对应的词向量
网络参数 W, U, p, q:
NPLM 的优势
单词之间的相似性可以通过词向量来体现
S1=“我 今天 去 网咖” 出现了 1000 次
S2=“我 今天 去 网吧” 出现了 10 次
对于 N-gram 模型:P(S1)>>P(S2)
而神经网络模型计算的 P(S1)≈P(S2)
4. Word2Vec--基础中的基础
One-hot representation:对应位置数字取 1,其他位置全为 0
词表:[the cat sat on mat]
the [1 0 0 0 0]
cat [0 1 0 0 0]
sat [0 0 1 0 0]
on [0 0 0 1 0]
mat [0 0 0 0 1]
计算机是无法直接处理文本信息的,所以,在我们构建神经网络之前,要对文本进行一定的处理。
相信大家对(one-hot encode)编码应该不陌生了,但是表示文本的矩阵会非常的稀疏,极大得浪费了空间,而且这样一个矩阵放入
神经网络训练也会耗费相当多的时间。
为此,提出了词向量模型(Word2Vec)。词向量模型是一种将词的语义映射到向量空间
的技术,说白了就是用向量来表示词,但是会比用独热编码用的空间小,而且词与词之间可
以通过计算余弦相似度来看两个词的语义是否相近
King-Man+Woman=Queen
有了前面的准备,本节正式介绍 word2vec 中用到的两个重要的模型-CBOW 模型
(Continuous Bag-of-Words Model)和 Skip-gram 模型(Continuous Skip-gram
Model)
5. CBOW 模型
根据上下文预测出来当前这个词是什么
先举例:
假设我们此时得到的概率分布已经达到了设定的迭代次数,那么现在我们训练出来的
look up table 应该为矩阵 W。即,任何一个单词的 one-hot 表示乘以这个矩阵都将得到
自己的 word embedding
总结:
- 输入上下文单词的 onehot.
- 所有 onehot 分别乘以共享的输入权重矩阵 W
- 所得的向量 相加求平均作 size 为 1*N.
- 乘以输出权重矩阵 W'
- 得到向量 {1*V} ,激活函数处理得到 V-dim 概率分布, {PS: 因为是 onehot 嘛,其中的每一维代表着一个单词},概率最大的 index 所指示的单词为预测出的中间词(targetword)
- 与 true label 的 onehot 做比较,误差越小越好
定义 loss function(一般为交叉熵代价函数),采用梯度下降算法更新 W和 W'。训练完毕后,输入层的每个单词与矩阵 W 相乘得到的向量的就是我们想要的词向量
(word embedding),这个矩阵(所有单词的 word embedding)也叫做 look up table(其实聪明的你已经看出来了,其实这个 look up table 就是矩阵 W 自身),也就是说,
任何一个单词的 onehot 乘以这个矩阵都将得到自己的词向量。
Continuous Bag-of-Word Model(连续词袋模型)和 skip-gram model(跳字模型),分别对应了词向量的两种训练方法:
利用 context 预测中心词以及利用中心词去预测context。对于连续词袋模型CBOW)来说,一般的做法是先对每个单词进行 one-of-N编码(one-hot encoded),作为训练网络的输入,接着构建一层 hidden layer,最后构建输出层,这一层是一个 softmax 层,每个 context 单词到心单词的事件都被认为是独立的,所以将这些事件发生的概率相乘,最后构建损失函数,即:将输出概率分布和实际选中的词概率分布进行 Corss Entropy 计算,接下来使用 SGD 对参数进行更新。这里,hiddenlayer 的训练结果就是最终的 word vector 了。
6. Skip-gram
根据当前这个词来预测上下文
Skip-gram 的具体训练过程如下,蓝色代表输入的词,图的框框代表滑动窗口,用来截取蓝色词的上下文,蓝色词的上下文作为输出,然后形成训练标本(Training Samples),这样我们就得到了{输入和输},他们放入{输入层-隐藏层-输出层}的神经网络训练,我们就能得到 Skip-gram 模型。因为神经网络不能直接处理文本,因此所有的词都用 one-hotencode 表示.
Skip-gram 的神经网络结构如图所示,隐藏层有 300 个神经元,输出层用 softmax 激励函数,通过我们提取的词与其相应的上下文去训练,得到相应的模型。通过 Softmax 激励函数,输出层每个神经元输出是概率,加起来等于 1。
但输出层并不是我们关心的,我们去掉模型的输出层,才是我们想要的词向量模型,我们通过隐藏层的权重来表示我们的词。
现在假设我们有 10000 个词,每个词用 one-hot encode 编码,每个词大小就是1*10000,现在我们想用 300 个特征去表示一个词,那么隐藏层的输入是 10000,输出是300(即 300 个神经元),因此它的值矩阵大小为 10000 * 300。那么我们的词向量模型本质上就变成了矩阵相乘。