上图是一个最简单2层的神经网络,最左边一层是输入的数据,通常这一层不计入到神经网络的纬度中.
如果我们把一个神经元单独提取出来的话,你会发现它就是一个逻辑回归.所以说神经网络可以理解为非常多的逻辑回归组合而成的.
由于神经网络的推导过于复杂,所以我们先从简单的逻辑回归开始逐步推导神经网络.
在文中你可能会看到这几种符号表示:
,中括号表示层数,这里指第1层的参数.
,小括号表示第几个训练样本,这里指第一层第一个训练样本的参数.
,下标表示第几个神经元,这里指第一层第一个神经元的参数.
,大括号表示第几批数据,后面会通过将训练样本分配以提高速度.
单样本逻辑回归
:表示1个样本,样本有n个特征,所以为(n,1)的向量.
:样本的标记值,为二进制常数.
:线性方程的参数,每个特征对应一个参数,为(n,1)的向量
:线性方程的偏置值,为常数.
正向传播:
反向传播:
根据链式法则求参数的导数:
多样本逻辑回归
我们的训练样本有很多个,计算梯度的时候通常会取多个样本梯度的平均值.当然可以使用for循环来计算梯度,不过向量化的效率是for循环的近300倍.
:表示m个样本,每个样本有n个特征,为(n,m)的矩阵
:表示m个样本的标记,为(1,m)的矩阵
:线性方程的参数,每个特征对应一个参数,为(n,1)的向量
:线性方程的偏置值,为常数.
反向传播:
根据链式法则求参数的导数:
多样本逻辑回归只有x变为X,而参数与偏置,均与单样本相同.
最后求得的导数为使用各样本计算出的导数组成的矩阵,我们取平均值作为最终结果.
2layer神经网络
我们可以把逻辑回归多加一层:
这样是两层的神经网络么?显然不是的,2层的神经网络不仅比逻辑回归多一层,而且每层有多个神经元.所以我们需要重新定义一下参数的形式.
我们可以把每层中的神经元的参数放到一个大的矩阵中,即:
同样,把偏置也放到一个矩阵中:
此时,我们可以一次性计算第1层所有的神经元:
正向传播:
反向传播:
神经网络中的W,A,Y及b都可以理解为个逻辑回归结果的罗列,所以逻辑回归的反向传播结果可以直接用到神经网络的反向传播.
根据链式法则:
L层神经网络
有了2层神经网络的基础,我们来看一下L层的神经网络:
正向传播:
循环L次:
反向传播:
递推出第l层的导数:
随机初始化参数
梯度下降时参数更新的幅度是根据其对的偏导数决定的.而偏导数的大小与输入x相关.
在逻辑回归中,因为输入x不同,所以偏导数也是不同的,将全部初始化为0是没有问题的.
但是在神经网络中,下一层不同神经元的输入x可能是上一次同一个神经元的输出,这就造成有些参数的偏导数总是相同的,无论迭代多少次,参数也总是相同,造成重复神经元,性能降低.
上图中,第二层神经元与的输入为相同的值,如果也初始化为相同的值,会造成的偏导数也相同的情况.
所以为了避免上述情况发生,的初始值一定要为不同的值,我们可以使用随机数初始化.并且为了让学习更有效率,要保证之和尽可能小,即在区间内选取.
一个有效选取的策略是以神经元个数为基础.即,其中为该层神经元数目,为下一层神经元数目.
参考:
https://www.coursera.org/specializations/deep-learning