未定义与 struct 类型的输入参数相对应的函数 fetch_引入鲁棒性作为连续参数,这种新损失函数实现了自适应、随时变换...

编辑:陈萍

损失函数是机器学习里最基础也是最为关键的一个要素,其用来评价模型的预测值和真实值不一样的程度。最为常见的损失函数包括平方损失、指数损失、log 对数损失等损失函数。这里回顾了一种新的损失函数,通过引入鲁棒性作为连续参数,该损失函数可以使围绕最小化损失的算法得以推广,其中损失的鲁棒性在训练过程中自动自我适应,从而提高了基于学习任务的性能。

8880387eaafe0aa33c6d1963521407c8.png

这篇文章对 CVPR 2019 的一篇论文《A General and Adaptive Robust Loss Function》进行了回顾性综述,主要讲述了为机器学习问题开发鲁棒以及自适应的损失函数。论文作者为谷歌研究院的研究科学家 Jon Barron。

b50335b14e94b21557d7023ac2bd9c1e.png

论文地址:https://arxiv.org/pdf/1701.03077.pdf

异常值(Outlier)与鲁棒损失

考虑到机器学习问题中最常用的误差之一——均方误差(Mean Squared Error, MSE),其形式为:(y-x)²。该损失函数的主要特征之一是:与小误差相比,对大误差的敏感性较高。并且,使用 MSE 训练出的模型将偏向于减少最大误差。例如,3 个单位的单一误差与 1 个单位的 9 个误差同等重要。

下图为使用 Scikit-Learn 创建的示例,演示了在有 / 无异常值影响的情况下,拟合是如何在一个简单数据集中变化的。

3218492da4132d3151035e74be4ba6a1.png

MSE 以及异常值的影响。

如上图所示,包含异常值的拟合线(fit line)受到异常值的较大影响,但是优化问题应要求模型受内点(inlier)的影响更大。在这一点上,你可能认为平均绝对误差(Mean Absolute Error, MAE)会优于 MSE,因为 MAE 对大误差的敏感性较低。也不尽然。目前有各种类型的鲁棒损失(如 MAE),对于特定问题,可能需要测试各种损失。

所以,这篇论文引入一个泛化的损失函数,其鲁棒性可以改变,并且可以在训练网络的同时训练这个超参数,以提升网络性能。与网格搜索(grid-search)交叉验证寻找最优损失函数相比,这种损失函数花费的时间更少。让我们从下面的几个定义开始讲解:

鲁棒性与自适应损失函数的一般形式:

9b86980c3477f2249ad6866f448c8770.png

公式 1:鲁棒性损失,其中α为超参数,用来控制鲁棒性。

α控制损失函数的鲁棒性。c 可以看作是一个尺度参数,在 x=0 邻域控制弯曲的尺度。由于α作为超参数,我们可以看到,对于不同的α值,损失函数有着相似的形式。

b4b492187a074d88c6d05eb707d248f0.png

公式 2:不同α值对应不同的自适应性损失。

在α=0 和α=2 时,损失函数是未定义的,但利用极限可以实现近似。从α=2 到α=1,损失函数平稳地从 L2 损失过渡到 L1 损失。对于不同的α值,我们可以绘制不同的损失函数,如下图 2 所示。

导数对于优化损失函数非常重要。下面研究一下这个损失函数的一阶导数,我们知道,梯度优化涉及到导数。对于不同的α值,x 的导数如下所示。下图 2 还绘制了不同α的导数和损失函数。

1936ad9186e8238d4174b6eb5e09eaf3.png

公式 3:鲁棒损失(表达式 1)对于不同的α的值相对于 x 的导数

自适应损失及其导数

下图对于理解此损失函数及其导数非常重要。在下图 2 中,尺度参数 c 固定为 1.1。当 x = 6.6 时,可以将其视为 x = 6×c。可以得出以下有关损失及其导数的推论:

1. 当 x、α和 c>0 时,损失函数是光滑的,因此适合于基于梯度的优化;

2. 损失函数总是在原点为零,并且在 | x |>0 时单调增加。损失的单调性也可以与损失的对数进行比较;

3. 损失也随着α的增加而单调增加。此属性对于损失函数的鲁棒性很重要,因为可以从较高的α值开始,然后在优化过程中逐渐减小(平滑)以实现鲁棒的估计,从而避免局部最小值;

4. 当 | x |

5. 对于α= 2,导数始终与残差的大小成正比。通常,这是 MSE(L2)损失的特性;

6. 对于α=1(L1 损失),我们看到导数的幅度在 | x |>c 之外饱和至一个常数值(正好是 1/c)。这意味着残差的影响永远不会超过一个固定的量;

