从n-gram到Bert聊一聊词向量:Word2Vec

Word2Vec模型中有CBOW和Skip-Gram两种模式:

CBOW(多到一)是给定上下文来预测输入单词,训练方法为负采样

Skip-Gram(一到多)是给定输入单词来预测上下文,训练方法为哈夫曼树

训练步骤:

1.将输入的文本生成词汇表,统计词频选择前k个构成词汇表 vocab.txt。每个词对应生成one-hot向量,向量的维度是V

2.将输入的文本的每个词生成一个one-hot向量,如果不在词汇表中则向量全为0,保留每个词的原始位置

3.确定词向量的维度N

4.Skip-gram或CBOW的,模型训练

1)确定窗口大小window,对每个词生成2*window个训练样本,(i, i-window),(i, i-window+1),...,(i, i+window-1),(i, i+window)

例如:12345, win = 2, 词 3 .  (3, 1) (3, 2) (3, 4) (3, 5) 4个样本。

2)确定batch_size,注意batch_size的大小必须是2*window的整数倍,这确保每个batch包含了一个词汇对应的所有样本

3)训练算法有两种:层次Softmax和Negative Sampling

4)神经网络迭代训练一定次数,得到输入层到隐藏层的参数矩阵,矩阵中每一行的转置即是对应词的词向量

CBOW模型流程,假设 Courpus = { I drik coffee everyday } ,根据 “I”“drink”“everyday”来预测“coffee”

    

 

Skip-gram模型流程,假设corpus里有10000个词语, 目标词向量为 300维:

参数矩阵:

对输入层到隐藏层的参数包含W和b,W是一个矩阵,shape=(N,V)。

其中V是词表的大小即one-hot向量维度,N是需要生成的词向量的维数。N也是隐藏层(第一层)中的隐藏节点个数。

每次一个batch_size的输入:(batch_size, V),记为X,隐藏层输出为Y,公式为。所有的输入共享一个W,每次迭代的时候都在修改W,由于one-hot的性质,每次修改W只修改1对应的那一行。而这一行也就是词向量(转置后)

训练时的参数设置

负采样:一般设置成le-5

语言模型的选择:skip-gram 和cbow,切词效果偏重各不相同。cbow对词频低的词更有利cbow 比skip-gram 更快,只需要一次运算。而skip-gram直接受窗口影响,窗口越大,需要预测的周围词越多。

窗口大小:影响 skip-gram 的预测次数。统计语料中句子长度的分布,再来设置window大小。一般设置成8

最小词频训练阀值min-count:根据训练语料大小设置,影响训练词的数量

向量维度:维度决定了训练过程中计算的维度。训练得到的词向量还要做语义层面的叠加,比如句子的向量表示用词的向量叠加,维度要偏大。一般 情况下200维够用。

其他参数:学习率根据需要调

两种训练方法:Hierarchical Softmax和Negative Sampling

不管是层次softmax也好,还是负采样也好,都是对最后的softmax做一个处理

Hierarchical Softmax

本质是把 N 分类问题变成 log(N)次二分类。树的核心概念是出现概率越高的符号使用较短的编码(离根节点越近,层次越浅),出现概率低的符号则使用较长的编码(离根节点越远,层次越深)。词语太多,直接用softmax太慢了。

沿着霍夫曼树从根节点一直走到我们的叶子节点的目标词,其中,根节点就是简单求和平均后的词向量。规定:权值较大的孩子结点编码为1(左孩子,负类),权值较小的孩子结点编码为0(右孩子,正类)。

  

这是一种二叉树结构,应用到word2vec中,被称为hierarchical softmax。

每一个节点就是一个二分类器,是逻辑回归(sigmoid)。其中θ是对应的非叶子节点的向量,一个节点被分为正类和负类的概率分别如下:

写成指数形式:

上下文推中间单词的概率,即目标函数

对于词典中的任意词w,Huffman树必存在一条wei从根节点到词w对应结点的唯一路径p^w。路径p^w上存在l^w-1个分支,将每个分支看做一次二分类,每一次分类就产生一次概率,相乘起来就是需要的p(w|Context(w)).

Negative Sampling:

本质是预测总体类别的一个子集。使用随机负采样,softmax分出来的类是整个词袋的大小,减小词袋大小,出现概率低的词可以不考虑。采样时可以要求高频词选中的概率较大低频词选中的概率较小,转化为一个带权采样问题,提高了模型的性能。

CBOW模型中,词w是正样本,其他词为负样本,增大正样本概率同时降低负样本概率

方法:如果词汇表的大小为V,那么我们就将一段单位长度为1的线段分成V份,每份对应词汇表中的一个词。当然每个词对应的线段长度是不一样的,高频词对应的线段长,低频词对应的线段短。每个词w的线段长度由下式决定:

len(w)=\frac{count(w)}{\sum_{u \in vocab} count(u)}

在word2vec中,分子和分母都取了3/4次幂如下:

len(w)=\frac{count(w)^{3/4}}{\sum_{u \in vocab} count(u)^{3/4}}

在采样前,我们将这段长度为1的线段划分成M等份,这里M>>V,这样可以保证每个词对应的线段都会划分成对应的小块。而M份中的每一份都会落在某一个词对应的线段上。在采样的时候,我们只需要从M个位置中采样出neg个负例位置,此时采样到的每一个位置映射到的线段 l 所属的词就是我们的负例词。

 

如何评估word2vec训练的好坏

参考论文:https://www.aclweb.org/anthology/D15-1036

1)词聚类

可以采用 kmeans 聚类,看聚类簇的分布,计算聚类的纯度。

2)词cos 相关性

查找cos相近的词

3)Analogy对比

a:b 与 c:d的样本关系有类似距离 (man-king woman-queen )

优势:

训练速度快 ,易用

劣势:

word2vec没有考虑语序,会有训练效果损失。

资源

word2vec :https://github.com/zhyq/word2vec-google

spark mllib word2vec训练,转换成google word vector形式:https://github.com/zhyq/word2vec-spark

 

参考:

https://plmsmile.github.io/2017/11/02/word2vec-math/#negative-sampling

https://www.cnblogs.com/pinard/p/7249903.html

https://www.cnblogs.com/peghoty/p/3857839.html

发布了93 篇原创文章 · 获赞 119 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_18310041/article/details/95809391