SVM、Softmax 损失函数

SVM、Softmax 损失函数,第1张

损失函数具体形式多种多样,先介绍 SVM 损失函数,SVM 的损失函数想要 SVM 在正确分类上的得分始终比不正确分类上的得分高出一个边界值,定义如下:

yi 代表的是正确类别的标签。举例说明:假设有3个分类,得到score=[13,-7,11],真实标签是yi=0,所以:

SVM的损失函数想要正确分类类别 yi 的分数比不正确类别分数高,而且至少要高10。如果不满足这点,就开始计算损失值。关于0的阈值:max(0,-)函数,被称为折叶损失(hinge loss)。

如果不使用正则化,那么上面的损失函数就会有问题:假设有一个数据集和一个权重集 W 能够正确地分类每个数据(即所有的边界都满足,对于所有的i都有 Li=0)。问题在于 W 并不唯一:可能有很多相似的W都能正确地分类所有的数据。

例子:如果 W 能够正确分类所有数据,即对于每个数据,损失值都是0。那么当 r > 1 时,任何数乘 rW 都能使得损失值为 0,因为这个变化将所有分值的大小都均等地扩大了,所以它们之间的绝对差值也扩大了。举个例子,如果一个正确分类的分值和举例它最近的错误分类的分值的差距是15,对 W 乘以2将使得差距变成30。但是整体的损失值还是为0,这就导致 W 不唯一。

所以,通过向特定的权重 W 添加一些偏好,对其他的不添加,以此来消除模糊性。方法是向损失函数增加一个 正则化惩罚 ,最常用的正则化惩罚是 L2 范式,L2 范式通过对所有参数进行逐元素的平方惩罚来抑制大数值的权重,L2正则化可以直观理解为它对于大数值的权重向量进行严厉惩罚,倾向于更加分散的权重向量。:

上面的表达式中,将 W 中所有元素平方后求和。注意正则化函数不是数据的函数,仅基于权重。完整的目标函数如下:

将其展开完整公式是:

其中,N 是训练集的数据量,下图是引入正则化带来的良好的性质:

需要注意的是,和权重不同,偏差没有这样的效果,因为它们并不控制输入维度上的影响强度。因此通常只对权重 W 正则化,而不正则化偏差 b。

交叉熵是用来判定实际的输出与期望的输出的接近程度。交叉熵刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。假设概率分布 p 为期望输出(标签),概率分布 q 为实际输出,H(p,q) 为交叉熵。

第一种交叉熵函数的形式为:

下图举例说明:

第二种交叉熵损失函数形式:

这种形式主要是针对于二分类的情况,二分类模型最后通常会通过 Sigmoid 函数输出一个概率值。这里只是将两种情况(标签为0和1的时候)整合在一起。但是这里注意的是,上面公式是通过极大似然估计来推导得出,在机器学习里面,基本上是把极大似然估计跟交叉熵联系在一起的同一概念。下图是极大似然估计推导过程:

再来看一下 softmax 的损失函数:

以多分类来看,交叉熵损失函数为:

对于比较常见的 one-hot 编码来看,yi 只有一个元素值为1,其他的都是0,所以 Softmax 的损失函数求和号去掉,就转换为最开始的形式。

下图有助于区分这 Softmax和SVM这两种分类器:

注意点:

1 斯坦福CS231n assignment1:softmax损失函数求导

2 CS231n课程笔记翻译:线性分类笔记

3 深度学习中softmax交叉熵损失函数的理解

    在使用pytorch深度学习框架,计算损失函数的时候经常回到这么一个个函数:

    该损失函数结合了 和 两个函数。它在做分类(具体几类)训练的时候是非常有用的。在训练过程中,对于每个类分配权值,可选的参数权值应该是一个1D张量。当你有一个不平衡的训练集时,这是是非常有用的。那么针对这个函数,下面将做详细的介绍。

     交叉熵主要是用来判定实际的输出与期望的输出的接近程度 ,为什么这么说呢,举个例子:在做分类的训练的时候,如果一个样本属于第K类,那么这个类别所对应的的输出节点的输出值应该为1,而其他节点的输出都为0,即[0,0,1,0,…0,0],这个数组也就是样本的Label,是神经网络最期望的输出结果。也就是说用它来衡量网络的输出与标签的差异,利用这种差异经过反向传播去更新网络参数。

