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)=log⎛⎝∑j=1meoj⎞⎠−oy
我们要写的solver就是用来最小化上面这个等式;比较自然地,将softmax和loss合在了一起来考虑,或者甚至还可以将
zi=wTix+bi
的定义也一起带进去,然后对
w
和
b
进行求导来得到梯度下降的链式法则。
插播一段:在软件开发中,考虑到模块化,我们通常希望各个组件是分开的,这样更加灵活,便于二次开发;但caffe将softmax和loss合为一个softmax-loss操作,更多地则是考虑到 numerical stability。
接着,对loss的传递进行简单推演。
上图所示的是一个 3 层神经网络,除了最开始的数据层
L0
之外,每一层都有输入节点和输出节点,这里使用
I12
表示第一层的第二个输入节点,
O13
表示第一层的第三个输出节点,每一层的输入和输出节点数量并不一定要一样多,但是通常情况下某一层的输入节点只是上一层的输出节点的“复制”,比如
I23=O13
,因为所有的计算操作是发生在每一层结构内部的。
对于普通的神经网络,通常每一层进行的计算都是一个线性映射再经过一个 sigmoid/ReLu 的非线性操作S,例如:
O1i=S⎛⎝∑j=13w1ijI1j+b1i⎞⎠=S(⟨W1i,I1⟩+b1i)
上式的后面部分是写成向量/矩阵的形式,这样会显得更简洁。
现在如果要对参数
w1ij
进行求导以计算它的 gradient 来进行 gradient descent 一类的参数优化,利用微积分里的 Chain Rule 可以得到如下的式子:
∂f∂w1ij=∑k=13∂O1k∂w1ij⋅∂f∂O1k
其中
∂O1k∂w1ij
是和第一层网络的内部结构相关的,只需要知道该层的局部结构就可以进行计算;
而对于
∂f∂O1k
,由于我们刚才说了输出节点其实等于下一层的输入节点,所以其实是
∂f∂O1k=∂f∂I2k
,这个是可以在上图的
L2
进行计算的,而不需要知道任何关于第一层的信息。
计算出来的
∂f∂Ip
将会作为
∂f∂Op−1
传递到
Lp−1
层,整个过程叫做 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 的推演过程。
本篇博客,基本都来自这篇博客,自己只是按照思路整理,方便以后查阅。