0%

softmax的困扰、改进

简介

数学上的softmax

在数学,尤其是概率论和相关领域中,Softmax函数,或称归一化指数函数,是逻辑函数的一种推广。它能将一个含任意实数的K维向量 ${\displaystyle \mathbf {z} }$“压缩”到另一个K维实向量 ${\displaystyle \sigma (\mathbf {z} )}$ 中,使得每一个元素的范围都在 ${\displaystyle (0,1)}$ 之间,并且所有元素的和为1。该函数的形式通常按下面的式子给出:

$${\displaystyle \sigma (\mathbf {z} ) _ {j}={\frac {e^{z_ {j}}}{\sum _ {k=1}^{K}e^{z_ {k}}}}} \quad j = 1, …, K.$$

softmax的应用

Softmax函数实际上是有限项离散概率分布的梯度对数归一化。因此,Softmax函数在包括 多项逻辑回归,多项线性判别分析,朴素贝叶斯分类器和人工神经网络等的多种基于概率的多分类问题方法中都有着广泛应用。特别地,在多项逻辑回归和线性判别分析中,函数的输入是从K个不同的线性函数得到的结果,而样本向量 x 属于第 j 个分类的概率为:

$$
P(y=j\mid \mathbf {x} )=\frac {e^{\mathbf {x} ^{\mathsf {T}}\mathbf {w}_ {j}}}{\sum_{k=1}^{K}e^{\mathbf {x} ^{\mathsf {T}}\mathbf {w}_ {k}}}
$$

这可以被视作K个线性函数
$ \mathbf {x} \mapsto \mathbf {x} ^{\mathsf {T}}\mathbf {w}_ {1},\ldots ,\mathbf {x} \mapsto \mathbf {x} ^{\mathsf {T}}\mathbf {w}_{K}$
Softmax函数的复合( $\mathbf {x} ^{\mathsf {T}}\mathbf {w} \mathbf {x} \mathbf {w}$ )。

loss function

softmax loss是我们最熟悉的loss之一了,分类任务中使用它,分割任务中依然使用它。softmax loss实际上是由softmax和cross-entropy loss组合而成,两者放一起数值计算更加稳定。这里我们将其数学推导一起回顾一遍。

令z是softmax层的输入,f(z)是softmax的输出,则

softmax的瓶颈

softmax需要计算每个类别的score,并且归一化为概率p。
当类别特别多(比如大词表)的情况下,计算量超大。

  • 参数量=计算量=$n \times V$
  • 复杂度$O(n^2)$

对于大词表V

softmax的瓶颈常见于语言模型的巨量词汇、

优化

汇总

对损失函数的近似方法

  • HSM: Hierarchical Softmax: 用两层的树((Goodman, 2001a; Mikolov
    et al., 2011c),或者更深层的结构()
    • word2vec, faxtText,
  • NCE:
  • 重要性采样
  • class-based softmax:
  • adaptive softmax: 对class-based softmax的改进,针对GPU的加速

其他

  • Large-Margin Softmax Loss
  • weighted softmax loss
  • soft softmax loss
  • angular softmax loss
  • L2-constrained softmax loss
  • additive margin softmax loss

基于采样的近似方法

基于

其他

  1. 简单的trick

[batch_size, seq_length, hidden_size] * [hidden_size, vocab_size] 这样的操作,可以reshape成

[batch_size * seq_length, hidden_size] * [hidden_size, vocab_size] 的操作。即真个sequence一起算softmax。

但是有些decode中,上一时刻的output作为下一时刻的输入,就没办法这样算了。

对loss-function的优化/近似(Loss function approximation)

  • HSM: hierarchical softmax

树结构是一般基于frequency binning或者word similarities

hierarchical softmax是很多层二分类,在GPU上效率并不高。
假如,浅层的多分类,每层没必要是两个类。单层矩阵运算更容易用GPU加速
层数少了,在GPU上速度提升了,(当然如果是cpu,速度会更慢)

基于采样的优化/近似 (Sampling based approximation)

importance sampling

不同的采样策略:

  • unigram
  • bigram
  • power-raised distribution of the unigram

Self-normalized approaches

class based softmax

Classes for fast maximum entropy training. Joshua Goodman, 2001

We assign each word in the
vocabulary to a unique class. 比如,猫、狗属于动物类,周二、周三属于工作日。

FAQ

  • 类之间有没有word overlap?没有,这样能减小计算量。(HS的二叉树也)
  • 有没有大类小类?多层类?没有
  • class与word的对应关系是怎样得到的? 由用户自定义,自定义的方法有:
    • 按语义分类:猫、狗属于动物类,周二、周三属于工作日。
    • 按词频分类:首先词频排序,然后分块作为class

adaptive softmax

Facebook 人工智能研究(FAIR)设计出一种新式的 softmax 函数逼近,专用于 GPUs,帮助其在语言模型的基础上通过巨量词汇来有效训练神经网络。

这种方法叫做自适应 softmax(adaptive softmax),利用不平衡词分布形成簇(cluster),这种簇能明确地减少对计算复杂度的期望,从而规避对词汇量的线性依赖。这种方法通过利用流行架构的特殊性和矩阵-矩阵向量运算(matrix-matrix vector operations)进一步减少了训练和测试时的计算成本。这使得它特别适合于 GPU,而以往的方法,如分层 softmax,NCE 和重要性采样,都是为标准的 CPU 设计的。

有点类似HS和重要性采样吧?词频高的

FAQ

  • adaptive softmax为什么能加速?
  • 为什么要这样分cluster?

核心

NCE

negative sampling。这种只针对training吧?inference怎样sampling呢?

(CPU上会更低效)

FAQ

关于名称

  • softmax直接来看是一个归一化方法,loss的形式和是不是概率是不是softmax形式是没有必然联系的。当然它们现在的形式都是可以从entropy延伸出来,但是换一个新的loss,softmax也可以照用,或者不用softmax归一化,这个loss也一样可以继续用于优化。我觉得还是叫entropy loss比较好。
  • 全称是softmax cross entropy loss,但这个实在是太长了
  • 没什么全称的吧,好多地方都叫得不一样,就叫entropy loss最好了,既简洁又准确,这个loss就是entropy的形式
  • 这个损失函数的核心是softmax函数,用softmax得到概率才能用cross entropy,得到概率的方式也有很多,比如sigmoid后l1归一化。
  • caffe里除了softmax cross entropy,还有sigmoid cross entropy。

实例

  • tensor2tensor:

参考

  • 维基百科写的很好,很多篇幅摘自维基百科
  • efficient softmax approximation for GPUs 综述归纳的很好
  • 一文道尽softmax loss及其变种
  • 漫谈词向量之基于Softmax与Sampling的方法 | 待看