Andrew Ng在优化深度神经网络的3周课程中,第一周就讲了深度神经网络最常有的3个问题,分别是梯度消失/爆炸,过拟合,梯度检验。并分别给出了解决办法,合理的网络参数初始化可以预防梯度消失/爆炸问题出现;而当网络的预测结果出现过拟合现象时,则考虑用正则化手段调试网络;梯度检验则是因为要向别人证明自己的梯度下降所求的每个梯度是正确的,因为正向求成本函数是可以完全看到正确的,刚好借正向的结果以及导数原本的意义验证梯度,不过梯度很耗时,我们不会在每次迭代的时候都验证一下,偶尔即可,哈哈。
1、 网络值初始化很重要,不能初始化为0,会导致网络的对称问题意思是每层的每个隐藏单元学的都是一样的东西,这样训练得到的结果可能还不如逻辑斯特回归;网络权重也不能初始化太大,这个好理解,步伐太大,不细致;对于激活函数采用relu函数的网络,通常初始化的时候在标准正态分布初始化的基础上乘以sqrt(2/n(l-1))是很好的。
2、 L2正则化是要在原来的成本函数上加上一个正则项(λ/2m*),由于梯度下降是根据成本函数求导,所以自然在反向传播函数求梯度的时候也要对应的有正则项(λ/m*w[l]),正是这个正则项所以L2正则化,有时候又称之为“权重衰减”(w-α(dw+λ/m*w[l])=(1-α*λ/m)*w-α*dw)这样是一个完整的一次迭代过程;dropout正则化则是在每次迭代中会随机不用一些隐藏单元,正向传播不用哪些,反向传播就与之对应,实现这种目的的方法是正向传播以一层为例有4步(注意一般不在输入层和输出层使用),
D1 =np.random.rand(A1.shape[0],A1.shape[1])
D1 =D1<keep_prob (确实是小于,小于部分的概率才比较大)
A1 =A1*D1
A1 = A1/keep_prob
反向传播以一层为例有2步,
dA2 =dA2*D2
dA2 = dA2/keep_prob
所以每次好像这个网络都不一样,但由于成本保持相对一致,似乎也是个有趣的过程。
3、梯度检验的时候有将字典转换为向量矩阵和反之的过程,这主要是因为日常的网络计算的时候我们都是将过程参数缓存在字典中,要用再取。