首先对本文中使用的符号进行解释,本文中出现的向量都默认为列向量。表示样本数量,表示单个样本包含的输入特征数量,表示第个样本的第个特征值。表示从1开始计数的神经网络层号,表示最大层号,表示第层包含的神经元数量(即输出特征数量)。表示第层包含的神经元数量。和分别表示层第个神经元的状态值和激活值,表示第层中所有神经元的状态值组成的向量,表示第层中所有神经元的激活值组成的向量。表示第层的第个神经元与第层的第个神经元连接的权重,表示第层的第个神经元的偏置。表示第层的第个神经元与第层中神经元连接的权重向量,表示该神经元的线性变换向量。表示第层中所有神经元的权重向量组成的权重矩阵,每个神经元的权重向量是它的一个列向量;表示第层中所有神经元的线性变换向量组成的矩阵,每个神经元的线性变换向量是它的一个列向量。
上面图片所示的是单个神经元,其中是神经元的状态值,是神经元的激活值,是从上一层神经网络到该神经元的线性变换向量(为偏置和权重向量组成的向量)。为激活函数,本文中采用函数作为激活函数,即,那么。
一、正向传播算法
神经网络的正向传播算法,从输入层到隐藏层最后到输出层,依次计算每个神经元的状态值和激活值。在输入层中,,那么第层的第个神经元的状态值和激活值有下面的递推公式:
第层中所有神经元的状态值和激活值有下面的递推公式:
这样,根据输入层的激活值,使用递推公式就可以从输入层向后依次计算出每层神经网络的状态值和激活值。这就是正向传播算法。
二、反向传播算法
神经网络的反向传播算法,用于计算损失函数关于每个权重和偏置的偏导数,与具体损失函数的形式无关。另外,假设本文中涉及的函数都是可微的,那么就可以使用链式法则来计算偏导数。
设为损失函数,那么它是一个高度复合的函数,可以看作是关于和的函数,也可以看作是关于的函数。设是第层的第个神经元的误差率,下面我们来计算:
第层的第个神经元与第层的所有神经元相连,损失函数可以看作是关于的函数,又是的函数,即损失函数作为复合函数有条路径可以从到达,那么:
那么,第层中所有神经元的误差率组成的向量,和,第层的线性变换矩阵的偏导数,有下面的递推公式:
这样,可以由损失函数的形式直接求出,使用递推公式就可以从输出层向前依次计算出每层神经网络的误差率和线性变换矩阵的偏导数。这就是反向传播算法。
如果使用激活函数和下面形式的损失函数:
那么可以计算出只有单个样本时第层的误差率为(不考虑正则项),分别计算出单个样本时参数的偏导数,然后将所有样本的偏导数相加,即可计算出损失函数关于所有样本时参数的偏导数。