02. 改善深层神经网络:超参数调试、正则化以及优化
第一周 深度学习的实用层面
1.1 训练、验证、测试集
- 机器学习实践是一个高度迭代过程
应用领域:NLP,CV,语音,结构化数据(广告,搜索,安全,物流) - 训练、验证、测试数据集
训练、测试:70,30
训练验证测试:60,20,20
大数据背景下,验证、测试集所占比例更小。 - 训练测试集分布不匹配
要确保验证集和测试集来自同一分布
即使没有测试集也可以(测试集用于无偏估计)
1.2 偏差、方差
- 偏差和方差
欠拟合、适度拟合、过拟合 - 偏差和方差例子
- 高偏差高方差
1.3 机器学习基础
- 机器学习基础
(1) 高偏差?若训练集上偏差也高,则需要寻找新的网络(更大的网络)
(2) 高方差?若验证集上方差也高,则需要更多的数据,或正则化,或新的网络
1.4 正则化
- 逻辑回归
(1) L2正则化: J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ m ∥ w ∥ 2 2 J(w,b) = \frac{1}{m}\sum_{i=1}^m L(\hat{y}^{(i)}, y^{(i)})+\frac{\lambda}{m} \| w \|_2^2 J(w,b)=m1∑i=1mL(y^(i),y(i))+mλ∥w∥22
(2) L1正则化,确保稀疏
(3) 编程时,为避免与python保留字段重复, λ \lambda λ写为lambd - 神经网络
(1) J ( w [ 1 ] , b [ 1 ] , ⋯ , ( w [ L ] , b [ L ] ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ m ∑ l = 1 L ∥ w ∥ F 2 J(w^{[1]},b^{[1]}, \cdots, (w^{[L]},b^{[L]}) = \frac{1}{m}\sum_{i=1}^m L(\hat{y}^{(i)}, y^{(i)})+\frac{\lambda}{m} \sum_{l=1}^{L}\| w \|_F^2 J(w[1],b[1],⋯,(w[L],b[L])=m1∑i=1mL(y^(i),y(i))+mλ∑l=1L∥w∥F2
(2) 矩阵的F范数的平方是矩阵中所有元素的平方和
1.5 为什么正则化可以减少过拟合?
- 正则化如何组织过拟合?
- 另一个例子
1.6 Dropout正则化
- 对于每个节点,以概率消除或保留
- 实施dropout(反向随机失活)
假设有一3层网络
d3 = np.random.rand(a3.shape[0], a3.shape[1])<keep-prob
a3 = np.multiply(a3, d3)
a3 /= keep-prob - 在测试阶段做出预测
在测试阶段不适用dropout
1.7 理解Dropout
- 为什么dropout起作用?
(1) 直觉:不能依靠任何单一特征,所以不会给某个特征增加权重,最终结果是形成对于权重类似于l2的正则化。
(2) 不同层的keep-prob可以不同,通常若参数矩阵较大,则设置keep-prob较小。
(3) 计算机视觉中使用非常多,在其他领域中较少。
(4) 缺点:代价函数J不再显式定义。解决方法:首先将keep-prob设为1,调试代码,使J单调下降,然后再调试keep-prob。
1.8 其他正则化方法
- 数据扩增
通过对原数据的简单变化,增加训练数据集 - 早期停止
正交化
缺点:不能分别独立地处理最优化和防止过拟合两个工作。
1.9 归一化输入
- 归一化训练集
(1) 步骤:a. 0均值 x : = x − μ x:=x-\mu x:=x−μ b.方差归一化 d / = δ 2 d/=\delta^2 d/=δ2 - 为什么归一化输入?
1.10 梯度消失与梯度爆炸
- 梯度消失和梯度爆炸
1.11 神经网络的权重初始化
- 单个神经元示例
(1) w [ l ] = n p . r a n d o m . r a n d n ( s h a p e ) ∗ n p . s q r t ( 2 n [ l − 1 ] ) w^{[l]}=np.random.randn(shape)*np.sqrt(\frac{2}{n^{[l-1]}}) w[l]=np.random.randn(shape)∗np.sqrt(n[l−1]2)
1.12 梯度的数值逼近
- 检验梯度计算
双边公差比单边公差更逼近精确值,双边公差的误差为 O ( ϵ 2 ) O(\epsilon^2) O(ϵ2),单边公差的误差为 O ( ϵ ) O(\epsilon) O(ϵ)。
1.13 梯度检验
- 神经网络的梯度检验
(1) 将全部参数矩阵reshape为一个向量 θ \theta θ
(2) 将全部导数矩阵reshape为一个向量 d θ d\theta dθ - 梯度检验
(1) 对于每个i,计算 d θ a p p r o x [ i ] = J ( θ 1 , θ 2 , ⋯ , θ i + ϵ , ⋯ ) − J ( θ 1 , θ 2 , ⋯ , θ i − ϵ , ⋯ ) 2 ϵ = d θ [ i ] = ∂ J ∂ θ i d\theta_{approx}[i]=\frac{J(\theta_1, \theta_2, \cdots, \theta_i+\epsilon, \cdots)-J(\theta_1, \theta_2, \cdots, \theta_i-\epsilon, \cdots)}{2\epsilon} = d\theta[i]= \frac{\partial J}{\partial \theta_i} dθapprox[i]=2ϵJ(θ1,θ2,⋯,θi+ϵ,⋯)−J(θ1,θ2,⋯,θi−ϵ,⋯)=dθ[i]=∂θi∂J
(2) 检查 ∥ d θ a p p r o x − d θ ∥ 2 \| d\theta_{approx} - d\theta \|_2 ∥dθapprox−dθ∥2, 若是小于 1 0 − 7 10^{-7} 10−7则比较好,在 1 0 − 5 10^{-5} 10−5则要小心,若大于 1 0 3 10^{_3} 103则要小心。
1.14 关于梯度检验实现的注记
- 不要在训练中使用,只是用于调试中。
- 如果检验错误,则要每一项都要检查。
- 注意不要丢了正则项。
- 梯度检验和dropout不能同时使用。
- 随机初始化,训练后可能会有问题。