梯度下降法在神经网络中的应用

事先规定:

nnn 表示个数(维度):

n[0]=nxn^{[0]}=n_xn[0]=nx ,表示单个训练样本 xxx 的元素个数;

n[1]n^{[1]}n[1] 表示隐藏层 111 的单元(节点)个数;

n[1]n^{[1]}n[1] 表示……

梯度下降法公式:

wwwbbb 参数随机初始化;

②计算预测值

③求导:dw[1]dw^{[1]}dw[1]db[1]db^{[1]}db[1]dw[2]dw^{[2]}dw[2]db[2]db^{[2]}db[2]

④更新参数:
W[1]=W[1]−α⋅dW[1]b[1]=b[1]−α⋅db[1]W[2]=W[2]−α⋅dW[2]b[2]=b[2]−α⋅db[2] \begin{align*} &W^{[1]}=W^{[1]}-\alpha·dW^{[1]}\\ &b^{[1]}=b^{[1]}-\alpha·db^{[1]}\\ &W^{[2]}=W^{[2]}-\alpha·dW^{[2]}\\ &b^{[2]}=b^{[2]}-\alpha·db^{[2]} \end{align*} W[1]=W[1]αdW[1]b[1]=b[1]αdb[1]W[2]=W[2]αdW[2]b[2]=b[2]αdb[2]
第三步反向传播求导的详细步骤:
dZ[2]=A[2]−YdW[2]=1mdZ[2]A[1]Tdb[2]=1mnp.sum(dZ[2],axis=1,keepdims=True)dZ[1]=W[2]TdZ[2]∗g[1]′(Z[1])//这里的∗是元素对应相乘dW[1]=1mdZ[1]XT//这里的转置是因为W[1]是由wi[1]T组成的db[1]=1mnp.sum(dZ[1],axis=1,keepdims=True) \begin{align*} &dZ^{[2]}=A^{[2]}-Y\\ &dW^{[2]}=\frac{1}{m}dZ^{[2]}A^{[1]T}\\ &db^{[2]}=\frac{1}{m}np.sum(dZ^{[2]},axis=1,keepdims=True)\\ &dZ^{[1]}=W^{[2]T}dZ^{[2]}*g^{[1]'}(Z^{[1]})//这里的*是元素对应相乘\\ &dW^{[1]}=\frac{1}{m}dZ^{[1]}X^{T}//这里的转置是因为W^{[1]}是由w_i^{[1]T}组成的\\ &db^{[1]}=\frac{1}{m}np.sum(dZ^{[1]},axis=1,keepdims=True)\\ \end{align*} dZ[2]=A[2]YdW[2]=m1dZ[2]A[1]Tdb[2]=m1np.sum(dZ[2],axis=1,keepdims=True)dZ[1]=W[2]TdZ[2]g[1](Z[1])//这里的是元素对应相乘dW[1]=m1dZ[1]XT//这里的转置是因为W[1]是由wi[1]T组成的db[1]=m1np.sum(dZ[1],axis=1,keepdims=True)

参数随机初始化

神经网络的参数 wi[l]w_i^{[l]}wi[l] 和不能像逻辑回归一样,初始化为零,否则梯度下降算法就会无效。

也不要将隐藏层中的所有节点参数都初始化成一样的,否则每个节点都在做相同的运算,毫无意义。

W[1]=np.random.randn((n[1],n[0]))⋅0.01 //高斯分布随机变量再乘以0.01b[1]=np.zeros((n[1],1))W[2]=...b[2]=... \begin{align*} &W^{[1]}=np.random.randn((n^{[1]},n^{[0]}))·0.01~//高斯分布随机变量再乘以0.01\\ &b^{[1]}=np.zeros((n^{[1]},1))\\ &W^{[2]}=...\\ &b^{[2]}=... \end{align*} W[1]=np.random.randn((n[1],n[0]))0.01 //高斯分布随机变量再乘以0.01b[1]=np.zeros((n[1],1))W[2]=...b[2]=...

通常情况下,会把参数随机初始化成很小很小的值,这也是乘以 0.010.010.01 的原因。

因为参数大的话, zzz 计算出来就会大,aaa 也会大,就会落在激活函数 σ(z)\sigma(z)σ(z)tanh(z)tanh(z)tanh(z) 的平缓区域,就会降低梯度下降法的速度,甚至形成梯度消失问题。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