深度学习正则化

简介: 深度学习正则化

1 L1与L2正则化6d0ae633d842438e9302318c72ee5310.png

在设计机器学习算法时不仅要求在训练集上误差小,而且希望在新样本上的泛化能力强。许多机器学习算法都采用相关的策略来减小测试误差,这些策略被统称为正则化。因为神经网络的强大的表示能力经常遇到过拟合,所以需要使用不同形式的正则化策略。


正则化通过对算法的修改来减少泛化误差,目前在深度学习中使用较多的策略有参数范数惩罚,提前终止,DropOut等,接下来我们对其进行详细的介绍。


L1和L2是最常见的正则化方法。它们在损失函数(cost function)中增加一个正则项,由于添加了这个正则化项,权重矩阵的值减小,因为它假定具有更小权重矩阵的神经网络导致更简单的模型。 因此,它也会在一定程度上减少过拟合。然而,这个正则化项在L1和L2中是不同的。


L2正则化

70ca791873c04e9485c1a95d62cdbfa5.png


这里的λ是正则化参数,它是一个需要优化的超参数。L2正则化又称为权重衰减,因为其导致权重趋向于0(但不全是0)


L1正则化


246e108b1e06424b9b3f926f6241d663.png

这里,我们惩罚权重矩阵的绝对值。其中,λ 为正则化参数,是超参数,不同于L2,权重值可能被减少到0.因此,L1对于压缩模型很有用。其它情况下,一般选择优先选择L2正则化。


在tf.keras中实现使用的方法是:


  • L1正则化
tf.keras.regularizers.L1(l1=0.01)
  • L2正则化
tf.keras.regularizers.L2(l2=0.01)

L1L2正则化

tf.keras.regularizers.L1L2(
    l1=0.0, l2=0.0
)

我们直接在某一层的layers中指明正则化类型和超参数即可:

# 导入相应的工具包
import tensorflow as tf
from tensorflow.keras import regularizers
# 创建模型
model = tf.keras.models.Sequential()
# L2正则化,lambda为0.01
model.add(tf.keras.layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),
                       activation='relu', input_shape=(10,)))
# L1正则化,lambda为0.01
model.add(tf.keras.layers.Dense(16, kernel_regularizer=regularizers.l1(0.001),
                       activation='relu'))
# L1L2正则化,lambda1为0.01,lambda2为0.01
model.add(tf.keras.layers.Dense(16, kernel_regularizer=regularizers.L1L2(0.001, 0.01),
                       activation='relu'))

2 Dropout正则化

dropout是在深度学习领域最常用的正则化技术。Dropout的原理很简单:假设我们的神经网络结构如下所示,在每个迭代过程中,随机选择某些节点,并且删除前向和后向连接。


e5f638deb2004c84afe03a7228b8f7b1.png


因此,每个迭代过程都会有不同的节点组合,从而导致不同的输出,这可以看成机器学习中的集成方法(ensemble technique)。集成模型一般优于单一模型,因为它们可以捕获更多的随机性。相似地,dropout使得神经网络模型优于正常的模型。


在tf.keras中实现使用的方法是dropout:

tf.keras.layers.Dropout(rate)

参数:


rate: 每一个神经元被丢弃的概率


例子:

# 导入相应的库
import numpy as np
import tensorflow as tf
# 定义dropout层,每一个神经元有0.2的概率被失活,未被失活的输入将按1 /(1-rate)放大
layer = tf.keras.layers.Dropout(0.2,input_shape=(2,))
# 定义五个批次的数据
data = np.arange(1,11).reshape(5, 2).astype(np.float32)
# 原始数据进行打印
print(data)
# 进行随机失活:在training模式中,返回应用dropout后的输出;或者在非training模式下,正常返回输出(没有dropout)
outputs = layer(data,training=True)
# 打印失活后的结果
print(outputs)

结果为:

[[ 1.  2.]
 [ 3.  4.]
 [ 5.  6.]
 [ 7.  8.]
 [ 9. 10.]]
tf.Tensor(
[[ 1.25  2.5 ]
 [ 0.    5.  ]
 [ 6.25  7.5 ]
 [ 8.75 10.  ]
 [ 0.   12.5 ]], shape=(5, 2), dtype=float32)

3 提前停止

提前停止(early stopping)是将一部分训练集作为验证集(validation set)。 当验证集的性能越来越差时或者性能不再提升,则立即停止对该模型的训练。 这被称为提前停止。


2df24dab090044cca12c07ca1bbe29bb.png


在上图中,在虚线处停止模型的训练,此时模型开始在训练数据上过拟合。


在tf.keras中,我们可以使用callbacks函数实现早期停止:

tf.keras.callbacks.EarlyStopping(
    monitor='val_loss',  patience=5
)

上面,monitor参数表示监测量,这里val_loss表示验证集损失。而patience参数epochs数量,当在这个过程性能无提升时会停止训练。为了更好地理解,让我们再看看上面的图片。 在虚线之后,每个epoch都会导致更高的验证集误差。 因此,虚线后patience个epoch,模型将停止训练,因为没有进一步的改善。

# 导入相应的工具包
import tensorflow as tf
import numpy as np
# 当连续3个epoch loss不下降则停止训练
callback = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=3)
# 定义只有一层的神经网络
model = tf.keras.models.Sequential([tf.keras.layers.Dense(10)])
# 设置损失函数和梯度下降算法
model.compile(tf.keras.optimizers.SGD(), loss='mse')
# 模型训练
history = model.fit(np.arange(100).reshape(5, 20), np.array([0,1,2,1,2]),
                    epochs=10, batch_size=1, callbacks=[callback],
                    verbose=1)
# 打印运行的epoch
len(history.history['loss']) 

输出:

Epoch 1/10
5/5 [==============================] - 0s 600us/step - loss: 145774557280600064.0000
Epoch 2/10
5/5 [==============================] - 0s 522us/step - loss: 10077891596456623723194184833695744.0000
Epoch 3/10
5/5 [==============================] - 0s 1ms/step - loss: inf
Epoch 4/10
5/5 [==============================] - 0s 1ms/step - loss: inf
# 只运行了4次
4

4 批标准化

批标准化(BN层,Batch Normalization)是2015年提出的一种方法,在进行深度网络训练时,大多会采取这种算法,与全连接层一样,BN层也是属于网络中的一层。


BN层是针对单个神经元进行,利用网络训练时一个 mini-batch 的数据来计算该神经元xi 的均值和方差,归一化后并重构,因而称为 Batch Normalization。在每一层输入之前,将数据进行BN,然后再送入后续网络中进行学习:


f5a890f7d2794e5eab84a6c1770bf8ec.png


首先我们对某一批次的数据的神经元的输出进行标准化,


d28f9c019851404d9e05b11f2e05ce49.png


然后在使用变换重构,引入了可学习参数γ、β,如果各隐藏层的输入均值在靠近0的区域,即处于激活函数的线性区域,不利于训练非线性神经网络,从而得到效果较差的模型。因此,需要用 γ 和 β 对标准化后的结果做进一步处理:


9774e573013d4bc792d0fe53f9fb99fc.png


这就是BN层最后的结果。整体流程如下图所示:


08dbea84321f41c0b1335f463070bcbe.png


在tf.keras中实现使用:

# 直接将其放入构建神经网络的结构中即可
tf.keras.layers.BatchNormalization(
    epsilon=0.001, center=True, scale=True,
    beta_initializer='zeros', gamma_initializer='ones',
)

21a3ee8ec93d4be5b571631401eccc84.png

5 总结

知道L2正则化与L1正则化的方法

在损失函数(cost function)中增加一个正则项,由于添加了这个正则化项,权重矩阵的值减小,因为它假定具有更小权重矩阵的神经网络导致更简单的模型


知道随机失活droupout的应用

在每个迭代过程中,随机选择某些节点,并且删除前向和后向连接


知道提前停止的使用方法

当看到验证集的性能越来越差时或者性能不再提升,立即停止对该模型的训练


知道BN层的使用方法

