神经网络推导-单个数据

参考:

神经网络概述

神经网络

输入单个数据到神经网络,进行前向传播和反向传播的推导

预备知识

  1. 链式法则
  2. 雅可比矩阵

链式法则

参考:链式法则

反向传播(backpropagatation)的目的是进行可学习参数(learnable parameters)的更新,其实现方式是利用链式法则(chain rule)进行梯度计算

cs231nBackpropagation, Intuitions 给出了生动的关于链式求导的学习示例

简单函数求导

对于简单函数而言,其导数计算方式很简单。比如

复合函数求导

对于复合函数而言,直接计算导数很复杂,但它可以拆分为多个简单函数,然后逐一进行计算

以函数$f(x_{1},x_{2})$为例,其实现公式如下:

其中函数可拆分成如下形式:

对$\sigma (x)$和$p(x)$求导如下:

所以函数$f(x_{1},x_{2})$求导如下:

可以用相同的方式对权重$w_{1},w_{2}$求导

所以链式法则指的是将复合函数拆分为一个个简单函数,通过组合简单函数的导数得到复合函数的导数,最后组成梯度进行权值更新

雅可比矩阵

假设函数从$R^{n}$映射到$R^{m}$,其雅可比(Jacobian)矩阵就是从$R^{n}$到$R^{m}$的线性映射

如果函数由$m$个实函数组成:$y_{1}(x_{1},…,x_{n}),…,y_{m}(x_{1},…,x_{n})$,则其偏导数(如果存在)可以组成一个$m$行$n$列的雅可比矩阵

其大小为$m\times n$

在神经网络中每次计算的输入输出结果都是向量或矩阵,所以其偏导数均可以组成Jacobian矩阵

比如函数$f’(z^{l})$表示输出向量$a^{(l)}$对输入向量$z^{(l)}$求导,就是一个雅可比矩阵

其大小为$n^{(l)}\times n^{(l)}$

网络符号定义

规范神经网络的计算符号

关于神经元和层数

  • $L$表示网络层数(不计入输入层)
    • $L=2$,其中输入层是第0层,隐藏层是第1层,输出层是第2
  • $n^{(l)}$表示第$l$层的神经元个数(不包括偏置神经元)
    • $n^{(0)}=3$,表示输入层神经元个数为3
    • $n^{(1)}=4$,表示隐藏层神经元个数为4
    • $n^{(2)}=2$,表示输出层神经元个数为2

关于权重矩阵和偏置值

  • $W^{(l)}$表示第$l-1$层到第$l$层的权重矩阵,矩阵行数为第$l$层的神经元个数,列数为第$l-1$层神经元个数
    • $W^{(1)}$表示输入层到隐藏层的权重矩阵,大小为$R^{4\times 3}$
    • $W^{(2)}$表示隐藏层到输出层的权重矩阵,大小为$R^{2\times 4}$
  • $W^{(l)}_{i,j}$表示第$l$层第$i$个神经元到第$l-1$第$j$个神经元的权值
    • $i$的取值范围是$[1,n^{(l)}]$
    • $j$的取值范围是$[1, n^{(l-1)}]$
  • $W^{(l)}_{i}$表示第$l$层第$i$个神经元对应的权重向量,大小为$n^{(l-1)}$
  • $W^{(l)}_{,j}$表示第$l-1$层第$j$个神经元对应的权重向量,大小为$n^{(l)}$
  • $b^{(l)}$表示第$l$层的偏置向量
    • $b^{(1)}$表示输入层到隐藏层的偏置向量,大小为$R^{4\times 1}$
    • $b^{(2)}$表示隐藏层到输出层的偏置向量,大小为$R^{2\times 1}$
  • $b^{(l)}_{i}$表示第$l$层第$i$个神经元的偏置值
    • $b^{(1)}_{2}$表示第$1$层隐藏层第$2$个神经元的偏置值

