神经网络入门篇:神经网络的梯度下降(Gradient descent for neural networks)
神经网络的梯度下降
- 在这篇博客中,讲的是实现反向传播或者说梯度下降算法的方程组
单隐层神经网络会有\(W^{[1]}\),\(b^{[1]}\),\(W^{[2]}\),\(b^{[2]}\)这些参数,还有个\(n_x\)表示输入特征的个数,\(n^{[1]}\)表示隐藏单元个数,\(n^{[2]}\)表示输出单元个数。
在这个例子中,只介绍过的这种情况,那么参数:
矩阵\(W^{[1]}\)的维度就是(\(n^{[1]}, n^{[0]}\)),\(b^{[1]}\)就是\(n^{[1]}\)维向量,可以写成\((n^{[1]}, 1)\),就是一个的列向量。
矩阵\(W^{[2]}\)的维度就是(\(n^{[2]}, n^{[1]}\)),\(b^{[2]}\)的维度就是\((n^{[2]},1)\)维度。
还有一个神经网络的成本函数,假设在做二分类任务,那么的成本函数等于:
Cost function:
公式:
\(J(W^{[1]},b^{[1]},W^{[2]},b^{[2]}) = {\frac{1}{m}}\sum_{i=1}^mL(\hat{y}, y)\)
loss function和之前做logistic回归完全一样。
训练参数需要做梯度下降,在训练神经网络的时候,随机初始化参数很重要,而不是初始化成全零。当参数初始化成某些值后,每次梯度下降都会循环计算以下预测值:
\(\hat{y}^{(i)},(i=1,2,…,m)\)
公式1.28:
\(dW^{[1]} = \frac{dJ}{dW^{[1]}},db^{[1]} = \frac{dJ}{db^{[1]}}\)
公式1.29:
\({d}W^{[2]} = \frac{{dJ}}{dW^{[2]}},{d}b^{[2]} = \frac{dJ}{db^{[2]}}\)
其中
公式1.30:
\(W^{[1]}\implies{W^{[1]} - adW^{[1]}},b^{[1]}\implies{b^{[1]} -adb^{[1]}}\)
公式1.31:
\(W^{[2]}\implies{W^{[2]} - \alpha{\rm d}W^{[2]}},b^{[2]}\implies{b^{[2]} - \alpha{\rm d}b^{[2]}}\)
正向传播方程如下(之前讲过):
forward propagation:
(1)
\(z^{[1]} = W^{[1]}x + b^{[1]}\)
(2)
\(a^{[1]} = \sigma(z^{[1]})\)
(3)
\(z^{[2]} = W^{[2]}a^{[1]} + b^{[2]}\)
(4)
\(a^{[2]} = g^{[2]}(z^{[z]}) = \sigma(z^{[2]})\)
反向传播方程如下:
back propagation:
公式1.32:
$ dz^{[2]} = A^{[2]} - Y , Y = \begin{bmatrix}y^{[1]} & y^{[2]} & \cdots & y^{[m]}\ \end{bmatrix} $
公式1.33:
$ dW^{[2]} = {\frac{1}{m}}dz{[2]}A $
公式1.34:
$ {\rm d}b^{[2]} = {\frac{1}{m}}np.sum({d}z^{[2]},axis=1,keepdims=True)$
公式1.35:
$ dz^{[1]} = \underbrace{W^{[2]T}{\rm d}z{[2]}}_{(n,m)}\quad\underbrace{{g{[1]}}{'}}_{activation ; function ; of ; hidden ; layer}\quad\underbrace{(z{[1]})}_{(n,m)} $
公式1.36:
\(dW^{[1]} = {\frac{1}{m}}dz^{[1]}x^{T}\)
公式1.37:
\({\underbrace{db^{[1]}}_{(n^{[1]},1)}} = {\frac{1}{m}}np.sum(dz^{[1]},axis=1,keepdims=True)\)
上述是反向传播的步骤,注:这些都是针对所有样本进行过向量化,\(Y\)是\(1×m\)的矩阵;这里np.sum
是python的numpy命令,axis=1
表示水平相加求和,keepdims
是防止python输出那些古怪的秩数\((n,)\),加上这个确保阵矩阵\(db^{[2]}\)这个向量输出的维度为\((n,1)\)这样标准的形式。
目前为止,计算的都和Logistic回归十分相似,但当开始计算反向传播时,需要计算,是隐藏层函数的导数,输出在使用sigmoid函数进行二元分类。这里是进行逐个元素乘积,因为\(W^{[2]T}dz^{[2]}\)和\((z^{[1]})\)这两个都为\((n^{[1]},m)\)矩阵;
还有一种防止python输出奇怪的秩数,需要显式地调用reshape
把np.sum
输出结果写成矩阵形式。
以上就是正向传播的4个方程和反向传播的6个方程,这里是直接给出的。