本文详细介绍了神经网络中激活函数、损失函数及优化算法,涵盖了这些概念的定义、作用、常见类型及选择策略。激活函数、损失函数和优化算法是神经网络模型的核心组件,它们共同决定了模型的性能和训练效率。通过合理选择这些组件,可以构建出高效、准确的神经网络模型,适用于各种复杂的机器学习任务。
一、激活函数
(一)什么是激活函数
激活函数(Activation functions)对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如下图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。
(二)为什么要使用激活函数?
1.激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用.
2.激活函数可以引入非线性因素。如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等。
3.激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。
(三)为什么激活函数需要非线性函数?
1.假若网络中全部是线性部件,那么线性的组合还是线性,与单独一个线性分类器无异。这样就做不到用非线性来逼近任意函数。
2.使用非线性激活函数,,以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。使用非线性激活函数,能够从输入输出之间生成非线性映射。
(四)常见激活函数
优秀总结参考:
一些选择激活函数的经验法则:
如果输出是0、1值(二分类问题),则输出层选择 sigmoid 函数,然后其它的所有单元都选择 Relu 函数。这是很多激活函数的默认选择,如果在隐藏层上不确定使用哪个激活函数,那么通常会使用 Relu 激活函数。有时,也会使用 tanh 激活函数。
二、优化方法总结
(一)基本的梯度下降方法
深度学习网络训练过程可以分成两大部分:前向计算过程与反向传播过程。前向计算过程,是指通过我们预先设定好的卷积层、池化层等等,按照规定的网络结构一层层前向计算,得到预测的结果。反向传播过程,是为了将设定的网络中的众多参数一步步调整,使得预测结果能更加贴近真实值。
那么,在反向传播过程中,很重要的一点就是:参数如何更新?或者问的更具体点:参数应该朝着什么方向更新?
显然,参数应该是朝着目标损失函数下降最快的方向更新,更确切的说,要朝着梯度方向更新! 假设网络参数是 ,学习率是 ,网络表示的函数是 ,函数此时对 的梯度为: ,于是参数 的更新公式可表示为:
在深度学习中,有三种最基本的梯度下降算法:SGD、BGD、MBGD,他们各有优劣。根据不同的数据量和参数量,可以选择一种具体的实现形式,在训练神经网络是优化算法大体可以分为两类:1)调整学习率,使得优化更稳定;2)梯度估计修正,优化训练速度。
1.随机梯度下降法 SGD
随机梯度下降法 (Stochastic Gradient Descent,SGD),每次迭代(更新参数)只使用单个训练样本(x(i),y(i)),其中x是输入数据,y是标签。因此,参数更新表达式如下:
优点:SGD 一次迭代只需对一个样本进行计算,因此运行速度很快,还可用于在线学习。
缺点:(1)由于单个样本的随机性,实际过程中,目标损失函数值会剧烈波动,一方面,SGD 的波动使它能够跳到新的可能更好的局部最小值。另一方面,使得训练永远不会收敛,而是会一直在最小值附近波动。(2)一次迭代只计算一张图片,没有发挥GPU并行运算的优势,使得整体计算的效率不高。
2.批量梯度下降法 BGD
批量梯度下降法 (Batch Gradient Descent,BGD),每次迭代更新中使用所有的训练样本,
参数更新表达式如下:
优缺点分析:BGD能保证收敛到凸误差表面的全局最小值和非凸表面的局部最小值。但每迭代一次,需要用到训练集中的所有数据,如果数据量很大,那么迭代速度就会非常慢。
3.小批量梯度下降法 MBGD
小批量梯度下降法(Mini-Batch Gradient Descent,MBGD),折中了 BGD 和 SGD 的方法,每次选代使用batch_size个训练样本进行计算,参数更新表达式如下:
优缺点分析:因为每次迭代使用多个样本,所以 MBGD 比 SGD 收敛更稳定,也能避免 BGD 在数据集过大时迭代速度慢的问题。因此MBGD是深度学习网络训练中经常使用的梯度下降方法。
深度学习中,一般的mini-batch大小为64~256,考虑到电脑存储设置和使用的方式,如果mini-batch是2的次方,代码会运行地更快一些。
上图是BGD和MBGD训练时,损失代价函数的变化图。可见BGD能使代价函数逐渐减小,最终保证收敛到凸误差表面的全局最小值MBGD的损失代价函数值比较振荡,但最终也能优化到损失最小值。
4.Adagrad
其中gt同样是当前的梯度,连加和开根号都是元素级别的运算。 是初始学习率,由于之后会自动调整学习率,所以初始值就不像之前的算法那样重要了。而 是一个比较小的数,用来保证分母非0。
特点:
(1)前期gt较小的时候,regularizer较大,能够放大梯度
(2)后期gt较大的时候,regularizer较小,能够约束梯度
(3)适合处理稀疏梯度
缺点:
(1)由公式可以看出,仍依赖于人工设置一个全局学习率
(2) 设置过大的话,会使regularizer过于敏感,对梯度的调节太大
(3)中后期,分母上梯度平方的累加将会越来越大,使gradient→0,使得训练提前结束
5.Adadelta
Adadelta是对Adagrad的扩展,最初方案依然是对学习率进行自适应约束,但是进行了计算上的简化。
Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。
特点:
(1)训练初中期,加速效果不错,很快
(2)训练后期,反复在局部最小值附近抖动
6.RMSprop优化器
RMSprop可以算作Adadelta的一个特例:
当 时, 就变为了求梯度平方和的平均数。如果再求根的话,就变成了RMS(均方根):
此时,这个RMS就可以作为学习率 的一个约束
特点:
(1)其实RMSprop依然依赖于全局学习率
(2)RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间
(3)适合处理非平稳目标
(4)对于RNN效果很好
RMSProp算法的全称叫 Root Mean Square Prop(均方根传递),是 Hinton 在 Coursera 课程中提出的一种优化算法,在上面的Momentum 优化算法中,初步解决了优化中摆动幅度大的问题。
为了进一步优化损失函数在更新中存在摆动幅度过大的问题,并且进一步加快函数的收敛速度,RMSProp算法对权重 W 和偏置b的梯度使用了微分平方加权平均数。优化后的效果如下:蓝色的为Momentum优化算法所走的路线,绿色的为RMSProp优化算法所走的路线。
假设在第t轮迭代过程中,各个公式如下所示:
在上面的公式中 Sdw 和 Sdb 分别是损失函数在前 t-1轮迭代过程中累积的梯度平方动量,阝是梯度累积的一个指数。所不同的是,RMSProp 算法对梯度计算了微分平方加权平均数。这种做法有利于消除了摆动幅度大的方向,用来修正摆动幅度,使得各个维度的摆动幅度都较小。另一方面也使得网络函数收敛更快。
(二)Momentum 动量梯度下降
Momentum 主要引入了基于梯度的移动指数加权平均的思想,即当前的参数更新方向不仅与当前的梯度有关,也受历史的加权平均梯度影响。对于梯度指向相同方向的维度,动量会积累并增加,而对于梯度改变方向的维度,动量会减少更新。这也就使得收敛速度加快,同时又不至于摆动幅度太大。
动量梯度下降法的作用是加快学习速度,还有一定摆脱局部最优的能力。如下图红色线所示:
动量梯度下降(Momentum)的参数更新表达式如下所示:
其中, 表示动量参数momentum;当 =0时,即是普通的SGD梯度下降。0< <1,表示带了动量的SGD梯度下降参数更新方式, 通常取0.9。
普通SGD的缺点:SGD很难在沟壑(即曲面在一个维度上比在另一个维度上弯曲得更陡的区域)中迭代,这在局部最优解中很常见。在这些场景中,SGD在沟壑的斜坡上振荡,同时沿着底部向局部最优方向缓慢前进。为了缓解这一问题,引入了动量momentum。
本质上,当使用动量时,如同我们将球推下山坡。球在滚下坡时积累动量,在途中变得越来越快。同样的事情发生在参数更新上:对于梯度指向相同方向的维度,动量会积累并增加,而对于梯度改变方向的维度,动量会减少更新。结果,我们获得了更快的收敛和减少的振荡。
(三)Adam 优化器
Adam 是另一种参数自适应学习率的方法,相当于 RMSprop+Momentum,利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。公式如下:
一阶矩和二阶矩 mt、vt类似于动量,将其初始化为:m0=0,v0=0
mt、vt分别是梯度的一阶矩(均值)和二阶矩(非中心方差)的估计值:
由于移动指数平均在迭代开始的初期会导致和开始的值有较大的差异,所以我们需要对上面求得的几个值做偏差修正。通过计算偏差校正的一阶和二阶矩估计来抵消这些偏差:
然后使用这些来更新参数,就像在 RMSprop 中看到的那样, Adam 的参数更新公式:
在Adam算法中,参数 β1所对应的就是Momentum算法中的 阝值,一般取0.9,参数 β2 所对应的就是RMSProp算法中的阝值,一般我们取0.999,而ε是一个平滑项,我们一般取值为10-8,而学习率则需要我们在训练的时候进行微调。
三、损失函数
(一)损失函数定义
在机器学习任务中,大部分监督学习算法都会有一个目标函数 (Objective Function),算法对该目标函数进行优化,称为优化算法的过程。 例如在分类或者回归任务中,使用损失函数( Loss Function )作为其目标函数对算法模型进行优化 。
在BP神经网络中,一般推导中,使用均方误差作为损失函数,而在实际中,常用交叉熵作为损失函数。
1. 均方误差作为损失函数收敛速度慢,可能会陷入局部最优解;
2. 而交叉熵作为损失函数的收敛速度比均方误差快,且较为容易找到函数最优解。
因此了解损失函数的类型并掌握损失函数的使用技巧,有助于加深对深度学习的认知。
损失函数是用来评价网络模型的输出的预测值 与真实值 Y之间的差异。我们使用 来表示损失函数(非负实值函数)。损失函数越小说明网络模型的性能越好。我们的目的是让损失函数尽可能的小。假设网络模型中有 N 个样本,样本的输入和输出向量为 ,则损失函数为每一个输出预测值与真实值的差之和。
对于分类和回归模型使用的损失函数不同,下面将分别进行介绍。
(二)回归损失函数
1.均方误差损失函数
均方误差(Mean Squared Error Loss, MSE)损失函数定义如下:

代码示例:
def mean_squared_error(y_true, y_pred):
return np.mean(np.square(y_pred - y_true), axis=-1)
2.平均绝对误差损失函数
平均绝对误差(Mean Absolute Error Loss, MAE)损失函数定义如下:

代码示例:
def mean_absolute_error(y_true, y_pred):
return np.mean(np.abs(y_pred - y_true), axis=-1)
3.均方误差对数损失函数
均方误差对数(Mean Squared Log Error Loss, MSLE)损失函数定义如下:

代码示例:
def mean_squared_logarithmic_error(y_true, y_pred):
first_log = np.log(np.clip(y_pred, 10e-6, None) + 1.)
second_log = np.log(np.clip(y_true, 10e-6, None) + 1.)
return np.mean(np.square(first_log - second_log), axis=-1)
(4) 平均绝对百分比误差损失函数
平均绝对百分比(Mean Absolute Percentage Error Loss, MAPE)误差损失函数定义如下:

代码示例:
def mean_absolute_percentage_error(y_true, y_pred):
diff = np.abs((y_pred - y_true) / np.clip(np.abs(y_true), 10e-6, None))
return 100 * np.mean(diff, axis=-1)
(5) 小结
均方误差损失函数是使用最广泛的,并且在大部分情况下,均方误差有着不错的性能,因此被用作损失函数的基本衡量指标。MAE 则会比较有效地惩罚异常值, 如果数据异常值较多,需要考虑使用平均绝对误差损失作为损失函数。一般情况下,为了不让数据出现太多异常值,可以对数据进行预处理操作。
均方误差对数损失与均方误差的计算过程类似,多了对每个输出数据进行对数计算,目的是缩小函数输出的范围值。平均绝对百分比误差损失则计算预测值与真实值的相对误差。均方误差对数损失与平均绝对百分比误差损失实际上是用来处理大范围数据( [ − 105 , 105 ]的,但是在神经网络中,我们常把输入归一化到一个合理范围 ( [ − 1 , 1 ]),然后再使用均方误差或者平均绝对误差损失来计算损失。
(三)分类损失函数
1.Logistic损失函数
Logistic损失函数定义如下:

2.负对数似然损失函数
负对数似然损失函数(Negative Log Likelihood Loss)定义如下:

3.交叉熵损失函数
Logistic损失函数和负对数似然损失函数只能处理二分类问题,对于两个分类扩展到M个分类,使用交叉熵损失函数(Cross Entropy Loss),其定义如下:

代码示例:
def cross_entropy(y_true, y_pred):
return -np.mean(y_true * np.log(y_pred + 10e-6))
4.Hinge损失函数
运用 Hinge 损失的典型分类器是 SVM 算法,因为 Hinge 损失可以用来解决间隔最大化问题。当分类模型需要硬分类结果的,例如分类结果是 0或1、-1或1的二分类数据, Hinge 损失是最方便的选择 。Hinge 损失函数定义如下:

代码示例:
def hinge(y_true, y_pred):
return np.mean(np.maximum(1. - y_true * y_pred, 0.), axis=-1)
5.指数损失函数
使用指数(Exponential)损失函数的典型分类器是 AdaBoost 算法,指数损失函数的定义如下:

代码示例:
def exponential(y_true, y_pred):
return np.sum(np.exp(-y_true * y_pred))
(四)神经网络中常用的损失函数
神经网络中的损失函数可以自定义,前提是需要考虑数据本身和用于求解的优化方案。换句话说,自定义损失函数需要考虑输入的数据形式和对损失函数求导的算法。自定义损失函数其实是有些难度的,在实际工程项目上,结合激活函数来选择损失函数是常见的做法,常用组合有以下 3 种 。
1.ReLU + MSE
均方误差损失函数无法处理梯度消失问题,而使用 Leak ReLU 激活函数能够减少计算时梯度消失的问题,因此在神经网络中如果需要使用均方误差损失函数,一般采用 Leak ReLU 等可以减少梯度消失的激活函数。另外,由于均方误差具有普遍性,一般作为衡量损失值的标准,因此使用均方误差作为损失函数表现既不会太好也不至于太差。
2.Sigmoid + Logistic
Sigmoid 函数会引起梯度消失问题:根据链式求导法,Sigmoid 函数求导后由多个[0, 1]范围的数进行连乘,当其中一个数很小时,连乘后会无限趋近于零直至最后消失。而类 Logistic 损失函数求导时,加上对数后连乘操作转化为求和操作,在一定程度上避免了梯度消失,所以我们经常可以看到 Sigmoid 激活函数+交叉摘损失函数 的组合。
3.Softmax + Logisitc
在数学上,Sotmax 激活函数会返回输出类的互斥概率分布,也就是能把离散的输出转换为一个同分布互斥的概率,如(0.2,0.8)。另外,Logisitc 损失函数是基于概率的最大似然估计函数而来的,因此输出概率化能够更加方便优化算法进行求导和计算,所以我们经常可以看到输出层使用 Softmax 激活函数+交叉熵损失函数的组合。
(五)激活函数、损失函数、优化函数的区别
1.激活函数:将神经网络上一层的输入,经过神经网络层的非线性变换转换后,通过激活函数,得到输出。常见的激活函数包括:sigmoid, tanh, relu等
2.损失函数:度量神经网络的输出的预测值,与实际值之间的差距的一种方式。常见的损失函数包括:最小二乘损失函数、交叉熵损失函数、回归中使用的smooth L1损失函数等。
3.优化函数:也就是如何把损失值从神经网络的最外层传递到最前面。如最基础的梯度下降算法,随机梯度下降算法,批量梯度下降算法,带动量的梯度下降算法,Adagrad,Adadelta,Adam等。
四、CNN卷积神经网络
(一)CNN 特点:
1. 能够有效的将大数据量的图片降维成小数据量。
2. 能够有效的保留图片特征,符合图片处理的原则。
(二)CNN两大核心:
卷积层最主要的两个特征就是局部连接和权值共享,有些地方又叫做稀疏连接和参数共享。
通过卷积操作实现局部连接,这个局部区域的大小就是滤波器filter,避免了全连接中参数过多造成无法计算的情况,
再通过参数共享来缩减实际参数的数量,为实现多层网络提供了可能。
1.局部连接:
(1)一般认为图像的空间联系是局部的像素联系比较密切,而距离较远的像素相关性较弱,因此,每个神经元没必要对全局图像进行感知,只要对局部进行感知,然后在更高层将局部的信息综合起来得到全局信息。利用卷积层实现:(特征映射,每个特征映射是一个神经元阵列):从上一层通过局部卷积滤波器提取局部特征。卷积层紧跟着一个用来求局部平均与二次提取的计算层,这种二次特征提取结构减少了特征分辨率。
(2)即网络部分连通,每个神经元只与上一层的部分神经元相连,只感知局部,而不是整幅图像。(滑窗实现)
2.参数共享:
(1)在局部连接中,每个神经元的参数都是一样的,即:同一个卷积核在图像中都是共享的。(理解:卷积操作实际是在提取一个个局部信息,而局部信息的一些统计特性和其他部分是一样的,也就意味着这部分学到的特征也可以用到另一部分上。所以对图像上的所有位置,都能使用同样的学习特征。)卷积核共享有个问题:提取特征不充分,可以通过增加多个卷积核来弥补,可以学习多种特征。
(2)对于一个100x100像素的图像,如果我们用一个神经元来对图像进行操作,这个神经元大小就是100x100=10000,但如果我们使用10x10的卷积核,我们虽然需要计算多次,但我们需要的参数只有10x10=100个,加上一个偏向b,一共只需要101个参数。我们取得图像大小还是100x100。
(3)如果我们取得图像比较大,它的参数将会更加多。我们通过10*10的卷积核对图像进行特征提取,这样我们就得到一个Feature Map。
(4)一个卷积核只能提取一个特征,所以我们需要多几个卷积核,假设我们有6个卷积核,我们就会得到6个Feature Map,将这6个Feature Map组成一起就是一个神经元。这6个Feature Map我们需要101*6=606个参数。这个值和10000比还是比较小的。
(三)CNN网络介绍
以下主要介绍:卷积层、池化层、激活函数、全连接层概念及原理
1. 卷积层
卷积是一种有效提取图片特征的方法 。 一般用一个正方形卷积核,遍历图片上的每一个像素点。图片与卷积核重合区域内相对应的每一个像素值,乘卷积核内相对应点的权重,然后求和,再加上偏置后,最后得到输出图片中的一个像素值。
图片分灰度图和彩色图,卷积核可以是单个也可以是多个,因此卷积操作分以下三种情况:
(1)单通道输入,单卷积核
这里单通道指的是输入为灰度图,单卷积核值卷积核个数是1个。

上面是 5x5x1 的灰度图片,1 表示单通道,5x5 表示分辨率,共有5行5列个灰度值。若用一个 3x3x1 的卷积核对此 5x5x1 的灰度图片进行卷积,偏置项b=1,,则求卷积的计算是:(-1)x1+0x0+1x2+(-1)x5+0x4+1x2+(-1)x3+0x4+1x5+1=1(注意不要忘记加偏置 1)。
(2)多通道输入,单卷积核
多数情况下,输入的图片是 RGB 三个颜色组成的彩色图,输入的图片包含了红、绿、蓝三层数据,卷积核的深度(通道数)应该等于输入图片的通道数,所以使用 3x3x3的卷积核,最后一个 3 表示匹配输入图像的 3 个通道,这样这个卷积核有三通道,每个通道都会随机生成 9 个待优化的参数,一共有 27 个待优化参数 w 和一个偏置 b。

注:这里还是单个卷积核的情况,但是一个卷积核可以有多个通道。默认情况下,卷积核的通道数等于输入图片的通道数。
(3)多通道输入,多卷积核
多通道输入、多卷积核是深度神经网络中间最常见的形式。指的是多通道输入,且用多个卷积核的情况。那么卷积过程其实也很简单,以3通道输入。2个卷积核为例:
①先取出一个卷积核与3通道的输入进行卷积,这个过程就和多通道输入,单卷积核一样,得到一个1通道的输出output1。同样再取出第二个卷积核进行同样的操作,得到第二个输出output2
②将相同size的output1与output2进行堆叠,就得到2通道的输出output。
为了更直观地理解,下面给出图示:

图中输入X:[1,h,w,3]指的是:输入1张高h宽w的3通道图片。
卷积核W:[k,k,3,2]指的是:卷积核尺寸为3*3,通道数为3,个数为2。
总结:
①卷积操作后,输出的通道数=卷积核的个数
②卷积核的个数和卷积核的通道数是不同的概念。每层卷积核的个数在设计网络时会给出,但是卷积核的通道数不一定会给出。默认情况下,卷积核的通道数=输入的通道数,因为这是进行卷积操作的必要条件。
(3)偏置数=卷积核数
(4)填充padding
为了使卷积操作后能得到满意的输出图片尺寸,经常会使用padding对输入进行填充操作。默认在图片周围填充0。
①全零填充padding='same’
使用same时,会自动对原图进行全0填充,当步长为1时,可以保证输出的图片与输入的图片尺寸一致。
输出尺寸计算公式:输入长/步长 (向上取整)
TensorFlow中实现如下:(这里以卷积核个数:48,卷积核尺寸:3,步长:1,全填充为例)
layers.Conv2D(48, kernel_size=3, strides=1, padding='same')
②不填充padding='valid’
使用valid时,不进行任何填充,直接进行卷积,这是layers.Conv2D()默认的方式。
输出尺寸计算公式:(输入长-核长)/步长+1(向下取整)
TensorFlow中实现如下:
layers.Conv2D(48, kernel_size=3, strides=1, padding='valid')
③自定义填充
一般是从上下左右四个方向进行填充,且左、右填充的列数pw一般相同,上、下填充的行数ph也应该相同。如下图所示:

输出尺寸计算公式:


其中,h,w为原图的高和宽,k是卷积核的尺寸,s是步长。
在TensorFlow2.0中,自定义填充过程中,padding参数的设置格式为:
padding=[[0,0],[上,下],[左,右],[0,0]]
# 例如要在上下左右各填充一个单位,实现如下:
layers.Conv2D(48, kernel_size=3, strides=1, padding=[[0,0], [1,1], [1,1], [0,0]])
2. 池化层
池化作用如下:
(1)使卷积神经网络抽取特征是保证特征局部不变性。
(2)池化操作能降低维度,减少参数数量。
(3)池化操作优化比较简单。
在卷积层中,可以通过调节步长参数 s 实现特征图的高宽成倍缩小,从而降低了网络的参数量。实际上,除了通过设置步长,还有一种专门的网络层可以实现尺寸缩减功能,它就是我们要介绍的池化层(Pooling layer )。
池化层同样基于局部相关性的思想,通过从局部相关的一组元素中进行采样或信息聚合,从而得到新的元素值。通常我们用到两种池化进行采样:
(1)最大池化(Max Pooling),从局部相关元素集中选取最大的一个元素值。
(2)平均池化(Average Pooling),从局部相关元素集中计算平均值并返回。
3.激活函数
激活函数也是神经网络不可缺少的部分,激活函数是用来加入非线性因素,提高网络表达能力,卷积神经网络中最常用的是ReLU,Sigmoid使用较少

4.全连接层
全连接层FC,之所以叫全连接,是因为每个神经元与前后相邻层的每一个神经元都有连接关系。如下图所示,是一个简单的两层全连接网络,输入是特征,输出是预测的结果。

全连接层的参数量是可以直接计算的,计算公式如下:

按照上图搭建的两层全连接网络,要训练分辨率仅仅是 28x28=784 的黑白图像,就有近 40 万个待优化的参数。现实生活中高分辨率的彩色图像,像素点更多,且为红绿蓝三通道信息。待优化的参数过多,容易导致模型过拟合。为避免这种现象,实际应用中一般不会将原始图片直接喂入全连接网络。
在实际应用中,会先对原始图像进行卷积特征提取,把提取到的特征喂给全连接网络,再让全连接网络计算出分类评估值。
5. 网络参数量与计算量
卷积层参数/卷积计算量
卷积参数 = 卷积核长度x卷积核宽度x输入通道数x输出通道数+输出通道数(偏置)
卷积计算量 = 输出数据大小x卷积核的尺度x输入通道数
例:输入:224x224x3,输出:224x244x64,卷积核:3x3
参数量 = 3x3x3x64+64
计算量 = 224x224x64x3x3x3
卷积层:
比如:输入是32×32×3的彩色图片,经过卷积层
layers.Conv2D(100, kernel_size=3, strides=1, padding='same')
(1)网络参数量
主要是卷积核的参数和偏置的参数: 3x3x3x100+100=2800
(2)计算量FLOPS
深度学习框架FLOPs的概念:Floating point operations,即浮点运算数量。
{32x32x[3x3+(3x3-1)]x3+32x32x(3-1)}x100
全连接层:
比如第一层节点数是5,第二层节点数是10,求网络参数量和计算量FLOPS
(1)网络参数量
网络参数量主要来源神经元连接权重和偏置:5x10+10=60
(2)计算量FLOPS
5x10+10=60
2015 年,Google 研究人员Sergey 等基于参数标准化设计了BN层。BN层提出后,广泛地应用在各种深度网络模型上,使得网络的超参数的设定更加自由,同时网络的收敛速度更快,性能也更好。
6.卷积神经网络训练:
(1)训练基本流程:
Step 1:用随机数初始化所有的卷积核和参数/权重
Step 2:将训练图片作为输入,执行前向步骤(卷积, ReLU,池化以及全连接层的前向传播)并计算每个类别的对应输出概率。
Step 3:计算输出层的总误差
Step 4:反向传播算法计算误差相对于所有权重的梯度,并用梯度下降法更新所有的卷积核和参数/权重的值,以使输出误差最小化
注:卷积核个数、卷积核尺寸、网络架构这些参数,是在 Step 1 之前就已经固定的,且不会在训练过程中改变——只有卷积核矩阵和神经元权重会更新。

和多层神经网络一样,卷积神经网络中的参数训练也是使用误差反向传播算法,关于池化层的训练,需要再提一下,是将池化层改为多层神经网络的形式


将卷积层也改成多层神经网络的形式

(2)CNN详细求解:
CNN在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。
卷积网络执行的是监督训练,所以其样本集是由形如:(输入向量,理想输出向量)的向量对构成的。所有这些向量对,都应该是来源于网络即将模拟系统的实际“运行”结构,它们可以是从实际运行系统中采集来。
1)参数初始化:
在开始训练前,所有的权都应该用一些不同的随机数进行初始化。“小随机数”用来保证网络不会因权值过大而进入饱和状态,从而导致训练失败;“不同”用来保证网络可以正常地学习。实际上,如果用相同的数去初始化权矩阵,则网络无学习能力。
2)训练过程包括四步
① 第一阶段:前向传播阶段
从样本集中取一个样本,输入网络
计算相应的实际输出;在此阶段信息从输入层经过逐级的变换,传送到输出层,这个过程也是网络在完成训练之后正常执行时执行的过程
② 第二阶段:后向传播阶段
计算实际输出与相应的理想输出的差
按照极小化误差的方法调整权值矩阵
网络的训练过程如下:
选定训练组,从样本集中分别随机地寻求N个样本作为训练组;
将各权值、阈值,置成小的接近于0的随机值,并初始化精度控制参数和学习率;
从训练组中取一个输入模式加到网络,并给出它的目标输出向量;
计算出中间层输出向量,计算出网络的实际输出向量;
将输出向量中的元素与目标向量中的元素进行比较,计算出输出误差;对于中间层的隐单元也需要计算出误差;
依次计算出各权值的调整量和阈值的调整量;
调整权值和调整阈值;
当经历M后,判断指标是否满足精度要求,如果不满足,则返回(3),继续迭代;如果满足就进入下一步;
训练结束,将权值和阈值保存在文件中。这时可以认为各个权值已经达到稳定,分类器已经形成。再一次进行训练,直接从文件导出权值和阈值进行训练,不需要进行初始化。
五、经典网络介绍

(一)LeNet-5



神经元个数=卷积核数量X输出特征图宽度X输出特征图高度
卷积层可训练参数数量=卷积核数量X(卷积核宽度X卷积核高度+1)(1表示偏置)
汇聚层可训练参数数量=卷积核数量X(1+1)(两个1分别表示相加后的系数和偏置,有的汇聚层无参数)
连接数=卷积核数量X(卷积核宽度X卷积核高度+1)X输出特征图宽度X输出特征图高度(1表示偏置)
全连接层连接数=卷积核数量X(输入特征图数量X卷积核宽度X卷积核高度+1)(输出特征图尺寸为1X1)
(二)AlexNet



(三)Inception网络



(四)残差网络

六、RNN循环神经网络




RNN 的基本原理
传统神经网络的结构比较简单:输入层 – 隐藏层 – 输出层。如下图所示:

RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。如下图所示:

七、LSTM长短期记忆神经网络
(一)LSTM的产生原因
RNN在处理长期依赖(时间序列上距离较远的节点)时会遇到巨大的困难,因为计算距离较远的节点之间的联系时会涉及雅可比矩阵的多次相乘,会造成梯度消失或者梯度膨胀的现象。其中最成功应用最广泛的就是门限RNN(Gated RNN),而LSTM就是门限RNN中最著名的一种。有漏单元通过设计连接间的权重系数,从而允许RNN累积距离较远节点间的长期联系;而门限RNN则泛化了这样的思想,允许在不同时刻改变该系数,且允许网络忘记当前已经累积的信息
(二)RNN和LSTM的区别
所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层,如下图所示

LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

注:上图图标具体含义如下所示:

上图中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。
(三)LSTM核心
LSTM 有通过称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个pointwise乘法操作。示意图如下:

LSTM 拥有三个门,分别是遗忘门,输入层门和输出层门,来保护和控制细胞状态。
1.忘记层门
作用对象:细胞状态 。
作用:将细胞状态中的信息选择性的遗忘。
操作步骤:该门会读取ht−1和xt,输出一个在 0 到 1 之间的数值给每个在细胞状态Ct−1中的数字。1 表示“完全保留”,0 表示“完全舍弃”。示意图如下:

2.输入层门
作用对象:细胞状态
作用:将新的信息选择性的记录到细胞状态中。
操作步骤:
步骤一,sigmoid 层称 “输入门层” 决定什么值我们将要更新。
步骤二,tanh 层创建一个新的候选值向量C~t加入到状态中。其示意图如下:

步骤三:将ct−1更新为ct。将旧状态与ft相乘,丢弃掉我们确定需要丢弃的信息。接着加上it∗C~t得到新的候选值,根据我们决定更新每个状态的程度进行变化。 其示意图如下:

3.输出层门
作用对象:隐层ht
作用:确定输出什么值。
操作步骤:
步骤一:通过sigmoid 层来确定细胞状态的哪个部分将输出。
步骤二:把细胞状态通过 tanh 进行处理,并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
其示意图如下所示:

本文转载自CSDN博主GoAI,内容有删改 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/qq_36816848/article/details/122286610?ops_request_misc=%257B%2522request%255Fid%2522%253A%252219992d15d94549d5fc88fe228659620a%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=19992d15d94549d5fc88fe228659620a&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-122286610-null-null.142^v100^pc_search_result_base7&utm_term=%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0&spm=1018.2226.3001.4187 |