上一篇 斯坦福大学 NLP-cs224 课程笔记 2: 词向量 介绍了 Word2vec 模型的基本思想, 得到目标函数, 给定中心词求上下文概率, 最后还说到用 negative sampling 方法优化目标函数, 常见的 Word2vec 的两种形式: Skip-Gram,CBOW 模型
鉴于上篇主要从理论角度, 这一篇将从训练角度, 更多关于 Word2vec 之 Skip-Gram 模型的训练, Skip-Gram 会按照文本窗的方式将原文本组合为神经网络需要的训练样本, 如果原始文本为 The quick brown fox jumps over the laze dog , 如果设置 window 的 fixed-size 为 2, 那么可以得到如下所示的训练样本:
Word2vec 网络结构
我们拥有 1 万个单词的 vocabulary, 如果想嵌入 300 维的词向量, 那么我们的 输入 - 隐层 权重矩阵和 隐层 - 输出层 的权重矩阵都会有 10000 x 300 = 300 万 个权重参数
如上所示, 输入层为 one-hot 编码的词向量, 隐含层为要嵌入的 300 个神经元, 输出层为 softmax 分类器, 神经元个数为 1 万个, 在 Skip-Gram 模型中为输入的中心词的上下文的概率, 如输入词对 ( ants, abandon) 训练后, 开始调整权重参数, 使得尽可能在输出层对应 abandon 的概率高
O(n)
训练一个神经网络意味着要输入训练样本并且不断调整神经元的权重, 从而不断提高对目标的准确预测每当神经网络经过一个训练样本的训练, 它的权重就会进行一次调整
以上模型训练过程中, 我们需要大量的训练数据来调整 300 万个权重参数, 同时还要避免出现神经网络的通病: 过拟合
所有的权重参数都需要通过我们数以亿计的训练样本来进行调整, 这是非常消耗计算资源的, 并且实际中训练起来会非常慢为此 google 的 Word2vec 作者在后面的论文中提出了降低时间复杂度的 3 种方法
降低 O(n)
下面详细介绍这 3 种降低时间复杂度的方法
Word pairs 看成一个 word
一些单词组合的含义如果拆开后和原来具有完全不同的意义, 那么这种词组应该看成一个词比如 New York ,United Stated 等拆开后表达不出原来的意思
在 Google 发布的模型中, 它本身的训练样本中有来自 Google News 数据集中的 1000 亿的单词, 但是除了单个单词以外, 单词组合有 3 百万 之多
高频词抽样
英语中的高频单词比如 the, 根据 Skip-Gram 模型, the 会被选择为中心词和上下文词, 下面分别讨论这两种情况
当 the 选择为中心词时, 组成训练的词对中将会出现大量的 (the,...) 这样的训练样本, 而这些样本数量远远超过了学习 the 这个词向量所需的训练样本数
当 the 被选为上下文词时, 比如词对 ("fox", "the") 这样的训练样本, 并不会给我们提供关于 fox 更多的语义信息
因此, 类似于 the 这种高频单词, 如果我们选择它的概率降到很小或删除, 会带来什么好处呢? 训练样本很减少, 同时不会对词向量的生成质量造成影响
如果用 ωi 表示一个单词, Z(ωi) 是 ωi 这个单词在所有语料中出现的频次, 这个单词被保留下来参与训练的概率图为如下:
可以看出单词出现的频次越高, 被选中的概率越小
negative sampling
因为 negative sampling 是降低时间复杂度的另一个非常重要的技术, 因此单独拿出来说一下, 它是用来提高训练速度并且改善所得到词向量的质量的一种关键方法
不采用这种技术前, 原本每个训练样本需要更新所有的权重参数, negative sampling 每次让一个训练样本仅仅更新一小部分的权重参数, 从而降低梯度下降过程中的计算量
如果 vocabulary 大小为 1 万时, 当输入样本 ( "fox", "quick") 到神经网络时, fox 经过 one-hot 编码, 在输出层我们期望对应 quick 单词的那个神经元结点输出 1, 其余 9999 个都应该输出 0 在这里, 这 9999 个我们期望输出为 0 的神经元结点所对应的单词我们为 negative word. negative sampling 的想法也很直接, 将随机选择一小部分的 negative words, 比如选 10 个 negative words 来更新对应的权重参数
在论文中作者指出指出对于小规模数据集, 建议选择 5-20 个 negative words, 对于大规模数据集选择 2-5 个 negative words.
如果使用了 negative sampling 仅仅去更新 positive word- quick 和选择的其他 10 个 negative words 的结点对应的权重, 共计 11 个输出神经元, 相当于每次只更新 300 x 11 = 3300 个权重参数对于 3 百万 的权重来说, 相当于只计算了千分之一的权重, 这样计算效率就大幅度提高
选择 negative words
使用 一元模型分布 (unigram distribution) 来选择 negative words, 一个单词被选作 negative sample 的概率跟它出现的频次有关, 出现频次越高的单词越容易被选作 negative words, 经验公式为:
U(w) 代表每个单词被赋予的一个权重, 即它单词出现的频次, 分母 Z 代表所有单词的权重和
公式中开 3/4 的根号完全是基于经验的, 论文中提到这个公式的效果要比其它公式更加出色
来源: https://mp.weixin.qq.com/s?__biz=MzI3NTkyMjA4NA==&mid=2247485510&idx=1&sn=c0276b4514216959c93cd6581b96670c&chksm=eb7c258ddc0bac9be45dc512207bf803c5e73c75ae28e815687280c8d346c2f5557c737637e4#rd