7. 对于αc 而减小。这意味着当残差增加时,它对梯度的影响较小,因此异常值在梯度下降过程中的影响较小。

b5ef2c447ce1c941cf8d3c67164a4863.png

图 2:损失函数及其导数与α的关系。

e799d43d738b7da32117cc8876f0b357.png

图 3:自适应损失函数(左)及其导数(右)的曲面图。

鲁棒损失的实现:Pytorch 和 Google Colab

关于鲁棒损失的理论掌握了,怎么实现呢?使用的代码在 Jon Barron 的 GitHub 项目「robust_loss_pytorch」中稍加修改。此外还创建了一个动画来描述随着迭代次数的增加,自适应损失如何找到最佳拟合线。

GitHub 地址:https://github.com/jonbarron/arom_loss_pytorch

不需要克隆存储库,我们可以使用 Colab 中的 pip 在本地安装它。

此外还创建了一个简单的线性数据集,包括正态分布的噪声和异常值。

首先,由于使用了 Pythorch 库,利用 torch 将 x, y 的 numpy 数组转换为张量。

其次,使用 pytorch 模块定义线性回归类,如下所示:

接下来,用线性回归模型拟合自创建的线性数据集,首先使用损失函数的一般形式。这里使用一个固定值α(α=2.0),它在整个优化过程中保持不变。正如在α=2.0 时看到的,损失函数等效 L2 损失,这对于包括异常值在内的问题不是最优的。对于优化,使用学习率为 0.01 的 Adam 优化器。

利用鲁棒损失函数的一般形式和固定α值,可以得到拟合线。原始数据、真直线(生成数据点时使用的具有相同斜率和偏差的线,排除异常值)和拟合线如下图 4 所示:

5c8bfa5ab4ef041c19d75533d114fc18.png

图 4:一般损失函数

损失函数的一般形式不允许α发生变化,因此必须手动微调α参数或执行网格搜索进行微调。

此外,正如上图所示,由于使用了 L2 损失,拟合受到异常值的影响。这是一般的情况,但如果使用损失函数的自适应版本,会发生什么呢?调用自适应损失模块,并初始化α,让α在每个迭代步骤中自适应。

此外,还有一些额外的代码使用 celluloid 模块,见下图 5。在这里,可以清楚地看到,随着迭代次数的增加,自适应损失如何找到最佳拟合线。这个结果接近真实的线,对于异常值的影响可以忽略不计。

ee7f8b48ff28d73e3730425e5e55ed2e.gif

图 5:自适应损失函数如何达到最佳拟合的动画。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清理jdk注册表_JDK 9早期版本安装后的Windows注册表清理

清理jdk注册表在我的上一篇博文中 ,我演示了在安装早期版本的JDK 9(内部版本68)之后围绕Oracle Java符号链接 (基于Windows的计算机上的C:\ProgramData\Oracle\Java\javapath\目录)的问题的解决方案。这似乎阻止了早期…

汇编语言调用C语言/C++实例:乘法表

点击蓝字关注我们来源于网络,侵删现在编写一个简单的应用程序,提示用户输入整数,通过移位的方式将其与 2 的幕 (2〜2ⁿ) 相乘,并用填充前导空格的形式再次显示每个乘积。输入-输出使用 C。汇编模块将调用 3 个 C 编写的函数。程序…

rect函数_R函数不会写,quot;抄quot;总会吧!

前面我们简单的介绍了R函数。有些人可能会说,我现在的R水平有限,还不足以写出很高级的函数,该怎么办?俗话说前人栽树后人乘凉,他山之石可以攻玉,鲁迅同志也提出过“拿来”主义。已经有前人,高手…

rest服务swagger_使用Swagger轻松记录您的Play Framework REST API

rest服务swagger该帖子最初在http:// swag ger.io(7/30/2015)上发布 我一直在使用Play Framework作为多个项目的基于Java的,闪电般的REST后端框架。 后来,我很高兴找到Swagger,并努力将其集成到几个项目中…

10个超赞的C语言开源项目,强烈推荐!

点击蓝字关注我们来源于网络,侵删今天分享10个超赞的C语言开源项目,希望这些内容能对大家有所帮助!目录:1. Webbench2. Tinyhttpd3. cJSON4. CMockery5. Libev6. Memcached7. Lua8. SQLite9. UNIX v610. NETBSD1. WebbenchWebbenc…

python使用欧氏距离knn_python运用sklearn实现KNN分类算法

KNN(K-Nearest-Neighbours Classiflication)分类算法,供大家参考,具体内容如下最简单的分类算法,易于理解和实现实现步骤:通过选取与该点距离最近的k个样本,在这k个样本中哪一个类别的数量多,就把k归为哪一…

jboss性能指标_JBoss BRMS复杂事件处理(CEP)性能基准

