个人学习资料记录,转载已注明链接,持续更新中。。。
25+个基础概念
转载自 :http://dwz.date/b8hE自己添加部分。
基础概念
神经元(Neuron)
正如我们大脑中的基本组成单元,神经元是组成神经网络的基础结构。设想一下当接触到新的信息时,我们的身体会对其进行处理,最后产生一些特定的反应。
相似地,在神经网络中,在收到输入的信号之后,神经元通过处理,然后把结果输出给其它的神经元或者直接作为最终的输出。
加权/权重(Weights)
当输入信号进入到神经元后,会被乘以相应的权重因子。举例来说,假设一个神经元有两个输入信号,那么每个输入将会存在着一个与之相应的权重因子。在初始化网络的时候,这些权重会被随机设置,然后在训练模型的过程中再不断地发生更改。
在经过训练后的神经网络中,一个输入具有的权重因子越高,往往意味着它的重要性更高,对输出的影响越大。另一方面,当权重因子为0时意味着这个输入是无价值的。
如下图所示,假设输入为a,相应的权重为W1。那么通过赋权节点后相应的输入应变为a*W1。
偏置/偏倚(Bias)
除了权重之外,输入还需要经过另外一种线性处理,叫做偏置。通过把偏置b与加权后的输入信号a*W1直接相加,以此作为激活函数的输入信号。
激活函数
之前线性处理之后的输入信号通过激活函数进行非线性变换,从而得到输出信号。即最后输出的信号具有f(a*W1+b)的形式,其中f()为激活函数。
在下面的示意图中, 设X1…Xn等n个输入分别对应着权重因子Wk1…Wkn以及相应的偏置b1…bn。我们把输入Xi乘以对应的权重因子Wki再加上bi的结果称为u。
u=∑w*x+b
这个激活函数f是作用在u上的,也就是说这个神经元最终的输出结果为yk = f(u)
接下来我们讲一讲常用的一些激活函数:Sigmoid函数, 线性整流函数(ReLU) 和 softmax函数
(a) Sigmoid函数
作为最常用的激活函数之一,它的定义如下:
△ 来源:维基百科
sigmoid函数为值域在0到1之间的光滑函数,当需要观察输入信号数值上微小的变化时,与阶梯函数相比,平滑函数(比如Sigmoid函数)的表现更好。
(b) 线性整流函数(ReLU-Rectified Linear Units)
近来的神经网络倾向于使用ReLU替代掉sigmoid函数作为隐层的激活函数,它的定义如下:
f(x) = max(x,0).
当x大于0时,函数输出x,其余的情况输出为0。函数的图像是:
△ 来源:cs231n
使用ReLU函数的好处是,对于所有大于0的输入,导数是恒定的,这能够加快训练网络的速度。
© softmax函数
什么是softmax?我们都知道max,例如已知a>b,取max便是直接取a即可,也只可以取a。而有时候,我们不想这样,因为这会使分值小的项丢失,所以我们希望分值大的项经常被取到,而分值小的项也有一定几率被取到,及使用softmax就可以了。现在还是a和b,a>b,如果我们取按照softmax来计算取a和b的概率,那a的softmax值大于b的, 所以a会经常取到,而b也会偶尔取到,概率跟它们本来的大小有关。
softmax激活函数通常应用在分类问题的输出层上。
它与Sigmoid函数相似,唯一的不同是softmax函数输出结果是归一化的。sigmoid函数能够在双输出的时候奏效,但当面对多种类分类问题的时候,softmax函数可以方便地直接将各个分类出现的概率算出。
关于softmax函数的详解和推导过程可以参考:https://zhuanlan.zhihu.com/p/25723112
神经网络
神经网络是构成深度学习系统的框架。神经网络的任务是找到一个未知函数的近似表达方式,它是由彼此相连的神经元所组成,这些神经元会在训练网络的过程中根据误差来更改它们的权重和偏置。激活函数将非线性变化用线性变化的组合来表示,最终产生输出。
关于神经网络最好的定义是由Matthew Mayo给出的:
神经网络是由大量彼此相连、概念化的人造神经元组成的,这些神经元彼此之间传递着数据,相应的权重也会随着神经网络的经历而进行调整。神经元们有着激活的阈值,当它们遇到相应的数据以及权重时会被激活,这些被激活的神经元组合起来导致了“学习”行为的产生。
输入层/输出层/隐藏层
从名字中就能看出,输入层代表接受输入数据的一层,基本上是网络的第一层;输出层是产生输出的一层,或者是网络的最后一层,而网络中间的处理层叫做隐藏层。
这些隐藏层对输入的数据进行特定的处理,再将其输入到下一层。输入层和输出层是可见的,而中间层通常是被隐藏起来的。
△ 来源:cs231n
多层感知器(MLP-Multi Layer Perceptron)
一个单一的神经元不能够完成复杂的任务,因此需要将它们堆叠起来工作进而产生有用的输出。
最简单的神经网络包括一个输入层、一个隐藏层和一个输出层。每一层都由多个神经元组成,每一层的每个神经元都与下一层中的所有神经元相连。这样的网络可以被称为是全连接网络。
正向传播(forward propagation)
正向传播是指信号从输入层经过隐藏层到输出层的传输过程。在正向传播中,信号是沿着单一方向进行传播,即输入层给隐藏层提供输入,进而最终产生相应的输出。
成本函数(cost function)
在神经网络的建造过程中,建造者们希望输出的结果能够尽可能地接近实际值,因此使用成本函数来描述网络的这种准确性。
神经网络的目标是增加预测的准确性从而减少误差,即最小化成本函数。通常情况下,最优化的输出结果往往对应着成本函数的最小值。
如果采用均方误差作为成本误差,即表示为
C= 1/m ∑(y – a)2
其中m是训练过程中输入数据的个数,a是相应的预测值,y代表实际值。
模型学习的过程就是围绕着最小化成本而进行的。
梯度下降(gradient descent)
梯度下降是一种最小化成本函数的优化算法。
在梯度下降中,从起始点x开始,一次移动一点,比如说移动delta h,然后将位置信息更换为x-delta h,如此重复下去,直到达到局部的极小值,此时认为极小值就是成本最小的地方。
数学上说,沿着函数的负梯度运动就能得到函数的局域最小值。
学习速率(learning rate)
学习速率定义为在每次迭代过程中对成本函数的最小化次数。简单来说,学习速率就是指朝着成本函数最小值的下降速率。选择学习速率需要很谨慎,过大会导致可能越过最优解,过小会导致收敛花费太多的时间。
反向传播(back propagation)
在定义一个神经网络的过程中, 每个节点会被随机地分配权重和偏置。一次迭代后,我们可以根据产生的结果计算出整个网络的偏差,然后用偏差结合成本函数的梯度,对权重因子进行相应的调整,使得下次迭代的过程中偏差变小。这样一个结合成本函数的梯度来调整权重因子的过程就叫做反向传播。
在反向传播中,信号的传递方向是朝后的,误差连同成本函数的梯度从输出层沿着隐藏层传播,同时伴随着对权重因子的调整。
分批(Batches)
当在训练一个神经网络的时候,相对于一次性将所有的数据全输入进去,有一个更好的方法:先将数据随机地分为几个大小一致的数据块,再分批次输入。跟一次性训练出来的模型相比,分批训练能够使模型的适用性更好 。
周期(epochs)
一个周期表示对所有的数据批次都进行了一次迭代,包括一次正向传播和一次反向传播,所以一个周期/纪元就意味着对所有的输入数据分别进行一次正向传播和反向传播。
训练网络周期的次数是可以选择的,往往周期数越高,模型的准确性就越高,但是,耗时往往就越长。同样你还需要考虑如果周期/纪元的次数过高,那么可能会出现过拟合的情况。
Dropout方法
Dropout是一个可以阻止网络过拟合的规则化方法。就像它的名字那样,在训练过程中隐藏的某些特定神经元会被忽略掉(drop)。这意味着网络的训练是在几个不同的结构上完成的。
这种dropout的方式就像是一场合奏,多个不同结构网络的输出组合产生最终的输出结果。
△ 来源:Hinton论文《Improving neural networks by preventing co-adaptation of feature detectors》
地址:https://arxiv.org/pdf/1207.0580.pdf
分批标准化(Batch Normalization)
分批标准化就像是人们在河流中用以监测水位的监察站一样。这是为了保证下一层网络得到的数据拥有合适的分布。在训练神经网络的过程中,每一次梯度下降后权重因子都会得到改变,从而会改变相应的数据结构。
但是下一层网络希望能够得到与之前分布相似的数据,因此在每一次数据传递前都需要对数据进行一次正则化处理。
卷积神经网络
关于什么是卷积,为什么在机器学习中对图像进行卷积?参考:https://blog.youkuaiyun.com/lmb09122508/article/details/84949837
什么是卷积:
卷积作为一种数学运算,其根加减乘除没有本质区别,虽然这种运算本身很复杂,但它非常有助于简化更复杂的表达式。在物理和工程上,卷积被广泛地用于化简等式。而在图像处理中,我们在两个维度(水平、垂直)和多个深度(例如RGB)上通过过滤器执行卷积,其可以想象成按照一定规则去搅拌图像的方法。如下图为边缘检测过滤器执行结果。
为什么机器学习中对图像的卷积有用
图像中可能含有很多我们不关心的噪音。例如你想要区分衣服的样式,那么衣服的颜色就不那么重要了;另外像商标之类的细节也不那么重要。最重要的可能是衣服的外形。一般来讲,女装衬衫的形状与衬衣、夹克和裤子的外观非常不同。如果我们过滤掉这些多余的噪音,那我们的算法就不会因颜色、商标之类的细节分心了。我们可以通过卷积轻松地实现这项处理。
Jannek Thomas通过索贝尔边缘检测滤波器(与上上一幅图类似)去掉了图像中除了边缘之外的所有信息——这也是为什么卷积应用经常被称作滤波而卷积核经常被称作滤波器(更准确的定义在下面)的原因。由边缘检测滤波器生成的feature map对区分衣服类型非常有用,因为只有外形信息被保留下来。
彩图的左上角是搜索query,其他是搜索结果,你会发现自动编码器真的只关注衣服的外形,而不是颜色。
再进一步:有许多不同的核可以产生多种feature map,比如锐化图像(强调细节),或者模糊图像(减少细节),并且每个feature map都可能帮助算法做出决策(一些细节,比如衣服上有3个纽扣而不是两个,可能可以区分一些服饰)。
过滤器/滤波器/卷积核(Filter)
CNN中的滤波器,具体是指将一个权重矩阵,我们用它乘以输入图像的一部分,产生相应的卷积输出。权重矩阵的作用是保留图片空间排列特征的前提下将其馈送给网络。
若如下图所示,存储并读取一张数字4的图片,该图中数值1为白色,256为最深的绿色(为了简化,示例仅使用一种颜色通道)。
之后使神经网络理解这种排序与模式,若将其平化作为一个数组(如下图所示),网络判断其将非常艰难。因为其完全丢失了像素的空间排列特性。
而若我们使用一个权重矩阵进行卷积,如下图所示,其在水平和垂直方向上保持了空间布局
比方说,对于一个28×28的图片,将一个3×3的滤波器与图片中3×3的矩阵依次相乘,从而得到相应的卷积输出。滤波器的尺寸通常比原始图片要小,与权重相似,在最小化成本的反向传播中,滤波器也会被更新。
就像下面这张图片一样,通过一个过滤器,依次乘以图片中每个3×3的分块,从而产生卷积的结果。
上面我们所做的事是试图通过使用图像的空间的安排从图像中提取特征。为了理解图像,理解像素如何安排对于一个网络极其重要。上面我们所做的也恰恰是一个卷积网络所做的。我们可以采用输入图像,定义权重矩阵,并且输入被卷积以从图像中提取特殊特征而无需损失其有关空间安排的信息。而使用权重矩阵(滤波器)进行卷积的另一个重大好处是它可以减少图像的参数数量。正如所见,卷积图像相比于原始图像有更少的像素。
权值矩阵在图像里表现的像一个从原始图像矩阵中提取特定信息的过滤器(滤波器)。一个权值组合可能用来提取边缘(edge)信息,另一个可能是用来提取一个特定颜色,下一个就可能就是对不需要的噪点进行模糊化。
先对权值进行学习,然后损失函数可以被最小化,类似于多层感知机(MLP)。因此需要通过对参数进行学习来从原始图像中提取信息,从而来帮助网络进行正确的预测。当我们有多个卷积层的时候,初始层往往提取较多的一般特征,随着网络结构变得更深,滤波器提取的特征越来越复杂,并且越来越适用于眼前的问题。
步长(stride)和边界(padding)的概念
像我们在上面看到的一样,过滤器或者说权值矩阵,在整个图像范围内一次移动一个像素。我们可以把它定义成一个超参数(hyperparameter),从而来表示我们想让权值矩阵在图像内如何移动。如果权值矩阵一次移动一个像素,我们称其步长为 1。下面我们看一下步长为 2 时的情况。
你可以看见当我们增加步长值的时候,图像的规格持续变小。在输入图像四周填充 0 边界可以解决这个问题。我们也可以在高步长值的情况下在图像四周填加不只一层的 0 边界。
我们可以看见在我们给图像填加一层 0 边界后,图像的原始形状是如何被保持的。由于输出图像和输入图像是大小相同的,所以这被称为 same padding。若不填充0边界,其输出图像大小会比输入小,被称为valid padding。
多过滤与激活图
需要记住的是权值的纵深维度(depth dimension)和输入图像的纵深维度是相同的。权值会延伸到输入图像的整个深度。因此,和一个单一权值矩阵进行卷积会产生一个单一纵深维度的卷积化输出。大多数情况下都不使用单一过滤器(权值矩阵),而是应用维度相同的多个过滤器,例如常见的对RGB三个通道进行卷积的过滤器。
如上图所示,每一个过滤器的输出被堆叠在一起,形成卷积图像的纵深维度。假设我们有一个 32323 的输入。我们使用 553,带有 valid padding 的 10 个过滤器。输出的维度将会是 282810。激活图及为卷积层的输出。
附 :Tensorflow中 SAME padding与VALID padding的输出大小计算:
SAME:输出大小等于输入大小除以步长向上取整,s是步长大小;
VALID:输出大小等于输入大小减去滤波器大小加上1,最后再除以步长(f为滤波器的大小,s是步长大小)
关于卷积网络 及 过滤器的工作原理 可阅读:https://www.cnblogs.com/zyly/p/8585780.html讲解的非常详细。
补白(padding)
如下图所示,补白(padding)通常是指给图像的边缘增加额外的空白,从而使得卷积后输出的图像跟输入图像在尺寸上一致,这也被称作相同补白(Same Padding)。
有效补白(Valid Padding)指的是保持图片上每个真实的像素点,不增加空白,因此在经历卷积后数据的尺寸会不断变小。(译者注:具体是指有效补白每次会丢弃最后不满足于一次卷积的像素点,比如说filter是3*3的,那么对于一行有32个pixel的数据,经历一次卷积后就会丢掉最后2个pixel;而通过相同补白,增加一个空白位,使每行有33个pixel,卷积后数据的尺寸不会变小。
池化(pooling)
为了进一步减少变量的数目同时防止过拟合,一种常见的做法是在卷积层中引入池化层(pooling layer)。如下图所示,最常用的池化层的操作是将原始图片中每个4×4分块取最大值形成一个新的矩阵,这叫做最大值池化(max pooling)。
△ 来源:cs231n
当然也有人尝试诸如平均池化(average pooling)之类的方式,但在实际情况中最大化池化拥有更好的效果。
输出维度
有三个超参数可以控制输出卷的大小:
1.滤波器数量。输出卷的深度与滤波器的数量成正比。应注意如何堆叠每个滤波器输出以形成激活映射。激活图的深度则等于滤波器的数量。
2.步长。 如果步长为1,则图像的处理精度为单像素级别,输出最大。而更高的步长则意味着同时处理更多的像素,从而产生更小的输出。
3.零填充(补白)。补白有助于保留输入图像的尺寸-如果添加了单零填充,则单步滤波器的运动会保持在原图尺寸上。
我们可以应用一个简单的公式来计算输出尺寸。输出图像的空间尺寸可以计算为([W-F + 2P] / S)+1。在这里,W 是输入尺寸,F 是过滤器的尺寸,P 是填充数量,S 是步幅数字。假如我们有一张 32323 的输入图像,我们使用 10 个尺寸为 333 的过滤器,单步幅和零填充。
那么 W=32,F=3,P=0,S=1。输出深度等于应用的滤波器的数量,即 10,输出尺寸大小为 ([32-3+0]/1)+1 = 30。因此输出尺寸是 303010。
CNN(卷积神经网络)
卷积神经网络通常用来处理图像数据,假设输入数据的形状为28×28×3(28pixels×28pixels×RGB Value),那么对于传统的神经网络来说就会有2352(28×28×3)个变量。随着图像尺寸的增加,那么变量的数量就会急剧增加。
而通过对图片进行卷积,可以减少变量的数目。随着过滤器沿着图像上宽和高的两个方向滑动,就会产生一个相应的2维激活映射,最后再沿纵向将所有的激活映射堆叠在一起,就产生了最后的输出。
可以参照下面这个示意图。
△ 来源:cs231n
在多层卷积和填充后,我们需要以类的形式输出。卷积和池化层只会提取特征,并减少原始图像带来的参数。然而,为了生成最终的输出,我们需要应用全连接层来生成一个等于我们需要的类的数量的输出。仅仅依靠卷积层是难以达到这个要求的。卷积层可以生成 3D 激活图,而我们只需要图像是否属于一个特定的类这样的内容。输出层具有类似分类交叉熵的损失函数,用于计算预测误差。一旦前向传播完成,反向传播就会开始更新权重与偏差,以减少误差和损失。
CNN小结
CNN 由不同的卷积层和池化层组成。让我们看看整个网络是什么样子:
- 我们将输入图像传递到第一个卷积层(conv1)中,卷积后以激活图形式输出。图片在卷积层中过滤后的特征会被输出,并传递下去。
- 每个过滤器都会给出不同的特征,以帮助进行正确的类预测。因为我们需要保证图像大小的一致,所以我们使用同样的填充(零填充),否则填充会被使用,因为它可以帮助减少特征的数量。
- 随后加入池化层(pool1)进一步减少参数的数量。
- 在预测最终提出前,数据会经过多个卷积和池化层的处理。卷积层会帮助提取特征,越深的卷积神经网络会提取越具体的特征,越浅的网络提取越浅显的特征。
- 如前所述,CNN 中的输出层是全连接层,其中来自其他层的输入在这里被平化和发送,以便将输出转换为网络所需的参数。
- 随后输出层会产生输出,这些信息会互相比较排除错误。损失函数是全连接输出层计算的均方根损失。随后我们会计算梯度错误。
- 错误会进行反向传播,以不断改进过滤器(权重)和偏差值。
- 一个训练周期由单次正向和反向传递完成。
数据增强(Data Augmentation)
数据增强(Data Augmentation)指的是从已有数据中创造出新的数据,通过增加训练量以期望能够提高预测的准确率。
比如在说数字识别中,我们遇到的数字可能是倾斜或旋转的,因此如果将训练的图片进行适度的旋转,增大训练量,那么模型的准确性就可能会得到提高。通过“旋转”的操作,训练数据的品质得到了提升,这种过程被称作数据增强。
递归神经网络
递归神经元(Recurrent Neural Network)
对于递归神经元来说,经由它自己处理过的数据会变成自身下一次的输入,这个过程总共会进行t次。如下图所示,将递归神经元展开就相当于t个不同的神经元串联起来,这种神经元的长处是能够产生一个更全面的输出结果。
△ 来源:cs231n
递归神经网络(RNN-Recurrent Neural Network)
递归神经网络通常被用于处理序列化的数据,即前一项的输出是用来预测下一项的 。
递归神经网络中存在环的结构,这些神经元上的环状结构使得它们能够存储之前的数据一段时间,从而使得能够预测输出。
与递归神经元相似,在RNN中隐藏层的输出会作为下一次的输入,如此往复经历t次,再将输出的结果传递到下一层网络中。这样,最终输出的结果会更全面,而且之前训练的信息被保持的时间会更久。
梯度消失问题
当激活函数的梯度很小时就会发生梯度消失问题。在反向传播的过程中,权重因子会被多次乘以这些小的梯度,因此会越变越小,随着递归的深入趋于“消失”, 使得神经网络失去了长程可靠性。这在递归神经网络中是一个较普遍的问题。
梯度爆炸问题
与梯度消失问题对应,当激活函数的梯度较大时,就会发生梯度爆炸问题。在反向传播的过程中,部分节点的大梯度使得他们的权重变得非常大,从而削弱了其他节点对于结果的影响,这个问题可以通过截断(即设置一个梯度允许的最大值)的方式来有效避免。
神经网络如何运算
这是我找到的最形象的图像预测演示了,以手写字体识别为例。
转载自:https://www.jiqizhixin.com/articles/2018-09-03-9(关于CPU、GPU于TPU的讲解)
在我们对比 CPU、GPU 和 TPU 之前,我们可以先了解到底机器学习或神经网络需要什么样的计算。如下所示,假设我们使用单层神经网络识别手写数字。
如果图像为 28×28 像素的灰度图,那么它可以转化为包含 784 个元素的向量。神经元会接收所有 784 个值,并将它们与参数值(上图红线)相乘,因此才能识别为「8」。其中参数值的作用类似于用「滤波器」从数据中抽取特征,因而能计算输入图像与「8」之间的相似性:
这是对神经网络做数据分类最基础的解释,即将数据与对应的参数相乘(上图两种颜色的点),并将它们加在一起(上图右侧收集计算结果)(其实就是卷积操作)。如果我们能得到最高的预测值,那么我们会发现输入数据与对应参数非常匹配,这也就最可能是正确的答案。
简单而言,神经网络在数据和参数之间需要执行大量的乘法和加法(卷积运算)。我们通常会将这些乘法与加法组合为矩阵运算,这在我们大学的线性代数中会提到。所以关键点是我们该如何快速执行大型矩阵运算,同时还需要更小的能耗(TPU卷积专用处理器的优势)。
关于图像识别、检测、分类等的区别(待学习)
监督学习与无监督学习区别(待学习)
原文链接:https://blog.youkuaiyun.com/weixin_41108334/article/details/82803522
监督学习(supervised learning): 已知数据和其一一对应的标签,训练一个智能算法,将输入数据映射到标签的过程。监督学习是最常见的学习问题之一,就是人们口中常说的分类问题。比如已知一些图片是猪,一些图片不是猪,那么训练一个算法,当一个新的图片输入算法的时候算法告诉我们这张图片是不是猪。
无监督学习(unsupervised learning): 已知数据不知道任何标签,按照一定的偏好,训练一个智能算法,将所有的数据映射到多个不同标签的过程。相对于有监督学习,无监督学习是一类比较困难的问题,所谓的按照一定的偏好,是比如特征空间距离最近,等人们认为属于一类的事物应具有的一些特点。举个例子,猪和鸵鸟混杂在一起,算法会测量高度,发现动物们主要集中在两个高度,一类动物身高一米左右,另一类动物身高半米左右,那么算法按照就近原则,75厘米以上的就是高的那类也就是鸵鸟,矮的那类是第二类也就是猪,当然这里也会出现身材矮小的鸵鸟和身高爆表的猪会被错误的分类。
其他
强化学习(reinforcement learning)
弱监督学习(weakly supervised learning)
半监督学习(semi supervised learning)
多示例学习(multiple instance learning)
损失函数(待学习)
转载自:https://www.cnblogs.com/shiyublog/p/10554915.html
平方损失函数:MSE- L2 Loss
平方损失函数是光滑函数,能够用梯度下降法进行优化。然而,预测值距离真实值越远,平方损失的惩罚力度越大,因此,它对异常点比较敏感。为了解决该问题,可以采用绝对损失函数。
绝对值损失函数:MAE - L1 Loss
MAE相比MSE的优点:
MAE相当于在做中值回归,相比做均值回归的MSE,MAE对异常点的鲁棒性更好。(中值回归与均值回归的介绍详见“补充信息”)
MAE的不足:
-
MAE在 y=y^ 处无法求导数。针对这种情况,平衡MSE的可导性和MAE的鲁棒性,可以采用Huber损失函数(在第3部分介绍)。
-
MAE更新的梯度始终相同,那么在接近最优值处可能仍维持着较大的梯度而错过最优值。
针对这种情况,可以使用变化的学习率,在接近最优值时降低学习率。
而MSE在这种情况下表现较好,即使使用固定的的学习率也可以有效收敛。MSE损失的梯度随损失增大而增大,在损失趋于0时则减小,这使得在训练结束时,MSE模型的结果往往会更精确。
那么什么时候用MSE,什么时候用MAE呢?
MSE:如果异常点代表在商业中很重要的异常情况,并且需要被检测出来,则应选用MSE损失函数。
MAE:相反,如果只把异常值当作受损数据,则应选用MAE损失函数。
总而言之,处理异常点时,MAE更稳定,但它的导数不连续,因此求解效率较低。
MSE对异常点更敏感,但通过令其导数为0,可以得到更稳定的封闭解。
MSE与MAE都不能很好解决的问题:
二者兼有的问题是:在某些情况下,上述两种损失函数都不能满足需求。例如,若数据中90%的样本对应的目标值为150,剩下10%在0到30之间。那么使用MAE作为损失函数的模型可能会忽视10%的异常点,而对所有样本的预测值都为150。
这是因为模型会按中位数来预测。而使用MSE的模型则会给出很多介于0到30的预测值,因为模型会向异常点偏移。上述两种结果在许多商业场景中都是不可取的。
这些情况下应该怎么办呢?最简单的办法是对目标变量进行变换。而另一种办法则是换一个损失函数,这就引出了下面要讲的第三种损失函数,即Huber损失函数。
补充信息:
-
中值回归就是我们优化的目标是使目标值趋于样本点值的中位数,直观理解就是大于 与 小于 目标值的样本点数尽量相等。
-
均值回归的目标则是使目标值趋于样本点值的均值。
-
为什么MSE是均值回归,而MAE是中值回归呢?
我在StackExchange找到一条很好的解释。
Huber损失函数
Huber损失函数在|y - f(x)|较小时为平方损失,在 |y - f(x)| 较大时为线性损失。并且处处可导。
这里超参数δ的选择非常重要,因为这决定了你对与异常点的定义。当残差大于δ,应当采用L1(对较大的异常值不那么敏感)来最小化,而残差小于超参数,则用L2来最小化。
由上图可知,δ 越大,对异常点越敏感。
为什么使用Huber?
在离最优值较远时,Huber损失相当于MAE,对异常点有更好的鲁棒性;
当离最优值较近时,Huber损失相当于MSE,随着损失的减小梯度也在逐渐减小,可以更好的逼近最优值,可以避免MAE中始终维持大梯度而错过最优值的问题。
使用MAE训练神经网络最大的一个问题就是不变的大梯度,这可能导致在使用梯度下降快要结束时,错过了最小点。而对于MSE,梯度会随着损失的减小而减小,使结果更加精确。
在这种情况下,Huber损失就非常有用。它会由于梯度的减小而落在最小值附近。比起MSE,它对异常点更加鲁棒。因此,Huber损失结合了MSE和MAE的优点。但是,Huber损失的问题是我们可能需要不断调整超参数delta。