由来
在处理自然语言任务的时候,需要对文本进行表征,通常我们需要将其转为数字。在word embedding之前,我们经历了wordnet以及onehot,wordnet需要人力去维护,onehot由于每个词都互相正交,没办法计算相似度,同时也存在着维度爆炸的情况。故而出现了word embedding。
输入与输出
为了得到word embedding,我们通常会使用word2vec工具来进行训练得到。当输入是英文类的字符时,可能需要对文本做适当的预处理(单复数等,不是特别确定),当中文时,需要对字符做分词。通过工具我们将会得到一组词向量,用于其他下游任务。
训练方式
每一个词都会当作中心词和周围词,故而每个词其实是由两个向量组成的。
训练方式主要有CBOW和skip-Gram两种。CBOW的训练方式中,会将dense后的向量进行平均,然后再进行y的预测。Skip-Gram的训练中,相当于将上下午做了拆解,每个词去预测中心词,会比CBOW更多训练样本。通常当数据量少的时候,CBOW的效果会更好一些。
训练技巧
由于y的大小是V,每次更新时要有大量的计算,所以需要通过一些技巧来来降低这个量级。
层级softmax
主要为通过词频构建一个霍夫曼树,越靠近根的部分词频越高。
负采样
主要是通过修改中心词为其他随机词,减少分母部分的计算量,来降低训练复杂度。
损失函数
由于使用了不同的训练方式或训练技巧,导致损失函数也会有不同。具体参考:
https://lilianweng.github.io/lil-log/2017/10/15/learning-word-embedding.html
缺点
由于我们得到的参数是通过所有的语料进行适配的,训练结束后,词向量也固定了下来,所以在不同的上下文中,虽然一个单词可能含义不同,但其词向量表征是相同的,这一点导致了在某些场景下表现欠佳。但我们这里相较于之前的工作来看,解决了的问题包括,不再需要人工去维护(Wordnet),是一个无监督的训练过程;不再会应为词会增多而导致维度爆炸(one-hot),也不会因为表征正交而无法计算相似度(one-hot),wordnet的相似度是由人工编辑的,并不存在去计算。
学习过程中的一些图
一些好的链接
提到了交叉熵,由于损失函数,backpropogation无法套在word2vec的梯度更新参数所以查阅:
https://machinelearningmastery.com/cross-entropy-for-machine-learning/
解决了W是词向量参数,W’是上下文语义的问题:
http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
python实现的一个word2vec代码
https://www.kdnuggets.com/2018/04/implementing-deep-learning-methods-feature-engineering-text-data-cbow.html
包含了很多精彩的细节:
https://lilianweng.github.io/lil-log/2017/10/15/learning-word-embedding.html
如何得到词向量
https://www.zhihu.com/question/44832436