史上最全词向量讲解 https://zhuanlan.zhihu.com/p/75391062
传统缺点:不经过优化的CBOW和Skip-gram中 ,
- 在每个样本中每个词的训练过程都要遍历整个词汇表,也就是都需要经过softmax归一化,
- 计算误差向量和梯度以更新两个词向量矩阵(这两个词向量矩阵实际上就是最终的词向量,可认为初始化不一样),当语料库规模变大、词汇表增长时,softmax分母计算量大,训练变得不切实际。
1、深入剖析hierarchical softmax(利用CBOW)
hierarchical softmax使用一颗二叉树表示词汇表中的单词,每个单词都作为二叉树的叶子节点。对于一个大小为V的词汇表,其对应的二叉树包含V-1非叶子节点。
假如每个非叶子节点向左转标记为1,向右转标记为0,那么每个单词都具有唯一的从根节点到达该叶子节点的由{01}组成的代号
(实际上为哈夫曼编码,为哈夫曼树,是带权路径长度最短的树,哈夫曼树保证了词频高的单词的路径短,词频相对低的单词的路径长,这种编码方式很大程度减少了计算量)。
1)深入剖析hierarchical softmax(利用CBOW):
- 输入层:利用n个上下文词的one-hot编码与词向量矩阵相乘,找到每个单词的词向量
- 投影层:将n个上下文词的词向量相加求和得到X
- 输出层:对应一个哈夫曼树,以每个词在语料库中的频次构造出来的哈夫曼树,叶节点有V个,即词汇表的大小。非叶子节点有V-1个,图中黄色部分。
- 哈夫曼树详解:每一个叶节点有对应的唯一从根节点出发路径,可用0,1进行编码,左1右0。路径上的非叶子节点都对应一个向量,该向量是参数向量θ,最终更新的也是该向量。
- 如何确定条件概率:现有一个上下文向量X,经过未知节点之后找到正确的中心词,在找的过程中,每经过一个子节点,都要进行一次判断,看是往左走还是往右走,刚好哈夫曼树左为1右为0,即每走一步都可看作是一个二分类,总结一句话就是:上下文词找到中心词的过程就是上下文词经过多个二分类之后最终到达目标词,每一步都要进行判断。P(中心词|上下文词)是每次分类产生的概率乘积。
- 时间复杂度:从O(N)降到O(log(N))
2)拓:哈夫曼树
- 关于Huffman树和 Huffman编码,有两个约定: (1)将权值大的结点作为左孩子结点,权值小的作为右孩子结点;(2)左孩子结点编码为1,右孩子结点编码为0.
- 在 word2vec源码中将权值较大的左孩子结点编码为1(负类),较小的右孩子结点编码为0(正类).
每一次分支是二分类
- 将编码为1的结点定义为负类,而将编码为0的结点定义为正类.
- 将一个结点进行分类时,分到左边就是负类,分到右边就是正类.
2、负采样
【负采样思想】为每个训练实例都提供负例。负采样算法实际上就是一个带权采样过程,负例的选择机制是和单词词频联系起来的。
【负采样作用】1.加速了模型计算,2保证了模型训练的效果,一个是模型每次只需要更新采样的词的权重,不用更新所有的权重,那样会很慢,第二,中心词其实只跟它周围的词有关系,位置离着很远的词没有关系,也没必要同时训练更新。
深入剖析nagative sampling(利用CBOW):
- 层次softmax的缺点:遇到生僻词的时候,在哈夫曼树中也要走很久,计算量也很大。
- 负采样算法:为带权采样,在语料库中计算每个词的词频,即某个词的count/语料库中所有单词总count(源码中分子分母都用的是count四分之三次方,并非直接用count),即为被采样到的概率。在word2vec里的具体做法是,经过概率的计算,可将所有词映射到一条线上,这条线是非等距划分的N份(因为N个词的概率不同),再对同样的线进行等距划分成M份,其中M>>N,在采样时,每次随机生成一个[1,M-1]之间的数,在对应到该小块所对应的单词区域,选区该单词(当选到正例单词自己时,跳过),具体如图:
- 原理:在CBOW里,正确的词只有一个,剩下全是错误的,所以从所有错误的词里选出一部分作为负类,正确的作为正类,就可以构建一个二分类问题。其中如何采样这些负类已经在上述过程中描述了,接下来就是如何用一个正类和其他负类进行二分类。
- 二分类问题:要同时满足尽可能的让正类和负类分类正确,u为正类和负类样本,每个概率相乘得到联合概率,每一个概率的计算是一个逻辑回归二分类。即:
nagative sampling(利用CBOW)源码中:
并没有对上下文的每一个词都进行负采样,
而是对中心词进行了上下文词个数个负采样,
意思就是本身是用中心词预测多个上下文词,
现在变成用相同数目的中心词预测相同数目的上下文词,但中心词里只有一个是真的,要保证这个概率最大,其他都是假的,要保证假的概率也最大。
一、什么是词向量
词向量是将字、词语转换成向量矩阵的计算模型。目前为止最常用的词表示方法是 One-hot,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。还有 Google 团队的 Word2Vec,值得一提的是,Word2Vec 词向量可以较好地表达不同词之间的相似和类比关系。除此之外,还有一些词向量的表示方式,如 Doc2Vec、WordRank 和 FastText 等。
二、Word2Vec
Google 团队的 Word2Vec,其主要包含两个模型:跳字模型(Skip-Gram)和连续词袋模型(Continuous Bag of Words,简称 CBOW),以及两种高效训练的方法:负采样(Negative Sampling)和层序 Softmax(Hierarchical Softmax)。
word2vec作为神经概率语言模型的输入,其本身其实是神经概率模型的副产品,是为了通过神经网络学习某个语言模型而产生的中间结果。具体来说,“某个语言模型”指的是“CBOW”和“Skip-gram”。具体学习过程会用到两个降低复杂度的近似方法——Hierarchical Softmax或Negative Sampling。两个模型乘以两种方法,一共有四种实现。
2.1 模型结构(CBOW和Skip-Gram)
两个算法:
-
Skip-grams (SG):预测上下文
-
Continuous Bag of Words (CBOW):预测目标单词
CS224n中的只讲到了Naive Softmax
Skipgram(以CS224n讲解为例)
wt :以one-hot vector 形式输入的“中心词汇”
W : 所有中心词汇的表示所组成的矩阵(第一个matrix)
Vc : 中心词向量,即中心词汇的表示
W' : 存储上下文的词汇表示(图中3个矩阵是相同的,只有一个上下文词汇矩阵W')
W'.dot(Vc) :得到对每个词语的“相似度”
Softmax :给定一个中心词汇,作为生成模型,它可以预测在上下文中出现的词汇的概率,与答案对比计算损失
Note: Every word has two vectors! Makes it simpler!
从左到右是one-hot向量,乘以center word的W于是找到词向量,乘以另一个context word的矩阵W'得到对每个词语的“相似度”,对相似度取softmax得到概率,与答案对比计算损失。下图的官方版,一样的意思:
这两个矩阵都含有V个词向量,也就是说同一个词有两个词向量,哪个作为最终的、提供给其他应用使用的embeddings呢?有两种策略,要么加起来,要么拼接起来。在CS224n的编程练习中,采取的是拼接起来的策略。W中的向量叫input vector,W'中的向量叫output vector。
最小化负的对数似然项,使预测的概率最大化
2.2 训练方法(层次化softmax和负采样)
具体学习过程会用到两个降低复杂度的近似方法——Hierarchical Softmax或Negative Sampling。两个模型乘以两种方法,一共有四种实现。