关于神经元输入向量和输出向量

  • $a^{(l)}$表示第$l$层输出向量,$a^{(l)}=[a^{(l)}_{1},a^{(l)}_{2},…,a^{(l)}_{n^{l}}]^{T}$
    • $a^{(0)}$表示输入层输出向量,大小为$R^{3\times 1}$
    • $a^{(1)}$表示隐藏层输出向量,大小为$R^{4\times 1}$
    • $a^{(2)}$表示输出层输出向量,大小为$R^{2\times 1}$
  • $a^{(l)}_{i}$表示第$l$层第$i$个单元的输出值,其是输入向量经过激活计算后的值

    • $a^{(1)}_{3}$表示隐含层第$3$个神经元的输入值,$a^{(1)}_{3}=g(z^{(1)}_{3})$
  • $z^{(l)}$表示第$l$层输入向量,$z^{(l)}=[z^{(l)}_{1},z^{(l)}_{2},…,z^{(l)}_{n^{l}}]^{T}$

    • $z^{(1)}$表示隐藏层的输入向量,大小为$R^{4\times 1}$
    • $z^{(2)}$表示输出层的输入向量,大小为$R^{2\times 1}$
  • $z^{(l)}_{i}$表示第$l$层第$i$个单元的输入值,其是上一层输出向量和该层第$i$个神经元权重向量的加权累加和
    • $z^{(1)}_{1}$表示隐藏层第$1$个神经元的输入值,$z^{(1)}_{1}=b^{(1)}_{1}+W^{(1)}_{1,1}\cdot a^{(0)}_{1}+W^{(1)}_{1,2}\cdot a^{(0)}_{2}+W^{(1)}_{1,3}\cdot a^{(0)}_{3}$

关于神经元激活函数

  • $g()$表示激活函数操作

关于评分函数和损失函数

  • $h()$表示评分函数操作
  • $J()$表示代价函数操作

神经元执行步骤

神经元操作分为2步计算:

  1. 输入向量$z^{(l)}$=前一层神经元输出向量$a^{(l-1)}$与权重矩阵$W^{(l)}$的加权累加和+偏置向量
  1. 输出向量$a^{(l)}$=对输入向量$z^{(l)}$进行激活函数操作

TestNet网络

TestNet是一个2层神经网络,结构如下:

  • 输入层有3个神经元
  • 隐藏层有4个神经元
  • 输出层有2个神经元

  • 激活函数为relu函数
  • 评分函数为softmax回归
  • 代价函数为交叉熵损失

对输入层

对隐藏层

对输出层

评分值

损失值

前向传播

  • 对于输入层神经元,其得到输入数据后直接输出到下一层,并没有进行权值操作和激活函数操作,所以严格意义上讲输入层不是真正的神经元
  • 对于输出层神经元,其得到输入数据,进行加权求和后直接输出进行评分函数计算,没有进行激活函数操作

输入层到隐藏层计算

隐藏层输入向量到输出向量

隐藏层到输出层计算

评分操作

损失值

反向传播

计算输出层输入向量梯度

计算输出层权重向量梯度

计算隐藏层输出向量梯度

计算隐藏层输入向量的梯度

计算隐藏层权重向量的梯度

小结

TestNet网络的前向操作如下:

反向传播如下:

参考反向传导算法神经网络反向传播的数学原理,设每层输入向量为残差$\delta^{(l)}=\frac{\partial J(W, b)}{\partial z^{(l)}}$,用于表示该层对最终输出值的残差造成的影响;而最终输出值的残差$\delta^{(L)}$就是损失函数对输出层输入向量的梯度

前向传播执行步骤

  1. 层与层之间的操作就是输出向量和权值矩阵的加权求和以及对输入向量的函数激活

  2. 输出层输出结果后,进行评分函数的计算,得到最终的计算结果(以softmax分类为例

  3. 损失函数根据计算结果判断最终损失值(以交叉熵损失为例

反向传播执行步骤

  1. 计算损失函数对于输出层输入向量的梯度(最终层残差)

  2. 计算中间隐藏层的残差值($L-1,L-2,…1$)

  3. 完成所有的可学习参数(权值矩阵和偏置向量)的梯度计算

  4. 更新权值矩阵和偏置向量

初始化数据的必要性

梯度与输入数据呈正相关,权值更新公式如下:

如果输入数据放大1000倍,那么梯度至少放大1000倍,这时需要极小的$\alpha$才能平衡每次更新的大小,所以初始化数据很有必要

坚持原创技术分享,您的支持将鼓励我继续创作!