目录

一、前馈神经网络(FNN)

二、多层感知机 (MLP)

(一)基本概念

(二)全连接层

(三)激活函数

三、神经网络的训练过程(以MLP为例)

(一)训练过程总纲

(二)数据集的处理

1.数据集分类

2.数据集的划分

3.数据预处理

(三)欠拟合和过拟合

1.过拟合

2.欠拟合

(四)前向传播

1.有效的权重和偏置初始化

(1)Xavier/Glorot初始化

(2)He初始化

(3)偏置初始化

2.超参数的设置

(1)网络结构的设计

(2)学习率的设计

(3)批量大小(Batchsize)的设计

(4)训练轮次(Epoch)的设计

(5)其他超参数的设计

(6)超参数的优化方法

a.网格搜索法

b.随机搜索法

 (五)损失函数

1.均方误差损失函数(MSE):用来衡量预测值与真实值之间的差异(距离),常用于回归问题

2.交叉熵损失函数:用来衡量预测概率分布与真实标签概率分布之间的差异(距离),常用于分类问题

 (六)反向传播

1.梯度下降算法

(1)批量梯度下降(BGD)

(2)随机梯度下降(SGD)

(3)小批量随机梯度下降(Mini-batch SGD)

2.梯度爆炸和梯度消失

3·.小批量梯度下降法的改进

(1)动量法

(2)RMSProp算法

(3)Adam算法


一、前馈神经网络(FNN)

1、定义:前馈神经网络(feedforward neural network,FNN)是人工神经网络的一种。其结构由输入层、隐含层和输出层单向连接组成,信号通过有向无环图单向传播,各层神经元仅与相邻层建立连接。

2、常见的前馈神经网络:多层感知机、卷积神经网络

二、多层感知机 (MLP)

(一)基本概念

1.定义:多层感知器(Multilayer Perceptron,MLP)是一种前馈人工神经网络模型,其将输入的多个数据集映射到单一的输出数据集上

2.必备组件:全连接层、非线性激活函数

(二)全连接层

1. 定义:全连接层是每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。由于其全相连的特性,一般全连接层的参数也是最多的。

2. 全连接层输入到输出的计算式:

a1​=W1′1​⋅x1​+W2′1​⋅x2​+W3′1​⋅x3​+b1​

a2​=W1′2​⋅x1​+W2′2​⋅x2​+W3′2​⋅x3​+b2​

a3​=W1′3​⋅x1​+W2′3​⋅x2​+W3′3​⋅x3​+b3​3、

(三)激活函数

1.Sigmoid函数

\sigma(x) = \frac{1}{1 + e^{-x}}

特点:值域范围是(0,1); 实际应用常给x作用缩放和偏移参数;常被用于二分类任务的输出层,将实数映射为 0~1 的概率值

Sigmoid函数的导数

\sigma'(x) = \sigma(x) \cdot (1 - \sigma(x))

特点:输入为0,导数最大。输入越偏离0,导数越接近0

2.Tanh函数

\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}

特点:值域关于坐标系原点中心对称,范围是(-1,1)

Tanh函数的导数

\frac{d}{dx}\tanh(x) = 1 - \tanh^2(x)

特点:tanh函数当输入接近0时,tanh函数的导数接近最大值1。与在sigmoid函数图像

中看到的类似,输入在任一方向上越远离0点,导数越接近0

3.ReLU函数

\text{ReLU}(x) = \max(0, x)

特点:ReLU是给定元素xReLU函数被定义为该元素与0的最大值,即当输入大于0时输出输入的值,输入小于0时输出0。

ReLU函数的导数

\frac{d}{dx}\text{ReLU}(x) = \begin{cases} 1, & \text{if } x > 0, \\ 0, & \text{if } x \leq 0. \end{cases}

ReLU函数还有一些变体,比如Leaky relu,PReLU等等

我们经常使用ReLU函数以及其变体作为神经网络的激活函数,因为它减轻了神经网络的梯度消失问题(我们在反向传播会讲到)

4.softmax函数

\text{softmax}(z)_i = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} \quad (i = 1, 2, \dots, K)

z_i:表示输入向量中的第i个元素

\sum_{j=1}^{K} e^{z_j}:对每一行求和。小批量中每个样本是一行

特点:softmax函数是输出类别的概率分布,即输出向量的第i个元素代表该类别对应的概率。通常用于分类问题,作为全连接层的最后一个激活函数做输出。

三、神经网络的训练过程(以MLP为例)

(一)训练过程总纲

数据准备--> 选取合适的模型(如MLP)--> 前向传播--> 计算损失函数-->  反向传播更新参数 

(二)数据集的处理

1.数据集分类

(1)训练集:用来训练模型,训练集上的数据会被使用很多次,跑很多迭代。用它来调整模型的参数(权重、偏置等)。 

(2)验证集: 用来在训练过程中评估模型的性能,它不被拿来训练模型。根据验证集的评估结果,可以调整模型的超参数。验证集的数据使用的比训练集要少。只在模型训练到一定阶段,评估模型的性能表现。

(3)测试集:当训练好了模型,最后只使用一次测试集,评价模型的最终真实表现的和模型的泛化能力

2.数据集的划分

保证数据集分布一致,保证能客观衡量模型性能即可

常使用K折交叉验证来划分训练集和验证集

K折交叉验证:初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。

3.数据预处理

归一化:对每个特征维度,先减去该维度特征的最小值,再除以该维度特征的最大值减去最小值,使该维度的所有数据落在 0 到 1 之间。统一了数据范围

注:训练数据如果进行了归一化,在预测时也要用对应参数对特征进行归一化,再预测结果

标准化:对特征的每个维度,先减去该维度的均值,再除以该维度的标准差,使每个维度的特征满足均值为 0、标准差为 1 的分布。消除了量纲影响

(三)欠拟合和过拟合

1.过拟合

(1)定义:得到的模型在训练集上准确率很高,但在真实场景中识别率低。只是记住了训练数据,而非学习到特征

(2)原因a.模型包含的参数过多,自由度太大 b.模型(假设函数)复杂度较大 c. 训练数据太少,导致模型记住了个例。

(3)应对方法:采用正则化技术对模型约束

正则化技术就是通过一些技术手段来限制模型的复杂度,从而改进模型过拟合的问题,让模型有更好的泛化性

a.L1,L2正则化  b.权重衰减  c.调节模型大小,减少模型参数 d.采用随机失活(dropout)

(4)L1正则化:在损失函数中额外加入模型所有参数的绝对值之和作为惩罚项。

Loss_{\text{L1}} = Loss(\theta) + \lambda \sum_{i} |\theta_i|

\Theta为模型的参数,\lambda为控制正则化强度的超参数,一般设置为1e-3或者1e-4

\lambda不能设置太大,因为为了减小loss,很多参数会变为0,导致模型欠拟合。

调整\lambda的原则为如果数据量越少,模型越复杂,输入特征越多,那么\lambda就越大,因为这些情况都更容易出现过拟合。反之则可以减小\lambda

(5)L2正则化:在损失函数中加入模型参数的平方和作为惩罚项。

Loss_{\text{L2}} = Loss(\theta) + \lambda \sum_{i} \theta_i^2

\lambda的设计与调整原则与L1正则化相同

(6)L1正则化与L2正则化区别:使用L1正则化会让模型的很多参数变为0。因为loss函数对任意参数求导的结果是1或者-1,参数在不断均匀更新后会变成0。

L2正则化只会让模型的参数接近0,不会让参数减为0。为loss对任意参数求导的结果是2倍的该参数,参数值越小,每次更新减少的值越小。

L2正则化在避免过度依赖某些特征,鼓励更加分散的权重向量的同时也保留了所有特征的贡献,所以一般使用L2正则化。

(6)权重衰减:是每次更新参数时多减一个与参数大小有关的值。

