神经网络的过拟合

神经网络的过拟合

Time:2021-06-26

前言

在学习过拟合的问题时,认识到了正则化,在研究正则化的原理的路上,又认识到了所谓了NP问题、最大似然估计、先验估计等等,都是我一脸茫然的知识。

Author:雾雨霜星
欢迎来我的个人网站进行学习:
https://www.shuangxing.top/#/passage?id=27

过拟合(overfitting)

过拟合:模型在训练集数据上表现良好的性能,在验证集(或者其他未参与训练的数据)上表现性能不佳。

优化:通过调节模型在训练集数据上取得最佳性能。

泛化:训练后的模型在未见过的数据上取得好的性能。

优化与泛化往往是矛盾的。这是因为,要达到优化的效果,意味着训练过程中不断学习到训练集数据的特点,并且是非常细节的特点也被学习进入到模型,使得模型可以对训练集数据中细小的特征也可以区分开来。这样的结果就是模型会变得复杂,不断地重复这样,最终模型的参数对反映训练集中细微的特点差异非常有效,因为模型参数已经学习到了提取训练集内部非常细微的信息的状况。这时候,模型就进入过拟合的状况了。

但是模型要具备泛化性能,意味着模型要学习的是训练集中最为重要的特点和模式,而不是只反映这些训练集数据的内部信息差异的特点和模式。在训练的初期,网络还没有对训练集中所有相关信息成功提取到并相应建模,此时训练次数的增大,在验证集上的损失一般都是下降的,此时称模型是欠拟合的。

为了平衡优化与泛化,可以从两个角度入手:1.防止模型从数据集中学到错误的或者没有价值的特点和模式 2.对模型允许存储的信息加以约束,迫使模型只记录最为重要的信息。

由此可见,降低过拟合的方法有四种思路:

  1. 获取更多的训练数据,从而凸显数据中最重要的信息特点。
  2. 减少训练次数,使得模型在完成对最重要部分的信息特点的建模后不再继续训练。
  3. 构建规模更小的模型,使得模型本身可以记录信息的数量减少。
  4. 正则化:对模型的参数加入惩罚机制,参数的规模直接影响损失函数大小。

其中思路12为第一角度出发的方法,思路34为第二角度出发的方法。

实现优化与泛化的平衡,意味着需要使用更简单的模型和更少的参数,使用更少的训练资源(时间、占用内存),来达到解决问题的目的。要使得模型在简单的基础上有最小的训练误差。

正则化(regularization)

正则化所针对的参数(weight),通常是模型的权重(kernel)、偏置量(bias)。

也可以对输出进行正则化,即模型每一层的输出(layer output),因为每一层的输出表示提取到的特点信息,通过对输出进行正则化,也是对在训练中学习到的信息进行筛选和限制,从而防止模型过度学习。

对应上述三种正则化对象,keras提供的正则化API具有三个可选参数:

These layers expose 3 keyword arguments:

kernel_regularizer: Regularizer to apply a penalty on the layer's kernel
bias_regularizer: Regularizer to apply a penalty on the layer's bias
activity_regularizer: Regularizer to apply a penalty on the layer's output

常见的正则化方法:计算参数范数并计入损失函数中、对某层输出特征随机舍弃。

范数(norm)

范数是线性空间中的一种函数,数学表达式为:
p − n o r m = ∣ ∣ x ∣ ∣ p p-norm = ||x||_p pnorm=xp

L0范数

数学表达式为:
∣ ∣ x ^ ∣ ∣ 0 = l i m p → 0 ∑ i = 1 m ∣ x i ∣ p ||\hat x||_0 = lim_{p \rightarrow 0}\sum^m_{i=1}|x_i|^p x^0=limp0i=1mxip
只有对于 x i = 0 x_i=0 xi=0的数据,才会有得到$|x_i|^p=0 $,所以L0范数可以表示数据中非零数据的个数。

L1范数

数学表达式为:
∣ ∣ x ^ ∣ ∣ 1 = l i m p → 1 ∑ i = 1 m ∣ x i ∣ p = ∑ i = 1 m ∣ x i ∣ ||\hat x||_1 = lim_{p \rightarrow 1}\sum^m_{i=1}|x_i|^p = \sum^m_{i=1}|x_i| x^1=limp1i=1mxip=i=1mxi
L1范数可看作是数据点相对于零点的曼哈顿距离(Manhattan Distance)。

L2范数

数学表达式为:
∣ ∣ x ^ ∣ ∣ 2 = l i m p → 2 ∑ i = 1 m ∣ x i ∣ p = ∑ i = 1 m ∣ x i ∣ 2 ||\hat x||_2 = lim_{p \rightarrow 2}\sum^m_{i=1}|x_i|^p = \sum^m_{i=1}|x_i|^2 x^2=limp2i=1mxip=i=1mxi2
L2范数可看作是数据点相对于零点的欧几里得距离(Euclidean distance)。

权重正则化原理

所谓的权重正则化(weight regularization),就是对模型参数配置惩罚的正则化方法。该名字在《Python深度学习》书中提及,与dropout正则化区分开来。

权重正则化的实现方法是:
J ^ ( w , X , y ) = J ( w , X , y ) + λ Ω ( w ) \hat J(w,X,y)= J(w,X,y)+\lambda \Omega(w) J^(w,X,y)=J(w,X,y)+λΩ(w)
即原本的损失函数加上由参数决定的损失值,其中$ \lambda $就是惩罚因子,用于控制权重正则化参与损失的大小。

按照优化与泛化的平衡目标,要用最简单的模型实现最小的训练误差,应设置为:
m i n J ( w , X , y ) s . t . ∣ ∣ w ^ ∣ ∣ 0 ⩽ C min J(w,X,y)\\ s.t.||\hat w||_0\leqslant C minJ(w,X,y)s.t.w^0C
即在规定数量的非零元素的模型中得到最小的损失误差。

但是确定相应L0范数下数据的具体分布,是一个NP问题,数据规模加大时,求解需要大量时间。

因此一般采用不那么严格的约束,简化为:
m i n J ( w , X , y ) s . t . ∣ ∣ w ^ ∣ ∣ 1 ⩽ C min J(w,X,y)\\ s.t.||\hat w||_1\leqslant C minJ(w,X,y)s.t.w^1C
或者:
m i n J ( w , X , y ) s . t . ∣ ∣ w ^ ∣ ∣ 2 ⩽ C min J(w,X,y)\\ s.t.||\hat w||_2\leqslant C minJ(w,X,y)s.t.w^2C
即采用L1范数或者L2范数代替L0范数。

这种带有约束条件的多元函数求极值,通常采用拉格朗日极值法,即可以表示为:
m i n L ( J , λ ) = J ( w , X , y ) + λ ∣ ∣ w ^ ∣ ∣ 1 或 m i n L ( J , λ ) = J ( w , X , y ) + λ ∣ ∣ w ^ ∣ ∣ 2 min \quad L(J,\lambda)=J(w,X,y)+\lambda ||\hat w||_1 \\ 或\\ min \quad L(J,\lambda)=J(w,X,y)+\lambda ||\hat w||_2 \\ minL(J,λ)=J(w,X,y)+λw^1minL(J,λ)=J(w,X,y)+λw^2
由此即为我们所要求的损失函数,就是原本的损失函数,加上设置了惩罚因子的权重正则化采用的范数。

需要注意的是,权重正则化的惩罚项只在训练时对训练数据的损失值添加,在测试集上不会添加。(验证集上会添加吗,应该不会?)

dropout正则化

dropout:在训练过程中将一些层的输出特征值舍弃,即设置为0。

dropout rate:被设为0的特征值所占比例。通常为0.2~0.5。

具体实现过程:

  • 方法1:

    在训练时对某层输出矩阵使用dropout,随机舍弃部分特征单元。

    测试时不舍弃单元。

    测试时对在训练使用了dropout的那一层输出矩阵按dropout rate缩放(即每个特征"乘"以dropout rate)。

  • 方法2:

    在训练时对某层输出矩阵使用dropout,随机舍弃部分特征单元。

    然后对使用了dropout的输出矩阵,按dropout rate放大(即每个特征"除"以dropout rate)

    测试时不进行单元舍弃,也不进行缩放。

dropout的核心本质:对层的输出引入噪声,从而使得某些偶然出现的特定成立的细节信息被打乱。

keras正则化API

参考官方文档:Layer weight regularizers (keras.io)

添加权重正则化:

权重正则化不单独甚至一层使用,而是对每一层单独指定,用于对该层相应参数进行正则化。

对比例参数正则化使用kernel_regularizer指定,对偏置参数正则化使用bias_regularizer指定。

# 对一层的参数同时进行L1正则化与L2正则化,输入参数为惩罚因子
model.add(layers.Dense(units=64,kernel_regularizer=kerse.regularizers.l1_l2(l1=1e-5, l2=1e-4),))

# 设置L1正则化,以下两种方法都可以设置L1正则化,不输入参数默认惩罚因子为0.001
model.add(layers.Dense(units=64,kernel_regularizer=keras.regularizers.l1(1e-5)))
model.add(layers.Dense(units=64kernel_regularizer='l1')                 

按照官方解释,activity_regularizer用于确定输出矩阵的正则化。其实我这个还真不太懂了,目前没见过别的地方有用过。

大多数状况下使用kernel_regularizer就可以了,对偏置量设置正则化目前也没有见别的工程有使用。

添加dropout正则化:

keras中将dropout单独划开为一层进行使用,有利于在函数式api的keras工程中调用,直接指定对相应输出矩阵进行dropout正则化。

keras的dropout采用上述的第二张实现方法,只在训练时开启dropout的使用,输出矩阵随机舍弃特征值,然后按dropout rate放大。

使用参考代码:

model.add(keras.Input(shape=(13,)))
model.add(layers.Dense(64))
model.add(layers.Activation(keras.activations.relu))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1))
model.add(layers.Activation(keras.activations.sigmoid))

一般只在中间层使用dropout,且是对层的激活函数输出矩阵(经过激活函数处理后的矩阵,激活矩阵)使用。

注意,模型只在training模式下才会开启Dropout层的功能,非training模式下Dropout层无效。参考官方给出的提示:

Note that the Dropout layer only applies when training is set to True such that no values are dropped during inference. When using model.fit, training will be appropriately set to True automatically, and in other contexts, you can set the kwarg explicitly to True when calling the layer.

# 百度翻译
注意,只有当training设置为True时,Dropout层才适用,这样在推理过程中就不会删除任何值。使用model.fit时,training将自动适当地设置为True,在其他上下文中,您可以在调用层时显式地将kwarg设置为True。

keras约束API

参考:Layer weight constraints (keras.io)

在官方的API文档中有这么一种API:Layer weight constraints。

按照文档的意思,就是在训练过程中可以对参数大小进行限制约束,而且是在每次梯度下降后对相应目标参数进行约束。官方解释如下:

Classes from the tf.keras.constraints module allow setting constraints (eg. non-negativity) on model parameters during training. They are per-variable projection functions applied to the target variable after each gradient update (when using fit()).
The exact API will depend on the layer, but the layers Dense, Conv1D, Conv2D and Conv3D have a unified API.

参考代码如下:

from tensorflow.keras.constraints import max_norm
model.add(Dense(64, kernel_constraint=max_norm(2.)))

max_norm表示对相应参数限制最大范数。比如kernel_constraint=max_norm(2.)默认对比例系数矩阵,axis=0轴的参数进行范数限制不大于2。

官方文档解释为:

Constrains the weights incident to each hidden unit to have a norm less than or equal to a desired value.

还有其他的约束选项,参考官方文档即可。

模型构架的设计

目前没有任何好的方法可以直接确定网络的最佳层数或者每层的隐含层数量,必须通过使用验证集,在一些列不同的架构上进行测试,观察验证集的损失和精度,来找到最佳的模型大小。

一般的工作流程是从较少的层数开始训练,逐渐添加新层。

转载请注明出处!!!

Author:雾雨霜星
欢迎来我的个人网站进行学习:
https://www.shuangxing.top/#/passage?id=27

Thanks!

PS: 毕竟,霜星酱水平有限,如果发现任何错误还请及时邮箱告知我,我会去改哦!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值