利用网络训练时一个 mini-batch 的数据来计算该神经元xi 的均值和方差,归一化后并重构,因而称为 Batch Normalization


目录
相关文章
|
3月前
|
机器学习/深度学习 自然语言处理
深度学习中的正则化技术:防止过拟合的利器
在深度学习领域,模型的复杂度往往与其性能成正比,但过高的复杂度也容易导致过拟合现象。本文将深入探讨正则化技术在深度学习中的应用,分析其如何通过引入额外信息或限制来优化模型,从而在保持模型复杂度的同时,有效避免过拟合问题。我们将通过具体实例和数据,展示正则化技术的实际效果,并讨论其在不同场景下的应用策略。
|
4月前
|
机器学习/深度学习 自然语言处理
深度学习中的正则化技术:防止过拟合的策略
深度学习模型因其强大的特征提取能力而广受关注,但复杂的网络结构也容易陷入过拟合的困境。本文将探讨如何通过正则化技术来缓解这一问题,包括L1和L2正则化、Dropout、数据增强以及早停等方法。文章将详细解释每种技术的工作原理,并讨论它们在实际应用中的效果与挑战。
|
3月前
|
机器学习/深度学习 自然语言处理
深入解析深度学习中的正则化技术
【7月更文挑战第21天】深度学习模型在追求高精度的同时,也面临着过拟合的风险。本文将探讨如何通过正则化技术来平衡模型复杂度与泛化能力,包括L1与L2正则化、Dropout、数据增强和早停等策略。我们将分析这些方法的工作原理及其在实际问题中的应用效果,并讨论如何选择合适的正则化技术以优化深度学习模型的性能。
|
3月前
|
机器学习/深度学习
深度学习中的正则化技术探究
【7月更文挑战第15天】 在深度学习的海洋中,正则化技术如同导航灯塔,指引着模型训练的方向,避免其偏离航线进入过拟合的暗礁区。本文将深入探讨正则化技术的奥秘,从它们的起源、种类到实际应用,揭示这些技术如何在防止过拟合的同时,提升模型的泛化能力。我们将穿越不同类型的正则化方法,包括传统的L1和L2正则化,以及更现代的技术如Dropout和数据增强。每种技术都将被剖析其工作原理及适用场景,为深度学习的实践者提供一盏明灯,照亮模型优化之路。
|
4月前
|
机器学习/深度学习
深度学习中的正则化技术
【6月更文挑战第21天】在深度学习领域,正则化技术是防止模型过拟合的重要手段。本文将深入探讨几种常见的正则化方法,包括L1和L2正则化、Dropout、以及数据增强等,并分析它们在实际应用中的效果与挑战。通过比较不同正则化策略的优劣,我们旨在为深度学习研究者和实践者提供实用的指导和建议。
|
4月前
|
机器学习/深度学习 人工智能 算法
【机器学习】深度探索:从基础概念到深度学习关键技术的全面解析——梯度下降、激活函数、正则化与批量归一化
【机器学习】深度探索:从基础概念到深度学习关键技术的全面解析——梯度下降、激活函数、正则化与批量归一化
49 3
|
5月前
|
机器学习/深度学习 算法 算法框架/工具
【Python机器学习专栏】深度学习中的正则化与优化技术
【4月更文挑战第30天】本文探讨了深度学习中的正则化和优化技术,以提升模型的泛化能力和训练效率。正则化包括L1和L2正则化以及Dropout,防止过拟合。优化技术涵盖梯度下降法、动量法和Adam优化器,加速模型收敛。Python示例展示了如何在Keras中应用这些技术,如L2正则化、Dropout及Adam优化器。
110 0
|
机器学习/深度学习 算法 网络架构
深度学习中的正则化的应用(最全)
深度学习中的正则化的应用(最全)
364 0
|
机器学习/深度学习 算法 Serverless
瞎聊深度学习——神经网络基础(概念,正则化)
瞎聊深度学习——神经网络基础(概念,正则化)
|
机器学习/深度学习 算法 网络架构
【深度学习】3、正则化技术全面了解(二)
【深度学习】3、正则化技术全面了解(二)
123 0
下一篇
无影云桌面