神经网络基础

Posted on 2022-07-04 15:14  Charlie_ODD  阅读(367)  评论(0编辑  收藏  举报

变换

线性、非线性变换

在学习神经网络过程中多次看到线性、非线性变换,什么是线性变换和非线性变换,线性和非线性是怎么界定的:一个变换,其实就是一个函数f(x),输入为x,在通过这个函数之后就变成了y对吧,那么这个从输入到输出的转变过程就是所谓的变换,至于变换是非线性还是线性的,完全取决于函数长什么样子,如果函数可以表达为ax+b的形式,就是线性的(在平面上画出来是一条直线),如果出现了指数(x^3)或者对数项(log(x))之类的,就是非线性的(在平面上画出来是一条曲线)

空间变换

  • 升维/降维 (非线性)
  • 放大/缩小 (线性)
  • 旋转 (线性)
  • 平移 (线性)
  • 弯曲 (非线性)

激活函数

神经网络为什么要使用激活函数?有什么好处?

https://blog.csdn.net/program_developer/article/details/78704224

激活函数为什么不能用线性的?

激活函数原则上可以是任何函数,只要它不是线性的。 为什么? 如果我们使用线性激活就等于根本没有激活。这样我们的网络将有效地变成一个简单的线性回归模型,无论我们使用多少层和单元。 这是因为线性组合的线性组合可以表示为单个线性方程。

这样的网络学习能力有限,因此需要引入非线性。

激活函数的选择应该满足哪些性质?

  • 连续并可导(允许少数点上不可导)的非线性函数,可导的激活函数可以直接利用数值优化的方法来学习网络参数
  • 激活函数及其导函数要尽可能简单,有利于提高网络计算效率
  • 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性

激活函数以0为中心,为什么可以加速收看收敛(尤其在训练初期)?

说法1:非零中心化的输出会使得后一层的神经元输入发生偏置偏移,进一步使得梯度下降的收敛速度变慢

典型的激活函数有哪些?它们之间的区别、优劣及应用场景?

Sigmoid:

tanh:

Softmax:

(1)sigmoid型函数:一类S型曲线函数,如Logistic、Tanh

    • Logistic(最朴素的sigmoid)性质:
    • 输出值非0中心化,为(0,1)
    • 其输出值可直接看作概率分布
    • 看作软性门来控制其他神经元输出信息的数量(?)
    • 存在梯度消失问题
    • 包含了 e^z 项,因此该函数的计算成本很高。
    • 常在输出层使用sigmoid,如当我们构建二进制分类器时,输出层必须使用 sigmoid 函数,其中输出被解释为类标签,具体取决于函数返回的输入的概率值。

    • Tanh性质:
    • Tanh可看作放大并平移的Logistic(tanh 函数的梯度比 sigmoid 函数的梯度更陡
    • 输出值0中心化,为(-1,1)
    • 存在梯度消失问题
    • 包含了 e^z 项,因此该函数的计算成本很高。

    • sigmoid 常在 RNN 中使用,而通常不将 sigmoid 函数用于 MLP 和 CNN 中的隐藏层,因为太慢了,我们在那里使用 ReLU 或 Leaky ReLU。(?)
    • 不在输出层使用 tanh 函数

(2)RELU型函数

  • RELU

    • ReLU 函数是一个分段线性函数,整体上看是一个非线性函数。
    • 输出范围可以从 0 到正无穷大。
    • 收敛速度比 sigmoid 和 tanh 函数快,这是因为 ReLU 函数对一个线性分量具有固定导数(斜率),而对另一个线性分量具有零导数。
    • 不存在梯度消失问题
    • ReLU(整流线性单元)激活函数是 sigmoid 和 tanh 激活函数的绝佳替代品(?)
    • ReLU 函数是MLP 和 CNN 神经网络模型中隐藏层的默认激活函数。
    • 通常不会在 RNN 模型的隐藏层中使用 ReLU 函数,相反使用 sigmoid 或 tanh 函数
    • 从不在输出层使用 ReLU 函数
    • 使用 ReLU 函数的主要缺点是它有一个dying ReLU问题。(当梯度值过大时,权重更新后为负数,经relu后变为0,导致后面也不再更新)(?)
  • Leaky ReLU

    • 如果输入值是 0 大于 0,leaky ReLU 函数会像默认的 ReLU 函数一样输出输入。 但是如果输入小于 0,leaky ReLU 函数会输出一个由 αz 定义的小负值(其中 α 是一个小的常数值,通常为 0.01,z 是输入值);它没有任何具有零导数(斜率)的线性分量。 因此它可以避免dying ReLU 问题。
  • Relu6
    • ReLU 和 ReLU6 之间的主要区别在于,ReLU 允许正侧的值非常高,而 ReLU6 限制为正侧的值 6。 任何 6 或大于 6 的输入值都将被限制为值 6(因此得名)。

(3)SoftMax

softmax 函数计算一个事件(类)在 K 个不同事件(类)上的概率值。 它计算每个类别的概率值。 所有概率的总和为 1,这意味着所有事件(类)都是互斥的。

  • 必须在多类分类问题的输出层使用 softmax 函数。
  • 不在隐藏层中使用 softmax 函数。

(4)Swish型

  • Swish

    • 该函数是通过将 sigmoid 函数乘以输入 z 构成的。
    • 这是一个非线性函数。
    • 该图与 ReLU 激活函数的图非常相似。
    • 曲线比 ReLU 激活函数更平滑。 在训练模型时,这种平滑度很重要。 该函数在训练时很容易收敛。
    • 仅在隐藏层中使用。
    • 不在神经网络模型的输出层使用这个函数。
    • Swish 函数的主要缺点是计算量很大,因为函数中包含了 e^z 项。 这可以通过使用下面定义的称为“Hard Swish”的特殊函数来避免。
  • H-Swish

与 Swish 函数的曲线基本相同。这在计算上很便宜,因为 sigmoid 函数被线性模拟取代。

 

(4)二元阶梯 & 恒等

二元阶梯函数也称为阈值激活函数。 我们可以将任何值设置为阈值,在这里我们指定值 0。通常不会在现代神经网络模型中使用这个函数。

这也被称为线性激活函数。当我们讨论激活函数时,这是唯一一个被认为是线性函数的函数。这个函数按原样输出输入值。对输入不做任何更改。该函数仅用于解决回归问题的神经网络模型的输出层。不要在隐藏层中使用这个函数。

神经网络为什么通常需要堆叠?加深有什么好处?

 

梯度消失与梯度爆炸

什么是梯度消失、梯度爆炸

梯度消失:梯度下降法更新参数完全依赖于梯度值,极小的梯度无法让参数得到有效更新,即使有微小的更新,浅层和深层网络参数的更新速率也相差巨大。该现象就称为“梯度消失(Vanishing Gradients)

如sigmoid:Sigmoid梯度的取值在(0,0.25)

梯度爆炸:一般出现在深层网络权值初始化值太大的情况下。在深层神经网络或循环神经网络中,误差的梯度可在更新中累积相乘。如果网络层之间的梯度值大于 1.0,那么重复相乘会导致梯度呈指数级增长,梯度变的非常大,然后导致网络权重的大幅更新,并因此使网络变得不稳定。

梯度爆炸会伴随一些细微的信号,如:①模型不稳定,导致更新过程中的损失出现显著变化;②训练过程中,在极端情况下,权重的值变得非常大,以至于溢出,导致模型损失变成 NaN等等。

产生梯度消失或梯度爆炸这种现象的原因?

  • 深层网络,链式连乘效应累积

由于深度网络是多层非线性函数的堆砌,整个深度网络可以视为是一个复合的非线性多元函数(这些非线性多元函数其实就是每层的激活函数),那么对loss function求不同层的权值偏导,相当于应用梯度下降的链式法则,链式法则是一个连乘的形式,所以当层数越深的时候,梯度将以指数传播。

如果接近输出层的激活函数求导后梯度值大于1,那么层数增多的时候,最终求出的梯度很容易指数级增长,就会产生梯度爆炸;相反,如果小于1,那么经过链式法则的连乘形式,也会很容易衰减至0,就会产生梯度消失

从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。

  • 激活函数的梯度取值过大或过小
  • 初始化权重的值过大或过小

如何解决梯度消失或梯度爆炸

  • 梯度剪切:对梯度设定阈值

梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。

  • 权重正则化

另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization),正则化主要是通过对网络权重做正则来限制过拟合。如果发生梯度爆炸,那么权值就会变的非常大,反过来,通过正则化项来限制权重的大小,也可以在一定程度上防止梯度爆炸的发生。比较常见的是 L1 正则和 L2 正则。

  • 激活函数

选择relu等梯度大部分落在常数上的,relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。

  • batch normalization

BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。

关于Batch Normalization(BN)的详细内容可以参考我之前的文章——常用的 Normalization 方法:BN、LN、IN、GN

  • 残差网络的捷径(shortcut)

说起残差结构的话,不得不提这篇论文了:Deep Residual Learning for Image Recognition。论文链接:http://openaccess.thecvf.com/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf

相比较于以前直来直去的网络结构,残差中有很多这样(如上图所示)的跨层连接结构,这样的结构在反向传播中具有很大的好处,可以避免梯度消失。

  • LSTM的“门(gate)”结构

LSTM全称是长短期记忆网络(long-short term memory networks),LSTM的结构设计可以改善RNN中的梯度消失的问题。主要原因在于LSTM内部复杂的“门”(gates),如下图所示。

LSTM 通过它内部的“门”可以在接下来更新的时候“记住”前几次训练的”残留记忆“。

神经网络增加深度和宽度

神经网络加深和加宽的影响https://blog.csdn.net/weixin_41986795/article/details/109024685

为什么是深度神经网络而不是宽度神经网络?增加神经网络的深度相比于增加宽度有哪些优点?

Bengio和LeCun等人的论文《Scaling learning algorithms towards AI》中提到,如果一个深层结构能够刚刚好解决问题,那么就不可能用一个更浅的同样紧凑的结构来解决,因此要解决复杂的问题,要么增加深度,要么增加宽度。但是神经网络一般来说不是越深越好,也不是越宽越好,并且由于计算量的限制或对于速度的需求,如何用更少的参数获得更好的准确率无疑是一个永恒的追求。

(1)宽:

宽而浅的网络可能比较擅长记忆,却不擅长概括,即泛化能力差。如应用 Wide&Deep

(2)深:

深层网络相比于浅层网络在实际应用中体现出来的表达能力。多层的优势在于可以在不同的抽象层次上学习特征,随着层数的增加,每个神经元相对于前一层的感受野变得越来越大,因此深层可以提供全局语义和抽象细节的信息,这是宽层很难做到的。如应用MobileNet

  • 更深的网络表达能力更强:深度学习之所以越来越受到学者的重视很大一部分原因就是他几乎可以很好的拟合出各种类型的目标函数,达到较好的拟合效果。而真实情况的目标函数几乎不可能是线性函数,基本都是非线性函数。深度学习的模型中主要包括卷积层、池化层、激活层、BN层等,这些基本都是在进行非线性变换。更深的网络就意味着网络可以学习到更加复杂的变换,拟合更复杂的特征输入,更深的网络结构有更为灵活且强大的非线性拟合能力或是非线性表达能力。
  • 更深的网络使网络学习更加容易:网络结构是进行抽象信息的提取,网络结构更深代表其抽象层级也越深,这就意味着网络层可以学习到更为复杂的特征。层数的网络有效深感受野大,特征通道多,但深到一定程度,提升就不会太显著了
  • 深度网络可以在输入空间上紧凑地表达高度复杂的函数
  • 深层神经网络可以将输入空间中高度弯曲的决策边界分离为隐含空间中平坦的决策边界,以帮助提高简单线性分类器的性能

深未必一定好,宽也未必不好。实际上,深度和宽度并不是完全对立的关系,增加深度和宽度都是在增加可学习参数的个数,从而增加神经网络的拟合能力,在网络设计时,两者都会考虑,追求深度与广度的平衡。增加网络深度可以获得更大的感受野来帮助捕获更多像素点的类似特征,增加网络宽度可以获得更细粒度、更丰富的特征。

损失函数

损失函数(loss function)是用来估量你模型的预测值与真实值的不一致程度,它是一个非负实值函数,通常使用来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分。模型的结构风险函数包括了经验风险项和正则项,通常可以表示成如下式子(一般来说,监督学习可以看做最小化下面的目标函数):

式子左边表示经验风险函数,损失函数是其核心部分;式子右边是正则项。式子整体是结构风险函数,其由经验风险函数和正则项组成。

其中,第一项 衡量我们的模型(分类或者回归)对第个样本的预测值和真实的标签之前的误差。因为我们的模型是要拟合我们的训练样本的,所以我们要求这一项最小。即前面的均值函数表示的是经验风险函数,代表的是损失函数;

但正如上面说言,我们不仅要保证训练误差最小,我们更希望我们的模型测试误差小,所以我们需要加上第二项,也就是对参数的规则化函数去约束我们的模型尽量的简单。即后面的是正则化项(regularizer)或者叫惩罚项(penalty term),它可以是,也可以是,或者其他的正则函数。

整个式子表示的意思是找到使目标函数最小时的值。机器学习的大部分带参模型都和这个不但形似,而且神似,其实大部分无非就是变换这两项而已。

常见的损失函数 (公式符号规范化)

说明:代表真实值,代表预测值,表示样本中的第个样本,

分类的损失函数

  • 0-1损失函数

对应分类判断错误的个数,满足 时认为相等,感知机就是用的这种损失函数。

  • 指数损失函数 (这个需要review一下)

对离群点、噪声非常敏感。经常用在 AdaBoost 算法中

  • Hinge (铰链) 损失函数

hinge 损失函数表示如果被分类正确,损失为 0,否则损失就为 。SVM模型的损失函数本质上就是 Hinge Loss + L2 正则化

健壮性相对较高,对异常点、噪声不敏感,但它没太好的概率解释

  • 对数损失函数

  • 交叉熵损失函数

Cross-entropy loss function

本质上也是一种对数似然函数,可用于二分类和多分类任务中

    • 二分类

    • 多分类

当使用 sigmoid 作为激活函数的时候,常用交叉熵损失函数而不用均方差损失函数,因此它可以完美解决平方损失函数权重更新过慢的问题,具有“误差大的时候,权重更新快;误差小的时候,权重更新慢”的良好性质 (?)

回归的损失函数

  • 绝对值损失函数

Mean Absolute Error Loss---MAE

计算预测值与目标值的差的绝对值

  • 平方损失函数(均方误差损失函数)

Mean Squared Error Loss----MSE

常应用与回归问题