作者:Criss


常见的神经网络求导总结!_神经网络


derivative of softmax

1.1 derivative of softmax

一般来说,分类模型的最后一层都是softmax层,假设我们有一个 常见的神经网络求导总结!_神经网络_02 分类问题,那对应的softmax层结构如下图所示(一般认为输出的结果 常见的神经网络求导总结!_二分类_03 即为输入 常见的神经网络求导总结!_神经网络_04

常见的神经网络求导总结!_二分类_05

假设给定训练集 常见的神经网络求导总结!_神经网络_06 ,分类模型的目标是最大化对数似然函数 常见的神经网络求导总结!_卷积_07,即


通常来说,我们采取的优化方法都是gradient based的(e.g., SGD),也就是说,需要求解 常见的神经网络求导总结!_二分类_08 。而我们只要求得 常见的神经网络求导总结!_神经网络_09 ,之后根据链式法则,就可以求得 常见的神经网络求导总结!_二分类_08 ,因此我们的核心在于求解 常见的神经网络求导总结!_神经网络_09 ,即


由上式可知,我们只需要知道各个样本 常见的神经网络求导总结!_神经网络_12 的 常见的神经网络求导总结!_卷积_13 ,即可通过求和求得 常见的神经网络求导总结!_神经网络_09 ,进而通过链式法则求得 常见的神经网络求导总结!_二分类_08 。因此下面省略样本下标j,仅讨论某个样本 常见的神经网络求导总结!_二分类_16

实际上对于如何表示 常见的神经网络求导总结!_神经网络_04

  • 一种是直接法(i.e., 用 常见的神经网络求导总结!_卷积_18 来表示x属于第3类),则 常见的神经网络求导总结!_神经网络_19 ,其中 常见的神经网络求导总结!_二分类_20
  • 另一种是one-hot法(i.e., 用 常见的神经网络求导总结!_神经网络_21 来表示x属于第三类),则 常见的神经网络求导总结!_卷积_22 ,其中 常见的神经网络求导总结!_卷积_23 为向量 常见的神经网络求导总结!_卷积_24 的第 常见的神经网络求导总结!_二分类_25
  • p.s., 也可以将one-hot法理解为直接法的实现形式,因为one-hot向量实际上就是 常见的神经网络求导总结!_神经网络_26

为了方便,本文采用one-hot法。于是,我们有:


1.2 softmax & sigmoid

再补充一下softmax与sigmoid的联系。当分类问题是二分类的时候,我们一般使用sigmoid function作为输出层,表示输入 常见的神经网络求导总结!_神经网络_04

常见的神经网络求导总结!_卷积_28然后利用概率和为1来求解 常见的神经网络求导总结!_神经网络_04

常见的神经网络求导总结!_神经网络_30乍一看会觉得用sigmoid做二分类跟用softmax做二分类不一样:

  • 在用softmax时,output的维数跟类的数量一致,而用sigmoid时,output的维数比类的数量少;
  • 在用softmax时,各类的概率表达式跟sigmoid中的表达式不相同。

但实际上,用sigmoid做二分类跟用softmax做二分类是等价的。我们可以让sigmoid的output维数跟类的数量一致,并且在形式上逼近softmax。


通过上述变化,sigmoid跟softmax已经很相似了,只不过sigmoid的input的第二个元素恒等于0(i.e., intput为 常见的神经网络求导总结!_卷积_31 ),而softmax的input为 常见的神经网络求导总结!_卷积_32 ,下面就来说明这两者存在一个mapping的关系(i.e., 每一个 常见的神经网络求导总结!_卷积_32 都可以找到一个对应的 常见的神经网络求导总结!_卷积_31 来表示相同的softmax结果。不过值得注意的是,反过来并不成立,也就是说并不是每个 常见的神经网络求导总结!_卷积_31 仅仅对应一个 常见的神经网络求导总结!_卷积_32


常见的神经网络求导总结!_卷积_37因此,用sigmoid做二分类跟用softmax做二分类是等价的。

02 backpropagation


一般来说,在train一个神经网络时(i.e., 更新网络的参数),我们都需要loss function对各参数的gradient,backpropagation就是求解gradient的一种方法。

常见的神经网络求导总结!_神经网络_38

假设我们有一个如上图所示的神经网络,我们想求损失函数 常见的神经网络求导总结!_二分类_39 对 常见的神经网络求导总结!_神经网络_40

常见的神经网络求导总结!_卷积_41而我们可以很容易得到上述式子右边的第二项,因为 常见的神经网络求导总结!_卷积_42

常见的神经网络求导总结!_二分类_43其中, 常见的神经网络求导总结!_卷积_44

而对于式子右边的的第一项,可以进一步拆分得到

常见的神经网络求导总结!_卷积_45我们很容易得到上式右边第二项,因为 常见的神经网络求导总结!_二分类_46 ,而激活函数 常见的神经网络求导总结!_神经网络_47

常见的神经网络求导总结!_卷积_48

其中, 常见的神经网络求导总结!_神经网络_49

常见的神经网络求导总结!_神经网络_50

观察上图,我们根据链式法则可以得到

常见的神经网络求导总结!_神经网络_51其中,根据 常见的神经网络求导总结!_卷积_52

常见的神经网络求导总结!_卷积_53

常见的神经网络求导总结!_二分类_54 和 常见的神经网络求导总结!_卷积_55 的值是已知的,因此,我们离目标 常见的神经网络求导总结!_二分类_56 仅差 常见的神经网络求导总结!_卷积_57 和 常见的神经网络求导总结!_神经网络_58 了。接下来我们采用动态规划(或者说递归)的思路,假设下一层的 常见的神经网络求导总结!_卷积_57 和 常见的神经网络求导总结!_神经网络_58

因此我们求 常见的神经网络求导总结!_二分类_61 的过程实际上对应下图所示的神经网络(原神经网络的反向神经网络):

常见的神经网络求导总结!_神经网络_62

综上,我们先通过神经网络的正向计算,得到 常见的神经网络求导总结!_卷积_44 以及 常见的神经网络求导总结!_神经网络_49 ,进而求得 常见的神经网络求导总结!_神经网络_65 和 常见的神经网络求导总结!_神经网络_66 ;然后通过神经网络的反向计算,得到 常见的神经网络求导总结!_卷积_57 和 常见的神经网络求导总结!_神经网络_58 ,进而求得 常见的神经网络求导总结!_二分类_56 ;然后根据链式法则求得 常见的神经网络求导总结!_神经网络_70


03 derivative of CNN

卷积层实际上是特殊的全连接层,只不过:

神经元中的某些 常见的神经网络求导总结!_卷积_71 为 常见的神经网络求导总结!_神经网络_72

神经元之间共享 常见的神经网络求导总结!_卷积_71

具体来说,如下图所示,没有连线的表示对应的w为0:

常见的神经网络求导总结!_二分类_74

如下图所示,相同颜色的代表相同的 常见的神经网络求导总结!_卷积_71

常见的神经网络求导总结!_二分类_76

因此,我们可以把loss function理解为 常见的神经网络求导总结!_二分类_77


常见的神经网络求导总结!_神经网络_78在求各个 常见的神经网络求导总结!_二分类_79 时,可以把他们看成是相互独立的 常见的神经网络求导总结!_卷积_71


04 derivative of RNN

RNN按照时序展开之后如下图所示(红线表示了求gradient的路线):

常见的神经网络求导总结!_神经网络_81

跟处理卷积层的思路一样,首先将loss function理解为 常见的神经网络求导总结!_神经网络_82


常见的神经网络求导总结!_卷积_83由于这里是将RNN按照时序展开成为一个神经网络,所以这种求gradient的方法叫Backpropagation Through Time(BPTT)。


05 derivative of max pooling

一般来说,函数 常见的神经网络求导总结!_二分类_84 是不可导的,但假如我们已经知道哪个自变量会是最大值,那么该函数就是可导的(e.g., 假如知道y是最大的,那对y的偏导为1,对其他自变量的偏导为0)。

而在train一个神经网络的时候,我们会先进行forward pass,之后再进行backward pass,因此我们在对max pooling求导的时候,已经知道哪个自变量是最大的,于是也就能够给出对应的gradient了。

references:

http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML17_2.html

http://www.wildml.com/2015/10/recurrent-neural-networks-tutorial-part-3-backpropagation-through-time-and-vanishing-gradients/