第一周深度学习实践
本文使用的标号为b站视频中的标号。
1.9 归一化输入(标准化)
第一步:零均值化
第二步:归一化方差
X:=X-μ
X:=X/sigmoid**2
最终:
归一化输入通常能帮助学习算法运行更快。如果输入特征处在不同的范围内时,归一化特征值就非常重要。执行这类归一化不会产生什么危害。
1.10 梯度消失与梯度爆炸
在深层神经网络中,如果权重𝑊只比 1 略大一点,或者说只是比单位矩阵大一点,深度神经网络的激活函数将爆炸式增长,如果𝑊比 1 略小一点,在深度神经网络中,激活函数将以指数级递减,虽然只是讨论了激活函数以与𝐿相关的指数级数增长或下降,它也适用于与层数𝐿相关的导数或梯度函数,也是呈指数级增长或呈指数递减。
1.11 神经网络的权重初始化
希望设置的权重矩阵既不会增长过快,也不会太快下降到 0,从而训练出一个权重或梯度不会增长或消失过快的深度网络。我们在训练深度网络时,这也是一个加快训练速度的技巧。
思路是让 w与 n有关,且 n越大,w应该越小才好。一种方法是在初始化w时,令其方差为 1/n,这里称为Xavier initialization。
针对tanh激活函数的Xavier初始化
WL = np.random.randn (WL.shape[0], WL.shape[1]) * np.sqrt (1/n)
这样,激活函数的输入 公式 近似设置成均值为0,标准方差为1,神经元输出 公式 的方差就正则化到1了。虽然没有解决梯度消失和爆炸的问题,但其在一定程度上确实减缓了梯度消失和爆炸的速度。
如果使用relu激活函数,权重w的初始化一般令其方差等于2/n[l-1](2除以前一层的维度),叫做He initialization。
w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(2/n[l-1])
1.12 梯度的数值逼近
当epsilon越小时,结果越接近真实的导数,也就是梯度值。可以使用这种方法来判断反向传播进行梯度下降时,是否出现了错误。
双边误差公式的结果比单边误差精确。
1.13 梯度检验
当我们计算出数值梯度后,要进行梯度检查,来验证训练过程中是否有问题。
如果在1e-7,说明实施正确,1e-3则很有可能出现错误。
1.14 关于梯度检验实现的注记
-
在进行神经网络训练的时候,不要进行梯度检验,只在调试的时候进行。(搭建好神经网络模型的时候,先进行调试,这时进行梯度检验,调试好之后,进行训练的时候关闭梯度检验。因为梯度检验耗费的时间太大)
-
如果梯度检验失败,仔细检查每一项。因为theta表示所有b和w,d theta表示所有的db,dw,找到对应出错的梯度 (即与 的值相差比较大的项) ,检查其推导是否出现错误。
-
计算近似梯度时,如果有正则化项,要记住带上正则项。这时J(θ)的定义为
-
梯度检查时关闭dropout,检查完毕后再打开dropout。