语言模型
语言模型
给定一句由 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)
语言(人说的话) + 模型(完成某个任务)
任务1:
? P(“判断这个词的磁性”),P(“判断这个词的词性”)
任务2:
? “判断这个词的__”
统计语言模型
用统计的方法去解决上述问题
解决任务1:
条件概率的链式法则:
类似于全概率公式:
通过这个链式法则,可以根据每个词出现的概率以及条件概率,得出这句话的概率。
显然任务1中"磁性"的概率更小。
解决任务2:
根据给定词序列,判断下一个词,可以直接计算如下概率,如公式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非常大时计算非常困难
n元统计语言模型 n-gram
假设字典 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
为了预测词向量
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
wi?Q+b1))+b2)
原作者并没有提出词向量
当矩阵Q的训练效果越来越好时,C就可以取代w成为表示词的向量。
词向量
独热编码One-Hot
如果直接用字符去存储单词,耗费空间很大
独热编码思想:根据单词数量n给出一个n*n的矩阵
可以让计算机认识单词,具有很重要的意义
但如此存储计算出的词与词之间的余弦相似度和点积都为0,也就是无法体现出词与词之间的关联性
Word Embedding(Distributed Representation)
又叫分布式表示/稠密表示
由于独热编码无法表示相关性这一缺陷,很快就被词向量表示取代。在NNLM中的C(wi),就是单词对应的Word Embedding值,也就是词向量。词向量矩阵Q训练好之后,几乎没有空值,计算余弦相似度也几乎不会为0,所以可以保存词与词之间的关联性。
一旦得到了词向量,第一个问题也可以直接解决(下游任务)
Word2Vec 模型
为了得到词向量
word2vec模型与NNLM模型很类似,有两种训练方法,但最终目的都是得到Q矩阵,且前向传播并没有加入tanh作为激活函数,因为不需要预测的精度非常高,只要能够将词向量矩阵Q训练出来就可以
CBOW
核心思想是从一个句子里面把一个词抠掉,用这个词的上文和下文去预测被抠掉的这个词(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=1T?P(w(t)∣w(t?m),...,w(t?1),w(t+1),...,w(t+m)))
Skip-gram
和 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=0?P(w(t+j)∣w(t)))
负采样
缺陷
词向量无法表示多义词(ELMo模型(双向LSTM模型))解决多义词
预训练语言模型的下游任务改造
比如可以根据独热编码(非预训练模型,只是一一对应的表查询)使用Word2Vec预训练好的Q矩阵直接得到词向量,然后选择策略(冻结或者是微调)进行下有任务
|