Word2vec
参考:
①Word2vec知其然知其所以然或者花书实战篇
②知乎-word2vec
③B站视频-word2vec
④Efficient Estimation of Word Representations in Vector Space
⑤Distributed Representations of Words and Phrases and their Compositionality
⑥word2vec Parameter Learning Explained
word2vec概念
Word2vec是一个将语料库中输入文本信息转换为向量格式的包,又名词嵌入。Word2vec由谷歌在2013年推出,其可以将每个词(Word)转换为向量(Vector)。
Note:
- 语料库就相当于是一本书,书里有很多句子、词语、单词,但是一个指定的语料库不可能包含所有的句子、词语、单词。
- 比如“今天星期四”就是某语料库中的一个句子,“今天”、“星期四”就是词。
词向量发展历程
Note:
- One-hot独热向量:对于每个词都用[0, 0, …1, 0, 0]表示,每个词向量只有1个非零值1,其余均为0,这样的表示方法虽简单,但是当语料库很大的时候,one-hot会导致维度灾难。更难定的一点是,one-hot格式的词向量无法衡量词与词之间的关系,比如相似的两个词。
- SVD奇异值分解:SVD类似于特征分解。其中心思想是利用SVD来减小词向量维度。
SVD是个效率并不高的算法,在实际实现过程中,尤其是待分解矩阵比较大的时候,出结果的速度是很慢的,因此并不实用。 - 技术水平总是往上走的,词向量发展至今的结果就是Word2vec。Word2vec最大的好处在于它可以衡量两个向量之间的距离,比如相似的两个单词所对应的向量距离也很小。
语言模型
语言模型是计算一个句子是句子的概率的模型。
Note:
- 比如说,今天是星期四----概率=90%;今天星期八----概率=0.1%;今天四星期----概率=0.001%。高的概率值往往需要满足语法正确以及语义符合。
如何描述呢?—通过条件概率将句子分解到词的层面。
比如一个句子
s
s
s由
n
n
n个词
w
1
,
w
2
,
⋯
,
w
n
w_1,w_2,\cdots, w_n
w1,w2,⋯,wn组成
s
=
{
w
1
,
w
2
,
⋯
,
w
n
}
s=\{w_1,w_2, \cdots,w_n\}
s={w1,w2,⋯,wn},则语言模型可以描述为:
P
(
s
)
=
P
(
w
1
,
w
2
,
⋯
,
w
n
)
=
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
)
.
(1)
P(s)= P(w_1,w_2, \cdots, w_n) = P(w_1)\cdot P(w_2|w_1)\cdot P(w_3|w_1w_2)\cdots P(w_n|w_1w_2\cdots w_{n-1}).\tag{1}
P(s)=P(w1,w2,⋯,wn)=P(w1)⋅P(w2∣w1)⋅P(w3∣w1w2)⋯P(wn∣w1w2⋯wn−1).(1)
Note:
- 其中, p ( w i ) = c o u n t ( w i ) N = 词 w i 在 语 料 中 出 现 的 次 数 总 词 数 p(w_i) = \frac{count(w_i)}{N}=\frac{词w_i在语料中出现的次数}{总词数} p(wi)=Ncount(wi)=总词数词wi在语料中出现的次数,连续的2个词的概率: p ( w i − 1 , w i ) = c o u n t ( w i − 1 , w i ) N p(w_{i-1},w_i)=\frac{count(w_{i-1},w_i)}{N} p(wi−1,wi)=Ncount(wi−1,wi),故 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).
- 在式(1)中,每个概率 P P P都可以看成是一个分类任务。比如对于 P ( w 2 ∣ w 1 ) P(w_2|w_1) P(w2∣w1)来说, w 2 w_2 w2相当于label标签, w 1 w_1 w1相当于input输入。
But 这样是有问题的!
因为语料再大也不可能包罗万象,因此某个词可能不在语料中,但却是可观存在的,那么计算过程中,就会有
p
=
0
p=0
p=0,这样的话就会导致式(1)为0,这样显然是不对的。
那要如何解决呢?
添加平滑操作,就是给那些没有出现过的词或者词组一个比较小的概率。
拉普拉斯平滑(加1平滑):每个词在原来的次数基础上加1次。
But 这样还是有问题的!
因为假设语料库的词一共有
V
=
1
k
V=1k
V=1k个,那么上述语言模型中每个条件概率
p
p
p都是需要训练的参数,即一句话的参数可能到达
V
+
V
2
+
V
3
+
V
n
V+V^2+V^3+V^n
V+V2+V3+Vn个。
那要如何解决呢?
使用K阶层马尔科夫假设(RL是是使用一阶马尔科夫假设,即2-gram)。
K
K
K越大,则模型精度越高,但是参数空间也就越大。
K具体有以下几种取法:
举个例子:
语言模型评价指标:困惑度
:
给定一个真实的句子
s
s
s:
P
e
r
p
l
e
x
i
t
y
(
P
P
(
s
)
)
=
P
(
w
1
,
w
2
,
⋯
,
w
n
)
−
1
n
=
1
P
(
w
1
,
w
2
,
⋯
,
w
n
)
N
.
Perplexity(PP(s))=P(w_1,w_2,\cdots,w_n)^{-\frac{1}{n}}=\sqrt[N]{\frac{1}{P(w_1,w_2,\cdots,w_n)}}.
Perplexity(PP(s))=P(w1,w2,⋯,wn)−n1=NP(w1,w2,⋯,wn)1.
Word2vec模型
如今比较著名的Word2vec模型就是CBOW和Skip-Gram模型,为了篇幅,我将此这篇Word2vec的论文笔记放在下面:CBOW&Skip-Gram。Word2vec的2个模型由于计算复杂度较高,在后续的发展中,出现了层次Softmax以及负采样的方式进行优化,为了篇幅,我将此文章的论文笔记放在下面:Word2Vec进阶。
Seq2Seq
Seq2Seq,又称Encoder-Decoder结构,一般是一种基于RNN结构的将不定长的输入系列转换为不定长的输出序列的模型。
具体请看我的另一篇NLP之Seq2Seq。
Transformer
Transformer模型是目前GPT、BERT这种大规模预训练模型的基础,他抛弃了传统CNN和RNN结构的神经网络,采用将注意力模块堆积的方式形成的一种模型。
具体请看我的另一篇Transformer。