jboss性能指标技术来了又去,但是一件事保持不变。 在设计企业解决方案时,我们喜欢使我们的生活更轻松的复杂组件,作为建筑师和开发人员,我们一直在寻找使我们的生活更轻松的方法。 一种方法是跟上与感兴趣的技术有关的流行新站点…

C语言经验分享:二维指针与二维数组的两种错误用法

点击蓝字关注我们来源于网络,侵删引子首先看一段代码:void test(int *p) {}int main() {int arr[] {30, 450,14,5};test(arr);return 0; }毫无疑问,上面这段代码是运行OK的。因为C语言标准中有以下规则:在函数参数的声明中,数组名被编译器当作…

word 公式编号 右侧对齐_写论文要求公式居中编号右对齐的方法

非常实用,推荐给大家1,输入公式和序号,公式和序号之间加入“#”符号2.把光标放到公式的最后(一定要在公式内),然后按下“enter”键,即可完成公式居中并且序号自动对齐最右方的操作。

camel 使用_使用Camel从WildFly 8向WebLogic 12发送JMS消息

camel 使用系统集成是一个很好的挑战。 特别是当您在寻找通信标准和可靠的解决方案时。 在当今的微服务世界中,每个人都在谈论REST服务和基于http的协议。 实际上,对于大多数通常具有更复杂的需求集的大多数企业项目来说,这是远远不够的。 合…

C++异常处理控制流下的OLLVM混淆

点击蓝字关注我们来源于网络,侵删Inflated!!!C异常化处理OLLVM-控制流平坦化Two PuzzlesException一般碰到C异常逆向,确定了异常分发、处理部分,直接把call throw改为jmp catch块,再F5即可。PS: 多个catch块根据rdx来当为异常处理…

【微服务】springboot整合kafka-stream使用详解

目录 一、前言 二、kafka stream概述 2.1 什么是kafka stream 2.2 为什么需要kafka stream 2.2.1 对接成本低 2.2.2 节省资源 2.2.3 使用简单 2.3 kafka stream特点 2.4 kafka stream中的一些概念 2.5 Kafka Stream应用场景 三、环境准备 3.1 搭建zk 3.1.1 自定义d…

maven项目 jetty_如何使用Java,Maven,Jetty创建Web应用程序项目

maven项目 jetty在本文中,我们使用Maven Archetype插件创建一个简单的Web应用程序。 我们将在一个名为Jetty的Servlet容器中运行此Web应用程序,添加一些依赖项,编写简单的Servlet,并生成WAR文件。 在本文的结尾,您还可…

如何解决python中编码错误的问题_【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼对于Python解析器而Python解析器所干的事情,就是:Python解析器,根据当前的所用的字符串编码类型此字符串编码类型,是你自己所设置的不论是在Python的IDLE中,还是Python文件…

C语言知识总结一:C语言的基本知识汇总

点击蓝字关注我们来源于网络,侵删C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作 为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机 硬件的应…

jboss8日志级别设置_罐中研讨会:设置JBoss BPM Suite全日研讨会

jboss8日志级别设置是否在寻找一种简单的方法来宣传,展示或演示JBoss业务流程管理套件(BPM Suite)产品的入门难度? 别无所求,因为我们已经召集了这个研讨会,因此您可以围绕JBoss BPM Suite构建一个晚上&a…

yapi 接口文档_1分钟docker部署顶尖 API 文档管理系统

YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击…

微软CTO建议业界弃用C/C++采用Rust,遭C++之父回怼

点击蓝字关注我们来源于网络,侵删近日,Microsoft Azure CTO、Sysinternals 的主要开发者 Mark Russinovich 在其社交账号上发布动态称,开发人员是时候停止使用 C/C 来启动新项目,并建议可在需要使用 non-GC 语言的场景中使用 Rust…

红帽 jboss_红帽峰会2015所需的JBoss BPM内容指南

红帽 jboss明年再见? 今年在Red Hat Summit上,我们在JBoss BRMS和JBoss BPM Suite演讲中获得了很多乐趣。 在DevNation周围也有一些社区会议,重点介绍了使我们的产品成为可能的项目。 您可以在他们的博客上找到此演讲的概述,并…

跳一跳python刷分_【Python跳一跳刷分辅助】iPhone版_Python跳一跳刷分辅助Ios最新版下载_Python跳一跳刷分辅助v1.0.1苹果版免费下载 - 九酷苹果网...

Python跳一跳刷分辅助工具免费提供了,绝对是从根源上找到高分技巧,通过源代码完成高分获取,喜欢这类小游戏的你不要错过了这款辅助了~Python跳一跳刷分辅助原理:原理说明将手机点击到《跳一跳》小程序界面;用Adb 工具获取当前手机…