神经网络DNN的前向传播和后向传播

最近看了不少吴恩达的视频,听了不少神经网络的前向和后向传播的介绍,也看了不少的公式,很多东西看过了, 不见得记住了, 记住了不见得就理解了, 今天就随便写点,就算是对最近一段时间学习的一个小结和回顾。

这里的公式都是针对与全连接层的网络,带卷积的网络需要另外的解释,暂且不表。 

假设一共是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]

其中 为学习率。

你可能感兴趣的:(神经网络DNN的前向传播和后向传播)