Softmax 和 Softmax-loss的推演

时间:2022-03-03 04:08:08

Softmax 和 Softmax-loss的推演

Softmax 函数 σ(z)=(σ1(z),...σm(z)) 定义如下:

σi(z)=exp(z)Σmj=1exp(zj),i=1,...,m

它在 Logistic Regression 里的作用是将线性预测值转化为类别概率:假设 zi=wTix+bi 是第i个类别的线性预测结果,带入到softmax的结果就是先对每一个 zi 取 exponential 变成非负,然后除以所有项之和进行归一化,现在每个 oi=σi(z) 就可以解释成观察到的数据 x 属于类别 i 的概率,或者称作似然 (Likelihood)。

接着,Logistic Regression 的目标函数是根据最大似然原则来建立的,假设数据 x 所对应的类别为 y,那么根据我们刚才的计算最大似然就是要最大化 oy 的值 (通常是使用 negative log-likelihood 而不是 likelihood,也就是说最小化 log(oy) 的值,这两者结果在数学上是等价的)。
这就是 caffe 文档里说的 Multinomial Logistic Loss,具体写出来是这个样子:

(y,o)=log(oy)

而 Softmax-Loss 就是把两者结合到一起,只要把 oy 的定义展开即可

(y,o)=log(eoyΣmj=1eoj)=logj=1meojoy

我们要写的solver就是用来最小化上面这个等式;比较自然地,将softmax和loss合在了一起来考虑,或者甚至还可以将 zi=wTix+bi 的定义也一起带进去,然后对 w b 进行求导来得到梯度下降的链式法则。

插播一段:在软件开发中,考虑到模块化,我们通常希望各个组件是分开的,这样更加灵活,便于二次开发;但caffe将softmax和loss合为一个softmax-loss操作,更多地则是考虑到 numerical stability。

接着,对loss的传递进行简单推演。

Softmax 和 Softmax-loss的推演

上图所示的是一个 3 层神经网络,除了最开始的数据层 L0 之外,每一层都有输入节点和输出节点,这里使用 I12 表示第一层的第二个输入节点, O13 表示第一层的第三个输出节点,每一层的输入和输出节点数量并不一定要一样多,但是通常情况下某一层的输入节点只是上一层的输出节点的“复制”,比如 I23=O13 ,因为所有的计算操作是发生在每一层结构内部的。

对于普通的神经网络,通常每一层进行的计算都是一个线性映射再经过一个 sigmoid/ReLu 的非线性操作S,例如:

O1i=Sj=13w1ijI1j+b1i=S(W1i,I1+b1i)

上式的后面部分是写成向量/矩阵的形式,这样会显得更简洁。

现在如果要对参数 w1ij 进行求导以计算它的 gradient 来进行 gradient descent 一类的参数优化,利用微积分里的 Chain Rule 可以得到如下的式子:

fw1ij=k=13O1kw1ijfO1k

其中 O1kw1ij 是和第一层网络的内部结构相关的,只需要知道该层的局部结构就可以进行计算;
而对于 fO1k ,由于我们刚才说了输出节点其实等于下一层的输入节点,所以其实是 fO1k=fI2k ,这个是可以在上图的 L2 进行计算的,而不需要知道任何关于第一层的信息。

计算出来的 fIp 将会作为 fOp1 传递到 Lp1 层,整个过程叫做 Back Propagation,其实就是 Chain Rule,但因为涉及的符号有点多,容易混淆。

再次插播:因为 back propagation 是用 chain rule 将导数乘到一起,如果每一层的导数都“小于一”的话,在层数较多的情况下很容易到后面乘着乘着就接近零了;反过来,如果每一层的导数都“大于一”的话,gradient 乘到最后又会出现 blow up 的问题。

理解 Back Propagation 之后,可以对 Softmax-Loss 层进行最后的探讨了:

由于 Softmax-Loss 层没有参数,所以只需要计算向后传递的导数就可以了;而由于 Softmax-Loss 层是最顶层,所以不用 chain rule 就可以直接计算对于最终输出(loss)的导数。

根据上面的推演,我们用 (y,o) 来表示Softmax-Loss 层,它有两个输入,一个是 ground truth y ,直接来自于最底部的数据层,并且我们不需要对数据层做任何的 gradient descent 参数更新,所以我们不需要像那个输入进行 back propagation,但是另外一个输入 o 则来自于下面的计算层,我们只需要把 o 计算出来,然后剩下的就交给chain rule去计算:

(y,o)ok=exp(ok)mj=1exp(zj)δky=σk(z)δky

其中 σk(z) 是 Softmax-Loss 的中间步骤 Softmax 在 Forward Pass 的计算结果,而
δky=(1,whenk=y0,whenk!=y)

以上就是 softmax 和 softmax-loss 的推演过程。

本篇博客,基本都来自这篇博客,自己只是按照思路整理,方便以后查阅。