训练误差和泛化误差
- 训练误差(training error)是指, 模型在训练数据集上计算得到的误差。
- 泛化误差(generalization error):模型在新数据上的误差
- 例:根据模考成绩来预测未来考试分数
- 在过去考试中表现很好(训练误差) 不代表未来考试一定会好(泛化误差)
- 学生A通过背书在模考中拿到好成绩
- 学生B知道答案后面的原因
验证数据集和测试数据集
-
训练数据集: =》 训练模型参数
-
验证数据集:一个用来评估模型好坏的数据集 =》选择模型超参数
-
例如拿出50%的训练数据
-
不要跟训练数据混在一起
-
-
测试数据集:只用一次的数据集
- 未来的考试
- 房子的实际成交价
K-折交叉验证
- 在没有足够多数据时使用(非大数据集)
- 算法:
- 将训练数据分割成k块
- For i = 1, …, k
- 使用第 i 块作为验证数据集,其余作为训练数据集
- 报告K个验证集误差的平均
- 常用:K=5或10 ,相当于将数据训练K次,然后求得K的平均误差
- 可以用于确定超参数,取其中均值效果较好的,也可用随机森林将进行预测选择
过拟合和欠拟合
模型容量:模型的复杂度,拟合各种函数的能力
- 低容量的模型难以拟合训练数据
- 高容量的模型可以记住所有的训练数据
估计模型容量
- 难以在不同的种类算法之间比较
- 例如树模型和神经网络
- 给定一个模型种类,将有两个主要因素
- 参数的个数
- (d+1:d个输入的权重,加1个偏差)
- ( (d+1)m+(m+1)k:m层个d+1,加上(m+1)*输出k )
- 参数值的选择范围
- 参数的个数
VC维
-
对于一个分类模型,VC等于一个最大的数据集的大小,不管如何给定标号,都存在一个模型来对它进行完美分类
-
例:线性分类器的VC维
-
2维输入的感知机 VC维 = 3
-
能够分类任何三个点,但不是4个(xor)
这种情况是不行的:
-
-
支持N为输入的感知机的VC维是N+1
-
一些多层感知机的VC维O(N l o g 2 N log_2N log2N)
-
-
VC维的用处
- 提供为什么一个模型好的理论依据
- 他可以衡量训练误差和泛化误差之间的间隔
- 在深度学习中很少使用
- 衡量不是很准确
- 计算深度学习模型的VC维很困难
- 提供为什么一个模型好的理论依据
数据复杂度
- 样本个数
- 每个样本的元素个数
- 时间、空间结果
- 多样性
权重衰退:处理过拟合
-
使用均方范数作为硬性限制
- 通过限制参数值的选择范围来控制模型容量
- min l(w,b) ,受限于 ∣ ∣ w ∣ ∣ 2 ≤ θ || w ||^2 ≤ θ ∣∣w∣∣2≤θ
- 通常不限制偏移b (限不限制都差不多)
- 小的θ意味着更强的正则项(限制条件)
- 通过限制参数值的选择范围来控制模型容量
-
使用均方范数作为柔性限制
-
对于每个θ,都可以找到 λ 使得之前的目标函数等价于: m i n l ( w , b ) + λ 2 ∣ ∣ w ∣ ∣ 2 min\ l(w,b)+\frac{λ}{2}||w||^2 min l(w,b)+2λ∣∣w∣∣2
- 可以通过拉格朗日乘子来证明
-
超参数λ控制了正则项的重要程度
- λ = 0:无作用
- λ → ∞,最优解 w*→0
-
对损失的影响
-
L2正则项会对大数值的权值进行乘法,估计权值分散,将所有特征运用起来
-
惩罚项就是为了限制参数的取值范围,加入惩罚项会对最优解产生影响
-
正则项就是防止损失函数最优导致过拟合
-
分析如下
- 绿色圆是l,橙色圆是惩罚项
- l2损失在原点处的拉力会小于在曲线上方的拉力 =》也就是梯度大小
- 因此惩罚对于 W ~ ∗ \widetilde W* W ∗的拉力会大于W *,而W再往橙色靠,惩罚项弥补不了损失项,因此 W * 在惩罚和损失的情况最优
-
-
-
参数更新法则
- 计算梯度
- ∂ ∂ w ( l ( w , b ) + λ 2 ∣ ∣ w ∣ ∣ 2 ) = ∂ l ( w , b ) ∂ w + λ w \large \frac{∂}{∂w}(\mathcal l(w,b)+\frac{λ}{2}||w||^2) = \frac{∂l(w,b)}{∂w} + λw ∂w∂(l(w,b)+2λ∣∣w∣∣2)=∂w∂l(w,b)+λw
- 时间 t 更新参数
w
t
+
1
=
w
t
−
η
∂
∂
w
t
\large w_{t+1}= w_t-\eta\frac{∂}{∂w_t}
wt+1=wt−η∂wt∂
- w t + 1 = ( 1 − η λ ) w t − η ∂ l ( w t , b t ) ∂ w t \large w_{t+1} = (1-\eta λ)w_t-\eta\frac{∂l(w_t,b_t)}{∂w_t} wt+1=(1−ηλ)wt−η∂wt∂l(wt,bt)
- 通常 η λ \eta λ ηλ < 1 ,在深度学习中叫做权重衰退
- 想要让损失函数降低就要往梯度的反方向走,因此需要减去梯度 =》梯度下降
- 计算梯度
权重衰退知识总结
- 权重衰退通过L2正则项使得模型参数不会过大,从而控制模型的复杂度
- 正则项权重是控制模型复杂度的超参数
动机
- 一个好的模型需要对输入数据的扰动鲁棒
- 使用有噪音的数据等价于Tikhonov正则
- 丢弃法:在层之间加入噪音
无偏差的加入噪音
- 对于x加入噪音得到x,我们希望 E[ x’ ] = x =》 E [ x ′ ] = p ⋅ 0 + ( 1 − p ) x i 1 − p = x i \large E[ x' ] = p·0+(1-p)\frac{x_i}{1-p} = x_i E[x′]=p⋅0+(1−p)1−pxi=xi
- 丢弃法对每个元素进行如下扰动: x i ′ = { 0 , 给定概率p x i 1 − p , otherwise \large x'_i= \begin{cases} 0, & \text{给定概率p}\\ \frac{x_i}{1-p},& \text{otherwise} \end{cases} xi′=⎩⎨⎧0,1−pxi,给定概率potherwise
使用Dropout
- 通常将其作用在隐藏全连接层的输出上
- h = σ ( W 1 x + b 1 ) h = \sigma(W_1x+b_1) h=σ(W1x+b1) h’ = dropout(h)
- o = W 2 h ′ + b 2 o =W_2h' + b_2 o=W2h′+b2
- y = softmax(o)
推理(预测)中的Dropout
- 正则项只在训练中使用:他们影响模型参数的更新
- 在推理过程中,dropout直接返回输入 h = dropout( h ) ,能保证准确性的输出
Dropout总结
- Dropout将一些输出项随机置为0来控制模型复杂度
- dropout常作用域多层感知机的隐藏层输出上
- 概率是控制模型复杂度的超参数
神经网络的梯度
- 考虑一个具有L层、输入x和输出o的深层网络。 每一层l由变换fl定义, 该变换的参数为权重W(l), 其隐藏变量是h(l)(令 h(0)=x)。 我们的网络可以表示为: h t = f t ( h t − 1 ) a n d y = l ○ f d ○ . . . ○ f 1 ( x ) h^t = f_t(h^{t-1}) and y =\mathcal l ○f_d○...○f_1(x) ht=ft(ht−1)andy=l○fd○...○f1(x)
- 计算损失 l 关于参数
W
t
W_t
Wt 的梯度
- ∂ l ∂ W t = ∂ l ∂ h d ∂ h d ∂ h d − 1 . . . ∂ h t + 1 ∂ h t ∂ h t ∂ W t ⏟ d − t 次 矩 阵 乘 法 \large \frac{\partial l}{\partial W^t} = \underbrace {\frac{\partial l}{\partial h^d} \frac{\partial h^d}{\partial h^{d-1}} ... \frac{\partial h^{t+1}}{\partial h^t}\frac{\partial h^{t}}{\partial W^t}}_{d-t次矩阵乘法} ∂Wt∂l=d−t次矩阵乘法 ∂hd∂l∂hd−1∂hd...∂ht∂ht+1∂Wt∂ht
稳定性的常见两个问题
- 梯度下降
- 梯度消失
- 例子:MLP
- f t ( h t − 1 ) = σ ( W t h t − 1 ) f_t(h^{t-1}) = \sigma(W^th^{t-1}) ft(ht−1)=σ(Wtht−1) σ \sigma σ 是激活函数
- ∂ h t ∂ h t − 1 = d i a g ( σ ′ ( W t h t − 1 ) ) ( W t ) T \large \frac{\partial h^t}{\partial h^{t-1}} = diag(\sigma'(W^th^{t-1}))(W^t)^T ∂ht−1∂ht=diag(σ′(Wtht−1))(Wt)T σ ′ \sigma' σ′是 σ \sigma σ 的导数函数
- ∏ i = t d − 1 ∂ h i + 1 ∂ h t i = ∏ i = t d − 1 d i a g ( σ ′ ( W i h i − 1 ) ) ( W i ) \prod^{d-1}_{i = t} \frac{\partial h^{i+1}}{\partial h^{ti}} = \prod^{d-1}_{i = t} diag(\sigma'(W^ih^{i-1}))(W^i) ∏i=td−1∂hti∂hi+1=∏i=td−1diag(σ′(Wihi−1))(Wi)
梯度爆炸的问题
- 值超出值域
- 对于16位浮点数尤为严重(6e-5 - 6e4)
- 对学习率敏感
- 如果学习率太大->打参数值->更大的梯度
- 如果学习率太小->训练无进展
- 我们可能需要在训练过程不断调整学习率
梯度消失的问题
- 使用sigmoid作为激活函数
-
σ ( x ) = 1 1 + e − x \sigma(x) =\frac{1}{1+e^{-x}} σ(x)=1+e−x1 σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x) = \sigma(x)(1-\sigma(x)) σ′(x)=σ(x)(1−σ(x))
- -
∏ i = t d − 1 ∂ h i + 1 ∂ h t i = ∏ i = t d − 1 d i a g ( σ ′ ( W i h i − 1 ) ) ( W i ) \large \prod^{d-1}_{i = t} \frac{\partial h^{i+1}}{\partial h^{ti}} = \prod^{d-1}_{i = t} diag(\sigma'(W^ih^{i-1}))(W^i) ∏i=td−1∂hti∂hi+1=∏i=td−1diag(σ′(Wihi−1))(Wi)的元素值是d-t个小数值的乘积
-
- 梯度值变为0
- 对16位浮点数尤为严重
- 训练没有进展
- 不管如何选择学习率
- 对于底部层尤为严重
- 仅仅顶部层训练的较好
- 无法让神经网络更深
如何让训练更加稳定
- 目标:让梯度值在合理的范围内,如[1e-6,1e3]
- 将乘法变加法,如 ResNet,LSTM
- 归一化: 梯度归一化,梯度裁剪
- 合理的权重初始和激活函数
让每层的方差是一个常数
- 将每层的输出和梯度看做是随机变量
- 让他们的均值和方差都保持一致
权重初始化
- 在合理值区间随机初始参数
- 训练开始的时候更容易有数值不稳定
- 原理最优解的地方损失函数表变可能很复杂
- 最优解附近表面会比较平
- 使用 N ( 0 , 0.01 ) \mathcal N(0,0.01) N(0,0.01) 来初始可能对小网络没问题,但不能保证深度神经网络
- 合理的权重初始值和激活函数的选取可以提升数值稳定性