神奇的word2vec
先声明,今天的内容十分入门,已经入门的小伙伴们可以跳过这篇文章了~
现在“词向量”已经不是一个多么新的概念了。它由2014年被facebook实验室提出,现在是一个处理自然语言的常用工具之一。甚至现在在我实习的实验室里,学长和老师嘲笑这个方法在某些任务里面有多么多么挫。。但事实上在很多的与序列无关的任务里面还是很有用的!
最初知道word2vec以及“词向量”的时候是高考完的暑假,当时对于机器学习十分感兴趣,尤其对词向量充满了好奇。它可以做到对一个命名实体对应的词精准的特征捕获,就比如一个训练好的模型可以做到“男人”-“女人”=“国王”-“女王”(一个多么烂大街的例子,当然真正的数据挖掘可不是这么浅显的东西)。上大学之后和研究生学长讨论的时候才知道这种方法在哲学的层是面称为“本体映射”的一种东西,也曾经是那个学长的研究生研究方向。在我入坑机器学习以及nlp的那一年多时间里,我看了很多的文献以及视频,但我一直不很明白它之所以那么神奇的原理。终于在某一天我感觉自己弄懂了,一直想和大家用通俗的方式去让大家感性理解w2v,但最近一直非常忙,今天终于有时间了。希望对刚入坑nlp以及机器学习的小伙伴们有所帮助~
注意!今天的讲解不涉及任何理论的计算,对于详细的推导的数学理解,会在以后的博文中提到
对word2vec的感性理解
很多小伙伴不理解的第一个地方应该是,自然语言的本质是字符的序列,为什么可以映射成向量呢?
在这,我们想象世界上一个黑箱子。我们把一句话分成很多个词组成的列表,然后放进一个黑箱子里,这个黑箱子不认识这些单词(因为毕竟每个单词都是人类语言的符号),黑箱子里面是一个巨大的柜子,柜子上每个格子都有独立的编号(如:233行,233333列;99999行,999999999列等等),这个黑箱子要做的事情,就是把每一个词一个一个随机的放到这些格子里面去,这是第一步。
好了,现在,每一个词都随机的放进某一个柜子了,大家发现,现在每一个词语,这些人类的符号,就已经变成一个以行作为第一维,列作为第二维的向量了。这个黑箱子就要从输入的词序列里面,去找到词与词之间的关系,然后把某一个词拿出来放到另一个格子里面。这时候它注意到,许多的句子里面都有“是”这个词,这个“是”字两边的东西应该大概也许会有某种逻辑上的关联吧?于是,它把这些词从原本随机放置的格子里面取出来,放到“是”所在的格子的旁边。当我们输入给黑箱子的语料库足够庞大,“是”左边的词和“是”右边的词就会被丢在“是”这个格子的周围,而通常,左边的词会被丢在一堆,右边的词又会被丢在另一堆。(这个在数学上的解释就是,“是”两边的词(当然也是以所在格子对应的向量表示)要能够经过一个运算方法得到“是”这个词所在格子对应的向量,不改变是的格子,我们就只能改变左边右边两个词相对于是的位置,表述有点不正确,但这不是今天重点不展开)这时候,神奇的事情发生了:当黑箱子看多了这种下定义的句子,自然就得到了某种关联:“北京”是“中国的首都”;“柏林”是“德国的首都”;这样,经过向量运算,就得到了:中国的首都-北京+柏林=德国的首都。
用这种方式进行训练,当训练的预料足够大之后,他就可以呈现出大量实体之间的逻辑关系。就是这么简单。
但在实际的项目中,我们通常看重的不是这种关系,而是得到的词的向量。有了这个向量,我们就可以对语料库进行建模,并用向量的形式把数据送到神经网络去学习。近年来基于word2vec的CBOW模型,又诞生了fasttext文本分类模型,它的本质上也是一个word2vec,但把需要预测的词换成了一个标签,也就是把上面例子里面的“是”换成了一个target。
总结
word2vec并不是一个新的东西,现在很多的nlp任务也用不上它了,原因在于它没办法处理与长序列语义相关的东西,但在很多小的项目里面用途还是很广泛的。建议大家在弄明白了word2vec之后,会调用gensim的api使用之后,就去学习现在更加fasion的东西,如encoder-decoder,Attention,BERT等等。
在此声明,由于本人水平有限,在博文中如果出现任何错误或者不得当的地方,非常欢迎也感谢大家指正!谢谢大家~
本人工作邮箱:1012950361@qq.com