w_t = w_t - \text{lr} \times g_w - \text{lr} \times \lambda w_t

lr是学习率,\lambda是权重衰减系数。一般取值在1e-2到1e-4。\lambda的调整原则与L1正则化相同。

权重衰减与L2正则化的区别是权重衰减不是作用在loss上,而是直接作用在参数上。在普通的梯度下降中两种方法参数减小的值是一样的。

但对于Adam优化器来说,权重衰减和L2正则就不一样了,因为添加在loss里的L2正则,梯度经过动量和平方根调整后,已经和直接减小参数值不一样了。

(7)Dropout:是按照超参数的p值随机禁用一些神经元,从简化网络结构方面进行正则化。被禁用的神经元在训练阶段不接受任何输入,也不为下一层的神经元提供输出。而在推理阶段所有神经元都起作用。Dropout一般应用在隐藏层,不对输入和输出层应用。

p值代表每次前向传播时,失活的神经元(特征)所占总特征的比例。常取值在0.2~0.5范围内。

Dropout能防止过拟合的原因是:a.随机失活使每次更新梯度时参与计算的参数减少,降低模型的容量  b.随机失活使得模型不依赖特定的几个神经元,每个神经元包含的决策信息更多,增加模型的泛化能力  c.不断采用有神经元失活后的网络架构可以看作是许多小模型,最后的结果是集成了多个小模型进行决策

2.欠拟合

(1)定义:模型在训练集上表现就很差

(2)原因:a.模型(假设函数)太简单 b.数据没有规律 c.训练不足,还需要训练更多的迭代

(四)前向传播

定义:对神经网络沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量

1.有效的权重和偏置初始化

由2中计算式可知,在训练神经网络时,我们要实现数据流从输入层到输出层的传递,故要先初始化权重系数。

但是权重系数不能任意初始化,原因是对于同一层的不同神经元,它们的输入是相同的,如果参数也相同,则输出也相同,反向传播的梯度也相同,每次参数更新后的值也一样,多个神经元就失去了差异性。

有效的权值初始化方法要使网络各层的激活值和局部梯度的方差在传播过程中尽量保持一致,保持网络中正向和反向数据流动。

接下来我们介绍几种常见的权重初始化方法

(1)Xavier/Glorot初始化

权重服从均值为0,方差为 \frac{2}{\text{input dimension + output dimension}} 的正态分布

该方法适用于Sigmoid和Tanh函数

(2)He初始化

权重服从均值为0,方差为 \frac{2}{\text{input dim}} 的正态分布

该方法适用ReLU函数

(3)偏置初始化

一般激活函数偏置全初始化为0

但ReLU初始化时偏置一般设置为很小的参数,如0.1或0.01

2.超参数的设置

超参数:再开始学习过程之前设置的参数,而非学习得到,一般对模型性能影响大

(1)网络结构的设计

a.深度设计:考虑是否需要隐藏层,需要一个还是几个隐藏层

b.宽度设计:考虑每个隐藏层设计几个神经元合适。神经元个数越多,在该集合上的分类能力就越强。

总结:分类任务越难,设计的神经网络就应该越深越宽,但需注意过拟合的问题

(2)学习率的设计

学习率过大,训练过程难收敛;学习率偏大,在最小值附近震荡,达不到最优;学习率过小,收敛时间长;学习率适中,收敛快,效果好

设计方法:

a.用学习率衰减,学习率 / exp(t) 

b.在不同轮次设置不同的学习率。比如前几轮学习率0.1,后面0.01,再后面0.001

(3)批量大小(Batchsize)的设计

通常设置为2的幂次方。比如32,64,128,256...

(4)训练轮次(Epoch)的设计

大数据集3-10个epoch

小数据集10-50个epoch

(5)其他超参数的设计

正则化的参数\lambda和Dropout率(p值)我们在过拟合部分已经提到

(6)超参数的优化方法
a.网格搜索法
b.随机搜索法

上述两种方法我们会在之后的文章详细讲解

 (五)损失函数

损失函数是一个定量反映模型预测值和真实值之间差异程度的与模型参数有关的函数,是搭建模型性能与模型参数之间的桥梁,能指导模型的参数优化

1.均方误差损失函数(MSE):用来衡量预测值与真实值之间的差异(距离),常用于回归问题

\mathcal{L}_{\text{MSE}} = \frac{1}{N} \sum_{i=1}^{N} \left( y_i - \hat{y}_i \right)^2

$N$:样本总数

$y_i$:第 i 个样本的真实值

$\hat{y}_i$:第 i 个样本的预测值

2.交叉熵损失函数:用来衡量预测概率分布与真实标签概率分布之间的差异(距离),常用于分类问题

\mathcal{L}_{\text{CE}} = -\frac{1}{N}\sum_{i=1}^N \sum_{c=1}^C y_{i,c} \log \hat{y}_{i,c}

$N$:样本数

$C$:类别数

$y_{i,c}$:第 i 个样本第 c 类的真实标签,用one-hot向量表示

$\hat{y}_{i,c}$:模型对第 i 个样本第 c 类的概率预测

 (六)反向传播

定义:是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法对网络中所有权重和偏置计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值和偏置以最小化损失函数。

目的:优化参数,利用损失函数的输出值作为反馈信号来调整分类器参数,以提升模型对训练样本的分类预测性能。

1.梯度下降算法

目的:找到使损失函数最小的那组参数值

做法:利用损失函数的局部特性让参数靠近最优值

参数=当前参数 - 学习率 * 损失函数对参数的梯度

(1)批量梯度下降(BGD)

做法:利用所有训练数据求得每个参数的平均梯度,然后利用公式更新参数

\theta \leftarrow \theta - \eta \cdot \frac{1}{N} \sum_{i=1}^N \nabla_\theta L_i(\theta)

$N$:样本总数

\Theta:是权重或者偏置

优点:训练稳定;收敛方向准确

缺点:容易陷入局部最小值;计算量大,计算慢

以下两个算法是解决批量梯度下降算法的效率问题

(2)随机梯度下降(SGD)

做法:只用训练集中的一个样本计算损失函数,再计算梯度

\theta \leftarrow \theta - \eta \cdot \nabla_\theta L_i(\theta)

优点:单个数据随机性强,不易陷入局部最小值;计算量小,计算快

缺点:单个训练会带来噪声,不是每次迭代都向着整体最优化方向进行;训练不稳定

(3)小批量随机梯度下降(Mini-batch SGD)

做法:每次随机取训练数据集里的小部分样本计算损失函数,再计算梯度

损失函数:\mathit{L}(\omega )=\frac{1}{m}\sum_{i=1}^{m}\mathit{L}_{i}(x_{i},y_{i},\omega)+\lambda\mathit{R}(\omega)

梯度计算:\theta \leftarrow \theta - \eta \cdot \frac{1}{m} \sum_{i \in \mathit{m}} \nabla_\theta L_i(\theta)

$m$:从总训练样本中取出的样本数

iteration:表示一次迭代,1个m就是迭代一次,一次迭代更新一次参数

batch size:1次迭代所使用的样本量,也就是m。batch size是一个超参数

epoch:将训练集的所有样本都使用了一次就叫1个epoch

1个epoch包含\frac{N}{m}个iteration

优点:计算量小,计算快;训练相对稳定

在训练时我们一般选用小批量梯度下降算法

2.梯度爆炸和梯度消失

(1)梯度爆炸:反向传播得到的梯度过大。使得梯度值超出值域;对学习率敏感。导致参数更新过大震荡过大,算法不收敛。

(2)梯度消失:反向传播得到的梯度过小。使得梯度值为0;训练没有进展;无法让神将网络层数太深。导致参数更新过慢或者不更新,算法不收敛

产生原因:通过计算图和链式法则,可以知道梯度在反向传播时在不断用局部梯度做乘法。如果神经网络层数很多并且梯度是大于(小于)1的值,在不断做乘法时会使结果很大(小)

改进梯度爆炸和消失的方法:a.选择有效的权重初始化方法和合适的激活函数。根据激活函数的导数图像,中间的激活函数选ReLu相比于Tahn和Sigmoid,梯度会更顺更流畅,不容易出现梯度为0的情况 b.批归一化 c.残差连接

b和c方法我们会在之后的文章详细讲到

3·.小批量梯度下降法的改进

梯度下降算法的问题:有的参数梯度大,易震荡。有的参数梯度小,收敛慢,使训练永远得不到最优的一组解;容易陷入局部最优解

以下三个算法是解决小批量梯度下降的收敛问题

(1)动量法

做法:用梯度值的指数加权平均来更新参数。由于梯度值不只有当前求得的,还累计了历史的梯度值,局部梯度等于0时也不会马上停下来。故起到了抑制震荡,根据惯性加速收敛,找到全局最优解的作用。

g_\theta = \frac{\partial loss}{\partial \theta}

\mathit{v_{i+1}=uv_{i}+g_{\theta}}

\theta=\theta-\mathit{lr}*v_{i+1}

\Theta 为要更新的参数(权重偏置),$lr$为学习率,$v_{i}$ 初始化为0,$u$ 是看要考虑多大占比的历史值,取值范围为 $[0,1)$,当$u$为0时就是梯度下降算法。

$u$ 也是超参数,一般设置为0.9

(2)RMSProp算法

做法:每个维度单独考虑学习率。思想是让一个学习率除以一个数,如果历史上这个梯度值一直都很大,那就除一个大的数,相当于减小了学习率。如果这个梯度值一直很小,那就除一个小的数。相当于增大了学习率。

以参数\omega为例

g_w = \frac{\partial loss}{\partial w}

S_w = \beta S_w + (1 - \beta) g_w^2

w = w - \frac{lr}{\sqrt{S_w + \varepsilon}} g_w

\beta 是超参数,取值范围是$[0,1)$,常设为0.999\varepsilon 防止分母为0,常设为1e-6。

梯度平方较大的方向是震荡方向,此时步长小。较小的方向是平坦方向,此时步长大。

(3)Adam算法

做法:同时利用动量来给梯度更新增加惯性和震荡阻尼,也利用历史梯度的均方根来自适应调整学习率。

\mathbf{v}_t \leftarrow \beta_1 \mathbf{v}_{t-1} + (1 - \beta_1)\mathbf{g}_t

\mathbf{s}_t \leftarrow \beta_2 \mathbf{s}_{t-1} + (1 - \beta_2) \mathbf{g}_t^2

\hat{\mathbf{v}}_t = \frac{\mathbf{v}_t}{1 - \beta_1^t} \quad \quad\\            

\hat{\mathbf{s}}_t = \frac{\mathbf{s}_t}{1 - \beta_2^t}

\mathbf{g}_t' = \frac{\eta \hat{\mathbf{v}}_t}{\sqrt{\hat{\mathbf{s}}_t} + \epsilon}

\theta_t \leftarrow \theta_{t-1} - \mathbf{g}_t'

\beta_{1} 常设为0.9,\beta_{2} 常设为0.999,角标$t$表示迭代轮次,\varepsilon 防止分母为0,常设为1e-6

第三第四步是为了解决冷启动问题。即当\beta_{1}\beta_{2}都设置好之后,v和s初始化为0时得到的新的梯度与实际的梯度偏差太大,为了修正偏差引入第三四步。

Adam与RMSProp的学习率缩放不同,Adam的\quad \frac{1}{\sqrt{\hat{s}_t} + \epsilon}比RMSProp的\frac{1}{\sqrt{\hat{\mathbf{s}}_t + \epsilon}} \quad效果好

一般采用动量法结合SGD调参。训练初始用Adam学参数或者用Adam最后加速

希望通过本文章能帮大家更好的理解深度学习的基础知识,后续文章会对一些细节做出更详细的补充!

欢迎大家在评论区讨论!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