最近看了不少吴恩达的视频,听了不少神经网络的前向和后向传播的介绍,也看了不少的公式,很多东西看过了, 不见得记住了, 记住了不见得就理解了, 今天就随便写点,就算是对最近一段时间学习的一个小结和回顾。
这里的公式都是针对与全连接层的网络,带卷积的网络需要另外的解释,暂且不表。
假设一共是L层的网络, 每层的神经元的数目可以用n^[l] 表示, l =0 . . . L . 训练样本的总数用m表示。
前向传播
在第l层的线性函数和激活函数可以表示如下:
Z^[l] = W^[l] . A^[l-1] + B^[l]
A^[l] = g^[l] (Z^[l])) #每层的激活函数可以是不一样
特别的,当l = 1时, A^[0] = X 为神经网络的输入。
当l = L 时, A^[L] 为神经网络的预测输出。
W^[l]是二维矩阵,维度为 [ n^[l], n^[l-1] ]
B^[l]是二维矩阵, 维度为[ n^[l], 1 ]
A^[l-1]是二维矩阵,维度为[ n^[l-1], m ]
Z^[l]是二维矩阵, 维度为[ n^[l], m]
反向传播
目标是找到一个算法,能计算出神经网络每一层的权重和偏置,使网络的输出能拟合训练的输入。假设我们定义了代价函数 C(w, b) 来量化这个目标, 然后用梯度下降算法找到使代价函数最小的权重和偏置的值。其公式如下:
dZ^[l] = dA^[l] * g^[l] ' (Z^[l] )
dW^[l] = (1/m) . ( dZ^[l] . A^[l-1].T )
db^[l] = (1/m) . np.sum(dZ^[l], axis = 1, keepdims = True) #对横轴做加法
dA^[l-1] = W^[l].T . dZ^[l]
当l = L 时,dA^[L] 为代价函数对网络输出A^[L]的偏导, 当l ! = L 时, dA^[l] 是第l层的线性函数对上一层(l-1)输入的偏导。
dA^[l] 是二维矩阵,维度为[ n^[l], m]
g^[l] ' (Z^[l]) 是二维矩阵,维度为[ n^[l], m]
dZ^[l] 是二维矩阵,维度为[ n^[l], m]
dW^[l] 是二维矩阵,维度为 [ n^[l], n^[l-1] ]
db^[l] 是二维矩阵, 维度为[ n^[l], 1 ]
dA^[l-1] 是二维矩阵,维度为[ n^[l-1], m]
每一层的dW^[l] 和db^[l]计算出来后, 就可以迭代每一层的W和B:
W^[l] : = W^[l] + dW^[l]
B^[l] : = B^[l] + db^[l]
其中 为学习率。