词向量
词向量大法
从文本语料得到词向量的话,大概来讲有如下几个步骤:分词,统计词频,构建huffman树,输入文本训练词向量
第一步是分词。英文要好一些,单词之间有空格分隔,但是需要进行词干提取和词形还原预处理。中文的话,分词就要麻烦的多。我但是用的是jieba来进行分词的。
第二步骤,统计词频。首先统计出每个单词出现的次数,然后需要去掉停用词,非常高频的词和非常低频的词。去掉高频词是因为没有特殊性,去掉低频词是因为没有普适性。
第三步,构建huffman树。所有的非叶节点存储有一个参数向量,所有的叶节点分别代表了词典中的一个词。参数向量初始值为0。构建完huffman树之后,将对应的huffman码分配给每个单词。此外,还需要随机初始化每个单词的词向量。
第四步,训练,也就是提到的比较多的CBOW和skip-gram模型了。word2vec采用的语言模型是n-gram模型+词袋模型(我不知道这样表述严不严谨),也就是说假设一个单词只与周围若干个单词有关且不考虑单词间的顺序关系。
使用one-hot词向量并不是一个好选择。一个主要的原因是,one-hot词向量无法表达不同词之间的相似度。例如,任何一对词的one-hot向量的余弦相似度都为0。
2013年,Google团队发表了word2vec工具。word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW),以及两种高效训练的方法:负采样(negative sampling)和层序softmax(hierarchical softmax)。值得一提的是,word2vec词向量可以较好地表达不同词之间的相似和类比关系。
-
架构:skip-gram(慢、对罕见字有利)vs CBOW(快)
-
训练算法:分层softmax(对罕见字有利)vs 负采样(对常见词和低纬向量有利)
-
欠采样频繁词:可以提高结果的准确性和速度(适用范围1e-3到1e-5)
-
文本(window)大小:skip-gram通常在10附近,CBOW通常在5附近
word2vec
Hierarchical Softmax是一种对输出层进行优化的策略,输出层从原始模型的利用softmax计算概率值改为了利用Huffman树计算概率值。
以词表中的全部词作为叶子节点,词频作为节点的权,构建Huffman树,作为输出。Huffman树是二叉树,在叶子节点及叶子节点的权给定的情况下,该树的带权路径长度最短(一个节点的带权路径长度指根节点到该节点的路径长度乘以该节点的权,树的带权路径长度指全部叶子节点的带权路径长度之和)。直观上可以看出,叶子节点的权越大,则该叶子节点就应该离根节点越近。因此对于模型来说就是,词频越高的词,距离根节点就越近。
从根节点出发,到达指定叶子节点的路径是唯一的。Hierarchical Softmax正是利用这条路径来计算指定词的概率,而非用softmax来计算。
计算单个词语概率值的计算过程被拆解为一系列的概率计算,这样可以避免对所有词语进行标准化计算。
在实践中,对于不频繁的单词,分层的softmax效果更好,而负采样对于频繁单词和较低维度向量表现更好。
在负采样中,对于给定的词w,如何生成它的负采样集合NEG(w)呢?已知一个词w,它的上下文是context(w),那么词w就是一个正例,其他词就是一个负例。但是负例样本太多了,我们怎么去选取呢?在语料库C中,各个词出现的频率是不一样的,我们采样的时候要求高频词选中的概率较大,而低频词选中的概率较小。这就是一个带权采样的问题。设词典D中的每一个词w对应线段的一个长度:
任何采样算法都应该保证频次越高的样本越容易被采样出来。基本的思路是对于长度为1的线段,根据词语的词频将其公平地分配给每个词语:
这个幂实际上是一种“平滑”策略,能够让低频词多一些出场机会,高频词贡献一些出场机会,劫富济贫。
负采样:增大正样本概率的同时降低负样本概率。本质是预测总体类别的一个子集
层次softmax:词频越高的词,距离根节点就越近。本质是把 N 分类问题变成 log(N)次二分类
DL4NLP——词表示模型(三)word2vec(CBOW/Skip-gram)的加速:Hierarchical Softmax与Negative Sampling
fasttext
CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征,这些特征用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过;CBOW的输出是目标词汇,fastText的输出是文档对应的类标。
fastText在输入时,将单词的字符级别的n-gram向量作为额外的特征;在输出时,fastText采用了分层Softmax,大大降低了模型训练时间。
于是fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类。