参考链接
- 论文链接:https://arxiv.org/pdf/1609.04309v3.pdf
- 项目链接:https://github.com/facebookresearch/adaptive-softmax
Introduction:
- 本文提出是的方法是adaptive softmax, 该算法目的是为了提高softmax函数的运算效率,适用于一些具有非常大词汇量的神经网络。
- 在NLP的大部分任务中,都会用到softmax,但是对于词汇量非常大的任务,每次进行完全的softmax会有非常大的计算量,很耗时。所以paper中提出adaptive softmax来提升softmax的运算效率。
-
adaptive softmax的特点
- 该算法的提出利用到了单词分布不均衡的特点(unbalanced word distribution)来形成将单词分成不同的类, 这样在计算softmax时可以避免对词汇量大小的线性依赖关系,降低时间复杂度;
- 另外通过结合现代架构和矩阵乘积操作的特点,通过使其更适合GPU单元的方式进一步加速计算。
Computation time model of matrix-multiplication:
- 大部分语言模型的瓶颈在于:隐藏状态的矩阵(B=batch size,d为隐藏层状态维度)与词汇表矩阵(k=词汇表的大小)之间的矩阵相乘。
- 假设将和固定,下图为两个GPU模型K40和M40矩阵乘法时间随的变化图:我们将上图的曲线记为函数,我们可以看到,大概在时,时间是一个常量。直到时, 时间变成成了一个线性函数。
- 因此假设g(k)的表达式如下:在K40上,在M40上.
- 同样的,假设将和固定,模型K40和M40矩阵乘法时间随的变化也呈现上面这样的关系。
- 这就表明矩阵相乘时,当其中一个维度很小时,矩阵乘法是低效的。也就是说计算大量小矩阵是不划算的,很容易理解,数据传输、函数调用开销等也需要消耗时间。也说明了,按层次来组织words时,如果中间节点有较少的子节点时 (比如huffman 编码的tree)是次优的。
- 所以paper中综合考虑了与,提出了下面的计算时间模型:
two-clusters case:
- 这部分讲解将词汇表分成两个类的Adaptive softmax模型。
- 在自然语言中,单词的分布遵循Zipf定律。大部分的概率被词典中一小部分词所覆盖,例如,在Penn TreeBank中87%的文档只被20%的词汇所覆盖。
- 首先将将词汇表分成两部分和,包含在词汇表头部高频词,中包含在词汇表尾部的低频词。高频词会经常被访问所有它应该被高效的计算。这使得我们使用不平衡基数(unbalanced cardinalities):和不平衡概率(unbalanced probabilities):(其中表示一个词在中的概率),来进行词典划分。
- 两个词类(clusters)有两种组织方式:
- 方法一:和都放在树的第二层的叶节点中。
- 方法二:保存在根节点中而保存在第二层的叶节点中。
- 方法一比方法二性能上要低。当预测类中词时:
- 方法一:
- 方法二:,其更为简单直接,所以效果更好。
- 因此,除非方法一比方法二的计算时间快很多,否则选择方法二的组织方式。
Minimizing the computation time:
- 令词汇表的大小为,中词的个数为对应的概率为.则:.
- 所以,根部计算的时间为:叶节点的计算时间为:;所以整体的计算时间为:
- 这样我们通过最小化来求的合适的,与的关系图如下
Adapting the classifier capacity for each cluster:
- 每个类(cluster)是独立的被访问,因此它们不需要有相同的能力。对应频繁的词它们使用跟高的能力,而稀少的词他们可以不被学的非常好,因为它们很少被查看。
- 在论文中,对不同的类共享隐层,通过加映射矩阵的方式降低分类器的输入大小。一般的,tail部分(低频词部分)的映射矩阵将其大小从维缩小到 维。
General case
-
现在考虑更一般的情况,将词汇表分成J分:,并且,分成结构如下所示:
-
C:总计算时间;词属于类的概率为,;固定(batch size)和(隐藏层维度),仅考虑与和概率的关系.
-
将进行如下分解:
-
回顾公式:;其中为常数部分, B是的线性函数。有上面部分分析可知,在常数部分GPU的算力并未得到充分利用,因此应尽量避免落入该部分;所以设置一个约束条件:;合并上面式子得:
-
讨论项:
- 令,则则可以得到:
- 假设都固定,只有是可变的;那么当越小式上式越小,即让容量更大的第类包含更多概率小的词。
-
讨论项: 论文中说使用了动态规划。
-
讨论项:最优的计算机时间关于J的函数图形如下图所示: