0 序言
在
本文将对模型细节进行讨论补充,定性分析激活函数的使用,阐述网络中数据维度情况;记录自己在BP算法学习过程中的一些思考(纯属发散,可跳过. 如有不正确之处欢迎讨论);给出深度神经网络BP算法代码实现(文末)及结果.
1 激活函数的位置
上文最后小节(3.3)介绍了结合Softmax和Cross Entropy Loss Function的神经网络反向传播输出层梯度计算. 在该网络中,输出层(第
层)在Feedforward过程仍使用了激活函数
,得到
,再对
做softmax得到
.
代表Sigmoid函数,常见激活函数还包括Relu(族)、Softplus、Tanh等,下表给出了几种经典激活函数及对应求导结果.表1 典型激活函数及对应导数
可见,实际上对于输出层,我们进行了2种操作:
和
.
的作用是将网络输出映射至(0, 1),便于划分阈值,处理二分类问题;对于多分类问题,则可以通过Softmax将输出归一化至(0, 1),得到类似概率分布的结果进行判断. 因此实际上这两种操作(activation, softmax)并不需要对输出层同时使用.
如果采用其他的激活函数,甚至有可能导致网络无法输出全部范围的值(如Relu),或是激活函数的导数在-1和1附近变得非常小,发生“梯度消失”.[Stanford CS231]示例中输出层未接激活函数,直接做Softmax.
2 Further discussion on Softmax + Cross Entropy
在一些文章中,将Softmax也称为激活函数,对输出层进行softmax激活. 在不接其他激活函数的情况下,上篇文章3.3节中递推起始层对权重矩阵和偏置向量梯度计算没有了对
的导数
,因此下面两式(上篇文章中(3.16),(3.17))中没有了
部分.
即:
可以看出,使用Softmax和交叉熵,可以减少输出层的
,从而略微减轻"梯度消失".
另一方面,由于真实标签
采用one-hot编码,仅有1个分量为1,因此在一些文章和代码demo中梯度计算项会出现
的记法,其实是式(2.2)中真实类别对应的元素项,从向量角度的计算为(
是真实类别
):
3 还是数据数量的问题:向量→矩阵→平均梯度
把输出层做Softmax激活的网络的BP算法递推重写如下: