AI学习之深度学习系列---提前终止

深度学习正则化—提前终止

本篇文章旨在解决下面四个问题:
1. 什么是提前终止?
2. 提前终止有什么好处?
3. 为什么提前终止会有用?
4. 怎么实现提前终止?

问题1、2与4的答案
提前终止的目的是为了防止过拟合,如果我们只要返回使验证误差最低的参数,就可以获得验证集误差更低的模型。
AI学习之深度学习系列---提前终止
图1.学习曲线(横轴为训练轮次,纵轴为负的对数似然)
对图1的注释:
蓝色曲线表示训练集上的loss随着训练轮次的变化而变化的情况。
红色曲线表示测试集上的loss随着训练轮次的变化而变化的情况。
注释:红色曲线是每训练完一个epoch后就测试一次所得到的曲线。
从图中可以看出,测试误差在前几个epoch中逐渐减小,但是训练到某个epoch后,测试误差又有了小幅度的增大。这说明此时发生了过拟合。

发生过拟合是我们所不愿意看见的,我们可以利用提前终止(early stopping)
来防止过拟合的发生。

提前终止是指:在测试误差开始上升之前,就停止训练,即使此时训练尚未收敛(即训练误差未达到最小值)。

首先我们要保存好现在的模型(网络结构和权值),训练num_batch次(即一个epoch),得到新的模型。将测试集作为新模型的输入,进行测试。如果我们发现测试误差比上次得到的测试误差大,我们并不会马上终止测试,而是再继续进行几个epoch的训练与测试,如果测试误差依旧没有减小,那么我们就认为该试验在上一次达到最低测试误差时停下来。具体算法可参见《deep learning》

问题3的答案
该问题是为了回答为什么提前停止可以起到正则化的作用。
首先,我们对损失函数在ω的邻域内用Taylor展开式展开(只展开至二次),则有

J(ω)=J(ω)+1/2(ωω)TH(ωω)

其中H是Hessian矩阵。这里之所以没有一阶导数的信息,是因为ω是最优解,在ω的邻域中,可以近似地认为梯度为0。
J(ω)求梯度,得到
ωJ(ω)=H(ωω)

我们将参数向量ω(0)初始化为原点0。由梯度下降法,可以得到如下公式:
ω(τ)=ω(τ1)αωĴ (ω(τ1))

ω(τ)=ω(τ1)αH(ω(τ1)ω)

ω(τ)ω=(IαH)(ω(τ1)ω)

将H进行特征值分解:H=QTπQ,其中Q是标准正交矩阵,π是对角矩阵。
那么
ω(τ)ω=QT(Iαπ)Q(ω(τ1)ω)

Q(ω((τ))ω)=(Iαπ)Q(ω((τ1))ω)

其中α足够小以保证|1απi|<1

Qω(τ)=(I(Iαπ)τ)Qω

在分析L2正则项的时候,Qω̃ =(I(π+εI)1ε)Qω
由上面两个式子比较可知,如果下式成立:

(π+εI)1ε=(Iαπ)τ

则L2正则化和提前终止可以认为是等价的。进一步,有
ε/(πi+ε)=(1απi)τ

两侧取对数,可知:
log(ε/(πi+ε))=τlog(1απi)

作一个简单的近似:

log(1+πi/ε)=τlog(1απi)

πi/ε=ατπi

(比较Taylor展开式的第一个非常数项,Taylor展开式是唯一的)
从而

τ=1/αε

以上的推导说明了提前终止可以起到正则化的作用。

附录:
对图1的横轴的解释:
Epoch: 使用训练集的全部数据对模型进行一次完整训练,被称之为一代训练.
Batch: 使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分样本被称为一批数据.
Iteration: 使用一个Batch数据对模型进行一次参数更新的过程,称之为一次训练.
下面以一个实例来解释这三个概念:
CIFAR10数据集中有50000张训练图片,10000张测试图片。现在选择Batch size = 256对模型进行训练。
则每个Epoch要训练的图片数量:50000
训练集具有的Batch个数:50000/256 = 195 + 1 = 196
每个Epoch需要完成的Batch个数:196
每个Epoch需要完成的Iteration个数:196
每个Epoch中发生模型权重更新的次数:196
训练10代后,模型权重更新的次数:1960
不同代的训练,其实用的是同一个训练集的数据。但是因为不同代的模型实际上是处在模型空间的不同位置,越往后,越接近谷底.

[1] http://www.friskit.me/2017/03/27/l2-equals-to-stop-early/
[2] https://zhuanlan.zhihu.com/p/29409502
[3] Bengio大神的《deep learning》