目录
一、词向量
如下图,左边是one-hot编码,右边是词向量。
one-hot是稀疏向量,对于每一个词,在向量中给定一个位置置为1,其他位置全是0
词向量是分布式表示法,可以是自定义维度的向量,并且每一个维度都会有值
one-hot的缺点:
①过于稀疏
②无法表达语义及词之间的相似度
③容量小,如果是8维的,onehot只能表示8个词
④只有局部泛化能力
词向量的优点:
①密集,50维,100维均可,通常不超过300维
②容量大:理论上能表达无数个单词,比如8维向量,仅仅把数字置为0和1,也有2^8这么多。
③全局泛化能力强
二、 word2vec的训练
1.核心
Intuition:“在一个文章里,离得越近的单词,相似度越大”
这个原则,也可以应用在其他领域,比如对于租客要租房子,那么顾客查看的每一个房子,都可以当做一个单词,如果顾客看了10个房子,那么就相当于他说了十个词,这样就可以把房子,通过词向量的方式进行表达,可以有效减少维度,并且减少从语义上面,构造特征的麻烦。(如果不用词向量,可能需要很多维度:房屋面积、类型、地点、卧室容量……并且非数字的还需要转换成one-hot编码,非常稀疏并且麻烦。)
2.Skip-gram model
既然一个文章中,离得近的单词,相似度高,那么我们可以
①通过旁边的2个单词,预测中间的单词,叫做cbow(不常用)
②通过中间的单词,预测两边的单词,叫做skip-gram
比如一句话:We are working on NLP project,我们希望通过on,能预测出左边的are working, 以及右边的NLP project的概率,并且全部计算在一起,把下面的条件概率最大化。
p(are|on) p(working|are) p(NLP|on) p(project|NLP)
3.目标函数
比如我们有三句话:今天 天气 很好 今天 上 NLP 课程 NLP 是 目前 最火 的 方向
取window size=1,则目标函数:
argmaxθ { p(天气|今天)p(今天|天气)p(很好|天气)p(很好|今天)p(上|今天)p(今天|上)p(NLP|上)p(上|NLP)p(课程|NLP).....p(目前|最火)p(的|最火)p(最火|的)p(方向|的)p(的|方向) }
简化的写法如下图所示:
①第一个连乘是对于w,是中心词,第二个连乘是对于c,是上下文,也就是中心词左右两侧,各window size那么多的词。
②对该简化的写法取对数,则连乘变为求和
③对该求和取softmax,其中c'是词库中所有的词,w是中心词
④对取softmax之后的值进行最后的简化就得到我们最终的目标函数
定义的θ,就是我们的词向量,既是u也是v,[u,v]中u是每个单词的词向量,未知,是需要学出来的,大小是|v| * k,其中|v|是词库的长度,k是词向量的维度。
v和u是维度一样的。u是上下文,v是中心词
之所以会把词向量做成u和v这两个来用,是因为在计算中每个单词起到两部分作用,一个是作为中心词,一个是作为上下文。
4.目标函数的优化
根据上面我们计算的目标函数,可以看出来其中有一项是对数中求和,这个的时间复杂度,在词库量非常大的时候,会非常高:
策略:通过negetive sampling 进行采样,然后训练,能很大程度地降低时间复杂度。
5.skip gram另一种目标函数
给定任意组合wi, wj,希望下面的概率越大越好:
这个概率,就是这两个词同时出现在上下文中的概率。如果它们不存在于上下文中,那么,这个概率越小越好。
由此一来,我们的问题变成了二分类:给定两个词,它们属于/不属于上下文。可以通过逻辑回归的方式来转换目标函数:
其中的ui, vj分别是wi和wj的词向量。通过计算它们的内积,得到相似度,然后把sigmoid转换后的结果作为概率。
将所有样本合起来以后,总结起来的目标函数如下:
假如文本是:Today's weather is great
则词库是:[Today's, weather, is, great]
第一个连乘是从正样本中采集的样本的概率乘积,正样本如下:
[(Today's, weather),(weather,Today's), (weather,is), (is, weather), (is, great), (great, is)]
第二个连乘是从负样本中采集的样本的概率乘积,负样本如下:
[(Today's, is),(Today's, great), (weather,great), (is, Today's), (great, weather), (great, Today's)]
6.Negative Sampling
根据上面的目标函数,对于正样本,我们要最大化D=1的概率,对于负样本,最大化D=0的概率。同样的,我们把目标函数进行简化一下,通过sigmoid转换并化简结束后,发现最后有一项求和,时间复杂度大(因为负样本过多)。因此negative sampling进行计算
Negative Sampling是对于每一个正样本,我们在负样本中进行采样,比如采样10个或者5个。
这样的话,对于每一个正样本,我们都有5个或10个负样本,来构成目标函数,这样的计算量能大大减少。
例子如下:
7.更新参数
我们可以使用随机梯度下降来更新参数,和其他的模型训练一样,对参数求出梯度,并设定学习率进行更新即可。
三、词向量评估
1.评估方式
①通过TSNE降维到二维,并可视化
②选择训练好的词,计算两两之间的相似度
③通过类比的方式: