自然语言处理NLP——从发展历程简述word2vector好在哪里?

word2vec作为谷歌推出的高效工具,旨在简化文本词向量预测。它通过去除NNLM模型中的隐层并采用CBOW及Skip-gram模型,利用低维稠密矩阵表示词向量,有效解决了传统Ngram模型存在的问题。此外,引入huffman树和negative sampling进一步减少了计算量。

word2vec是极简主义的谷歌公司开发出来的一套工具,主要问题是解决文本词的预测问题,即给定上下文,得到该位置最大可能的结果。

在此之前有很多功能类似的方法,比如统计模型中的Ngram模型。

但是这个模型存在很多问题。

首先 一阶模型忽略了词与词之间的顺序关系,本质上与向量空间模型,没什么区别。

而三阶以上的模型,首先计算量太大,其次,段落与段落之间,句子与句子之间一些词语也会共现,对于整体的效果不是很好。

对于最常用的二阶模型而言,对于一些从未出现过的片段,哪怕中间的一些词语在文中出现过了,因为不是一摸一样的,没有进行统计,所以没有办法给出很好的结果,这种情况是因为不能根据词与词之间的相似性来推断句子。


对于这种情况,科学家们想出来一个办法,这个办法是根据一个著名的假设——共现假设,即一个词可以用它周围的词来表示它。

基于这样一种假设,出现了共现矩阵来解决问题。 

对于三句话:

i like u

u like dog

i like cat

他们的共现矩阵就是:

e.g. 第一行意为,在i 已经出现的条件下,这些词出现的次数。

共现矩阵也存在着很大的缺点,首先矩阵很稀疏,可以看到图中很多地方为0,而对于不相似的句子,矩阵则更为稀疏。

如果想要降维,一般就会用到SVD矩阵分解。

(之前的一篇文章有提过SVD的内容: http://blog.youkuaiyun.com/weixin_35227692/article/details/78778323)

SVD的缺点就是运算量太大了,这对于数以(没法以数计)的文本内容来说,太过滑稽。

到这里,有一个思路就是,词可以通过数学中的矩阵来表示,而svd就是把这个维度降低,也就是说我们可以通过低纬度的矩阵来表示整篇文章,每个词用一个one-hot的向量来表示,基于以下几点假设,构建Neural Network Language Model模型。

1, 假定每一个词我们都可以用一个向量来表示

2, 我们有个模型,可以把一个词向量的输入,通过加权计算得出这段序列新的词向量输出

3, 将词的权重与概率模型中的参数结合,一起学习


如上,就是一个完整的输入到输出的NNLM过程,我们希望得到的矩阵是C,通过不断优化(优化方式可以有很多选择,比如梯度下降等)。

这个模型中间的tanh就是隐层,通过结合下边的输入矩阵来不断计算,不断优化参数。

这个模型主要成就就是将词向量的表达和概率模型相结合。

详细过程可以参考 http://blog.youkuaiyun.com/a635661820/article/details/44130285

这个模型的缺点就是计算量太大太复杂。


最后谷歌把优化的这件事情做了。

这个模型的统称就是word2vector。

这其中包含了很重要的处世哲学,简单才是最合适的。

word2vector 包含了两种类型,Continuous Bag-of-Words Model 和 skip-gram model                                                                                   

CBOW模型:

cbow的意思是,连续的词袋模型,就是将文本看成是一个一个单独的词,然后通过一个位置附近的词来推出这个位置可能的值。



在NNLM的基础上将tanh的隐层去掉,而输入的矩阵也不是one-hot稀疏向量,而是直接输入经过处理的低纬绸密矩阵进行输入,在这过程中,再做一层求和运算,直接将得到的结果与最后的softmax矩阵相乘。

至于为什么要用加法,谷歌发现加法好用,简单高效,所以就用了。


Skip-gram模型:

可以理解为CBOW的倒叙。

通过得到一个词,从而预测它周围词的概率。


后来,谷歌的工程师觉得,在模型拟合的过程中求和矩阵和softmax矩阵相乘,计算量太大了(因为softmax的大小等于文本的大小),所以又提出了两种解决办法, huffman和negative sampling


1) huffman

有一点数据结构基础的人都知道,哈夫曼是一种压缩的树状模型,通过统计词出现的概率,来决定这个词所处的树的深度。

而他们的想法就是,把整个语料先用haffman给结构化,之后只需要从根结点,对每一个二叉树枝进行二分法的判断就好了,在这个过程中,在每一个分支上的权重,其实可以枝内共用的。

2)negative sampling

负利采样,首先了解什么叫负例。

除了我们找到的那个答案之外,所有不是答案的备选都叫负例。

在训练过程中,我们在拟合出来每一次的答案之后,和标签比较,调整权重值,而在这个过程中,我们既要使正确答案的特征方程最大化,又要使其他负例的特征方程最小化。

关键问题就是负例要如何采样?

谷歌给出的解决办法是,将词频的大小投影到一个【0,1】线段上,取随机数,点到哪个取哪个。

在取样的过程中,我们把每个词频的值取四分之三次方的时候效果最好。

这样做是因为对频率较大的数进行取3/4次幂,原数字损失的多,反之较小的,去掉的就少,这样做是一种平滑方式。


总结

word2vector是谷歌提出来的一个概念,出发点是简化NNLM的运算量。

这个概念模型中,有两个模型,CBOW和 Skip-gram,都是将NNLM中间的隐层去掉,再利用上述的两种方式(工业上听说负例采样的方式用的比较多)来进行模型优化,以达到这个模型可以在个人笔记本上跑较大数据的效果。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值