这篇笔记主要是为了提高训练的效果和效率,参考的仍是同一作者的英文博文,资源仍来自于Udacity Deeplearning的纳米课程。以下两种方法是在不同的阶段对训练进行了某种程度的优化。
Subsampling Frequent Words(基于词汇频率的降采样)
下图已经在之前的笔记中出现过了,这里我们不难发现类似于"the"这种高频词汇的两方面问题:
- 对于("fox", "the")这样的单词对,"the"并没有为"fox"提供很多语义上的信息,但出现频率会很高。
- 对于("the", …)这样的单词对也会出现很多次,但从语义上没有很大意义,所以我们需要更合适的方式去获得其语义向量。
因此我们要对训练数据根据其出现的概率进行降采样,采样的公式和对应的曲线如下图所示。不难发现如果单词出现的频率很低,那么该词汇保留下来的概率会很高,反之随着单词出现频率的升高,该词汇保留下来的概率就会变得很低。例如:当文本中词频小于0.0026时,则保留的概率为1;当文本中词频等于0.00746时,则保留的概率为0.5。
所以采用这种方式,可以有效解决高频词汇对语义学习的影响。
Negative Sampling(负采样)
训练网络时往往会对全部的神经元参数进行微调,从而让训练结果更加准确。但在这个网络中,训练参数很多,每次微调上百万的数据是很浪费计算资源的。那么Negative Sampling方法可以通过每次调整很小的一部分权重参数,从而代替全部参数微调的庞大计算量。
比如训练("fox", "quick")单词对时,正确的输出向量应该是"quick"对应的位置为1,其他位置均为0。而用negative sampling方法,我们仅随机更新5个负单词(对应位置输出为0)的网络层权重,同时更新正单词(对应位置输出为1)的网络权重。对于负单词的更新数量,可以根据实际数据集的大小进行调整,数据集越大,负单词的选取数量就应该尽量减少。
那么此时计算量减少了多少呢?我们可以做一个计算:如果模型的权重矩阵为300X10000,我们选取负单词的数量为5。对于该网络层,我们只要更新1800个权重值,是3M总数据量的0.06%,计算资源可以大大节约。
可以说这两个方法分别解决了该模型的两个棘手问题。根据词频的降采样可以有效控制一些高频词汇的过度训练,从而减少了一些不必要的训练。负采样可以有效节约计算资源,同时又减少了对模型准确性的影响。