训练一个神经网络意味着要输入训练样本并且不断调整神经元的权重,从而不断提高对目标的准确预测。每当神经网络经过一个训练样本的训练,它的权重就会进行一次调整。
当前对于绝大多数的神经网络而言,更新参数使用的都是反向传播(back propagation)的方式。然而,对于庞大的神经网络而言,反向更新权重并不是一件容易的事情。同时,这意味着对于那些结果与标签值的不一致的节点,都需要做反向传播来更新权重。
这个时候我们就需要用到负采样(negative sampling)的技术。
下面通过Skip-Gram来讲解负采样技术。
Skip-Gram 的输出和输出都是 one-hot 编码的向量,假设我们的词典的 size 是 10000,即输入的向量是 10000 维的向量,然后嵌入成 400 维的向量,这样隐层就有 400 个节点,输出层也是一个 10000 维的向量。我们重点关注隐层 - 输出层这里的权重,这里总共有400*10000=4,000,000个权重。也就是说,如果我们不做任何改进的话,每一次的训练都需要更新4,000,000个权重。显然,这样大量的计算会极大地拖慢训练的速度。
为了提升训练的速度,减少更新权重的数量,我们就需要对节点进行负采样。首先来了解两个概念 postive word 和 negative word。positive word 指的是在输出向量中期待为 1 的那个节点,negative word 指的是在输出向量中期待为 0 的节点。在 Skip-Gram 中,输出向量一般只有一个位置为 1,其余的 9999 个位置都为 0。负采样的目的就是在 negative word 中,找出一部分节点进行权重的更新,而不需要全部都更新。比如我们找 5 个 negative word 节点,最后,我们更新的节点就是 1 个 positive word + 5 个 negative word 节点,总共是 6 个节点。在这种情况下,需要更新的权重数量是6*400=2400,相比起前面计算的4,000,000,是不是少了很多!
负采样的本质:每次让一个训练样本只更新部分权重,其他权重全部固定;减少计算量;(一定程度上还可以增加随机性)