在说交叉熵之前,先说一下 信息量

     信息量: 它是用来衡量一个事件的不确定性的;一个事件发生的概率越大,不确定性越小,则它所携带的信息量就越小。假设X是一个离散型随机变量,其取值集合为X,概率分布函数为 ,我们定义事件 的信息量为:

当 时,熵将等于0,也就是说该事件的发生不会导致任何信息量的增加。

     熵: 它是用来衡量一个系统的混乱程度的,代表一个系统中信息量的总和;信息量总和越大,表明这个系统不确定性就越大。

    举个例子:假如小明和小王去打靶,那么打靶结果其实是一个0-1分布,X的取值有{0:打中,1:打不中}。在打靶之前我们知道小明和小王打中的先验概率为10%,999%。根据上面的信息量的介绍,我们可以分别得到小明和小王打靶打中的信息量。但是如果我们想进一步度量小明打靶结果的不确定度,这就需要用到熵的概念了。那么如何度量呢,那就要采用 期望 了。我们对所有可能事件所带来的信息量求期望,其结果就能衡量小明打靶的不确定度:

与之对应的,小王的熵(打靶的不确定度)为:     虽然小明打靶结果的不确定度较低,毕竟十次有9次都脱靶;但是小王打靶结果的不确定度更低,1000次射击只有1次脱靶,结果相当的确定。

     交叉熵: 它主要刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。假设概率分布p为期望输出,概率分布q为实际输出, 为交叉熵,则     那么该公式如何表示,举个例子,假设N=3,期望输出为 ,实际输出 , ,那么: 通过上面可以看出,q2与p更为接近,它的交叉熵也更小。

    Pytorch中计算的交叉熵并不是采用 这种方式计算得到的,而是交叉熵的另外一种方式计算得到的: 它是交叉熵的另外一种方式。

    Pytorch中CrossEntropyLoss()函数的主要是将softmax-log-NLLLoss合并到一块得到的结果。

    1、Softmax后的数值都在0~1之间,所以ln之后值域是负无穷到0。

    2、然后将Softmax之后的结果取log,将乘法改成加法减少计算量,同时保障函数的单调性

    3、NLLLoss的结果就是把上面的输出与Label对应的那个值拿出来(下面例子中就是:将log_output\logsoftmax_output中与y_target对应的值拿出来),去掉负号,再求均值。

下面是我仿真写的一个例子:

最计算得到的结果为:

    通过上面的结果可以看出,直接使用pytorch中的loss_func=nnCrossEntropyLoss()计算得到的结果与softmax-log-NLLLoss计算得到的结果是一致的。

[1] https://blogcsdnnet/zwqjoy/article/details/78952087

[2] https://blogcsdnnet/xg123321123/article/details/52864830

[3] https://wwwcnblogscom/JeasonIsCoding/p/10171201html

更多自然语言处理、pytorch相关知识,还请关注 AINLPer 公众号,极品干货即刻送达。

GBDT是回归树,不是分类树。因为他是要算具体的值的。

GBDT的核心在于累加所有树的结果作为最终的结果。

关键点就是利用损失函数的负梯度去模拟残差,这样对于一般的损失函数,只需要求一阶导。

第m个模型会基于前m-1个,基于之前模型损失函数的负梯度方向,让实际值与预测值之间的差距越来越小。通过更新训练数据的y值让模型效果更好。

有个人年龄是30岁,用20岁去拟合,发现他的损失有10岁。再去用6岁去拟合剩下的损失,这时发现,他们的差距还有4岁。第三轮用三岁去拟合剩下的差距,这时候差距只有1岁了。如果迭代没有完就可以继续迭代。

GBDT会用树的(上一次的)残差(-1,1,-1,1)再去拟合一棵树。而随机森林是用原始的样本,有放回的抽样去构建决策树,构建5颗树之后,投票或者去平均值。

1使用损失函数的二阶导,速度效果比GBDT好。

2内部嵌入了正则化项结构,不容易过拟合

3可以在特征粒度上并行化,GBDT是串行的

http://blogitpubnet/31542119/viewspace-2199549/

所谓正则化就是对参数施加一定的控制,防止参数走向极端。这里的正则项,本质上是用来控制模型的复杂度。

常用的正则化就是L2正则,也就是所有参数的平方和。我们希望这个和尽可能小的同时,模型对训练数据有尽可能好的预测。

能使这个函数值最小的那组参数就是我们要找的最佳参数。这个obj包含的两项分别称为损失函数和正则项

对于回归问题,我们常用的损失函数是MSE,对于分类问题,我们常用的损失函数是对数损失函数

xgboost就是一个监督模型,xgboost对应的模型是一堆CART树。

一堆树如何做预测?就是将每棵树的预测值加到一起作为最终的预测值,就是简单将各个树的预测分数相加。

xgboost为什么使用CART树而不是用普通的决策树呢?

对于分类问题,由于CART树的叶子节点对应的值是一个实际的分数,而非一个确定的类别,这将有利于实现高效的优化算法。

xgboost出名的原因一是准,二是快,之所以快,其中就有选用CART树的一份功劳。

更多信息请查看原文:https://wwwyanxishecom/TextTranslation/2447from=jianshu0323

计算机视觉是计算机科学中主要关注“数字图像的信息自动提取”的这么一个领域。

在过去的十年里,深度学习的创新、大量数据的易用性以及GPU($$)单元的可访问性,都将计算机视觉领域推向了聚光灯下。它甚至在人脸验证和手写文本识别等任务中展现了超人一般的性能。(事实上,在如今航班登机的过程中,自动人脸验证应用已经越来越普遍)

 近年来,计算机视觉领域在网络结构、激活函数、损失函数等方面有了许多创新。 

4 个每个机器学习工程师都应该知道的CNN网络!

多年来,CNN的各种架构变形的开发,导致了惊人了进步在深…

mediumcom

正如我上一篇文章中所讨论的,损失函数对模型的性能起着关键作用。选择正确的损失函数可以帮助您的模型学会关注数据中正确的特征,以获得最佳和更快的收敛速度。

损失函数赢家-您应该知道的常见损失函数

每个ML工程师都应该知道的ML中流行常用的损失函数。进一步了解他们的优点…

mediumcom

本文特别总结了计算机视觉中一些重要的损失函数。 

您可以在这个 链接 中找到这里讨论的所有loss函数的PyTorch实现

像素损失函数

(Pixel-wise loss function)

顾名思义,这种损失函数计算预测图像和目标图像间像素对像素的损失。前一篇文章中讨论的大多数损失函数,如MSE(L2 loss)、MAE(L1 loss)、交叉熵损失(cross-entropy loss)等,都可以应用于计算预测变量和目标变量的每一对像素之间的损失。

由于这些损失函数先分别对每个像素向量进行类预测的评估,然后对所有像素点的评估结果进行平均,因此可以明确地说它们在学习过程中对图像中的每个像素一视同仁。对于需要进行像素级预测地语义分割模型,这一点十分有用。

U-Net  等模型对这些损失函数进行了一定变形。明确来说也就是,为了解决图像分割中的类不平衡问题,人们采用了加权像素交叉熵损失函数。

类不平衡是像素级分类任务中常见的问题。当图像数据中的各个类数量相差较大时便会出现这种问题。由于像素损失将所有像素的损失平均了,所以训练过程中数量最多的类将占主导地位。

感知损失函数

(Perceptual loss function)

Johnson等人(2016) 提出,当比较两个看起来相似的不同图像,比如只移动了一个像素点的同一张或不同分辨率的相同时,感知损失函数比较适用。尽管图像非常相似,但是使用逐像素损失函数会造成很大的误差,在这种情况下,使用能够比较图像之间高级感知和语义差异的感知损失函数会更妥当。

以一个图像分类网络比如已经在ImageNet数据集的数百万个图像上进行了训练的VGG为例,该网络的第一层倾向于提取低级特征(比如线、边或颜色梯度,最终卷积层则更倾向于处理更复杂的特征(例如特定的形状和图案)。根据Johnson等人的说法,在前几层中捕获的低层特征对于比较非常相似的图像十分有用。

例如,我们构建一个网络以生成输入的超分辨率。训练过程中,我们将会得到一系列中间目标,它们是输入的超分辨版本。我们的目标是比较输出与目标之间的差异。为此,我们使这些图像通过预先训练的VGG网络,并提取VGG中前几个块的输出值,从而提取图像的低级特征信息, 然后我们用一个简单的逐像素损失来比较这些低层特征张量。

图像分类的预训练损失网络

感知损失的数学表示

其中,V_j(Y)表示在处理图像Y时VGG网络第j层的激活,其大小为(C_j,H_j,W_j)。我们使用L2 loss比较真实图像Y和预测图像Y的激活,并利用图像形状对其进行归一化。 如果您想使用VGG网络的多个特性映射作为损失计算的一部分,只需将多个j层的L_j值相加。

内容风格损失函数-神经风格转移

(Content - Style loss functions — Neural style transfer)

风格转换是将图像的语义内容呈现为不同风格的过程。样式转换模型的目标是,给定一个内容图像(C)和一个样式图像(S),使用C的内容和S的样式生成输出图像 。

在这里,我们将讨论用于训练这种风格转换模型的内容风格损失函数的简单实现之一。内容风格损失函数的许多变体已在后续的研究中的得到应用,下一节将讨论这些变体的其中一种,纹理损失。

内容风格损失的数学表示

研究发现,CNNs在较高的层次上捕获内容的信息,而在较低的层次上更关注单个像素值

因此,我们取CNN的一个或多个高层,计算原始内容图像(C)和预测输出(P)的激活图——

类似地,可以通过计算预测图像(P)和样式图像(S)低层特征映射的L2距离来计算风格损失。由此净损失函数定义为

alpha和beta是可以调节的超参数。 

注意:仅通过减少内容风格损失来进行优化会导致高像素的噪声输出。为了解决这个问题,保证生成图像的空间连续性和平滑性, 全变分损失(total variation loss) 上用场。

纹理损失函数

(Texture loss function)

为计算图像风格转换中的风格损失, Gatys等人(2016) 引入了纹理损失。

纹理损失是一种基于感知函数来加以改进的损失函数,特别适用于捕获图像风格样式。 Gatys等人 发现,我们可以通过观察VGG网络中的激活或特征映射,利用它们值的空间相关性来提取图像的风格表示。这可以Gram矩阵来实现——

对于VGG网络的l层,Gram矩阵是该层矢量化特征映射F_i和F_j的内积,它可以捕捉特征在图像不同部分共同出现的趋势。

纹理损失的数学表示

这里,G^l和A^l分别是模型输出和目标图像的l层风格表示,N_l是层l中不同特征映射的数量,M_l是层l中特征地图的大小(即通道宽度高度,E_l是层l的纹理损失。

净纹理损失是所有纹理损失的加权和,如下所示——

这里,a为原始图像,x为预测图像。

注意:虽然这里的数学看起来有点复杂,但是实际上纹理损失只是一个应用在特征映射的gram矩阵上的感知损失。

拓扑感知损失函数

(Topology-aware loss function)

最近 Mosinska等人(2017) 在文献中介绍了另一个有趣的损失函数,拓扑感知损失函数。它应用于分割掩模预测,可以视作感知损失的拓展。

Mosinska等人认为,在图像分割问题中使用的逐像素损失,如交叉熵损失,仅依赖于局部测度而不考虑拓扑结构的特征,如连接部件或孔洞的数量。因此,传统的分割模型,比如U-Net,往往会对薄层结构进行错误分类。这是因为使用逐像素损失时,薄层像素错误分类的成本低。因此,他们建议引入基于VGG-19网络生成的特征映射的惩罚项(类似于感知损失)以用来计入拓扑信息的影响,从而对逐像素损失进行改进。

来自 论文 :(c)利用逐像素损失法检测神经元膜后得到的分割结果;(d) 利用拓扑损失法检测神经元膜后得到的分割结果。

这种方法也特别适用于对有所遮挡(比如树木遮挡)的卫星图像中道路的分割。

拓扑感知损失的数学表示

这里,l(m,n)表示VGG19网络中第n层中的第m个特征映射。Mu是衡量像素损失和拓扑损失相对重要性的标量

对比损失/三重损失

(Contrastive Losses / Triplet Losses)

Florian Schroff等人 在 FaceNet(2015) 中引入了三重态损失,其文章旨在用一个有限小规模的数据集构建一个人脸识别系统(例如办公室的人脸识别系统)。传统的CNN人脸识别体系结构在无法应对这一情况。

Florian-Schroff等人 等人的研究重点是,在一个小样本空间内进行人脸识别,其不仅要能够正确识别人脸匹配,而且要能够准确区分两个不同的人脸。为了解决这个问题,FaceNet的论文引入了一个叫做孪生神经网络(Siamese Network)的概念。

在孪生神经网络中,我们将一个图像A输入网络,将其转换为一个称为嵌入的较小表示。现在,在不更新网络的任何权重或偏差的情况下,我们对一个与A不同的图像B重复此过程并提取其嵌入。如果图像B与图像A中的人相同,则其对应的嵌入必须非常相似。如果它们属于不同的人,那么它们相应的嵌入必须非常不同。

重申一下,孪生神经网络的目标 —— 确保一个人(锚 anchor)的,相比其他人(负 negative)的来说,更接近他本人的(正 positive)的任意一张。

为了训练这样的网络,他们引入了三重损失函数。输入一个三元组-[锚,正,负](见)。三重损失定义如下——

1 定义距离度量d=L2范数

2 计算锚图像嵌入与正图像嵌入之间的距离=d(a,p) 

3 计算锚图像嵌入与负图像嵌入之间的距离=d(a,n)

4 三重损失=d(a,p)-d(a,n)+偏移量

三重损失的数学表示

这里,x^a->锚,x^p->正,x^n->负。

注:为了实现快速收敛,在损失计算中选取正确的三重样本是至关重要的。FaceNet的文章讨论了两种实现此功能的方法:三元组离线生成和三元组在线生成。我们将改天详细讨论这个问题,与此同时,你可以参考一下 FaceNet论文 。

生成性对抗网络损失

(GAN Loss)

最早由 Ian Goodfellow等人(2014) 提出的生成性对抗网络(generative Adversarial Networks, GANs),是目前最流行的图像生成任务解决方案。GANs受到博弈论的启发,使用一种对抗性的方案,以使其可以在无监督的情况下接受训练。

GANs可以被看作是一个二人博弈,在这里我们将生成器(比如生成一个超级分辨率的图像)与另一个网络(鉴别器)进行对抗。鉴别器的任务是,评估图像是来自原始数据集(真实图像)还是由其他网络生成(假图像)。虽然生成器使用鉴别器作为损失函数,但鉴别器模型与其他深度学习神经网络一样也会更新,这意味着生成器的损失函数是隐式的,并且在训练过程中可以不断学习。对于典型的机器学习模型而言,收敛性是所选损失函数在训练数据集上的最小限度。在GAN中,收敛标志着二人博弈的结束。取而代之的是寻找生成器和鉴别器损失之间的平衡点。 

对于GAN,生成器和鉴别器是博弈双方,它们的模型权重将被轮流更新。这里我们将总结一些用于GAN网络的损失函数。

1 最小-最大损失函数

(Min-Max Loss function)

然而,在实际应用中,人们发现这种损失函数对于生成器来说容易饱和。也就是说,如果它不能像鉴别器那样快速地学习,鉴别器就赢了,游戏也就结束了,模型也就不能得到有效的训练。

2 非饱和GAN损失

(Non-Saturating GAN Loss)

非饱和GAN损失是对生成器损失的一种修正。其利用一个细微的变化克服了饱和问题。生成器没有最小化生成图像的鉴别器反向概率的对数,而是最大化生成图像的鉴别器概率的对数。

3 最小二乘GAN损失

(Least squares GAN loss) 

该损失由 Xudong Mao等人(2016) 。当生成图像与真实图像非常不同时,此损失函数特别有用 它可以使梯度非常小或消失,进而导致模式更新很少或没有。

4 Wasserstein GAN 损失

(Wasserstein GAN Loss)

该损失由 Martin Arjovsky等人(2017年) 提出。他们观察到,传统的GAN关注于最小化真实图像和生成图像的实际和预测概率分布之间的距离,即所谓的Kullback-Leibler(KL)散度。然而他们的建议是,对 搬土距离问题 进行建模,根据将一个分布转换为另一个分布的成本来计算两个概率分布之间的距离。

使用Wasserstein损失的GAN将鉴别器的概念转变为了比生成器更新更频繁(例如,比生成器快5倍)的评判器。评论器给图像一个实数评分而不是预测概率。它还要求模型权重保持在较小值。分数的计算使得真假图像分数之间的距离最大化。Wasserstein损失的好处是,它几乎一直提供了一个有用的梯度以允许模型持续训练。

5 循环一致性损失

(Cycle Consistency Loss)

图像到图像的转换是一个图像合成任务,需要对给定图像进行定向修改,生成一个新的图像。例如,把马翻译成斑马(或相反),把画翻译成照片(或相反)等。 

该损失由 Jun-Yan Zhu等人(2018) 提出,用于图像到图像的转换。训练用于图像到图像转换的模型通常需要大量成对示例的数据集,这些示例很难找到。CycleGAN是一种没有成对例子的自动训练技术。这些模型是在无监督的情况下,使用来自源域和目标域的不需要任何关联的图像集合来进行训练。

CycleGAN是GAN体系结构的衍生,它包括两个生成器模型和两个鉴别器模型的同时训练。一个生成器从第一个域获取图像作为输入并输出图像到第二个域,另一个生成器从第二个域获取图像作为输入并生成图像至第一个域。然后使用鉴别器模型来确定生成的图像的合理性,并相应地更新生成器模型。 

循环一致性是指第一生成器输出的图像可以用作第二生成器的输入,并且第二生成器的输出应该与原始图像匹配。反之亦然。

 CycleGAN通过添加额外的损失来衡量生成器2的输出图像与原始图像(即生成器1的输入图像)之间的差异,以及其反循环(即生成器1的输出图象与生成器2的输入图像)的结果,从而鼓励循环一致性。这种损失被用作生成器模型的正则化项,引导新域中的图像生成过程朝原图像转换。 

本文总结了计算机视觉中一些重要损失函数术语集。感谢您的阅读,希望对您有所帮助。

更多信息请查看原文:https://wwwyanxishecom/TextTranslation/2447from=jianshu0323

表情识别中损失函数的修改可以通过以下方式进行:

1 使用不同的损失函数:常用的损失函数有交叉熵损失函数、均方误差损失函数等。根据具体情况选择合适的损失函数,比如对于多分类问题,交叉熵损失函数通常是一个不错的选择。

2 调整损失函数的参数:有些损失函数有一些可调整的参数,比如交叉熵损失函数中的权重衰减参数。通过调整这些参数,可以改变损失函数的形态,从而达到更好的训练效果。

3 添加正则化项:为了防止模型出现过拟合现象,可以在损失函数中添加正则化项,比如L1或L2正则化。这样可以限制模型的复杂度,提高模型的泛化能力。

总之,在修改损失函数时需要结合具体情况进行选择和调整,以达到更好的训练效果。

GBDT(Gradient Boosting Decision Tree)是我自己工作中常用的模型,在实际工程中的运用也十分广泛。但是,我在现有的资料中,没有找到一个介绍得比较全面的文章。很多博客说了自己的理解,都是浅尝辄止,更有甚者是不加思考的抄袭,其中不乏错误(我会专门指出这些常见的错误);李航的《统计学习方法》给出了比较好的数学解释,但是对于没有基础的初学者,他写的东西比较理论和晦涩,不易看懂(我也是后来才完全明白);国外的一些论文等资料介绍得比较好,但是也缺乏全面的总结,另外这些文章对中文读者也有一定门槛。这里我总结一下我所有的知识,结合前人的各种文章,尝试写一篇GBDT的综述,希望大家轻拍。

要介绍GBDT,就不能不介绍其他相关的算法,比如Adaboost、随机森林等。我会简要说明这些算法,重点从这些算法和GBDT的区别上来说明GBDT。我还会介绍GBDT各种演变、参数的含义和我理解的这类模型的使用场景和相关参数的建议。

一、集成学习

GDBT、Adaboost、随机森林等,都属于集成学习(ensemble learning)的范畴。集成学习的含义是,通过结合多个学习器(或者说预测方法),来产生新的预测方法。

所谓三个臭皮匠顶上一个诸葛亮。一个最简单的例子是,我需要预测一只股票会不会上涨,有10个朋友有不同的意见。结合他们的意见,我的决策可能是:

又比如说,决定要不要给一个人发xyk,有年龄、收入、学历、消费水平、婚姻状况很多维度的数据,一个好的预测可能在单一维度上需要很多划分,再组合这些维度:比如25<年龄<50且收入大于某个阈值,加上22<年龄<25且学历是在读硕士,加上消费水平>1k且是已婚女性,等等。

其中,组合成最后的预测方法的单位称为个体学习器(比如每个同事的意见、在年龄这个维度上的阈值分割等)。另外,如果集成方法要求个体学习器为“同质的”,则个体学习器也被称为基学习器(base learner)。

集成学习的关键和核心:如何产生“好而不同”的个体学习器。 即上述的维度都有一定的预测性,但是他们之间关注的角度或者说特征属性又不一致:如果你10个炒股的朋友都是你的大学同学,他们和你同样从事程序员工作,平常的对一个事物的看法也比较一致——那么,结合他们的意见,可能也没啥作用。

二、Boosting的含义和Adaboost

Boost,提升。指的是如何将比较弱的个体学习器增强的方案。比如:个体学习器都是在一个维度上用一个阈值来划分样本(一刀切,英文称stump),Boost通过迭代,找到样本的划分阈值(一个维度上可能有多个阈值组合多次),重复T轮后组合这些个体学习器,得到最后的增强的结果。

常用的迭代方法有:

Adaboost是一种十分常见的boost算法。它的核心思想是,通过迭代,给错误的样本更高的权重,以此来不断更新个体学习器,最后加权组合每一步的个体学习器来实现预测。

关于Adaboost的介绍很多,它的常用算法流程我简要叙述如下:

三、Adaboost的另外一种解释:

Adaboost除了按之前的解释方法以外,也可以解释为把损失函数定义为指数函数的一种梯度下降的迭代方法。李航在《统计学习方法》中,命名为:

我把书的那一页直接贴图了,这样读者能看得清楚一点。大家有条件可以直接参阅书籍。

四、GBDT的基本算法

注意,我这里说的算法,是GBDT的一种类型,具体而言,是将最小化平方误差作为拟合目标,用回归树拟合当前残差的方案(后面一章会介绍其他方案)。

在这种算法中,GBDT是回归树,而不是分类树(但是并不意味着GBDT不能用于二分类问题,其他方案的GBDT可以用分类树!这个问题上很多博客都抄来抄去,一直犯错)。具体算法实现如下:

五、从另一个角度看GBDT,以及GBDT的其他变种

和Adaboost的两种解释类似,GBDT也有对应的数学解释。GBDT可以看做:

利用损失函数的负梯度来作为当前树的拟合目标。损失函数为平方函数时,损失函数的负梯度恰好就是上面说的残差。

它和Adaboost的区别是:

但是,一般的GBDT,损失函数是不限于平方函数的。

损失函数是平方函数时,问题是对Outlier敏感。

常用的损失函数有:

总结:

很多博客引用了以下的图:

但是这个图有一些错误,或者说可能让人混淆的地方:

六、GBDT的变形和参数建议

GBDT的一个重要的参数就是每个DT(Decision Tree)的深度。类似于Adaboost,如果每次迭代时树都完全长成,那么其实就成为了一个基本的决策树,会导致过拟合,也失去了Boost算法的意义。在一些文章中,很多人推荐把树的深度设为4到8之间,并且认为6是个不错的数值。我觉得,这个也要看变量的个数、样本数、每次迭代的步长(后文会介绍)有关。这实际上是一个经验活,而且和每次的训练场景之间相关。

GBDT在实际运用时,常常有两种变体:

“Shrinkage”: 事实上这是一种正则化(regularization)方法,为了进一步过拟合,在每次对残差估计进行迭代时,不直接加上当前步所拟合的残差,而是乘以一个系数。

即:fm = fm-1 + λ 当前回归数残差

λ为1时,即为不加Shrinkage的一般GBDT。

有文章指出,10 < λ 迭代次数(或者说数的数目)< 100,是一个比较合适的学习速率。但是一般这个速率常常被设成了01,或者005。

“Bagging”: 每次迭代单步的树时,随机选一些样本的残差做拟合,而不是把所有样本的残差做拟合(常用的样本残差选取率为05-06)。这和随机森林的思想有类似之处,下一章详细介绍一下。

七、GBDT和Random Forest的区别简要

我们再简要说明一下另外一类集成学习的方法,Bagging

Bagging,装袋。但是这名字其实是由Bootstrap Aggregating(加速聚合)而来。指的是用并行的方案生成各个各个学习器的方案。

具体而言,Random Forest通过随机抽样、随机选取特征来产生一棵树,最后通过每棵树的结果做线性结合来产生最终的预测结果。由于每棵树的生成过程不依赖于其他树(和GBDT明显区别,GBDT每棵树的产生需要依赖上一层树的结果),所以树的生成是并行的(这也是其成为Bagging的原因)。在RF中,每棵树都是几乎完全长成(但是仅仅预测了部分样本),树的深度会很大。

Boosting方法,每棵树是不能完全长成的,只需要一部分特征就去完成残差的一个迭代降低。个人认为,这特别适合解决这类问题:部分样本就用部分特征就能描述,而另外的样本可能需要其他的特征来描述,比如股票的样本有很多类型的股票,我们有的朋友对一种类型比较擅长,另外的朋友对别的类型比较擅长。我们目前的主要工作,恰好满足这个条件。

八、多说几句感想

能成事,解决实际的问题,需要吃透每一个点,了解每一种工具、每一个算法的由来、含义,特别是工作中的算法,如果只是略知一二,是不能很好地解决问题的。

学习时,真正把一个问题吃透,才有兴趣往下走。如果只是半桶水,似懂非懂,再往下会遇到很多麻烦,因为后面的知识往往依赖于前面的知识,后面的理解学习过程也会很慢。如果一个人前面没有完全吃透,后面学习花的时间会更多。在一个时间内没有达到预期的效果,没有正向反馈,就会对齐失去兴趣。

所以,只有把每个问题吃透,不漏疑点,才能保持兴趣。

什么算吃透?

任何一个公式的由来,含义。公式从来不用记住,只是靠脑子里的理解就能写出来。

但是吃透一个问题,谈何容易!有三点:

根据我的观察(包括学生和老师),高中能做到所有知识点都能融汇贯通的一般都能去985大学,大学里更是只有极少数人能做到这一点。包括所谓的教授,30-50%都是一知半解(他可能只对自己科研的方向比较熟悉,但我认为这不是合格的教授)。

参考文档

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/11669780.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存