神经网络的梯度下降
- 在这篇博客中,讲的是实现反向传播或者说梯度下降算法的方程组
单隐层神经网络会有\(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^{2T}dz^{2}\)和\((z^{1})\)这两个都为\((n^{1},m)\)矩阵;
还有一种防止python 输出奇怪的秩数,需要显式地调用reshape把np.sum输出结果写成矩阵形式。
以上就是正向传播的4个方程和反向传播的6个方程,这里是直接给出的。