词嵌入模型的发展历程

本文意在梳理如何用向量表示单词来让单词变得可计算的这一nlp问题的发展历程。

自然语言处理(Natural Language Processing),曾经也叫做“Computational linguistics”。从名字就能看出,核心就在于让language变得computational,在可以计算的前提下,一切计算机/数学方法才得以使用。这就是word representation的出发点,将language / paragraph / sentence/ word/ character 用数学形式来表示。目前通常采用的representation形式是向量形式。

1.普通序数
首先对于离散的单词我们可能会想到用一个整数序号来表示不同的单词。
如:有{苹果,橘子,梨}     我们可能会用苹果:1,橘子:2,梨:3来表示三个不同的水果。
但是:如果进行加法操作:3-1=2,3-2=1;难道我们可以认为梨和苹比梨和橘子更像吗?

2.one-hot编码
于是,我们引出one-hot编码,它最大的特点就是假设不同的word之间相互独立,这就解决了上述问题。
假设词料库有n个单词,那么就假设一个n维向量,n个每次占据自己独立的索引,那么表示第a的单词,就用这样一个n维向量表示,其中第a个位置为1,其余n-1个位置用0表示。为了提高鲁棒性,我们可以设置一个未定义的位置即使用n+1维向量,遇到没在语料库的word在第n+1个位置置一。
但是,如果n太大,那无疑是个计算灾难。于是词嵌入模型(Distributed Representation)应运而生。

3.词嵌入模型
Distributed Representation的意思是,描述language的向量是定长的(fix-length),在定长的向量中,一个语义信息可能由多个维度共同决定,一个维度也可能决定着多方面的语义信息。此时,word vector就比较稠密(dense),不再像one-hot encoding一样稀疏。这样就可以大大缩短表示word的vector维度。

获取词向量基本上有三种思路:
1.利用全局统计信息,进行矩阵分解(如LSA)来获取词向量,这样获得的词向量往往在词相似性任务上表现不好,表明这是一个次优的向量空间结构。
2.利用局部上下文窗口单独训练,但是统计信息作为有用的先验知识,没有很好的利用到。如word2vec。
3.Glove:结合两种训练方式,获取更好的词向量

3.1统计方法

3.1.1 向量空间模型(VSM)
首先介绍一下VSM,因为LSA就是对于VSM的改进。
VSM的基本思想是:给定一个文本,用一个向量表示文本的语义,向量的每一维对应一个单词,数字表示单词在文本出现的次数。于是一个nxm的单词-文本矩阵,n表示单词的类别总数,m表示m个文本,每一个列向量表示一个文本的语义,比较两个文本的相似度就用内积来表示。因为如果文本相同的单词很多,内积就越大,表示越相似。但是其不能处理一词多义及多词一义,比如airplane和aircraft是个近义词,但是内积依旧为0。
ps:用tf-idf来表示数值,来优化常用词比如the、a对模型的影响,因为这些常用词不代表具体意义。

3.1.2 LSA(全局特征)
单词-话题矩阵 nxk
与单词-文本矩阵近似,现在列向量表示一个话题的单词向量,每一个值代表该单词在话题的权值,权值越大表示该单词越能表示这个话题。
话题-文本矩阵 kxm
与单词-文本矩阵近似,列向量表示一个文本的话题向量。
这样一来,
单词-文本矩阵X(nxm)
单词-话题矩阵T (nxk)
话题-文本矩阵 Y(kxm)
X=TY
这样就将文本用单词来表示变成了文本用话题来表示,相当于变换了坐标系。
可以用SVD处理等式。

3.2局部上下文(context)方法
因为仅关注全局的cooccurence,word vector包含的词向量语义信息有限,仅仅能进行词语相似度计算等有限的任务。所以引入了针对于局部上下文的word2vec方法。
word2vec有两种形式
3.2.1 ebow
在这里插入图片描述
cbow是利用上下文来预测其中的某一单词,如图所示。
3.2.2 skip-grim
在这里插入图片描述
skip-gram是利用某一单词来预测其上下文。

具体ebow和skip-gram的细节就不细说了,提一下训练方法,为了提高训练速度,我们常用hierarchical softmax和negative sampling两种方法。其中hierarchical分层是因为引入了哈夫曼树,有兴趣的同学可以自己了解一下。

经过训练得到嵌入矩阵后,比如说要将单词压缩到k个维度,那么嵌入矩阵就是kxn大小,每个列向量代表一个单词的嵌入向量。

3.3Glove方法

3.3.1共现矩阵
还有一种共现矩阵的方法。
将共现矩阵行(列)作为词向量
例如:语料库如下:
• I like deep learning.
• I like NLP.
• I enjoy flying.
则共现矩阵表示如下:(使用对称的窗函数(左右window length都为1) )
在这里插入图片描述
例如:“I like”出现在第1,2句话中,一共出现2次,所以=2。。
对称的窗口指的是,“like I”也是2次。
将共现矩阵行(列)作为词向量表示后,可以知道like,enjoy都是在I附近且统计数目大约相等,他们意思相近。

而glove算法就是通过共现矩阵来训练出来每个单词对应的词向量。
https://zhuanlan.zhihu.com/p/42073620知乎的这个回答我觉得很到位,大家可以直接去看这个。

以上内容就是词向量表示的发展概况了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值