1. 深度学习的实用层面
1.1 训练、开发、测试集
1.1.1 作用
(1)训练集:用来训练模型;
(2)验证机:通过验证集选择最好的模型,确定最终模型;
(3)测试集:测试最终效果。
1.1.2 划分比例
数据规模 | 训练集 | 验证集 | 测试集 |
---|---|---|---|
小数据量(10-10000) | 70% | - | 30% |
60% | 20% | 20% | |
100万 | 98% | 1% | 1% |
>100万 | 99.5% | 2.5% | 2.5% |
注:确保验证集和测试集来自同一分布
1.2 偏差和方差
1.2.1 区别
方差: 是预测值自身的一个指标;
偏差: 是预测值和真实值的一个指标。
1.2.2 示例
1.2.3 高偏差或高方差的处理情况
1.4 正则化
1.4.1 正则化的作用
深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但你可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高,但正则化通常有助于避免过拟合或减少你的网络误差。
1.4.2 L 2 L2 L2 正则化
J ( w , b ) = 1 2 ∑ i = 1 m L ( y ^ i , y i ) + λ 2 m ∣ ∣ w ∣ ∣ 2 2 J(w, b) = {1\over2} \sum_{i=1}^m L(\hat{y}^{i}, y^{i}) + {\lambda \over{2m}} ||w||^2_2 J(w,b)=21i=1∑mL(y^i,yi)+2mλ∣∣w∣∣22
其中:
λ \lambda λ :正则化参数,通常使用验证机来配置这个参数
∣ ∣ w ∣ ∣ 2 2 ||w||^2_2 ∣∣w∣∣22 :欧几里得范数(2范数)的平方,其中:
∣ ∣ w ∣ ∣ 2 2 = ∑ n j = 1 w j 2 = w T w ||w||^2_2= \underset{j=1}{\overset{n}{\sum}} w^2_j=w^Tw ∣∣w∣∣22=j=1∑nwj2=wTw
1.5 为什么正则化可以减少过拟合
左图是高偏差,右图是高方差,中间是Just Right。
在我们来看下这个庞大的深度拟合神经网络。我知道这张图不够大,深度也不够,但你可以想象这是一个过拟合的神经网络。
直观上理解就是如果正则化 λ \lambdaλ 设置得足够大,权重矩阵 w ww 被设置为接近于0的值,直观理解就是把多隐藏单元的权重设为0,于是基本上消除了这些隐藏单元的许多影响。如果是这种情况,这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑回归单元,可是深度却很大,它会使这个网络从过度拟合的状态更接近左图的高偏差状态。
但是 λ \lambda λ 会存在一个中间值,于是会有一个接近“Just Right”的中间状态。
直观理解就是 λ \lambda λ 增加到足够大, w w w 会接近于0,实际上是不会发生这种情况的,我们尝试消除或至少减少许多隐藏单元的影响,最终这个网络会变得更简单,这个神经网络越来越接近逻辑回归,我们直觉上认为大量隐藏单元被完全消除了,其实不然,实际上是该神经网络的所有隐藏单元依然存在,但是它们的影响变得更小了。神经网络变得更简单了,貌似这样更不容易发生过拟合, 因此我不确定这个直觉经验是否有用,不过在编程中执行正则化时,你实际看到一些方差减少的结果。
总结一下,如果正则化参数变得很大,参数 w w w 很小, z z z 也会相对变小,此时忽略 b b b 的影响, z z z 会相对变小,实际上, z z z 的取值范围很小,这个激活函数,也就是曲线函数 t a n h tanh tanh会相对呈线性,整个神经网络会计算离线性函数近的值,这个线性函数非常简单,并不是一个极复杂的高度非线性函数,不会发生过拟合。
1.6 Dropout(随机失活)正则化
1.6.1 Dropout的作用
减少模型过拟合
1.6.2 Dropout为什么可以防止过拟合?
因为它使得模型随机失活一些节点,让模型变得更加简单。 就让人思考一样,如果思考的越多,思考的越久,往往就越准确。减少模型过拟合,就是希望模型结果不要那么准确。所以,减少模型节点,就像人思考的更少,最终想出的结果就不那么准确。
Step1: 对每个节点设置一个随机失活的概率p;
Step2: 模型运行时,随机生成一个失活概率q;
Step3: 如果 q < p, 就将改节点失活; 反之,保持原样。
1.9 归一化输入
作用: 加速网络训练。
1.10 梯度消失和梯度爆炸
梯度消失: 反向传播时,导数变得非常小;
梯度爆炸: 反向传播时,导师变得非常大。
1.11 神经网络的权重初始化
作用: 有助于解决梯度消失和梯度爆炸。
初始化:
一般来说,权重初始化与后续用的激活函数有关,如下表:
激活函数 | 权重初始化 |
---|---|
Relu | 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({2\over{n^{[l-1]}}}) W[l]=np.random.randn(shape)∗np.sqrt(n[l−1]2) |
Tanh | 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({1\over{n^{[l-1]}}}) W[l]=np.random.randn(shape)∗np.sqrt(n[l−1]1) |
其中:
(1)shape表示输入数据的shape;
(2) n [ l − 1 ] n^{[l-1]} n[l−1] 表示输入数据的维度。
如下图:
(1)shape = (1, 4);
(2) n [ l − 1 ] n^{[l-1]} n[l−1] = n [ 1 − 1 ] n^{[1-1]} n[1−1] = n [ 0 ] n^{[0]} n[0] = 4
2. 优化算法
3. 超参数调优、Batch正则化和程序框架
转载:https://blog.csdn.net/qq_41915623/article/details/125860112