给定一句由 n 个词组成的句子 W= w 1 w_1 w1, w 2 w_2 w2,⋯, w n w_n wn
计算这个句子的概率 P( w 1 w_1 w1, w 2 w_2 w2,⋯, w n w_n wn)
或者计算根据上文计算下一个词的概率 P( w 1 w_1 w1| w 1 w_1 w1, w 2 w_2 w2,⋯, w n − 1 w_n-1 wn−1)
语言(人说的话) + 模型(完成某个任务)
P(“判断这个词的磁性”),P(“判断这个词的词性”)
“判断这个词的__”
用统计的方法去解决上述问题
条件概率的链式法则:
类似于全概率公式:
通过这个链式法则,可以根据每个词出现的概率以及条件概率,得出这句话的概率。
显然任务1中"磁性"的概率更小。
根据给定词序列,判断下一个词,可以直接计算如下概率,如公式1:
P ( w n e x t ∣ 判断,这个,词,的 ) P(w_{next}|判断,这个,词,的) P(wnext∣判断,这个,词,的)
展开得到公式2:
P ( w n e x t ∣ 判断,这个,词,的 ) = c o u n t ( w n e x t ,判断,这个,词,的 ) c o u n t ( 判断,这个,词,的 ) P(w_{next}|判断,这个,词,的) = \frac{count(w_{next},判断,这个,词,的)}{count(判断,这个,词,的)} P(wnext∣判断,这个,词,的)=count(判断,这个,词,的)count(wnext,判断,这个,词,的)
类似于贝叶斯公式:
其中 w n e x t w_{next} wnext∈V 表示词序列的下一个词,V 是一个具有 |V| 个词的词典
当V非常大时计算非常困难
假设字典 V 中有 “火星” 一词,可以明显发现 “火星” 不可能出现在 “判断这个词的” 后面,因此(火星,判断,这个,词,的)这个组合是不存在的,并且词典中会存在很多类似于 “火星” 这样的词。
进一步,可以发现我们把(火星,判断,这个,词,的)这个组合判断为不存在,是因为 “火星” 不可能出现在 “词的” 后面,也就是说我们可以考虑是否把公式1转化为公式3:
P
(
w
n
e
x
t
∣
判断,这个,词,的
)
≈
P
(
w
n
e
x
t
∣
词,的
)
P(w_{next}|判断,这个,词,的)≈P(w_{next}|词,的)
P(wnext∣判断,这个,词,的)≈P(wnext∣词,的)
公式3就是马尔科夫链的思想:假设 w(next) 只和它之前的 k 个词有相关性,k=1 时称作一个单元语言模型,k=2时称为二元语言模型。
可以发现通过马尔科夫链后改写的公式计算起来将会简单很多,下面我们举个简单的例子介绍下如何计算一个二元语言模型的概率。
其中二元语言模型如公式4所示:
P
(
w
i
∣
w
i
−
1
=
c
o
u
n
t
(
w
i
−
1
,
w
i
)
c
o
u
n
t
(
w
i
−
1
)
)
P(w_{i}|w_{i-1}=\frac{count(w_{i-1},w_{i})}{count(w_{i-1})})
P(wi∣wi−1=count(wi−1)count(wi−1,wi))
假设有一个文本集合:
“词性是动词”
“判断单词的词性”
“磁性很强的磁铁”
“北京的词性是名词”
对于上述文本,如果要计算 P(词性|的)P(词性|的) 的概率,通过公式4,需要统计 “的,词性” 同时按序出现的次数,再除以 “的” 出现的次数,如公式5所示:
P ( 词性 ∣ 的 ) = c o u n t ( 的 , 词性 ) c o u n t ( 的 ) = 2 3 P(词性|的)=\frac{count(的,词性)}{count(的)}=\frac{2}{3} P(词性∣的)=count(的)count(的,词性)=32
上述文本集合是我们自定制的,然而对于绝大多数具有现实意义的文本,会出现零概率问题,例如训练时未出现,测试时出现了的未登录单词。
由于零概率问题问题,则会出现概率值为 0 的情况(填空题将无法从词典中选择一个词填入),为了避免 0 值的出现,会使用一种平滑的策略——分子和分母都加入一个非 0 正数,例如可以把公式(4)改为公式6:拉普拉斯平滑
P
(
w
i
∣
w
i
−
1
=
c
o
u
n
t
(
w
i
−
1
,
w
i
)
+
1
c
o
u
n
t
(
w
i
−
1
)
+
∣
V
∣
)
P(w_{i}|w_{i-1}=\frac{count(w_{i-1},w_{i})+1}{count(w_{i-1})+|V|})
P(wi∣wi−1=count(wi−1)+∣V∣count(wi−1,wi)+1)
评价:
依赖训练语科、泛化能力差
以离散符号为统计单元,无法体现语义相关性
为了预测词向量
NNML通过词向量的距离衡量单词之间的相似度,因此,对于未登录单词,也可以通过相似词进行估计
采用神经网络的方法完成语言模型的两个任务
首先考虑解决第二个问题——根据已知单词,预测下一个单词
在这张图中,输入层shape为1*v,且不需要flatten,需要concat处理
首先根据V中每个input元素的索引i,找到词向量矩阵Q中对应的词向量,置为Ci,将结果拼接成1*(t-1)*v,再经过tanh激活函数,传到softmax层,最终输出为v个合为1的概率向量。
其中,input元素的索引可以使用ont-hot编码,编码为t-1维的向量,通过与Q的矩阵乘法就可以很简单地计算出词向量Ci
具体公式为:y=softmax(U(tanh( ∏ i = 1 t − 1 \prod_{i=1}^{t-1} ∏i=1t−1 w i w_i wiQ+b1))+b2)
原作者并没有提出词向量
当矩阵Q的训练效果越来越好时,C就可以取代w成为表示词的向量。
如果直接用字符去存储单词,耗费空间很大
独热编码思想:根据单词数量n给出一个n*n的矩阵
可以让计算机认识单词,具有很重要的意义
但如此存储计算出的词与词之间的余弦相似度和点积都为0,也就是无法体现出词与词之间的关联性
又叫分布式表示/稠密表示
由于独热编码无法表示相关性这一缺陷,很快就被词向量表示取代。在NNLM中的C(wi),就是单词对应的Word Embedding值,也就是词向量。词向量矩阵Q训练好之后,几乎没有空值,计算余弦相似度也几乎不会为0,所以可以保存词与词之间的关联性。
一旦得到了词向量,第一个问题也可以直接解决(下游任务)
为了得到词向量
word2vec模型与NNLM模型很类似,有两种训练方法,但最终目的都是得到Q矩阵,且前向传播并没有加入tanh作为激活函数,因为不需要预测的精度非常高,只要能够将词向量矩阵Q训练出来就可以
核心思想是从一个句子里面把一个词抠掉,用这个词的上文和下文去预测被抠掉的这个词(NNML是根据上文来预测下一个词,没有本质区别,但Word2Vec的主要目的是得到词向量),根据一个output和多个input去训练Q矩阵
背景词需要进行平均池化,将多个词向量池化为1个词向量。
得到的是预测中心词c的概率
∏ t = 1 T P ( w ( t ) ∣ w ( t − m ) , . . . , w ( t − 1 ) , w ( t + 1 ) , . . . , w ( t + m ) ) ) \prod_{t=1}^{T}P({w}^{(t)}|{w}^{(t-m)},...,{w}^{(t-1)},{w}^{(t+1)},...,{w}^{(t+m)})) ∏t=1TP(w(t)∣w(t−m),...,w(t−1),w(t+1),...,w(t+m)))
和 CBOW 相反,输入某个单词,要求预测它的上下文单词,根据多个output和一个input去训练Q矩阵。
选定窗口大小长度的字符串,用其中的一个字符去预测剩余的字符。
得到的是预测背景词 u o u_o uo的概率
∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( w ( t + j ) ∣ w ( t ) ) ) \prod_{t=1}^{T}\prod_{-m≤j≤m,j≠0}P({w}^{(t+j)}|{w}^{(t)})) ∏t=1T∏−m≤j≤m,j=0P(w(t+j)∣w(t)))
词向量无法表示多义词(ELMo模型(双向LSTM模型))解决多义词
比如可以根据独热编码(非预训练模型,只是一一对应的表查询)使用Word2Vec预训练好的Q矩阵直接得到词向量,然后选择策略(冻结或者是微调)进行下有任务