CNN-Softmax方法 - X - - bad - good 30%Importance Sampling 重要性采样方法 (19x) X - - - 100% Adaptive Importance Sampling 具有适应性的重要性采样方法 (100x) X - - - 100%Target Sampling 目标采样方法 2x X - good bad 100% Noise Contrastive Estimation 噪音对比估计方法 8x (45x) X - very bad very bad 100%Negative Sampling 负采样方法 (50-100x) X - - - 100% Self-Normalisation 自标准化方法 (15x) X - - - 100% 6x (10x) X - very good good 100% 表格 1:比较语言建模中近似 softmax 的几种方法 我们在表格 1 中比较了我们之前介绍的几种方法的表现。加速倍数和表现均来自于 Chen 等人(2015 年)的实验,同时我们在括号中记录了原作者们提出的加速倍数。第三和第四列分别显示了在训练阶段和测试阶段是否达到这个加速倍数。请注意,加速倍数的不同也许是因为没有优化,或者原作者没有用到 GPU,显卡运算常规的 softmax 比一些其它方法更加高效。部分方式没有可用的比较的方法,其表现则大部分参考相似的方法,比如自标准化方法应该和低频标准化相当,重要性采样方法和具有适应性的重要性采样方法与目标采样法相当。Jozefowicz 等人(2016 年)提出的 CNN-Softmax 方法的表现则根据纠正(correction)的大小时好时坏。在所有的方法里,除了 CNN-Softmax 方法中用了明显更少的参数,其它方法仍然需要存储输出词嵌入。微分 Softmax 方法因为能够存储一个稀疏权重矩阵从而减少了参数。 就像一直以来,没有哪个方法对于所有的数据集或者任务来说都是最好的。对于语言建模,常规的 softmax 在小词汇库数据集上仍然有一个非常好的表现,比如说 Penn Treebank,甚至能够在中数据集中也很好,比如 Gigaword,但是在大数据集上则很差,比如 1B Word Benchmark。目标采样方法、多层次 Softmax,和低频标准化方法则在大词汇库上表现更好。 微分 Softmax 方法则大体上对于小词汇库和大词汇库上都表现不错。有趣的是,多层次 Softmax(HS)在小词汇库上表现不好。然而,在所有的方法之中,HS 都是最快的,而且在给定的时间内能够处理最多的训练样本。负采样法则在语言建模任务上表现不佳,却在学习词表示上有非常好的表现,从 word2vec 的成功可以看得出来。请注意,所有的结果都不可尽信:Chen 等人(2015 年)在报告里说到在实际中运用噪音对比估计方法存在困难;Kim 等人(2016 年)用多层次 Softmax 在小词汇库上获得了很好的表现,而重要性采样方法则被 Jozefowicz 等人(2016 年)提出的最先进的语言模型所用在一个大词汇库中。 最后,如果你真的准备去用上述的方法,TensorFlow 实现 (https://www.tensorflow.org/versions/master/api_docs/python/nn.html#candidate-sampling) 了一些基于采样的方法,也解释 (https://www.tensorflow.org/extras/candidate_sampling.pdf) 了其中一部分方法的不同点。 小结 这篇对于一些不同近似 softmax 的方法的介绍,不仅可以用于提升和加速词的表示的训练,也对语言建模和机器翻译有所帮助。正如我们看到的,大部分方法都非常相关,且源于同一点:必须找到方法来近似昂贵的 softmax 分母的标准化计算。记住这些方法,我希望你现在能更好地训练且理解你的模型,你甚至可以准备去自学更好的词表示模型。 (责任编辑:本港台直播) |