理解熵:机器学习的黄金标准
来源: Unsplash
从决策树到神经网络
TL;DR: 熵是对系统中混沌的一种度量。因为它比其他更严格的指标(如准确性或均方误差)更具动态性,所以使用熵来优化从决策树到深度神经网络的算法已经显示出可以提高速度和性能。
它在机器学习中无处不在:从决策树的构建到深度神经网络的训练,熵都是机器学习中必不可少的度量。
熵源于物理学——它是对系统中无序或不可预测性的一种度量。例如,考虑一个盒子里的两种气体:最初,系统具有低熵,因为这两种气体是完全可分的;然而,一段时间后,气体混合,系统的熵增加。据说,在一个孤立的系统中,熵永远不会减少——没有外力,混沌永远不会变暗。
例如,考虑掷硬币——如果掷硬币四次,事件出现[tails, heads, heads, tails]
。如果你(或一个机器学习算法)要预测下一次掷硬币,你将能够以任何确定性预测结果——该系统包含高熵。另一方面,带有事件[tails, tails, tails, tails]
的加权硬币具有非常低的熵,根据当前的信息,我们几乎可以肯定地说下一个结果将是反面。
大多数适用于数据科学的场景都介于极高熵和极低熵之间。高熵意味着低信息增益,低熵意味着高信息增益。信息增益可以被认为是系统中的纯度:系统中可用的干净知识的数量。
决策树在其构造中使用熵:为了尽可能有效地将输入沿着一系列条件导向正确的结果,具有较低熵(较高信息增益)的特征分裂(条件)被放置在树上较高的位置。
为了说明低熵和高熵条件的概念,假设要素的类别由颜色(红色或蓝色)标记,分割由垂直虚线标记。
决策树计算特征的熵,并对它们进行排列,使得模型的总熵最小(信息增益最大)。从数学上来说,这意味着将最低熵条件放在顶部,这样它可以帮助它下面的分裂节点减少熵。
决策树训练中使用的信息增益和相对熵被定义为两个概率质量分布 p ( x )和 q ( x )之间的“距离”。它也被称为 kull back-lei bler(KL)散度或运土机距离,用于训练生成的对抗性网络,以评估生成的图像与原始数据集中的图像相比的性能。
神经网络最喜欢的损失函数之一是交叉熵。无论是分类的、稀疏的还是二元交叉熵,该度量都是高性能神经网络的默认定位损失函数之一。它还可以用于优化几乎任何分类算法,如逻辑回归。像熵的其他应用一样,如联合熵和条件熵,交叉熵是熵的许多严格定义中的一种,适合于一个独特的应用。
交叉熵,像库尔巴克-利伯散度(KLD),也处理两个分布 p 和 q 之间的关系,代表真实分布 p 和近似分布 q 。然而,KLD 度量的是两个分布之间的相对熵,而交叉熵度量的是两个分布之间的“总熵”。
该度量被定义为使用模型分布 q 对来自具有分布 p 的源的数据进行编码所需的平均比特数。如果我们考虑一个目标分布 p 和近似值 q ,我们会想要减少使用 q 而不是 p 来表示一个事件所需的比特数。另一方面,相对熵(KLD)测量在分布 q 中表示来自 p 的事件所需的额外比特数。
交叉熵可能看起来像是一种度量模型性能的迂回方法,但它有几个优点:
- 基于准确性/误差的度量有几个问题,包括对训练数据的顺序极度敏感,不考虑置信度,并且对可能给出错误结果的数据的各种属性缺乏鲁棒性。它们是非常粗糙的绩效衡量标准(至少在训练期间)。
- 交叉熵度量信息内容,因此比仅仅强调勾选所有方框的指标更加动态和健壮。预测和目标被视为分布,而不是一系列等待回答的问题。
- 它与概率的性质密切相关,尤其适用于 sigmoid 和 SoftMax 激活(即使它们仅用于最后一个神经元),有助于减少消失梯度问题。逻辑回归可以被认为是二元交叉熵的一个版本。
虽然熵并不总是最好的损失函数——特别是在目标函数 p 没有明确定义的情况下——但它通常会提高性能,这解释了它为什么到处存在。
通过在机器学习中使用熵,它的核心组成部分——不确定性和概率——可以通过交叉熵、相对熵和信息增益等概念得到最好的表达。熵在处理未知方面是显而易见的,这是建模中非常需要的。当模型基于熵进行优化时,它们能够带着更高的知识和目的感在不可预测的平原上漫游。
感谢阅读!
如果你对最新的文章感兴趣,可以考虑订阅。如果你想支持我的写作,通过我的推荐链接加入 Medium 是一个很好的方式。干杯!
可解释的人工智能:激活最大化,灵敏度分析,等等
towardsdatascience.com](/every-ml-engineer-needs-to-know-neural-network-interpretability-afea2ac0824e) [## 每个机器学习算法都可以表示为一个神经网络
算法中的算法
towardsdatascience.com](/every-machine-learning-algorithm-can-be-represented-as-a-neural-network-82dcdfb627e3)
除非另有说明,所有图表均由作者创建。
了解实验指标
定义基线测量和转换率
在我的实验设计系列的第一部分思考实验设计,我们讨论了实验的基础:目标、条件和度量。在本帖中,我们将离开最初的实验设置,开始理解基线指标以及选择适当的转换指标和比率的细微差别。
简介
我介绍了一个商业环境中的实验的目标,使用柠檬水摊位的例子:在可比较的时间范围内,在受控条件下(杯子的颜色),测量结果(售出杯子的数量)的差异。在这个例子中,我没有提到任何实验的一个关键要素——一个假设,一个基于有限证据的初步推测。严格地说,实验的目的是验证或反驳一个假设提出的观点。对于我们的柠檬水摊位示例,一个合理的假设可能是“柠檬水杯子的颜色影响售出的杯子数量。”
从基线开始
如果我们刚刚开始我们的柠檬水摊位(或其他小企业/业务线),你能看到立即设计这个特定的实验(或任何实验)来验证一个假设的问题吗?撇开市场调查不谈,我们没有任何可靠的(由硬数据支持的)预测来预测我们售出的杯子数量!
如果我们红色杯子的前两周销量很差,接下来的两周蓝色杯子的销量有所增加,我不会轻易得出蓝色杯子更好的结论。销售额的突然变化可能是因为人们在开业前几周不知道我们的摊位,直到最近才发现我们的摊位。记住,**实验的目标是了解增量变化的效果。**当我们引入一个大的变化(即开始我们的摊位或彻底改造我们的店面),我们将不稳定性引入我们现有的业务,这将掩盖和/或扭曲我们的实验条件的影响。
在进行实验之前,重要的是建立一个稳定的基线,用于判断我们的增量变化的效果。
为了让我们的例子更具体,假设我们已经经营了一年半的柠檬水摊位。我们在社区中相对知名,但是我们已经没有办法继续发展我们的业务了。在对我们的业务目标进行优先排序并对相关转化指标和比率*进行头脑风暴后,我们决定分析转化指标:
售出的杯子数量/光顾我们摊位的人数。
我生成了一些虚拟数据,代表我们去年的月销售额。我们的业务相对于转换率的稳定性。现在,当我们引入我们的实验条件(改变杯子的颜色)时,我们有了一个可靠的可预测的基线转化率(平均 3.62%),我们可以用它来比较我们的新结果。
作者图片
思考我们转化率的变化
在这一点上,很容易忘记我们的目标指标是转换率,并开始头脑风暴的增量变化,增加售出的杯子数量。使用转换率而非绝对值要求我们将关注点从单一指标扩展到两个相关指标之间的关系,从关注规模扩展到关注规模效率&。
为了提高我们的转换率,我们必须制定一个策略,使售出杯子的数量增长速度快于光顾我们摊位的人数增长速度。改变杯子的颜色或设计可能是一个有趣的商业计划;这是假设我们相信人们驻足我们的摊位主要是为了柠檬水和我们漂亮的摊位,而不是因为杯子的颜色。
从商业角度来看,我们经常读到使用数据和实验来提供可操作的见解。除了我们的基线速率之外,在我们的每个实验条件下设定合理的目标速率也很重要;我们不想对转换率的任何微小变化采取行动。设定目标转换率既是一门科学,也是一门艺术,可以基于过去的数据和直观的商业感觉。在我们的柠檬水的例子中,我们可以说,如果我们的转换率在接下来的几个月里是 4.12%,增加了 0.5%,我们将改变杯子的颜色。
结论:
总结一下我们在柠檬水示例中取得的成果:
- 我们定义了我们的商业目标:增加售出的杯子
2.我们定义了我们的转换指标和转换率:售出的杯子&售出的杯子/客流量
3.我们开发了一个可控的增量变化,它将(假设地)影响我们的结果
4.我们建立了一个比较稳定的基线。
如果我们的转换指标达到了目标,我们就可以在新的条件下开展业务,对吗?不完全是。
到目前为止,你可能已经意识到,我没有在我们的实验中引入任何统计数据!在这一点上,可能还不完全清楚为什么我们需要统计数据来验证我们的假设和完成我们的实验。尽管如此,在处理这种不确定性时,我们需要一种量化决策过程的方法;我们用统计学来量化实验证据的强度。在本系列的下一篇文章中,我将开始介绍基本统计概念和检验统计的思想,因为它们适用于我们的实验设计。
[1]:莫妮卡·瓦希。(2020).实验设计的数据科学。领英学习。https://www . LinkedIn . com/learning/the-data-science-of-experimental-design
理解 Power BI 中的显式和隐式度量
检查 Power BI 数据模型中隐式和显式度量之间的重要差异,以及为什么您应该考虑避免更简单的方法
Alex Andrews 在 Pexels.com 拍摄的照片
对于新的 Power BI 用户来说,最具挑战性的概念之一是理解度量和计算列之间的差异。或者说得更具体一点,概念本身并不是什么大问题,但 Power BI 菜鸟最让人望而生畏的,就是要明白什么时候用哪个。
因为我已经写了计算列和度量值的用例,并且简要解释了当您想要使用其中每一个时的不同场景,所以在最近的数据之星会议上,我有一个问题要解释显式和隐式度量值之间的区别。我已经在这里简短地回答了,但是我答应为这个话题写一篇单独的文章。
因此,在本文中,我将只关注度量,并尝试深入解释显式和隐式度量之间的差异。
隐性的,显性的……什么?!
好了,你已经听说过功率 BI 中的度量,就是这样。现在究竟什么是隐性措施?!还是露骨?不要惊慌,继续阅读,我向你保证,在这篇文章结束时,你会对这两者有很好的理解,以及它们的主要优点和缺点是什么。
隐性措施—【感谢】动力匕
首先,我知道我们都喜欢自动为我们创造的东西,Power BI 在这方面做得很好。Power BI 为我们做的事情之一是创建隐式度量。
正如您在上面的插图中所注意到的,Power BI 识别了我们的数据模型中的数值字段,并自动用适马符号对它们进行了标记。这意味着,一旦将这些列值拖到报表视图中,就会对它们进行汇总。
让我们看看这在现实中是如何工作的:
我将我的 productID 列拖到表 visual 中,我看到 Power BI 自动应用了某种聚合。现在,您可以定义要应用于特定列的聚合类型,或者根本不进行聚合(提示:选择不汇总选项):
这里,Power BI 对我的 productID 列执行了 Count aggregate 函数。看着上面的图片,人们可以(太)容易地得出结论,当使用隐式度量时有很大的灵活性-您可以在一组预定义的聚合之间进行选择,甚至包括花哨的统计计算,如标准差、方差或中位数…所有这些,只需单击一下!
那么,既然(几乎)一切都已经为我们预烤好了,为什么还要有人费心去写 DAX 呢?
在我向您展示为什么使用隐式度量会回来困扰您之前,让我简单地概述一下隐式度量如何在您的数据模型中与非数值字段一起工作。
我的文本字段 InteractionType 可以总结为四种不同的方式:First、Last、Count (Distinct)和 Count。当然,它也可以是非汇总的,就像上面的例子一样。
类似地,日期列也提供了自己的一组预定义聚合:
隐性措施的局限性
无论通过使用自动创建的度量来节省时间和精力的可能性看起来多么有吸引力,您都应该尽量避免,因为它有一些明显的缺点。
假设您有一个非加性或半加性的度量,比如产品的单价,或者银行账户余额。您不希望在报告中简单地对这些值求和,因为这不是这些度量的预期行为。因此,如果使用隐式度量,很容易发生您的报告产生意想不到的错误结果。
隐式度量的另一个限制是不能在多个不同的聚合类型中使用它们。假设我既想知道我的客户总数,又想知道独特客户的总数。通过使用隐式度量,我只能选择其中一个选项…
明确的措施=更大的灵活性!
使用 DAX 语言以显式方式编写度量,在开始时需要更多的时间和精力,因为你需要做一些手工工作。但是,你以后会结出果实的,相信我。
回到我们之前的挑战—在我们的报告中显示客户总数和唯一(独特)客户总数可以使用显式方法轻松解决:
Total Customers = COUNT(TableName[CustomerID])
Total Unique Customers = DISTINCTCOUNT(TableName[customerID])
因此,正如您所注意到的,我们使用同一个列作为多个不同度量的引用,以产生期望的结果。
虽然隐式度量可以支持一些非常基本的场景,但是一旦您的报表需要更复杂的计算,您就必须切换到显式度量。
然而,使用显式度量而不是隐式度量的主要优点是它们的 可重用性 。您只需定义一次度量,就可以根据需要多次引用它。
另一个明显的好处是更容易维护数据模型。如果创建基本显式度量,例如:
Sales Amt = SUM(TableName[Sales Amount])
您可以在 20 个不同的衡量标准中使用此衡量标准作为参考(例如,计算毛利润、年同比等。)!如果需要更改任何后台逻辑,只需在一个地方(在基本度量中)进行更改,所有引用的度量将自动应用新的逻辑。
措施—最佳实践
现在,您已经了解了隐式和显式度量之间的区别以及使用后者的明显优势,让我总结一些关于在您的报告中使用度量的最佳实践:
Pexels.com 上永恒幸福的照片
- 不要忘记正确设置度量值的格式 —这意味着,如果您正在处理与金钱相关的值(例如销售额),您可能希望将它们设置为货币格式。与格式保持一致,如果你的数字限制在两位小数,那么在整个报告中坚持使用它
- 一旦您完成了基于特定列的显式度量的创建,您应该在报表 中隐藏该列。这样,您就可以防止对该列的不充分使用(例如,对账户的银行余额进行简单求和)。因此,作为数据建模者,您负责汇总选项
在本例中,我定义了“客户总数”和“唯一客户总数”度量值,所以我不希望有人执行 customerID 的求和。因此,我将隐藏字段列表中的 customerID 列。
- 将您的度量组织到单独的文件夹中 —当您的报表只有几个度量时,这不是问题。但是,当您需要操作数十甚至数百个度量时,事情会变得更加复杂。为了防止这种情况,我总是使用下面的技巧来更好地组织我的度量。默认情况下,该度量将位于您创建它的表中。您可以通过单击该度量来更改它,然后在建模选项卡下,更改该特定度量的主表:
然而,这只是将度量从一个表移动到另一个表,并不能解决问题。为了解决这个问题,我需要创建一个全新的表,只保存我的度量。
在 Home 选项卡下,选择 Enter Data 并创建一个名为 RepMeasures:
单击 Load,您将在模型中看到一个新表。之后,单击您的度量,并在 Home 表下选择 RepMeasures。
最后,只需简单地删除第 1 列,就可以了。
这样,您可以对您的度量进行分离和分组。相信我,这将使您的生活变得更加容易,尤其是当您在报表中创建多个度量时。
结论
正如我已经说过的:我们都喜欢走一条更容易的路来实现我们的目标。这是完全合理的,Power BI 是您在这条道路上的“最好的朋友”。
但是,在选择采用哪种方法时,有许多重要的考虑因素需要考虑。我不想说:千万不要用隐性措施!通过写这篇文章,我只是想指出在使用它们时一些可能的陷阱和限制,以及为什么您仍然应该更喜欢写显式的方法。
感谢阅读!
成为会员,阅读 Medium 上的每一个故事!
订阅这里获取更多有见地的数据文章!
用 Viola-Jones 对象检测框架理解人脸检测
了解最流行的人脸检测框架之一
在我的毕业照中检测到面孔
一.动机
从 Instagram 滤镜到自动驾驶汽车,计算机视觉技术现在已经深深融入了许多人的生活方式。一个重要的计算机视觉应用是让计算机检测图像中的物体的能力。在这些对象中,人脸最受关注,因为它在安全和娱乐方面有许多有用的应用。因此,本文主要关注一个流行的人脸检测框架,称为 Viola-Jones 对象检测框架。
这里的目的是向您提供对框架的理解,以便您可以放心地使用 OpenCV 提供的开源实现。我想帮助您理解幕后发生的事情,并希望让您更加欣赏 OpenCV 这样的库为您处理所有的复杂性。如果你想要一个“从头开始”的实现,可以参考 Anmol Parande 的这个 Python 实现。我也推荐你看看 Ramsri 关于这个话题的视频。
二。概念
由 Paul Viola 和 Michael Jones 早在 2001 年开发的 Viola-Jones 对象检测框架可以快速准确地检测图像中的对象,并且特别适合人脸(Viola & Jones,2001)。尽管年代久远,该框架仍然是人脸检测领域的领军人物,与其 CNN 的许多对应部分不相上下。Viola-Jones 对象检测框架结合了类 Haar 特征、积分图像、AdaBoost 算法和级联分类器的概念,创建了一个快速准确的对象检测系统。因此,为了理解框架,我们首先需要单独理解这些概念,然后弄清楚它们是如何连接在一起形成框架的。
如果您已经了解下面的概念,并且只是想知道这些概念是如何协同工作的,您可以跳到第三部分。
类哈尔特征
图 1:类哈尔特征(上)和如何计算它们(下)。
通常在计算机视觉中,特征是从输入图像中提取的,而不是直接使用它们的强度(RGB 值等)。类似哈尔的特征就是一个例子。其他例子包括方向梯度直方图(HOG)(LBP)等。类哈尔特征由暗区域和亮区域组成。它通过取亮区域的强度之和并减去暗区域的强度之和来产生单个值。有许多不同类型的 Haar-like 特征,但是 Viola-Jones 对象检测框架只使用图 1 中的那些。不同类型的 Haar-like 特征让我们从图像中提取有用的信息,例如边缘、直线和对角线,我们可以用它们来识别对象(即人脸)。
整体图像
图 2:原始图像到积分图像的转换(上)以及如何使用积分图像计算矩形区域(下)
积分图像是图像的中间表示,其中积分图像上的位置值( x ,y)等于原始图像上( x 【T7, y )位置上方和左侧(包括两端)的像素之和(Viola & Jones,2001)。这种中间表示是必不可少的,因为它允许快速计算矩形区域。为了说明,图 3 示出了红色区域 D 的总和可以在恒定时间内计算,而不是必须遍历该区域中的所有像素。由于提取 Haar-like 特征的过程包括计算暗/亮矩形区域的总和,积分图像的引入大大减少了完成这项任务所需的时间。
AdaBoost 算法
图 3:使用 AdaBoost 算法的目的是从 n 个特征中提取最佳特征。注意:最佳特征也称为弱分类器。
AdaBoost(自适应增强)算法是一种机器学习算法,用于在所有可用特征中选择最佳特征子集。该算法的输出是一个分类器(也称为预测函数、假设函数),称为*“强分类器”。强分类器由【弱分类器】*(最佳特征)的线性组合组成。从高层次来看,为了找到这些弱分类器,该算法运行 T 次迭代,其中 T 是要找到的弱分类器的数量,由您设置。在每次迭代中,该算法会找出所有特征的错误率,然后选择该次迭代中错误率最低的特征。
你可以参考 StatQuest 的这个有趣的视频来更详细地了解 AdaBoost 算法
级联分类器
图 4:级联分类器
级联分类器是一种多级分类器,可以快速准确地进行检测。每个阶段由 AdaBoost 算法产生的强分类器组成。从一个阶段到另一个阶段,强分类器中的弱分类器的数量增加。输入是按顺序(逐级)评估的。如果用于特定阶段的分类器输出否定结果,则输入被立即丢弃。如果输出为正,则输入被转发到下一级。根据 Viola & Jones (2001),这种多阶段方法允许构建更简单的分类器,然后可以用于快速拒绝大多数负面(非面部)输入,同时在正面(面部)输入上花费更多时间。
三。基于 Viola-Jones 目标检测框架的人脸检测
在学习了 Viola-Jones 对象检测框架中使用的主要概念后,您现在可以学习这些概念是如何协同工作的了。该框架包括两个阶段:培训和测试/应用。让我们一个一个来看。
培养
这一阶段的目标是为一个人脸生成一个级联分类器,它能够准确地对人脸进行分类,并快速丢弃非人脸。为此,您必须首先准备好训练数据,然后通过对该训练数据使用改进的 AdaBoost 算法来构建级联分类器。
- 数据准备
概念:积分图像+类哈尔特征
图 5:数据准备过程
假设你已经有了一个由正样本(人脸)和负样本(非人脸)组成的训练集,第一步就是从那些样本图像中提取特征。Viola & Jones (2001)推荐图像为 24 x 24。由于每种类型的 Haar-like 特征在 24×24 窗口中可以具有不同的大小和位置,因此可以提取超过 160,000 个 Haar-like 特征。尽管如此,在这个阶段,需要计算所有 160,000+ Haar-like 特征。幸运的是,积分图像的引入有助于加速这一过程。图 5 展示了数据准备的整个过程。
2。用改进的 AdaBoost 算法构建级联分类器
图 6:构建级联分类器的过程
概念:AdaBoost 算法+级联分类器。
可以想象,直接使用全部 160,000+个特征,计算效率很低。Viola & Jones (2001)提出了两种解决方案。首先,使用 AdaBoost 算法将特征数量减少到只有少数有用的特征。其次,将剩余的特性分成几个阶段,并以逐阶段(级联)的方式评估每个输入。Viola & Jones (2001)设计了 AdaBoost 算法的修改版本,以便能够训练级联分类器。图 6 显示了 Ramsri 在其视频(Ramsri,2012)中提供的算法的简化版本。
在他们的论文中,Viola & Jones (2001)提到他们的级联分类器有 38 个阶段(38 个强分类器),由超过 6000 个特征组成。
测试/应用
图 7:Viola-Jones 对象检测框架中的滑动窗口检测过程
想象一下,我们需要检测上图中的人脸。Viola & Jones (2001)使用滑动窗口方法,其中不同比例的窗口在整个图像上滑动。比例因子和移动步长是供您决定的参数。所以对于上图,有 m 子窗口来评估。对于子窗口 i ,框架将该子窗口的图像大小调整为 24 x 24 的基本大小(以匹配训练数据),将其转换为完整的图像,并通过在训练阶段产生的级联分类器进行馈送。如果子窗口通过级联分类器中的所有阶段,则检测到人脸。
四。结论
总之,您已经了解了 Viola-Jones 对象检测框架及其在人脸检测中的应用。今天的许多技术都受益于保罗·维奥拉和迈克尔·琼斯的工作。通过理解框架如何工作,你可以自信地实现你自己的工作版本,或者使用 OpenCV 提供的开源实现。我希望我的解释能让你朝着那个方向前进,并促使你使用这个令人敬畏的框架创造出令人惊叹的技术。
喜欢这篇文章并想表达您的支持?关注我或者给我买咖啡
参考
岑,K. (2016)。Viola-Jones 实时人脸检测器的研究。检索自https://web . Stanford . edu/class/cs 231 a/prev _ projects _ 2016/cs 231 a _ final _ report . pdf
h .詹森(2008 年)。实现 Viola-Jones 人脸检测算法。DTU 丹麦技术大学博士论文。检索自https://pdfs . semantic scholar . org/40 B1/0e 330 a 5511 a 6a 45 f 42 c8 b 86 da 222504 c 717 f . pdf
Mordvintsev 和 k . Abid(2013 年)。基于哈尔级联的人脸检测。 OpenCV-Python 教程。检索自https://opencv-python-tutro als . readthedocs . io/en/latest/py _ tutorials/py _ obj detect/py _ face _ detection/py _ face _ detection . html
帕帕乔治欧,C. P .,柳文欢,m .,&波焦,T. (1998)。一个通用的目标检测框架。*第六届国际计算机视觉会议。*555–562。doi:101109/iccv . 1998.710772
拉姆斯瑞。(2012 年 9 月 16 日)。 Viola Jones 人脸检测与跟踪讲解。从 https://youtu.be/WfdYYNamHZ8取回
维奥拉,p .和琼斯,M. (2001)。使用简单特征的增强级联的快速对象检测。2001 年 IEEE 计算机学会计算机视觉和模式识别会议论文集,1 ,I-511 — I-518。doi: 10.1109/CVPR
理解变脸者:一个新的变脸模型
简单而完整的解释
如今,深度学习可以在图像合成和处理领域产生惊人的结果。我们已经看到了让虚构人物产生幻觉的网站、展示名人说出他们从未说过的话的视频和让人们跳舞的工具,这些都有足够的真实性来愚弄我们大多数人。其中一个新颖的壮举是 FaceShifter [1],这是一个深度学习模型,可以交换图像中的人脸,性能超过最先进的技术。在本文中,我们将了解它是如何工作的。
问题陈述
我们有一个源人脸图像 Xₛ和一个目标人脸图像 Xₜ,我们希望生成一个新的人脸图像 Yₛₜ,它具有 Xₜ的属性(姿势、灯光、眼镜等),但具有 Xₛ.人的身份图 1 总结了这一问题陈述。现在,我们继续解释这个模型。
图一。换脸的问题陈述。显示的结果来自 FaceShifter 模型。改编自[1]。
变脸者模型
FaceShifter 由两个网络组成,分别叫做 AEI-Net 和 HEAR-Net。AEI-Net 产生一个初步的面部交换结果,而 HEAR-Net 对这个结果进行提炼。让我们打破这个管道。
AEI-Net
AEI-Net 是“自适应嵌入式集成网络”的缩写。这是因为 AEI-Net 由 3 个子网络组成:
- 身份编码器:将 Xₛ嵌入到描述图像中人脸身份的空间中的编码器。
- 多级属性编码器:一种编码器,用于将 Xₜ嵌入到一个空间中,该空间描述了我们交换人脸时想要保留的属性。
- AAD 生成器:一个生成器,它整合了前面两个子网络的输出,生成了与 Xₛ.身份交换的 Xₜ的脸
AEI-Net 如图 2 所示。让我们充实它的细节。
图二。AEI-Net 的体系结构。改编自[1]。
身份编码器
这个子网络将源图像 Xₛ投影到低维特征空间。输出只是一个向量,我们称之为 zᵢ,如图 3 所示。这个向量编码了 Xₛ人脸的身份,这意味着它应该提取我们人类用来区分不同人的人脸的特征,如他们眼睛的形状,眼睛和嘴巴之间的距离,嘴巴的曲率等等。
作者使用预先训练好的编码器。他们使用了一个经过人脸识别训练的网络。这有望满足我们的要求,因为区分人脸的网络必须提取与身份相关的特征。
图 3。身份网络。改编自[1]。
多级属性编码器
这个子网对目标图像 Xₜ.进行编码它产生多个矢量,每个矢量以不同的空间分辨率描述 Xₜ的属性,特别是 8 个矢量,称为 zₐ.这里的属性指的是目标图像中人脸的配置,如人脸的姿势、轮廓、面部表情、发型、肤色、背景、场景照明等。如图 4 所示,它是一个具有 U 形网络结构的 ConvNet,输出向量只是上扩/解码部分中每一级的特征映射。请注意,这个子网不是预先训练的。
图 4。多级属性编码器体系结构。改编自[1]。
将 Xₜ表示为多个嵌入是必要的,因为在单个空间分辨率下使用单个嵌入将导致产生具有交换面的所需输出图像所需的信息丢失(即,有太多我们想要从 Xₜ保留的精细细节使得压缩图像不可行)。这在作者进行的消融研究中很明显,他们试图仅使用前 3 个 zₐ嵌入而不是 8 个来表示 Xₜ,这导致了图 5 中看到的更模糊的输出。
图 5。使用多个嵌入来表示目标的效果。如果我们使用前 3 个 zₐ嵌入,则输出是压缩的,当我们使用全部 8 个时,输出是 AEI 网。改编自[1]。
AAD 发电机
AAD Generator 是“自适应注意反规范化生成器”的首字母缩写。它按照增加空间分辨率的顺序综合前两个子网络的输出,以产生 AEI-Net 的最终输出。它通过堆叠一个名为 AAD Resblock 的新块来实现,如图 6 所示。
图 6。左图为 AAD 发生器架构,右图为 AAD ResBlock。改编自[1]。
这个模块的新部分是 AAD 层。让我们把它分成 3 个部分,如图 7 所示。第 1 部分从较高的层面告诉我们如何编辑输入要素地图 hᵢₙ,使其在属性方面更像 Xₜ。具体地说,它输出两个与 hᵢₙ大小相同的张量;一个包含将与 hᵢₙ中的每个像元相乘的缩放值,另一个包含移位值。第 1 部分图层的输入是属性向量之一。同样,第 2 部分将告诉我们如何编辑 hᵢₙ的特征地图,使其在身份上更像 Xₛ。
图 7。AAD 层的架构。改编自[1]。
第 3 部分的任务是选择我们应该在每个单元/像素上听哪个部分(2 或 3)。例如,在与嘴相关的细胞/像素处,这个网络会告诉我们多听第二部分,因为嘴与身份更相关。这在图 8 所示的实验中得到了实证。
图 8。展示 AAD 层第三部分所学内容的实验。右图显示了整个 AAD 生成器在不同步长/空间分辨率下的第 3 部分输出。明亮的区域表示我们应该听身份(即第二部分)的细胞,黑色区域用于听第一部分。注意,在高空间分辨率下,我们主要听第一部分。改编自[1]。
因此,AAD 生成器将能够一步一步地构建最终图像,其中在每一步中,在给定身份和属性编码的情况下,它决定放大当前特征地图的最佳方式。
现在,我们有一个网络,AEI 网,可以嵌入 Xₛ和 Xₜ,并以一种实现我们目标的方式整合他们。我们将把 AEI 网的输出称为 Yₛₜ*.
培训损失
一般来说,损失是我们希望网络做什么的数学公式。训练 AEI-Net 有 4 个损失:
- 我们希望它输出一个真实的人脸,所以我们会像任何一个 GAN 一样有一个对抗性的损失。
- 我们希望生成的人脸具有 Xₛ.的身份我们拥有的唯一代表同一性的数学物体是 zᵢ.所以,这个目标可以用下面的损失来表示:
3.我们希望输出具有 Xₜ.的属性为此的损失是:
4.作者基于以下想法增加了另一个损失,即如果 Xₜ和 Xₛ实际上是相同的图像,网络应该输出 Xₜ:
我相信这最后的损失是必要的,以推动 zₐ实际编码属性,因为它不像 zᵢ.预先训练据猜测,如果没有它,AEI 网络可能会忽略 Xₜ,让 zₐ只生产零。
我们的总损失只是以前损失的加权总和。
听觉网络
AEI-Net 是一个完整的网络,可以进行面部交换。然而,它在保留遮挡方面不够好。具体来说,只要目标图像中有遮挡部分面部的项目(如眼镜、帽子、头发或手)应该出现在最终输出中,AEI-Net 就会将其删除。这样的项目应该仍然存在,因为它与将要改变的身份无关。因此,作者实现了一个称为“启发式错误确认细化网络”的附加网络,它具有恢复这种遮挡的单一工作。
他们注意到,当他们把 Xₛ和 Xₜ作为 AEI 网络的输入时,同样的图像仍然不能保持如图 9 所示的遮挡。
图 9。当我们输入与 Xₛ和 Xₜ.相同的图像时,AEI 网络的输出注意头巾上的链子是如何在输出中丢失的。改编自[1]。
因此,他们没有把 Yₛₜ和 Xₜ作为听觉网络的输入,而是把 Yₛₜ & (Xₜ -Yₜₜ*)作为听觉网络的输入,其中 Yₜₜ*是 AEI 网络的输出,而 Xₛ和 Xₜ是同一个图像。这将使听觉网络指向遮挡未被保留的像素。在图 10 中可以看到听觉网络。
图 10。听觉网络的结构。改编自[1]。
培训损失
HEAR-Net 的损失是:
- 保留身份的损失:
2.没有改变 Yₛₜ*的损失:
3.一个建立在这样一个事实上的损失,如果 Xₛ和 Xₜ是相同的图像,那么听觉网络的输出应该是 Xₜ:
总损失是这些损失的总和。
结果
变脸者的结果是惊人的。在图 11 中,您可以找到一些它对数据集之外的图像(例如来自野外的图像)的泛化性能的例子。请注意它是如何在不同的艰苦条件下正确工作的。
图 11。结果证明了 FaceShifter 的卓越性能。改编自[1]。
参考
[1] 李,鲍,杨,陈,文,人脸变换:实现高逼真度和遮挡感知的人脸交换(2019),Arxiv .
了解快速 R-CNN 和用于目标检测的更快 R-CNN。
让我们详细了解这些基于区域提议的卷积神经网络的最新技术。
使用 Canva 设计
我在上一篇文章中已经详细讨论了对象检测和 R-CNN。你可以在这里阅读以获得更好的直觉。
人们需要了解这些用于对象检测的最先进的模型,这些模型随着时间的推移而发展,现在被认为是当今更强大的网络的强大基础。
让我们进入主题。
因此,使用 R-CNN 版本进行对象检测存在一些缺点。它们是:
- 它消耗大量的时间、存储和计算能力。
- 它有一个复杂的多阶段训练管道(3 个阶段——对数损失、SVM 和 BBox 回归器的 L2 损失)。
在 R-CNN 一年后开发的快速 R-CNN ,非常有效地解决了这些问题,在测试时间内比 R-CNN 快 146 倍。
快速 R-CNN
R-CNN 中使用的选择性搜索为每个图像生成大约 2000 个区域提议,并且每个区域提议被馈送到基础网络架构。这意味着,对于单个图像,将有 2000 次向前传递。考虑用 1000 幅图像的数据集来训练网络。那将是 2M 总共**(2000 * 1000)次向前传球**这是巨大的!****
所以,快速 R-CNN 是基于一个想法,
为什么不考虑每张图片运行一次 CNN,然后找到一种方法在 2000 个提案中共享计算结果?
在快速 R-CNN 中,图像只被传送到底层 CNN 一次,而选择性搜索则照常运行。然后,通过选择性搜索生成的这些区域提议被投影到由 CNN 生成的特征地图上。这个过程叫做 ROI 投影(感兴趣区域)。
在开始 ROI 投影之前,需要了解一下子采样率**。它是特征图尺寸与图像原始尺寸的比值。举个例子,**
使用 Canva 设计
ROI 投影的思想是我们从 ROI 提议中获得边界框的坐标,并且我们需要通过相对于二次采样比率投影 ROI 提议来将它们投影到特征图上。
使用 Canva 设计
上图看起来有点复杂,但事实并非如此。考虑一个大小为 688 x 920 的图像被传送到 CNN,CNN 的二次采样率是 T2 的 1/16。所得到的特征图的大小导致了43×58**(688/16x920/16)。类似地,ROI 提议的大小320×128,在二次采样之后导致20×8。通常,边界框的坐标以两种方式表示。**
- 盒子中点的坐标(X,Y),宽度,高度。[X,Y,W,H]
- 边界框的对边坐标。[X1,Y1,X2,Y2]
这里,我们考虑第一个符号。从图中可以看出,ROI 建议的中点是 (340,450) ,这导致了特征图中的 (21,28) 。以这种方式,ROI 提议被投影到特征图上。
在网络中使用固定大小的图像的主要原因是因为完全连接的层。这些期望固定大小的向量,因为分配了固定的权重。这是网络不接受可变尺寸图像的主要原因。为了解决这个问题,Fast R-CNN 的作者想出了一个想法 ROI Pooling 其中特征图上的 ROI 投影被分成固定的维度。
使用 Canva 设计
如上所示,将红框视为 8 x 8 特征图上的 ROI 投影。假设我们需要一个 2×2 尺寸的输出。那么如果有奇数个维度,就不可能将它们等分。在这种情况下,我们将四舍五入到最接近的值。如图所示,假设我们得到一个 5 x 4 大小的提案。为了将其转换成固定尺寸的盒子,我们将高度和宽度除以所需的高度和宽度,即 5/2×4/2 = 2.5×2。对它们取整,任何一种方法都给出 2 x 2 和 3 x 2 。然后对每个块进行最大池化,并计算输出。这样,对于任何大小可变的区域建议,我们都可以获得固定维度的输出。所以现在,输入的大小没有限制。
使用 Canva 设计
因为还涉及到第三个维度,即特征地图中的深度,你可以这样想象,就像在一副卡片上戳一个洞。如上所述,您必须以相同的方式将 ROI Pool 应用于每个切片。
使用 Canva 设计
在 Fast R-CNN 中,我们使用一个 7 x 7 的网格进行池化。我们还去掉了最后一个池层。ROI 合并应用于最后一个卷积层的特征图。上面的例子是针对 AlexNet 架构的。
使用 Canva 设计
RCNN 的变化是,他们已经摆脱了 SVM 分类器,而是使用 Softmax。用于 Bbox 的损失函数是平滑 L1 损失。快速 RCNN 的结果是速度的指数增长。在准确性方面,没有太大的改进。这种架构在 PASCAL VOC 07 数据集上的准确率为 66.9% 。这里的总损失是分类损失和回归损失的总和,并且网络用单个损失反向传播,由此我们可以摆脱多阶段训练问题。
结果:
使用 Canva 设计
更快的 R-CNN
即使有了所有这些进步,在快速 R-CNN 过程中仍然存在一个剩余的瓶颈,即区域提议器。众所周知,检测物体的第一步是在物体周围生成一组潜在的包围盒。在快速 R-CNN 中,使用选择性搜索创建区域提议,发现一个相当慢的过程是整个对象检测过程的瓶颈。
因此,我们需要一种更好的技术,它给出少于 2000 个区域建议,比选择性搜索更快,与选择性搜索一样准确或更好,并且应该能够提出具有不同纵横比和比例的重叠 ROI。
从快速 R-CNN,我们知道区域提议依赖于已经用 CNN 的前向传递计算的图像的特征。
那么,我们为什么不将 CNN 的结果重新用于地区提案,而不是运行一个单独的选择性搜索算法呢?
首先,让我们了解不同纵横比和比例的重叠 ROI 的概念。
使用 Canva 设计
从图像中,我们看到许多物体相互重叠。我们看到一辆汽车,一辆自行车,一个人拿着一台电视机,电视机里还有一只狗。选择性搜索可以解决这个问题,但我们最终会得到大量的 ROI。我们需要想出一个能有效解决这个问题的主意。
如果我们在不同的物体周围画边界框,它看起来是这样的。
使用 Canva 设计
实现这个有点复杂,但是锚盒的想法让它变得简单。我们来了解一下这些锚盒是什么意思。
一般来说,对象可以放在正方形的盒子里,也可以放在长方形的盒子里,或者放在长方形的盒子里。概括地说,他们可以说是大,小,或中等大小。因此,通过实验发现,使用 3 种不同比例和 3 种不同纵横比的盒子可以检测到图像中的任何对象。
使用 Canva 设计
如果我们考虑上面的重叠图像,很有可能组合所有这些框,如上所示,会给你所有的重叠建议,但不是很准确。物体的主要部分将被覆盖。这可能是一种可以用来解决我们替换区域提议者的目的的技术。我们可以考虑一些替代方案,例如:
1.移除选择性搜索并在特征地图上应用滑动窗口。但有了这个,我们就能检测到大多数单一尺度的物体。
2.为了处理多种尺度,我们必须在输入端使用影像金字塔。但是使用 5 种不同比例的图像(几乎每个物体都可以被检测到)会使网络变慢 4 倍。
3.另一种选择是在特征图上使用不同大小的滑动窗口(如上图所示,9 个)。这个概念被称为特征金字塔。这包括在特征地图上使用 9 个不同大小的滑动窗口。
但是对于一个 600x1000 的图像,我们会有一个大约 40x60 的特征图。并且在每个位置使用 9 个不同的滑动窗口,对于特征图中的所有 40x60 值,我们最终得到 40x60x9 =~20,000 个建议。与仅提供 2000 个建议的选择性搜索相比,我们的建议几乎多了 10 倍。这将在计算上更加昂贵,并且还会有更多的误报。
4.考虑使用简单的 CNN BBox 回归器来代替选择性搜索,以获得图像的近似区域建议,该区域建议可以进一步馈送到底层的快速 R-CNN 架构。这是更快的 R-CNN 背后的核心思想。让我们再深入一点。
使用 Canva 设计
这个为我们提供近似 ROI 的网络被称为区域建议网络(RPN)** 。那么,我们如何设计这种 RPN,使其能够给出可以进一步处理的近似 ROI 呢?**
这里的想法是我们利用上面讨论的 9 个盒子。这些被称为锚盒或参考盒。在图像上的任何一点,我们都会得到大约 9 个不同比例和长宽比的不同边界框。
在特征图上使用大小为 3×3 的滑动窗口,并且在每个滑动窗口的顶部,我们将这 9 个框放置在中心,以检测各个窗口中存在的任何对象。让我们放大 RPN。
使用 Canva 设计
这就是我们如何从图像的所有区域得到不同的区域建议。9x 代表,该部分在 9 个不同的锚中重复 9 次。由此,我们得到所需的 ROI。但这里的问题是,我们又一次得到了大量的提议。
考虑同样的 40x60 特征地图的例子,我们再次避开 20K 建议(40 x 60 x 9)。这些盒子中最多有一个没有任何对象,这样的盒子应该被删除。为此,我们使用一个二元分类器**来预测盒子是否包含前景或任何背景。这样,所有包含背景的盒子都被去掉了。我们假设大概有 15K 的背景盒。我们还剩下 5000 多个盒子。由于分类在最后包括 max 层的 S ,我们得到每个框的置信度得分,指示该框内存在对象的概率。通过这种方式,我们可以根据置信度得分对盒子进行排序,并将前 n 个提议用作 ROI。n 可以相应地调整。**
此外,请注意,由于我们在 RPN 中不使用 ROI 池层,我们在那里使用卷积运算,其作用类似于滑动窗口,这里的 FC 层由卷积运算代替,类似于 R-CNN 的前身 Overfeat 的卷积运算。
使用 Canva 设计
因此,首先用一个 3×3 的窗口或过滤器对特征图进行卷积,这为我们提供了所需的锚点,然后对每个分类和回归部分进行 1×1 卷积。
使用 Canva 设计
总的来说,这是更快的 R-CNN 的架构。
更快的 R-CNN 是用 4 个损耗联合训练的:
- RPN 分类(对象前景/背景)
- RPN 回归(锚点→ ROI)
- 快速 RCNN 分类(对象类)。
- 快速 RCNN 回归(ROI →边界框)
结果:
使用 Canva 设计
结论
希望这能理清你对越来越快 R-CNN 的理解。在 2015 年 12 月,更快的 RCNN 与主干网络 as ResNet -101 一起赢得了 COCO 物体检测竞赛,被认为是迄今为止最先进的物体检测模型。希望你今天学到了新东西!我将在接下来的文章中讨论更多关于 Mask R-CNN 和 Detectron2 的内容。
如果你想取得联系,请在 LinkedIn 上联系我。
如果你想了解更多关于交叉熵的知识,你可以在这里阅读我以前的文章。
参考
- https://arxiv.org/pdf/1506.01497.pdf
- https://arxiv.org/pdf/1504.08083.pdf
- http://cs 231n . Stanford . edu/slides/2017/cs 231n _ 2017 _ lecture 11 . pdf
理解用于目标检测的快速 RCNN
快速递归神经网络综述
fast-RCNN 论文强调了 SPPNet 和 RCNN 的缺点,并建立了一个相对快速和准确的模型
瑞士伯尔尼——作者图片
Fast-RCNN 模型是通过克服 SPPNet 和 RCNN 的缺点而构建的。我已经写了关于这两个方面的文章,您应该在继续之前看一下:
R-CNN 的架构细节以及模型设计和论文的要点。
towardsdatascience.com](/understanding-regions-with-cnn-features-r-cnn-ec69c15f8ea7) [## 了解用于对象检测和分类的 SPPNet
SPPNet 允许可变大小的 CNN 输入图像,并可用于分类和对象检测
towardsdatascience.com](/understanding-sppnet-for-object-detection-and-classification-682d6d2bdfb)
该博客与上述两个博客的结构相同,即学生和教师之间的对话。
教师
我们之前看过 R-CNN 和 SPPNet。尽管这些模型表现得非常好,但它们都有一些缺点。以下是两种架构共有的缺点:
- **多阶段训练:**首先在 ImageNet(预训练权重 us)上训练分类模型,然后针对检测数据集进行微调。在微调之后,softmax 被一个用于对象检测任务(在硬挖掘的数据上进行训练)的 one-vs-rest 分类器所取代。通过向最后一个池化图层的要素添加边界框回归器来提高性能。这是一个多阶段的过程,培训是一步一步进行的。
- **高空间和时间复杂度:**在微调网络之后,并且在训练 SVM 和包围盒回归器之前,将特征缓存到磁盘以避免重复计算。生成这些特性需要大量时间,存储这些特性也需要数百 GB 的空间。
spp net 特有的缺点:
- **低效微调卷积层:**与 R-CNN 不同,SPP 层很难更新它之前卷积层的权重。避免卷积层的微调会妨碍模型的性能。
所有上述缺点都在 Fast-RCNN 论文中得到解决。顾名思义,它是 RCNN 的一个相对快速的版本,并且利用了 SPPNet 的一些架构细节。
学生
R-CNN 论文中显示的深入分析和 SPPNet 层中引入的新颖 SPP 层让我非常惊讶,以至于我没有注意到任何这些缺点。您能解释一下 Fast-RCNN 中使用的模型架构吗?
教师
作者在 Fast-RCNN 论文中分析了三组模型:
- 小号(S): 卡芬内模型
- VGG _ 美国有线电视新闻网 _M_1024 (M): 与卡芬内相似的型号,但更宽
- VGG16 (L): 非常深的 VGG-16
我们将把我们的讨论限制在 VGG-16(预先在 ImageNet 上训练过),这是他们最深的网络。
Fast-RCNN 架构—论文
输入图像被发送到 VGG-16 并被处理直到最后的卷积层(没有最后的汇集层)。并且在这之后,图像被发送到小说的感兴趣区域(RoI) 池层。该池图层始终为最后一个卷积图层输出的每个要素地图输出一个 7 x 7 的地图。这个 7 x 7 的地图是通过池化产生的,其中窗口大小根据输入图像而改变。顺便说一句,来自该图的展平特征产生了与 VGG-16 的预训练 FC-6 层所期望的相同大小的特征向量。然而,最后的 1000 路 softmax 层被替换为 21 路 Softmax(与 RCNN 和 SPPNet 情况下的 SVM 不同)。另外对于边界框回归器,分支从最后一个 FC-7 层开始,而不是卷积层特征图。
注意:RoI pooling 层只是 SPP 层的特例,其中只使用了一个金字塔等级。在这种情况下(7 x 7)。此外,每个子窗口和步距的计算来自 SPPNet 论文。
学生
你上面提到的一个缺点是,**SPP 层不能有效地反向传播。请你解释一下这个问题是如何解决的?**此外,这种架构如何解决空间和时间复杂性等其他问题?
教师
当区域提议来自不同图像时,反向传播在 SPP 层变得无效。然而,他们提出了一种微调网络的有效方法。使用 N=2 个输入图像,并且对于每个图像,他们对每个图像采样 R=128 个 RoI。此外,他们用地面真实边界框拍摄 25% IoU 大于 0.5 的前景图像。为 IoU 与地面真值箱之间的间隔[0.1,0.5];这些建议被视为背景。提交人声称:
较低的阈值 0.1 似乎是硬示例挖掘的启发
**注意:**通过 RoI 合并层的反向传播具有与任何正常最大合并层类似的实现。作者已经用数学方法描述过了。更简单的理解,参考这个答案。
既然我们已经看到了反向传播在这个网络中是如何发生的,那么让我们也来看看多阶段训练的问题是如何处理的。作者没有单独训练,而是将包围盒回归器和 softmax 层一起训练。他们将这个损失函数命名为多任务损失函数。
多任务损失函数—按作者分类的图像
在上图中:
- 类预测§: 每个 RoI 的离散概率分布[p = (p0,p1,p2 … pk)](包含 k+1 个类,其中 k = 0 为背景类)
- 类别标签(u): 是正确的类别
- 每次损失的权重(λ): 该值始终等于 1
- 艾弗森括号函数[u ≥ 1]: 这个赋值给其中一个类不是背景,否则为零。
- 预测边界框标签(t): t = (tx,ty,tw,th)给出所选 RoI 图像中 u 中每个类别的预测边界框元组。
- 基本事实包围盒标签(v): v = (vx,vy,vw,vh)给出了 u 中正确类的相应基本事实包围盒。
口头上,交叉熵损失用于训练最后 21 路 softmax 层,而 smoothL1 损失处理为 84 回归单元处理包围盒定位而添加的密集层的训练。这两个损失的总和用于微调剩余的网络,这与新的 softmax 和回归层的训练一起发生。
为了证实这种新的训练方法不会妨碍表演,本文给出了以下分析。
作者编辑的论文中的多任务训练分析
黄色框表示在训练或测试时没有边界框回归量的训练,而红色框表示使用多任务损失函数进行训练和微调后的结果。剩下的两列不言自明。需要注意的关键点是,使用这种多任务损失可以改善结果。
学生
他们使用的损失函数确实改善了 Pascal VOC 2007 上的地图。那么,是不是由于这种多任务训练,避免了缓存这些特性,从而节省了我们将它们生成并写入磁盘的时间?
教师
是的,这个观察是正确的。此外,作者还提供了一些关于提高速度的更多信息。据观察,将奇异值分解(SVD)应用于 FC 层,将运算分成两个矩阵乘法,并减少了计算时间。
奇异值分解:将一个矩阵分解成三个矩阵,其中一个对角矩阵夹在两个正交矩阵之间。对角矩阵表示特定轴上的方差,并且是降序排列的。因此,从对角矩阵中选择顶部的 t 对角值,意味着选择在输出中贡献最大的值,因为它们具有高方差。(如果你对 SVD 的直觉不熟悉的话可以看看这个系列视频上的 线性代数 然后再查看一下 这个视频 )
SVD 时序分析来自论文
虽然该模型比 RCNN 和 SPPNet 更快,但使用 SVD 可以在 mAP 下降最小的情况下缩短时间。对于上图,**前 1024 个值选自 FC-6 层的 25088 x 4096 矩阵,前 256 个值选自 4096 x 4096 FC-7 层。**下图显示了该型号在速度方面与其他型号相比的表现。
与另一个模型的时间比较— 论文
上图可以总结如下:
- Fast-RCNN 模型的训练速度比 RCNN 快 9 倍,预测速度比 RCNN 快 213 倍
- 快速 RCNN 也比 SPPNet 训练快 3 倍,预测快 10 倍,提高。
学生
该文件是否提供了对他们架构的任何分析?
教师
通过实现前面描述的硬挖掘策略,反向传播变得很容易实现。然而,在深层 VGG-16 网络中哪些层需要微调也进行了探索,并在下面进行了描述。
作者发现,对于 VGG-16,**微调来自 conv3_1 的所有图层显著影响了地图。**微调 Conv2 层时,训练速度下降,微调 conv1 层超过 GPU 内存。然而,训练 Conv 层后的结果显示,与未被训练的层相比,在 mAP (从 61.4%到 66.9%) 中有巨大的跳跃。因此,微调卷积层也变得至关重要,这是 SPPNet 的一个主要缺点。之前讨论的所有结果均从 conv3_1 开始微调。
作者将他们的模型与当代模型进行了比较,快速 RCNN 的性能优于它们。我已经展示了 pascal VOC10 的结果。pascal VOC 2007 和 VOC 2012 的结果可以在论文中看到。
Pascal VOC 2010 的结果— 论文
本文分享的其他一些观察结果如下:
- 作者分析了改变输入网络的建议数量的影响。据观察,增加区域提案并不一定会增加地图。
- 作者还尝试了在多尺度环境中的训练和测试,其中训练的规则保持与 SPPNet(从最接近 224 的尺度中选择的区域建议)的规则相同。他们还使用了与 SPPNet 相同的一套标尺,但将最长的一边修剪到 2000 像素。据观察,虽然精确度有所提高,但单秤处理在速度和精确度之间提供了最佳平衡。
论文中最重要的细节已经讨论过了,但是还是建议看一下论文。在阅读 Fast-RCNN 论文之前,请确保先阅读 RCNN,然后再阅读 SPPNet。
参考
R.Girshick,J. Donahue,T. Darrell,J. Malik,用于精确对象检测和语义分割的丰富特征层次,计算机视觉和模式识别,2014 年
K.何,X 张,s 任,孙军,用于视觉识别的深度卷积网络空间金字塔池,,2014
R.Girshick,快速 R-CNN ,ICCV,2015
理解使用相关矩阵和散点图进行特征提取
世界上的数据非常庞大,需要非常有意识地进行处理,以获得我们希望通过新的数据科学方法实现的任何合理结果。
在处理给定数据集中的大量要素时,本文将讨论一个非常基本且重要的概念。
在 Unsplash 上由 Carlos Muza 拍摄的照片
任何典型的机器学习或深度学习模型都是为了从大量数据中提供单一输出,无论这些数据是结构化的还是非结构化的。这些因素可能在不同的系数和程度上有助于所需的结果。需要根据它们在确定输出时的显著性,并考虑这些因素中的冗余,过滤掉它们。****
在监督学习中,我们知道总有一个输出变量和 n 个输入变量。为了非常清楚地理解这个概念,让我们举一个简单的线性回归问题的例子。
在简单的线性回归模型中,我们最终会从模型中生成一个 y=mx+c 形式的方程,其中 x 是自变量,y 是因变量。由于只有一个变量,y 必须依赖于 x 的值。虽然在实时计算公交车从 A 到 b 的平均速度时,可能很少有其他被忽略的外部因素,如空气阻力。这些因素肯定会对输出产生影响,但意义最小。在这种情况下,我们的常识和经验帮助我们选择因素。因此,我们选择司机给汽车的加速度,忽略空气阻力。但是在我们不知道输入变量对输出的重要性的复杂情况下呢?数学能解决这个难题吗?
是啊!这里就出现了关联的概念。
相关性是一种统计方法,表示两个或多个变量一起波动的程度。简单来说,它告诉我们一个变量对于另一个变量的微小变化有多大的变化。根据变化的方向,它可以取正值、负值和零值。因变量和自变量之间的高相关值表明自变量在确定输出时具有非常高的重要性。在有许多因素的多元回归设置中,必须找到因变量和所有自变量之间的相关性,以建立一个具有更高精度的更可行的模型。人们必须永远记住**更多的特征并不意味着更好的准确性。**如果更多的特征包含任何不相关的特征,从而在我们的模型中产生不必要的噪声,那么这些特征可能会导致精度下降。
两个变量之间的相关性可以通过各种度量来发现,如 皮尔逊 r 相关、肯德尔等级相关、斯皮尔曼等级相关等。
Pearson r 相关性是最广泛使用的相关统计量,用于测量线性相关变量之间的相关程度。任何两个变量 x,y 之间的皮尔逊相关性可通过下式得出:
n-观察次数,I-表示第 I 次观察
让我们考虑一下关于纽约、加利福尼亚和佛罗里达的新创业公司的数据集 50_Strartups。数据集中使用的变量是利润、R&D 支出、管理支出和营销支出。这里利润是被预测的因变量。
让我们首先对每个独立变量分别应用线性回归,以直观地显示与独立变量的相关性。
从散点图中,我们可以看到,R&D 支出和利润具有非常高的相关性,因此,与 R&D 支出相比,预测产量和营销支出与利润的相关性较低,具有更大的意义。
但是,管理和利润之间的分散表明,它们之间的相关性非常小,最终可能会在预测过程中产生噪声。因此,为了获得更好的结果,我们可以在模型中排除这个特性。
这个过程消除了我们模型中无关紧要和不相关的特性。但是,冗余功能怎么办?
冗余特征:虽然有些特征与我们的目标变量高度相关,但它们可能是冗余的。任何两个自变量如果高度相关,则被认为是冗余的。这造成了不必要的时间和空间浪费。甚至两个变量之间的冗余度也可以通过相关性找到。
注:因变量和自变量之间的高相关性是理想的,而两个自变量之间的高相关性是不理想的。
上面两张图显示了独立变量之间的相关性。我们可以在第一张图中看到较高的相关性,而在第二张图中看到非常低的相关性。这意味着我们可以排除第一张图中两个特征中的任何一个,因为两个独立变量之间的相关性会导致冗余。但是要去掉哪一个呢?答案很简单。与目标变量具有更高相关性的变量保留,而另一个被移除。
确定变量之间的相关性:
df = pd.DataFrame(data,
columns=['R&D Spend','Administration','Marketing Spend','Profit'])
corrMatrix = df.corr()
print (corrMatrix)
输出:输出显示一个 2*2 矩阵,显示所有变量之间的 Pearson r 相关性。
数据集中所有变量之间的相关性。
最后,基于它们的 r2 分数比较各种多元回归模型。
通过选择特征的组合来评分。
从实验分数中,我们观察到:
->相关性低的自变量导致 r2 得分较低。(例如:仅管理)
->相关性较高的变量在我们的模型中为我们提供了较高的 r2 分数(例如:R&D 支出和营销支出)
消除冗余变量或无关变量可能会/可能不会导致我们的精度损失可以忽略不计,但使它在许多约束条件下成为一个非常有效的模型。
供进一步参考:
数据集:【https://www.kaggle.com/farhanmd29/50-startups
代号:https://github.com/Tarun-Acharya/50_Startups_Regression
理解联合学习
关注机器学习中的隐私
图片来自皮克斯拜
随着对隐私的日益关注,联邦学习已经成为现代机器学习中的基本概念之一。联合学习旨在训练一个模型,而无需将个人信息或可识别数据上传到云服务器。你可能已经知道,机器学习模型需要大量的数据来训练。但有时训练数据是敏感的,人们越来越不愿意与第三方分享他们的个人数据。随着对隐私的日益关注,联合学习现在在大多数机器学习应用中是必不可少的。
数据诞生于边缘
全球超过 10 亿台边缘设备(如手机、平板电脑和物联网设备)不断产生数据。对于公司和开发者来说,这些数据可以通过训练更好的模型来使他们的产品和用户体验更好。通常,客户端将数据发送到服务器,模型在服务器上运行推理并返回预测。一旦模型返回预测,客户端就发送反馈,模型使用反馈进行自我修正。虽然这在收集数据和减少边缘设备上的计算负担方面具有优势,但它面临着关于离线使用、等待时间以及更重要的隐私的问题。
云上的模型推理。作者图片
虽然该模型可以在本地进行训练和推断,但它也有其局限性。单个用户提供的数据太少,无法对模型进行充分训练。在这种情况下,其他设备的数据不起作用,这导致了非一般化的数据。这已经成为隐私和更好的智能之间的斗争,直到最近几乎没有解决方案。
联合学习是如何工作的?
在联合学习中,服务器将训练好的模型(M1)分发给客户端。客户端根据本地可用的数据训练模型。然后,这些模型而不是数据被发送回服务器,在服务器中,它们被平均以产生新的模型(M2)。这个新模型(M2)现在充当主要模型,并再次分发给客户。重复这个过程,直到模型获得满意的结果。在每一次迭代中,模型都会变得比原来好一点。因此,联合学习产生了更好的智能,而用户的个人数据在他们的设备中是安全的。
联合学习。作者图片
预测我的下一个单词。
联合学习最常见的例子是谷歌的键盘应用 Gboard。机器学习模型改善了用户体验,如滑动打字、自动更正、下一个单词预测、语音转文本等。联合学习在这里发挥了巨大的作用,因为你输入的内容对你来说是非常私人的,你不会想把你的数据发送到服务器。本地模型使用您的数据进行训练,然后发送到服务器,就像来自不同客户端的许多其他模型一样。服务器取这些新模型的平均值来产生一个新模型。服务器现在向客户端分发最新的模型。这个过程永远重复。
安全协议
即使用户数据没有上传到服务器,也有可能对模型进行逆向工程以获取用户数据。模型聚合和客户端数据加密用于解决这个问题。
联合学习协议将模型输出进行组合和求和,并且服务器只能访问集合模型,而不能访问单个模型。这里,设备只报告计算所需的数据。服务器将该模型分发给所有客户端。
掩蔽用于在聚合期间从客户端消除相反的数据点。由于被屏蔽的值被发送到服务器,任何人都很难截取这些值并对任何个人数据进行反向工程。
张量流联邦
TensorFlow Federated(TFF)是由 Google 的 TensorFlow 团队开发的一个开源框架,用于分散数据的联合学习。TFF 仍处于起步阶段,有很多需要改进的地方。在撰写本文时,TFF 只提供本地模拟运行时,没有部署选项。
您可以使用 pip 软件包管理器安装 TensorFlow Federated。
pip install tensorflow_federated
TensorFlow Federated 提供了两套接口,即联邦学习(FL)和联邦核心。使用联合学习接口,开发人员可以实现联合训练或联合评估,开发人员可以将联合学习应用于现有的 TensorFlow 模型。联邦核心接口用于测试和表达新的联邦算法,并运行本地运行时模拟。
我将在下一篇博客中写更多关于 TensorFlow Federated 的内容。
结论
这个博客是对联合学习的一个快速总结,我将很快发表更多深入的博客。我打算写更多关于一些鲜为人知的机器学习概念的博客。关注我以获取最新更新。
你可以在 Twitter 、 LinkedIn 和 Github 上找到我。
理解自然语言处理中的框架语义分析
让计算机理解我们语言含义的尝试
帕特里克·托马索在 Unsplash 上的照片
研究计算语言学可能具有挑战性,尤其是因为语言学家创造了许多术语。它可以是任务的形式,如词义消歧、共指解析或词汇化。每个任务的属性都有术语,例如,词条、词性标签(POS 标签)、语义角色和音位。
这篇文章旨在用通俗的语言给出对框架语义解析任务的广泛理解。从它的用途、一些术语定义和现有的框架语义解析模型开始。本文将不包含对定义、模型和数据集的完整参考,而是仅包含主观上重要的东西。
框架语义解析任务始于 FrameNet 项目[1],其中完整的参考资料可在 its 网站 2获得。它旨在捕捉单词的意思。
语义框架解析用于什么?
语义框架解析可用于需要更深入理解单词含义的应用,如问答。它试图确定文本在谈论什么(框架的过度简化的解释)以及谁对谁做了什么(框架元素或语义角色的过度简化的解释)。考虑一个例子
香蕉价格上涨了 5%
香蕉价格上涨了 5%
[香蕉价格]上涨了[5%]
括号中的短语是论元,而“增加”、“上升”、“上升”是谓语。
所有这些句子的意思都一样,但是计算机怎么能理解它们呢?例如,我们希望能够问一台电脑,
“香蕉的价格上涨了多少?”
给定一个混合结构,它可能会感到困惑,找不到正确的答案。
但是如果这台计算机能把那些句子解析成语义框架呢?它将识别出这很可能是一个运动方向帧。然后,它将从与运动方向帧相关的帧元素中识别出[香蕉的价格]是主题并且[5%]是距离。知道了这一点,它应该用距离框架元素来回答。
术语定义
阅读文章和论文进行框架语义解析是令人困惑的。乍一看,阅读材料中的大多数术语很难理解。因此,理解一些核心术语是非常重要的。
框架(语义框架)
框架,或语义框架,是句子一部分的范畴。这个范畴表示句子的一部分会有某些成分。在某种意义上,语义框架就像一本规则书。当你看到句子的一部分有这个语义框架,你就知道那部分句子里可能还有什么了。让我给你看一个例子
西拉试图挥动她的剑来抵挡,但是剑太重了。
你会注意到剑是一种“武器】,她的(可以和西拉一起引用)是一种“持用者”。这句话很有可能被归类为包含“武器”框架(见框架索引)。根据“武器”框架,它必须具有“武器”元素。或者,它可能包含一个“持用者”角色,如本例所示。
目标
应该用框架标记的单词或单词序列。最好能看到一个例子。
图 1:经过框架语义解析的句子示例[4]
图 1 显示了一个有 4 个目标的句子示例,用突出显示的单词和单词序列表示。这些目标是“发挥”、“重大”、“预防”和“枯竭”。这些目标中的每一个都将直接对应于一个框架——执行者和角色、重要性、阻挠、成为干巴巴的框架,用方框来标注类别。
框架元素
框架元素是语义框架*、*的组成部分,特定于某些框架。这意味着如果你已经看到了帧索引你会注意到有高亮显示的单词。这些是框架元素,每个框架可以有不同类型的框架元素。
在图 1 中,框架元素用下划线表示。例如,“胡佛大坝”,“一个主要角色”,“在防止拉斯维加斯干涸”是框架演员和角色的框架元素。
但接下来你可能会想,哇!但这不就是整句话吗?那么一个框架能覆盖整个句子吗?这取决于每个特定的框架规则。我再给你举个短一点的例子,“拉斯维加斯”是 BECOMING _ DRY frame 的一个框架元素。看到了吗?它不必是一个完整的句子。
引理
词条是词的基本形式。在英语中, runs,ran,run 会有相同的引理: run 。一个引理并不确切地表示一个词,因为它可能包含不止一个词,例如,“原子武器”或“火焰喷射器”。
词汇单位
在这个上下文中,词汇单元是一对基本形式的单词(词条)和一个框架。在帧索引处,一个词汇单元也将与其词性标签配对(如名词/n 或动词/v)。我相信目的是明确说明这个引理指的是哪个意思(一个引理/词有多个意思称为多义)。
来源帧索引
现有模型
解决这一任务的典型管道是识别目标、分类哪个帧和识别参数。
建立自动框架语义标注的早期工作包括两个步骤:识别句子中框架元素的边界和框架标注[3]。这项早期工作使用了大量的语法特征作为框架标记的输入。短语类型(名词短语、动词短语和从句)、语法功能、位置、语态和中心词。该系统的最终结果在识别框架元素边界上达到 66%,在框架标注上可以达到 80%的准确率。
最近的一个模型使用了神经网络方法来进行框架语义解析,看看它们是否可以减少语法特征的使用[4]。他们将任务分成三部分:目标识别、框架标记和参数识别。
目标识别是确定哪些单词或短语要被标记的任务。目标也可以被称为谓语,它可以是名词或动词。他们使用 3 个特征来进行目标识别:记号、记号的词性和记号引理。它们还结合了使用手套表示的预训练的令牌嵌入和训练的令牌嵌入。然后,他们使用 bi-lstm 层,最后一层将用于预测下一个令牌是否是目标。
这里的帧标记任务与前面的方法意思相同。这里,作者建议使用基于 bi-lstm 的分类器。该模型应该至少采用标记、词条、词性标签和目标位置,这是早期任务的结果。
这里我觉得有趣的是论点识别部分。论元识别可能不是你们中的一些人可能认为的“论元”,而是指谓元结构【5】。换句话说,给定我们发现了一个谓语,哪些词或短语与它相连。本质上和语义角色标注【6】一样,谁对谁做了什么。主要区别是语义角色标注假设所有谓词都是动词[7],而在语义框架解析中没有这样的假设。
参考
[1] Baker,Collin F .,Charles J. Fillmore 和 John B. Lowe1998.“伯克利框架工程”,86 年。https://doi.org/10.3115/980845.980860.
2框架网项目网站。https://framenet.icsi.berkeley.edu。
[3]吉尔迪、丹尼尔和丹尼尔·茹拉夫斯基。2002."语义角色的自动标注."计算语言学 28 (3)。https://doi.org/10.1162/089120102760275983。
[4] Swayamdipta、Swabha、Sam Thomson、克里斯·戴尔和 Noah A. Smith。2017.“用软最大间隔分段 RNNs 和句法支架进行框架语义分析.”【http://arxiv.org/abs/1706.09528.
[5]https://en . Wikipedia . org/wiki/Argument _(语言学)。
[6]https://en.wikipedia.org/wiki/Semantic_role_labeling。
7 詹姆斯·马丁·茹拉夫斯基。2019.语音和语言处理第 3 版。https://web.stanford.edu/~jurafsky/slp3/。
理解全栈数据科学:Jupyter 笔记本中的 NLP 模型如何帮助阻止灾难,第一部分
自然语言处理
从研究到生产的灾害信息分类模型——模型的自动训练、测试和打包
So . S
紧急情况随时随地都可能发生。当我们穿越这个毁灭性的全球疫情时,我们现在见证了所有一线急救人员的绝对才华。事实上,派遣救援队只是他们已经很辛苦的工作的一部分。当灾难发生时,援助请求信息会从所有不同的渠道快速而猛烈地传来。来自不同渠道的所有请求救援的信息会很快淹没人类的劳动。
因此,需要一种自动且可靠的方式将救援请求消息快速分类到正确的对应信道中。一个自然的选择是用一些机器学习模型构建一个消息分类器。所以我们通常会拿起我们的 jupyter 笔记本开始开发,对吗?事实上,这只是这里所做工作的一部分。借助 Jupyter 笔记本电脑,我们可以创建引人入胜的数据视觉效果和易于阅读的模型表示,但这些模型只能被观看,不会产生任何实际影响。因此,能够将模型转换成生产就绪的代码库对于团队直接创建功能是至关重要的。在这篇博文中,我们将通过在 PaaS 平台 Heroku 上构建一个完全容器化的、持续集成的灾难消息应用程序来说明全栈数据科学实践。**由于我们使用的数据集(图 8 灾难消息)在数据科学社区中相当有名,我们将主要关注用于生产模型的高级工具,**如 Sklearn Pipeline、Pytest、Docker 和 CircleCI。为了避免这篇文章太长而无法阅读,我们将重点讨论这个模型的构建和打包过程
项目总体结构
由于会涉及到各种不同的文件,因此对项目结构有一个清晰的理解对项目的成功至关重要。在项目的根目录下,我们会有一个标准的.gitignore
文件和一个ReadMe.md
文件。还存在 4 个子目录,
- 。circle ci—circle ci 持续集成工具所需,包含
circleci.config
文件,用于自动化模型培训和部署工作流 - disaster _ messaging _ class ification _ model—包含机器学习模型包,该包将传入的消息预测到其适当的类别中
- disaster_messaging_app —包含 API 和 docker 文件,可用于训练好的机器学习模型,将由 circleci 部署
- 笔记本 —包含探索性分析笔记本
。circleci 和笔记本文件夹的用途非常明显。当我们构建这些模块时,我们将看看disaster _ messaging _ class ification _ model和 disaster_messaging_app 中有什么。
获取数据
我们将使用 Kaggle 的多类别灾难响应消息数据集,其中包含英语消息、原始消息、消息发送通道以及所有 37 种二进制编码的消息类别。一封邮件可以属于多个类别。前 5 行如下所示。
disaster_response_messages.csv 前 5 行
我们可以手动下载数据并将文件保存到数据文件夹中。然而,在一般实践中,为了确保我们总是从数据源获得最新的数据,我们将使用 shell 脚本来自动化数据提取过程。对于我们的项目,数据来自 Kaggle 的多语言灾难响应消息。该数据集包含从多个渠道提取的 30,000 条消息。一般过程如下,
- 从 Kaggle 的多重灾难响应消息中下载数据
- 解压缩下载的 zip 存档文件,并将 CSV 文件保存到同一目录
- 删除 zip 存档文件
- 通过将验证 CSV 和测试 CSV 中的内容复制到培训 CSV 中,将所有消息文件合并成一个文件(我们将在后面设置培训测试验证)
- 将培训文件重命名为
disaster_response_messages.csv
- 删除两个额外的 CSV 文件-验证 CSV 和测试 CSV
所有这些步骤都可以在终端外壳命令中完成,
使用这个 shell 脚本,上面的整个过程可以在下面一行中执行
sh fetch_data.sh
执行后,您将能够看到disaster_response_messages.csv
文件存在于disaster _ messaging _ class ification _ model目录的 data 文件夹中。现在我们已经有了数据,我们可以继续为这个机器学习模型构建、训练和设置预测管道。
构建模型
对于我们大多数人来说,构建模型应该是一个相对熟悉的过程。我们获取数据,将相关的机器学习框架导入到我们的 jupyter 笔记本中,训练模型,然后评估模型。在 sklearn pipelines 的帮助下,我们可以构建一个自包含的、稳定的、可复制的模型管道。由于这个disaster _ messaging _ classification _ model目录包含多个相关文件,我们将从查看该文件夹的结构开始。
在灾难 _ 消息 _ 分类 _ 模型子目录中,包含以下文件/子目录
- 配置 —包含模型和日志记录的配置文件
- 数据 —下载数据的保存目录
- 特征-包含创建模型管线中使用的特征的模块
- 模型 —包含机器学习模型的训练和预测脚本
- 脚本 —包含
fetch_kaggle_dataset.sh
shell 脚本的目录 - 测试 —包含确保机器学习模型稳定行为的 python 单元测试
- trained_model —用于保存训练好的机器学习模型 pickle 文件和性能报告的目录,该文件夹不提交,将由数据实用函数自动创建(托管在 utils 目录中)
- utils —包含用于数据预处理、模型构建和可视化创建的实用函数
- 可视化——包含构建显示在前端的单词云的
generate_visuals.py
。 - Makefile—circle ci 正在使用的重要自动化脚本。关于这个文件的更多细节稍后
- py project . toml—依赖定义文件,用于生成依赖锁文件(更多信息此处)
- poem . lock—调用
poetry lock
从pyproject.toml
文件生成的锁文件 - setup.py —项目打包定义文件,包含所有安装需求和安装包
数据预处理
为了将数据提取为模型可用的格式,我们将按照以下步骤提取 CSV 并将转换后的数据保存到 SQLite 数据库中。
- 从保存在数据目录的 CSV 文件中加载数据作为熊猫数据帧(用
load_data(*messages_filepath*)
函数定义) - 在加载的数据帧中添加一列指示数据串测试分割(用
train_test_split_label(*df*)
功能定义) - 将数据帧保存到 SQLite 数据库中(用
save_data(*df*, *database_filename*)
函数定义)
4.定义一个调用上述 3 个步骤的函数(用process_data()
定义)
由于原始数据相对干净,大多数数据转换操作将在我们创建标记化句子特征时执行(接下来)。
特征—标记器
要将原始文本转换为机器可读的单词标记,我们需要构建一个标记化器,删除停用词(如 this、that、I、am……),将单词按字母排序为原始格式,删除 URL 并去掉多余的空白。该模块在名为message_tokenizer.py
的文件中被构建为一个转换器。由于这个 tokenizer 转换器被用作一个特性创建器,我们将把它放在特性目录中。
模型管道—培训
该模型的流水线仅由 4 个步骤组成,
- 记号化——由我们上面定义的记号化器完成
- 计数矢量化—对所有句子进行字数统计,这由 sklearn 的计数矢量化工具完成
- TF-IDF-使用计数矢量化文本,可以使用 sklearn 的 TF-IDF 转换器计算 TF-IDF 特征
- Adaboost 模型——一旦创建了特性,我们就可以将模型作为管道的最后一步
上述 4 个步骤可以很容易地构建成如下所示的管道函数。
作为下一步,我们可以继续构造训练函数,它包括如下步骤
- 从数据库加载训练数据(在
model_utils.py
的load_data_from_db
功能中定义) - 构建模型管道(在上述函数
build_model_pipeline()
中定义) - 符合模型
- 保存模型管线(在
model_utils.py
的save_pipeline
功能中定义) - 从数据库加载测试数据(在
model_utils.py
中定义) - 评估模型(在
model_utils.py
中定义)
load_data_from_db
函数可以选择加载训练数据还是测试数据(默认为“train”),具体定义如下
save_pipeline()
功能将以config.py
中定义的特定命名约定( model_name_version.pkl )将新训练的模型保存到特定位置( trained_models 目录),同时删除旧版本的模型管道以避免引用冲突。具体定义如下所示
evaluate_model()
函数将使用内置的 sklearn 评估 API 并生成性能报告,该报告将保存在trained _ models/performance _ report目录中。具体定义如下所示
模型管道—预测
在对模型进行训练、保存和评估之后,我们现在就可以使用该模型在新数据到来时生成一些预测。预测脚本只包含 3 个步骤,可以在一个函数中实现
- 收集输入数据并将其转换为与训练数据相同的形式
2.加载管道并使用输入数据进行预测
3.组装包含预测结果和模型版本的有效负载
具体定义如下所示
可视化——文字云
我们将建立将在前端使用的单词云可视化。由于我们的前端只使用 javascript 来显示单词云视觉效果,我们将依靠 Plotly 的特殊布局结构和plotly_wordcloud
函数来生成我们的消息来自的 3 个不同渠道中最常用的单词的 3 个视觉效果——新闻、社交媒体和直接消息。
总体步骤如下,
- 使用
visual_utils.py
中定义的load_data_from_db_visual
将保存的数据库中的信息数据作为数据帧加载 - 通过数据帧的
channel
列分割数据帧,并获得具有特定通道的子数据帧 - 使用
plotly_wordcloud
函数生成一个可以被前端解释的 JSON 格式的字符串
VisualsGeneration
类定义如下。
plotly_wordcloud
功能(配方由 Prashant 提供,此处为)遵循以下一般步骤。
- 创建单词云对象
- 创建 5 个列表,收集列表中每个单词的单词、频率、字体大小、位置、方向和颜色列表,从单词云对象的
.layout_
属性中提取 - 创建布局和数据跟踪,然后使用 Plotly 内置包构建图形
该函数定义如下:
自动训练/打包
随着模型管道、训练和预测脚本的构建,我们可以在终端中使用一系列 shell 命令来执行与该模型相关的工作流。例如,我们可以在终端中调用以下两个命令来打包保存的训练模型,并将模型上传到 PyPI 服务器。
python setup.py sdisttwine upload --skip-existing dist/*
执行模型打包将需要存在训练数据、所有安装在当前执行环境中的依赖包,并且模型已经被训练和保存。换句话说,在我们最终上传训练好的模型之前,我们需要完成一系列的步骤。
构建依赖关系定义
我们将从为我们的模型包创建适当的环境定义开始,这可以通过构建由 python 依赖管理工具poem使用的pyproject.toml
文件来完成。pyproject。toml 文件如下所示,
然后,我们可以在终端中调用poetry lock
,这将生成一个poetry.lock
文件,其中包含该项目所需的所有锁定版本的包依赖项。锁定版本将允许我们在安装包依赖关系时有必要的一致性,以防部分依赖包收到更新,这会给我们的项目带来意想不到的问题。
建立包装定义
对于我们上传到 PyPI 服务器的每个 python 包,我们需要创建一个setup.py
文件。幸运的是,我们可以使用名为 depshell 的工具为我们创建文件。我们只需要调用下面的命令来创建setup.py
文件。
pip install dephelldephell deps convert
创建的setup.py
文件如下所示
创建自动化生成文件
由于要执行这么多 shell 命令,简单地创建一个包含所有步骤的文件对于可读性和透明性来说并不理想。幸运的是,我们可以创建一个Makefile
,有效地将步骤聚集成组,这些组只包含完成单个任务的命令。例如,要安装和构建包依赖关系定义,我们可以将以下一系列命令写入 Makefile,
**poetry-install**:poetry lockpoetry config virtualenvs.create false \&& poetry export --without-hashes -f requirements.txt --dev\| pip install -r /dev/stdin \&& poetry debug
然后要执行这一系列的命令,我们只需要在终端中调用make poetry-install
,上面所有的命令集都会被执行。下面概述了将放入 Makefile 的步骤
- 从诗锁文件安装依赖项
- 从 Kaggle 获取数据集
- 从 dephells 构建 setup.py 文件
- 安装 nltk 资源(用于删除句子的停用词和词条)
- 通过调用
data_utils.py
预处理数据 - 通过调用
train.py
训练模型 - 通过调用
test.py
来测试模型 - 将模型包上传到 PyPI
完整的 Makefile 如下所示,
这很好,因为许多步骤可以总结成一个简短的 make 语句。为了进一步使整个过程自动化,我们将使用一个配置文件来指示 circleci 一个接一个地执行这些步骤。
配置 CircleCI 持续集成工具
CicleCI 是一个强大的持续集成工具,它允许我们的模型被自动训练、测试和打包,以供发布。它还使用自己的托管 docker 映像,模拟其他人有效使用您的项目的过程,因为它遵循本地安装项目时相同的设置步骤。我们只需要在名为.circleci
的指定文件夹中定义一个config.yaml
文件。更多关于 circleci 的资源和文档可以在这里找到。
所以,现在的问题变成了我们需要遵循什么步骤来使这个项目从零开始工作?我们已经有了 Makefile 中的大部分步骤,我们只需要连接它们。
- 安装 pip 工具/将 pip 工具升级到最新版本
- 安装诗歌工具(通过 pip 安装)
- 使用上面定义的 make 命令安装诗歌锁文件中的依赖项
- 使用上面定义的 make 命令从 Kaggle 获取数据集
- 使用上面定义的 make 命令预处理原始数据
- 使用上面定义的 make 命令训练模型
- 使用上面定义的 make 命令运行模型测试
- 初始化 PyPI 的凭证文件——这将允许我们将包上传到 PyPI 服务器
- 使用上面定义的 make 命令创建并上传模型包
circle 配置文件将以 3 行常规头开始,指示 circleci 的 python docker 映像版本,在我们的例子中是 0.2.1。
然后在下一行,jobs
将指示完成我们项目中定义的任务(我们上面定义的 9 个步骤)所要完成的自动化工作流步骤的开始。config.yaml
文件将如下所示。
设置 CircleCI
在用 yaml 文件配置 CI 工作流之后,我们将继续到 CircileCI 的网站并设置它与 github 存储库之间的连接。
我们将从使用包含我们的项目资源库的 github 帐户登录 CircleCI 开始。
然后,我们将导航到左侧菜单栏上的第二个图标(项目)并找到我们对应的项目存储库。对我来说,它叫做Disaster_Response_Messaging_Classifier
。然后,我们将单击蓝色的“设置项目”按钮。
在语言下拉菜单中,我们将选择“Python”,然后将我们的config.yaml
文件复制到下拉菜单正下方的编辑器中。然后点击“添加配置”按钮。
我们将登陆仪表板页面。由于我的项目已经构建了多次,工作流完成的状态将在仪表板上显示为行项目。要设置完成项目所需的环境变量,我们将单击左上角的“项目设置”按钮。
在下一页中,导航到左侧面板并单击“环境变量”。我们将需要添加以下 4 个环境变量,以使工作流完全发挥作用。
**KAGGLE_KEY**
—设置 Kaggle 的 API 时获得。关于如何设置的更多资源可以在这里找到。**KAGGLE_USERNAME**
—设置 Kaggle 的 API 时获得**PYPI_USERNAME**
—在 PyPI 服务器上注册账户时获得**PYPI_PASSWORD**
— 在 PyPI 服务器上注册账户时获得
其他 3 个环境变量用于部署,这将在第 2 部分中讨论。
我们现在已经为我们的项目设置好了持续集成工具,现在是时候看看它是如何工作的了。
提交、推送、观察和验证
如题所示。我们将提交并推动回购,并观察工作流程自行进行。如果一切正常,我们将看到以下屏幕,指示工作流已成功完成。
然后,我们可以登录到我们的 PyPI 服务器,验证包是否被正确地推送到主机中。它确实在我们的项目列表中,耶!
结论/结尾
我们现在已经成功地完成了机器学习模型的构建,该模型将帮助我们将消息分类到它们正确的通道中。更重要的是,我们已经完全自动化了该模型的模型构建、训练和打包过程。每次,当我们想要更改模型定义,或者甚至想要在有新数据进入时重新训练模型时,我们所要做的只是提交和推送。
谢谢你坚持到最后。这只是故事的一部分,因为我们将在第二部分中谈论一些更令人兴奋的部署过程,这些过程将使这个项目真正端到端。
理解甘斯:MNIST 案例研究。
这篇文章帮助你理解和发展关于这个算法如何工作的直觉。
在本文中,我们将介绍使用 GANs 生成手写数字(MNIST)的整个过程。如果你的目标是理解理论,获得直觉,那就继续读下去。如果你只是想学习如何编码,你可以在 Jupyter 笔记本上找到。此外,我们假设深度学习和机器学习概念的最低背景。如果你对一般的深度生成模型感兴趣,我将很快发表我的学士论文(查看我的生物网页,这是论文的一部分),其中调查了 4 个最常用的模型并对它们进行了比较。现在我们开始吧!
我们将定义一个生成新图像的代理( G ,生成器),另一个( D ,鉴别器),用于鉴别图像是真是假。这两个代理将在接下来的游戏中进行几轮较量。每一轮将包括以下步骤。
- g 生成新的图像。
- d 将被给予几个图像,包括生成的和真实的。
- d 会把这些图像分为真假。
- g 和 D 将从他们所犯的错误中吸取教训,改进他们的方法/系统。
遵循这个过程,G 和 D 会越来越强。请注意,如果它们最终是完美的,生成的图像将无法与真实的图像区分开来,D 将无法辨别真假。一旦发生这种情况,G 将是我们正在寻找的采样器。
生成器和鉴别器代理
我们将使用简单的神经网络来定义这些代理。值得注意的是,CNN 可能会提供更好的图像结果,但我们希望保持简单,更多地关注 GANs 的核心组件。
鉴别器将学习从图像空间到[0,1]空间的映射。该输出将被解释为图像是真实的概率。另一方面,生成器将学习从潜在空间到图像空间的映射。网络架构如下:
所使用的图像大小为 784,2 个隐藏层为 256,鉴别器输出层为 1,潜在空间为 64。
我们如何用这种结构对新图像进行采样?我们将在潜在空间(多元正态分布 q(z) )中定义一个先验分布,我们将从该空间中对噪声进行采样。然后,我们将使用生成器对其进行转换,以获得所需的图像。
z ~ q( z ), x = G( z )
在下图中,我们可以看到网络的结构。我们将在下一节看到它们是如何交互的。
甘斯结构。
培养
前面描述的博弈可以正式写成一个极小极大博弈:
最初由 Goodfellow [1]提出。
现在,让我们看看为什么这和游戏是一样的。如果鉴别器识别出 x 为真(D( x ) = 1),V 函数的第一项为 0,如果识别出为假(D( x ) = 0)。因此,由于图像来自真实分布,D 的目标是最大化它(将真实图像分类为真实)。如果鉴别器发现它是假样本,第二项为 0,如果生成器欺骗了鉴别器,则为-∞。现在,D 想要最大化,G 想要最小化。所以这个博弈中生成器的目标是最小化 V(D,G)而鉴别器的目标是最大化,就像公式中写的那样。
训练中使用的算法如下:
从算法中可以看出,训练将在一个代理和另一个代理之间交替进行。注意一些事情:首先,我们可以通过改变阶跃函数来使用任何我们想要的优化算法。在这种情况下,我们使用了深度学习社区广泛接受的 Adam 算法2。第二,我们没有像极小极大游戏中那样优化生成器。这里,不是最小化 log(1-D(G(z))) 的期望,而是最大化 log D(G(z)) 。这是因为根据[1]的作者,它在训练中更稳定。
结果
我们运行了 300 个时期的算法,批次大小为 N = 32 。
从下图中可以看出,直到第 100 个纪元,发生器越来越欺骗鉴别器。然而,在这一点上,它开始慢慢减少,鉴别器越来越能够区分真假。重要的是要明白,这并不意味着发电机没有学习。这只意味着鉴别器比发生器学习的“更多”。然而,很明显,代理 G 有一些限制(非常简单的网络),这可能是它不收敛到完美采样器的原因。
GANs 结果。在右边可以看到分数。这基本上是 D(G(z))对于伪分数的期望,并且对于真实分数具有相同但真实的图像。另一方面,人们可以看到 G 和 D 想要最小化的损失。回想一下:本来 G 想最小化,D 想最大化。然后,我们改变了 G 最大化另一个值的目标。在那之后,我们将目标转换为负数,这意味着它们都最小化。
还要注意,我们讨论的是 70% 对 30% 的准确性,这意味着生成器平均会欺骗鉴别器 10 次中的 3 次——完美是 10 次中的 5 次,这意味着鉴别器没有线索。现在,鉴别器能够在生成的图像中识别出与真实图像不同的模式,但是我们人类能够做到吗?在下图中,您可以看到不同训练阶段的样本。我们发现的有趣结果是,人类感觉不到生成和真实之间的任何差异[3]。对于手写数字来说,这可能并不令人惊讶,但是这些算法也用于面部生成,例如,这种结果更加强大。
GANs 生成的图像。左上是纪元 50、右上 100、左下 200 和右下 300。
尽管我们看到结果令人惊讶,但我们必须记住,直方图对人眼来说也是完美的,但它不会实现我们的概括目标,它只是记忆。为了测试我们是否过度拟合,我们将搜索每个生成图像的最近邻。如下图所示,生成的影像(左侧)与其在数据集中的最近邻影像(右侧)之间存在明显差异。我们不能断定我们没有过度适应,但至少我们看到我们正在学习一些有意义的东西。
左边是生成的图像,右边是根据欧几里德距离对应的最近邻。
现实情况是,从潜在空间到图像空间的映射是连续的,这意味着在一个空间中接近的图像在另一个空间中也会是接近的。现在,由于我们使用多元正态作为先验分布(单峰),如果我们在潜在空间中采样 2 个向量并对它们进行插值,则得到的线也将是非常可能的,这表明图像也应该是手写数字。这一切意味着这个插值的图像应该是不同手写数字之间的连续平滑变换,如下图所示(插值:9 → 7 → 1)。这在本图中有进一步的探讨:
在右图中,我们可以看到使用 g 进行空间转换的真实情况。在本例中,我们可以看到如何从单峰分布变为多峰分布,这基本上是现实中正在发生的事情,但在更高维度中,每座“山”都是不同的数字。此外,如果我们在潜在空间中采样 2 个点,对它们进行插值,并投影图像,可以看到会发生什么。右边的图是在 2 个不同点之间的潜在空间中的插值结果,从先前采样(多元正态分布)。
更多细节请访问 GitHub 中的代码。我的学士论文将很快在我的网站上发布,你也可以看看。
参考
[1] Goodfellow,I .、Pouget-Abadie,j .、Mirza,m .、Xu,b .、Warde-Farley,d .、Ozair、…、Bengio,Y. (2014)。生成对抗网络。在神经信息处理系统的进展(第 2672-2680 页)。
2金马博士和巴律师(2014 年)。亚当:一种随机优化方法。arXivpreprint arXiv:1412.6980。
[3] Salvia,v .,Sanfeliu,A. (2020)。图像生成的最新深度生成模型分析。(这是我的学士论文,很快就可以在我的网页上看到。)
https://github.com/VictorSP17/Simple_GAN_MNIST(在这里你可以找到这份文件的代码。)
[5]https://github.com/jsuarez5341/GAN-MNIST-Pytorch
理解 Python 中的生成器表达式
技术的
通过利用一个优雅且内存高效的解决方案在 python 中生成序列类型,提高您的 python 编程语言技能。
介绍
本文是对 Python 编程语言中的生成器表达式(gene XP)的介绍。
本文面向所有级别的开发人员。如果你是初学者,你可以学习一些新概念,比如生成器表达式、列表理解(listcomps)和序列类型生成。中级开发人员可以学习一两件关于可伸缩性和内存效率的事情,或者只是将本文作为复习。
在本文中,您会发现以下内容:
- 生成器表达式描述
- 如何利用生成器表达式(代码)
- 生成器表达式相对于其他类似解决方案的优势
- gene XP 和 listcomps 的内存和时间测量
生成器表达式
enexps 是在 python 中生成序列类型(如数组、元组、集合)的优雅且节省内存的解决方案。
生成器表达式类似于list comprehensions(list comps)——在 python 中构造列表序列类型的另一种方法。Genexps 和 listcomps 在实现方式上有相似之处。
下面的短代码片段描述了它们的语法相似性:
在下面的代码中,生成器表达式用于计算按整数递增的一系列值的总和。
#Generator Expression
accumulated_gexp = sum((1 + x for x in range(2000000)))
print(accumulated_gexp)
>> 2000001000000#List Comprehension
accumulated_listcomp = sum([1 + x for x in range(2000000)])
print(accumulated_listcomp)
>>2000001000000
虽然很微妙,但上面的 genexp 和 listcomp 示例之间的主要区别是 genexp 以方括号开始和结束,而 listcomp 以方括号开始和结束——更好的术语应该是’括号’。
下面是另一个使用生成器表达式创建元组的例子。
beginning_topic = ['Machine', 'Deep', 'Reinforcement']
ending_topic = 'Learning'tuple(print(beginning + " " + ending_topic) for beginning in beginning_topic)>> Machine Learning
>> Deep Learning
>> Reinforcement Learning
优势:内存效率
与 listcomps 相比,生成表达式更节省内存。Genexps 内存效率是利用 python 迭代器协议“产生或返回迭代器中的项目的结果。相比之下,列表理解为生成的列表及其内容利用内存。
一个生成器只会在需要的时候产生迭代器中的条目,因此给了 genexps 内存高效的特性。
如果上面写的还不够清楚,下面的代码片段会让它更加清楚。下面的代码片段显示了 genexps 和 listcomps 示例的内存大小要求(以字节为单位)。
from sys import getsizeofaccumulated_gexp = (1 + x for x in range(2000000))print(type(accumulated_gexp))
print(getsizeof(accumulated_gexp))
>> <class 'generator'>
>> 112accumulated_listcomp = [1 + x for x in range(2000000)]
print(type(accumulated_listcomp))
print(getsizeof(accumulated_listcomp))
>> <class 'list'>
>> 17632624
在上面的代码片段中,我们可以观察到 list comprehension 使用了 17632624 字节;而生成器表达式只使用了少得可怜的 112 字节内存。
还可以通过使用迭代器的 next 函数来访问序列的内容,用于生成器表达式和列表索引来理解列表。
print(next(accumulated_gexp))
>> 1print(accumulated_listcomp[0])
>> 1
优势:时间效率
与列表理解相比,生成器表达式的另一个优点是它们的时间效率特性。
对于许多开发人员来说,尤其是初学者,您更熟悉并接触到列表理解的使用。
但是在大多数情况下,使用生成器表达式的好处不是那么容易被忽略的,尤其是当程序执行的速度非常重要的时候。
在实际场景中,当你在一个序列上迭代一次时,你很可能会更好地利用 genexps。为了更大的灵活性和序列的多次迭代,您可能会使用 listcomps。
下面的代码片段演示了 listcomps 和 genexps 之间的执行时间差异。
import timeitgenerator_exp_time = timeit.timeit('''accumulated_gexp = (1 + x for x in range(200))''', number=1000000)
print(generator_exp_time)
>> 1.5132575110037578list_comp_time = timeit.timeit('''accumulated_listcomp = [1 + x for x in range(200)]''', number=1000000)
print(list_comp_time)
>> 29.604462443996454
使用 timeit python 模块,我们可以测量代码行的执行时间,如上所示。
正如我们所观察到的,生成器表达式用时不到两秒(generator_exp_time: 1.51…),而列表理解执行时间几乎多了 20 倍。
优势
下面总结了 python 中生成表达式的优点:
- python 中生成序列类型的高效内存方法。
- 为编写的代码增加了进一步的简洁性和可读性。生成器表达式被生成器函数缩短。
- 与列表比较相比,时间效率高。
结论
生成器表达式一点也不复杂,它们使得 python 编写的代码高效且可伸缩。
对于初学者来说,学习何时使用列表理解和生成器表达式是在职业生涯早期掌握的一个极好的概念。
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
- 订阅我的 YouTube 频道 即将上线的视频内容 这里
- 跟我上 中
- 通过 LinkedIn 联系我
使用小数据集从头理解梯度增强
什么是助推?
Boosting 是一种非常流行的集成技术,在这种技术中,我们将许多弱学习者组合起来,将他们转化为强学习者。增强是一种顺序操作,其中我们以渐进的方式建立相互依赖的串联弱学习器,即弱学习器 m 依赖于弱学习器 m-1 的输出。用于增强的弱学习者具有高偏差和低方差。简而言之,boosting 可以解释为 boosting =弱学习者+加法梳理。
梯度推进算法
梯度推进是一种用于回归和分类问题的机器学习技术,它以弱预测模型的集合的形式产生预测模型,通常是决策树(维基百科定义)
算法步骤:
作者图片
现在让我们在一个小数据集(D)上应用所有这些步骤。数据集的大小保持非常小,以避免冗长的计算。这是一个预测公寓价格(以 10 万卢比计)的数据集,使用的参数包括地毯面积、位置(位于城市黄金地段或城外)和停车场(我们有公寓停车场吗)数据集:
作者图片
第一步:
梯度增强的第一步是用常数值初始化模型 F0(x)。也就是说,我们必须找到γ(γ)的最佳值,以使损耗值降低。现在让我们为数据集(D)求解步骤 1 中的方程
作者图片
第二步:
这一步是我们建立所有弱学习者的循环。这里 m=1 表示我们正在构建第一个弱学习器,并且我们已经在步骤 1 中构建了基础学习器 F0(x)
第 2.1 步
这里我们首先计算伪残差,也称为假残差。与残差相比,使用伪残差的最大优点是,他们让我们有任何损失函数。也就是说,它们帮助我们最小化我们选择的任何损失函数,直到损失函数是可微的。大多数伪残差几乎与残差相似,或者与残差成一定比例。
以下等式显示了伪残差与实际残差是如何相似的。
作者图片
对于所使用的损失函数,伪残差完全等于实际残差,但这并不总是正确的,因为随着损失函数的改变,方程和值也改变。在上面的等式中,Fm(Xi)表示前一阶段来自弱学习者的预测值
算法步骤 2.1 中给出的方程与上述方程的 L.H.S .相同,用简单的英语来说,这两个方程都可以解释为损失函数相对于阶段 m-1 的模型构建的负导数
让我们计算数据集(D)的伪残差
作者图片
在上表中,rim 是实际值(yi)和模型预测值(F0(x))的差值,r 表示残差,m 表示我们正在制作的弱学习器的数量,I 表示实例的数量,因此这里 r11 表示实例 1 的弱学习器 1 的残差。
第 2.2 步
在这一步,我们训练下一个弱学习者 F1(X)。让本周的学习者成为决策树。
在梯度推进中,如果我们使用决策树作为弱学习器,那么决策树的深度应该在 2 到 9 之间,默认情况下设置为 3。此外,请注意,深度必须在 2 到 9 之间并不是一条经验法则,这在很大程度上取决于我们的数据集。
在梯度推进中,我们在 Xi 和伪残差上训练我们的弱学习者,即我们将使用地毯面积、停车场和位置来预测我们在步骤 2.1 中计算的伪残差。我们数据集的决策树
作者图片
决策树的叶子被称为终端区域(Rjm)。其中 m 是我们刚刚制作的树的索引,因为这是第一棵树,m=1,j 是树中每片叶子的索引。
第 2.3 步
在这一步中,我们确定每个叶子的输出值。在上面的树中,有一个具有 2 个条目的叶子,所以不清楚它的输出值应该是什么,所以叶子的输出值可以通过求解以下方程来计算
作者图片
注意:给定任何损失函数,叶的输出值总是该叶的残差的平均值。
第 2.4 步
在这一步,我们更新我们的模型。步骤 2.4 的等式有两个部分,第一部分显示我们对伽马(γ)的初始预测,即 F0(x),第二部分代表我们在步骤 2.3 之前刚刚构建的树。因此,该等式可以表示为
作者图片
在上面的等式中,alpha(α)代表学习率。α的值在 0 到 1 之间变化,设α= 0.1。梯度提升中的学习率参数用于控制每个弱学习器的贡献,这些弱学习器被串联添加。
Record1 :新预测= 45+0.1 *(10)= 44,与模型 F0(x)所做的早期预测相比,更接近真实值。这意味着我们朝着正确的方向迈出了一小步。
记录 2 :新的预测= 45+0.1*(15)=46.5,与之前模型 F0(x)的预测相比,更接近真实值。这意味着我们朝着正确的方向迈出了一小步
记录 3 :新的预测= 45+0.1 *(20)= 43,与模型 F0(x)的早期预测相比,更接近真实值。这意味着我们朝着正确的方向迈出了一小步。
Record4 :新预测= 45+0.1*(15)= 46.5,与模型 F0(x)做出的早期预测相比,更接近真实值。这意味着我们朝着正确的方向迈出了一小步。
现在我们已经完成了步骤 2 的第一次迭代。我们将继续迭代,直到 M 的值达到 M 的值,这里 M 是构建一个算法所需的弱学习者总数。实际上,对于梯度提升,M = 100。但是为了简单起见,让我们保持 M=2
现在我们将再次重复步骤 2。这意味着对于 m=2,我们将计算伪残差,拟合下一个弱学习器 F2(x),计算叶子的输出,并将更新模型。这里我们完成第 2 步得到的 m 的值达到了 m 的值
第三步
作者图片
在步骤 3 中,我们计算梯度推进算法的输出。上面的等式代表了我们算法的最终输出。当 m = 2 时,上述等式的第 3 部分表示步骤 2 中的树构建。这里 M = 2,这意味着 F2(x)是梯度增强算法的输出。
希望这篇文章能帮助你增加对梯度推进的理解。我们知道梯度推进是一种强大的机器学习算法,但这不应该阻止我们了解它是如何工作的。我们对算法了解得越多,我们就能更好地有效使用它,并解释它是如何做出预测的。
感谢阅读。
了解梯度下降和 Adam 优化
对亚当的直观看法,以及为什么它更常用于深度学习
来源:https://pix abay . com/插图/人工智能-大脑-思考-3382507/
人工智能在过去十年中如何影响了我们的日常生活,这是我们只能深思的事情。从垃圾邮件过滤到新闻聚类,指纹传感器等计算机视觉应用到手写和语音识别等自然语言处理问题,很容易破坏人工智能和数据科学在我们日常生活中发挥的作用。然而,随着我们的算法处理的数据量的指数增长,开发能够跟上复杂性增长的算法是至关重要的。一种给工业带来显著变化的算法是 Adam 优化程序。但是在我们深入研究它之前,首先让我们看看梯度下降和它的不足之处。
来源:https://www . research gate . net/figure/Sphere-function-D-2 _ fig 8 _ 275069197
如果你不知道什么是成本函数,我建议你先浏览一下这个博客,它是对这个主题的一个很好的介绍:https://medium . com/@ lachlanmiller _ 52885/understanding-and-calculating-the-cost-function-for-linear-regression-39b8a 3519 fcb
梯度下降
假设我们有一个如上所示的 2 个输入变量的凸成本函数,我们的目标是最小化其值,并找到 f(x,y)最小的参数(x,y)的值。梯度下降算法所做的是,我们从曲线上的一个特定点开始,使用负梯度找到最陡下降的方向,并在该方向上迈出一小步,不断迭代,直到我们的值开始收敛。
https://data science-爱好者. com/DL/Optimization _ methods . html
我个人觉得上面的梯度下降比喻非常酷,一个人从山顶开始,沿着能使他最快降低高度的路径向下爬。
来源:https://www . quora . com/What-turns-gradient-descent-into-gradient-ascent-in-deep-learning
同时给出了梯度下降的正式定义,我们继续根据需要执行更新,直到达到收敛。我们可以通过检查 f(X i+1) 和 f(X i) 之间的差值是否小于某个数字,比如 0.0001(如果使用 Python 实现梯度下降,则为默认值),来轻松检查收敛性。如果是这样,我们说梯度下降已经收敛于 f 的局部最小值。
如果你不能完全掌握梯度概念,或者对成本函数和梯度下降的更深入的知识感兴趣,我强烈推荐以下来自我最喜欢的 YouTube 频道 3Blue1Brown 的视频-
坡度下降不足的地方
要执行梯度下降的单个步骤,我们需要迭代所有训练示例,以找出特定点的梯度。这被称为批量梯度下降,并且已经进行了许多年,但是随着深度学习和大数据时代的到来,拥有数百万数量级的训练集变得很常见,这在计算上变得昂贵,执行梯度下降的单个步骤可能需要几分钟。通常的做法是所谓的小批量梯度下降,我们将训练集分成小批量,并分别使用这些批量执行梯度下降。这通常会导致更快的收敛,但这里有一个主要问题——我们在单步执行时仅查看训练集的一小部分,因此,该步可能不会朝着成本函数的最大下降方向。这是因为我们基于总数据的子集来最小化成本,这并不代表对整个训练数据来说什么是最好的。我们的算法现在不是沿着一条通向最小值的直线路径,而是沿着一条迂回的路径,甚至不总是通向最优,最常见的是超调(越过最小值)。
来源:https://engmrk.com/mini-batch-gd/
下图显示了 3 种不同批量情况下梯度下降的步骤,以及成本函数如何最小化的变化。在这两个图中,很明显,成本函数是最小化的,但是它是振荡的,尽管一般来说它是减小的。问题如下,我们是否可以以某种方式“平滑”梯度下降的这些步骤,以便它可以遵循噪音更小的路径并更快地收敛?答案,你可能已经猜到了,是亚当优化。
亚当优化算法
来源:https://medium . com/@ nishantnikhil/Adam-optimizer-notes-DDA C4 FD 7218
这里发生了很多事。我们来快速分解一下。首先,我们来看看涉及的参数。
- α——梯度下降步长的学习速率。
- β1 —动量步长的参数(也称为 Adam 中的一阶矩)。一般为 0.9
- RMSProp 步长的参数(也称为 Adam 中的二阶矩)。一般 0.99
- ϵ——数值稳定性参数。一般是 10^-8
- m,v——分别为一阶和二阶矩估计值。两者的初始值都设置为 0。
- t —偏差校正步长的时间步长参数。
- g 和 f——θ时的梯度和函数值。
Adam 本质上可以分解为两个主要算法的组合——Momentum 和 RMSProp。动量步骤如下-
m = beta1 * m + (1 - beta1) * g
假设β1 = 0.9。那么对应的步骤计算 0.9 *电流矩+0.1 *电流梯度。您可以将此视为最后 10 个梯度下降步骤的加权平均值,它消除了大量噪声。然而,最初,力矩设置为 0,因此第一步的力矩= 0.9 * 0+0.1 *梯度=梯度/10,依此类推。这一时刻将无法跟上原来的梯度,这就是所谓的有偏估计。为了纠正这一点,我们做了以下工作,称为偏差纠正,除以 1-(β1 的时间步长)
m_corrected = m / (1 - np.power(beta1, t))
请注意,1 次幂(β1,t)接近 1,因为 t 随着每一步变得更高,随后会降低校正效果,并在最初几步达到最大。
来源:https://medium . com/datadriveninvestor/指数加权平均深度神经网络-39873b8230e9
旁边的图表很好地描绘了这一点,黄线指的是用较小的β1(比如 0.5)获得的力矩(估计值),而绿线指的是更接近 1(比如 0.9)的β1 值
RMSProp 做了类似的事情,但略有不同
v = beta2 * v + (1 - beta2) * np.square(g)
v_corrected = v / (1 - np.power(beta2, t))
它还近似计算最后 1/(1-β2)个示例的加权平均值,当β2 = 0.99 时为 100。但它会计算梯度平方的平均值(一种缩放幅度),然后是相同的偏差校正步骤。
现在,在梯度下降步骤中,我们不用梯度,而是用如下的力矩-
theta = theta - learning_rate * m_corrected / np.sqrt(v_corrected) + epsilon)
使用 m_corrected 确保我们的梯度在总体趋势的方向上移动,并且不会振荡太多,而除以幅度平方的平均值的平方根确保步长的总幅度是固定的并且接近单位值。这也增加了自适应梯度,我不会详细讨论,这只是在我们接近收敛时改变步长的过程。这有助于防止超调。最后,ε被加到分母上,以避免在遇到梯度的估计值太小并被编译器四舍五入为 0 的情况下被 0 除。该值被故意选择为非常小,以便不影响算法,通常为 10^-8.量级
对性能的影响
自 2015 年以来,Adam 已被广泛用于深度学习模型。这是由 OpenAI 的 Diederik Kingma 和多伦多大学的 Jimmy Ba 在他们 2015 年 ICLR 的论文“Adam:一种随机梯度优化的方法”中提出的。听起来,亚当并不是以某人的名字命名的。它是“自适应矩估计”的简称。下图显示了将其应用于 MNIST 数据集上的神经网络模型时,与其他最小化算法相比的有效性。
来源:https://machine learning mastery . com/Adam-optimization-algorithm-for-deep-learning/
Adam 是最优化领域中最显著的成就之一。自从使用 Adam 以来,训练大型模型所需的几天时间已经减少到几个小时。自从它出现以来,它已经成为几乎所有深度学习库中使用的默认优化器。我自己经常使用 Adam—在一个手写数字分类问题上,我发现仅通过将我的优化器从小批量梯度下降更改为 Adam,我的训练准确率就从 79%跃升到 94%,所需的迭代次数减少到大约三分之一,考虑到我的训练数据大小约为 10,000,甚至不到 100 万,这是一个非常显著的变化,在这种情况下,效果会更加显著!
理解用于节点分类的图卷积网络
图解卷积网络(图片由作者提供)
神经网络在过去十年中取得了巨大的成功。然而,神经网络的早期变体只能使用常规或欧几里德数据来实现,而现实世界中的许多数据具有非欧几里德的底层图形结构。数据结构的不规则性导致了最近图形神经网络的发展。在过去的几年中,图形神经网络的不同变体正在被开发,图形卷积网络(GCN)是其中之一。GCNs 也被认为是基本图形神经网络的变体之一。
在本文中,我们将深入探讨由托马斯·基普夫和马克斯·韦林开发的图卷积网络。我也将给出一些关于使用网络 X 构建我们的第一张图的非常基本的例子。通过这篇文章的结尾,我希望我们能对图卷积网络内部的机制有更深入的了解。
如果你不熟悉图形神经网络的基本概念,我推荐你在这里阅读我之前的文章。
图中卷积神经网络
相同的权重(或核心,或 CNN 中的过滤器)应用于整个图像(作者的图像)
gcn 执行类似的操作,其中模型通过检查相邻节点来学习特征。CNN 和 GNNs 之间的主要区别在于,CNN 是专门构建来对规则(欧几里德)结构化数据进行操作的,而 GNNs 是 CNN 的一般化版本,其中节点连接的数量是变化的,并且节点是无序的(在非欧几里德结构化数据上是不规则的)。
2D 卷积神经网络(左)和图卷积网络(右)的图解,通过来源
GCNs 本身可以分为两种主要算法,空间图卷积网络和谱图卷积网络。在本文中,我们将关注 F ast 近似基于谱的图卷积网络。
在深入研究 GCNs 内部发生的计算之前,让我们先简要回顾一下神经网络中前向传播的概念。如果你熟悉的话,可以跳过下面的部分。
神经网络正向传播简要概述
全连接神经网络的图示(图片由作者提供)
在神经网络中,为了将特征表示传播到下一层(正向传递),我们执行下面的等式:
等式 1 —神经网络中的正向传递
这基本上相当于线性回归中的 y = mx+b ,其中:
m 相当于重量**
x 是输入特性**
b 是偏向**
上述正向传递方程与线性回归的区别在于,神经网络应用非线性 激活函数 来表示潜在维度中的非线性特征。
回头看上面的等式,对于第一个隐藏层(i = 0),我们可以简单地将等式重写为如下:
等式 2 —第一层神经网络中的正向传递
其中第 0 层的特征表示基本上是输入特征(X) 。
这个等式在图卷积网络中有什么不同?
快速近似谱图卷积网络
频谱 GCN 背后的最初想法受到信号/波传播的启发。我们可以把频谱 GCN 中的信息传播看作是沿着节点的信号传播。谱 gcn 利用图拉普拉斯矩阵的特征分解来实现这种信息传播方法。简而言之,特征分解帮助我们理解图的结构,从而对图的节点进行分类。这有点类似于主成分分析(PCA)和线性判别分析(LDA)的基本概念,其中我们使用特征分解来降低维度并执行聚类。如果你从未听说过特征分解和拉普拉斯矩阵,不要担心!在这个快速近似方法中,我们不打算显式地使用它们。
在这种方法中,除了节点特征(或所谓的输入特征)之外,我们将在前向传播方程中考虑邻接矩阵(A) 。 A 是表示正向传播方程中节点之间的边或连接的矩阵。在前向传递方程中插入 A 使得模型能够学习基于节点连通性的特征表示。为了简单起见,偏置 b 被省略。由此产生的 GCN 可以被视为以消息传递网络形式的谱图卷积的一阶近似,其中信息沿着图中的相邻节点传播。
通过添加邻接矩阵作为附加元素,前向传递方程将是:
等式 3—图形卷积网络中的前向传递
等待…你说 A,什么是 A ?*
A 是 A 的规格化版本。为了更好地理解为什么我们需要规范化 A 以及在 GCNs 中向前传递时会发生什么,让我们做一个实验。*
构建图形卷积网络
初始化图形 G
让我们首先使用 NetworkX 构建一个简单的无向图( G )。图 G 将由 6 个节点组成,并且每个节点的特征将对应于特定的节点号。例如,节点 1 的节点特征为 1,节点 2 的节点特征为 2,依此类推。为了简化,在这个实验中我们不打算指定边缘特征。
输出:
**
图形 G 可视化
由于我们只有 1 个图,这个数据配置是一个 单模 表示的例子。我们将构建一个学习结点要素表示的 GCN。
将邻接矩阵 (A)插入前向传递方程
下一步是从图 G 中获得邻接矩阵 (A) 和节点特征矩阵 (X) 。
输出:
现在,让我们研究如何通过将和插入正向传递方程来增加模型更丰富的特征表示。我们要对 A 和x进行点积运算,在本文中我们把这个点积运算的结果称为 AX 。
输出:
从结果可以明显看出, AX 代表相邻节点特征的总和。例如, AX 的第一行对应于连接到节点 0 的节点特征的总和,节点 0 是节点 1、2 和 3。这让我们了解了 GCNs 中的传播机制以及节点连接性如何影响 GCNs 所看到的隐藏特征表示。
邻接矩阵和节点特征矩阵的点积表示相邻节点特征的总和。
但是,如果我们想得更多,我们会意识到,虽然 AX 总结了,相邻节点的特征,但它没有考虑节点本身的特征。
糟糕,检测到问题!怎么解决?
插入自循环并规格化一个
*为了解决这个问题,我们现在向 **A 的每个节点添加自循环。*添加自循环基本上是一种将节点连接到自身的机制。也就是说,邻接矩阵 A 的所有对角元素现在都将变成 1,因为每个节点都与自身相连。我们把 A 加上自循环叫做 A_hat 重新计算 AX ,现在就是 A_hat 和 X 的点积:
输出:
太好了!一个问题解决了!
现在,你可能会意识到另一个问题。 AX 的元素是未规格化。类似于任何神经网络操作的数据预处理,我们需要归一化特征以防止数值不稳定性和消失/爆炸梯度,从而使模型收敛。在 GCNs 中,我们通过计算 度矩阵 (D)并执行 D 的 逆 与 AX 的点积运算来规范化我们的数据
在本文中我们称之为 DAX 。在图形术语中,术语“度”是指一个节点所连接的边的数量。
输出:
如果我们比较 DAX 和 AX ,我们会注意到:
我们可以看到规范化对 DAX 的影响,其中对应于节点 3 的元素与节点 4 和 5 相比具有较低的值。但是,如果节点 3 与节点 4 和 5 具有相同的初始值,为什么在规范化后会有不同的值呢?
让我们回头看看我们的图表。节点 3 有 3 条入射边,而节点 4 和 5 只有 2 条入射边。节点 3 比节点 4 和 5 具有更高的度的事实导致节点 3 的特征在 DAX 中的权重更低。换句话说,节点的度越低,节点属于某个组或簇的能力就越强。
在论文中,Kipf 和 Welling 指出,进行对称归一化将使动力学更有趣,因此,归一化方程修改为:
让我们使用新的对称归一化方程来计算归一化值:
输出:
回头看看上一节中的等式 3,我们会意识到我们现在有了什么是 A 的答案!文中将 A* 称为重正化诡计。*
完成了特性处理之后,是时候完成我们的 GCN 了。
添加权重和激活函数
我们将使用 ReLu 作为激活函数来构建一个 2 层 GCN。为了初始化权重,我们将使用随机种子,这样我们就可以复制结果。请记住,权重初始化不能为 0。在这个实验中,我们将为隐藏层设置 4 个神经元。因为我们将绘制二维特征表示,所以将有 2 个输出神经元。
为了更简单,我们将使用 numpy 重写重正化技巧方程,只是为了更简单。
输出:
搞定了。我们刚刚建立了我们的第一个前馈 GCN 模型!
绘制要素制图表达
GCN 的“魔力”在于它可以学习特征表现,即使没有训练。让我们在通过 2 层 GCN 后可视化要素制图表达。
输出:
来自前馈 GCN 的特征表示
从上面的图中,可以清楚地看到有 2 个主要组,其中左边的组由节点 0、1、2 组成,右边的组由节点 3、4、5 组成。我们可以推断出 GCNs 已经可以学习特征表示,即使没有训练或者 反向传播 。
关键要点
- 图卷积网络中的术语“卷积”在权重共享方面类似于卷积神经网络。主要区别在于数据结构,其中 gcn 是 CNN 的一般化版本,可以处理底层非规则结构的数据。
- 在 GCNs 的前向传递方程中插入邻接矩阵( A ,使得模型能够学习相邻节点的特征。这种机制可以看作是沿着图中的节点传递消息的操作。
- **重正化技巧由 Thomas Kipf 和 Max Welling (2017) 用于归一化快速近似基于谱图卷积网络中的特征。
- gcn 甚至可以在训练之前学习特征表示。
感谢阅读!如果您想了解如何使用 CORA 数据集在节点分类任务上训练 GCN,可以阅读本系列的下一篇文章。**
有什么意见、反馈或想讨论的吗?请给我留言。你可以在 LinkedIn 上联系我。
可以在GitHub上获取完整代码。
参考
[1] T. Kipf 和 M. Welling,利用图卷积网络的半监督分类 (2017)。arXiv 预印本 arXiv:1609.02907。ICLR 2017
2 T .基普夫,https://tkipf.github.io/graph-convolutional-networks/
[3]吴,等。艾尔。,图神经网络综合研究 (2019)。
[4] T. S. Jepsen,https://towardsdatascience . com/how-do-deep-learning-on-graphs-with-graph-convolutionary-networks-7d 2250723780
用数据理解幸福动力学(上)
国家一级的描述性分析
在这些特殊时期,封锁给我们许多人留下了很多思考的时间。想想过去和未来。想想我们的生活方式和我们的成就。但最重要的是,想想我们对这个世界的贡献。当我在寻找灵感和能量时,我决定抓住幸福这个问题,并对其动力学的复杂本质有更深的理解。
什么能让人真正快乐?
我们都有自己对幸福及其关键决定因素的看法。有些人会选择财富,因为享受舒适喜欢高生活条件是必不可少的。有些人会拒绝这种唯物主义观点,并认为社会关系(家庭、朋友等。)和价值观才是最重要的。其他人会捍卫这一观点,即作为在遵守某些规则的同时受益于一系列权利的公民,真正决定我们生活条件并因此决定我们幸福的是政府及其政策。
这些都是直观的想法。但是现有的数据告诉我们什么呢?
从这个角度来看,我分析了《世界幸福报告》的数据,这是一项具有里程碑意义的全球幸福状况调查。更具体地说,它一方面包含基于盖洛普世界民意调查(GWP)收集的答案的幸福得分,另一方面包含经济生产、社会支持、预期寿命、自由、无腐败和慷慨等指标。
在两篇系列文章中,我将与您分享我的主要发现。第一篇文章旨在通过数据解释性分析,对各国的幸福和相关指标的演变给出一个总体概述。另外两个关注这些指标对幸福的因果影响。
结构:
- 关于数据
- 幸福概述
- 幸福&财富
- 幸福&社会环境
- 幸福&公共政策
1.关于数据
首先,让我们从定义将要使用的关键指标开始。来自《世界幸福报告》的数据特别有趣,因为它结合了基本的经济指标和更主观的社会指标。
经济指标
- 人均 GDP:根据购买力平价调整为 2011 年不变国际美元,来自世界发展指标(WDI) ,2018。
- 出生时健康预期寿命:来自世界卫生组织(世卫组织) 全球健康观察站数据仓库。
幸福指标
这些指标主要来自 GWP 的民意调查。它使用随机选择的、具有全国代表性的样本,持续调查 160 多个国家的居民。通常,在面对面或通过电话进行的采访中,会向每个国家的 1,000 名个人提出一系列问题。更多信息,可以看这篇文章。
研究幸福的主要挑战是,首先,如何衡量幸福。事实上,对幸福感的评估从对生活的总体判断(生活评价)到感受(日常情感)。在这种情况下,我们将使用 3 项指标:
- 坎特里尔生活阶梯量表(Cantril Scale)即生活阶梯量表(Life Ladder ):它要求受访者用 0 到 10 分的“阶梯”量表给自己的生活打分,其中 0 分表示最糟糕的生活。
- 积极情绪:这是来自 GWP 的前一天快乐、欢笑和享受的平均情绪指数。情感问题的一般形式是:“你在昨天的大部分时间里有没有体验过以下感觉?”
- 负面情绪:它代表前一天焦虑、悲伤和愤怒情绪的平均值。
社会指标
在社会支持方面,我们将分析两个指标:
- 社会支持:它代表了对 GWP 问题*“如果你遇到了麻烦,你有亲戚或朋友可以在你需要的时候帮助你吗?”的二元回答(0 或 1)的全国平均值*
- 慷慨度:它是对 GWP 对问题*“你在过去的一个月里有没有给慈善机构捐过款?”的全国平均回答进行回归后的余数上人均 GDP*。
最后,为了掌握人们对政治的看法对其幸福感的影响,我们将使用以下指标:
- 做出生活选择的自由:它代表了对 GWP 问题的二进制回答的全国平均水平*“你对自己选择如何生活的自由感到满意还是不满意?”*
- 对腐败的看法:它代表了两个 GWP 问题的二元答案的平均值:“腐败是否在政府中普遍存在?”和腐败在企业中是否普遍存在?”
- 对国家政府的信心,用类似的方法构建。
下面是对数据的快速描述:
- 年份包括:2005 年至 2019 年
- 国家数目:166 个
- 区域数量:10
2.幸福概述
总体幸福感很大程度上取决于经济猜想,正如人们所料。事实上,代表人们对自己生活评价的人生阶梯在金融危机前的 2006 年处于最低点。
图 1——人生阶梯的演变
正面影响和*负面影响也是如此。这些指标给前一个指标带来了有趣的细微差别:它们分别指的是前一天快乐、欢笑、快乐或担忧、悲伤和愤怒的平均情绪。因此,与 *Life Lader 相反,有一些短期的衡量幸福的方法。
在这种背景下,如下图所示,这些变量也处于金融危机后的最低点。然而,对负面影响的影响肯定比对正面影响的影响大。
图 2——积极和消极影响的演变
就地域差异而言,没有什么好惊讶的。平均而言,富裕国家更幸福。最重要的是,下图显示了世界各地存在的巨大不平等。
图 3——按地区划分的人生阶梯演变
图 4-2019 年按生活阶梯着色的地图
即使在同一地区,国家之间也存在很大差异,尤其是在南亚、中东以及非洲和撒哈拉以南非洲,如下图所示。相反,北美国家和欧洲国家的幸福水平非常相似。
图 5-2019 年各地区的生活阶梯差异
3.幸福与财富
几十年来,更多的财富是否会带来更多的幸福这个问题吸引了经济学家、行为科学家和普通大众的注意力。毫无疑问,人们的幸福和财富有很强的相关性。而且,数据并不与这一总体趋势相矛盾。其实如图所示,人均 GDP越高,幸福水平越高。
图 6-作为人均 GDP 函数的生活阶梯(2019 年)
然而,这条规则也有许多例外:人均 GDP 相似的国家的幸福水平会有很大差异。例如,挪威和科威特拥有相似的人均 GDP但是他们的幸福水平却有显著差异(1.3 分!).
即使在同一个地区,不同国家的幸福水平也有很大差异,尽管他们的人均 GDP 很接近。例如,芬兰和比利时的人均 GDP 相似,但他们的幸福水平相差 1 分!
图 7-西欧人均 GDP 函数中的生活阶梯(2019 年)
这些观察是否证明了“金钱买不到幸福”这句老话?实际上,他们指出了两个公认的观点:
- 总的来说,财富确实重要,但存在边际效用递减模式。这意味着一个人越富有,他财富的增加就越不会增加他的幸福。
- 用财富作为幸福的指标是有问题的。一方面,它可以用来表示人们在工作中取得成功和提高生活水平的意愿。因此,人们的财富多少反映了人们对目前生活的满意程度和对未来的希望。但是,另一方面,它不包括对人们的生活满意度有决定性贡献的其他变量,如家庭、工作和健康。
4.幸福和社会环境
当我们思考幸福的成分是什么时,几乎不可能排除社会因素。事实上,作为社会动物,我们需要爱、意义、来自我们与家人和朋友的亲密关系的支持,以及来自我们更广阔网络的归属感。
那么,社会关系是通向幸福的最佳途径吗?
我们来看一下数据。更具体地说,我们将关注以下变量:
- 社会支持:它衡量健康的社交生活能在多大程度上带来安全感。事实上,社交网络通常是人们建议的来源,当他们知道他们的家人或朋友可以在他们需要帮助时,会给他们带来安慰。
- 慷慨:它反映了一种归属感,这种归属感通常来自于给予他人和接受他人的行为。
下表包含每个区域的平均值。在社会支持方面,北美和西欧国家数值最高,而南亚国家最低。从慷慨度、北美、东南亚国家最高,而撒哈拉以南国家最低。不出所料,当生活阶梯和正面影响高而负面影响低时,这些变量高。
表 1 —每个地区的平均值
为了比较幸福和这些“社会”变量之间关联的强度,让我们来比较它们的相关性。下面是两个地区的相关矩阵,一个是高幸福水平的地区,西欧,,另一个是低幸福水平的地区,南亚。
图 8 —相关矩阵(左边是西欧,右边是南亚)
正如你所看到的,在西欧的人生阶梯、积极情感、和消极情感与社会支持和慷慨高度相关,而在南亚的则没有。我们能从中推断出什么?是因为国家的文化,政治制度,还是其他变量?需要进一步的研究来阐明这个问题。
关于哈佛成人发展研究的简短说明
1938 年,一组哈佛研究人员通过定期采访和体检跟踪一组十几岁男孩的发育情况,调查了快乐的问题。他们的目标是了解他们的健康和幸福随着时间的演变。它成为同类研究中最长、最著名的纵向研究之一。80 多年后,研究得出结论社会关系是人们幸福和健康的最重要因素之一。正如这项研究的现任负责人罗伯特·沃尔丁格在著名的 TED 视频中简单总结的那样:“那些保持温暖关系的人活得更久更快乐,而孤独者往往死得更早”。有关这项研究的更多信息,您可以阅读这篇文章。****
5.幸福与公共政策
毫无疑问,政府对人们的福祉有影响,因为它们实施的公共政策定义了重要的幸福因素,如获得教育、就业、医疗保健等。
事实上,人民的幸福与政府出台的政策之间的关系是一个微妙的问题,这在两个层面上**😗*
- 政府在多大程度上有权干预以改变市场经济的社会效应?自由派倾向于主张慷慨的失业保护和福利,而保守派则捍卫政府最小干预以确保市场效率的理念。
- ****如何衡量政策影响?是否应该只关注国民经济增长、人均产量等客观指标?或者,我们是否应该退一步,反过来问,是什么样的公共政策让公民认为他们的生活更幸福?
历史上,一些国家把幸福放在他们理想的中心。
例如,美国独立宣言将追求幸福列为三种自然不可剥夺的权利之一,与生命和自由并列。它还明确指出这是任何政府的最终目标。
我们认为这些真理是不言而喻的:人人生而平等,造物主赋予他们某些不可剥夺的权利,其中包括生命权、自由权和追求幸福的权利
美国宪法,1787 年南亚国家不丹政府更进一步,将常规经济指标放在一边,主要关注国民幸福总值(GNH)** ,这是一个旨在衡量人口集体幸福和福祉的指数。与 GDP 相反,它的价值观包括与自然和谐相处和传统价值观。要了解更多信息,您可以阅读这篇文章,并观看这段简短的视频。**
在这里,我分析了人们对政府的看法对他们幸福感的影响。考虑了以下几个方面
- 通过对政府的信任,人们对政府及其政策的信心。
- 通过对腐败的认知,人们对该国腐败程度的认知。
- 人们在做出人生选择时的自由感,正如所表明的做出人生选择的自由。
- 医疗保健系统的效率大体上反映在出生时的健康预期寿命上。
下表包含每个地区的平均值。与其他国家(如北美国家)相比,中欧和东欧国家对国家政府的信任度和做出生活选择的自由度最低,对腐败的感知度*最高。*****
表 2—每个地区的平均值
为了比较幸福与这些“政策”相关变量之间关联的强度,我们来比较一下它们的相关性。下面是两个地区的相关矩阵,一个是快乐程度高的地区,北美,,另一个是快乐程度低的地区,中欧。****
****
图 9—相关矩阵(左侧为北美,右侧为中欧)
需要注意 3 个因素:
- 首先,对于北美的国家来说,生活阶梯与健康的预期寿命,做出生活选择的自由和,对国家政府的信任度,与对腐败的看法高度负相关。中欧国家的情况并非如此。**
- *接下来,在北美国家,这些变量与正面和负面影响的相关性不如与*人生阶梯的相关性显著。这表明这些“政策”相关变量会对人们对生活的总体判断产生更大的影响,而不是他们的日常影响。
- 最后,在中欧国家,做出生活选择的自由和积极和消极影响之间的相关性非常高。相反,这表明这一变量对人们的日常情感会产生更重要的影响,而不是他们对生活的总体判断。
下面的相关矩阵表明,发达国家和其他国家之间的这些差异适用于世界其他地区:
图 9 —中欧和东欧、北美、撒哈拉以南非洲和西欧的相关矩阵
同样,有 3 个要素需要注意:
- 生命阶梯和出生时健康预期寿命之间的相关性在北美非常高,在西欧国家不显著。这可能是因为西欧国家通常为其公民提供可靠的医疗保险。**
- 在北美国家,生活自由与生活阶梯的相关性明显高于其他国家。
- 对国家政府的信心和生活阶梯在北美和西欧有很高的正相关性,在这些地方,民主作为政治体制往往更为普遍。同样,对腐败的看法和人生阶梯在北美和西欧有很强的负相关性**
我们能从中推断出什么?很难从这些观察中得出任何结论,因为变量的分布在不同的地区有很大的不同。然而,上述相关性揭示了重要的事实,并为理解世界各地的幸福动态提供了有趣的见解。
结论
不出所料,幸福的动力是多方面的,因国家和时间的不同而不同。然而,这种复杂性不应阻止决策者考虑这些因素。相反,他们应该使用幸福指数来确定要实施的正确政策,同时也要衡量政策的绩效。他们可以依靠经济学、心理学、调查分析和健康领域专家的帮助,来定义如何有效地使用幸福感的测量方法
在这篇文章中,我简单地进行了数据解释性分析,以获得对幸福动态的深入了解。接下来,我将重点讨论幸福和其他因素之间的因果关系。
用机器学习理解幸福动力学(下)
对幸福驱动因素的深入分析
幸福是我们都渴望的,然而它的关键因素仍然不清楚。
有些人会认为财富是最重要的条件,因为它决定一个人的生活条件。然而,有些人会正确地指出,富人并不总是快乐的。相反,一个人的社会关系(家人、朋友等。)对他的幸福也有同样的贡献。最后,有些人会争辩说,政府实施的政策才是真正决定一个人幸福的因素,因为它们间接决定了我们的生活条件和社会交往。
这些都是关于幸福的一般和直观的想法,我们可以通过自己的经验很容易理解。**然而,我认为数据驱动的方法可以让我们更深入地了解快乐的驱动因素。**通过应用最先进的机器学习技术,将有可能定义最重要的因素,并定量衡量它们对一个人幸福的贡献。
在这种背景下,我分析了《世界幸福报告》的数据,这是一项具有里程碑意义的全球幸福状况调查。一方面,它包含了基于盖洛普世界民意调查(GWP)收集的答案的幸福分数,另一方面,它包含了经济生产、社会支持、预期寿命、自由、廉洁和慷慨等指标。
本文是一系列文章中的第二篇,在这篇文章中,我分享了我对该主题进行的深入研究的主要发现。在我之前的文章中,我从纯描述性的角度分析了幸福。因此,我讨论了幸福与三个基本要素之间的复杂关系:财富、社会关系和公共政策。这种数据探索性分析揭开了世界各地区之间长期存在的差异的面纱。
然而,它纯粹是描述性的。它没有告诉我们最关键的问题:**什么真正带来幸福,到什么程度,为什么?**本文旨在通过关注幸福和其他变量之间的因果关系,使用统计工具和机器学习来回答这些问题。
从这个角度来看,我依赖于两种方法:一种是经济学领域常用的“传统”方法,另一种是基于最先进的机器学习解释工具的新方法。
事不宜迟,让我们深入幸福的微观和宏观计量经济学吧!
结构:
- 关于数据
- “古典”方法
- 机器学习方法
- 限制
1.关于数据
这里快速回顾一下世界幸福报告数据集的变量。关于数据的更多信息,可以参考我之前的文章这里。
经济指标:
- ***😗**按 2011 年不变国际美元购买力平价(PPP)计算的人均 GDP。
- 出生时健康预期寿命 。
幸福指标:
*幸福指数主要来自 G *allup World Poll (GWP),该公司使用随机选择的、具有全国代表性的样本,持续调查不同国家的居民。这些指标如下:
- 坎特里尔量表 ,或 人生阶梯 :它由要求受访者用 0 到 10 的“阶梯”量表给自己的生活打分组成,其中 0 表示可能最坏的生活。
- :它是前一天快乐、欢笑和享受的平均影响指标。
- 负面影响 :它代表前一天对担心、悲伤和愤怒的影响测量的平均值。
社会指标:
社会指标也来自 GWP 的调查。它们包括:
- 论人均 GDP。
- 做出人生选择的自由 : 它代表了对问题“你对自己选择如何生活的自由感到满意还是不满意?”
- 对腐败的看法:它代表了两个问题的二元答案的全国平均值:“腐败是否在整个政府中普遍存在?”和“企业内部的腐败现象是否普遍?
2.“经典”方法
2.1.变量的选择
我必须解决的第一个问题是:为幸福建模保留什么变量?换句话说,在解释幸福时,哪些变量真正重要?
为此,我进行了一次主成分分析 (PCA)。该方法通过构建数量较少的代表性变量,从数据中提取最重要的信息,这些变量共同解释了原始数据集中的大部分可变性。
称为 P 主分量的新变量是特征空间中的方向,原始数据沿着该方向高度可变。因此,通过分析它们的组成,可以确定为研究保留的变量。
关于 PCA 的更多信息,可以阅读这篇文章。
下图显示了每个主成分解释的差异百分比。前两个解释了大部分的差异。
图 1 —由主成分解释的差异
下图分析了主要成分的构成及其与原始变量的相关性。
图 2——变量对主成分的贡献
图 3 —变量和主成分的相关矩阵
这些图表强烈地表明,有 6 个关键变量需要保留在模型中:人均国内生产总值、社会支持、出生时的健康预期寿命、做出生活选择的自由、慷慨程度和对腐败的看法。综合来看,这六个变量解释了各国之间国家年度平均阶梯得分的大部分差异。
此外,可以看到每个变量对双标图中两个第一主成分的影响有多强烈。该图还通过代表向量之间的角度显示了变量之间的相关性:角度越小,变量之间的正相关程度越高。**
因此,生命阶梯、人均 GDP、出生时健康预期寿命、和社会支持度解释了第一主成分的大部分,并且相互之间强相关。
图 4 — PCA 双标图
2.2.幸福建模
相关性有助于快速了解数据。但是,当涉及到识别两个或多个变量之间的相关性是否代表因果关系时,事情就变得棘手了。
我们举一个著名的例子。2012 年,梅瑟利发表了一篇论文,指出一个国家的巧克力消费水平与其人口的认知功能高度相关。这是否意味着吃更多的巧克力会让你变得更苗条?可惜,很可能不是!
关于因果关系的更多信息,你可以阅读这篇文章或者观看下面的视频。
然而,建立因果关系在决策中至关重要。例如,平均而言,出生时健康预期寿命高的国家往往更幸福。这是否意味着确保良好的医疗体系会增加人们的幸福感?视情况而定,因为健康的人仍然可以糟糕地评价他们的生活。
因此,要回答这类问题,就必须使用统计工具,比如回归分析。经济学家经常使用回归分析。它们使他们不仅能够量化一个变量和其他变量之间的关系,而且能够通过统计测试量化其相关性关系。
方法学
在进行回归分析时,一方面,控制在不同国家间保持不变但随时间变化的变量是很重要的。例如,经济危机,如 2008 年的次贷危机,对全球人民的幸福产生了影响。
另一方面,必须控制非时变的未观察到的个体特征,例如乡村天气。这些控制使我们能够真正捕捉到解释变量和幸福之间的因果关系。
**为此,我依赖于众所周知的技术**固定效果。更具体地说,我根据回归中包含的固定效果考虑了 3 设置。
- 年份效应
- 年份和区域影响
- 年份和国家效应
这种方法类似于世界幸福报告中的方法,除了我通过最小-最大标准化重新调整了变量。这解释了结果的差异。
结果
不出所料,在这三种情况下,所有变量都很重要。更准确地说:
- **对数人均国内生产总值始终是最重要的因素,其系数值从 0.29 到 0.99 不等。
- **社会支持在第一个情景中排在第一位,在另外两个情景中排在第二位,系数值在 0.21 到 0.29 之间。
- **出生时的健康预期寿命仅在考虑第一种情况下的方差时与 0 有显著差异。在第三种情况下,它的符号甚至是负数。这表明第二种情况的结果是最可靠的。
- **慷慨和对腐败的感知相对不那么重要,它们的方差很高。
3.机器学习方法
在过去的十年里,机器学习领域取得了重大成功。它已被应用于许多领域,并被证明是非常有效的,往往优于通常的统计方法。
**然而,研究首先集中于开发在预测或分类的准确性方面最有效的算法。只是在最近几年才转向需要建立**因果干扰。如今,它是数据科学家社区热情的源泉。
在这种背景下,我决定应用在机器学习中使用的最先进的解释技术来更好地理解快乐的驱动因素。**
方法学
为此,我按 4 步进行:
****a .国民平均幸福感的建模:**我在数据集上测试了不同的机器学习算法,并微调了它们的超参数。
**b .变量相对重要性的比较:**我用最佳模型计算了每个变量的相对重要性。
**c .变量对幸福感的边际影响分析:**通过分析解释变量对幸福感的部分依赖性,更进一步。 d .按地区进行的幸福动态分析:通过仔细查看地区层面来细化分析。
**解释变量包括 6 个关键指标(人均国内生产总值、社会支持、出生时健康预期寿命、做出生活选择的自由、慷慨程度和对腐败的看法)作为以及年份和地区固定效应。如前所述,这些变量通过最大-最小标准化进行重新调整。
我使用了以下 Python 库: scikit-learn 和 skater 。
结果
a .国民平均幸福感的建模
我应用最常用的机器学习算法,根据解释变量预测人生阶梯。为了比较它们在预测方面的表现,我进行了 5 重交叉验证,并比较了平均值均方根误差(RMSE) 。****
下图所示的结果表明,基于树的方法表现出更好的结果。更特别的是,额外的树算法呈现出最低的 RMSE 。
图 5—使用不同机器学习算法的 5 重交叉验证的平均 RSME
b .变量相对重要性的比较
Extra-Trees 是一种众所周知的算法,它训练多个随机决策树,并通过平均它们的结果来组合它们。该图简要说明了该算法的基本原理和步骤。
图 6 —随机树林, 来源
关于随机树森林的更多信息在 sckit-learn 文档中提供,此处。
额外的树模型,*作为一个基于树的模型,通过特性提供了对其结果的解释。这些被计算为特征存在的每个节点的杂质的减少,通过到达该节点的概率进行加权。***
下图显示了模型给出的变量的特征重要性。对数人均国内生产总值、社会支持和出生时健康预期寿命似乎是寿命阶梯的最具决定性的因素。其他模型就不是这样了,即随机森林、AdaBoost 和*梯度提升。这些算法将出生时的健康预期寿命放在人均国内生产总值和社会支持的前面。*****
图 7——由额外树模型给出的特征重要性**
c .分析变量对幸福的边际影响
还可以通过绘制部分相关性来可视化这 3 个变量对模型预测的边际影响。下图显示了略微上升的趋势。这意味着对数人均 GDP、社会支持和出生时健康预期寿命中一个变量的增加,而模型中的其他变量保持不变,会导致幸福感的增加。****
图 8-三个最重要变量的部分相关性
通过可视化两个变量对模型预测的边际影响,可以进一步进行分析。下面的 3D 图与我们的预期一致:一个人的财富和社会支持越高,他就越幸福!
图 9-对数人均国内生产总值和社会支持的部分相关性
****总的来说,到目前为止进行的分析不仅证实了我们通过操纵数据所看到的洞察力,而且使我们能够量化它们。金钱和健康以及我们所爱的人的社会支持是幸福的支柱。它们是促使人们积极评价自己生活的因素。
然而,这些观察是在世界范围内进行的。我们仍然需要从一个国家的角度探索幸福的动力,以获得新的发现。
d.按地区分析幸福度动态
如果按地理区域考虑国家一级,这种分析就变得更加有趣。特别是,发达国家、新兴国家和发展中国家之间存在着巨大的差距。这些国家对事物的评价不同。我们来看看吧!
北美
北美国家的结果最令人惊讶,与其他国家截然不同:对数人均 GDP 落后于其他因素。它的重要性仅仅代表了做出生活选择的自由的一半。出生时的健康预期寿命、社会支持、和对腐败的看法排在之后,在幸福的模型预测中具有相对相似的重要性。**
图 10 —北美和 ANZ 国家模型给出的特征重要性
**对数人均国内生产总值、社会支持和出生时健康预期寿命的偏相关图显示出趋于平缓的增长趋势。这表明,在某一点之后,他们价值的增加并不会导致幸福的显著增加。
图 11 —部分依赖
对于西欧国家来说,对数人均国内生产总值和对腐败的看法在决定人们的幸福感方面扮演着相似的角色。同样,做出生活选择的自由排在第三位,紧接在社会支持之前。相反,出生时健康预期寿命落后于其他变量。
图 12 —西欧国家模型给出的特征重要性
至于北美国家, Log 人均国内生产总值的部分依赖图显示出越来越趋于平缓的趋势,这表明在某个点之后,财富的增加不会导致幸福的显著增加。
对于新兴和发展中国家来说,对数人均 GDP始终是最重要的因素。接下来的变量取决于地区,通常是社会支持或出生时的健康预期寿命。在南亚国家,社会支持几乎和人均 GDP 一样重要。****
图 13 —南亚国家模型给出的特征重要性
更令人惊讶的是对对数人均国内生产总值的部分依赖呈钟形。这意味着,在财富达到一定水平后,一个人财富的增加会导致他幸福度的下降!
图 14——三个最重要变量的部分相关性
**社会支持也是中欧和东欧、撒哈拉以南非洲、独立国家联合体国家的第二个最重要的变量,但相对比例并不总是相同,如下图所示。
图 15 —中欧和东欧国家模型给出的特征重要性
图 16——撒哈拉以南非洲国家模型给出的特征重要性
相反,拉丁美洲和加勒比海、中东和北非东部、东亚和东南亚的国家更“重视”出生时健康的预期寿命,而不是社会支持,如下图所示。
图 17—模型对拉丁美洲和加勒比海国家的重要性
图 18 —中东和北非国家模型给出的特征重要性
图 19 —东亚国家模型给出的特征重要性
图 20 —东南亚国家模型给出的特征重要性
如何解释国家之间的这些差异?
有些人可能会说这完全是关于国家的文化和价值观,但实际上这是一个需要更深入研究的棘手问题。尽管如此,所进行的分析已经使我们知道一个国家的人民最重视什么,以及应该采取什么政策来改善他们的生活条件。
限制
最后,我想指出上述方法的 3 个主要局限性:
- ****省略变量:虽然直观上与给定的题目相关,但用来解释快乐的变量可能还不够。它们的相关性可能实际上反映了分析中没有包括的一些其他“未观察到的”因素。
- ****反向因果关系:还存在双向因果关系的风险。这意味着幸福会引起一个或多个解释变量的变化。例如,人们快乐是因为他们健康,还是他们快乐的情绪让他们感觉健康?人们快乐是因为他们富有,还是快乐的感觉让他们在职业生活中更有活力和雄心?
- 测量错误:**许多被分析的变量都是主观的,更多地代表了人们的感知而非现实。例如,来自一个有着悠久民主政治传统的国家的人们可能会更强烈地感受到腐败,而腐败比其他国家更弱、更不普遍。此外,选择人均 GDP和出生时健康预期寿命分别代表人们的财富和健康。**