深度学习-4.优化与正则化
Deep Learning - Lecture 4 Optimization and Regularization
- 优化(Optimization)
- 随机梯度下降(Stochastic gradient descent)
- 带动量的随机梯度下降法(Stochastic gradient descent (with momentum))
- 自适应梯度方法(Adaptive gradient methods)
- Adagrad算法
- RMSProp算法
- Adam算法
- 批量归一化(Batch normalisation)
- 正则化(Regularization)
- L2 范数正则化(L2-norm regularization)
- 数据集增强(Dataset augmentation)
- 提前停止(Early stopping)
- 模型平均(Model averaging )
- 随机失活(Dropout)
- 软件中的优化与正则化 (Optmization and Regularization in Software)
- 总结
本节目标:
- 解释并实现基于随机梯度下降(SGD)变体的不同类型的优化算法。
- 解释并实现不同类型的正则化策略。
- 为深度网络设计训练方案,合理且有效地使用优化算法和正则化策略。
优化(Optimization)
随机梯度下降(Stochastic gradient descent)
在深度学习中,参数优化依赖随机梯度下降,因为它具有线性计算复杂度,公式为 θ ← θ − ϵ g \theta \leftarrow \theta - \epsilon g θ←θ−ϵg,其中 θ \theta θ是参数, ϵ \epsilon ϵ是学习率, g g g是梯度(的近似)。
随机梯度下降存在两个主要问题:
- 问题(a):学习率 ϵ \epsilon ϵ过小,会导致收敛缓慢,配图展示了损失函数 J ( θ ) J(\theta) J(θ)随参数 θ \theta θ变化时,因学习率过小在下降过程中呈现较为曲折缓慢的路径。
- 问题(b):学习率 ϵ \epsilon ϵ过大,会导致不稳定,配图展示了损失函数 J ( θ ) J(\theta) J(θ)随参数 θ \theta θ变化时,因学习率过大在下降过程中出现振荡、无法稳定收敛的情况。
随机梯度下降(SGD)的学习率调度
尽管有这些问题,但是只要学习率
ϵ
\epsilon
ϵ趋向于0,随机梯度下降就能够保证收敛到局部最小值。所以我们可以使用学习率调度来降低
ϵ
k
\epsilon_k
ϵk,参数更新公式为
θ
k
+
1
=
θ
k
−
ϵ
k
g
\theta_{k + 1}=\theta_{k}-\epsilon_{k}g
θk+1=θk−ϵkg。
例如在 n n n个训练周期(epochs)后设置 ϵ k = γ ϵ k − 1 \epsilon_{k}=\gamma\epsilon_{k - 1} ϵk=γϵk−1(其中 0 < γ < 1 0 < \gamma < 1 0<γ<1), ϵ 0 \epsilon_0 ϵ0是手动设置的初始学习率, n n n是学习率下降周期, γ \gamma γ是下降因子。
这样学习率就会无限趋于零。
上图中、图a展示的是固定学习率的SGD(蓝色线)和学习率递减的SGD(橙色线)对数据的拟合情况。图b展示了随着迭代次数的增加,损失函数的收敛情况,可以看到明显学习率递减的橙色线值更小。图c展示了在权重空间中的收敛情况,红点和蓝点分别表示不同学习率设置下的收敛点。
带动量的随机梯度下降法(Stochastic gradient descent (with momentum))
带动量的随机梯度下降在标准随机梯度下降的更新过程中添加了类似速度的项,从而加速收敛。
- 标准随机梯度下降: θ ← θ − ϵ g \theta \leftarrow \theta - \epsilon g θ←θ−ϵg ,其中 θ \theta θ是参数, ϵ \epsilon ϵ是学习率, g g g是梯度。
- 带动量的随机梯度下降: v ← α v − ϵ g v \leftarrow \alpha v - \epsilon g v←αv−ϵg , θ ← θ + v \theta \leftarrow \theta + v θ←θ+v ,其中 α ∈ [ 0 , 1 ) \alpha \in [0, 1) α∈[0,1) 是动量因子, v v v是速度(当 α = 0 \alpha = 0 α=0时,就恢复为标准随机梯度下降算法)。
- 图表(a)对比了标准随机梯度下降(蓝色线)和带动量的随机梯度下降(橙色线)对数据的拟合情况。
- 图表(b)展示了随着迭代次数的增加,两种方法下损失函数的收敛情况。
- 图表(c)是在二维权重空间中展示了带动量的随机梯度下降(橙色路径)的收敛过程。
- 图表(d)则是在三维权重空间中展示了标准随机梯度下降(蓝色路径)和带动量的随机梯度下降(橙色路径)的收敛过程。
- 从c、d两幅图中可以看到随机梯度下降更新过程中“积累动量”这一特点。
自适应梯度方法(Adaptive gradient methods)
自适应梯度方法会自动调整学习率参数,以尝试提高收敛速度。
Adagrad算法
Adagrad算法公式:
-
r
j
=
∑
τ
=
1
t
g
j
,
τ
2
r_j=\sum_{\tau = 1}^{t}g_{j,\tau}^{2}
rj=∑τ=1tgj,τ2,表示累积的梯度平方和;
- j j j:表示参数的索引。假设模型中有多个参数(如神经网络中的权重参数等), j j j用于区分不同的参数维度,比如在神经网络的权重矩阵中, j j j可以指向矩阵中的某一个具体元素对应的参数维度。
- τ \tau τ:是一个循环索引,用于遍历从1到 t t t的训练步骤或迭代次数。
- t t t:代表当前的训练迭代次数或者时间步。随着训练的进行, t t t会从1逐步增加,在每一次迭代中,都会基于当前的迭代次数来计算累积梯度平方和。
- g j , τ g_{j,\tau} gj,τ:表示在第 τ \tau τ次训练迭代时,参数 θ j \theta_j θj对应的梯度值。也就是说,对于第 j j j个参数,在不同的训练迭代中会有不同的梯度, g j , τ g_{j,\tau} gj,τ就是在第 τ \tau τ次迭代时它的梯度。
- r j r_j rj:是累积的梯度平方和,它把从第1次到第 t t t次迭代中,参数 θ j \theta_j θj对应的梯度的平方进行累加,反映了该参数在过往训练过程中梯度变化的累积情况。
-
θ
j
←
θ
j
−
ϵ
r
j
g
j
\theta_j\leftarrow\theta_j - \frac{\epsilon}{\sqrt{r_j}}g_j
θj←θj−rjϵgj,用于更新参数
θ
j
\theta_j
θj。
- θ j \theta_j θj:是模型中的第 j j j个参数,在训练过程中会不断更新以优化模型性能。
- ϵ \epsilon ϵ:是初始设定的学习率,它是一个超参数,控制着每次参数更新的步长大小。
- r j \sqrt{r_j} rj:是对累积梯度平方和 r j r_j rj取平方根,在更新公式中用于动态调整学习率,根据 r j r_j rj的大小来缩放实际应用于参数更新的步长。
- g j g_j gj:一般是指在当前训练迭代中,参数 θ j \theta_j θj对应的梯度值(也可以理解为在当前时刻,为了使损失函数下降,参数 θ j \theta_j θj需要调整的方向和幅度的度量) 。通过这个公式,依据累积梯度平方和以及当前梯度,对参数 θ j \theta_j θj进行更新。
所以Adagrad的特点就很好理解了,因为参数更新时累积的梯度平方和在分母的位置,所以:
- 在损失函数的平坦区域(累积梯度较小处),会增大学习率;
- 在损失函数的陡峭区域(累积梯度较大处),会减小学习率。
上图是Adagrad算法的损失函数 J ( θ ) J(\theta) J(θ) 。图中标注了陡峭梯度(Steep gradient)和浅梯度(Shallow gradient)区域,并指出在陡峭梯度区域 r j r_j rj会较大,在浅梯度区域 r j r_j rj会较小。
RMSProp算法
-
RMSProp算法介绍:给出了RMSProp算法的公式:
- r j ← ρ r j + ( 1 − ρ ) g j 2 r_j\leftarrow\rho r_j+(1 - \rho)g_j^{2} rj←ρrj+(1−ρ)gj2,这是一个移动平均的梯度平方和,其中 ρ \rho ρ是一个介于0和1之间的超参数,控制着过去梯度平方和的保留程度。这个公式使得RMSProp能够“遗忘”旧的梯度值,对损失函数梯度的变化做出响应。
- θ j ← θ j − ϵ r j g j \theta_j\leftarrow\theta_j - \frac{\epsilon}{\sqrt{r_j}}g_j θj←θj−rjϵgj,同样用于更新参数 θ j \theta_j θj。
-
Adagrad算法回顾:重新展示了Adagrad算法的公式:
- r j = ∑ τ = 1 t g j , τ 2 r_j=\sum_{\tau = 1}^{t}g_{j,\tau}^{2} rj=∑τ=1tgj,τ2,表示累积的梯度平方和。
- θ j ← θ j − ϵ r j g j \theta_j\leftarrow\theta_j - \frac{\epsilon}{\sqrt{r_j}}g_j θj←θj−rjϵgj,用于更新参数 θ j \theta_j θj。
-
RMSProp对Adagrad的改进:列举了RMSProp相对于Adagrad的改进之处:
- 与Adagrad类似,在累积梯度较小的地方增大学习率,在累积梯度较大的地方减小学习率。
- 与Adagrad不同,RMSProp会“遗忘”旧的梯度值,从而能够对损失函数梯度的变化做出响应。
Adam算法
- Adagrad与RMSProp:Adagrad通过累积从训练开始到当前时刻的所有梯度平方和,来调整学习率;RMSProp则引入了衰减系数,对梯度平方和进行加权移动平均,解决了Adagrad中累积项持续增大导致后期学习率过小的问题。
- Adam算法:它结合了RMSProp的自适应梯度思想(对梯度平方进行加权移动平均),还引入了动量项(类似带动量的随机梯度下降,对梯度进行加权移动平均) 。并且,Adam算法对梯度的一阶矩估计(类似动量)和二阶矩估计(类似RMSProp的梯度平方平均)进行了偏差修正,在训练初期能够更快地适应并调整参数更新步长,综合起来实现更快的收敛。
补充:Adam算法不是简单将Adagrad和RMSProp相加,而是融合了两者特点并进行创新改进,同时加入动量相关特性和偏差修正机制的一种优化算法。
Adam算法的优势:
- 更直接地朝着损失函数的最小值移动。
- 不像带动量的SGD那样振荡。
- 比Adagrad或RMSProp收敛得更快。
对随机梯度下降(SGD)不同变体的比较
Algorithm | Update |
---|---|
SGD | θ j ← θ j − ϵ g j \theta_j \leftarrow \theta_j - \epsilon g_j θj←θj−ϵgj |
SGD+momentum(带动量的SGD) | v j ← α v j − ϵ g j v_j \leftarrow \alpha v_j - \epsilon g_j vj←αvj−ϵgj, θ j ← θ j + v j \theta_j \leftarrow \theta_j + v_j θj←θj+vj |
Adagrad | r j = ∑ τ = 1 t g j , τ 2 r_j = \sum_{\tau = 1}^{t}g_{j,\tau}^{2} rj=∑τ=1tgj,τ2, θ j ← θ j − ϵ r j − 0.5 g j \theta_j \leftarrow \theta_j - \epsilon r_j^{-0.5} g_j θj←θj−ϵrj−0.5gj |
RMSProp | r j ← ρ r j + ( 1 − ρ ) g j 2 r_j \leftarrow \rho r_j + (1 - \rho)g_j^{2} rj←ρrj+(1−ρ)gj2, θ j ← θ j − ϵ r j − 0.5 g j \theta_j \leftarrow \theta_j - \epsilon r_j^{-0.5} g_j θj←θj−ϵrj−0.5gj |
Adam | v j ← ρ 1 v j + ( 1 − ρ 1 ) g j v_j \leftarrow \rho_1 v_j + (1 - \rho_1)g_j vj←ρ1vj+(1−ρ1)gj, r j ← ρ 2 r j + ( 1 − ρ 2 ) g j 2 r_j \leftarrow \rho_2 r_j + (1 - \rho_2)g_j^{2} rj←ρ2rj+(1−ρ2)gj2, θ j ← θ j − ϵ r j − 0.5 v j \theta_j \leftarrow \theta_j - \epsilon r_j^{-0.5} v_j θj←θj−ϵrj−0.5vj |
- (a) Data and Model Fits:展示了不同算法对数据的拟合情况,对比了SGD、SGD - Momentum、Adagrad、RMSProp和Adam。
- (b) Loss Convergence:呈现了随着迭代次数的增加,不同算法的损失收敛情况。
- (c ) Convergence in Weight Space (2D):在二维权重空间中展示了不同算法的收敛路径。
- (d) Convergence in Weight Space (3D):在三维权重空间中展示了不同算法的收敛路径。
批量归一化(Batch normalisation)
- 数据归一化的作用:数据标准化可用于提高收敛速度。
- 数据归一化的方法:对于第
i
i
i个特征的第
k
k
k个样本
x
i
,
k
x_{i,k}
xi,k,减去均值
μ
i
\mu_i
μi ,并除以标准差
σ
i
\sigma_i
σi 来进行标准化,公式为
x
ˉ
i
,
k
=
x
i
,
k
−
μ
i
σ
i
\bar{x}_{i,k}=\frac{x_{i,k}-\mu_i}{\sigma_i}
xˉi,k=σixi,k−μi
其中均值 μ i = 1 m ∑ k x i , k \mu_i=\frac{1}{m}\sum_{k}x_{i,k} μi=m1∑kxi,k ,方差 σ i 2 = 1 m ∑ k ( x i , k − μ i ) 2 \sigma_i^{2}=\frac{1}{m}\sum_{k}(x_{i,k}-\mu_i)^{2} σi2=m1∑k(xi,k−μi)2 。
下图展示了有无数据标准化时的模型拟合情况,对比了未进行数据标准化(No data standardisation)和进行了数据标准化(With data standardisation)的情形,拟合函数为
y
=
θ
0
x
2
+
θ
1
x
y = \theta_0x^{2}+\theta_1x
y=θ0x2+θ1x。
- 未进行数据标准化时,损失函数的等高线呈椭圆形,在参数更新过程中可能会在陡峭的山谷处受到限制;
- 数据标准化具有使椭圆形的损失函数等高线变为圆形的效果。
- 圆形的损失函数等高线通过避免陡峭山谷的限制因素实现快速收敛。
- 进行数据标准化后,损失函数的等高线变得更接近圆形,避免了陡峭山谷的限制因素,实现了更快的收敛。
这张幻灯片主要介绍了批量归一化(Batch Normalization)的相关内容,具体如下:
批量归一化:批量归一化常被观察到能够加速训练过程。
- 批量归一化层通过参数 γ k ( l ) \gamma_{k}^{(l)} γk(l)和 β k ( l ) \beta_{k}^{(l)} βk(l)学习最优的数据缩放。
- 对于输入 z i , k ( l ) z_{i,k}^{(l)} zi,k(l),先进行归一化操作 z ˉ i , k ( l ) = z i , k ( l ) − μ i ( l ) σ i ( l ) \bar{z}_{i,k}^{(l)}=\frac{z_{i,k}^{(l)} - \mu_{i}^{(l)}}{\sigma_{i}^{(l)}} zˉi,k(l)=σi(l)zi,k(l)−μi(l),其中 μ i ( l ) \mu_{i}^{(l)} μi(l)是小批量数据的均值, σ i ( l ) \sigma_{i}^{(l)} σi(l)是小批量数据的标准差。
- 然后进行缩放和平移操作
z
~
i
,
k
(
l
)
=
γ
k
(
l
)
z
ˉ
i
,
k
(
l
)
+
β
k
(
l
)
\tilde{z}_{i,k}^{(l)}=\gamma_{k}^{(l)}\bar{z}_{i,k}^{(l)} + \beta_{k}^{(l)}
z~i,k(l)=γk(l)zˉi,k(l)+βk(l),得到最终输出
z
~
i
,
k
(
l
)
\tilde{z}_{i,k}^{(l)}
z~i,k(l)。
正则化(Regularization)
正则化的动机:解决深度学习的过拟合问题。(过拟合即模型对训练数据拟合得很好,但对新数据的泛化能力较差。)
- (a) No regularisation - overfitting(无正则化 - 过拟合):左侧图表展示了没有使用正则化时的情况。蓝色曲线代表真实函数(True Function),红色曲线代表模型(Model),可以看到红色曲线过度拟合了训练数据(蓝色散点),在数据点之间波动很大,不能很好地反映真实函数的趋势。
- (b) Regularisation - improved generalisation(正则化 - 改进的泛化能力):右侧图表展示了使用正则化后的情况。此时模型(红色曲线)更接近真实函数(蓝色曲线),对新数据的泛化能力有所提高,不再像左侧那样过度拟合训练数据。
L2 范数正则化(L2-norm regularization)
在L2正则化中,参数的L2范数会受到惩罚,这往往会使权重趋向于更小的值,从而有助于防止模型过拟合。
- 损失函数:L2范数损失函数为 J ( θ ) = 1 m ∑ j = 1 m L ( f ( x j ; θ ) , y j ) + 1 2 α ∥ θ ∥ 2 2 J(\theta)=\frac{1}{m}\sum_{j = 1}^{m}L(f(x_j;\theta),y_j)+\frac{1}{2}\alpha\|\theta\|_2^2 J(θ)=m1j=1∑mL(f(xj;θ),yj)+21α∥θ∥22其中 1 m ∑ j = 1 m L ( f ( x j ; θ ) , y j ) \frac{1}{m}\sum_{j = 1}^{m}L(f(x_j;\theta),y_j) m1∑j=1mL(f(xj;θ),yj)是原始的损失项, 1 2 α ∥ θ ∥ 2 2 \frac{1}{2}\alpha\|\theta\|_2^2 21α∥θ∥22是L2正则化项, α \alpha α是一个超参数,需要进行调整。目标是相对于 θ \theta θ最小化 J ( θ ) J(\theta) J(θ)。
- 损失函数的梯度:L2范数损失函数的梯度为 ∇ θ J ( θ ) = 1 m ∑ j = 1 m ∇ θ L ( f ( x j ; θ ) , y j ) + α θ \nabla_{\theta}J(\theta)=\frac{1}{m}\sum_{j = 1}^{m}\nabla_{\theta}L(f(x_j;\theta),y_j)+\alpha\theta ∇θJ(θ)=m1∑j=1m∇θL(f(xj;θ),yj)+αθ 。
- 随机梯度下降更新:带有L2范数正则化的随机梯度下降更新公式为 θ ← θ − ϵ ∇ θ J ( θ ) \theta\leftarrow\theta - \epsilon\nabla_{\theta}J(\theta) θ←θ−ϵ∇θJ(θ) ,进一步展开为 θ ← θ − ϵ ( g + α θ ) \theta\leftarrow\theta - \epsilon(g+\alpha\theta) θ←θ−ϵ(g+αθ) ,其中 g g g是原始损失函数的梯度。
- 上方图表展示了 α = 0 \alpha = 0 α=0时(即没有L2正则化)的情况,模型(红色曲线)过度拟合了训练数据(蓝色散点).
- 下方图表展示了 α \alpha α较大时的情况,此时模型(红色曲线)对训练数据的拟合更加平滑,减少了过拟合现象,更接近真实函数的趋势。 这些图表直观地体现了L2正则化对模型拟合效果的影响。
数据集增强(Dataset augmentation)
一种简单的正则化方法是通过数据集增强,使用额外的数据来训练模型,这有助于减少泛化误差。(当然数据集增强还可以通过向输入 x x x添加噪声来实现,这能使分类器更具鲁棒性并改善泛化能力。 )
对于分类器而言,其应对于输入的变换具有不变性,因此可以通过对输入 x x x进行变换来生成新的训练数据对 ( x , y ) (x, y) (x,y)。
所以我们可以对输入应用平移、旋转和缩放等变换。例如,通过对一张包含蔬菜的图片进行上述变换,生成了多张不同的图片,展示在幻灯片中部(从一张图片变换为九宫格的图片组)。
Matlab代码示例
% Define an image augmentation object
scaleRange = [0.5 2];
imageAugmenter = imageDataAugmenter( ...
'RandXScale',scaleRange, ...
'RandYScale',scaleRange, ...
'RandRotation',@() 5 + (90-5)*rand);
% read images and display
img1 = imread('peppers.png'); figure; imshow(img1)
% augment the datastore
outCellArray = [];
for i = 1:12
outCellArray = [outCellArray augment(imageAugmenter,{img1})];
end
% display augmented images
outImg = imtile(outCellArray);
figure; imshow(outImg);
提前停止(Early stopping)
定义:提前停止是指监测独立验证数据上的训练误差,当验证误差不再下降时停止训练。它通过在过拟合发生之前停止训练来防止对训练数据的过拟合。
- 算法步骤:提前停止算法需要耐心参数
p
p
p和验证频率
n
n
n。具体步骤如下:
- 每 n n n次迭代评估一次验证损失 V ( k ) V(k) V(k)。
- 如果验证损失增加,增加计数器:若 V ( k ) > V ( k − 1 ) V(k)>V(k - 1) V(k)>V(k−1),则 j = j + 1 j = j + 1 j=j+1;否则 j = 0 j = 0 j=0。
- 如果 j > p j>p j>p,停止训练。
上图展示了训练集损失(Training set loss,蓝色曲线)和验证集损失(Validation set loss,绿色曲线)随训练轮次(Time,epochs)的变化情况。图表中用红色箭头标注出当验证损失开始增加时,就停止训练。
模型平均(Model averaging )
集成方法是一种通用技术,其中多个模型(即一个集成)被单独训练以解决一个问题,然后进行组合。
- 装袋法介绍:装袋法(bootstrap aggregating)是一种具体的集成方法,其中模型在原始数据的子集上进行训练。原始完整数据集表示为 D = { ( x j , y j ) : 1 ≤ j ≤ m } \mathcal{D}=\{(x_j,y_j):1\leq j\leq m\} D={(xj,yj):1≤j≤m},通过从 D \mathcal{D} D中有放回抽样创建 n n n个子集数据 D 1 ⊆ D , D 2 ⊆ D , ⋯ , D n ⊆ D \mathcal{D}_1\subseteq\mathcal{D},\mathcal{D}_2\subseteq\mathcal{D},\cdots,\mathcal{D}_n\subseteq\mathcal{D} D1⊆D,D2⊆D,⋯,Dn⊆D。
- 训练与组合过程:模型在这些子集数据上进行训练,如
D
1
\mathcal{D}_1
D1用于训练Model 1,
D
2
\mathcal{D}_2
D2用于训练Model 2,以此类推直到
D
n
\mathcal{D}_n
Dn用于训练Model
n
n
n。之后将模型的预测进行组合,对于回归问题采用平均(Averaging)的方式,对于分类问题采用投票(Voting)的方式得出最终输出。
随机失活(Dropout)
在Dropout中,使用一个深度网络,在训练期间随机丢弃单元,以形成多个模型(在不同的小批量数据上训练)。Dropout是一种正则化方法,可被视为一种对大型网络高效的集成方法。
-
(a) Standard Network(标准网络):展示了一个包含输入层、两个隐藏层和输出层的标准神经网络结构,神经元之间全连接。
-
(b) After applying dropout(应用Dropout后):显示在应用Dropout后,一些神经元(用“X”标记)被随机丢弃,形成了一个精简的网络结构。
-
(c ) After applying dropout again(再次应用Dropout后):再次展示了应用Dropout后,又有不同的神经元被丢弃,形成了另一个不同的精简网络结构。
-
在实施过程中,我们使用完整的网络(没有丢弃的单元)。
- 解释:在模型实施、部署到实际应用场景(比如用训练好的模型去对新数据做预测推断 )的时候,我们会使用完整的神经网络。这意味着在训练阶段被随机丢弃的神经元在这个时候都会恢复,不再进行丢弃操作。之所以这样做,是因为在实际应用中,我们希望利用整个网络的所有信息来给出尽可能准确的预测结果,而不是像训练阶段那样去刻意制造不同的 “子网络”。
-
在运行时,一个单元的权重应该乘以包含该单元的概率 p p p 。
- 解释:在运行时(也就是模型进行预测的过程中 ),每个神经元的权重需要乘以它在训练阶段被保留的概率 p p p 。这一步是为了补偿训练阶段随机丢弃神经元带来的影响。在训练时,由于有 ( 1 − p ) (1 - p) (1−p)概率的神经元被丢弃,相当于每个神经元的实际输出期望发生了变化。为了让模型在实施阶段的输出期望和训练阶段保持一致,所以要对权重进行这样的缩放调整。例如,如果 p = 0.8 p = 0.8 p=0.8,即神经元有80%的概率被保留,那么在运行时,该神经元的权重就要乘以0.8 ,以保证模型行为的一致性和稳定性,避免因训练和实施阶段的差异导致预测结果出现偏差。
软件中的优化与正则化 (Optmization and Regularization in Software)
假设要设计一个包含各种不同类型层的深度网络,以改进优化和正则化。可以指定的训练选项,包括:
- 随机梯度下降的特定变体,例如Adam算法。
- 初始学习率。
- 学习率调度。
- L2范数正则化。
神经网络结构示意图:
Matlab代码示例
% constant parameters
num_features = 10;
num_classes = 5;
% design network - note the dropout layer at the end
layers = [
featureInputLayer(num_features) % input layer
fullyConnectedLayer(12) % FC layer
batchNormalizationLayer % Batch normalisation
reluLayer % ReLU activation function
fullyConnectedLayer(8) % FC layer
batchNormalizationLayer % Batch normalisation
reluLayer % ReLU activation function
dropoutLayer(0.2) % Dropout layer - prob=0.2
fullyConnectedLayer(num_classes) % Fully connected layer
softmaxLayer
classificationLayer];
% training options - note the L2Regularization option
options = trainingOptions("adam", "MiniBatchSize",16, "MaxEpochs",30, ...
"InitialLearnRate",1e-3, "LearnRateSchedule","piecewise", ...
"L2Regularization",0.0001, 'Plots','training-progress');
% train network
net = trainNetwork(XTrain,YTrain,layers,options);
Python代码示例
# import libraries and packages
import numpy as np
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense, Dropout, BatchNormalization, Activation
from keras import optimizers, regularizers
# define number of features and classes
num_features = 10
num_classes = 5
# define the deep feedforward network in keras
model = Sequential()
model.add(Dense(12, kernel_regularizer=regularizers.L2(l2=0.05), input_shape=(num_features,)))
model.add(BatchNormalization())
model.add(Activation("relu"))
model.add(Dense(8, kernel_regularizer=regularizers.L2(l2=0.05)))
model.add(BatchNormalization())
model.add(Activation("relu"))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation="softmax"))
# optimization options
opt = optimizers.Adam(learning_rate=0.001)
# compile the model with the optimization options
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
总结
- 训练方法:训练深度网络通常基于随机梯度下降及其变体,以提高效率。
- 动量的作用:动量被用于加速学习过程。
- Adam算法:
- 结合了动量和自适应梯度。
- 是当前常用的标准优化方法。
- 批量归一化:用于学习网络中传输数据的归一化,往往能够提高收敛速度。