Word Embedding的前世今生
鼠标放在标题,即可打开目录,帮助快速浏览
一、词向量定义
二、映射算法
2.1 One-hot Embedding
对Corpus'中的每个单词都用一个n维的one hot向量表示,其中n为语料库中不同单词的个数。这种方法的原理是把语料库中的不同单词排成一列,对于单词A,它在语料库中的位置为k,则它的向量表示为第k位为1,其余为0的n维向量。比如:
优点:简单
缺点:(1)存在语料库太长导致单词向量十分冗长的缺点;(1)在one hot representation编码的每个单词都是一个维度,彼此independent。丧失了word之间的关联性;
然而每个单词彼此无关这个特点明显不符合我们的现实情况。我们知道大量的单词都是有关:
- girl和woman虽然用在不同年龄上,但指的都是女性。
- word和words仅仅是复数和单数的差别。
我们更希望用诸如“语义”,“复数”,“时态”等维度去描述一个单词。每一个维度不再是0或1,而是连续的实数,表示不同的程度。
2.2 Distribution Embedding
Word embedding就是要从数据中自动学习到输入空间到Distributed representation空间的映射f。
问题来了,我们该如何自动寻找到类似上面的关系,将One hot representation转变成Distributed representation。 我们事先并不明确目标是什么,所以这是一个无监督学习任务。同时,单词的语义也需要放到上下文中去理解。
比较完善的word Embedding模型主要有Word2Vec(2013),Glove(2014),ELMO(2018,华盛顿),BERT(2018,谷歌)
(可以理解为一种对单词onehot向量的一种降维处理,通过一种映射关系将一个n维的onehot向量转化为一个m维的空间实数向量(可以理解为原来坐标轴上的点被压缩嵌入到一个更加紧凑的空间,这也是词向量又名词嵌入的缘由))
通过神经网络语言模型可以得到词向量,神经网络语言模型有:
- Neural Network Language Model, NNLM
- Log-Bilinear Language Model, LBL
- Recurrent Neural Network based Langage Model, RNNLM
- C&W
- Continuous Bag of Words, CBOW
- Skip-gram
Word Embedding训练方法大致可以分为两类:一类是无监督或者弱监督的预训练;一类是端到端(end to end)的有监督训练。无监督或者弱监督的训练以word2vec和auto-encoder为代表。这一类模型的特点是,不需要大量的人工标记样本就可以得到质量还不错的embedding向量。不过因为缺少了任务导向,可能和我们要解决的问题还有一定的距离。因此,,我们往往会在得到预训练的embedding向量后,用少量的人工标记的样本去fine-tune整个模型。
最后用别人训练好的词向量(注意相同的预料内容),自己训练的真的很拉!
2.3 共现矩阵
在这里,我们首先了解一下共现矩阵的是什么意思。我们认为某个单词的意思跟他临近的单词有紧密关系,我们设定一个窗口(size in [5,10]),如下图所示,窗口大小是2时,与“rests”共同出现的单词就有life,he,in,peace
虽然Cocurrence matrix一定程度上解决了单词间相对位置关系,但是它仍然存在维数灾难,当然你可能会说到可以用SVD、PCA进行降维呀,但是这也会带来一定的问题,如新词加入时,很难分配一个新向量等。
三、Word2Vec
将CBOW和Skip-gram模型实现的语言模型工具就是Word2Vec,C&W模型实现的工具就是SENNA
分布式词向量并不是Word2Vec的作者发明的,他只是提出了一种更快更好地方式来训练语言模型,Word2Vec作者发现在实操中,CBOW更快一些。
主要有两种方式:
- 用输入单词作为中心单词去预测周边单词的方式叫做Skip-gram
- 用输入单词作为周边单词去预测中心单词的方式叫做CBOW
表示单词的向量维度缩减很大,有益于后续RNN训练的收敛性。如果某两个单词的上下文很相似,则计算出来的表示这两个单词的特征向量会很相似,在空间中表示相近的物理位置,所以可以用两个单词生成的向量的长度表示其含义的远近。除了词向量的大小之外,词向量的方向还表示一种含义,若某两个词向量的方向相同,则其表示的含义也相近。如下图所示:
3.1 CBOW
统计语言模型statistical language model就是给你几个词,在这几个词出现的前提下计算某个词出现的概率(后验概率)。CBOW也是统计语言模型的一种,顾名思义就是根据某个词w, w的前C个连续词和后C个连续词来计算w出现的概率。Skip-gram Model相反,根据w,计算出现在它前后某几个词的各个概率。
以“我爱北京天安门”这句话为例。假如我们现在关注的词是“爱”w,C=2,时,w的上下文就是“我”,“北京天安门”。CBOW模型就是把“我”,“北京天安门”的one hot表达方式作为输入,也就是C个1*V的向量,分别跟同一个V*N size的系数矩阵W1相乘得到C个1*N的隐藏层hidden layer,然后C个取平均所以只算一个隐含层,这个过程被称为线性激活。然后再和N*V大小的系数矩阵W2相乘得到1*V的输出层,这个输出层每个元素代表的就是词库里每个词的事后概率。输出层需要跟ground truth也就是“爱”w的one hot比较计算loss。这里需要注意的就是V通常是一个很大的数比如几百万,计算起来相当费时间,除了“爱”这个位置肯定要算loss里面,word2vec就是基于huffman编码的Hierarchical softmax筛选掉了一部分不可能的词,然后又用negative sampling再去掉一些负样本的词,所以时间复杂度就从O(V)变成了O(logV)。Skip-gram训练过程类似,只不过输入输出刚好相反。
3.2 Skip-Gram
一种隐层为1的全连接神经网络,且隐层没有激活函数,输出层采用softmax分类器输出概率。输入为一个单词,输出为每个单词是输入单词的上下文的概率,真实值为输入单词的上下文中的某个单词。
主要通过skip-window控制,它代表着我们从当前input word的一侧(左边或右边)选取词的数量。假如我们有一个句子“The dog barked at the mailman”,我们选取“dog”作为input word,那么我们最终获得窗口中的词(包括input word在内)就是['The', 'dog','barked', 'at']。另一个参数叫num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的output word,当skip_window=2,num_skips=2时,我们将会得到两组 (input word, output word) 形式的训练数据,即 ('dog', 'barked'),('dog', 'the')。
四、Glove
Glove也是实现文本词向量化的模型,Glove的核心是共现矩阵。
公式推导参考:https://blog.csdn.net/linchuhai/article/details/97135612
公式推导参考:https://www.jianshu.com/p/f7276fa6baac
这篇使用说明写的很不错,很清晰:https://blog.csdn.net/ycq1041265011/article/details/110139729
五、ELMO
不同于得到固定的词向量表,而是训练好一个基于BiLSTM(双向)语言模型的深度词嵌入模型。当需要(文本S)中(某个词w)的词向量表示时,输入到网络中获得(词w)在文本S(语境下)的词向量表示,即一种动态的考虑输入词语境的词向量方法,不是得到一个词向量表了。
六、BERT
最重要的部分是提出了一种遮蔽语言模型Masked LM. 随机屏蔽15%的词,根据上下文词预测这个屏蔽词,损失函数loss为所有屏蔽的词,预训练成本大收敛慢但是效果好。
ELMO和BERT有些大佬整理的很棒:可以看看
ELMO:https://www.cnblogs.com/nickchen121/p/15105048.html、https://www.cnblogs.com/yifanrensheng/p/13167787.html