威瑞森媒体数据科学访谈
要成为一名数据科学家,需要通过几个面试阶段
莱昂·塞伯特在 Unsplash 上拍摄的照片
一些历史
威瑞森媒体 是威瑞森通信集团成立两年的子公司,负责开发在线、数字媒体和广告服务。这家子公司是在威瑞森收购两家公司之后成立的,这两家公司在上世纪 90 年代中期互联网繁荣时期为在线通信和网络浏览引入了一系列广泛使用的数字服务——AOL 和 Yahoo!
直到 2019 年初,AOL 和雅虎!成为威瑞森公司的一部分,被称为誓言公司*,后来被命名为威瑞森媒体。今天,威瑞森媒体作为公司的主要媒体和在线广告部门,运营着无数知名的数字品牌,此外还收购了两个品牌,包括赫芬顿邮报和 TechCrunch 。就像任何其他坐拥大量消费者数据的数字媒体和营销服务公司一样,他们乐于寻求合格数据科学家的专业知识。这是他们在法国巴黎总部的入门级数据科学职位的数据科学面试。*
总体要求
威瑞森媒体的数据科学家的工作描述非常典型。一个人应该至少拥有计算机科学、会计或任何相关专业的学士学位。一个人还应该在商业智能和规范分析以及数据可视化方面拥有专业知识,并使用 Tableau 等工具。新员工应该能够进行预测建模,在 Python 或 R 中实现机器学习(ML)算法,了解云环境中的数据仓库,例如亚马逊网络服务 ( AWS)或谷歌云平台。一个人应该了解数据库管理和查询,因此有一个体面水平的 SQL 技能是好的。
虽然该角色被宣传为数据科学家,但这些要求很容易成为数据工程师和数据分析师的预期职责。这有一些影响-新员工将需要作为数据科学家戴上一顶以上定义明确的帽子,并可能拥有完成各种数据相关任务的知识,以避免团队不得不雇用整个新员工来提供特定的专业知识。一个多方面的角色可能最终对一个人的发展都有好处。
面向数据工程师(左)和数据科学家(右)的典型维恩数据堆栈图。来源:数据营
因此,我们需要进行广泛的研究,以设计和实施商业解决方案,进行复杂的统计和计算分析,将 ML 算法应用于客户数据,以优化数字服务和营销平台,并将研究和分析的结果传达给商业利益相关者。这是一个很高的要求,一个人对这个角色的总体适应性将在最初的电话筛选中得到判断。
第一阶段:电话屏幕面试
下一步可能是电话面试。在 30 分钟的电话筛选中,候选人被要求提供他们在数据分析和数据科学方面的专业知识的背景信息。像往常一样,我们的目标是了解他们的技能、职业兴趣和以往的经验。在这一阶段,除了一两个简短的问题来测试一个人在解释数学和/或统计概念方面的舒适程度和能力之外,这些问题不太可能非常专业。例如,人们可能被要求向外行人解释一对事件的独立性和互斥性之间的区别。这只是众多问题中的一个,可以证明候选人对一个概念理解得足够好,能够向没有相同知识基础的人阐述或阐明这个概念。
第二阶段:带回家的作业
课后测试的第一部分将进一步评估一个人与软件工程师和利益相关者交流概念的能力。作业可能会在 Jupyter 笔记本和/或 Python 脚本中提交,其中包含以下问题:
- 向工程师解释什么是降维,并提供实例。
- 你会如何向一位企业高管解释无监督学习是如何运作的,以及它如何被用来利用营销技巧?
- 向同一个主管解释 90%的置信区间。
这项任务还要求候选人在数据建模部分展示他们作为数据科学家或机器学习工程师的技术能力。为此,需要熟悉以下概念和工具,
统计数据:
- 二元和边际分布
- 正态(高斯)和偏斜分布
预测建模:
- 时间序列
Python 实现:
- 数据可视化:Seaborn 和 Matplotlib
- 笨笨和笨笨
- Tensorflow、Scikits-learn、PyTorch APIs
面向数据科学家/分析师的典型 Python 技术堆栈
带回家的作业意味着要在几个小时到一周内完成,这完全取决于一个人的承诺。
第三阶段:现场面试
要通过这项带回家的任务,需要一个人正确完成给出的每个问题,或者让招聘团队领导满意。成功通过后,面试过程中的最后一个阶段就在候选人和工作机会之间。这是现场面试,也可以在线进行。在这一阶段,当一个人回答关于制定技术和业务战略的问题时,他与组织内不同层次的人交流复杂概念的能力将再次得到验证。最后的面试将为团队提供一个机会,让他们感受候选人的工作和沟通风格,以及他们的团队合作能力。
第四阶段:报价
通过了前两个阶段,最后的面试应该是一帆风顺的。当然,正如面试中常见的情况一样,获得最终职位需要很多运气。
结论
好吧,我们可以在这里结束。总之,我概述了威瑞森媒体的数据科学家职位的要求,以及面试过程中最终获得工作机会的各个阶段。我希望这些信息能在你求职的某个阶段对你有所帮助,并给你至少一个数据点来改进你最终数据科学面试策略的回归模型。
声学 SLAM——技术现状:综述
基于声信号的同步定位与地图创建综述。
来自维基:https://sco.wikipedia.org/wiki/Acoustics
介绍。
随着最近无人机使用的增加(包括飞行和地面车辆),在以前未知和未探索的位置自主导航的能力已经成为一项至关重要的任务。能够探索标准和极端环境(如洞穴、受损建筑等)的机器人。)正受到越来越多的关注。已经考虑的一种解决方案是同步定位和地图绘制(SLAM ),其中车辆可以同时探索和绘制其环境。
部分由于计算机视觉技术的快速发展,使用传感器摄像机阵列的视觉 SLAM 在学术界和工业界都受到了广泛的关注。然而,相机受到几个因素的严重限制,例如它们相当大的计算需求,以及它们不能在恶劣的照明条件下操作,这可能是对任务的严重限制。
基于摄像机的感测的替代方法是使用声学传感器,其以类似声纳的方式工作。声学 SLAM (aSLAM)受到的关注有限,但在这方面已经开展了一些工作,特别是地面机器人(如 Evers 等人的工作[1])。值得注意的是,声学 SLAM 也受到一些限制,如低分辨率(特别是与视觉仪器相比),但对计算的要求要低得多。本综述分为三个部分:(A)一般 SLAM 问题的一般和简要背景。(b)当今用于声学 SLAM 的最先进方法。©审查 aSLAM 的现代工业应用。
背景
考虑到当前的工业应用,本综述包含关于声学 SLAM 的广泛文献调查。在 SLAM 中,一个物体(机器人、汽车等。)在未知环境中沿着未知轨迹[2]移动,目标是绘制其周围环境的地图。SLAM 算法用于重建环境地图和物体轨迹。在大多数情况下,地图是由已知的地标指定的。重建地图相当于确定这些地标相对于物体的位置。达兰特-威特和贝利[3]-[4]以及卡德纳等人[5]和特鲁内等人[6]已经总结了这个问题和解决这个问题的各种方法。解决一般 SLAM 问题的两个经典算法是扩展卡尔曼滤波器(EKF-SLAM) [7]和 SLAM 的分解解(FastSLAM) [8]。EKF 是一种著名的处理非线性问题的导航和控制算法。另一方面,FastSLAM 算法利用后验概率的 Rao-Blackwellized [9]表示,集成了粒子滤波和卡尔曼滤波表示。目前,这两种方法构成了 SLAM 领域的核心。
最先进的声学 SLAM 方法
在声学 SLAM 中,许多方法在自由空间中工作良好,但由于来自地标的回声,在室内环境中部署更具挑战性。
使用粒子滤波器的 DoA 估计
埃弗斯和奈洛尔[1]提出了一种基于配有麦克风阵列的观测器的算法,用于探索和学习给定环境中各种基于声学的地标。该算法基于源位置的概率三角测量,通过估计源的到达方向(DoA),利用观察者的时空多样性,并通过使用直接路径优势多信号分类(DPD-MUSIC) [10]使其最大化来实现。对于每一个时间步,正如 Botev 和格洛托夫斯基[11]所建议的。通过估计样本的核密度来近似计算连续单源概率密度函数。多源 PDF 通过其概率假设密度(PHD)来近似。这项研究建议通过一种概率方法融合运动报告和源地图,这种方法被称为粒子滤波器(也称为序列蒙特卡罗)[12]。Andrieu 和 Godsill [13]将这种方法应用于音频。在他们的实验研究中,他们实现了定位和映射结果,包括 DoA 估计误差的鲁棒性[1]。
基于麦克风阵列的几何重建
Dokmanic 等人[14]展示了基于声学仪器(特别是麦克风阵列)的房间几何形状重建。他们将模型公式化为一个约束优化问题,而没有使用概率方法,但他们的解决方案仅限于几个麦克风。Ba 等人[15]提出了一种基于圆形麦克风阵列的新型房间建模算法。他们展示了实验结果,其中映射几乎完美地完成,并且以高精度确定了到房间墙壁的距离。
应用程序
Furukawa 等人[16]报告了使用无人驾驶飞行器(UAV)进行基于声学的定位。他们开发了一种方法,通过在多旋翼无人机上安装麦克风阵列来提高声源定位。他们声称主要问题是车辆螺旋桨发出的自身噪音。他们实现了基于广义特征值分解(GEVD)的 MUSIC。
2017 年,Krekovic,Dokmanic 和 Vetterli 根据回声重建了轨迹和房间几何形状,这些回声是由静态麦克风阵列捕获的。他们的工作受到了蝙蝠的启发,蝙蝠通过听叫声的回声在室内飞行。Lollmann 等人[18]介绍了作为 IEEE 音频和声学信号处理(AASP)源定位和跟踪(LO- CATA)的一部分的实验结果。使用平面、球形和伪球形麦克风阵列记录音频。实验包括:用于移动人类谈话者和扬声器的静态和移动阵列。
参考
[1]克里斯汀·埃弗斯和帕特里克·奈洛尔声学撞击。 IEEE/ACM 音频、语音和语言处理汇刊,26(9):1484–1498,2018。
[2]MWM·加米尼·迪萨纳亚克、保罗·纽曼、斯蒂夫·克拉克、休·达兰特-威特和迈克尔·科尔巴。一种解决同时定位和地图创建问题的方法。 IEEE 机器人与自动化汇刊,17(3):229–241,2001。
[3]休·达兰特-威特和蒂姆·贝利。同步定位和绘图:第一部分 IEEE 机器人学&自动化杂志,13(2):99–110,2006。
[4]蒂姆·贝利和休·达兰特-威特。同步定位和绘图(slam):第二部分。 IEEE 机器人学&自动化杂志,13(3):108–117,2006。
[5]塞萨尔·卡迪纳、卢卡·卡隆、亨利·卡里略、亚西尔·拉蒂夫、达维德·斯卡拉穆扎、何塞·内拉、伊恩·里德和约翰·伦纳德。同时定位和绘图的过去、现在和未来:走向健壮感知时代。 IEEE 机器人学报,32(6):1309–1332,2016。
[6]巴斯蒂安·特龙、沃尔夫拉姆·布加尔德和迪特尔·福克斯。概率机器人学(智能机器人和自主代理系列)。
7 安德鲁·H·亚兹温斯基。随机过程和滤波理论。快递公司,2007 年。
[8]迈克尔·蒙特梅洛,巴斯蒂安·特龙,达芙妮·柯勒,本·韦格布雷特,等,《Fastslam:同时定位和绘图问题的分解解决方案》。Aaai/iaai ,593598,2002 年。
[9]阿诺·杜塞、南多·德弗雷塔斯、凯文·墨菲和斯图亚特·罗素。动态贝叶斯网络的 Rao-Blackwell ized 粒子滤波。在第十六届人工智能不确定性会议记录,第 176-183 页。摩根考夫曼出版公司,2000 年。
10 或纳迪里和波阿斯·拉斐尔。使用球形麦克风阵列和直接路径优势测试定位高混响下的多个扬声器。 IEEE/ACM 音频、语音和语言处理汇刊,22(10):1494–1505,2014。
[11]兹德拉夫科·I·博泰夫、约瑟夫·F·格洛托夫斯基、德克·P·克罗斯等,通过扩散进行核密度估计。统计年鉴,38(5):2916–2957,2010。
[12]皮埃尔·德尔·莫拉尔。非线性滤波:相互作用的粒子分辨率。科学研究院报告-系列 I-数学,325(6):653–658,1997 年。
[13] C .安德烈和 SJ .戈德西尔。基于模型的声源分离的粒子滤波器。《独立分量分析和盲信号分离国际研讨会论文集(ICA 2000)》,2000 年。
[14] Ivan Dokmani c、Laurent Daudet 和 Martin Vetterli。从声学房间重建到 slam。在 2016 IEEE 国际声学、语音和信号处理会议(ICASSP) 中,第 6345–6349 页。Ieee,2016。
[15]登巴·巴、弗拉维奥·里贝罗、查·张和迪内·弗洛伦西奥。L1 正则化房间模型与紧凑的麦克风阵列。在 2010 年 IEEE 国际声学、语音和信号处理会议中,第 157–160 页。IEEE,2010 年。
[16]古川康太郎、大谷圭太、大平康平、大冢拓马、藤山胜、中代和弘和大野浩史。改善多旋翼无人机声源定位的噪声相关矩阵估计。在 2013 IEEE/RSJ 智能机器人和系统国际会议中,第 3943–3948 页。IEEE,2013 年。
[17]米兰达·克雷科维奇、伊万·多克马尼和马丁·维特利。全向蝙蝠,点到平面的距离,以及独一无二的代价。在 2017 IEEE 声学、语音和信号处理国际会议(ICASSP) 中,第 3261–3265 页。Ieee,2017。
[18]海因里希·奥尔曼、克里斯蒂娜·埃维斯、亚历山大·施密特、海因里希·梅尔曼、亨德里克·巴福斯、帕特里克·奈洛尔和沃尔特·凯勒曼。声源定位和跟踪的 locata 挑战数据语料库。在 2018 IEEE 第 10 届传感器阵列和多通道信号处理研讨会(SAM) ,第 410–414 页。IEEE,2018。
使用 RLlib 进行动作屏蔽
改善强化学习的参数动作
RL 算法通过反复试验来学习。代理人在早期搜索状态空间,并采取随机行动来了解什么会带来好的回报。非常简单。
不幸的是,这并不是非常有效,特别是如果我们已经知道一些关于在某些州什么是好与坏的行为。幸运的是,我们可以使用动作屏蔽——一种将坏动作的概率设置为 0 的简单技术——来加速学习和改进我们的策略。
TL;速度三角形定位法(dead reckoning)
我们通过对背包打包环境的动作屏蔽来实施约束,并向展示如何使用 RLlib 来实现这一点。
强制约束
让我们用经典的 背包问题 来开发一个具体的例子。
背包问题(KP)要求你打包一个背包,在不超载的情况下使包里的价值最大化。如果你收集了如下所示的物品,最佳包装将包含三个黄色盒子和三个灰色盒子,总共 36 美元和 15 公斤(这是无界背包问题,因为你可以选择的盒子数量没有限制)。
来源:维基百科
通常,这个问题是使用动态编程或数学编程来解决的。如果我们按照数学程序建立它,我们可以写出如下模型:
在这种情况下, x_i 可以是任何大于等于 0 的值,代表我们放入背包的物品数量。 v_i 和 w_i ,分别为项目的值和权重。
用简单的语言来说,这个小模型是在说我们想要最大化背包中的价值(我们称之为 z )。我们通过找到最大数量的物品( x_i )和它们的值( v_i )而不超过背包的重量限制( W )来做到这一点。这个公式被称为整数规划(IP ),因为我们有整数决策变量(我们不能打包项目的一部分,只能打包完整的整数值),并使用像 CPLEX、Gurobi 或 GLPK(最后一个是免费和开源的)这样的求解器来求解。
强制实施这些约束是模型的一部分,但它并不是 RL 的一部分。RL 模型可能需要包装绿色的 12 公斤的盒子几次,然后才知道它不能包装那个和黄色的 4 公斤的盒子,通过受到几次大的负面奖励。过度打包的负面回报是一个“软约束”,因为我们没有明确禁止算法做出这些糟糕的决定。但是,如果我们使用动作屏蔽,我们可以确保模型不会做出愚蠢的选择,这也将有助于它更快地学习更好的策略。
金伯利进程环境
让我们通过使用[or-gym](https://github.com/hubbs5/or-gym)
库打包一个背包来实现这一点,该库包含一些来自运筹学领域的经典环境,我们可以用它们来训练 RL 代理。如果你熟悉 OpenAI Gym,你会以同样的方式使用它。可以用pip install or-gym
安装。
一旦安装完成,导入它并构建Knapsack-v0
环境,这就是我们上面描述的无界背包问题。
import or_gym
import numpy as np
env = or_gym.make('Knapsack-v0')
该环境的默认设置有 200 种不同的物品可供选择,最大承重为 200 公斤。
print("Max weight capacity:\t{}kg".format(env.max_weight))
print("Number of items:\t{}".format(env.N))[out]
Max weight capacity: 200kg
Number of items: 200
这很好,但是 200 个项目看得太清楚了,所以我们可以通过一个env_config
字典来更改其中的一些参数,以匹配上面的示例。此外,我们可以通过将mask: True
或mask: False
传递给配置字典来打开和关闭动作屏蔽。
env_config = {'N': 5,
'max_weight': 15,
'item_weights': np.array([1, 12, 2, 1, 4]),
'item_values': np.array([2, 4, 2, 1, 10]),
'mask': True}env = or_gym.make('Knapsack-v0', env_config=env_config)print("Max weight capacity:\t{}kg".format(env.max_weight))
print("Number of items:\t{}".format(env.N))[out]
Max weight capacity: 15kg
Number of items: 5
现在我们的环境与上面的例子相匹配。简单看一下我们的状态。
env.state[out]
{'action_mask': array([1, 1, 1, 1, 1]),
'avail_actions': array([1., 1., 1., 1., 1.]),
'state': array([ 1, 12, 2, 1, 4, 2, 4, 2, 1, 10, 0])}
当我们将 action mask 选项设置为True
时,我们得到一个字典输出,作为包含三个条目action_mask
、avail_actions
和state
的状态。这对于or-gym
库中的所有环境都是相同的格式。掩码是一个二进制向量,其中 1 表示允许一个动作,0 表示它将打破某些约束。在这种情况下,我们唯一的约束是重量,所以如果一个给定的项目将推动模型超过重量,它将收到一个大的,负的惩罚。
可用操作对应于代理可以选择打包的五个项目中的每一个。状态是传递给神经网络的输入。在这种情况下,我们有一个连接了项目权重和值的向量,并在末尾添加了当前权重(初始化环境时为 0)。
如果我们继续并选择 12 公斤的物品进行包装,我们应该看到动作屏蔽更新,以消除包装任何其他物品,使模型超过重量限制。
state, reward, done, _ = env.step(1)
state{'action_mask': array([1, 0, 1, 1, 0]),
'avail_actions': array([1., 1., 1., 1., 1.]),
'state': array([ 1, 12, 2, 1, 4, 2, 4, 2, 1, 10, 12])}
如果你看一下action_mask
,那正是我们所看到的。环境正在返回信息,我们可以使用这些信息来阻止代理选择 12 公斤或 4 公斤的物品,因为这将违反我们的约束。
这里的概念很容易应用。在您完成通过策略网络的转发后,您可以使用掩码来更新非法操作的值,使它们成为较大的负数。这样,当你把它传递给 softmax 函数时,相关的概率将会是 0。
现在,让我们转向使用 RLlib 来训练模型以遵守这些约束。
RLlib 中的动作屏蔽
RLlib 中的动作屏蔽需要构建一个直接处理逻辑的定制模型。对于带有动作屏蔽的定制环境,这并不像我希望的那样简单,所以我将一步一步地指导您。
我们需要先进口很多东西。如果你熟悉这个库的话,ray
和我们的ray.rllib.agents
应该是显而易见的,但是我们还需要tune
、gym.spaces
、ModelCatalog
、一个 Tensorflow 或 PyTorch 模型(取决于你的偏好,对于这个我只坚持使用 TF),以及一个我们编写的or_gym
库中名为create_env
的实用程序,以使这个更加平滑。
import ray
from ray.rllib import agents
from ray import tune
from ray.rllib.models import ModelCatalog
from ray.rllib.models.tf.tf_modelv2 import TFModelV2
from ray.rllib.models.tf.fcnet import FullyConnectedNetwork
from ray.rllib.utils import try_import_tf
from gym import spaces
from or_gym.utils import create_envtf = try_import_tf()
构建自定义模型
我们需要明确地告诉神经网络如何处理状态字典中的不同值。为此,我们将基于 RLlib 的TFModelV2
模块构建一个定制模型。这将使我们能够构建一个定制的模型类,并向模型添加一个forward
方法以便使用它。在forward
方法中,我们应用如下所示的遮罩:
class KP0ActionMaskModel(TFModelV2):
def __init__(self, obs_space, action_space, num_outputs,
model_config, name, true_obs_shape=(11,),
action_embed_size=5, *args, **kwargs):
super(KP0ActionMaskModel, self).__init__(obs_space,
action_space, num_outputs, model_config, name,
*args, **kwargs)
self.action_embed_model = FullyConnectedNetwork(
spaces.Box(0, 1, shape=true_obs_shape),
action_space, action_embed_size,
model_config, name + "_action_embedding")
self.register_variables(self.action_embed_model.variables()) def forward(self, input_dict, state, seq_lens):
avail_actions = input_dict["obs"]["avail_actions"]
action_mask = input_dict["obs"]["action_mask"]
action_embedding, _ = self.action_embed_model({
"obs": input_dict["obs"]["state"]})
intent_vector = tf.expand_dims(action_embedding, 1)
action_logits = tf.reduce_sum(avail_actions * intent_vector,
axis=1)
inf_mask = tf.maximum(tf.log(action_mask), tf.float32.min)
return action_logits + inf_mask, state def value_function(self):
return self.action_embed_model.value_function()
为了完成这个过程,我们首先初始化模型并传递我们的true_obs_shape
,它将匹配state
的大小。如果我们坚持使用简化的 KP,这将是一个有 11 个条目的向量。我们需要提供的另一个值是action_embed_size
,它将是我们动作空间的大小(5)。从这里,模型根据我们提供的输入值初始化一个FullyConnectedNetwork
并注册这些值。
实际的屏蔽发生在forward
方法中,我们从环境提供的观察字典中解包屏蔽、动作和状态。状态产生我们的动作嵌入,它与我们的掩码相结合,以提供具有我们所能提供的最小值的逻辑。这将传递给 softmax 输出,从而将选择这些操作的概率降低到 0,有效地阻止代理采取这些非法操作。
一旦我们有了自己的模型,我们需要用ModelCatalog
注册它,这样 RLlib 就可以在训练中使用它。
ModelCatalog.register_custom_model('kp_mask', KP0ActionMaskModel)
此外,我们需要注册自定义环境,以便可以使用 RLlib 调用。下面,我有一个叫做register_env
的小助手函数,我们用它来包装我们的create_env
函数和 tune 的register_env
函数。Tune 需要基类,而不是像我们从or_gym.make(env_name)
获得的环境实例。所以我们需要使用如下所示的 lambda 函数将它传递给register_env
。
def register_env(env_name, env_config={}):
env = create_env(env_name)
tune.register_env(env_name, lambda env_name: env(env_name, env_config=env_config))
register_env('Knapsack-v0', env_config=env_config)
最后,我们可以初始化 ray,并将模型和设置传递给我们的培训师。
ray.init(ignore_reinit_error=True)trainer_config = {
"model": {
"custom_model": "kp_mask"
},
"env_config": env_config
}
trainer = agents.ppo.PPOTrainer(env='Knapsack-v0', config=trainer_config)
为了证明我们的约束有效,我们可以通过将其中一个值设置为 0 来屏蔽给定的动作。
env = trainer.env_creator('Knapsack-v0')
state = env.state
state['action_mask'][0] = 0
我们屏蔽了动作 0,所以根本看不到代理选择 0。
actions = np.array([trainer.compute_action(state) for i in range(10000)])
any(actions==0)[out]
False
我们做到了!我们已经成功地用 RLlib 中的自定义模型限制了我们的输出,以加强约束。您也可以使用与tune
相同的设置来约束动作空间并提供参数化动作。
面具有用
屏蔽可以非常有效地将代理从有害的局部最小值中释放出来。在这里,我们为 [or-gym](https://arxiv.org/abs/2008.06319)
构建了一个虚拟机分配环境,其中带有屏蔽的模型快速找到了一个优秀的策略,而没有屏蔽的模型则陷入了局部最优。我们尝试了很多奖励功能来摆脱这种困境,但是没有任何效果,直到我们应用了一个遮罩!
使用机器学习的动作规则发现
从数据中提取可操作的规则和提升估计值
在本文中,我们将讨论:
- 可解释的机器学习,相关性与因果性,用例
- 一个结合了预测和因果推理的强大 python 包,一个端到端的动作规则发现模型
链接到我的其他文章
简介
假设你是一个在企业工作的数据魔术师,任务是提出一个客户流失预测模型,以预测哪些客户有退订你的企业提供的服务的风险。你在 Colab Pro 上的一些 P100 GPU 上快速旋转一个深度神经网络,获得一些高预测精度,喝一杯康普茶,然后就可以收工了。第二天下午,你的老板打电话给你,说虽然预测能力很有用,但她需要知道哪些因素导致了客户流失的可能性,以及影响的程度。
您修改模型,而不是深度神经网络,使用 LightGBMs 的集合,结合对单个提升树计算的 Shapley 值,以给出如下的因子推断输出:
进球越多=流失越多…是这样吗?https://github.com/slundberg/shap在蓝海瀚的许可下
你有了另一个康普茶,满足于发现了(也相当有力地)模型认为哪些因素导致了流失,然后就到此为止。
就在你周五下午下班之前,你的老板 Zoom 再次打电话给你,告诉你尽管因素推断见解很棒,但我们仍然不知道这些因素是否实际上导致了流失或保留。她提醒你,相关性并不意味着因果关系,而且她也不知道模型所暗示的哪些因素实际上是因果关系,而不是巧合或虚假的相关性。
虚假相关的一个例子
作为一个痴迷的数据魔术师,你在网上搜索,无意中发现了一块隐藏的宝石,它能做你老板要求的一切。
有一个监督机器学习的分支叫做提升建模,它处理回答诸如“X 干预/行动会在多大程度上影响结果 Y?”给定包含关于干预 X 和结果 Y 的数据的历史记录数据集。X 对 Y 的影响是一个称为提升的量(如果 Y 是概率,通常是百分比)。在本文中,我们将简要介绍由[1]创建的名为 actionrules 的包,以及如何应用它来发现动作规则并量化它们对结果的影响。
动作规则
我们将简要介绍一些关于分类规则**、动作规则、支持、**置信度的定义,并看看如何估计提升。
分类规则 r_n 定义为:
r_ n =[(x1,n∧x2,n ∧ … ∧ X_m,n ) → Y_n]
其中元组(X_1,n ∧ X_2,n ∧ … ∧ X_m,n)是来自 n 个输入列的特定值 X_m。这个元组被称为前件或 ant,结果 Y_n 被称为后件。例如:
[(年龄= 55 岁∧吸烟=是∧体重= 240 磅)→心脏病风险=是]
是一个分类规则。分类规则通过称为支持度和置信度的两个数字进一步量化。支撑物被定义为
sup(ant → Yn) :=规则数(ant → Yn)
这是匹配条件(ant → Yn)的分类规则的数量,或者是匹配前因和后果的规则的数量。置信度定义为
conf(ant→Yn)= sup(ant→Yn)/sup(ant)
或者(ant → Yn)的支持度除以只有匹配前件的规则总数。
操作规则是分类规则的扩展:
a_ n =[f∧(X→X ')]→(Y→Y ')
其中 f 是一组固定的或不可改变的属性。对于动作规则,我们考虑固定属性和非固定或灵活属性的结合,从初始集合 X 到 X’的改变将改变结果 Y 到 Y’。一个具体例子是
[(年龄= 55 ∧(吸烟=是→否∧体重= 240 磅→190 磅)→心脏病风险=否]
原则上说,如果我们的受试者年龄固定,戒烟并因节食/锻炼而减轻体重,他们将不再有患心脏病的风险。我们可以再次使用置信度和支持度来量化通过某种方法发现的动作规则的质量。对动作规则的支持考虑了构成动作规则的两个分类规则 r 1 = (X→Y)和r 2 =(X’→Y’),并被定义为
sup(a_ n)= min(sup(r_ 1),sup( r _2))
并且动作规则的置信度被定义为
conf(a_ n)= conf(r_ 1)* conf(r_ 2)。
直观上,动作规则的支持度只能等于其分类规则之一的最小支持度,并且动作的置信度将小于或等于分类规则的任何一个置信度。
最后,隆起定义为
隆起= P(结果|治疗)-P(结果|无治疗)。
一般来说,任何提升模型都会尝试估计上述两种条件概率。
代码示例
动作规则发现算法的细节可以在源代码[1]中找到,但是简单地说,动作规则包包含了基于启发式的分类和动作规则发现算法,以监督的方式运行(意味着我们必须拥有/指定目标或结果标签)。我们将在一家名为 telco.csv 的电信公司的玩具客户流失数据集上运行动作规则模型。
https://github . com/hhl 60492/action rules/blob/master/notebooks/data/telco . CSV
根据 Kaggle 数据集页面[2]:
数据集包括以下信息:
- 上个月内离开的客户—这一列称为流失
- 每位客户已注册的服务—电话、多条线路、互联网、在线安全、在线备份、设备保护、技术支持以及流媒体电视和电影
- 客户账户信息——他们成为客户的时间、合同、支付方式、无纸化账单、每月费用和总费用
- 客户的人口统计信息—性别、年龄范围,以及他们是否有伴侣和家属
首先,我们使用控制台安装 actionrules 包:
pip install actionrules-lukassykora
# you can also call the following command in a Jupyter Notebook
# !pip install actionrules-lukassykora
接下来导入相关的包
import pandas as pd
from actionrules.actionRulesDiscovery import ActionRulesDiscovery
读入数据集并检查头部
dataFrame = pd.read_csv(“telco.csv”, sep=”;”)
dataFrame.head()
现在实例化动作规则模型并对数据运行模型拟合
import time actionRulesDiscovery = ActionRulesDiscovery()
actionRulesDiscovery.load_pandas(dataFrame)start = time.time()# define the stable and flexible attributes
actionRulesDiscovery.fit(stable_attributes = [“gender”, “SeniorCitizen”, “Partner”],
flexible_attributes = [“PhoneService”,
“InternetService”,
“OnlineSecurity”,
“DeviceProtection”,
“TechSupport”,
“StreamingTV”,
],
consequent = “Churn”, # outcome column
conf=60, # predefined List of confs for classification rules
supp=4, # predefined List of supports for classification rules
desired_classes = [“No”], # outcome class
is_nan=False,
is_reduction=True,
min_stable_attributes=1, # min stable attributes in antecedent
min_flexible_attributes=1 # min flexible attributes in antecedent
)end = time.time()
print(“Time: “ + str(end — start) + “s”)
在 MacBook Pro 1.4 GHz 英特尔酷睿 i5 处理器上,运行时间大约为 9 秒
接下来,我们统计发现的操作规则的数量:
print(len(actionRulesDiscovery.get_action_rules()))
结果发现了 8 条行为规则。现在让我们来看看实际的规则是什么:
for rule in actionRulesDiscovery.get_action_rules_representation():
print(rule)
print(“ “)
我们发现的一个规则的例子
r = [(Partner: no) ∧ (InternetService: fiber optic → no) ∧ (OnlineSecurity: no → no internet service) ∧ (DeviceProtection: no → no internet service) ∧ (TechSupport: no → no internet service) ] ⇒ [Churn: Yes → No] with support: 0.06772682095697856, confidence: 0.5599898610564512 and uplift: 0.05620874238092184.
我们发现了一个有趣的现象,没有互联网服务的单身(合作伙伴=否)电信客户流失的可能性约为 5.6%,支持度为 6.7%,信心为 55%。
从商业角度来看,这表明我们可能需要在短期内降低向单一客户(合作伙伴:否)积极营销附加互联网服务的力度,以减少客户流失,但我们最终需要设计一个更好的针对未来人口的营销策略,因为我们仍然希望像电信公司一样销售尽可能多的附加互联网服务。
上面有代码示例和结果的笔记本在这里:
请随意使用灵活的属性、置信度和支持最小值,因为修改这些超参数会产生不同的结果。
结论
我们看到了如何定义分类规则和动作规则、每个规则的置信度和支持值、固定属性和可变属性之间的差异,以及如何使用监督学习和 actionrules Python 包对动作规则建模的示例。
找到具有高度支持、信心和高度提升的行动规则,可以给业务涉众新的洞察力,让他们知道要采取哪些行动才能使某个结果最大化。
参考文献:
[1]s kora、Luká和 Tomákli EGR。"动作规则:Python 中的反事实解释."RuleML 挑战 2020。CEUR WS。http://ceur-ws.org/Vol-2644/paper36.pdf
https://www.kaggle.com/blastchar/telco-customer-churn
深度学习中的激活函数:从 Softmax 到 sparse max——数学证明
封闭解的稀疏最大求导及其损失函数
这篇文章有三个目的。第一部分讨论了 sparsemax 背后的动机及其与 softmax 的关系,总结了首次引入该激活函数的原始研究论文,并概述了使用 sparsemax 的优势。第二部分和第三部分致力于数学推导,具体寻找一个封闭形式的解决方案以及一个适当的损失函数。
1 .Sparsemax 概述
在论文“从 Softmax 到 Sparsemax:注意力和多标签分类的稀疏模型”中,Martins 等人通过引入 Sparsemax 提出了广为人知的 softmax 激活函数的新替代方案。
虽然 softmax 是输出 K 个概率的归一化概率分布的多类分类的合适选择,但在许多任务中,我们希望获得更稀疏的输出。Martins 等人引入了一种新的激活函数,称为 sparsemax,它输出多项式分布的稀疏概率,从而从分布的质量中滤除噪声。这意味着,sparsemax 将为某些类分配一个恰好为 0 的概率,而 softmax 将保留这些类,并为它们分配非常小的值,如 10⁻。Sparsemax 在大型分类问题中特别有用;例如,在自然语言处理(NLP)任务中,softmax 层对非常大的词汇集上的多项式分布进行建模。
然而,在实践中,将 softmax 函数变为稀疏估计器并不是一项简单的任务。获得这样的变换,同时保留 softmax 的一些基本属性(例如,评估简单、区分成本低并且容易变换为凸损失函数)证明是相当具有挑战性的。机器学习中绕过它的传统方法是使用 L1 罚函数,该罚函数允许关于输入变量和/或神经网络深层的某种程度的稀疏性。虽然这种方法相对简单,但 L1 惩罚影响神经网络的权重,而不是作为稀疏概率的目标输出。因此,Martins 等人认识到需要一个补充激活函数,即 sparsemax,他们将其公式化为一个可解的二次问题,并在一组约束下找到一个解,以获得与 softmax 相似的性质。
在深入研究 sparsemax 实现背后的证据之前,让我们首先讨论这篇论文中几个重要的高级发现。以下要点总结了一些主要要点:
- Sparsemax 是分段线性激活函数
虽然 softmax 形状相当于传统的 s 形,但 sparsemax 在一维上是“硬”s 形。此外,在二维中,sparsemax 是具有整个饱和区(0 或 1)的分段线性函数。这里有一张图可以帮助你想象 softmax 和 sparsemax。
来自“从 Softmax 到 Sparsemax:注意力和多标签分类的稀疏模型”
- Sparsemax 损失与分类 Huber 损失相关
二元情况下导出的稀疏最大损失函数与用于分类的修正 Huber 损失直接相关(定义见 Zhang,Tong。基于凸风险最小化的分类方法的统计行为和一致性。《统计年鉴》,第 56-85 页,2004 年和邹、惠、朱、纪和哈斯蒂、特雷弗。边缘向量、容许损失和基于边缘的多类分类器。斯坦福大学技术报告,2006 年)。也就是说,如果 x 和 y 是 sparsemax 之前的两个分数,使用 sparsemax 层和 sparsemax 损失,其中 t = x - y ,并且不失一般性地假设正确的标签是 1 ,我们可以表明:
这是一个很好的性质,证明了 sparsemax 的理论基础;胡伯损失是 L1 和 L2 损失之间的权衡,这正是我们试图从 softmax 激活中获得的,同时包括稀疏性。此外,这种与 Huber 损失的相似性可以通过将该损失与其他标准分类损失进行比较来证明:
来自“从 Softmax 到 Sparsemax:注意力和多标签分类的稀疏模型”
在上图中,你可以看到对于 t 的负值,即对于大误差的情况,损耗与误差成线性比例关系,类似于铰链损耗。然而,随着 t 收敛于 1,即误差减小,我们观察到平方关系,类似于最小平方损失。
- 随着类别数量的增加,Sparsemax 可以提高性能
sparsemax 框架已经被证明在具有大量标签的数据集上表现得特别好。在下面的示例中,您可以在表 1 中看到几个数据集及其详细信息,在表 2 中可以看到不同激活函数*,即* sigmoid、softmax 和 sparsemax 的微观平均/宏观平均 F1 分数。我们观察到,随着标签数量的增加(即较低的行),与 softmax 相比,sparsemax 的性能提升变得越来越明显。
表 1:数据集描述(来源)
表 2:数据集上的性能基准(ssource
- Sparsemax 可用于注意力模型,以提高潜在的性能和更好的可解释性
稀疏输出的想法也可以在具有注意力机制的深度学习模型中得到利用,这是一种在潜在的大量实体上计算注意力权重的神经网络。这种注意机制在翻译或语言建模等 NLP 任务中被证明是特别有效的,这导致了所谓的转换器、即利用自我注意的非递归模型架构的创建(更多详细信息请参见 Attention Is All You Need,Vaswani et al .,2017 ),广泛用于 BERT 等最先进的语言模型(参见BERT:Devlinet al .的《深度双向转换器的语言理解的预训练》与 softmax 相比,从 sparsemax 获得严格的零概率具有完全消除一些隐藏状态(词)的影响的优势,如果它们被判断为不相关的话,soft max 中所有不相关状态的无穷小贡献的总和最终会累积,并会影响模型性能。此外,零概率,我们放大了注意力的一个主要优势:可解释性。使用稀疏分数有助于清理注意力地图,并阐明注意力系统是如何工作的。
然而,从经验上看,该论文报告了由于自然语言推理任务中的稀疏注意力而导致的仅小的性能提高。
表 3:注意力模型在 SNLI 数据集上的性能(来自论文
现在,我们已经强调了 sparsemax 的一些优点和论文的主要发现,让我们继续进行 sparsemax 背后的两个重要推导:即,找到其封闭形式的解以及其损失函数的方程。
2.稀疏最大激活函数
Softmax 综述
Softmax 是 sigmoid 对多类分类的推广。它使用 logit 变换将所有分数z映射到概率T3]p∈[0,1]:
概念上,对于一组 K 类, softmax 是将ℝᴷ的向量映射到δᴷ的概率分布,即映射到 K -1 维概率单纯形的函数。更准确地说:
值得注意的是,只有 K-1 自由度是必要的,因为概率总和总是 1。
Softmax 被定义为完全支持,即非零值输出,数学定义为
修改这个属性以允许零输出,这将使我们能够获得稀疏概率。
Sparsemax 的定义
作者将稀疏最大激活函数公式化为二次约束优化问题:
这相当于将其定义为 z 到概率单纯形δᴷ**上的欧几里德投影。稀疏性是由在投影期间命中单纯形边界的概率高引起的,因此使得某些维度为零。
封闭解
sparsemax 的上述定义可以以其封闭形式的解决方案写成
**
𝜏代表阈值函数。我们将在第 3 节一步一步地正式推导这个方程。
类似地,𝜏也可以用它的封闭解表示为
**
下面算法 1 的伪代码总结了这组等式,可以帮助更好地理解向量 z 的 sparsemax 计算背后的步骤:
来自“从 Softmax 到 Sparsemax:注意力和多标签分类的稀疏模型”
具有挑战性的部分是确定阈值𝜏(z);我们将在第 3 节的证明中回到这一点。最后,每个类别 i 的输出概率是 z 减去阈值𝜏 (z),如果值为正,则为,如果值为负,则为 0。
稀疏最大损失函数
最后,我们还想导出对应于 sparsemax 的损失函数;这将是第 4 节的一部分。虽然闭式解的第一个证明是直接从 sparsemax 的原始定义中确定的,但损失函数是一个偏好问题,可以采取不同的形式。我们来解释一下原因。
可以看出,结合 softmax 使用交叉熵损失(即多项式分布上的负对数似然),损失函数简化为
其中 k 等于真实标签的索引。
使用交叉熵损失和 softmax 的组合所带来的优点是将梯度简化为
**
这意味着在反向传播期间,评估 softmax(z) 对于正向和反向传递都是足够的,并且不需要额外的计算。这种行为也是我们希望在 sparsemax 框架中保持的属性。
然而,根据经验,这种设置对于 sparsemax 来说是不可行的。尝试将 sparsemax 与交叉熵相结合所产生的一个问题是,该损失函数现在需要完全支持,,即仅非零值输出。但是由于损失函数取概率的对数,如果一个概率严格为零,那么它的对数就没有定义。这就是为什么交叉熵损失不能用于稀疏最大激活函数。作者建议找到一个可微分的损失函数,它将满足一个类似的梯度表达式,即
通过添加进一步的约束,即当 S(z)={k} ,即只有正确的类是非零时获得的最小 sparsemax 损失为 0,我们可以表明 sparsemax 损失函数具有以下形式
3.证明 Sparsemax 闭型解的推导
目标
该证明的目的是证明以下等价性:
换句话说,我们要解决概率 p 和分数 z 之差的平方欧氏范数的 arg min 优化问题。这可以理解为从得分向量 z. 中选择δᴷ中最近的点
关于卡鲁什-库什-塔克(KKT)条件的提醒
卡鲁什-库恩-塔克(KKT)条件是数学优化中的一个概念。在给定一组特定约束的情况下,它们表示为了满足非线性规划解的一阶必要条件。在我们的 sparsemax 设置中,我们想找到某个函数 f : ℝⁿ → ℝ在一定条件下的极小点。
然后优化问题可以写成如下:找到使函数 f 最小化的 x ,使得 g (x) 和 h (x) 上的条件得到满足,即:
为了解决这个问题,我们首先需要定义拉格朗日函数 L(x,μ,λ) :
KKT 方法(在较高层次上)声明,给定拉格朗日函数 L,如果 (x,μ ) 是 L 的鞍点,具有μ ≥0 和互补松弛度μᵢgᵢ(x)≥0·∀I∈[0,n] ,那么 x 是上述优化问题的最优向量。**
具体地说,我们简单地寻找拉格朗日函数的梯度等于零的值,即:
衍生物
鉴于 sparsemax 是一个约束优化问题,我们用早期的符号【KKT】*,即与 f , g 和 h 重写它如下:*
那么拉格朗日函数的形式就是
我们现在可以对关于 x 的拉格朗日函数进行微分:
解变成了三个方程的系统:
第一个方程(1)来自拉格朗日函数的梯度为零。第二个等式(2)来自于原始松弛条件,即 μ≥0 以及来自于 p 是正概率向量。最后,等式(3)是互补的松弛条件。
随后,我们基于等式(2)和(3)区分两种情况。对于每个维度I∈【0,n】,或者 pᵢ > 0 从而μᵢ=0或者 μᵢ > 0 从而 pᵢ=0 。更准确地说,这意味着我们考虑两种情况:支持面的元素 S(z) ,其中 p > 0,和支持面外的元素 S(z) ,其中 p=0。
当我们继续这个 sparsemax 的证明时,我们需要记住我们的目标是两件事:确定非零概率的值,以及确定概率为 0 的条件。因此:
在 1。第二。, zᵢ 要么比𝜏*大,因此 pᵢ 等于它们的正差值,要么 pᵢ 为零。因此, pᵢ=(zᵢ -* 𝜏 (z))⁺.**
此外,从等式(2)我们知道 ∑ ᵢ pᵢ=1 并且存在|S(z)|非零 pᵢ ,因此:**
这就结束了 sparsemax 闭型解推导的第一个证明。
4.证明二:Sparsemax 损失函数的推导
目标
第二个证明的目标是证明以下等价性:
换句话说,我们想要导出 sparsemax 的损失函数的梯度与 sparsemax 损失函数本身之间的等价性。
前题
在开始证明之前,我们需要定义一些重要的符号并建立两个重要的结果:
对于引理 1,我们可以直接计算𝜏关于 z 的偏导数。
实际上,如果 z ᵢ 在 S(z) 中,那么它将出现在分子和中,并且它的导数将与| S(z) |成反比;否则,导数将为空。
接下来,使用链式法则,我们可以推断出𝜏对 z 的导数:
注意,如果 j∉ S(z) ,那么𝜏 (z)=0 。
在引理 2 中,我们感兴趣的是所谓的过度自信 稀疏最大值,即当预测将 100%的权重仅分配给真实类 k 时。在这种情况下,我们有 spar semax(z,k)=δ_k 。这有两个后果,即:
衍生物
我们想要获得 sparsemax 的损失函数,使得
首先,让我们看看非矢量形式的 sparsemax 相对于 zᵢ 的偏导数:
****
我们于是可以推断,对于 K∈ ℝ :
剩下的最后一步是确定积分常数。我们可以简单地选择 K=0 ,梯度仍然是正确的,但是我们可能会有一个更合适的解决方案。这就是我们使用上面定义的第二个引理的地方。在完美预测的情况下,我们希望损失等于零,类似于 softmax 或其他损失函数,如 MAE/MSE。
更准确地说,我们需要满足以下要求:
因此:
最后,我们得出:
这就结束了关于 sparsemax 损失函数的推导的第二个证明。
5.结论
在这篇文章中,我们介绍了 sparsemax 激活函数背后的思想和数学公式,它允许比传统 softmax 更稀疏的输出域。我们首先总结了 Martins 等人论文中的一些关键发现,从经验上得出结论,随着类别数量的增加,sparsemax 可以提高分类模型的性能。此外,性能提升以及更好的解释能力在用 sparsemax 训练的 NLP 注意力模型中普遍存在。最后,文章的主要部分致力于 sparsemax 背后的两个重要证明;即导出封闭形式的解和基本的损失函数。
神经网络中的激活函数
为什么我们需要激活函数,是什么让它们如此特别
尼尔·托马斯在 Unsplash 上拍摄的照片
神经网络之所以如此特殊,是因为它们能够模拟输入和输出之间高度复杂的关系。我们无法用线性模型实现这些复杂的关系。因此,神经网络需要能够表示非线性。这就是我们在神经网络中使用激活函数的原因。如果没有激活函数,神经网络可以被认为是一个线性模型包。
激活功能增加了神经网络的学习能力。用神经网络解决的许多任务包含非线性,例如图像、文本、声波。因此,我们需要非线性来解决深度学习领域中最常见的任务,如图像和语音识别、自然语言处理等。
没有激活功能的神经元只是输入和偏置的线性组合。
没有激活功能的神经元
这只是一个神经元。神经网络中典型的隐藏层有许多神经元。然而,没有激活函数,我们有许多不同的输入线性组合。通过添加额外的隐藏层,我们得到输入的线性组合的线性组合,而不会给我们带来非线性的复杂性。然而,当我们向神经元添加激活函数时,我们就摆脱了线性的诅咒,能够模拟复杂的非线性关系。
具有激活功能的神经元
有许多不同的激活功能可用。每一个都有自己的优点和缺点以及具体的特点。我们不仅对激活函数本身感兴趣,而且对它的导数也感兴趣。原因是神经网络实际“学习”的方式。
输入乘以权重并加上偏差。然后应用激活函数得到输出。这个过程被称为正向传播。将神经网络的输出与实际目标值进行比较,并计算差值(或损失)。关于损失的信息被反馈到神经网络,并且权重被更新,从而减少损失。这个过程被称为反向传播。使用基于导数的梯度下降算法更新权重。因此,激活函数的导数也应该携带关于输入值的信息。
有许多激活功能可用。我们将涵盖神经网络中最常用的非线性激活函数。
乙状结肠
我们熟悉逻辑回归中的 sigmoid 函数。著名的 S 形函数将输入值转换为 0 到 1 之间的范围。
我们来画一下。我们首先创建一个 numpy 数组,并对其应用 sigmoid 函数。
import numpy as np
import pandas as pdx = np.linspace(-10,10,50)
y = 1 / (1 + np.exp(-x))
然后用 matplotlib 绘图。
import matplotlib.pyplot as plt
%matplotlib inlineplt.figure(figsize=(8,5))
plt.title("Sigmoid Function", fontsize=15)
plt.grid()
plt.plot(x, y)
每个神经元的输出在 0 和 1 之间标准化。上图的中间区域显示,x(输入)的微小变化会导致 y(输出)的相对较大变化。Sigmoid 函数擅长检测这些区域中的差异,这使其成为良好的分类器。因此,它通常用于二元分类任务。
不幸的是,没有什么是完美的。sigmoid 函数有一个缺点。随着我们远离中心,x 值的变化对 y 值的影响很小或没有影响,让我们来看看 sigmoid 函数的导数。我们可以使用 numpy 的梯度函数来计算导数:
x = np.linspace(-10,10,50)
dx = x[1]-x[0]
y = 1 / (1 + np.exp(-x))
dydx = np.gradient(y, dx)
然后我们在同一张图上绘制 y 和 dydx:
plt.figure(figsize=(8,5))
plt.title("Sigmoid Function and Its Derivative", fontsize=15)
plt.grid()
plt.plot(x, y)
plt.plot(x, dydx)
我们可以看到,当我们远离中心时,导数趋向于零。在评论这个图之前,让我们记住神经网络是如何学习的。神经网络的学习意味着更新权重以最小化损失(实际值和预测值之间的差异)。基于梯度更新权重,梯度基本上是函数的导数。如果梯度非常接近零,则以非常小的增量更新权重。这导致神经网络学习速度非常慢,永远无法收敛。这也被称为消失梯度问题。
双曲正切
Tanh 与 sigmoid 函数非常相似,只是它是围绕原点对称的。输出值限制在(-1,+1)的范围内。
x = np.linspace(-5,5,80)
y_tanh =2*(1 / (1 + np.exp(-2*x)))-1plt.figure(figsize=(8,5))
plt.title("Tanh Function", fontsize=15)
plt.grid()
plt.plot(x, y_tanh)
Tanh 是以零点为中心的,这样渐变就不会被限制在一个特定的方向上移动。因此,它比 sigmoid 函数收敛得更快。
tanh 的导数类似于 sigmoid 的导数,但是更陡。
从导数线可以看出,tanh 也有消失梯度的问题。
ReLU(整流线性单元)
对于大于 0 的输入,relu 函数的输出等于输入值。对于所有其他输入值,输出为 0。
x = np.linspace(-10,10,50)
y_relu = np.where(x < 0, 0, x)plt.figure(figsize=(8,5))
plt.title("ReLU Function", fontsize=15)
plt.grid()
plt.plot(x, y_relu)
Relu 使得仅激活网络中的一些神经元成为可能,这使得计算效率比 tanh 和 sigmoid 更高。所有的神经元都被 tanh 和 sigmoid 激活,这导致了密集的计算。因此,relu 比 tanh 和 sigmoid 收敛得更快。
对于大于 0 的输入值,relu 的导数为 1。对于所有其他输入值,导数为 0,这导致一些权重在反向传播期间永远不会更新。因此,神经网络不能学习负输入值。这个问题被称为将死再禄问题。使用泄漏 relu 函数的一种解决方案。
泄漏的 ReLU
除了正输入值之外,它与 relu 相同。对于负值,leaky relu 输出一个非常小的数字,而 relu 只给出 0。
Softmax
Softmax 获取实数的输入值,并将其归一化为概率分布。概率与输入值的指数成正比。考虑一下,神经网络的输出层有 10 个神经元。Softmax 函数采用这 10 个输出并创建概率分布。10 个值的概率加起来是 1。
Softmax 激活用于具有多个类别的分类任务。
唰
Swish 是一个自门控激活功能,与我们迄今为止讨论过的功能相比相对较新。这是由谷歌的研究人员发现的。在计算效率方面,它与 relu 相似,但在更深的模型上比 relu 表现得更好。正如研究人员所说,“在许多具有挑战性的数据集上,swish 往往比 relu 更好地工作”。
让我们画出 swish 的曲线图。
x = np.linspace(-5,5,50)
y_swish = x*(1 / (1 + np.exp(-x)))plt.figure(figsize=(8,5))
plt.title("Swish Function", fontsize=15)
plt.grid()
plt.plot(x, y_swish)
Swish 在 0 处没有锐边,不像 relu 在训练时更容易收敛。
我们已经讨论了 6 种不同的激活函数。它们在某些方面都各有利弊。激活函数对计算复杂性和模型的收敛性有影响。因此,更好地理解它们是如何表现的,以便我们可以根据任务选择最佳的激活函数。通常,激活函数的期望属性是:
- 计算成本低
- 零居中
- 可微的。激活函数的导数需要携带关于输入值的信息,因为权重是基于梯度更新的。
- 不会导致消失梯度问题
感谢您的阅读。如果您有任何反馈,请告诉我。
激活、卷积和池化—第 4 部分
FAU 讲座笔记深度学习
联营机制
FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座
以上是 FAU 的 YouTube 讲座 深度学习的 讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。如果你发现了错误,请告诉我们!
航行
欢迎回到深度学习!所以今天,我想和你谈谈实际的池实现。池层是许多深层网络中的一个重要步骤。这背后的主要思想是你想减少空间域的维数。
汇集通过归约技术减少了空间信息。 CC 下的图片来自深度学习讲座的 4.0 。
在这个小例子中,我们将绿色矩形、蓝色矩形、黄色矩形和红色矩形中的信息汇总为一个值。因此,我们有一个必须映射到单个值的 2x2 输入。这当然减少了参数的数量。它引入了层次结构,并允许您使用空间抽象。此外,它减少了计算成本和过拟合。当然,我们需要一些基本的假设,其中一个假设是特征是分层结构的。通过池化,我们减少了输出大小,并引入了信号中固有的层次结构。我们讨论过眼睛是由边缘、线条和脸组成的,就像眼睛和嘴一样。这必须存在,以使联营成为一个明智的操作,包括在您的网络中。
最大汇集选择感受野中的最大指数。 CC 下的图片来自深度学习讲座的 4.0 。
在这里,您可以看到一个 3x3 层的池,我们选择最大池。因此,在最大池中,只有最大数量的受体场才会真正传播到输出中。显然,我们也可以大踏步地工作。通常,步幅等于邻域大小,这样我们每个感受野得到一个输出。
最大汇集仅考虑每个感受野中的最大值。ABBA 的粉丝请点击这里。来自深度学习讲座的 4.0CC 下的图片。
这里的问题当然是最大值运算增加了额外的非线性,因此我们还必须考虑如何解决梯度过程中的这一步。本质上,我们再次使用次梯度概念,其中我们简单地传播到产生最大输出的单元中。所以,你可以说赢家通吃。
平均池是最大池的常见替代方法。 CC 下的图片来自深度学习讲座的 4.0 。
另一种选择是平均分摊。这里,我们简单地计算邻域的平均值。但是,它的性能并不总是优于最大池。在反向传播过程中,误差被简单地平均分配并反向传播到相应的单元。
许多其他的池选择是可用的。 CC 下的图片来自深度学习讲座的 4.0 。
还有许多池策略,如部分最大池,Lp 池,随机池,特殊金字塔池,广义池,等等。对此有一套完全不同的策略。我们已经讨论过的两种选择是步长卷积和 atrous 卷积。这变得非常流行,因为这样你就不必把最大池编码作为一个额外的步骤,并且减少了参数的数量。通常,人们现在使用 S 大于 1 的步进卷积,以便同时实现卷积和池化。
深层网络的典型设计选择。来自深度学习讲座的 CC BY 4.0 下的图片。
让我们回顾一下我们的卷积神经网络正在做什么。我们讨论了卷积产生的特征图和汇集减少各自特征图的大小。然后,再次回旋和汇集,直到我们在一个抽象的表现结束。最后,我们有这些完全连接的层,以便进行分类。实际上,我们可以取消最后一个模块,因为我们已经看到,如果我们将其重新格式化为通道方向,那么我们可以将其替换为 1x1 卷积。随后,我们只是应用这个来得到我们的最终分类。因此,我们可以进一步减少构建模块的数量。我们甚至不再需要完全连接的层了!
1x1 回旋能够代替完全连接的层。 CC 下的图片来自深度学习讲座的 4.0 。
现在,一切都变得完全卷积,我们可以通过卷积和合并步骤来表达整个操作链。所以,我们甚至不再需要完全连接的层了。使用 1x1 卷积的好处是,如果您将它与所谓的全局平均池结合起来,那么您基本上也可以处理任意大小的输入图像。这里的想法是,在卷积处理结束时,只需映射到信道方向,然后计算所有输入的全局平均值。这是可行的,因为您有一个预定义的全局池操作。然后,您可以将其应用于任意大小的图像。因此,我们再次受益于汇集和卷积的思想。
为了更深入,我们将很快研究进一步的想法。 CC 下的图片来自深度学习讲座的 4.0 。
一个有趣的概念是初始模型,我们将在这堂课的后面更详细地讨论它。这种方法来自于论文“用回旋走得更深”[8]遵循我们自己的座右铭:“我们需要走得更深!”。该网络赢得了 2014 年 ImageNet 挑战赛。一个例子是 GoogLeNet,它是受参考文献[4]启发的化身。
初始模块允许网络自己学习卷积和汇集的顺序。来自深度学习讲座的 CC BY 4.0 下的图片。
他们提出的想法解决了必须交替固定卷积和合并步骤的问题。为什么不允许网络在它想汇集和想卷积时自己学习呢?所以,主要的想法是,你把并行 1x1 卷积,3x3 卷积,5x5 卷积,和最大池。然后,你把它们连接起来。现在,有趣的是,如果你并行提供所有四个操作,这基本上意味着下一层可以选择最信任的输入,以构建深度网络。如果这样做,您可以进一步扩展,例如在 3x3 和 5x5 卷积中。您可能希望在实际评估通道之前先对其进行压缩。然后,您会在右侧找到配置。这结合了额外的维度减少。尽管如此,这种并行处理允许网络学习自己的池化和卷积层序列。
完整的 GoogLeNet 架构将很快被更详细地描述。 CC 下的图片来自深度学习讲座的 4.0 。
然后,你得到像这样的模型。这已经是一个相当深入的模型,其中包含许多有趣的进一步创新,我们将在讨论不同的网络架构时讨论这些创新。
在这个深度学习讲座中,更多令人兴奋的事情即将到来。来自深度学习讲座的 CC BY 4.0 下的图片。
所以下一次在深度学习中,我们想谈谈如何防止网络只是记忆训练数据。有没有办法强制特征独立?如何确保我们的网络也能识别不同姿势的猫?此外,一个非常好的方法可以帮助你,以及我们如何修复内部协变量移位问题。这些都是重要的观点,我认为答案确实值得在这里提出。
综合问题可以帮助学生准备考试。 CC 下的图片来自深度学习讲座的 4.0 。
此外,我有几个综合性的问题或任务。说出五种激活功能。讨论这五种激活功能。零点对中问题是什么?写下步长卷积的数学描述。1x1 卷积和全连接层有什么联系?什么是池层?为什么我们需要这些池层?所以,在某个特定的时间点,有人会问你很多有趣的事情。如果你有任何问题,你可以在评论中发表或通过电子邮件发送。所以,我希望你喜欢这个讲座,我们下次再见!
如果你喜欢这篇文章,你可以在这里找到更多的文章,或者看看我们的讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激你在 YouTube、Twitter、脸书、LinkedIn 上的鼓掌或关注。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。
参考
[1] I. J. Goodfellow、d . ward-Farley、M. Mirza 等人,“最大网络”。载于:ArXiv 电子版(2013 年 2 月)。arXiv:1302.4389[统计 ML】。
[2],,,,任等,“深入挖掘整流器:在 ImageNet 分类上超越人类水平的表现”。载于:CoRR abs/1502.01852 (2015)。arXiv: 1502.01852。
[3]君特·克兰鲍尔(Günter Klambauer),托马斯·安特辛纳(Thomas Unterthiner),安德烈亚斯·迈尔(Andreas Mayr),等,“自归一化神经网络”。在:神经信息处理系统的进展。abs/1706.02515 卷。2017.arXiv: 1706.02515。
【四】、和水城颜。“网络中的网络”。载于:CoRR abs/1312.4400 (2013 年)。arXiv: 1312.4400。
[5]安德鲁·马斯、奥尼·汉南和安德鲁·吴。“整流器非线性改善神经网络声学模型”。在:过程中。ICML。第 30 卷。1.2013.
[6] Prajit Ramachandran,Barret Zoph,和 Quoc V. Le。“搜索激活功能”。载于:CoRR abs/1710.05941 (2017 年)。arXiv: 1710.05941。
【7】Stefan elf wing,内池英治,多亚贤治。“强化学习中神经网络函数逼近的 Sigmoid 加权线性单元”。载于:arXiv 预印本 arXiv:1702.03118 (2017)。
[8]克里斯蒂安·塞格迪、、·贾等,“用回旋深化”。载于:CoRR abs/1409.4842 (2014 年)。arXiv: 1409.4842。
主动和半监督机器学习:8 月 17-28 日
主动学习时事通讯
关于主动(偶尔半监督或弱监督)深度学习的最新 arXiv 预印本精选
这是我新的主动学习时事通讯的创刊号(每周或每两周出版一期,取决于前一周相关预印本的数量)。我过去也做过类似的事情:去年秋天出现在 Scaleway 博客上的 arXiv 系列的 。这是迫使自己跟上深度学习领域新东西的一种很好的方式,但是,由于这个领域如此活跃,最终变得太耗时了。尽管我最喜欢的科幻作家曾经说过
专业化是为了昆虫,
不是每个人都能达到罗伯特·A·海因莱因的高标准。阅读 arXiv 当然是专业化派上用场的地方。巧合的是,在过去的几个月里,我选择关注主动学习,因为这是一个非常有实际意义的领域,因为计算越来越便宜,但数据标记仍然很昂贵。要了解主动学习领域最前沿的研究,请继续阅读!
我们列表中的第一个是使用深度神经网络进行文本分类的主动学习调查:
[## 基于深度神经网络的文本分类主动学习综述
自然语言处理(NLP)和神经网络(NNs)在最近几年都经历了重大变化…
arxiv.org](https://arxiv.org/abs/2008.07267)
它首先概述了主动学习背后的基本思想、进行主动学习的不同方式(例如,基于池的与基于流的等)、使用的常用术语,然后列出了几个不同类别的查询策略(即,模型用来决定接下来要标记哪些训练样本的逻辑选择)。通过大量的参考资料,预印本为那些有兴趣将人工智能应用于 NLP 的人提供了一个很好的起点。
如今新冠肺炎无处不在,arXiv 也不例外。使用 X 射线胸部图像校正半监督新冠肺炎检测的数据不平衡查看(这并不奇怪)在不平衡的一组(一些)新冠肺炎图像与(大量)非 Covid 图像上进行的半监督学习。不平衡的数据集和极其昂贵的注释是医学数据的两个标志,因此将这两者放在一起看是有意义的。
[## 使用 X 射线胸部图像校正半监督新冠肺炎检测的数据不平衡
冠状病毒(新冠肺炎)是一种国际流行病,它已经在全世界迅速传播。的…
arxiv.org](https://arxiv.org/abs/2008.08496)
该模型本身是谷歌的 MixMatch 的变体:半监督学习的整体方法 ,可以追溯到 2019 年——很像问题中的病毒。
在一个相关的医学笔记中,我们已经将逐渐应用于乳腺超声图像中的质量检测的弱监督和主动学习:
[## 逐步将弱监督和主动学习应用于乳腺超声中的肿块检测…
我们提出了一种方法,有效地利用弱注释图像数据的目标检测任务的乳房…
arxiv.org](https://arxiv.org/abs/2008.08416)
这里我们有作者所说的(a)强注释数据,其中注释是双重的:围绕肿块+良性与恶性分类标签的边界框,以及(b)弱注释数据,其仅带有图像级标签。在强注释数据上训练的模型然后被用于以熟悉的主动学习方式迭代地向用户查询一批周注释图像的边界框。
通过按委员会查询的主动学习的一个相当普通的应用,以及另一个涉及蒙特卡罗批量标准化的查询策略。不过这个问题很有趣:空中或卫星图像中的变化检测。我从来没有认真考虑过地图是如何保持更新的,但我的想法是,一般来说,地图是随着增量更新而更新的,而不是不断地从头开始重新创建。接下来的任务是检测变化。问题是,手动查找这些(通常是罕见的、稀疏分布的)变更需要检查整个映射区域🗺。祝你好运标签那套训练套装!幸运的是,主动学习有助于:
[## 遥感中用于数据有效变化检测的深度主动学习
我们在深度神经网络模型的背景下研究主动学习,用于变化检测和地图更新…
arxiv.org](https://arxiv.org/abs/2008.11201)
在学习以半监督的方式学习中,作者解决了基于图像的项目验证问题(例如人脸识别——或者任何你旨在学习特征嵌入的任务,这种特征嵌入会将相同类型的实例聚集在一起,而将其他实例远离)。现在这里有一个转折:在它们的有标签和无标签数据集中的对象类的集合是不相交的。也就是说,模型被要求找出关于看不见的类别的数据的东西(因为缺乏更好的术语)——在某种程度上,保留那些类别的结构。很酷,不是吗?
[## 学会以半监督的方式学习
为了解决来自标记和未标记数据的半监督学习,我们提出了一种新的元学习方案。我们…
arxiv.org](https://arxiv.org/abs/2008.11203)
下一个引起我注意的预印本专注于增量学习:一种机器学习方法,其中模型不断用新数据更新,同时还负责保留先前学习信息的知识。在广泛的应用中,这无疑是一个现实的场景。为了更加现实,假设只有一部分新的流数据被注释(因此需要主动学习),我们也不要对类分布做任何假设。所以我们得到了增量主动不平衡…我们应该叫它什么?
[## 不平衡数据集的主动类增量学习
增量学习(IL)允许人工智能系统适应流式数据。大多数现有算法使两个强…
arxiv.org](https://arxiv.org/abs/2008.10968)
是的,听起来没错。
最后,在非 arXiv,但仍然非常活跃的学习中,新闻:上周我做了一个 20 分钟的演讲,题为“为什么一些数据比其他数据更平等”,作为开放数据科学大会热身的一部分。该讲座现已在他们的网站上以免费点播网上研讨会的形式发布:
[## 点播网络研讨会:ODSC 欧洲 2020 虚拟训练营热身
Beehive Media 创始人比尔·山德“从数字到叙事:将原始数据转化为引人注目的视觉故事…
aiplus.odsc.com](https://aiplus.odsc.com/courses/odsc-europe-2020-virtual-bootcamp-warm-up)
我的部分大约在 23:00 开始。看看吧,一两周后见:)
页(page 的缩写)如果你是主动学习的新手,这里有几篇我以前的文章可以帮你入门:
主动学习仍然是机器学习中的一种利基方法,但这种情况必将改变。
medium.com](https://medium.com/scaleway-cloud/active-learning-part-1-the-theory-239b7a43ddb5) [## PyTorch 的主动学习
通过这个循序渐进的影像分类教程,了解如何节省高达 50%的数据标注成本
medium.com](https://medium.com/scaleway-cloud/active-learning-with-pytorch-dc6805956b0f)
主动和半监督机器学习:8 月 31 日至 9 月 11 日
主动学习时事通讯
关于主动(偶尔半监督或弱监督)深度学习的最新 arXiv 预印本精选
前一期:
关于主动(偶尔半监督或弱监督)深度学习的最新 arXiv 预印本精选
towardsdatascience.com](/active-and-semi-supervised-machine-learning-aug-17-28-77eaa9dbc311)
过去几周,活跃和半监督的机器学习社区出现了大量行动。以下是一些个人最喜欢的,而不是详尽的列表,分为两部分: 主动学习 和 半监督学习 g
这些钻井石油立管和机器学习有什么关系?请继续阅读,寻找答案!图片来源:wikipedia.org
主动学习
主动学习仍然是机器学习中的一种利基方法,但这种情况必将改变。
medium.com](https://medium.com/scaleway-cloud/active-learning-part-1-the-theory-239b7a43ddb5)
如今,可解释的人工智能是一件大事。在 ALEX:基于主动学习的模型可解释性增强中,作者使用了一种新颖的查询策略:对“难以解释”的实例进行优先排序。(他们使用SHAP 框架来确定后者。)他们的目标是找到一个在性能和模型可解释性两方面都得到优化的分类器,至少在 MNIST 上,作者在这两方面都取得了成功:
[## ALEX:基于主动学习的模型可解释性增强
一种主动学习(AL)算法试图用最少的标记样本构建一个有效的分类器
arxiv.org](https://arxiv.org/abs/2009.00859)
现在,这绝不是一种批评,但与我看到的大多数关于机器学习主题的预印本不同,这篇论文是以完全学术的风格撰写的。有点像回到我还是物理学家的时候,那时一切可能已经变成了数学陈述,就是。举个小例子来说明我的意思:
“此参数近似中的误差 θ (真实函数相关性θ)预计会随着训练集中对数 M 的增加而变小,即 θ → θ as M → ∞。”
或者换句话说:训练样本越多,模型概括得越好。无论如何,我只是觉得有趣的是,当我第一次开始阅读 ML 论文而不是物理论文时,我认为它们缺乏严谨性曾经让我沮丧,而现在我更可能注意到相反的情况。人是怎么变的!
让我们说,一个主动学习系统不是简单地要求你标记它选择的数据,而是要求你验证或纠正模型的预测。作为一个主观的人,你更相信哪个人工智能,是你没有发言权的人工智能,还是在训练过程中得到你反馈的人工智能?根据中介绍的研究,为交互式机器学习征求人在回路中的用户反馈会降低用户信任和对模型准确性的印象(我想标题已经给出了答案),典型的人在回路中对模型的性能不太信任,不管他们的反馈是否提高了模型的性能。
[## 为交互式机器学习征求人在回路中的用户反馈会降低用户的信任度…
混合主动性系统允许用户交互地提供反馈,以潜在地提高系统性能。人类…
arxiv.org](https://arxiv.org/abs/2008.12735)
仔细想想,这是有道理的:能够纠正模型预测的人(尤其是那些信心分数低的人)看到了模型最糟糕的一面,因此失去了信心。
在高光谱成像中,需要大量训练数据的问题甚至更加尖锐。简而言之,输入的维度越高,模型越大,就需要越多的数据来训练它。在用于高光谱图像分类的主动深度密集连接卷积网络中提出了一种有趣的主动学习方法:
[## 用于高光谱图像分类的主动深度密集连接卷积网络
过去,基于深度学习的方法在高光谱图像分类中的受欢迎程度大幅上升…
arxiv.org](https://arxiv.org/abs/2009.00320)
这里的查询策略是基于预测损失值的。
终身学习,或者说持续学习,不仅仅是我们所有人都应该以某种形式做的事情,也是人工智能的子领域。这种想法是,生产中的模型可能需要通过对新数据进行微调来保持最新——随着后者变得可用,不断地进行微调。然而,从一开始就积累所有的训练数据并在整个集合上不断地重新训练并不是最实际的做法。挑战在于适应新的现实(现实=数据),同时不忘记以前学到的东西。如果你习惯于标准的模型训练协议,你可能会明白为什么这会带来一个问题:一旦你在一个新的数据集上重新训练你的网络,它对旧数据集的记忆和金鱼的记忆一样有价值。在最近的预印本中回顾了一些对抗所谓“灾难性遗忘”的技术,这是一个深度神经网络持续学习的整体观:被遗忘的课程和通往主动开放世界学习的桥梁:
[## 深度神经网络持续学习的整体观:遗忘的课程和桥梁…
目前的深度学习研究以基准评测为主。一种方法被认为是有利的,如果它…
arxiv.org](https://arxiv.org/abs/2009.01797)
作者认为,虽然主动学习可以被视为旨在实现持续学习的反向操作(选择数据以供未来包含,而不是在面对新数据时保留已学习的表示),但这两个领域之间仍有桥梁需要搭建。
这里有一个好玩的,通过基于池的主动学习自动选择模拟案例加速工程设计:
[## 通过基于池的模拟案例自动选择加速工程设计…
许多工程设计问题的通用工作流程需要对设计系统的评估进行调查…
arxiv.org](https://arxiv.org/abs/2009.01420)
显然,号近海石油立管的设计过程包括运行大量的海流和海浪模拟。引用预印本作者的话,
许多这些组合可能是多余的,因为许多这些模拟的隔水管中的机械张力可以从其他模拟的结果中估算出来。…这里的挑战在于找到信息最丰富的案例。
自然地,这使得石油立管设计成为主动学习的绝佳选择!与计算机视觉和 NLP 中更熟悉的应用不同,这里未标记的数据对应于尚未运行的模拟池,而标记训练实例相当于运行模拟(如果可能,工程师希望避免这种昂贵的操作)。
我第一次在报纸上看到这样的数字。图片来源:【arxiv.org
其他一些荣誉奖颁发给:
- *深度主动学习的调查,*30 页的领域概述,一些问题,应用和开放问题,近 200 个参考资料可供深入研究:
[## 深度主动学习综述
主动学习(AL)试图通过标记最少的样本来最大化模型的性能增益。深…
arxiv.org](https://arxiv.org/abs/2009.00236)
- 主动学习在工程中的另一个应用,这次是在超材料的设计中:
[## 偏微分方程深度代理的主动学习:在超曲面设计中的应用
偏微分方程的代理模型广泛用于超材料的设计,以快速评估…
arxiv.org](https://arxiv.org/abs/2008.12649)
- 一种有趣的新的主动学习方法,作者称之为主动学习++ ,它不仅向标注器查询样本的标签,还查询输入特征的重要性排序(根据标注器)。所涉及的模型是逻辑回归(适合手头的结构化数据集),但我必须承认,我发现作为例子的任务有点畏缩。这个人的收入是根据他们的教育和工作经历,以及种族和性别来预测的。注释者应该如何对这样的特性进行排序呢?“我认为这个人每年挣 N 美元的主要原因是他们是 XX 种族和 YY 性别”?无论如何,注释者提供标签之外的信息的想法很有趣,所以值得一提的是:
[## 主动学习++:使用本地模型解释合并注释者的基本原理
我们提出了一个新的主动学习框架——主动学习++,它既可以利用标注者的标注,也可以利用学习者的兴趣
arxiv.org](https://arxiv.org/abs/2009.04568)
- 另一个争议较小的问题是,这是一个基于池的不确定性采样在天文调查中的应用:
[## 用于在大型光谱勘测中发现感兴趣对象的主动深度学习方法
目前 LAMOST 望远镜的档案包含数百万个管道处理的光谱,这些光谱可能从未被…
arxiv.org](https://arxiv.org/abs/2009.03219)
半监督学习
关于猫和狗的 PyTorch 故事
medium.com](https://medium.com/scaleway-cloud/semi-supervised-learning-with-gans-a-tale-of-cats-and-dogs-3c90acfe91c9)
数据注释花费巨大的领域之一是医学。我们列表中的下一个预印本关注使用未标记数据和知识蒸馏对糖尿病视网膜病变的分类。
[## 使用未标记数据和知识蒸馏对糖尿病视网膜病变进行分类
知识提炼允许将知识从预先训练的模型转移到另一个模型。然而,它的缺点是…
arxiv.org](https://arxiv.org/abs/2009.00982)
糖尿病视网膜病变是一种由糖尿病引起的眼睛疾病,但论文中的思想很容易应用于任何图像分类问题。知识提炼是一种方法,包括将知识从一个模型(老师)转移到另一个模型(学生,通常是一个较小的网络)。以定期监督的方式训练教师,然后将软标签(教师对训练集的输出)用作训练学生的标签。预印本的主旨是,除了已标记的集合,你还可以在提取过程中使用老师对未标记图像的软标签,最终得到一个更好的模型。
在你离开之前,这里有两份关于半监督深度学习在医学领域应用的预印本:
[## 基于双任务一致性的半监督医学图像分割
基于深度学习的半监督学习(SSL)算法已经在医学图像方面取得了令人鼓舞的结果…
arxiv.org](https://arxiv.org/abs/2009.04448) [## 具有不纠缠表示的半监督病理分割
自动病理分割在临床实践中仍然是一种有价值的诊断工具。然而,收集训练…
arxiv.org](https://arxiv.org/abs/2009.02564)
一周(或两周)后见!
主动和半监督机器学习:10 月 12 日至 23 日
主动学习简讯
关于主动(偶尔半监督或弱监督)深度学习的最新 arXiv 预印本精选
前一期:
[## 主动和半监督机器学习:9 月 28 日至 10 月 9 日
关于主动(偶尔半监督或弱监督)深度学习的最新 arXiv 预印本精选
towardsdatascience.com](/active-and-semi-supervised-machine-learning-sep-28-oct-9-50813688c616)
我想提到的第一个资源实际上是大约一个月前发表在 TDS 上的另一篇博文:
半监督学习(SSL)已经在深度学习研究社区中蓬勃发展——我们分享从学习中获得的经验…
towardsdatascience.com](/from-research-to-production-with-deep-semi-supervised-learning-7caaedc39093)
尽管我很喜欢一份最新的预印本,里面有一些前沿的研究成果,但没有什么能打败那些将上述研究应用于现实世界问题的人的反馈。博客文章 Uizard 背后的团队讨论了几个实用的要点,主要是在对象检测的背景下,但我发现最有趣的是下面这个:
伪标签是由在标记的(和/或先前伪标记的)训练样本上训练的模型对未标记的数据做出的高置信度预测。伪标记(也称为自我训练)可用于自动化大部分数据注释过程,从而大幅降低相关的标记成本。然而,它容易出错:特别是,模型在早期发现的任何偏差,很可能只会在以后被放大。解决这个问题的方法之一是人工验证伪标签。通常情况下,验证比从头开始贴标签更省时,因此采用这种方法仍然有很大的附加值。在博文中,作者描述了 Uizard 发现的另一个有效的解决方案,特别是对于对象检测任务。这个解决方案就是启发式伪标签精化。他们的博文示例处理公寓图像中某些家具的检测。在这里,可以用来自动提炼伪标签的试探法可以沿着这样的路线进行:梳妆台和厨房岛看起来有些相似,但是床和梳妆台比床和厨房岛更有可能出现在同一图像中。因此,如果你发现一张床和一个厨房岛,那个“岛”很可能是一个梳妆台。简单吧?人们可以想象在现实生活的用例中有许多这样的启发式方法,所以这种策略听起来绝对值得记住。
主动学习通常与半监督学习分开考虑,但本质上,前者可以被视为后者的一个亚型。我已经在之前的一篇博文中讨论了主动学习背后的理论:
主动学习仍然是机器学习中的一种利基方法,但这种情况必将改变。
medium.com](https://medium.com/scaleway-cloud/active-learning-part-1-the-theory-239b7a43ddb5)
基本思想是在标记数据上训练监督模型,然后在非监督集合上使用训练模型的预测来区分下一个要标记的实例的优先级。然而,根据少量标记数据训练的模型显然不会提供最佳性能。现在,如果我们执行半监督训练,而不是在主动学习循环中进行监督训练,会怎么样?一种嵌套的半监督方法,利用未标记的数据进行训练和人在回路中的标记池。这种想法的一个变体被证明非常有效,如:
[## 基于双层优化的半监督批量主动学习
主动学习是一种通过提高数据效率来降低标注成本的有效技术。在这项工作中,我们…
arxiv.org](https://arxiv.org/abs/2010.09654)
当我们在主动学习的主题上时,这里有一个可以在自然语言处理(NLP)问题中使用的新的查询策略:一个给定的短语如何令人惊讶?
是的,真的。(图片鸣谢:约翰·怀特)
为了量化这个问题的答案,的作者通过自我监督语言建模使用 BERT 冷启动主动学习。也就是说,他们用它来计算他们所谓的惊奇嵌入。为了让你对结果有一个概念,考虑预印本中的这个例子:短语“他们对天主教迷幻合成民谣音乐感到矛盾”被认为比“这是我最喜欢的电视节目”更令人惊讶。(这一点我无法反驳。)该属性成为查询策略的一部分,用于区分以下数据注释的优先级:
[## 通过自我监督语言建模进行冷启动主动学习
主动学习通过选择最关键的例子来标注,努力降低标注成本。通常情况下……
arxiv.org](https://arxiv.org/abs/2010.09535)
在计算机视觉领域,主动学习方法通常在图像分类或对象检测方面进行评估(也就是说,我们的目标是分配图像级别的类别标签,或者在对象周围绘制边界框并识别它们)。然而,另一个常见的计算机视觉任务,语义分割,在像素级分配类别标签,通常标注数据的成本要高得多。这当然使它成为主动学习的特别理想的候选对象!
每个像素都有语义标签的图像示例。图片来源:英伟达
除了标准的查询策略(例如不确定性采样的变化等),我们可以定义一个特定于分段问题的度量,就像上面讨论的预印本中特定于 NLP 的“这个短语有多令人惊讶”一样。在这里,这个新的度量将成为创建分割蒙版的难点:例如,选择小的行人图形可能会比上图中选择大的矩形建筑或公共汽车更困难。将这一困难纳入主动学习过程的讨论见:
[## DEAL:面向语义分割的难度感知主动学习
主动学习旨在通过寻找最有信息的样本来解决标记数据的缺乏。然而,当…
arxiv.org](https://arxiv.org/abs/2010.08705)
这是我在过去两周从机器学习阅读中得到的另一个收获:要有创造力。在生活中,在工作中,更具体地说,创造性地使用你的主动学习的提问策略。
关于这一点,11 月见!
主动和半监督机器学习:9 月 14 日至 25 日
主动学习时事通讯
关于主动(偶尔半监督或弱监督)深度学习的最新 arXiv 预印本精选
前一期:
[## 主动和半监督机器学习:8 月 31 日至 9 月 11 日
关于主动(偶尔半监督或弱监督)深度学习的最新 arXiv 预印本精选
towardsdatascience.com](/active-and-semi-supervised-machine-learning-aug-31-sep-11-f985d593bd99)
我必须承认,我最近才接触到基于图形的机器学习,但它在半监督环境中的应用听起来很有趣。基本思想是数据(标记的和未标记的)由图中的节点表示,数据点之间的关系对应于图的边。在这篇来自 Google AI 的博文中,考虑了给单词分配情感标签的任务。首先,单词通过它们的嵌入来表示,然后基于不同嵌入向量之间的相似性来绘制边缘。这是半监督学习,一些节点被标记,但大多数没有。然后,标签(例如,“有趣”、“悲伤”等)在整个图表中传播,大致如下所示:
这是基本的想法,现在让我们回到过去两周 arXiv 的内容。基于图的半监督学习+卷积网络,生活(至少是机器学习工程师的生活)会变得更好吗?嗯,有可能!进入对比学习:
对比学习是一类自我监督的方法,它训练编码器在描述感兴趣的统计相关性的表示和不描述感兴趣的统计相关性的表示之间进行对比。
当涉及到监督任务(例如分类)时,普通的对比学习本身并不能帮助你。幸运的是,基于图的半监督学习的对比和生成图卷积网络的作者通过将关于可用标签的信息合并到损失函数中找到了一种解决方法:
[## 基于图的半监督学习的对比生成图卷积网络
基于图的半监督学习(SSL)旨在将少量已标记数据的标签转移到剩余的标签中
arxiv.org](https://arxiv.org/abs/2009.07111)
很好理解,最终,你的模型只能和你的数据一样好。除此之外,这意味着无论数据中存在什么样的偏差,它们都会成为模型的一部分。因此,如果你考虑我们的历史,难怪公平不仅是道德基础理论的六大支柱之一,也是人工智能领域活跃研究的主题。确定一个系统的公平性的指标往往是相当特别的,但通常相当于确定结果不应该依赖的某些特征,并确保情况确实如此。你知道,就像种族和性别对比一个人是否会被叫去参加工作面试之类的事情。无论如何,在有人监督和无人监督的情况下,这个主题的处理方式存在一定的差异,所以我很高兴看到半有人监督的社区也在研究这个问题:
[## 半监督学习中的公平性约束
机器学习中的公平性受到了相当大的关注。然而,大多数关于公平学习的研究都集中在…
arxiv.org](https://arxiv.org/abs/2009.06190)
许多不同的半监督学习方法的共同点是聚类的思想。您获取数据,将其分组,然后根据被注释的数据点分配标签。这个过程中有一个假设是我们在机器学习中经常想当然的:那就是拥有数据点。也就是说,独立的数据实例,而不是用一个更好的词来形容,数据块。但是,如果您处理的是顺序数据,该怎么办呢?例如,您的智能设备不断收集的关于您和您的环境的数据类型:例如,您的睡眠跟踪器。为了对这类数据执行聚类,首先需要将序列分解成片段。分割和标记都是昂贵的任务,因此显然需要适合处理序列数据的半监督方法。在通过变化点检测的半监督序列分类中,作者应用“变化点检测方法……识别序列中对应于可能类别变化的点”:
[## 基于变点检测的半监督序列分类
在各种各样的实际应用中产生顺序传感器数据。一个根本性的挑战包括…
arxiv.org](https://arxiv.org/abs/2009.11829)
以半监督方式训练的机器学习模型的性能通常很大程度上取决于已经被注释的训练样本的选择。然而,这些注释的质量同样重要:事实上,我们拥有的标记样本越少,它就越重要。在现实世界中,注释很难做到 100%准确,为了达到最终模型的最佳性能,必须处理这个问题。的作者用直推式半监督留一滤波器识别噪声标签提出了一种去除被认为可能不正确的标签的方法:
[## 用直推式半监督留一滤波器识别噪声标签
获取带有有意义标签的数据通常成本高昂且容易出错。在这种情况下,半监督学习…
arxiv.org](https://arxiv.org/abs/2009.11811)
在下一份预印本中,
[## 神经网络模型主动学习的模型中心和数据中心方面
我们用神经网络模型研究主动学习的以数据为中心和以模型为中心的不同方面。我)我们…
arxiv.org](https://arxiv.org/abs/2009.10835)
作者考虑了两种基于池的主动学习的训练方法:增量和累积。对于主动学习循环的每次迭代,增量训练对应于仅在新添加的标签上微调模型,而累积训练意味着我们从头开始在所有当前可用的标签上重新训练模型。在我自己的实现中,我实际上使用了两者之间的东西:微调模型而不是重新训练,但是是在整个更新的标签集上。我发现这个工作得相当好:
通过这个循序渐进的影像分类教程,了解如何节省高达 50%的数据标注成本
medium.com](https://medium.com/scaleway-cloud/active-learning-with-pytorch-dc6805956b0f)
但是,回到预印本!作者采用 MNIST 和时尚-MNIST 数据集,开始一次标记 120 张图像,并比较通过增量和累积训练方法获得的模型在三种查询策略下的性能:随机(本质上不是一种策略)、余量和熵不确定性采样。顺便说一句,如果你想知道后两者是什么,我可以让你感兴趣:
主动学习仍然是机器学习中的一种利基方法,但这种情况必将改变。
medium.com](https://medium.com/scaleway-cloud/active-learning-part-1-the-theory-239b7a43ddb5)
说到数据注释,我们通常是在标签之后。然而,注释者选择背后的推理可以提供对任务本质的有价值的洞察。这种信息不容易包含在机器学习过程中,这使得下面的工作更加有趣:
[## 爱丽丝:对比自然语言解释的主动学习
训练受监督的神经网络分类器通常需要许多带注释的训练样本。收集和…
arxiv.org](https://arxiv.org/abs/2009.10259)
爱丽丝到底是怎么运作的?假设你在为一个鸟类分类问题做主动学习。该模型将首先挑选出那些图像,对于这些图像,它很难在两个类别之间做出决定。(有点像边际抽样,只是在论文中,他们考虑的是特征空间中训练实例之间的距离,而不是模型预测的类别概率。)然后,它将要求注释者不仅标记图像,还要说明她如何区分这两个类:
这些信息将被解析成机器友好的形式,并用于提高模型的性能。
这是这两周对我来说最突出的预印本。你呢,这些引起你的注意了吗?我错过了什么吗?
十月中旬见!
主动和半监督机器学习:9 月 28 日至 10 月 9 日
主动学习时事通讯
关于主动(偶尔半监督或弱监督)深度学习的最新 arXiv 预印本精选
前一期:
关于主动(偶尔半监督或弱监督)深度学习的最新 arXiv 预印本精选
towardsdatascience.com](/active-and-semi-supervised-machine-learning-sep-14-25-93f19ff60fb1)
上周末是我过得特别无聊的一个周末:周六去了趟天文馆,然后疯狂观看了斯坦福 CS224W 课程讲座(T7)——强烈推荐,顺便说一句,你会获得疯狂观看的所有满足感,而没有任何负罪感。[完全披露:我坚信只要分心让你开心,就不要因为没有在你的待办事项清单上留下痕迹而责备自己。那只是很好的工作/生活平衡!请在评论中留下你对网飞的建议。]
说到用图表进行机器学习,我有另外几份关于这个主题的预印本给你:
[## 一种新的基于 GCNN 的半监督节点分类体系
存在于特定集群中的图的节点更有可能彼此连接,而不是与其他集群中的节点连接
arxiv.org](https://arxiv.org/abs/2009.13734)
和
[## 基于图的半监督学习中的标签噪声分析
在机器学习中,人们必须获得标签来帮助监督一个能够推广到看不见的数据的模型…
arxiv.org](https://arxiv.org/abs/2009.12966)
如果你对基于图的机器学习完全陌生,但不愿意观看所有 16 个半小时的讲座来开始学习,我建议看足够多的讲座 1 来了解什么是图,然后观看讲座 6 、 7 和 8 来了解如何将这种想法与机器学习模型联系起来。或者,这里是我的版本…
…简而言之,基于图的机器学习
把你拥有的每个数据点想象成一个图的节点。假设每个节点对应一个人的脸书档案。我们将在脸书上彼此是朋友的那些节点之间画边(即连接)。节点可以但不必须具有特征(例如,人的年龄、性别、自我描述的政治观点以及他们是否养猫)。现在让我们假设你想弄清楚一个给定的人是否可能支持 covid 强制封锁的想法。换句话说,一个二进制分类任务。(您可以标记那些在其配置文件中明确表示支持或鄙视锁定的节点,并训练它们。)如果你不想做任何花哨的图形,你可以简单地用你的训练数据所具有的特征来训练一个分类器。然而,你假设一个朋友中有很多禁闭支持者的人比脸书朋友圈中坚决反对呆在家里命令的人更有可能分享这些观点。如果我们能在我们的建模中包含这种关系信息就好了……等等,我们实际上可以:只要我们使用图(节点+它们与其他节点的连接)而不仅仅是节点作为我们模型的输入。
用图表,卢克!图片来源:giphy.com
这听起来可能很奇怪,但在某种程度上,你已经在做了。例如,考虑图像分类:一个 1024 x 1024 的图像可以被认为是一个网格——一个非常无聊的图形,除了图像边界之外,它恰好具有固定的大小和相同的拓扑结构。每个节点(像素)都有一组特征(定义像素的颜色)。将熟悉的 ML 概念从一个网格推广到一个任意复杂的图并不简单,但是可以做到。
对于那些已经精通使用图形进行机器学习的人来说,这里有一份大约两周前的数学含量更高的基于图形的预印本:
[## 参数 UMAP:学习嵌入深度神经网络的表现和…
我们提出了参数 UMAP,UMAP(统一流形近似和投影)的参数变化…
arxiv.org](https://arxiv.org/abs/2009.12981)
在半监督机制中训练的模型对选择哪些数据点是标记点高度敏感(事实上,优化这种选择是主动学习的中心目标)。因此,人们很容易把注意力集中在已标记子集的质量上,把我们得到的任何其他东西都扔进未标记的部分,让模型来处理它。然而,未标记训练样本中的非分布数据已经被证明对半监督模型的性能具有负面影响。当进行半监督机器学习时,未标记的训练集通常很大,仔细检查它以剔除任何不在分布范围内的点会违背最初的目的。以下预印本的作者通过利用批量标准化的方法解决了这个问题:
[## 具有非分布数据的鲁棒半监督学习
基于深度神经网络的半监督学习(SSL)最近被证明是有效的。然而,最近…
arxiv.org](https://arxiv.org/abs/2010.03658)
图像分割任务是常见的计算机视觉用例,需要特别耗时的数据注释:勾勒出一个对象或一组同类对象的边界(有时需要像素级的精度)。当涉及到数据注释时,时间当然等于金钱,所以任何可以加速这一过程的事情都有可能在未来产生巨大的影响(这是对自动驾驶汽车的一种尝试)。不出所料,有许多小组正在研究图像分割的弱监督学习。典型地,弱标签仅需要图像范围的注释,例如比分割掩模更容易获得的分类标签。在弱监督显著实例检测中,作者将类别标签与图像中存在的对象数量配对,以训练三分支分割网络来产生分割掩模:
图自 https://arxiv.org/pdf/2009.13898.pdf
[## 弱监督显著实例检测
现有的显著实例检测(SID)方法通常从像素级标注数据集学习。在本文中…
arxiv.org](https://arxiv.org/abs/2009.13898)
其他一些最近的弱监督图像分割预印本包括弱监督语义分割的因果干预
[## 弱监督语义分割的因果干预
我们提出了一个因果推理框架,以改善弱监督语义分割(WSSS)。具体来说,我们的目标是…
arxiv.org](https://arxiv.org/abs/2009.12547)
以及走向极端:弱监督医学图像分割,其中弱标记以器官表面上的极值点的形式出现,由注释者在 3D 医学图像中选择:
[## 走向极端:弱监督医学图像分割
医学图像标注是开发精确和鲁棒的机器学习模型的主要障碍。注释是…
arxiv.org](https://arxiv.org/abs/2009.11988)
最后,如果我们不谈论主动学习,这就不是一篇主动学习时事通讯;-)住在巴黎,我不可能传递一篇标题中有奥拉拉的论文:
[## OLALA:基于对象级主动学习的布局标注
在布局对象检测问题中,通过标注对象实例来构造真实数据集
arxiv.org](https://arxiv.org/abs/2010.01762)
文档布局检测是计算机视觉中的对象检测任务,其中所讨论的对象是文档图像中的不同内容区域。(自然地,大部分理论通常适用于物体检测。)当涉及到图像处理的主动学习时,查询通常在图像级完成,这意味着查询 oracle 来注释整个图像。然而,在某些类别的对象倾向于在同一幅图像中出现多次,而其他对象则不出现的用例中,图像级策略通常会导致训练集中常见对象的过度表示。对象级方法(也称为 OLALA)通过查询图像中选定对象的标签来避免这个问题。
回到图像分割的问题,主动学习当然是另一种减少选择分割模板所涉及的高数据注释成本的方法:
[## MetaBox+:一种新的基于区域的主动学习方法
提出了一种新的基于区域的主动学习语义图像分割方法,称为 MetaBox+。对于…
arxiv.org](https://arxiv.org/abs/2010.01884)
两周后见:)
主动学习教程—使用 Python 进行机器学习
这是一个 Python 主动学习的教程,对概念进行了解释,并对代码中的步骤进行了详细说明
作者图片
什么是主动学习?
主动学习是一种机器学习技术,其中我们使用较少的标记数据,并交互式地标记新的数据点,以提高模型的性能。
术语:
训练数据集=标记的数据点
池=未标记的数据点
我们从一些带标签的数据点(训练数据集)开始。有大量未标记的数据点。这些未标记的数据点必须被标记并添加到训练数据集中以创建模型。然而,在主动学习中,我们将只标记一小部分数据点,而不是标记池中的所有数据点,但是仍然可以获得良好的性能。
我们创建一个模型(分类器),并根据标记的数据对其进行训练。然后,我们检查池中的所有数据点,识别分类器最不明确的点,并将这些点添加到训练数据中(我们每次可能只添加一个点)。我们重复这个过程来提高模型性能。这种技术通常在贴标成本较高时使用。
我将很快在 YouTube 上传一段视频,详细解释主动学习背后的概念。
主动学习和其他采样新数据点进行标记的方法的性能改进比较—图片由基金会提供
主要代码
在这里,我们导入所需的库:
pandas —处理数据
sklearn —用于 SVM 模型
numpy —用于矩阵和数组操作
matplotlib.pyplot —用于图形绘制
imageio —制作 gif
OS—创建文件夹并检查它们的内容
from sklearn.svm import SVC, LinearSVC
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
import imageio as io
import os
这里,我们从 CSV 文件中读取数据。该数据可在 Kaggle 上获得。
origdata = pd.read_csv("Iris.csv")
origdata[:10]
单元格输出:虹膜数据集预览-作者提供的图像
该数据集包含关于鸢尾花的 3 个种/亚种的数据。每个样本都有萼片的长度、萼片的宽度、花瓣的长度和花瓣的宽度,都以厘米为单位。每个样本都是这三种鸢尾中的一种——刚毛鸢尾、杂色鸢尾和海滨鸢尾。
我们从数据集中选择两个属性(列)来执行主动学习。我们选择了两列,因为这样很容易将 2D 数据可视化。但是注意,只取 2 列未必比取所有列用于机器学习或主动学习更好。
k1, k2 = 'PetalLengthCm', 'PetalWidthCm'
data = origdata[[k1, k2, 'Species']].copy()
data[:10]
仅包含选定列的 Iris 数据集-按作者分类的图像
对于训练数据,我们采用前面选择的两列。物种栏是标签。我们将标签更改为 0(鸢尾-刚毛鸢尾)、1(鸢尾-杂色)和 2(鸢尾-海滨鸢尾)。
X = data[[k1, k2]]
y = data['Species']
print('Classes:')
print(y.unique(), '\n\n\n')
y[y=='Iris-setosa'] = 0
y[y=='Iris-versicolor'] = 1
y[y=='Iris-virginica'] = 2
输出:
Classes: ['Iris-setosa' 'Iris-versicolor' 'Iris-virginica']
我们在 2D 图上绘制了云芝和海滨锦葵的样本,云芝用红色,海滨锦葵用青色。
plt.figure()
setosa = y == 0
versicolor = y == 1
virginica = y == 2
plt.scatter(X[k1][versicolor], X[k2][versicolor], c='r')
plt.scatter(X[k1][virginica], X[k2][virginica], c='c')
plt.xlabel(k1)
plt.ylabel(k2)
plt.show()
输出:
杂色-红色;Virginica-青色——作者图片
我们丢弃鸢尾的样本。
X1 = X[y != 0]
y1 = y[y != 0]
X1[:5]
输出:
注意,数据帧的行从 50 开始,而不是从 0 开始。这里的索引不是从 0 开始,因为 0–49 索引行包含鸢尾花的数据,50–149 索引行包含其他两种花的数据——按作者分类的图像
然后,我们重置数据帧的索引。
X1 = X1.reset_index(drop=True)
y1 = y1.reset_index(drop=True)
y1 -= 1
print(y1.unique())
X1[:5]
输出:
[0 1]
重置索引后的数据帧-作者图片
我们将数据绘制在 2D 图上,并将图形保存为“main.jpg”。
fig = plt.figure()
plt.scatter(X1[k1][y1==0], X1[k2][y1==0], c='r')
plt.scatter(X1[k1][y1==1], X1[k2][y1==1], c='c')
plt.xlabel(k1)
plt.ylabel(k2)
fig.savefig('main.jpg', dpi=100)
plt.show()
我们在全部数据上训练线性 SVM 核,以理解当使用全部数据时我们将得到的 SVM 模型。由于这是一个线性 SVM 模型,决策边界(分隔两个类别的边界)将是一条直线。我们看决策边界的斜率和截距。
y1 = y1.astype(dtype=np.uint8)clf0 = LinearSVC()
clf0.fit(X1, y1)LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
intercept_scaling=1, loss='squared_hinge', max_iter=1000,
multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
verbose=0)print(clf0.coef_)
print(clf0.intercept_)
输出
[[0.2801542 1.70097577]]
[-4.17110884]
这里,我们绘制了决策边界以及所有数据点。在这种情况下,决策边界是一条直线(因为模型是线性 SVM)。clf0
是受过训练的量词(SVM)。我们从clf0.coef_
和clf0.intercept
得到系数。a0, b0, c0
是线的系数(线方程:a0*x + b0*y + c0 = 0; y = -(a0*x + c0)/b0
)。我们在这条线上得到 100 个点(lx0- has the x-corrdinates; ly0- has the y-coordinates
)并绘制它们(一条洋红色的线)。让我们称之为理想决策边界(当我们使用不同种类的 SVM 核时,这可能不是所有 SVM 的理想决策边界,但是,它确实是一个好的决策边界)。
然后,我们根据类别用青色和红色绘制数据集中的所有点。
xmin, xmax = X1[k1].min(), X1[k1].max()
ymin, ymax = X1[k2].min(), X1[k2].max()
stepx = (xmax - xmin)/99
stepy = (ymax - ymin)/99a0, b0, c0 = clf0.coef_[0, 0], clf0.coef_[0, 1], clf0.intercept_# Formula for reference
# a*x + b*y + c = 0
# y = -(a*x + c)/b
lx0 = [xmin + stepx * i for i in range(100)]
ly0 = [-(a0*lx0[i] + c0)/b0 for i in range(100)]
plt.figure()
plt.scatter(X1[k1][y1==0], X1[k2][y1==0], c='r')
plt.scatter(X1[k1][y1==1], X1[k2][y1==1], c='c')
plt.plot(lx0, ly0, c='m')
plt.xlabel(k1)
plt.ylabel(k2)
plt.show()
紫线是 SVM 模型的决策边界。红色和青色点是两个类别。
现在,我们将数据集分成两部分—池(80%)和测试(20%)。我们使用随机状态 1。数据集的分割取决于随机状态。
(我做过随机状态为 1 后主动学习 5 次迭代和随机状态为 2 后主动学习算法 20 次迭代的仿真)。
X_pool, X_test, y_pool, y_test = train_test_split(X1, y1, test_size=0.2, random_state=1)
X_pool, X_test, y_pool, y_test = X_pool.reset_index(drop=True), X_test.reset_index(drop=True), y_pool.reset_index(drop=True), y_test.reset_index(drop=True)
# random state 1 5 iterations
# random state 2 20 iterations
让我们对两个数据点应用 SVM 的判定函数。通常,对于两类线性 SVM,决策函数为其中一类(决策边界的一侧)输出正值,为另一类(决策边界的另一侧)输出负值,并在决策边界上输出零。
对于线性 SVM,决策函数的大小等于数据点到决策函数的距离。这是因为,如果一个点靠近决策边界,那么它可能是决策边界另一侧的类的异常值。
clf0.decision_function(X_pool.iloc[6:8])
输出
array([-0.55706427, 0.26340314])
这里,我们看到决策函数对于其中一个点具有负值,对于另一个点具有正值。
函数find_most_ambiguous
给出了分类器最不明确的点。对于 SVM 分类器,如果数据点更接近决策边界,并且如果数据点更远离决策边界,则不那么模糊,而不管该点在决策边界的哪一侧。因此,find_most_ambiguous
给出了最接近决策边界的未标记点。
clf- classifier (trained SVM model); unknown_indexes- indexes from the dataset that are the unlabelled/unknown pool
def find_most_ambiguous(clf, unknown_indexes):
ind = np.argmin(np.abs(
list(clf0.decision_function(X_pool.iloc[unknown_indexes]) )
))
return unknown_indexes[ind]
函数plot_svm
用于绘制以下内容:
SVM 判定边界、根据分类来自列车数据的数据点以及未知样本池中的数据点。
clf- classifier (trained SVM model).
train_indexes- Indexes of the dataset that are the train data points. unknown_indexes- Indexes of the dataset that are the unlabelled pool data points. title- The title of the plot. name- the name of the image file that when the plot is saved to a file. new_index- This is the index of the most ambiguous point in the unlabelled pool
在这个函数中,首先,我们分别从train_indexes
和unknown_indexes
获取列车数据(X_train, y_train
)和未标记数据(X_unk, y_unk
)。我们用黑色标出了池中所有未标记的点。然后,我们根据分类标签,用不同的颜色(红色和青色)绘制来自训练数据的所有点。我们从 clf.coef_ 和 clf.intercept 中得到决策边界(直线)的系数,利用这个和直线的公式,我们画出这条线(绿色虚线)。我们还有前面计算的理想决策边界。这条线也用洋红色标出。
最后,我们绘制出new_index
点,也就是最模糊的点(黄星)。
def plot_svm(clf, train_indexes, unknown_indexes, new_index = False, title = False, name = False):
X_train = X_pool.iloc[train_indexes]
y_train = y_pool.iloc[train_indexes]
X_unk = X_pool.iloc[unknown_indexes]
if new_index:
X_new = X_pool.iloc[new_index]
a, b, c = clf.coef_[0, 0], clf.coef_[0, 1], clf.intercept_ # Straight Line Formula
# a*x + b*y + c = 0
# y = -(a*x + c)/b
lx = [xmin + stepx * i for i in range(100)]
ly = [-(a*lx[i] + c)/b for i in range(100)]
fig = plt.figure(figsize=(9,6))
# plt.scatter(x[k1][setosa], x[k2][setosa], c='r')
plt.scatter(X_unk[k1], X_unk[k2], c='k', marker = '.')
plt.scatter(X_train[k1][y_train==0], X_train[k2][y_train==0], c='r', marker = 'o')
plt.scatter(X_train[k1][y_train==1], X_train[k2][y_train==1], c='c', marker = 'o')
plt.plot(lx, ly, c='m')
plt.plot(lx0, ly0, '--', c='g')
if new_index:
plt.scatter(X_new[k1], X_new[k2], c='y', marker="*", s=125)
plt.scatter(X_new[k1], X_new[k2], c='y', marker="*", s=125)
plt.scatter(X_new[k1], X_new[k2], c='y', marker="*", s=125)
plt.scatter(X_new[k1], X_new[k2], c='y', marker="*", s=125)
plt.scatter(X_new[k1], X_new[k2], c='y', marker="*", s=125)
if title:
plt.title(title)
plt.xlabel(k1)
plt.ylabel(k2)
if name:
fig.set_size_inches((9,6))
plt.savefig(name, dpi=100)
plt.show()
我们将集合的前 10 个指数/数据点作为初始训练数据,其余 70 个点作为未标记的样本。我们用所有未标记的样本、理想决策边界和 10 个训练数据点创建开始图。
然后,我们在训练数据上训练一个 SVM,我们找到最不明确的点并创建一个新的图(“迭代 0”),用这个点作为一个黄色的星,并且还绘制训练的 SVM 的决策边界。
train_indexes = list(range(10))
unknown_indexes = list(range(10, 80))
X_train = X_pool.iloc[train_indexes]
y_train = y_pool.iloc[train_indexes]
clf = LinearSVC()
clf.fit(X_train, y_train)
# folder = "rs1it5/"
folder = "rs2it20/"
# folder = "rs1it20/"
try:
os.mkdir(folder)
except:
pass
filenames = ["ActiveLearningTitleSlide2.jpg"] * 2
title = "Beginning"
# name = folder + ("rs1it5_0a.jpg")
name = folder + ("rs2it20_0a.jpg")
plot_svm(clf, train_indexes, unknown_indexes, False, title, name)
filenames.append(name)
n = find_most_ambiguous(clf, unknown_indexes)
unknown_indexes.remove(n)
title = "Iteration 0"
name = folder + ("rs1it5_0b.jpg")
# name = folder + ("rs2it20_0b.jpg")
filenames.append(name)
plot_svm(clf, train_indexes, unknown_indexes, n, title, name)
接下来,我们运行主动学习算法 5 次迭代。在每一个阶段中,我们将最模糊的点添加到训练数据中,并训练一个 SVM,在这个阶段找到最明确的点,然后创建一个图。
num = 5
# num = 20
t = []
for i in range(num):
train_indexes.append(n)
X_train = X_pool.iloc[train_indexes]
y_train = y_pool.iloc[train_indexes]
clf = LinearSVC()
clf.fit(X_train, y_train)
title, name = "Iteration "+str(i+1), folder + ("rs1it5_%d.jpg" % (i+1))
# title, name = "Iteration "+str(i+1), folder + ("rs2it20_%d.jpg" % (i+1))
n = find_most_ambiguous(clf, unknown_indexes)
unknown_indexes.remove(n)
plot_svm(clf, train_indexes, unknown_indexes, n, title, name)
filenames.append(name)
images = []
for filename in filenames:
images.append(io.imread(filename))
io.mimsave('rs1it5.gif', images, duration = 1)
# io.mimsave('rs2it20.gif', images, duration = 1)
# io.mimsave('rs1it20.gif', images, duration = 1)
try:
os.mkdir('rs1it5')
# os.mkdir('rt2it20')
except:
pass
os.listdir('rs1it5')
输出
['ActiveLearningTitleSlide2.jpg',
'ActiveLearningTitleSlide2.jpg',
'rs1it5/rs1it5_0a.jpg',
'rs1it5/rs1it5_0b.jpg',
'rs1it5/rs1it5_1.jpg',
'rs1it5/rs1it5_2.jpg',
'rs1it5/rs1it5_3.jpg',
'rs1it5/rs1it5_4.jpg',
'rs1it5/rs1it5_5.jpg']
现在,我们显示 GIF 文件
with open('rs1it5.gif','rb') as f:
display(Image(data=f.read(), format='gif'))
请注意,在上面的 GIF 中,随着我们添加更多的点(迭代次数),绿线越来越接近理想决策边界。
请注意,在上面的一些代码块和下面的代码块中,有一些带有数字 20 的注释行。这是为了运行 20 次迭代,而不是 5 次迭代。要运行它,我们必须用 5 注释所有的行,用 20 取消注释所有的行。 当我们运行 20 次主动学习算法的迭代时,我们得到下面的 GIF。请注意,为此,我们在将数据分为测试和池时使用了 2 作为随机状态。
注意,随着下面 GIF 中迭代次数的增加,绿线越来越接近理想决策边界。
注意,主动学习可以用于其他机器学习/深度学习模型(不仅仅是支持向量机)。
另外,第一个ActiveLearningTitleSlide2.jpg
是我用画图工具创建的一个简单的图像,和其他图像的长宽比一样(900x600)。
结论
我们看到,我们已经训练了一个好的分类器,也就是说,一个分类器的性能接近用所有点训练的 SVM,尽管我们使用了非常少量的点。这就是如何使用主动学习来创建标记更少数据点的健壮模型。
完整的代码可以在 GitHub 上获得
你可以看看我的 YouTube 频道上解释 AI 和 ML 概念的视频。
有效数据标注策略的主动学习
通过将手动干预限制在信息量最大的样本,降低数据注释成本。
Taton moise 在 Unsplash 上拍摄的照片
我相信数据注释的质量和数量通常是机器学习应用程序成功的最决定性因素。然而,手动数据注释可能非常慢且成本高。这就是为什么有很多关于减少手动注释需求的方法的研究工作,如迁移学习或无监督预训练。
另一种降低数据标注成本的方法是使用主动学习。它是一组方法,将数据注释步骤呈现为学习算法和用户之间的交互过程,其中当用户注释那些选择的样本时,算法建议哪些示例值得注释。
在这篇文章中,我们将尝试探索应用于麻省理工学院-BIH 心律失常和 MNIST 数据集的基于不确定性的主动学习方法。
由于标注可能非常昂贵,有时需要领域专家,我们将仅模拟用户交互过程,从标记数据集的一个小子集开始,随后仅使用算法建议的有价值的样本标签。
流程描述:
基于不确定性的主动学习
步骤:
1 —从一小批带注释的 start_size = 512 示例开始
2 —在初始批次上训练分类模型。
3-对于 n 个步骤,do :
-使用**熵形式的不确定性选择下一批最有希望的大小为 batch_size 的样本,**其中,您将根据样本的预测熵对样本进行排序,并且仅挑选具有最高熵的顶部 batch_size 样本。
-根据目前选择的所有数据训练模型。
-在测试集上评估模型。
实验:
麻省理工学院-BIH 心律失常的主动学习与随机抽样
在麻省理工学院-BIH 心律失常数据集上,使用全部约 3000 个标记样本进行训练,我们得到:
-主动学习策略: 0.80 F1 分数
-随机策略: 0.74 F1 分数
为了获得 0.74 分的 F1 分,主动学习策略只需要大约 2000 个带标签的例子,或者 3000 分中的 2/3
MNIST 上的主动学习与随机抽样
在 MNIST 数据集上,使用全部约 1400 个标记样本进行训练,我们得到:
-主动学习策略: 0.98 F1 得分
-随机策略: 0.96 F1 得分
为了达到 0.96 分的分数F1 分,主动学习策略只需要大约 700 个带标签的例子或者 1400 个例子的一半
请注意,图中显示的性能是 10 次独立运行的平均值,以减少随机性造成的影响。
还要注意,我用 CIFAR10 而不是 MNIST 做了完全相同的实验,但效果不是很好。我仍然不明白为什么,但这是未来☺值得关注的事情。
结论:
在这篇文章中,我们应用了基于不确定性的主动学习的简化实现。模拟结果看起来令人鼓舞,证明了主动学习可以帮助减少实现良好测试性能所需的手动标签数量。
代码重现结果:https://github.com/CVxTz/active_learning
机器学习中的主动学习
浅谈主动学习的实施
马库斯·斯皮斯克在 Unsplash 上的照片
大多数有监督的机器学习模型需要大量的数据才能训练出好的结果。即使这种说法听起来很天真,大多数公司都很难向他们的数据科学家提供这些数据,特别是标有的数据。后者是训练任何监督模型的关键,并且可能成为任何数据团队的主要瓶颈。
在大多数情况下,数据科学家会被提供一个庞大的、未标记的数据集,并被要求用它们来训练性能良好的模型。通常,数据量太大而无法手动标记,对于数据团队来说,用这些数据训练良好的监督模型变得相当具有挑战性。
主动学习:动机
主动学习是用于对需要被标记的数据进行优先排序的过程的名称,以便对训练监督模型具有最高的影响。主动学习可以用在数据量太大而无法标记的情况下,并且需要制定一些优先级来以智能方式标记数据。
但是,为什么我们不选择一个随机的数据子集来手动标记它们呢?
让我们看一个非常简单的例子来激发讨论。假设我们有数百万个数据点,需要根据两个特征进行分类。实际解决方案如下图所示:
如果标记了所有数据点,则进行模型预测
正如你所看到的,这两个类(红色和紫色)可以很好地被一条垂直的蓝线 0 分开。问题是这些数据点都没有被标记,所以我们得到的数据如下图所示:
未标记的数据
不幸的是,我们没有足够的时间来标记所有的数据,我们随机选择了一个数据子集来标记和训练一个二元分类模型。结果不是很好,因为模型预测偏离最佳边界相当多。
根据标记数据点的随机子集训练的模型
在这种情况下,可以使用主动学习来优化选择用于标记的数据点,并基于这些数据点训练模型。下面的图显示了在基于实施主动学习之后标记的数据点选择模型的训练之后训练二元分类模型的示例。
使用主动学习在选择要标记的数据点子集上训练模型
在标记时,明智地选择优先处理哪些数据点可以为数据科学团队节省大量时间、计算和麻烦!
主动学习策略
主动学习的步骤
文献中研究了多种方法,涉及如何在标记时区分数据点的优先级以及如何迭代该方法。然而,我们将只介绍最常见和最简单的方法。
在未标记的数据集上使用主动学习的步骤是:
- 首先需要做的是,需要手工标记该数据的一个非常小的子样本。
- 一旦有了少量的标记数据,就需要对模型进行训练。该模型当然不会很好,但会帮助我们了解参数空间的哪些区域需要首先标记以改进它。
- 在训练该模型之后,该模型用于预测每个剩余的未标记数据点的类别。
- 基于模型的预测,在每个未标记的数据点上选择分数。在下一小节中,我们将介绍一些最常用的可能得分。
- 一旦选择了最佳方法来对标记进行优先级排序,就可以反复重复该过程:可以在新的标记数据集上训练新的模型,该数据集已经基于优先级分数进行了标记。一旦在数据子集上训练了新的模型,未标记的数据点可以在模型中运行,以更新优先排序分数,从而继续标记。这样,随着模型变得越来越好,人们可以不断优化标记策略。
优先级分数
有几种方法可以为每个数据点分配优先级分数。下面我们描述三个基本的。
最不可信:
这可能是最简单的方法。它为每个数据点的预测取最高概率,并从小到大排序。使用最小置信度进行优先级排序的实际表达式是:
让我们用一个例子来看看这是如何工作的。假设我们有以下三个可能类别的数据:
表 1:模型对四个不同数据点的三个不同类别的概率预测示例。
在这种情况下,算法将首先为每个数据点选择最大概率,因此:
- X1: 0.9
- X2: 0.87
- X3:0.5
- X4:0.99。
第二步是根据这个最大概率(从小到大)对数据进行排序,因此是 X3、X2、X1 和 X4。
保证金取样:
该方法考虑了最高概率和第二高概率之间的差异。从形式上看,区分优先级的表达式应该是这样的:
具有较低边缘采样分数的数据点将被标记为第一个;这些数据点是模型最不确定的,介于最可能的类和次最可能的类之间。
按照表 1 的例子,每个数据点的相应分数是:
- x1:0.9–0.07 = 0.83
- X2:0.87–0.1 = 0.86
- X3:0.5–0.3 = 0.2
- x4:0.99–0.01 = 0.98
因此,数据点将显示为标记如下:X3、X1、X2 和 X4。可以看出,这种情况下的优先级与最不自信的优先级略有不同。
熵:
最后,我们要展示的最后一个评分函数是熵值。熵是一个来自热力学的概念;简单地说,它可以被理解为一个系统中无序度的度量,例如一个封闭盒子中的气体。熵越高,无序越多,而如果熵低,这意味着气体可能主要在一个特定的区域,比如盒子的一个角落(可能在实验开始时,在扩展到整个盒子之前)。
这个概念可以被重用来度量模型的确定性。如果模型对于给定数据点的某个类别非常确定,那么它对于某个特定类别可能具有高确定性,而所有其他类别将具有低概率。这不就和盒子角落里有气体很像吗?在这种情况下,我们将大部分概率分配给特定的类。在高熵的情况下,这意味着模型为所有类别平均分配概率,因为根本不确定该数据点属于哪个类别,类似于使气体平均分布在盒子的所有部分。因此,将具有较高熵的数据点优先于具有较低熵的数据点是很简单的。
形式上,我们可以将熵值优先级定义如下:
如果我们将熵值应用于表 1 中的示例:
- x1:-0.9 * log(0.9)-0.07 * log(0.07)-0.03 * log(0.03)= 0.386
- X2:-0.87 * log(0.87)-0.03 * log(0.03)-0.1 * log(0.1)= 0.457
- X3:-0.2 * log(0.2)-0.5 * log(0.5)-0.3 * log(0.3)= 1.03
- x4:-0 * log(0)-0.01 * log(0.01)-0.99 * log(0.99)= 0.056
注意,对于 X4,为了数值稳定性,应将 0 改为小ε(例如 0.00001)。
在这种情况下,数据点应按以下顺序显示:X3、X2、X1 和 X4,这与最不自信评分法的顺序一致!
主动学习:机器和人一起工作
使用较少标记数据训练 ML 模型的工具
安迪·凯利的照片
M 在过去的几十年里,机器学习(ML)已经彻底改变了世界,受益于不断增长的计算能力,以解决不久前还无法解决的问题。然而,尽管有其潜力,许多技术和实践的挑战面临着那些与 ML。
特别是,生成用于训练模型的数据的必要工作正在成为一个复杂的问题。鉴于我们目前试图解决的问题的复杂性和规模,标记必要的数据成为一项费力且昂贵的任务,因为大部分过程必须手动完成。在处理需要高度专业化的问题时,这个问题甚至更为关键。例如,为了使用深度神经网络从 MRI 扫描中检测疾病,在诊断这种图像方面经验丰富的医生必须对成千上万个样本进行分类。鉴于此,开发提高数据集标注工作流效率的方法变得至关重要。
一个有效的选择是部分或完全自动化贴标过程。然而,当考虑复杂和高维数据时,标注工作流中没有多少可以自动化(如果您有一个能够自动标注数据的系统,问题就解决了,并且无论如何都不需要训练 ML 模型)。
另一种方法包括以某种方式减小数据集的大小。尽管我们知道复杂的问题需要大量的数据集,但事实上并不是所有的例子对学习模型都有意义。因此,只选择信息量最大的例子进行标注,可以让我们在从较少的例子中学习的同时,获得一个好的模型。
主动学习是一个依赖于这种想法的框架,其中模型选择最具信息量的未标记样本,然后要求外部专家(通常称为 oracle)只标记这些样本。主动学习被一些作者归类为半监督学习框架,因为它在训练模型时使用标记和未标记的数据。与 oracle 的交互是迭代的,在每次迭代中都有新的未标记的示例提供给 oracle。
在[1]中,Burr Settles 提出了一个关于主动学习的广泛调查。他用直观的方式总结了背后的概念:
“关键的假设是,如果允许学习算法选择它学习的数据——如果你愿意的话,可以说是“好奇”——它将在更少的训练下表现得更好。”[1]
接下来将展示两个有趣的主动学习应用。
情感分析中的主动学习
照片由 M. B. M.
情感分析是自然语言处理领域的一个重要应用。它侧重于根据作者表达的态度对文本进行分类。尽管看起来像一个简单的任务,但它通常是 ML 模型很难处理的事情,因为文本中的细微变化可能会给读者带来完全不同的含义。
在[2]中,作者将主动学习应用于情感分析问题,提出了一种称为主动深度网络(ADN)的算法,这是主动学习和深度神经网络的结合。结果真的很有趣,因为这种方法不仅使用了更少的例子来学习,而且它优于当时被认为是最先进的其他知名模型。
“[……]ADN 可以根据现有的未标记和已标记数据,做出应该标记哪些训练数据的正确决定。通过迭代使用无监督和有监督学习,ADN 可以选择合适的训练数据进行标记,同时训练深度架构。面向情感分析的主动学习”
用于高光谱图像分类的主动深度学习
高光谱图像是电磁波谱中光谱响应的表示。它由代表特定电磁波长测量值的若干空间图像组成,用于从天文学到生物医学的不同应用。由于通常表示的不同波长的范围很大,数据变得高维。例如,NASA AVIRIS(机载可见/红外成像光谱仪)捕获的单个图像可以包含高达 140MB 的原始数据[3]。
超光谱立方体的 2D 投影。Nicholas M. Short 博士,美国航天局
对于主动学习来说,这是一个很好的应用,因为对这样的图像进行分类是一项长期的任务,需要对应用程序有深入的了解。在[4]中,作者提出了一种称为 WI-DL 的主动学习算法,使用具有 4 个隐藏层的深度信念网络。该模型仅用 5000 个标记样本就达到了接近 95%的准确率,表明通过主动选择相关训练样本,可以在使用较少数据的情况下训练出准确的模型。
结论
对于机器学习应用来说,为复杂和高维问题产生高质量的数据集已经是一个挑战。在这里,一个称为主动学习的框架与两个相关的应用一起被提出。尽管允许减少标记示例的数量,但是主动学习并不是给定问题的最终解决方案,因为仍然需要人类来负责人工标记。同样重要的是要注意,oracle 必须包含在训练循环中,等待算法在每次新的迭代中提供新的未标记样本。取决于应用,这是一个可能不方便或难以实现的工作流程。
参考
[1]落定,伯尔。主动学习文献调查。威斯康星大学麦迪逊分校计算机科学系,2009 年。
[2]周,舒森,,陈,.“用于半监督情感分类的主动深度网络。”第 23 届国际计算语言学会议录:海报。计算语言学协会,2010 年。
[3] Cheung、Ngai-Man 和 Antonio Ortega。"超光谱图像的分布式压缩."分布式源代码(2009):269–292。
[4]刘,彭,,朱光耀."高光谱图像分类的主动深度学习."IEEE 应用地球观测和遥感专题期刊 10.2(2016):712–724。
主动学习——说是!
安妮·斯普拉特在 Unsplash 上的照片
机器学习这个,机器学习那个!你知道该怎么做。让我们来谈一个人们此刻只在窃窃私语的话题,主动学习。
主动学习是人工智能的一个子领域,它基于这样一个事实,即好奇的算法在效率和**表达能力方面都是更好的学习者。**核心思想是让算法挑选样本进行训练,而不是在所有可用的训练数据上训练模型。
主动学习场景
主动学习可能是人工智能领域最简单的想法之一。这个想法有多种变化,但都有明确的主题。
让模型挑选训练数据
“让模型挑选训练数据”这句话可能意味着几件事。
- 让模型创建训练数据(创成式模型)
- 让模型从未标记的数据流中挑选一个例子
- 让模型从一堆未标记的数据中挑选一个例子
生成模型可能有些棘手,因为人类注释者可能很难标记数据,这违背了主动学习的目的。
一般来说,在实际设置中,模型从一个未标记的数据流/数据池中挑选例子,由人类注释者进行标记。
主动学习策略
这一节我们来讨论几个主动学习策略。
不确定抽样
这种策略通常用于概率模型。可以用一个简单的流程图来概括。
不确定性采样流程图。[使用 code2flow 生成]
除了“标记最不确定的例子”这一步,上面的流程图几乎是不言自明的。
让我们考虑一个将新闻分为 7 类的工作示例。我们有:-
- 一套小型训练设备
- 在带标签的训练集上训练的简单模型
- 一大群没有标记的人
让我们预测 10 个未标记的样本中所有类别的概率。
10 个未标记样本的分类概率。[作者图片]
- 选择一个最大概率类别值最小的例子
直觉告诉我们,如果模型对某个示例的顶部预测没有信心,那么该示例就相当困难,或者可能与模型已经看到的不同。
例 5 具有最大的不确定性。[作者图片]
在上面的示例中,我们看到模型对第 5 个示例的顶部预测最没有信心。
2.挑选一个前两个类别之间差异最小的例子
直觉是,如果前两个预测之间的差异较小,那么模型一定是在两个类别之间混淆了。一个好的模型应该能够尽可能地分离类别,因此,在训练数据中考虑该示例是很重要的。
前两类的区别。[作者图片]
3.利用熵测量不确定度
维基百科定义的熵是 变量可能结果中固有的“信息”、“惊喜”或“不确定性”的平均水平。 如果预测概率具有高熵,则意味着模型对某个例子感到困惑。
计算预测概率的熵。[作者图片]
委员会的质询
就整个过程而言,按委员会查询也非常类似于不确定性抽样。唯一的区别是我们如何选择最不确定的例子。在**不确定性采样中,**我们训练单个模型,并使用其输出概率来推断不确定性并挑选示例。
在按委员会查询中,我们创建不同类型模型的委员会,并在训练集上训练它们。当选择看不见的例子时,我们从所有例子的所有模型中得到预测。这些模型在很大程度上不一致的示例是困难的示例,应该出现在训练数据中。
不同类型的模型(线性、树、邻居、贝叶斯)确保我们的查询策略不会受到单一类型的建模假设的影响,因此性能良好。
创建一个由 7 名分类员组成的委员会。[作者图片]
例 5 不同型号之间分歧最大。[作者图片]
主动学习的好处
在文章的开始,我提到了主动学习提高了模型的效率和表达能力。
与学术界相反,行业从业者必须处理非标准数据集和问题
因此,任何 ML 项目的很大一部分都花费在获得正确的训练数据集上。人类注释者花费他们宝贵的时间来标记数据集进行训练,这是最大的开销和低效点。 主动学习法保证了标注者只标注最重要、最难的例子,从而使整个过程更加高效。
当一个大数据集被无意识地标记时,它会带来不想要的类别不平衡,并冒着丢失尚未标记的重要示例的风险。
通过使用主动学习,我们挑选最有趣和最多样的例子,从而提高模型的表达能力。在这里,通过表达能力,我的意思是这个过程从大量未标记的数据中引出更多种类的要标记的例子,这些数据在无意识标记的情况下会保持未标记。
所以如果都是金子和闪闪发光的东西,为什么我们不在这里谈论它呢?
杰瑞米·霍华德在他出现在莱克斯·弗里德曼的播客中非常出色地抓住了这一点。
结论
主动学习,在我看来,是人工智能领域最接近于一顿“免费午餐”的事情。这个概念非常简单,其好处远远超过创建和管理培训数据的任何其他方法。虽然这不是一个非常著名的子领域,但令人敬畏的 python 社区已经创建了一些包,将主动学习的力量带给每个人。
参考
TensorFlow 2.x 的演员兼评论家[第 1 部分,共 2 部分]
使用 Tensorflow 2.x 以不同方式实现参与者-批评家方法
戴维·维克斯列尔在 Unsplash 上的照片
在这一系列文章中,我们将试图理解演员-评论家方法,并以 3 种方式实现它,即天真的 AC,没有多个工人的 A2C,和有多个工人的 A2C。
这是系列的第一部分,我们将使用 TensorFlow 2.2 实现天真的演员评论家。我们先来了解一下演员-评论家法是什么,是如何运作的?了解加强政策梯度方法将是有益的,你可以在这里找到它。
概述:
如果你读过加强政策梯度法,你就会知道它的更新规则是
更新加固规则
在演员-评论家方法中,我们从折扣奖励中减去基线。这些方法的常用基线是状态值函数。所以我们的演员-评论家更新规则将如下所示。
演员-评论家更新规则
在演员-评论家方法中,我们有两个神经网络,即演员和评论家。actor 用于动作选择,Critic 用于计算状态值。如果您查看更新等式,您会注意到状态值被用作基线。有了基线有助于确定所采取的行动是坏的/好的,还是状态是坏的/好的。您可以在参考资料部分找到非常好的理论资源。
天真的演员兼评论家:
在这个实现中,我们将在每个时间戳更新我们的神经网络。这种实现不同于 A2C,在那里我们在每 n 个时间戳之后更新我们的网络。我们将在本系列的下一部分实现 A2C。
神经网络:
神经网络基本上可以用两种方式实现。
- 一个网络用于演员和评论家功能,即一个网络具有两个输出层,一个用于状态值,另一个用于动作概率。
- 独立的网络,一个是演员的,另一个是评论家的。
在这篇文章中,我们将对演员和评论家使用不同的网络,因为我发现这个可以快速学习。
代码:
演员和评论家网络:
- 批评家网络输出每个状态的一个值,而行动者网络输出该状态中每个单个动作的概率。
- 这里,演员网络中的 4 个神经元是动作的数量。
- 注意,Actor 在外层有一个 softmax 函数,它输出每个动作的动作概率。
注意:隐藏层中的神经元数量对于代理学习非常重要,并且因环境而异。
代理类的初始化方法:
- 这里,我们为我们的网络初始化优化器。请 注意学习的****速度也很重要,并且会因使用的环境和方法而异。
动作选择:
- 这种方法利用了张量流概率库。
- 首先,Actor 给出概率,然后使用 TensorFlow 概率库将概率转换成分布,然后从分布中抽取动作。
学习功能和损失:
- 我们将利用梯度胶带技术进行定制培训。
- 行动者损失是采取行动的对数概率乘以 q 学习中使用的时间差的负数。
- 对于临界损失,我们采取了一种简单的方法,只计算时间差的平方。如果你愿意,你可以使用 tf2 的均方误差函数,但是你需要对时差计算做一些修改。我们将在本系列的下一部分中使用 MSE,所以不要担心。
- 你可以在 TensorFlow 官网找到更多关于定制训练循环的内容。
注意:请确保使用语句(上下文管理器)调用 networks inside,并且只使用张量进行网络预测,否则您将得到一个关于没有提供梯度的错误。
Trining 循环:
- 代理在环境中采取行动,然后 bot 网络更新。
- 对于月球着陆器环境,这种实现表现良好。
注意:在实现这些方法时,我注意到学习速率和隐藏层中的神经元对学习有很大的影响。
你可以在这里找到这篇文章的完整代码。请继续关注即将发布的文章,我们将在有多个工人和没有多个工人的情况下实施 A2C。
这个系列的第二部分可以在这里访问。
所以,本文到此结束。谢谢你的阅读,希望你喜欢并且能够理解我想要解释的东西。希望你阅读我即将发表的文章。哈里奥姆…🙏
参考资料:
显着扩大和更新的广泛使用的文本强化学习的新版本,最…
mitpress.mit.edu](https://mitpress.mit.edu/books/reinforcement-learning-second-edition) [## 直觉 RL:优势介绍-演员-评论家(A2C)
强化学习(RL)实践者已经产生了许多优秀的教程。然而,大多数描述 RL 在…
hackernoon.com](https://hackernoon.com/intuitive-rl-intro-to-advantage-actor-critic-a2c-4ff545978752) [## 优势演员评论方法介绍:让我们玩刺猬索尼克!
托马斯西蒙尼尼介绍优势演员评论家的方法:让我们玩刺猬索尼克!从…开始
www.freecodecamp.org](https://www.freecodecamp.org/news/an-intro-to-advantage-actor-critic-methods-lets-play-sonic-the-hedgehog-86d6240171d/) [## 菲尔的机器学习
你好。在 Neuralnet.ai,我们涵盖了各种主题的人工智能教程,从强化…
www.youtube.com](https://www.youtube.com/channel/UC58v9cLitc8VaCjrcKyAbrw)**