关于训练
参数和超参数
回顾有监督学习:
给定训练数据 { ( x i , y i ) , i = 1 , ⋯ , n } i . i . d . \{(x_i,y_i),i=1,\cdots,n\}\quad \mathrm{i.i.d.} { (xi,yi),i=1,⋯,n}i.i.d.来自同一分布 D D D
找到 y = f ( x ) ∈ H y=f(x)\in \mathscr{H} y=f(x)∈H
s . t . f \mathrm{s.t.}\quad f s.t.f能在测试集( i . i . d . \mathrm{i.i.d.} i.i.d.来自同一分布 D D D)上表现良好
需要通过损失函数(loss function):
L ( f ) = E ( x , y ) ∼ D [ l ( f , x , y ) ] L(f)=\mathbb{E}_{(x,y)\sim D}[l(f,x,y)] L(f)=E(x,y)∼D[l(f,x,y)]
来衡量模型的数据处理能力。即衡量 f f f是否在测试集上表现良好。这就需要找到一个 y = f ( x ) ∈ H y=f(x)\in \mathscr{H} y=f(x)∈H,最小化loss值:
L ^ ( f ) = 1 n ∑ i = 1 n l ( f , x i , y i ) \hat{L}(f)=\dfrac1n\sum_{i=1}^nl(f,x_i,y_i) L^(f)=n1i=1∑nl(f,xi,yi)
训练完成后得到的loss值并不一定尽如人意:
- 有可能 f f f在训练集上表现良好,但在测试集上表现较差。
- 甚至 f f f在训练集上表现也较差。
对于第一种情况,可能是模型过拟合了,需要调整参数,或者进行正则化;第二种情况则可能是欠拟合,此时可能不仅需要调参,甚至需要重新设计网络。
如果出现欠拟合的问题,可能遇到的问题是large bias,即偏差较大。可能是参数没有训练好,也有可能是模型本身不够强。此时的解决方案为:
- 在输入中增加更多的特征(比如区分男女性,可以不仅仅靠身高的高矮来判断,还可以同时考虑头发长度、穿衣打扮等)
- 使用更复杂的、表达能力更强的模型
如果出现过拟合的问题,可能遇到的问题是large variance,即方差较大。此时泛化能力弱,模型可能学出了训练集上的噪声。此时的解决方案:
- 增加训练集的数据量。(这个方法虽然很有效,但并不总是实用。比如有些病灶图像,由于疾病罕见,能获得的图像本就很少,因此难以通过收集增加数据量,此时可以考虑图像增强,人为增加数据量。)
- 正则化,但可能增加bias的误差。
当模型简单的时候,bias会比较大,而variance较小;反之模型复杂的时候,bias会比较小,而variance较大。
参数和超参数
(Model Design + Hyperparameters) -> Model Parameters
模型设计包括:层数、激活函数、优化等
超参数包括:学习率、Dropout等
参数包括:权重、偏置等
实际训练过程中:选择超参数;训练模型;评估性能;改进超参数,构成了一个循环,直到模型能满足要求,循环结束。
设置数据
将所有的数据都作为训练集来训练模型,这种做法是欠妥的,因为这样得到的模型势必会出现过拟合的问题。如果将一部分数据作为测试集,剩下的数据作为训练集,这种做法依然会出现模型过拟合的问题。
更好的做法是,将数据分成训练集、评估(validation)集和测试集三部分。平估集用来确定超参数。常用的划分比例为 6 : 2 : 2 6:2:2 6:2:2或者 7 : 2 : 1 7:2:1 7:2:1。
对于上述方法,如果数据集本身较小,那么 60 % 60\% 60%的数据也不够用于模型训练,此时考虑第四种方法,即交叉检验(Cross-Validation):将训练数据集分成若干个folds,每次选取一个fold作为评估集,来选取超参数,剩下的作为训练集。如下图所示:
最后,将得到的结果平均起来就是最终的模型。这种方法尤其适合小数据集。
梯度下降法
当我们为一个具体的问题设计了一个模型以及评估策略后,所有的机器学习问题都可以形式化为一个最优化问题。优化问题中只有少部分问题可以得到解析解(如通过最小二乘法得到一个真实的解),很大一部分问题只能通过迭代的方式求解,其中最常用的就是梯度下降法和牛顿法。神经网络优化算法,大体都是使用了梯度下降法的框架。
梯度的概念建立在偏导数与方向导数之上。方向导数反映了函数沿某一个方向上的变化率,而梯度就是函数变化最快的那个方向。
以二维平面为例,假设有一函数 f ( x ) f(x) f(x),如果它的导数 f ′ ( x ) > 0 f'(x)>0 f′(x)>0,那么 f ( x ) f(x) f(x)单调递增,即减小 x x x的值就能减小 f ( x ) f(x) f(x)的值,反之亦然。所以,将 x x x向导数相反的方向移动,就能减小 f ( x ) f(x) f(x)。这就是梯度下降。
在机器学习中,我们的目标是优化参数,也就是找到使得loss function取值最小的那些参数值。要找到这样的值可以通过迭代的方式实现。
以一个参数 w w w为例,要求 w ∗ = a r g min w L ( w ) w^*=arg\min \limits_{w} L(w) w∗=argwminL(w)。首先要随机给定一个初始值 w 0 w^0 w0,一般取在 ( 0 , 1 ) (0,1) (0,1)之间。然后计算 d L d w ∣ w = w 0 \dfrac{\mathbb{d}L}{\mathbb{d}w}|_{w=w^0} dwdL∣w=w0,随后就能得到 w 1 , w 1 ← w 0 − η d L d w ∣ w = w 0 w^1,\quad w^1\leftarrow w^0-\eta\dfrac{\mathbb{d}L}{\mathbb{d}w}|_{w=w^0} w1,w1←w0−ηdwdL∣w=w0 ,其中 η \eta η是学习率。因为参数移动的方向是梯度的反方向,所以前面的式子中用的是减号。
如果有两个参数 w , b w,b w,b,问题就变成了求得 w ∗ , b ∗ = a r g min w , b L ( w , b ) w^*,b^*=arg\min \limits_{w,b} L(w,b) w∗,b∗=argw,bminL(w,b)。解决方法和之前相同,只不过原先求的是导数,现在求的是偏导数。首先要随机给定一个初始值 w 0 , b 0 w^0,b^0