在写吴恩达教师dl第四周的作业的时候,遇到一个好玩的事情
我设定了1000的迭代次数,但是可以看出,该函数已经收敛,一直处于0.65左右。经过改良可以变成
可以看出第900次迭代的cost只有0.4,事实上,继续往下迭代可以达到0.04的误差。
首先这样产生的问题可能是学习率过小,使得梯度得不到有效的下降
梯度下降公式为
W[l]=W[l]−α dW[l]
α就是学习率。有趣的是,这里并不是学习率的问题。
问题在于初始化权值:
parameters["W" + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) *0.01
此处的权值乘0.01的系数。
修改后的权值初始化:
for l in range(1, L):
parameters["W" + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) / np.sqrt(layers_dims[l - 1])
parameters["b" + str(l)] = np.zeros((layers_dims[l], 1))
(具体代码可以参考:【中文】【吴恩达课后编程作业】Course 1 - 神经网络和深度学习 - 第四周作业(1&2)_何宽的博客-CSDN博客_吴恩达课后编程作业
)
这里的权值与layer的元素呈正比关系。笔者猜测,跟层数有关。当hidden-layer很少,1,2层时,系数设为0.01无影响。当层数变多,没层元素不同,因此修改修正系数,使得数据正常梯度下降