向量化实现的解释
首先要把几个符号的上下标搞清楚
在下面这个前向传播的推导中
关键点如下:
- 单样本的推导公式是这个
i代表第i个样本,1代表第一层。
W的shape是[第1层的神经元个数,和第0层的神经元个数];b的shape是[第1层的神经元个数,1]; - 多样本的推导是这个
将各个样本按照列向量堆叠
1代表第1层隐藏层
在多样本中,X的shape是[样本的特征数(输入层的神经元个数), 样本数]
激活函数
激活函数的导数
梯度下降
参数
n
x
=
n
[
0
]
代
表
第
0
层
(
输
入
层
)
的
神
经
元
个
数
n_x=n^{[0]}代表第0层(输入层)的神经元个数
nx=n[0]代表第0层(输入层)的神经元个数
n
[
1
]
代
表
第
1
层
的
神
经
元
个
数
n^{[1]} 代表第1层的神经元个数
n[1]代表第1层的神经元个数
W
[
1
]
W^{[1]}
W[1]的shape是
(
n
[
1
]
(n^{[1]}
(n[1],
n
[
0
]
)
n^{[0]})
n[0]), 即:(第1层的神经元个数, 上一层(0层)的神经元个数)
b
[
1
]
b^{[1]}
b[1]的shape是
(
n
[
1
]
(n^{[1]}
(n[1],
1
)
1)
1), 即:(第1层的神经元个数, 1)
依次类推其他层的W,b的意思和shape
损失函数
损失函数J是一个关于网络参数W,b 的函数。整体来说可以这么去求:
等号右边是算所有样本的y_true和y_pred的误差(mse或者是mae等等)
梯度下降
整体是做一个循环,就是收敛时循环结束
在循环内
①计算所有样本的y_pred。(就是课程第三节提到的计算神经网络的输出)
②计算每一层网络参数(
W
[
1
]
W^{[1]}
W[1],
b
[
1
]
b^{[1]}
b[1],
W
[
2
]
W^{[2]}
W[2],
b
[
2
]
b^{[2]}
b[2] …)的梯度
即 d W [ 1 ] = d J d W [ 1 ] dW^{[1]} = \frac{dJ}{dW^{[1]}} dW[1]=dW[1]dJ d b [ 1 ] = d J d b [ 1 ] db^{[1]} = \frac{dJ}{db^{[1]}} db[1]=db[1]dJ … … …and so on
③④更新W,b了
总结一下正向传播和反向传播的公式
前向传播
z [ l ] = W [ l ] ⋅ a [ l − 1 ] + b [ l ] z^{[l]} = W^{[l]} ·a^{[l-1]}+b^{[l]} z[l]=W[l]⋅a[l−1]+b[l]
a [ l ] = g [ l ] ( z [ l ] ) a^{[l]} = g^{[l]}(z^{[l]}) a[l]=g[l](z[l])
反向传播
① d z [ l ] = d a [ l ] ∗ g [ l ] ‘ ( z [ l ] ) = W [ l + 1 ] ⋅ d z [ l + 1 ] ∗ g [ l ] ‘ ( z [ l ] ) d_z^{[l]} =d_a^{[l]}*g^{[l]}`(z^{[l]}) =W^{[l+1]}·d_z^{[l+1]}*g^{[l]}`(z^{[l]}) dz[l]=da[l]∗g[l]‘(z[l])=W[l+1]⋅dz[l+1]∗g[l]‘(z[l])
② d W [ l ] = d z [ l ] ⋅ a [ l − 1 ] d_W^{[l]}=d_z^{[l]}·a^{[l-1]} dW[l]=dz[l]⋅a[l−1]
③ d b [ l ] = d z [ l ] d_b^{[l]} = d_z^{[l]} db[l]=dz[l]
④ d a [ l − 1 ] = W [ l ] ⋅ d z [ l ] d_a^{[l-1]}=W^{[l]}·d_z^{[l]} da[l−1]=W[l]⋅dz[l]
反向传播这四个主要公式的推导
- 知道 δ [ l ] = d Z [ l ] = ∂ J ∂ z [ l ] \delta^{[l]} = d_Z^{[l]}=\frac{\partial J}{\partial z^{[l]}} δ[l]=dZ[l]=∂z[l]∂J ; δ j [ l ] \delta_j^{[l]} δj[l] = “error” of node j in layer l
- 公式①的推导通过如下公式
d z [ l ] = ∂ J ∂ a [ l ] ∂ a [ l ] ∂ z [ l ] d_z^{[l]}=\frac{\partial J}{\partial a^{[l]}}\frac{\partial a^{[l]}}{\partial z^{[l]}} dz[l]=∂a[l]∂J∂z[l]∂a[l](然后两个分式分别求解即可)
a [ l ] = g [ l ] ( z [ l ] ) a^{[l]} = g^{[l]}(z^{[l]}) a[l]=g[l](z[l])
- 公式②③的推导要借助下面的公式
d W [ l ] = ∂ J ∂ z [ l ] ∂ z [ l ] ∂ W [ l ] d_W^{[l]}=\frac{\partial J}{\partial z^{[l]}}\frac{\partial z^{[l]}}{\partial W^{[l]}} dW[l]=∂z[l]∂J∂W[l]∂z[l]
d b [ l ] = ∂ J ∂ z [ l ] ∂ z [ l ] ∂ b [ l ] d_b^{[l]}=\frac{\partial J}{\partial z^{[l]}}\frac{\partial z^{[l]}}{\partial b^{[l]}} db[l]=∂z[l]∂J∂b[l]∂z[l]
(然后两个分式分别求解即可)
z [ l ] = W [ l ] ⋅ a [ l − 1 ] + b [ l ] z^{[l]} = W^{[l]} ·a^{[l-1]}+b^{[l]} z[l]=W[l]⋅a[l−1]+b[l](然后利用求偏导数的原理,求对W的偏导即可)
- 公式④的推导要借助下面的公式
d a [ l − 1 ] = ∂ J ∂ z [ l ] ∂ z [ l ] ∂ a [ l − 1 ] d_a^{[l-1]}=\frac{\partial J}{\partial z^{[l]}}\frac{\partial z^{[l]}}{\partial a^{[l-1]}} da[l−1]=∂z[l]∂J∂a[l−1]∂z[l]
(然后两个分式分别求解即可)
z [ l ] = W [ l ] ⋅ a [ l − 1 ] + b [ l ] z^{[l]} = W^{[l]} ·a^{[l-1]}+b^{[l]} z[l]=W[l]⋅a[l−1]+b[l](然后利用求偏导数的原理,求对W的偏导即可)
注意
- ·这个是矩阵乘法,这个是元素乘法,即AB中,A和B的维度一致,对应元素相乘、
- 在上面的公式里面,我没有关注维度是否一致,可以去看吴恩达第二课的3.10关于维度一致的讲解
随机初始化
为什么将W初始化为0不合理
如果这样初始化这个神经网络,那么这两个隐含单元就会完全一样,因此他们完全对称,也就意味着计算同样的函数,并且肯定的是最终经过每次训练的迭代,这两个隐含单元仍然是同一个函数。因此所有神经元都是做的同样的计算,就没有意义了。
相反,如果W是随机初始化的,那么b初始化为0不会导致神经元依然做相同的计算,因为W不同,不同神经元的计算就不同了。
随机初始化
吴恩达老师在这里说了一种随机初始化的方法。
然后老师强调了为什么要用到0.01。
相当于是如果W很大,那么函数值就很难落在sigmoid的那个上升区,就基本是落在那个平缓区,所以训练如果在那个区域的话,很难收敛或者说学习得很慢。
无论如何,初始化参数一般都很小