参考: 吴恩达视频课 深度学习笔记
深度学习是一个典型的迭代过程,迭代的效率很关键
创建高质量的训练数据集,验证集和测试集有助于提高循环效率
切分标准: 小数据量时代,常见做法是三七分,70%验证集,30%测试集;也可以 60%训练,20%验证和20%测试集来划分。 大数据时代,数据量可能是百万级别,验证集和测试集占总量的比例会趋于变得更小。 我们的目的就是验证不同的算法,检验哪种算法更有效,不需要拿出20%的数据作为验证集,很少的一部分占比的数据就已经足够多了。数据来源: 最好要确保 验证集 和 测试集 的数据来自同一分布,因为要用验证集来评估不同的模型,如果验证集和测试集来自同一个分布就会很好关键数据: 训练集误差、验证集误差
如果最优误差(贝叶斯误差,人分辨的最优误差)非常高,比如15%。那么上面第二种分类器(训练误差15%,验证误差16%),15%的错误率对训练集来说也是非常合理的,偏差不高,方差也非常低。 (以上基于假设:基本误差很小,训练集和验证集 来自相同分布)
根据这两个指标,更好的优化算法。
正则化有助于防止过拟合,降低方差
范数(norm) 几种范数的简单介绍
L1 范数: ∣ ∣ X ∣ ∣ 1 = ∑ i = 1 n ∣ x i ∣ ||X||_1 = \sum\limits_{i=1}^n |x_i| ∣∣X∣∣1=i=1∑n∣xi∣ 表示非零元素的绝对值之和L2 范数: ∣ ∣ X ∣ ∣ 2 = ∑ i = 1 n x i 2 ||X||_2 = \sqrt{\sum\limits_{i=1}^n {x_i}^2} ∣∣X∣∣2=i=1∑nxi2 表示元素的平方和再开方 矩阵的范数叫做:弗罗贝尼乌斯范数,所有元素的平方和 ∣ ∣ W ∣ ∣ F 2 ||W||_F^{2} ∣∣W∣∣F2加上 L2 正则化 的损失函数: J ( ω , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ 2 m ∥ ω ∥ 2 2 J(\omega, b)=\frac{1}{m} \sum_{i=1}^{m} \mathcal L \left(\hat{y}^{(i)}, y^{(i)}\right)+\frac{\lambda}{2 m}\|\omega\|_{2}^{2} J(ω,b)=m1i=1∑mL(y^(i),y(i))+2mλ∥ω∥22
L1 正则,权重 w 最终变得稀疏,多数变成 0L2 正则,使得权重衰减W [ l ] = ( 1 − α λ m ) ∗ W [ l ] − α ( 梯 度 ) W^{[l]} = (1-\frac{\alpha\lambda}{m})*W^{[l]} - \alpha(梯度) W[l]=(1−mαλ)∗W[l]−α(梯度) 权重不但减少了,还乘以了小于1的系数进行衰减
J ( ω , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ 2 m ∥ ω ∥ 2 2 J(\omega, b)=\frac{1}{m} \sum_{i=1}^{m} \mathcal L \left(\hat{y}^{(i)}, y^{(i)}\right)+\frac{\lambda}{2 m}\|\omega\|_{2}^{2} J(ω,b)=m1i=1∑mL(y^(i),y(i))+2mλ∥ω∥22
当 λ \lambda λ 设置的很大的时候,最终 W W W 会变得很接近于 0,神经网络中的很多单元的作用变得很小,整个网络越来越接近逻辑回归
λ \lambda λ 增大时,整个神经网络会计算离线性函数近的值,这个线性函数非常简单,不是复杂的高度非线性函数,不会发生过拟合
L2 正则化是 训练深度学习模型时最常用的一种方法
以上是一个样本的过程,其他样本也是同样的过程。
实施 dropout 举例:最常用的方法 - inverted dropout(反向随机失活)
用一个三层网络举例
定义向量 d d d , d [ 3 ] d^{[3]} d[3] 表示一个三层的 dropout 向量 d3 = np.random.rand(a3.shape[0],a3.shape[1]),对于元素小于 keep-prob 的,对应为 0,其概率为 1 - keep_prob获取激活函数 a [ 3 ] a^{[3]} a[3], a3 = np.multiply(a3, d3),使得 d [ 3 ] d^{[3]} d[3] 中为 0 的元素把 a [ 3 ] a^{[3]} a[3] 对应元素归零向外扩展 a [ 3 ] a^{[3]} a[3],a3 /= keep_prob反向随机失活(inverted dropout)方法通过除以keep-prob,确保 a [ 3 ] a^{[3]} a[3] 的期望值不变
dropout 一大缺点就是:代价函数不再被明确定义,每次迭代,都会随机移除一些节点,想检查梯度下降的性能,实际上是很难进行复查的
可以先关闭dropout,将keep-prob 设置为 1,确保 J 函数单调递减然后再尝试打开dropout水平翻转;随意剪裁旋转放大(这种方式扩增数据,进而正则化数据集,减少过拟合成本很低)
对于数字识别图片,我们可以进行旋转,扭曲来扩增数据集
early stopping 在验证集误差变坏的时候,提早停止训练early stopping 缺点:不能同时处理 过拟合 和 代价函数不够小的问题
提早停止,可能代价函数 J 不够小不提早结束,可能会过拟合不使用 early stopping ,那么使用 L2 正则,这样训练时间可能很长,参数搜索空间大,计算代价很高
early stopping 优点:只运行一次梯度下降,可以找出 w 的较小值,中间值,较大值,无需尝试 L2 正则化超参数 λ \lambda λ 的很多值
归一化输入,可以加速训练
零均值(所有的数据减去均值)归一化方差(所有数据除以方差)注意: μ , σ 2 \mu, \sigma^2 μ,σ2 是由训练集得到,然后用于其他所有数据集
在非常深的神经网络中,权重只要不等于 1,激活函数将会呈指数级递增或者递减,导致训练难度上升,尤其是梯度与 L 相差指数级,梯度下降算法的步长会非常非常小,学习时间很长。
上面讲到了梯度消失/爆炸,如何缓解这个问题?
为了预防 z 的值 过大 或 过小,n 越大时,你希望 wi 越小,合理的方法是 w i = 1 / n w_i = 1/n wi=1/n,n 是输入特征数量
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 ( 1 n [ l − 1 ] ) w^{[l]} = np.random.randn(shape)*np.sqrt(\frac{1}{n^{[l-1]}}) w[l]=np.random.randn(shape)∗np.sqrt(n[l−1]1), n [ l − 1 ] n^{[l-1]} n[l−1] 是给第 l l l 层输入的特征数量
如果使用ReLu激活函数(最常用), ∗ n p . s q r t ( 2 n [ l − 1 ] ) *np.sqrt(\frac{2}{n^{[l-1]}}) ∗np.sqrt(n[l−1]2)如果使用tanh激活函数, 1 n [ l − 1 ] \sqrt \frac{1}{n^{[l-1]}} n[l−1]1 ,或者 2 n [ l − 1 ] + n [ l ] \sqrt \frac{2}{n^{[l-1]}+n^{[l]}} n[l−1]+n[l]2 这样设置的权重矩阵既不会增长过快,也不会太快下降到 0 从而训练出一个权重或梯度不会增长或消失过快的深度网络 我们在训练深度网络时,这也是一个加快训练速度的技巧
在反向传播时,有个测试叫做梯度检验
我们使用双边误差, f ′ ( θ ) = f ( θ + ε ) − f ( θ − ε ) 2 ε \left.f^{\prime}( \theta\right)=\frac{f(\theta+\varepsilon)-f(\theta-\varepsilon)}{2 \varepsilon} f′(θ)=2εf(θ+ε)−f(θ−ε) 不使用单边误差,因为前者更准确。
梯度检验帮助我们发现反向传播中的 bug
d θ approx [ i ] = J ( θ 1 , θ 2 , … θ i + ε , … ) − J ( θ 1 , θ 2 , … θ i − ε , … ) 2 ε d \theta_{\text {approx }}[i]=\frac{J\left(\theta_{1}, \theta_{2}, \ldots \theta_{i}+\varepsilon, \ldots\right)-J\left(\theta_{1}, \theta_{2}, \ldots \theta_{i}-\varepsilon, \ldots\right)}{2 \varepsilon} dθapprox [i]=2εJ(θ1,θ2,…θi+ε,…)−J(θ1,θ2,…θi−ε,…)
d θ [ i ] = ∂ J ∂ θ i d \theta[i]=\frac{\partial J}{\partial \theta_{i}} dθ[i]=∂θi∂J
检验 d θ approx [ i ] ≈ d θ [ i ] d \theta_{\text {approx }}[i] \approx d \theta[i] dθapprox [i]≈dθ[i]
∥ d θ approx − d θ ∥ 2 ∥ d θ approx ∥ 2 + ∣ ∣ d θ ∣ ∣ 2 \frac{\left\|d \theta_{\text {approx }}-d \theta\right\|_{2}}{ \left\|d \theta_{\text {approx }}\right\|_{2}+||d \theta||_2} ∥dθapprox ∥2+∣∣dθ∣∣2∥dθapprox −dθ∥2 检查上式的值是否 < 1 0 − 7 < 10^{-7} <10−7
02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面(作业:初始化+正则化+梯度检验)
我的博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!