处理数据产品中的模型不确定性
照片由 Rich Tervet 在 Unsplash 上拍摄,经作者许可编辑
随着软件越来越接近传统行业(想想拼车、金融科技、农业科技等等)。),越来越多的数据产品被构建来支持或自动化通常由人类专家做出的决策。当这种情况发生时,通常会有一个有效的疑问,即一个数据产品是否能够将解决方案自动化到足够高的标准,从而值得投资。
如果不加以管理,这种不确定性可能会阻碍优秀数据产品的生产。要么数据产品的开发方式会严重损害业务,因为数据科学家高估了他们模型的价值,要么人类专家会完全拒绝该产品,永远不会从他们的数据中实现任何价值。
我试图写下一些处理数据产品中设计不确定性的技巧:(a)在你的数据产品中建立参数化或敏捷性,(b)以敏捷的方式发展你的数据产品。这些概念对于产品管理来说通常并不陌生,但当数据科学家发现自己不得不成为自己的产品经理时,我认为从这个角度来表述是有用的。
在我们没有数据的地方建立参数化
我们应该把信用额度限制在 1000 万 PHP 还是 1500 万 PHP?有时,没有数据驱动的方法来回答这个问题,因为我们没有用户对这个政策会有什么反应的例子。领域专家可能也不愿意做出这个数字应该是多少的强有力的决定,但是在典型的软件开发环境中,有一种需求是将用户故事细化到精确的参数。
在这些情况下,最好的做法是花时间将这些决策参数化。我们可以将它们设置为目前有意义的值,但一旦我们有了新的信息,就内置到产品功能中来快速切换该参数(一旦我们有了足够的示例,就用一些机器学习的决策来替换它)。
通过这种方式,产品开发可以向前推进,而不必做出潜在的成本高昂且难以逆转的决策。
换句话说:你可以建立完美的预测,这样你就可以在推出数据产品时准确地知道会发生什么,或者你可以建立瞬间反应时间,这样你就永远不会真正需要预测。
不断发展的数据产品
不是所有的东西一开始都必须是神经网络;事实上,如果你开始一个项目时首先想到的是统计建模或机器学习,你可能会面临很多问题。
处理模型性能不确定性的一种方法是在您的自动化旅程中采取较小的步骤。您可以在这里看到三个不同的层面,在这三个层面上,数据在决策中扮演着越来越重要的角色。虽然从“直觉”到“数据驱动”再到“人工智能驱动”的进展是清晰的,并且可能没有人会发现试图在这个阶梯上前进的问题,但项目往往会在绿框(人工智能参与的水平)中出错。
作者照片
在这里,我们可以从典型的软件(基于规则的逻辑和基于事实的输入)开始,沿着绿色的盒子前进。一旦我们适应并继续收集数据/减少关于如何做出正确决策的不确定性,您就可以在链上前进并向其中添加更多的建模元素。
有两个因素会影响您跨越绿色轴的速度:
- 失败成本 —这是你试图自动化的决策所固有的。担保不良贷款的失败成本将比在电子商务网站上提供错误的推荐低得多。
- 数据完整性 —这是数据工程基础绝对重要的地方。像图像处理这样的问题是数据完整;100%确定某物是狗还是猫所需的任何信息都已经在图像中了。然而,当你试图借钱给某人时,你很难观察到那个人如何管理他/她的财务或经营他/她的生意的每个方面。如果你能以一种便宜且自动化的方式自动化数据收集,那么你就更有可能进步到更高级的决策自动化形式。
那么这一切意味着什么呢?
数据科学课程和训练营中教授的机器学习和人工智能是一种具有非常不确定的攻击面的解决方案(即,我们还不知道它到底适合解决什么类型的问题)。
这就是为什么当不再有大量的宣传时,很难让企业投资这项技术的一个重要原因,即使可能会带来巨大的、改变游戏规则的好处。
为了推进项目,数据从业者需要:
- 通过参数化构建内在敏捷的产品,以及
- 从简单的基于规则的系统一直到完全自动化的决策,以增量和敏捷的方式移动,最大限度地降低风险并在此过程中纳入新数据。
处理我们对新冠肺炎指数增长的系统性误判
Unsplash 上 Fusion 医疗动画
的照片
指数增长偏差使我们无法掌握指数增长的实际动态。让我们看看简单的数据可视化和分析技术。
由迪奥尼西斯·雷维斯和灭霸·巴洛梅诺斯合著。
这篇文章的一个稍加修改的版本首先发表在天秤座 MLI 的博客上,其中包括通过新冠肺炎比较分析工具生成的互动图表
我们人类正在遭受理性判断和理解世界的系统性缺陷。这种感知上的系统性错误被称为认知偏差。维基百科列出了 100 多种经过充分研究的认知偏见,如果你认为这些偏见与你无关,那么,你并不孤单。像我们大多数人一样,你只是受到偏见盲点的困扰,这本身就是一种认知偏见!
人类的直觉很难实现指数增长
随着当前新冠肺炎疫情的持续,困扰全球数百万居家隔离者的认知偏差是指数增长偏差【1】。我们的大脑不具备指数思维的能力。如果我们从前门走 30 步,我们可以很容易地估计我们会到达哪里,但是如果我们走 30 个指数级的步骤,也就是每次走一倍,我们就无法估计我们会走多远。1+2+4+8+16.答案是,我们会绕地球 26 圈!
冠状病毒呈指数传播,而不是线性传播。指数增长偏差使得公民很难评估疫情在他们国家的地位,包括未来几天的潜在后果。我们新冠肺炎系列博文的一个主要目的是展示和提供非专业人士也能理解的交互式可视化和工具,这将有助于缓解指数增长偏差障碍,并揭示支撑新冠肺炎数据的趋势和相关性。
对抗指数增长偏差的可视化方法
在深入研究视觉评估新冠肺炎疫情的方法之前,让我们考虑从 2 月 22 日至今(即 4 月 10 日)的每日死亡报告。我们选择了 5 个国家作为例子:意大利和西班牙,代表遭受严重影响的国家,但它们已经达到高峰,英国和美国,它们在晚些时候受到影响,在感染人数和死亡人数方面仍在恶化,最后,我们有比利时代表受影响病例增加相对较晚的国家。
如果我们绘制每个日期的累计(总体)死亡人数,我们会得到上面的图表。我们得到的印象是,意大利和西班牙的情况相似,英国的情况较温和,而美国的情况在快速恶化。但是,请注意,如果我们回到 4 月 4 日,那么我们只有到那时为止的数据,那么我们可能会得出结论,美国可能会像西班牙和意大利一样。就比利时而言,它似乎经历了一场温和得多且相对得到良好控制的疫情。在这张图表的交互式版本中,可以在原始帖子中找到,您可以在国家选择窗格中包含您选择的国家。这张图表是直观感受指数增长和评估每个国家情况的最佳方法吗?简单的回答是不!
我们建议依靠三种互补的技术:时间校准,使用对数标度和指数拟合。
时间校准
媒体和政策制定者发表声明,如“我们落后 X 国 2 到 3 周”,其中 X 通常是意大利。这种比较,如果正确的话,提供了一个具体的形势评估,并绕过指数增长偏差。
时间排列允许在爆发之间进行可靠的比较分析
要概括这样的比较分析,我们必须将所有国家在时间上对齐,就好像疫情是在同一天开始的一样。有许多方法可以实现这一点。一个不太详细的日期是第一天,即每个国家记录第一个病例的日期。一个稍微好一点的选择是让几个案例累积起来,并使所有国家在一个普通的日子里有一个固定的案例总数,例如 50 个。在下一张图中,我们遵循后一种方法。
我们现在所能得出的结论有了很大的改进。与意大利相比,西班牙的情况显然更糟(至少在第 45 天左右),与西班牙和意大利相比,美国的情况正在迅速恶化。英国的情况和意大利一样糟糕。另一方面,与我们在没有时间校准的情况下观察到的情况相比,比利时的情况似乎更糟。
当比较在时间上相隔很远或在发展的早期阶段发生的疾病爆发时,时间比对更为有益。
对数标度的使用
虽然时间排列揭示了每个国家疫情爆发的灵活性,但有一个明显的问题需要解决。每次疫情爆发的早期都被压缩在图表底部附近,很难进行比较。这是不可避免的,因为指数增长的本质,它需要一段时间才能开始,但不久,它就会飞速增长。接下来描述了这样一个例子,涉及美国、西班牙和希腊的确诊感染。
显然,很难对美国和西班牙疫情的早期阶段进行比较,对希腊的任何直观评估都是不可行的。
解决方法是将图表的纵轴从线性刻度改为对数刻度。这意味着,不是线性上升,而是 10,20,30…,1000 等等。以指数方式增加,例如 10 的幂,(10,100,1000…)。除非你精通数学,否则很难理解这一点。在对数尺度上可视化数据时,只需要带两件东西;a)我们在纵轴上保留的用于可视化情况 1 至 10 的空间等于我们为情况 11 至 100 或 101 至 1000、1001 至 10000 等保留的空间。这很有帮助,因为我们现在可以为与每次爆发相对应的小数据值提供更多空间。b)如果一个国家的病例呈指数增长,那么在对数尺度上,它们将出现在一条直线上。在以后的文章中,我们可能还会调查对数标度表示的潜力,揭示每个国家采取的最有影响力的遏制措施。让我们看看当纵轴是对数标度而不是线性标度时,前面的例子是怎样出现的:
解决了小值的混乱。一个额外的优点是,我们可以很容易地计算出每个国家将报告病例增加 10 倍所需的天数,比如从 1.000 到 10.000。我们只需要计算相应网格线之间的点,这揭示了在疫情的早期阶段,西班牙确诊病例的上升速度比美国要快。西班牙从 100 到 10000 用了 15 天,而美国用了 17 天。之后,西班牙的增长率放缓(从 10.000 到 100.000 又需要 15 天,而美国只需要 9 天)。
对数标度在关注疾病爆发的早期阶段是有益的
最常见的是,当冠状病毒传播与指数增长相关时,隐含着固定增长率的指数增长。增长率表示每天病例增加的百分比。10%的增长率意味着,如果你有 100 个案例,第二天就会有 110 个,或者当你有 1,000,000 个案例时,第二天就会有另外的 100,000 个案例。在对数标度图中,这意味着从对数标度图的一条网格线到下一条网格线需要相同的天数,这相当于所有的点都在一条直线上。幸运的是,真实数据显示,这种行为只是在疫情的早期阶段,比如在美国,从 100 例到 20,000 例,才是大致准确的近似值。此后,增长率越来越低,原因有几个,包括各州为遏制疫情采取的过度措施,以及病毒感染新人的能力逐渐降低,要么是因为潜在候选人生病并康复,因此具有免疫力,要么是因为他们去世了。
指数拟合
无法掌握指数级进化的现象意味着什么?这意味着当你有从 A 日到 B 日的一系列数据时,我们无法想象接下来几天的数据。那么,预测建模的帮助来了!我们可以采用一个被约束为服从指数增长行为的模型,并以数据驱动的方式(即使用从日期 A 到日期 B 的可用数据)对其进行调整,以使其最适合。这个动作被解释为:在所有可能的指数增长曲线(无限的)中,找到并使用尽可能紧密跟随可用数据的曲线。
假设固定增长,指数拟合估计预期的未来病例数
让我们以美国为例,找出最符合前 1.025 例确诊感染数据的指数曲线,即垂直虚线所示的 3 月 11 日(“使用至今的数据”)。
薄的透明曲线是预测的指数曲线,正如可以看到的那样,非常适合直到 3 月 27 日,其中病例总数约为 85.000。而且,如果我们用新冠肺炎比较分析工具复制这个图表,悬停在美国的指数曲线上,我们得到预测的指数拟合的增长率,是 32.51%。这意味着,据预测,美国每天的确诊感染人数比前一天增加了 32.51%。幸运的是,感染的真实增长率不是固定的,在 3 月 27 日之后,估计模型偏离真实数据,增长率下降。
家庭作业
假设 X 国的增长率固定为 10%。从 10 个案例到 1000 个案例需要多少天
如果你的答案是 100 天,不要担心,这是指数增长偏差造成的!
参考
【1】利维,M.R .和塔索夫,j . 2017。指数增长偏差和过度自信。《经济心理学杂志》, 58 ,第 1–14 页。
这个好例子摘自彼得·迪亚曼迪斯和史蒂文·科特勒著的《富足:未来比你想象的更好》,西蒙和舒斯特出版社,2012 年。
编者注: 走向数据科学 是一份以研究数据科学和机器学习为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
提交研究论文后如何应对审稿人的拒绝
会经常发生的!
我要从头开始吗? 知识共享 4.0 BY-NC
你花了几个月甚至几年的时间,小心翼翼地将你的研究成果写成论文,提交给同行评议的期刊。你提心吊胆地等了两个月到 18 个月(迄今为止我的最小和最大范围),想听听你认为会成为你领域专家的人的意见(并不总是不幸的)。你们中的一些人担心自己的作品不够好,评论者会指出致命的缺陷。在他们内心深处的其他人会认为或者至少希望评论者会认识到他们有多聪明。通知来了,你的心沉了下去。编辑礼貌地拒绝了发表你作品的机会。
应对拒绝——接下来该怎么办?
尤其是研究生问我的最常见的问题之一是,在收到一封附有详细评论的拒绝信后,下一步该怎么做?首先要注意的是,拒绝是非常普遍的,所以不要过度担心。我仍然记得我在读博士时收到的第一个审稿人的评论。一位评论家的语气让我大吃一惊。他们似乎没有抓住论文的重点,表现得极其粗鲁和傲慢。
当时,我并没有意识到审稿人和编辑的评论会有多么多变。审阅过程可能非常随机,很难在多个审阅者之间获得一致性,如果编辑要让您进入下一阶段,通常需要这种一致性。事实上,在经济学领域,假设你的论文会被拒绝通常是最好的,尤其是如果你是一名早期职业研究员。这并不意味着你不应该期望发表你的论文,而是可能需要平均多次尝试,尝试的次数将取决于论文有多好,你在期刊选择方面有多雄心勃勃,以及你有多幸运。这里坚持是真正的关键。
在重新提交给另一个期刊之前,我应该对我的论文做些什么修改?
我收到了来自拒绝我论文的审稿人的非常有见地的评论,但我也收到了非常无用的评论,这些评论似乎在很大程度上反映了他们自己的主观偏见和成见,而不是对具体论文的优点或其他方面的任何仔细评估。作为一名研究生,很难分清哪个是哪个。我注意到有些人完全忽略了评论者的评论,直接重新提交到其他地方,而其他人可能会花几个月的时间在重新提交之前尽可能多地处理评论。
在决定如何做时,将审稿人的意见分为三大类可能会有所帮助,这种分类适用于任何特定论文的程度当然会有很大不同。
1。极有帮助
这可能采取的形式是被指向你不知道的新的相关文献。一个新的潜在渠道,可以帮助解释主要结果。一种稳健性或敏感性检查,可以进一步增加调查结果的权重。一个重要的方法细节被忽略或没有非常清楚地提出。关键论点表述不一致。一个未曾想到的关键政策含义。一般来说,那些不厌其烦地提供像这样有帮助的评论的评论者也会小心翼翼地用一种通融的语气来表达。话虽如此,即使语气似乎很严厉,也要试着超越这一点。
**2。很少或没有用
这些完全没有抓住论文的要点。很难简单地描述,但可能采取对整个研究领域(如幸福经济学)或方法(如我不喜欢调查)的敌对评论的形式,而不是对具体论文的优点进行评估。评论也可能反映了这样一个事实,即该评论者有一篇与之竞争的论文,或者仅仅是这篇论文与他们以前的工作相矛盾,这反过来可能会损害(通常是无意识地)评论的公正性。居高临下或幼稚的评论——这通常采取批评方法的形式(例如使用固定效果),同时误解其实际涉及的内容,并经常使用高人一等的语气试图说服编辑他们有多么博学。更广泛地说,试图用过于复杂的批评和“抓住问题”的心态来打动编辑也是很不幸的。
**3。之间的东西
我发现这些评论与写作风格和结构有关。例如,通过扩展背景部分,你可以更仔细地阐述与任何相关的丰富文献,这份报告将会有很大的改进。浓缩结论。扩展结论。你把 X 解释得太详细了。你解释的太详细了,等等。等等。
我的建议是,在重新提交之前,尽量处理好上面 1 条中的评论。审稿人和编辑之间的差异当然非常非常大(在未来的帖子中会有更多),但即使在与新审稿人打交道时不太可能出现这些相同的评论,你的论文也会通过考虑这些要点而得到加强。这反过来可能会增加未来评论者对你论文的喜欢程度。同样很有可能的是,同一位审稿人被要求再次审阅你的论文,他们很可能会欣赏你在回应他们的意见时所做的任何修改,或者如果你没有采纳他们的意见,他们会感到恼火。我建议安全地忽略第二类评论。他们不会改进你应该关心的论文。的确,你可能会再次得到同一个评论者,但很可能无论你做什么,评论者都会再次发现一些*【致命缺陷】*,并建议拒绝。
是否处理最后一类中的任何评论是一种平衡行为。你能做的任何提高论文清晰度的事情都会增加你的机会,但是有收益递减。你必须意识到所涉及的时间,特别是如果你还有新的研究机会去追求的话。同样值得记住的是,例如,如果一个评论者为一个更详细的阐述提出了令人信服的理由,另一个评论者可能会觉得有太多的细节掩盖了你的关键贡献。因此,如果你不小心的话,你可能会有点追不上你的尾巴。
虽然来自评论者关于风格和结构的评论可能是有帮助的,但我发现时间的流逝通常比任何评论者的评论更有效。当我收到拒绝后再次看论文时,我几乎总能找到各种方法让我的文章更清晰。事实上,即使我没有发现审稿人的评论特别有启发性,但我在收到拒绝后六个月彻底修改论文的情况并不少见。这可能反映了这样一个事实,即写作的清晰度在不断提高,我自己对相关主题的知识也可能在这段时间里有所提高,没有什么比用新的眼光看待事物更好的了,即使它们是你自己的。
亲爱的企业,首先是完美的电子表格和 SQL
让数据科学更贴近企业,并为企业的成功做好准备
让我们面对现实吧。尽管围绕数据科学已经炒作了几十年,但任何企业都很难采用它。
但是为什么呢?
如果你回到任何一家公司的历史,你首先会看到一个最独特的产品(MVP)的诞生。然后,支持公司可伸缩性的部门,如营销、运营和产品(包括工程)进入场景。接下来是让公司承担责任的支持部门,如财务和人力资源部门。一旦你获得了牵引力,你可能最终会开始考虑是否有一个专门的分析团队来为你构建可持续的报告。如果你愿意,可以称之为“支持支持部门”。
自从哈佛商业评论称“数据科学家”是 21 世纪最性感的工作让学习者一头扎进数据科学 101 以来,无数的在线课程、博客和教程视频激增。因此,我们创造了一群“数据科学”员工候选人。雇主呢?雇主是否知道公司正处于雇佣合适人才的哪个阶段,这些人才将推动公司利用数据科学?
在本文中,我将使用一个轶事来概述许多企业中的一个常见场景,并且我将讨论许多公司在为数据科学做好准备之前所经历的阶段。如果您希望了解更多关于让数据科学与任何业务相关的信息,请点击本文末尾的相关资源超链接。
介绍…Excel,您的测试版报告的诞生地
我们都经历过。当我们渴望知道答案,并且现在就想知道答案的时候。我们有这 6 个月的销售数据,我们只想知道收集的指标(客户详细信息,如年龄、居住地、他们选择的产品、支付的价格、他们成为客户多久了,等。给我们介绍一下我们的业务。
因此,我们打开一个新的工作表,开始键入我们已经有的 10 行,或者从已经很好地将其放入表格的人那里复制。或者进阶导入一些。csv 文件导入到电子表格中。
作者图片:贵公司的第一张纸 1
你可能不需要用图表来告诉你,在你的前 10 个(特殊的)客户中,3/10 来自多伦多(6/10 来自东海岸)。“苹果”是你最喜欢的产品,其次是“桔子”。你的平均客户生命周期是 4 个月。在 6 个月的时间里,这 10 个客户中,你总共从他们身上赚了 540 美元。
这就是了。你不需要一个分析团队,因为你还负担不起,数据样本仍然很小,你和电子表格可以一起完成这项工作。
大约 2 到 3 年后,“伟大的电子表格”诞生了
业务增长了,你,创始人,雇了一个分析师(Linda ),他会为你汇总所有的销售数据。首先,你教她你是如何做报告的,然后你给她一个方向或一个要求,她有自主权以她自己的方式构建报告。
GIF via GIPHY
除了这一次,你注意到报告上的数字一点也不一致。你让琳达重新做报告,但是数字看起来还是不太对。你试图进一步调查,要求她发送她用来整理报告的原始数据,但这太过分了。她从这份极其丰富多彩的报告中复制并粘贴了一行,并在至少两张纸上做了一个又一个 Vlookup,以首先获得参考文件或映射,然后获得数字。由于无法承受大量的手工工作,Linda 在处理了两年的报告后辞职了。
你的新员工 Jerry 受到了 Linda 和其他人创建的“伟大的电子表格”的欢迎。他开始做的正是琳达所做的,即使在周末也非常努力。又过了半年,Jerry 向您提出了对数据仓库的需求,并请求您提供资金。有趣的是,你问 Jerry 他是否解决了他一直激烈批评的“大电子表格”问题。
杰瑞有备而来。
他列举了自己为移除“大电子表格”所做的基础工作:
- 定义一个业务流程和所需的核心数据。 对于已经升级为成本报告仪表板的销售数据,他每周都会将供应商的发票(他让他们按照一定的格式)下载到一个 google drive 中。他一直在和工程团队的伙伴聊天,他正在学习如何按计划有计划地下载发票。其次,他与市场部建立了一个共享的 google sheet,这样他就可以收集客户订购的东西,并进行严格的数据验证,以标记无效的值。随着客户数据的积累,他根据日期将历史数据分块归档。
- 从简化的数据处理中自动构建报告。
财务部门需要供应商的发票来调节任何差异,因此他为他们提供了查看权限。在幕后,他在 Google Apps 脚本中有一个脚本计算,以方便对账,他将一周内所有订购产品 X 的客户与产品 X 的发票总额进行匹配。这解释了当客户订单和发票金额之间的数字不一致时,您在仪表板上看到的条件格式。他刚刚开始将运营成本纳入仪表板,以进一步帮助财务部门和您分析额外的业务支出。 - 记录整个业务流程,让事情变得简单。他很快意识到他不能仅仅因为知道东西在哪里就花一整天来回答人们的问题。他已经在管理数据的每个驱动器中创建了文档,因此用户可以在开始使用驱动器中的数据之前进行自我指导。随着他的所有权的增长,他审查和编辑他的关于新的或修改的业务流程的文档,并且如果其他用户没有遵循某些指导方针并最终得到糟糕的报告,他通常能够让他们承担责任。
你对此深信不疑,接着问 Jerry 为什么需要数据仓库。
Jerry 向您解释说,自从他加入以来,无论是产品数量、客户数量、运营成本类型还是其他方面,数据都在增长。当电子表格随意放置时,做更多的映射和 Vlookups 也变得越来越困难,而数据仓库可以通过连接轻松解决这个问题。他已经建立了一个系统来简化向数据仓库的迁移,因为他还有一整套 SQL 技能没有充分利用。
再见,伟大的电子表格;你好,SQL 数据库
在您批准了 Jerry 的数据仓库提议之后,您已经看到他再次忙于将数据推入数据仓库。您有幸成为第一批登录数据仓库的用户,了解他的数据迁移情况。他已经对您进行了关系数据库和 SQL 的一些基础培训,因此您了解了如何浏览表和运行一些查询。
欢迎您的是组织有序的模式和表。您可以看到customer,
和类似customer_address, customer_orders
的客户周围的维度表。在customer_orders,
下面,您可以看到每个product_id
都与每个订单相关联。更简洁的是在supplier
模式下,你甚至可以看到supplier_product_id
到product_id.
的映射,你肯定财务部门看到这个也会非常兴奋!当然,operations
模式仍在构建中,但是已经可以看到一个计划将product_id
映射到每个cost_type
的表。
Jerry 告诉你,在未来,他不再需要担心他的“电子表格管道”是否能正确地将数据输入到仪表板中。他只需要将仪表板与查询挂钩,该查询将为他提供电子表格管道所能提供的一切,如下所示:
SELECT date,
customer_firstname,
customer_lastname,
customer_address,
product_name,
customer_ordered_price,
SUM(customer_ordered_price) OVER (PARTITION BY product_name, date) AS ordered_product_total,
SUM(supplier_invoiced_price) OVER (PARTITION BY product_name, date) AS invoiced_product_total,
ordered_product_total — invoiced_product_total AS total_delta
FROM product_supplier_joined_view
WHERE SUBDATE(NOW(), INTERVAL 7 DAY);
尽管在工程团队开发进一步简化 Jerry 定义的业务流程的应用程序之前,电子表格仍然需要作为数据收集和转换的权宜之计,但这只是从应用程序而不是电子表格切换管道数据的问题。
Jerry 还提醒您,仍然有许多优秀的电子表格放在各个部门,因为这是每个人在处理临时报告时感觉最舒服的地方。他相信,只要有业务需求,并且业务需求被明确定义,他就能够通过将新数据合并到他的数据仓库中,将临时报告转变为常规报告。
好吧,我们可以开始数据科学了吗?
Artem Maltsev 在 Unsplash 上拍摄的照片
尽管如此,这个轶事是一个关于企业如何尝试数字化转型的理想主义案例研究。通常,“伟大的电子表格”是一个集体的努力,每个利益相关者可能有他们对报告格式的解释。数据收集过程可能根本不存在(例如,供应商发票仍然在纸面上或非结构化的 PDF 文件中)。您的分析师当时不具备所需的技能,也不具备简化报告渠道的远见。工程团队可能很难实现迎合业务需求的变化。现实世界是复杂的,你可能会在很长一段时间内被“伟大的电子表格”所困扰,直到有领导带领你远离它。
假设一家公司或多或少遵循了理想场景,它将更有能力开创数据科学。任何导致新流程的业务变化都意味着整个流程(数据收集、数据转换、数据消费)都应该经过深思熟虑的设计和记录。数据集成只是使数据对数据消费者可用的过程的一部分。例如,如果 Jerry 决定与公司的竞争对手进行价格匹配,他将需要确定在哪里以及如何(经常)获得数据,并在修改标识符后将其合并到他的数据仓库中,然后将该报告提交给相关的利益相关方。
本·韦伯撰写的“创业公司的数据科学”系列是游戏和金融科技行业经验丰富的数据科学家将他在公司建立数据基础设施的旅程转变为工具书的一个例子。
我最近换了行业,加入了一家初创公司,负责建立数据科学…
towardsdatascience.com](/data-science-for-startups-introduction-80d022a18aec)
韦伯用一种非常有趣的方式描述了“数据管道的演变”。我还认为数据本身经历了一次进化:
- **手动电子表格时代:**分析师和数据制作者开始创建一个电子表格生态系统,它可以很好地处理几兆字节的数据,并且在处理临时报告时非常用户友好
- **公式/宏时代:**增加了更多的业务逻辑,数据增长了,可以通过公式将数据“查询”到另一张表中作为参考。某些循环计算,映射,或格式可以写在谷歌应用程序脚本/VBA。
- **数据库时代:**处理 8 张以上的 Vlookup 或等待后台宏完成运行不再是可持续的,处理数据的 web 应用程序可能已经启动,因此数据可以从 UI 或 API 导出。
虽然我同意 Weber 的观点,即由于可扩展性问题,公司应该尽最大努力避免电子表格,但我认为电子表格对于企业来说就像 SQL 对于数据库一样,是一种不会很快消失的通用语言。此外,除非证明报告原型对决策者有用,否则通常不会有正式的业务流程和工具支持,如 web 应用程序和/或数据库。有点进退两难的局面。
猫演示第 22 条军规
为了避免这种进退两难的局面,也为了避免让更多希望专注于更多统计建模(和更少的数据清理)的人才失望,我们必须从解决需求层次的底层开始。大多数企业不一定有那么多数据源(例如*“测井”、“传感器”等。除了“伟大的电子表格”,所以在更精简的流程出现之前,没有任何捷径可以让电子表格系统尽可能地保持有序。*
最后但同样重要的是,一份好的报告通常来自一个好的问题。除了报告可以回答的一些描述性测量(例如,这个月的销售额是多少?我们有什么样的客户统计数据?),还有说明性的衡量标准(例如,本月我们的活动有多少浏览量?我们产品的价格是如何波动的?).每当我们试图度量任何业务度量时,我们必须问自己这个特定的业务度量意味着什么,以及对它进行实验是否会影响或产生额外的业务度量。伊森·诺克斯的文章中有更多很棒的例子。
利用信息是一种熟练的行为,而不是数据产品的输出。
towardsdatascience.com](/is-your-company-too-dumb-to-be-data-driven-696932d597c3)
只有这样,我们才能正式进入数据科学的领域。
离别的思绪
如果你正在读这篇文章,你一定听说过关于数据科学的炒作。关于“洞察力驱动的企业”、“用机器学习预测你的企业”和“人工智能如何加速信息时代”的头条流行语。但帮助企业实现数据科学的最新分步指南仍然缺失。
为了将企业纳入这一系列数据科学宣传中,我们需要开始关注的是,在“数据驱动”之前,首先努力做到“数据就绪”。
“遗留系统”也可能意味着电子表格的海洋,其组织关系到向数据库迁移的容易程度。即使在 SQL 数据库启动并运行之后,还有一系列全新的问题,例如与其他数据源集成,以继续开发新的或现有的数据产品。
暂时忘掉数据驱动吧,您的公司是否有可靠的数据基础架构,数据是否衡量正确的事物?
我想用另一篇哈佛商业评论文章中的一段话来结束这篇文章,这篇文章强调了数字化转型的挑战。
成功需要汇集和协调比大多数领导者所意识到的更大范围的努力。在四个相互关联的领域(技术、数据、流程或组织变革能力)中,任何一个领域表现不佳,都可能破坏一项精心策划的变革。真正重要的事情,从创造和传达一个令人信服的愿景,到制定一个计划并即时调整,再到钻研细节,都与人有关。
多年来,我们参与、建议或研究了数百次数字化转型。这样做,我们已经…
hbr-org.cdn.ampproject.org](https://hbr-org.cdn.ampproject.org/c/s/hbr.org/amp/2020/05/digital-transformation-comes-down-to-talent-in-4-key-areas)**
文章中未直接引用但仍然相关的资源:
我的前一篇文章已经讨论了数据工程为什么以及如何帮助一个组织“数据就绪”。
我如何改变策略来帮助企业启动其数据基础设施和报告渠道
towardsdatascience.com](/voicing-for-data-engineering-the-unsung-hero-b91b6ef39dcd)
如果您想阅读更多关于以下方面的深度文章
- 电子表格最佳实践
- SQL 数据库的威力和局限性
- 如何在公司中扩展数据分析
请在下面评论,并随时让 Iris Huang 了解贵公司如何处理数据!😃**
亲爱的科技界白人同胞们:别说了。
帕特里克·托马索在 Unsplash 上的照片
我曾经坐在联合神学院的课堂上听康乃尔·韦斯特博士的讲座。他的话是预言诗;赋予黑人解放神学生命的口语诗。每堂课,他都会毫无例外地感谢那些他称之为自己黑人血统的人:爵士乐英雄、哈丽雅特·塔布曼、吉米·鲍德温(他这样称呼他),布鲁斯传统的伟大巨人,这样的例子不胜枚举。对韦斯特博士来说,如果不赞颂那些精神祖先为之奋斗的解放,就没有未来的解放。我会坐在教室里,作为一个 22 岁的白人,刚从大学毕业,被这股强大的力量对所有前人的热情和尊重所迷惑。
最近,我的同事 Timnit Gebru 博士在推特上发布了一个链接,链接到 machinelearningknowledge.ai 于 2019 年 11 月 24 日发布的时间表。这个时间线概述了“从 1943 年到 2019 年的深度学习简史。”格布鲁博士的推特上写道,“深度学习的男性专属历史,你说 AlexNet 创造了历史,但 ImageNet 没有,因为女性的贡献不算数。以及除了白人和白人邻居之外的任何人的贡献。”我很好奇格布鲁博士指的是什么,所以我很快点击了链接。
作为一名人工智能伦理的人类学家,以及一名研究深度学习发展史的人,我喜欢认为我对这样一条时间线上可能会发生什么有很好的感觉。但是我看到的让我震惊。在这个时间线上,没有一个女性被承认,只有两个非白人被承认(其中一个是围棋手,不是研究人员),也没有解释为什么。
让我们明确三点:
- 代表性很重要。
我们看到的代表人物改变了我们对历史、现在和未来的看法。作为一个领域的创始学者,我们提拔的人对未来谁会被吸引到这个领域以及这个领域未来会提出什么问题有着不可估量的下游影响。
2。事实很重要。
这不是一个简单的时间表,没有非白人非男性学者在该领域的好例子。费-李非博士通过她的研究创造了 ImageNet,从而永远改变了深度学习领域。达芙妮·柯勒博士首先在确保各种经济背景的学生能够从事以深度学习为基础的职业方面取得了巨大进步。Latanya Sweeney 博士在大数据应用于深度学习及其在隐私和安全领域的应用方面做出了不可估量的贡献。这个清单还在继续(应该有一天会全部写完!)
3。这是常态,不是例外。
这个时间线内的单一身份表示并不是深度学习历史的唯一讲述。这篇文章绝不是 machinelearningknowledge.ai 上的热门文章。不幸的是,他们的时间线是一个缩影,表明工业界和学术界显然默认白人男性的贡献高于女性和有色人种的贡献。当我在会议上与同事讨论深度学习的演变时,我们很少以女性或有色人种对该领域的重要贡献开始深度学习的故事,尽管有很多。
我们现在讲述的历史是一个道德声明,一个政治声明,一个哲学声明。我们如何讲述深度学习等领域的创始学者的故事,是我们对该领域过去、现在和未来价值的陈述。忽视女性和有色人种在该领域发展中的贡献是一个事实上的错误。然而,这也是违反道德的。
这是一篇适合所有人的文章,尤其是那些参与讲述技术发展故事或自己开发技术的白人男性。作为一个科技行业和学术界的白人,我想说以下的话。作为白人,是时候让我们的贡献去中心化,去支持那些在历史上被技术领域边缘化的人们的贡献了。毫不含糊地说,这意味着有意放弃机构权力,将我们从聚光灯下解放出来,最重要的是,在每一个层面上努力讲述那些在 — 之前来到这里的人的故事。
我离开了韦斯特博士的班级,更多的时候是试图回忆起我自己的祖先,那些用意志把我塑造成的人。纪念逝去的人是一种精神修行。我们必须挑战自己,完整地讲述前人的故事。此外,由于我们生活在的社会政治历史的阴影下,我们必须确保我们的研究积极地、毫无歉意地集中于那些被殖民时代悲剧性地隐藏起来的故事。
到目前为止,这篇文章一直在用华丽的方式简单地说:亲爱的技术领域的白人同胞们——别说了。别生气。不要自卫。不要再删除那些你不是主角的故事了。
自动驾驶汽车,如何应对不确定性?
不确定条件下的强化学习优化。
在这里,我与卢卡斯·沃格特、简·杜门和克里斯托弗·弗里贝尔一起展示了这项研究。
TL;技术系统的控制可以在模拟中得到优化。然而,事实上,无数的未知在等着我们。在这篇文章中,我们展示了噪声和传感器误差的增加如何影响强化学习代理的优化结果。
动机
“安全总比后悔好!”
大多数汽车司机都遵循这种想法,因为从长远来看,有时获得一个次优的结果比每次争取一个最佳结果更有利。例如,驾车者很少将车辆的性能发挥到极限,他们更愿意将可能导致事故的误判的可能性降至最低,并接受他们将比理论上可能的时间晚到达目的地的事实。在自动驾驶的发展过程中,这一观察提出了自动驾驶汽车的控制算法在考虑不确定性的情况下如何表现的问题,特别是因为不确定性可能导致误判,从而导致不当行为,这可能导致事故。
远程控制
试试我们新的远程控制环境
towardsdatascience.com](/do-you-want-to-train-a-simplified-self-driving-car-with-reinforcement-learning-be1263622e9e)
作为我们之前提到的问题的研究的基线,我们使用了 OpenAI 健身房的 LongiControl 环境[1],它提供了一种通过强化学习(RL)来训练代理的容易实现的可能性。我们将在以下段落中总结有关 LongiControl 的关键事实,但您可以在我们的第一篇文章 此处 或已发表的论文 此处 中找到更多信息。另外,你可以自己尝试一下 LongiControl,源代码可以在 GitHub 这里 找到。
远程控制环境
关键事实在远程控制环境中,车辆的目标是在给定时间内尽可能节能地完成单车道路线,而不造成事故。总之,这对应于在从 t₀ 到 T 的间隔中使用的总能量 E 的最小化,作为功率 p 的函数:
根据外部要求,如其他道路使用者或速度限制,必须同时满足以下边界条件:
其中 v 为速度, a 为加速度,a_dot 为急动度,其中()ₗᵢₘ,ₘᵢₙ和()ₗᵢₘ,ₘₐₓ分别代表下限和上限。因此,RL 代理试图通过他选择的动作来满足所有这些标准,同时最小化车辆的总能量消耗。
为什么要考虑不确定性?
并不是所有发生在现实世界应用中的影响都可以提前看到。未来是未知的,传感器误差会突然出现,最小的偏差都会导致不希望的结果:
为了弥合现实世界中的代理行为和模拟中的自动驾驶之间的差距,将现实的不确定性融入到模拟中是很重要的。这一研究领域通常被称为“ Sim 到 Real Transfer ”,如果你想了解更多,进一步的例子在[2]和[3]中给出。这一努力的第一步是在 RL 代理的训练环境中实现随机噪声和干扰。结果,典型的代理-环境交互的流程图现在看起来与通常不同。代理请求的动作和环境的新状态都通过随机发生的干扰来修改。
图 1:没有不确定性的主体-环境相互作用
图 2:具有不确定性的主体-环境相互作用
实现的不确定性
我们选择实施以下四种不同类型的干扰,以在代理的训练过程中制造不确定性。
S 在我们的场景中,滑移是重要的,因为它影响车辆的加速度,即代理的动作。
图 3:滑移对代理行为的影响
速度传感器的暂时故障是一种不太可能但有可能发生的事件,通常由传感器和控制板之间的数据传输错误触发。环境的状态向量包含车辆的当前速度。因此,智能体的行为对速度变化很敏感,需要学习如何处理当前车速的不确定性。
图 4:传感器故障对代理行为的影响
图 4 显示了暂时故障速度信号在 3 个位置的影响。从而速度值突然跳到零,然后再次显示正确的值。车辆在这些点继续行驶。只有强化学习代理接收到临时故障信号。
故障交通标志检测包含两种不同类型的随机干扰。首先,错误检测交通标志,尤其是速度限制。摄像机系统可以将给定的 50 公里/小时的速度限制识别为 60 公里/小时。这些错误可能导致代理对其环境的错误假设,这可能导致代理的不适当行为。正如您在图 5 中看到的,对即将到来的速度限制的不确定性导致了小的加速和减速交替阶段。这是由于希望在不同速度区之间建立平滑过渡,但即将到来的速度限制(过渡的目标值)是不确定的,因此过渡过程变得不确定,即显示随机偏差。
图 5:故障交通标志检测对代理人行为的影响
其次,直到下一个速度限制的距离的不精确测量。代理通过环境的状态向量接收这个距离,并相应地选择他的动作。距离信息对于确保不同速度限制的区域之间的平滑过渡而不超过当前速度限制是必要的。由于这些不确定性,代理人无法准确预测下一个速度限制生效之前还剩多少时间。因此,他开始加速汽车,以确保平稳过渡到下一个速度限制,但在加速后不久,代理人决定减速汽车,以避免因超速而受到奖励处罚。这个循环重复几次,因为代理基于不确定的(错误的)信息过早地启动了加速过程。
图 6:错误的距离测量对代理行为的影响
不确定条件下的优化
不确定情况下的行为
正如所料,在随机干扰环境中接受训练的智能体,在不确定的环境中比没有处理随机事件经验的标准智能体表现得更好。从图 7 和图 8 中可以看出,尽管环境嘈杂且行为随机偏差,但受过不确定性训练的智能体避免了超速。
图 7:没有不确定性的训练的代理
图 8:带着不确定性训练的代理
没有不确定性的行为
有一个考虑到可能的随机偏差影响的代理,并不意味着代理应该总是在有干扰的情况下工作。因此,在某个环境中没有偏差的行为也是智能体能力的一个有趣指标。在图 9 和图 10 中,您可以看到两个代理在无偏差环境中的行为。显而易见,不确定代理人与限速保持安全距离。通过这种行为,如果意外的随机偏差导致汽车突然加速,这将导致超过当前速度限制,则代理获得短时间的反应窗口。
图 9:没有不确定性的训练的代理
图 10:带着不确定性训练的代理
通过不确定性进行行为控制
不确定性的实现,除了增加训练过的代理的鲁棒性之外,还提供了在不改变回报计算结构的情况下改变代理的行为的可能性。为了训练代理,其行为可以在通过最终用户的训练过程之后被改变,有必要在训练期间改变所实现的不确定性的参数(例如,标准偏差或期望值)。例如,随机干扰的标准偏差越大,导致的防御行为越多,因为代理人期望抵消更大的偏差。因此,最终用户通过选择不同的行为模式来改变代理人的期望。所选择的行为模式改变环境状态向量中的值。该值影响分布的标准偏差和期望值,用于计算不确定性的随机影响。在图 11、12 和 13 中,你可以看到代理人的期望是如何影响最终行为的。
图 11:预期的大偏差→防御行为
图 12:预期的正常偏差→正常行为
图 13:预期的小偏差→攻击行为
摘要
在本文的最后,我们将总结最重要的几点。
在我们的第一篇文章中,我们展示了在建议的 RL 环境中,它适应于 OpenAI Gym 标准化,很容易原型化和实现最先进的 RL 算法。此外,LongiControl 环境适用于各种检查。除了 RL 算法的比较和安全算法的评估,在多目标强化学习领域的研究也是可能的。在我们的第二篇文章中,我们展示了不确定性对受过训练的代理人行为的影响。我们表明,不确定性本身就足以实现具有不同行为的智能体,并且不确定性可以对智能体的训练速度产生积极的影响。未来可能的研究目标是与已知路线的规划算法进行比较,并考虑非常长期的目标,如在特定时间到达。
LongiControl 旨在使社区能够利用强化学习的最新策略来解决自动驾驶领域的现实世界和高影响问题。
享受使用它😉
参考
[1] G. Brockman 和 V. Cheung 和 L. Pettersson 和 J. Schneider 和 J. Schulman 和 J. Tang 和 W. Zaremba,开放健身房 (2016),CoRR
[2]薛斌鹏(音译),具有动力学随机化的机器人控制的虚拟到真实转移 (2017),CoRR
[3] JoshuaTobinu.a .,将深度神经网络从模拟转移到现实世界的域随机化 (2017),CoRR
[## 德国萨克森州 Roman liener-Dresden |职业简介| LinkedIn
查看 Roman liener 在 LinkedIn 上的职业资料。LinkedIn 是世界上最大的商业网络,帮助…
www.linkedin.com](https://www.linkedin.com/in/roman-lie%C3%9Fner-56346113b/)
亲爱的 Spotify——你为什么认为我是右翼?
一篇关于参差不齐的数据,缺乏对板球的热爱,为什么这会导致糟糕的体验以及如何解决它的帖子。
或者更准确的说,为什么你觉得我既是“政治—强左 _ 美”又是“政治—强右 _ 美”?
也许我的播放列表中有太多的机器引起了我的愤怒?或者还不够?
这是一篇关于下载你的数据档案(“GDPR 功能”)并看看下面是什么的帖子。这不是关于 Spotify 本身,公平地说,他们也有很多关于我和我对他们服务的使用的数据,这些数据非常准确,而是关于整体数据市场的现实,以及了解复杂公司的数据基础,这为我们作为消费者提供了很多有针对性的产品和体验。
在这篇文章中,我使用了一些来自我自己的数据导出的荒谬数据,因为它显然是不敏感的,与我无关,也不描述我自己。不管这个人是谁,他们肯定是个人物。
由乔舒亚·科尔曼拍摄。
有价值但确实参差不齐的数据
数据是新的黄金。或者石油,很难知道它现在是什么样子。不管怎样,出售数据是有利可图的。
那么,当你真的不知道什么数据是准确的时候,你会怎么做呢?嗯,在某些情况下你“推断”,在某些情况下,这可能以两种方式填充字段结束,这意味着你没有空属性,尽管你的值是有问题的。这看起来像什么?
[个人 1:
性别:男
性别:女]
或者对我来说,这是一个狂野的西部,我的政治背景是:
“3P _ 政治—活跃于政治 _ 美国”,
“3P _ 政治—隶属关系不明 _ 美国”,
“3P _ 政治—任何民主党人 _ 美国”,
“3P _ 政治—任何左派 _ 美国”,
“3P _ 政治—任何共和党人 _ 美国”,
“3P _ 政治—任何右派 _ 美国”,
“3P _ 政治—对政治感兴趣 _ 美国”,
“3P _ 政治—政治捐助者任何 _ 美国”,
“3P _ 政治
我的意思是,任何人看到它都会很快明白它不可能是准确的。然而,它当然不是空的,因为它不是空的,所以它可以作为数据提供。
不正确的数据让用户沮丧
即使我们采取 Spotify 和其他公司处理个人数据不关我们的事的立场,我们也不得不承认,基于这些数据,给我提供广告或报价的人不仅可能会完全错过我,还可能会破坏整个体验。
“3P _ 定制 _ BEV-PHEV-混动 _ 车主 _ 美国”,
“3P _ 定制 _ 宝马集团 3 _ 英国”,
“3P _ 定制 _ 宝马集团 5 _ 英国”
“3P _ 定制 _ 道奇车主 _ 2019 年 10 月 16 日 _ 美国”
Spotify 推断我拥有一辆混合动力车 BEV-PHEV(不管那是什么——尽管我当然应该知道),还有一辆宝马 3 系或者可能是 5 系,或者两者都有。你知道,活得精彩。和一辆道奇。也许不同国家不同的车?尽管我经常把我的 iPhone 插到我的车里(顺便说一下,不是宝马),这些有趣的猜测没有一个是正确的。
我为什么在乎?首先,我非常喜欢相关的内容。我不是很喜欢汽车,但也不是很喜欢板球。
“3P _ 板球爱好者 _ 盟”,
“3P _ 板球爱好者 _ 英国”,
然而,我会感谢与我实际相关的服务,比如推荐我实际会去吃的餐馆或我实际看的电影。
每个人都有数据,但最多是不完整的
有一种误解认为每个人都有很多数据。我无意贬低 Spotify,他们已经花费了大量的金钱和时间来建立他们的数据实践,我只关注其中很小的一部分。此外,这在任何方面都不是 Spotify 独有的。然而,它显示了数据和数据市场之间的明显差距,很难获得准确的数据,而且往往与用户相关的数据最终变得不可用,甚至具有破坏性。
现在法规已经允许个人从世界各地的许多数据平台下载他们的数据。这为开发者开发直接面向消费者的个人数据应用打开了一个新的机会海洋。
在 Spotify 上,开发者可以构建一个应用程序,根据综合数据点提供推荐或创建播放列表,例如查看来自网飞、Hulu 的数据。然后另一个开发人员可以构建一个更好的或不同的版本,以此类推。我们就是这样发展的。你会建造什么样的?
数据市场的开放将从根本上改变封闭的数据市场,也将改变用户如何真正从他们的数据中获得他们想要的价值。
如果你是 Spotify 用户,你应该可以访问类似的数据。你可以从 Spotify 的账户隐私页面下载。此外,您最终会得到一个包含 json 文件的 ZIP 文件,名为“推论. json”。如果你喜欢这种类型的东西,看看吧,我很想听听你被描述成什么类型的人?我肯定它是丰富多彩的。
死亡和数据科学:第二部分
为什么我们需要批判性地思考新冠肺炎时代的数据使用
纳赫尔·阿卜杜勒·哈迪在 Unsplash 上的照片
一个多月前,我写了这篇文章关于我们对死亡的恐惧,以及科技公司将如何利用这种恐惧来说服我们放弃我们的隐私。正如在构建大数据的大数据和医疗保健章节中所指出的,医疗保健领域关于大数据隐私的讨论明显低于商业和政治等其他领域(Paganoni 2019)。在这一章中,一位来自 Duquesne 大学的教授被引述为本质上说,“如果你想要技术上的医学创新,你必须放弃个人隐私,”将隐私框定为为了医学进步而必须牺牲的微不足道的奢侈品。后来,Paganoni 引用了信息专员办公室的这篇文章。帖子本身讨论的问题是,大量数据从皇家自由伦敦 NHS 基金会信托基金转移到谷歌 DeepMind 被认为违反了数据保护法。Paganoni 引用的部分是:
1。这不是隐私或创新之间的选择
令人欣慰的是,审判看起来是积极的。信托基金报告了成功的结果。有些人可能会认为,数据保护权是为此付出的小小代价。
但是,在浏览调查结果时,我注意到我们发现的缺点是可以避免的。创新的代价不一定是对法律保障的基本隐私权的侵蚀。我完全有信心,信托机构能够顺应我们的要求做出改变,并继续其有价值的工作。考虑到创新技术的部署,这也适用于更广泛的 NHS。
本质上,我们不需要为了医学的进步而牺牲我们的个人隐私,缺乏隐私更多的是疏忽的结果,而不是必要的。结合这一事实,即使我们认为是匿名的数据也可以非常容易地去匿名化,你会认为我们应该格外小心我们交给科技公司的数据,即使他们正在从事医疗保健技术。然而,随着新冠肺炎病毒的爆发,我们看到的情况正好相反。以这张地图为例,它根据社交距离给每个州打分。它给每个州打分的方式是通过查看智能手机的位置数据,确定从爆发前到现在移动减少的百分比,并根据减少的百分比给他们分配一个字母等级。当然,他们坚持认为数据是完全匿名的。在《华盛顿邮报》对本次的报道中,引用了未发布的首席执行官托马斯·沃勒的话:
“这里的一切都是在聚合的水平上,”Walle 说。“我们不能告诉或透露任何个人是否留在家中。”
然而,文章也指出:
隐私倡导者担心像 Unacast 这样的数据公司可能是不可靠的,因为他们在没有得到人们真正同意的情况下收集位置。
Walle 说,Unacast 从其获取位置数据的所有应用程序都必须让用户知道。但他拒绝透露任何应用的名称。我们知道很少有人阅读应用程序上的隐私政策——这些细则披露了他们使用你的位置的许多方式,例如将其出售给数据公司。
当数据收集者对他们从哪里获得数据不透明时,比如在这种情况下,Unacast 拒绝说出用于收集数据的应用程序的名称,这不是一个好迹象。结合这一事实,即政府目前正在与脸书和谷歌等科技巨头讨论如何利用他们收集的位置数据,你有一个潜在的灾难配方。问题是,这些科技巨头是私营企业。他们只对股东负责,因此对维护用户隐私没有直接兴趣。如果政府从他们那里获取数据,他们可以说他们不是直接从公民个人那里获取数据,而是从公司那里获取。从本质上说,我们必须相信这些私营公司会出于好心而适当地匿名化数据。当然,虽然可能有一两家公司确实在努力保持数据共享的透明和道德,但总的来说,我们不能相信企业会优先考虑公共利益,除非他们被迫这样做,而且看起来他们暂时没有被迫这样做。
Slate 最近发表了一篇文章,“你不应该把你的数据给谷歌来访问新冠肺炎测试,”讨论了谷歌可能如何开发一个系统,让人们访问他们的新冠肺炎测试结果,但要访问这些结果,你必须放弃更多的数据。这就像是我们的集体恐惧被操纵,给了公司我们通常不会给他们的数据。事实上,这句话说得很好:
随着新冠肺炎在我们的社区传播,人们利用这种情况获取经济利益的故事比比皆是。无良的疫情奸商将部落护具和清洁用品以天价出售。像这些商品一样,科技公司从新冠肺炎筛选中抽取的数据可能是下一个被囤积和利用的资产。
就像我们对死亡的恐惧已经在医疗保健领域被利用一样,当涉及到大数据时,我们对新冠肺炎更现实的恐惧正在被操纵,以使我们接受隐私的损失。更糟糕的是,虽然这种隐私的损失被认为是完全必要的,但事实是,一些使用这些个人数据的算法甚至不起作用,并可能造成伤害。在论文“紧急医疗数据:人工智能推断的健康信息”中,紧急医疗数据(EMD)是“人工智能从琐碎的数字痕迹中推断的健康信息”。马克斯指出,虽然潜在的隐私侵犯被认为是公共利益所必需的:
然而,几乎没有证据表明基于经验模态分解的剖析有效。更糟糕的是,它可能造成重大伤害,而当前的健康隐私和数据保护法存在漏洞,允许公共和私人实体在人们不知情或未同意的情况下开采 EMD
我们对死亡的恐惧已经被操纵来损害我们的隐私权,现在我们的恐惧加剧了,这种操纵只会增加。这就是为什么我们需要对这些私营公司的要求以及他们为保护我们自己的权利而采取或不采取的措施提出更多的批评,因为很明显,如果不被强迫,他们无意保护我们的权利。
[1]帕戈诺尼,玛丽亚·克里斯蒂娜。构建大数据:语言和话语方法。斯普林格,2019。
[2] Marks,Mason,《紧急医疗数据:人工智能推断的健康信息》(2020 年 3 月 14 日)。加州大学欧文分校法律评论(2021 年,即将出版)。可在 https://ssrn.com/abstract=3554118SSRN买到
死刑判决和种族偏见
当数据显示黑人的生命不那么重要时
这篇文章讨论了我们后奴隶制、后殖民主义和后种族隔离时代的一个非常严肃的话题。为什么当法律明确谴责不同的治疗或结果时,仍然有明显的差异?这些差异影响了部分公众舆论——顺便说一下,这应该影响到所有人,因为这个问题不会只在少数族裔身上得到解决。
这篇文章将揭露和解释黑人的生命不那么重要的情况。在俄克拉荷马州,从 1990 年到 2012 年,143 名罪犯被判处死刑。2017 年,皮尔斯等人收集并分析了杀人数据(4668 名罪犯)和死刑判决。它表明死刑判决的结果涉及到几个种族/民族的影响。这张纸包含了所有的细节。使用的术语(“非白人”、“种族”)来自该文件。我不喜欢“非白人”这个词,但我不能每次都用黑人、西班牙人、美洲原住民和亚洲人来代替它。我会在这个帖子里坚持下去。
1.有根据的猜测死刑的最佳/最差可能性?
虽然这个话题非常严肃,但我想知道你对潜在偏见的第一想法。假设有一个罪犯,因“故意(非过失)杀人”而被审判。我们对他一无所知。
什么会降低他被判死刑的可能性?
- 如果罪犯是白人则少判死刑。
- 如果被害人是不是白就少判死刑。
- 几率差不多,司法系统是公平的,不是吗?
- 你的问题有失偏颇(请说如何,有意思)。
你怎么想呢?你可以把你的答案写在下面的评论里。
2.从杀人罪犯到死刑,一个明显平等的结果
让我们回到俄克拉荷马州,那里的作者已经收集了 1990 年至 2012 年期间的凶杀案和死刑判决。
1990-2012 年俄克拉荷马州杀人罪犯和死刑判决统计。资料来源:Pierce 等人的论文
按种族/民族的概述让我们对这个故事有了初步的了解:
- 凶杀率(HR = HO/POP) :非白种人在凶杀罪犯中明显过多。尽管任何旨在减少凶杀案的预防/缓解战略都应考虑到这一点,但我们将遵循这篇文章,重点关注死刑率,因为这是司法系统的核心,而不是上游。
- 死刑判决率(DSR = DS/HO) : DSR 的白人与非白人杀人罪犯非常相似(3.2%比 3.0%)。
****【DSR】**的平等在这里是公平的核心概念,我们将从多个维度来计算它。DSR 被定义为死刑数量除以杀人罪犯数量。
结果均等意味着类似的杀人案*(在类似的重罪情节程度下)应该导致类似的死刑判决率 (DSR)。*
所以,不管罪犯是什么种族,DSR 看起来都是相似的。俄克拉何马州的整个故事已经讲完了吗?不,没有,远不止这些。
3.按受害者的种族/民族划分的死刑率讲述了另一个故事
另一个角度是考虑受害者的种族/民族,而不是罪犯的种族/民族。从字面上讲,这就是“黑人的命也是命”座右铭背后的思想。
1990-2012 年俄克拉荷马州按受害者种族/民族划分的死刑判决和 DSR 统计数据。资料来源:Pierce 等人的论文
结论是惊人的:与非白人受害者相比,白人受害者被判死刑的几率是白人受害者的两倍(2.05 =3.9%/1.9%)。
然而,在得出这些结果的差异是歧视性的结论之前,是否应该考虑其他强烈的 DSR 差异。
4.受害者性别也有很大的影响
应该考虑受害者的另一个特征:性别。它实际上有一个很大的影响:女性受害者的 DSR是 7.2% vs 1.6% 。换句话说,女性受害者被判死刑的几率是男性受害者的 4.5 倍(7.2%/1.6%)。
2 效果(受害者种族/民族和性别)如何组合?我们可以在这里争辩说,也许白人受害者中有更多的女性,这可以解释为什么白人受害者的 DSR 更高。在这种情况下,可能不存在歧视性影响(假设当受害者是女性时,可以更严厉地谴责)。
当我们计算跨种族跨性别的死刑判决率时,这种假设情景消失了:
1990-2012 年俄克拉荷马州按受害者种族/民族和性别统计的死刑率。资料来源:皮尔斯等人的论文
没有辛普森式的扭曲效果:无论是女性还是男性,都有明显的白人与非白人的 DSR 差异。对于男性受害者来说,这种影响更为显著:与非白人受害者相比,白人受害者被判死刑的几率是 T4 的 2.9 倍(2.3%/0.8%)。
在总结之前,让我们考虑潜在的其他因素。
5.其他影响:重罪情节加重
在从之前的分析跳到关于受害者的种族/民族的歧视性影响的结论之前,我们需要思考和测试可能的混淆因素。
首先想到的是杀人案的重罪情节的程度。三级重罪情节加重犯被考虑在内,他们与 DSR 有最强的联系。它们的相对危险度分别为 1.7%(无强化者)、6.2%(有 1 个强化者)和 30.2%(少数有 2 个强化者)。
6.一个“因果”交互图来总结它
为了解释可能的混杂效应和推理其他条件不变的情况下*,作者对之前提到的所有变量进行了逻辑回归。我鼓励你去看看论文中的结果(表 11)。但是为了简单起见,我把它翻译成了一个“因果图”,同时用指向 DSR 的箭头(+/-)表示回归系数的方向和强度。从犯罪者种族到受害者种族的最后一个箭头说明了白人犯罪者杀死大多数白人受害者,反之亦然。*
死刑率的因果交互图。只画出重要的关系。来自datajms.com
画面变得更加清晰,死刑率是:
- 主要是由犯罪的严重程度决定的(最坏和最好情况的概率乘以 13)
- 然后由受害者的性别决定(女性受害者的几率大约乘以 5)
- 第三,受受害者的种族/民族驱使(白人受害者的几率大约是 1.8 倍。但请注意,仅在男性中,白人与非白人的比例为 3.2。
- 最后,受罪犯种族/民族的微弱驱动(非白人罪犯的几率增加约 1.3 倍)。
7.关于潜在种族/民族公平问题的结论
- *与其他影响相比,**直接歧视(通过罪犯种族)*相对较小。它是如此之小,以至于论文作者得出结论,没有证据支持这种直接影响。然而,逻辑回归表明,仍然有一个小的影响,但不是非常显著。
想象一个非白人罪犯的死刑率为 2%的案例。如果是白人,其 DSR 将降至 1.5%(几率除以 1.3)。 - 有一个明显的“黑人生活不重要”效应,这在男性中更为明显。
想象一个白人受害者案件,死刑率为 2%。在同样的条件下,非白人男性受害者的 DSR 下降到 0.6%(男性的几率除以 3.2)。
请注意,这两种效果一般都是部分抵消。我们提到典型案例是白人罪犯杀害白人受害者和非白人罪犯杀害非白人受害者。在这些情况下,这两种效应会部分抵消,所以观察到的 DSR 是相似的。然而,在不太频繁的“跨种族”杀人案中,的影响累积起来并导致 DSR 的显著差异。
所以,回答我们的第一个问题,给定一个杀人罪犯,我们对他了解不多:
- 答案 1(如果罪犯是白人,少判死刑)会使几率降低 23%(1–1/1.3)
- 答案 2(如果受害者不是白人,则少判死刑)一般来说会将几率降低 44%(1–1/1.8),如果受害者是男性,则降低 69%。
答案 2 正确:
受害者种族/民族 效应(杀害白人受害者的凶手受到更严厉的惩罚)强于 犯罪者种族/民族 效应(非白人犯罪者受到更严厉的惩罚)。
请注意,这份声明来自对 1990 年至 2012 年俄克拉荷马州死刑判决的分析。
更一般地说,注意到在美国的刑事司法系统中有压倒性的证据表明歧视性影响**。这两篇华盛顿邮报的文章列了很多。**
原载于 2020 年 6 月 3 日【https://datajms.com】。**
TensorFlow 中的调试
如何在不失去理智的情况下调试 TensorFlow 训练程序
戴维·克洛德在 Unsplash 上的照片
If debugging is the process of removing software bugs, then programming must be the process of putting them in.
Edsger Dijkstra. From https://www.azquotes.com/quote/561997
在我以前的一些帖子中(这里、这里和这里),我告诉过你一些关于我在 Mobileye(官方名称为 Mobileye,英特尔公司)的团队如何使用 TensorFlow 、亚马逊 SageMaker和亚马逊 s3 来训练我们的深度神经网络处理大量数据。在这篇文章中,我想谈谈 TensorFlow 中的调试。
众所周知,程序调试是软件开发中不可或缺的一部分,花费在调试上的时间常常超过了编写原始程序的时间。
调试是困难的,已经有很多关于如何设计和实现一个人的程序以增加错误的再现性,并简化根本原因分析的过程的文章。
在机器学习中,调试任务由于机器学习算法固有的随机性以及算法通常在远程机器上的专用硬件加速器上运行的事实而变得复杂。
TensorFlow 中的调试由于使用了符号执行(也称为图形模式)而变得更加复杂,这提高了训练会话的运行时性能,但同时也限制了自由读取图形中任意张量的能力,这种能力对于调试非常重要。
在这篇文章中,我将阐述调试 TensorFlow 训练程序的困难,并提供一些如何解决这些困难的建议。
出于法律目的,我想澄清,尽管我精心选择了副标题,但我不能保证我在这里写的任何东西都会防止你失去理智。相反,我认为我几乎可以保证,不管我写了什么,当你调试 TensorFlow 程序时,你可能会失去理智。但是,也许,你会少失去一点理智。
在我们开始之前,让我们澄清一下我们讨论的范围。
调试的类型
在本文的上下文中,调试指的是识别代码或数据中导致培训突然中断的错误的艺术。
另一种类型的调试(不在本文讨论范围之内)指的是修复或调整一个不收敛的模型,或者对某一类输入产生不令人满意的预测的模型(例如,车辆检测模型无法识别粉红色汽车)。该过程可能涉及定义和评估模型指标,收集和统计分析模型工件(如梯度、激活和权重),使用工具,如 TensorBoard 和 Amazon Sagemaker 调试器,超参数调整,重新架构,或使用增强和增强等技术修改您的数据输入。调整模型可能是一项极具挑战性、耗时且常常令人沮丧的任务。
错误的类型
在解决代码或数据中的错误方面,我喜欢区分两类错误:错误和怪物错误。
通过bug我指的是相对容易重现的问题。错误的例子是对输入张量大小的假设与训练数据不匹配,试图连接不匹配的张量,或对无效数据类型执行 tf 运算。这些通常不依赖于特定的模型状态和数据,并且通常相对容易重现。它们不一定容易修复,但与怪物 bug 相比简直是小儿科。
怪物 bug是偶发的、不可预测的 bug。仅在模型的特定状态、特定数据样本或模型状态和数据输入的特定组合上重现的错误可能会带来严重的挑战,并可能构成一个怪物错误。
以下是一个基于真实事件的场景示例,它肯定会增加您的血压:
现在是星期五下午,你的模特已经成功训练了几天。损失似乎正在很好地融合,你开始想象一个放松的,释放后的周末假期,在你选择的地方。你回头看了一会儿屏幕,注意到突然之间,没有任何警告,你的损失变成了 NaN。“当然”,你对自己说,“这一定是由于一些完全随机的、瞬间的、宏观的故障”,然后你立即从你最后一个有效的模型检查点恢复训练。又过了几个小时,这种情况又发生了,一次又一次。现在你开始恐慌,你周末天堂的梦幻图片现在被需要解决一个怪物错误的诱人努力的想法所取代。
我们一会儿将回到这个令人悲伤的例子。但是首先,让我们检查一些强制性的“调试”复选框。
Tensorflow 中的调试技巧
在调试的艺术上,更重要的是,在开发可调试代码的艺术上,已经花了很多笔墨。在本节中,我将提到一些与张量流应用相关的技术。这份清单并不全面。
保存模型检查点
这可能是我在这篇文章中写的最重要的东西。始终配置您的培训课程,使其定期保存您的模型的快照。
编程错误并不是你的训练失败的唯一原因…如果您在云中运行,您可能会得到一个现场实例终止,或者遇到一个内部服务器错误。如果您在本地运行,可能会停电,或者您的 GPU 可能会爆炸。如果你已经训练了几天,没有储存中间检查点,伤害可能是极端的。如果您每小时保存一个检查点,那么您最多丢失一个小时。TensorFlow 提供了用于存储检查点的实用程序,例如 keras 模型检查点回调。您需要做的只是,通过权衡存储检查点的开销和培训课程中意外中断的成本,来决定捕获此类快照的频率。
接触者追踪
我为我选择这一小节的标题向我的同辈人道歉,我实在忍不住了。通过联系跟踪,我指的是跟踪输入培训管道的培训数据的能力。
假设您的训练数据被分成 100,000 个 tfrecord 文件,其中一个文件有格式错误,导致您的程序崩溃或停止。缩小问题文件搜索范围的一种方法是记录进入管道的每个文件。一旦你点击崩溃,你可以回头看看你的日志,看看最近输入的文件是什么。正如我在以前的帖子中提到的,我们使用 Amazon SageMaker 管道模式功能进行训练。管道模式中最近增加的一项功能是管道模式服务器端日志,它记录了进入管道的文件。
记录进入 pipeline 的数据有助于提高重现 bug 的能力,这就引出了我们的下一点。
可复制性
bug 重现的容易程度直接影响到解决它的容易程度。我们总是想写我们的代码,以确保可重复性。这在 TensorFlow 程序中并不容易。机器学习应用通常依赖于随机变量的使用。我们随机初始化模型权重,我们随机增加数据,我们随机分割数据用于分布式训练,我们随机应用漏失,我们在每个时期之前混洗我们的输入数据,然后在创建批次之前再次混洗它(使用 tf.dataset.shuffle)。我们可以用我们记录的伪随机种子来播种所有的伪随机操作,但是请记住,可能有许多不同的地方引入了随机化,并且跟踪所有这些很容易成为簿记噩梦。我无法告诉你有多少次我认为我已经去除了随机化的所有元素,却发现我漏掉了一个。此外,还有一些无法植入的随机流程。如果使用多个过程来导入训练数据,您可能无法控制数据记录的实际输入顺序(例如,如果在 tf.data.Options ())中将 experimental_deterministic 设置为 false)。当然,您可以在每个样本进入管道时对其进行记录,但这将会产生很高的开销,而且可能会令人望而却步。
底线是,虽然构建可重复的训练程序是绝对可能的,但我认为更明智的做法是接受非确定性,接受训练的不可重复性质,并找到克服这种调试限制的方法。
模块化程序设计
创建可调试程序的一个关键技术是以模块化的方式构建应用程序。应用于 TensorFlow 训练循环,这意味着能够分别测试训练管道的不同子集,如数据集、损失函数、不同的模型层和回调。这并不总是容易做到的,因为一些训练模块(如损失函数)非常依赖于其他模块。但是有很大的创造空间。例如,在应用数据集操作的子集时,可以通过简单地迭代数据集来测试输入管道上的不同函数。可以通过创建一个只运行损失函数或回调的应用程序来测试损失函数或回调。人们可以通过用虚拟损失函数代替它来抵消损失函数。我喜欢使用多个输出点来构建我的模型,即能够轻松修改模型中的层数,以便测试不同层的影响。
在构建程序时,你对程序的模块化和可调试性考虑得越多,你以后遭受的痛苦就越少。
急切的执行
如果您是 TensorFlow 的普通用户,您可能会遇到诸如“急切执行模式”、“图形模式”和“tf 函数限定符”之类的术语。你可能听过一些(有些误导)的说法,比如“在急切执行模式下调试是小菜一碟”,或者“tensorflow 2 在急切执行模式下运行”。你可能和我一样,狂热地一头扎进了 tensorflow 源代码,试图弄清楚不同的执行模式,结果却在抽泣中崩溃了,你的自尊从此粉碎。为了全面理解它是如何工作的,我向你推荐张量流文档,祝你好运。这里我们将提到它的要点,因为它与调试有关。运行 TensorFlow 训练的最佳方式是在图形模式下运行。图形模式是一种符号执行模式,这意味着我们不能任意访问图形张量。用 tf.function 限定符包装的函数将在图形模式下运行。当您使用 tf.keras.model.fit 训练时,默认情况下,训练步骤以图形模式执行。当然,不能访问任意的图形张量,使得在图形模式下调试很困难。在急切执行模式下,您可以访问任意张量,甚至可以使用调试器进行调试,(前提是您将断点放在 model.call()函数中的适当位置)。当然,当你在热切执行模式下运行时,你的训练会运行得慢很多。要对您的模型进行编程以在急切执行模式下进行训练,您需要调用函数 model.compile() ,并将 run _ eagerly 标志设置为 true。
底线是,当你训练时,以图形模式运行,当你调试时,以急切执行模式运行。不幸的是,某些 bug 只在图形模式下重现而不在急切执行模式下重现的情况并不少见,这实在令人失望。此外,当您在本地环境中调试时,急切执行很有帮助,但在云中就不那么有用了。在调试怪物 bug的时候往往不是很有用…除非你首先找到一种方法在你的本地环境中重现这个 bug(下面会详细介绍)。
TensorFlow 日志记录和调试实用程序
尽量利用 TensorFlow 测井仪。调试问题时,请将记录器设置为信息最丰富的级别。
tf.debugging 模块提供了一堆断言实用程序以及数字检查功能。特别是,TF . debugging . enable _ check _ numerics实用程序有助于找出有问题的函数。
tf.print 函数能够打印出任意的图形张量,这是一个额外的实用程序,我发现它对调试非常有用。
最后但同样重要的是,添加您自己的打印日志(在代码的非图形部分),以便更好地了解您的程序出故障的地方。
解密张量流错误消息
有时候,你会幸运地得到一个 TensorFlow 错误消息。不幸的是,如何使用它们并不总是一目了然。我经常收到同事发来的带有神秘 TensorFlow 信息的邮件,请求帮助。当我看到消息时,例如:
tensorflow.python.framework.errors_impl.InvalidArgumentError: ConcatOp : Dimensions of inputs should match: shape[0] = [5,229376] vs. shape[2] = [3,1]
或者
node DatasetToGraphV2 (defined at main.py:152) (1) Failed precondition: Failed to serialize the input pipeline graph: Conversion to GraphDef is not supported.
或者
ValueError: slice index -1 of dimension 0 out of bounds. for 'loss/strided_slice' (op: 'StridedSlice') with input shapes: [0], [1], [1], [1] and with computed input tensors: input[1] = <-1>, input[2] = <0>, input[3] = <1>.
我问自己(稍微修改了一下,使帖子对孩子友好)“我到底应该怎么做?”或者“为什么友好的 TensorFlow 工程师不能给我更多的工作呢?”。但我很快让自己平静下来,(有时借助酒精饮料),并说:“Chaim,不要被宠坏了。回去工作吧,感谢你收到了任何信息。”你应该做的第一件事,是尝试在急切执行模式下重现错误,和/或使用调试器。不幸的是,如上所述,这并不总是有帮助。
无可争议的事实是,像上面这样的信息是没有多大帮助的。但是不要绝望。有时候,在一些调查工作的帮助下,你会发现一些线索,可能会把你引向正确的方向。仔细检查调用堆栈,看它是否提供了任何提示。如果信息包括形状大小,试着将它们与你的图形中可能具有相同形状的张量进行匹配。当然还有网上搜一下,看看别人有没有遇到过类似的问题,在什么场景下。不要绝望。
在本地环境中运行
自然,在本地环境中调试比在远程机器或云中调试更容易。当您第一次创建模型时尤其如此。你的目标应该是在开始远程训练之前,在你当地的环境中解决尽可能多的问题。否则,你很可能会浪费大量的时间和金钱。
为了提高可再现性,您应该尽量使您的本地环境与远程环境相似。如果您在远程环境中使用 docker 映像或虚拟环境,请尝试在本地使用相同的映像或虚拟环境。(如果你的远程培训是在亚马逊 SageMaker 上,你可以调出所用的 docker 图片。)
当然,远程培训环境中的某些要素可能无法在本地复制。例如,你可能遇到了一个只有在使用亚马逊 SageMaker 管道模式时才会重现的 bug,目前只有在云中运行时才支持。(在这种情况下,您可以考虑使用替代方法从 s3 访问您的数据。)
我希望我能告诉你,这里描述的技术将解决你所有的问题。但是,唉,事实并非如此。在下一节中,我们将回到我们上面举例说明的怪物 bug 场景,并介绍最后一种调试技术。
使用 TensorFlow 自定义训练循环进行调试
在我们上面描述的场景中,经过几天的训练,模型的特定状态和特定训练批次样本的组合,突然导致损失变成 NaN。
让我们评估一下如何使用上面的调试技术来调试这个问题。
- 如果我们对用于所有随机操作的种子保持细致的跟踪,并且没有不受控制的非确定性事件,那么理论上我们可以通过从头开始训练来重现 bug…但那需要几天时间。
- 在本地环境中或在急切执行模式下进行复制可能需要几周时间。
- 我们可以从最近的检查点恢复,但是如果我们可以从完全相同的样本恢复,并且具有所有伪随机生成器的完全相同的状态,我们将只能再现相同的模型状态和批样本。
- 添加 tf.prints 会有所帮助,但是会带来巨大的开销
- 添加TF . debugging . enable _ check _ numerics将非常有助于查明它失败的函数。如果函数中有明显的 bug,这可能就足够了。但是这并不能让我们重现这个错误。
理想情况下,我们将能够在损失变得不可收拾之前捕获输入和模型状态。然后,我们可以在受控(本地)环境中,以急切执行模式和调试器重现该问题。
问题是我们不知道问题将要发生,直到它真正发生。当损失被报告为 NaN 时,模型已经用 NaN 权重更新,并且导致错误的批次样本已经被迭代。
我想提出的解决方案是定制训练循环,以便我们记录每一步的当前样本,并且仅在梯度有效时更新模型权重。如果梯度无效,我们将停止训练并连同当前模型快照一起转储出最后一批样本。这可以带到您的本地环境中,在那里您加载模型,并在急切执行模式下输入捕获的数据样本,以便重现(并解决)bug。
我们一会儿将讨论代码,但是首先,说几句使用定制训练循环的利与弊。
定制培训循环与高级 API
TensorFlow 用户之间有一个由来已久的争议,即是否要编写定制的训练循环或依赖于高级 API,如 tf.keras.model.fit ()。
定制培训循环的支持者,预示着对如何执行培训进行逐行控制的能力,以及创造性的自由。高级 API 的支持者称它提供了许多便利,最显著的是内置的回调实用程序和分布式策略支持。使用高级 API 还可以确保您使用的是一个无错误的、高度优化的训练循环实现。
从 2.2 版本开始,TensorFlow 引入了覆盖 tf.keras.model 类的 train_step 和 make_train_function 例程的能力。这使用户能够引入某种程度的定制,同时继续享受 model.fit()的便利。我们将演示如何以这样一种方式覆盖这些函数,使我们能够捕获有问题样本输入和模型状态,以便进行本地调试。
自定义采集循环
在下面的代码块中,我们使用 train_step 和 make_train_functions 例程的自定义实现来扩展 tf.keras.models.Model 对象。为了全面理解这个实现,我建议您将它与 github 中例程的默认实现进行比较。您会注意到,为了使代码更具可读性,我删除了所有与指标计算和策略支持相关的逻辑。需要注意的主要变化是:
- 在将梯度应用到模型权重之前,我们测试 NaN 的梯度。只有当 NaN 不出现时,渐变才会应用于权重。否则,向训练循环发送遇到错误的信号。信号的一个例子可以是将损耗设置为预定值,例如零或 NaN。
- 训练循环存储每一步的数据特征和标签(x 和 y)。注意,为了做到这一点,我们将数据集遍历(下一个(迭代器)调用)移到了@tf.function 范围之外。
- 该类有一个布尔“崩溃”标志,通知主函数是否遇到了错误。
**class** **CustomKerasModel**(tf.keras.models.Model):
**def** __init__(self, **kwargs):
super(CustomKerasModel, self).__init__(**kwargs)
*# boolean flag that will signal to main function that
# an error was encountered*
self.crash = **False**
@tf.function
**def** train_step(self, data):
x, y = data
**with** tf.GradientTape() **as** tape:
y_pred = self(x, training=**True**) *# Forward pass*
*# Compute the loss value*
*# (the loss function is configured in `compile()`)*
loss = self.compiled_loss(
y, y_pred, regularization_losses=self.losses)
*# Compute gradients*
trainable_vars = self.trainable_variables
gradients = tape.gradient(loss, trainable_vars)
*# concatenate the gradients into a single tensor for testing*
concat_grads =
tf.concat([tf.reshape(g,[-1]) **for** g **in** gradients],0)
*# In this example, we test for NaNs,
# but we can include other tests*
**if** tf.reduce_any(tf.math.is_nan(concat_grads)):
*# if any of the gradients are NaN, send a signal to the
# outer loop and halt the training. We choose to signal
# to the outer loop by setting the loss to 0.*
**return** {'loss': 0.}
**else**:
*# Update weights*
self.optimizer.apply_gradients(
zip(gradients, trainable_vars))
**return** {'loss': loss}
**def** make_train_function(self):
**if** self.train_function **is** **not** **None**:
**return** self.train_function
**def** train_function(iterator):
data = next(iterator)
*# records the current sample*
self.x, self.y = data
res = self.train_step(data)
**if** res['loss'] == 0.:
self.crash = **True**
**raise** **Exception**()
**return** res
self.train_function = train_function
**return** self.train_function
**if** __name__ == '__main__':
*# train_ds =*
*# inputs =*
*# outputs =*
*# optimizer =*
*# loss =*
*# epochs =*
*# steps_per_epoch =*
model = CustomKerasModel(inputs=inputs, outputs=outputs)
opt = tf.keras.optimizers.Adadelta(1.0)
model.compile(loss=loss, optimizer=optimizer)
**try**:
model.fit(train_ds, epochs=epochs,
steps_per_epoch=steps_per_epoch)
**except** **Exception** **as** e:
*# check for signal*
**if** model.crash:
model.save_weights('model_weights.ckpt')
*# pickle dump model.x and model.y*
features_dict = {}
**for** n, v **in** model.x.items():
features_dict[n] = v.numpy()
**with** open('features.pkl','wb') **as** f:
pickle.dump(features_dict,f)
labels_dict = {}
**for** n, v **in** model.y.items():
labels_dict[n] = v.numpy()
**with** open('labels.pkl', 'wb') **as** f:
pickle.dump(labels_dict, f)
**raise** e
值得注意的是,这种技术有一个小的训练运行时成本,它来自于以急切执行模式而不是图形模式从数据集中读取数据。(天下没有免费的午餐。)精确的成本将取决于模型的大小;模型越大,感觉到的变化就越小。您应该在自己的模型上评估这种技术的开销,然后决定是否以及如何使用它。
摘要
只要我们人类参与到人工智能应用的开发中,编程错误的流行几乎是肯定的。在设计代码时考虑到可调试性,并获得解决 bug 的工具和技术,可能会防止一些严重的问题。
最重要的是,不要绝望。
调试 Jupyter 笔记本电脑将提高您的工作效率
使用调试提高 Jupyter 笔记本电脑的工作效率
蒂莫西·戴克斯在 Unsplash 拍摄的照片
天真的方式——伐木
我们在开发程序时都会遇到代码中的错误,日志记录是调试代码的一种很好的方式,可能也是最直观的方式。通常的做法是在代码中添加 print 语句,这有助于我们追踪许多问题的根源。
import random
def find_max (values):
max = 0
print(f”Initial max is {max}”)
for val in values:
if val > max:
max = val
return max
find_max(random.sample(range(100), 10))
优势:
- 容易的
- 不需要安装
缺点:
- 可能是垃圾邮件
- 很难确定容易出错的位置
古典之路——PDB
我们看到打印声明帮助我们找到关于问题的相关信息,但是这些工具不足以找到每个根本原因。当我们需要更强大的东西时,就该试试 Python 内置的交互式调试器了。
pdb 模块为开发者调试 Python 程序(包括 jupyter 笔记本)提供了一个交互式调试环境。要启动调试器,我们所要做的就是导入 pdb 内置模块并运行其 set_trace 函数。
import random
def find_max (values):
max = 0
import pdb; pdb.set_trace()
for val in values:
if val > max:
max = val
return max
find_max(random.sample(range(100), 10))
演示:
资料来源:https://www.youtube.com/watch?v=ZrM42wnZjt8
优势:
- 动态。
- 不需要安装。
- 成熟(更多的特性,好的文档,更少的 bug)。
缺点:
- 非常吓人。
- 陡峭的学习曲线。
其他资源:
Pixie 调试器
有些人会理直气壮地指出 Jupyter 已经支持 pdb 了,这就足够了,但是作为开发人员,我们倾向于选择简单的方式,也就是 GUI。
PixieDebugger 是 Jupyter 笔记本的第一个可视化 Python 调试器,包括源代码编辑器、局部变量检查器、控制台输出、在当前上下文中评估 Python 表达式的能力、断点管理和用于控制代码执行的工具栏。
import contextlib
with contextlib.redirect_stdout(None):
import pixiedust# New Cell
%%pixie_debugger
def find_max (values):
max = 0
import pdb; pdb.set_trace()
for val in values:
if val > max:
max = val
return max
find_max(random.sample(range(100), 10))
演示:
优势:
- 动态。
- 简单。
缺点:
- 需要额外安装。
- 在木星笔记本上工作,但不是在木星实验室。
- 不成熟(错误文档和任务评估失败)。
设置:
pip install pixiedust
其他资源:
Jupyter 实验室调试器
非常类似于 Jupyter 实验室自己制作的 pixie-dust GUI 调试器,它仍然很新,但是我们可以在笔记本单元格和源文件中设置断点,检查变量,导航调用堆栈等等。
import contextlib
with contextlib.redirect_stdout(None):
import pixiedust# New Cell
def find_max (values):
max = 0
import pdb; pdb.set_trace()
for val in values:
if val > max:
max = val
return max
find_max(random.sample(range(100), 10))
演示:
来源:https://blog . jupyter . org/a-visual-debugger-for-jupyter-914 e 61716559
优势:
- 动态。
- 简单。
- 没有额外的代码。
缺点:
- 需要额外安装。
- 需要一个新的翻译。
- 在木星笔记本上工作,但不是在木星实验室。
- 安装有些困难。
- 不成熟(错误文档和任务评估失败)。
设置:
对于每个 conda 环境
conda install -y -c conda-forge xeus-python=0.6.12 notebook=6 ptvsd
jupyter labextension install [@jupyterlab/debugger](http://twitter.com/jupyterlab/debugger)
其他资源:
荣誉奖
- ——服用类固醇的 pdb。
- pudb——PDB 与 GUI。
遗言
总之,有许多技术可以用来调试 Jupiter 笔记本:
- 首先,人们应该使用日志来隔离问题
- 超级用户应该花时间学习 pdb,因为你永远不知道它会对你有益。
- 最后,根据您使用的是裸机还是 Jupyter Lab,您应该使用 pixiedust 和 Jupyter 调试器。
我希望这篇文章能让人们在笔记本环境中更有效率。我希望我能够分享我对这个迷人话题的热情,并且你会发现它是有用的,并且一如既往地,我愿意接受任何建设性的反馈。
用 PyTorch 和 W&B 调试神经网络
生产中的机器学习
调试神经网络的技巧和诀窍
点击查看互动报道。所有代码都可以在这里获得。
在这篇文章中,我们将看到是什么使神经网络表现不佳,以及我们可以通过可视化梯度和其他与模型训练相关的参数来调试它的方法。我们还将讨论渐变消失和爆炸的问题以及克服它们的方法。
最后,我们将了解为什么适当的权重初始化是有用的,如何正确地进行初始化,并深入研究正则化方法(如剔除和批量归一化)如何影响模型性能。
神经网络 bug 从何而来?
如这篇文章所示,神经网络错误很难捕捉,因为:
1.代码不会崩溃,不会引发异常,甚至不会变慢。
2。网络仍在训练,损失仍会下降。
3。几个小时后,这些值收敛,但结果很差
如果你想更深入地了解这个话题,我强烈推荐你阅读安德烈·卡尔帕蒂的《训练神经网络的诀窍》。
调试神经网络时,没有一套确定的步骤可以遵循。但是这里有一个概念列表,如果实施得当,可以帮助调试你的神经网络。
那么我们如何更好地调试我们的神经网络呢?
调试神经网络时,没有一套确定的步骤可以遵循。但是这里有一个概念列表,如果实施得当,可以帮助调试你的神经网络。
模型输入
1。关于数据的决策: 我们必须了解数据的细微差别——数据的类型、存储方式、目标和特性的类平衡、数据的价值尺度一致性等。
2。数据预处理 : 我们必须考虑数据预处理,并尝试将领域知识融入其中。通常在两种情况下使用数据预处理:
- 数据清洗:如果去掉数据中的某些部分,即所谓的工件,目标任务就可以轻松完成。
- 数据扩充:当我们拥有有限的训练数据时,我们以多种方式转换每个数据样本,以用于训练模型(例如缩放、移动、旋转图像)。
这篇文章的重点不是糟糕的数据预处理所导致的问题。
3。在小数据集上过度拟合: 如果我们有一个 50–60 个数据样本的小数据集,模型将快速过度拟合,即损失将在 2–5 个时期内为零。为了克服这一点,请确保从模型中移除任何正则化。如果你的模型没有过度拟合,可能是因为你的模型架构不正确,或者你的损失选择不正确。当您尝试进行多类分类时,可能会使用 sigmoid 激活输出图层。这些错误可能是容易漏掉的错误。点击这里查看我演示这个的笔记本。
那么,如何避免这样的错误呢?继续读。
模型架构
1。从一个小的架构开始: 使用花哨的正则化器和调度器可能有些矫枉过正。如果出现错误,调试一个小型网络会更容易。常见的错误包括忘记将张量从一层传递到另一层,输入与输出神经元的比例不合理等。
2。预训练的模型(权重): 如果你的模型架构是建立在标准主干之上的,比如 VGG、Resnet、Inception 等,你可以在标准数据集上使用预训练的权重——如果可以的话,在你正在处理的数据集上找一个。最近一篇有趣的论文Transfusion:Understanding Transfer Learning for Medical Imaging表明,使用预训练 ImageNet 模型的几个早期层就可以提高训练速度和医学成像模型的最终准确性。因此,您应该使用通用的预训练模型,即使它不在您正在解决的问题的领域内。当应用于医学成像时,ImageNet 预训练模型的改进量不是很大。因此,也没有太多的保证。更多的话,我推荐阅读杰瑞米·霍华德的这篇惊人的博客文章。
Loss
1。选择正确的损失函数 : 首先,确保你对给定的任务使用正确的损失函数。对于多类分类器来说,二元损失函数不会有助于提高准确率,所以分类交叉熵是正确的选择。
2。确定理论损失 : 如果您的模型是通过随机猜测开始的(即没有预训练模型),请检查初始损失是否接近您的预期损失。如果你使用交叉熵损失,检查一下你的初始损失大约是-log(1/num_classes
。你可以在这里获得更多建议。
3。学习率 : 该参数决定每次迭代的步长,同时向损失函数的最小值移动。你可以根据损失函数的陡度或平滑度来调整学习速率。但是这可能是一个耗费时间和资源的步骤。你能自动找到最佳的学习速度吗?
Leslie N. Smith 提出了一个非常聪明和简单的方法,在短时间和最少的资源内系统地找到学习率。你所需要的只是一个模型和一套训练集。该模型以小的学习率初始化,并对一批数据进行训练。相关的损失和学习率被保存。然后,学习率线性或指数地增加,并且用该学习率更新模型。
在本笔记本的中,您会发现这种方法在 PyTorch 中的实现。我实现了一个类LRfinder
。方法range_test
支持上面描述的逻辑。使用wandb.log()
,我能够记录学习率和相应的损失。
if logwandb:
wandb.log({'lr': lr_schedule.get_lr()[0], 'loss': loss})
使用这个LRFinder
来自动找到你的模型的最佳学习率。
lr_finder = LRFinder(net, optimizer, device)
lr_finder.range_test(trainloader, end_lr=10, num_iter=100, logwandb=True)
你现在可以前往你的 W&B 运行页面,找到 LR 曲线的最小值。以此作为你的学习率,在整批训练集中进行训练。
图 LRFinder 的结果。从这里捕获。
当学习率太低时,模型不能学习任何东西,并且它保持稳定。当学习率足够大时,它开始学习,你会发现曲线突然下降。曲线的最小值就是你正在寻找的最佳学习率。当学习率很高时,损失会爆炸,即损失突然增加。
如果你正在使用 Keras 建立你的模型,你可以使用学习率查找器,正如 PyImageSearch 在博客中所展示的。你也可以参考这个博客来了解 TensorFlow 2.0 中的实现。
激活功能
**1。消失梯度的问题:**10 年前,由于使用了 sigmoid/tanh 激活函数,在训练深度神经网络时存在一个主要问题。为了理解这个问题,读者应该理解前馈和反向传播算法以及基于梯度的优化。我建议你观看这个视频或者阅读这个博客来更好地理解这个问题。
简而言之,当执行反向传播时,计算损耗相对于每层权重的梯度,并且当我们在网络中继续向后移动时,损耗倾向于变小。每一层的梯度可以使用微分链规则来计算。由于 sigmoid 的导数范围仅为 0–0.25,数值上计算的梯度非常小,因此发生的重量更新可以忽略不计。由于这个问题,模型无法收敛或者需要很长时间才能收敛。
假设您正在构建一个不那么传统的神经网络架构。调试这种网络最简单的方法是可视化梯度。如果你使用 PyTorch W&B 构建网络,它会自动绘制每一层的渐变。点击查看我的笔记本。
你可以在笔记本里找到两个型号,NetwithIssue
和Net
。第一个模型使用 sigmoid 作为每层的激活函数。后者使用ReLU
。两个模型中的最后一层都使用了一个softmax
激活函数。
W&B 为 PyTorch 提供一流的支持。要自动记录梯度并存储网络拓扑,可以在 PyTorch 模型中调用 watch 并传递。如果还想记录参数值的直方图,可以将log='all'
参数传递给观察方法。
在 W&B 项目页面中,在运行页面的Vanishing_Grad_1
、VG_Converge
和VG_solved_Relu
中查找梯度图。为此,单击运行名称,然后单击梯度部分。
图 2: VG_Converge 梯度图。从这里抓拍。
在这次运行中,该模型在 MNIST 手写数据集上被训练了 40 个时期。它最终以超过 80%的训练测试准确率收敛。您可以注意到大多数历元的梯度为零。
2.**死亡的 ReLU:**ReLU 不是一颗神奇的子弹,因为当它们被喂食小于零的值时会“死亡”。如果大多数神经元在短期训练内死亡,网络的很大一部分可能会停止学习。在这种情况下,仔细看看你的初始重量或者给你的重量增加一个小的初始偏差。如果这不起作用,你可以试着用Maxout
、Leaky ReLUs 和ReLU6
做实验,如MobileNetV2
论文中所示。
3.**爆炸梯度问题:**这个问题发生在后面的层比初始层学习得慢的时候,不像消失梯度问题,前面的层比后面的层学习得慢。当我们在各层中向后移动时,梯度呈指数增长,就会出现这个问题。实际上,当梯度爆炸时,由于数值溢出,梯度可能变成NaN
,或者我们可能在训练损失曲线中看到不规则的振荡。在消失梯度的情况下,权重更新非常小,而在爆炸梯度的情况下,这些更新是巨大的,因为这错过了局部最小值并且模型不收敛。你可以观看这个视频来更好地理解这个问题,或者浏览这个博客。
让我们试着想象一下爆炸梯度的情况。看看这个笔记本这里我故意用一个大值 100 初始化权重,这样它们就会爆炸。
图 3:演示爆炸梯度。从这里抓拍。
注意梯度是如何向后呈指数增长的。conv1 的梯度值约为 10⁷,而 conv2 的梯度值约为 10⁵.错误的权重初始化可能是该问题的一个原因。
在基于 CNN 的架构中,通常不会遇到爆炸梯度。对于复发的神经营养不良来说,它们更是一个问题。查看这个线程以获得更多信息。由于爆炸梯度引起的数值不稳定,你可能会得到NaN
作为你的损失。这个笔记本这里演示了这个问题。
图 4:南的损失。
有两种简单的方法可以解决这个问题。它们是:
1.渐变缩放
2。渐变剪辑
在链接笔记本中,我使用了渐变剪辑来克服这个问题。渐变裁剪将“裁剪”渐变或将其限制在某个阈值,以防止渐变变得过大。在 PyTorch 中,只需一行代码就可以做到这一点。
torch.nn.utils.clip_grad_norm_(model.parameters(), 4.0)
这里 4.0 是门槛。这个值适用于我的演示用例。查看笔记本中的trainModified
函数,查看其实现。
权重初始化和其他正则化
**1。权重初始化:**这是训练神经网络最重要的方面之一。像图像分类、情感分析或下围棋这样的问题是无法用确定性算法解决的。你需要一个非确定性的算法来解决这样的问题。这些算法在算法执行期间做出决策时使用了随机性元素。这些算法充分利用了随机性。使用称为随机梯度下降的随机优化算法来训练人工神经网络。训练神经网络只是对“好”解决方案的非确定性搜索。
随着搜索过程(训练)的展开,我们有陷入搜索空间不利区域的风险。陷入困境并返回一个“不太好”的解决方案的想法被称为陷入局部最优。有时,消失/爆炸梯度会阻止网络学习。为了对抗这种权重初始化,一种方法是在搜索问题中引入仔细的随机性。这种随机性是在开始时引入的。使用小批量来训练shuffle=True
是在搜索过程中引入随机性的另一种方法。为了更清楚地了解基本概念,请查看这个博客。
好的初始化有很多好处。它帮助网络实现基于梯度的优化算法的全局最小值(只是拼图的一部分)。它防止消失/爆炸梯度问题。良好的初始化也可以加快训练时间。这个博客在这里很好地解释了权重初始化背后的基本思想。
初始化方法的选择取决于激活函数。要了解更多关于初始化的信息,请查看这篇文章。
- 当使用 ReLU 或泄漏 ReLU 时,使用 He 初始化,也称为明凯初始化。
- 当使用 SELU 或 ELU 时,使用 LeCun 初始化。
- 使用 softmax 或 tanh 时,使用 Glorot 初始化,也称为 Xavier 初始化。
大多数初始化方法都是统一的和正态分布的。查看这个 PyTorch doc 获取更多信息。
查看我的笔记本这里看看你如何在 PyTorch 中初始化权重。
注意这些层是如何用kaiming_uniform
初始化的。你会注意到这个模型非常适合。通过简化模型,你可以很容易地克服这个问题。
图 5:用更好的权重初始化训练的模型。从这里抓拍。
2。Dropout 和 Batch Normalization: Dropout 是一种正则化技术,它随机“退出”或“停用”神经网络中的少数神经元,以避免过拟合的问题。在训练期间,在应用了丢弃之后的层中的一些神经元被“关闭”。具有更少参数的神经网络集成(更简单的模型)减少了过拟合。与网络的快照集相反,丢失模拟了这种现象,而没有训练和维护多个模型的额外计算费用。它将噪声引入到神经网络中,以迫使它学习足够好的概括来处理噪声。
批处理规范化是一种改进优化的技术。在对输入数据进行训练之前对其进行标准化是一个很好的做法,这样可以防止学习算法出现振荡。我们可以说一层的输出是下一层的输入。如果该输出在被用作输入之前能够被标准化,则学习过程能够被稳定。这极大地减少了训练深度网络所需的训练时期的数量。批次规范化使规范化成为模型架构的一部分,并在训练时在小批次上执行。批处理规范化还允许使用更高的学习速率,并且让我们不必太在意初始化。
让我们实现上面讨论的概念,看看结果。查看我的笔记本这里,看看如何在 Pytorch 中使用批处理规范化和丢弃。我从一个基本模型开始,为这项研究设定基准。实现的架构很简单,导致过拟合。
图 6:注意测试损失最终是如何增加的。从这里抓拍。
注意测试损失最终是如何增加的。然后,在 Conv 阻塞后,我应用了丢弃率为 0.5 的丢弃层。要在 PyTorch 中初始化这一层,只需调用torch.nn
的 Dropout 方法。
self.drop = torch.nn.Dropout()
退出防止了过度拟合,但是模型没有像预期的那样快速收敛。这意味着集合网络需要更长的时间来学习。在辍学的情况下,学习时不是每个神经元都可用。
图 7:使用压差作为正则项的损耗和度量图。从这里捕捉。
接下来是批量标准化。要在 PyTorch 中初始化这一层,只需调用torch.nn
的BatchNorm2d
方法。
self.bn = torch.nn.BatchNorm2d(32)
批处理规范化用较少的步骤来收敛模型。由于模型简单,过度拟合是不可避免的。
图 8:使用批量标准化的损失和度量图。从这里抓拍。
现在让我们一起使用这两层。如果你同时使用 BN 和 Dropout,请遵循这个顺序(查看这篇文章了解更多信息)。
CONV/FC -> BatchNorm -> ReLU(or other activation) -> Dropout -> CONV/FC
图 9:使用批量标准化和漏失的损失和度量图。从这里抓拍。
请注意,通过使用丢弃和批量标准化,可以消除过度拟合,同时模型收敛更快。
当您有一个大型数据集时,优化很重要,而正则化不那么重要,因此批量正则化对于大型数据集更重要。当然,您可以同时使用批处理规范化和删除,尽管批处理规范化也可以作为正则化,在某些情况下可以消除删除的需要。
笔记
- 文章调试神经网络的清单将是一个很好的下一步。
- 对神经网络进行单元测试并不容易。本文讨论如何对机器学习代码进行单元测试
- 我强烈推荐阅读为什么深度神经网络很难训练?
- 关于梯度裁剪的更深入的解释,请查看如何避免在使用梯度裁剪的神经网络中爆发梯度?
- Sayak Paul 撰写的《权重初始化对神经网络的影响》,他深入讨论了权重初始化的不同影响。
希望这篇博客对机器学习社区的每一个人都有帮助。我试着分享我自己的一些见解和许多好的阅读材料,以加深对这些话题的理解。调试神经网络最重要的方面是跟踪您的实验,以便您可以在以后重现它们。当涉及到跟踪你的实验时,重量和偏差真的很方便。有了可视化实验的所有最新方法,一天比一天简单。
我要感谢拉旺亚给我这个机会。在这个过程中我学到了很多东西。感谢 Sayak Paul 不断的指导。
调试你的神经网络,检查你的梯度
来源:https://upload . wikimedia . org/Wikipedia/commons/3/31/gradient 99 . png
当实现神经网络时,反向传播可以说是更容易出错的地方。那么,如果我们能够实现一些东西,让我们能够轻松地调试我们的神经网络,那该有多酷呢?在这里,我们将看到梯度检查的方法。简而言之,这种方法包括使用数值方法来近似梯度。如果它接近计算的梯度,则反向传播被正确地执行。但是还有更多,让我们看看。有时,可以看到网络在几个时期内停滞不前,然后继续快速收敛。我们还将看看如何解决这个问题。让我们开始吧!
博客中使用的所有可视化和 latex 代码都可以在这里找到
了解如何调试你的神经网络梯度检查这个仓库包含可视化和纹理文件…
github.com](https://github.com/Rishit-dagli/Debugging-Neural-Nets)
梯度的数值近似
为了让我们建立梯度检查,我们首先需要看看如何在数字上近似梯度。我发现用一个例子来解释很容易,所以让我们取一个函数 f(θ) = θ。让我们看看这个函数的图表
你可能已经猜到了一个简单的图表。像往常一样,让我们从θ的某个值开始,现在我们说θ = 1。所以,现在我们要做的是,不仅向右微移θ,得到(θ + ϵ),而且向左微移,得到(θ-ϵ).出于示例目的,我们假设ϵ = 0.01。现在让我们想象一下,忽略图中的比例,这只是为了演示。
所以现在我们的点(θ-ϵ)被命名为 b,而(θ + ϵ)被命名为 c。在这个图中,我们之前使用的是三角形 DEF,并计算它的高度/宽度,在这种情况下是EF/DE
。事实证明,如果你用(θ + ϵ)和(θ-ϵ)之间的一个更大的三角形,你可以得到一个更好的梯度估计,为了说明我的意思,我指的是这个红色的三角形
因此,有一些论文讨论了为什么使用这个更大的三角形可以更好地逼近θ处的梯度,但就本文的范围而言,我不会详细讨论它们。简单解释一下,你现在有两个较小的三角形,你在这里用较大的三角形来考虑-
所以,我们刚刚看到了为什么你应该使用更大的三角形,这样做了,让我们得到那个三角形的数学。如果我们看到这里,我们可以简单地说
H = f(θ-ϵ) and,
F = f(θ+ϵ)
有了这两个结果,你可以说较大三角形的高度(h
)为
h = f(θ+ϵ)-f(θ-ϵ)
用类似的论点,你也可以很容易地算出,这个三角形的宽度(w
)是-
w = 2 ⋅ ϵ
双边导数
所以,如果你知道一点导数,你可以很容易地推断出-
其中g(θ)
是指梯度。
现在让我们通过插入我们刚刚讨论的例子的值来检查我们上面写的等式有多真实。所以我会得到这样的结果。
现在让我们计算它的实际导数。我知道 f(θ) = θ,通过简单的导数 g(θ)=3 ⋅ θ,我们得到 g(θ)=3。我们做了一个很好的近似,近似误差只有 0.0001。现在让我们看看如果我们使用片面的传统方法会得到什么。如果你用单侧差来计算,你会得到近似误差为 0.0301 的3.0301
。因此,我们在这里做了一个了不起的工作,大大减少了我们的近似误差!
你刚刚看到双边衍生品的表现比传统方法好得多。这给了你更大的信心,θ的 g 可能是 f(θ)导数的正确实现。这听起来好得难以置信!这种方法也有不好的一面。结果是运行速度是使用单边方法的两倍。但是我相信在实践中使用这种方法是值得的,因为它更加准确。
再深入一点
让我们回顾一下导数的正式定义。
这里需要注意的一件重要事情是限制。所以,对于非零的ϵ值,你可以证明,这个近似的误差,在ϵ的数量级。ϵ是一个非常小的数字,趋向于 0。所以,总结一下
error = O(ϵ²)
这里的O
指的是骑士团。
但是你可以用简单的数学证明,如果你用单侧导数,你的误差会是,ϵ或者
error = O(ϵ)
ϵ是一个很小的数字,当然小于 1,所以ϵ >> ϵ。现在你可能明白为什么你应该使用双面差而不是单面差,我们将看到这如何帮助我们进行梯度检查。
梯度检查
梯度检查是一项非常有用的技术,多次帮助我轻松调试或找到我的神经网络中的错误。现在,我们将看到如何使用这种奇妙的技术来调试或验证您的实现和反向传播是正确的。这并不是什么新东西,但是让我们快速地看一下单个神经元的示意图,作为复习-
记住[x₁, x₂ ... x_n]
go 作为输入,对于其中的每一个,我们都有参数(w,b ) (w,b)……(wⁿ,bⁿ).因此,要实现梯度检查,你应该做的第一件事是把你所有的参数,并重新塑造成巨大的矢量数据。所以,你要做的是把所有这些 w 和 b,分别改造成一个向量。然后你把所有这些向量连接成一个巨大的向量,叫做θ。所以现在我们可以用θ来写成本函数J
,就像这样
所以现在我们的J
或者成本函数就是θ的函数。
现在,你的 w 和 b 以同样的方式排序,你也可以把dw¹
、db¹
… dwⁿ
、dbⁿ
连接成一个大向量,我们称之为dθ
,它的维数与θ相同。我们将用一个类似的程序来做这件事,我们把所有的dw
都做成向量,因为它们是矩阵,而b
已经是向量了,那么就把它们连接起来。我觉得有一点可能会有帮助,w 的维数与 dw 的维数相同,b 的维数与 db 的维数相同,依此类推。这也意味着您可以使用同样的调整大小和连接操作。所以,现在你可能会有一个问题,“这里的dθ
是θ的梯度或斜率吗?”我们稍后会讨论这个问题。
实施梯度检查
还记得我们把J
写成θ的函数,现在我们把它写成这样-
做完这些,让我们经历一个θ也许是θ₅.的过程我们现在要做的是,计算θ₅的近似导数,精确地说,是对函数 j 的偏导数,还要注意,我们会用到之前讨论过的双侧导数。用数学的方式来表达它-
通过之前对双侧导数的讨论,我们也可以说,这是 j 对θ₅的偏导数,或者-
清楚了这一点,我们现在可以不仅对θ₅,而且对所有的i
重复同样的过程,这样i ∈ (1, n)
。所以这个的伪 Python 代码应该是这样的-
接近结果
所以,现在我们有两个向量dθ[approx]
和dθ
。而这些应该几乎是彼此相等的。但是现在我们会有另一个问题,那就是“我怎么知道两个向量是否近似相等?”
我现在要做的是计算两个向量之间的欧几里德距离。我们要做的是求差的元素的平方和,然后计算它的平方根,得到欧几里德距离。上面这句话可能看起来很混乱,相信我,确实如此!读两三遍,一旦你非常清楚这一点,继续前进。我们将进一步应用另一种方法,我们将归一化这些向量的长度。要做到这一点,我们只需简单地将它们各自的长度相加,然后除以它们之间的欧几里德距离。如果你现在感到困惑,坚持一个能帮助你的等式。
注意:这里我使用了矢量的 L₂范数的常规符号。如果你想知道为什么我们要归一化这个距离,这只是为了防止其中一个向量非常大或者非常小。
在实践中实施梯度检查
在对许多项目实施梯度检查时,我观察到ϵ = 10⁻⁶或 10⁻⁷的值在大多数时候起作用。所以,有了上面提到的相似性公式和ϵ的这个值,你会发现这个公式得出的值小于 10⁻⁷或 10⁻⁸,这太棒了。这意味着你的导数近似值很可能是正确的。如果是 10⁻⁵,我会说没问题。但是我会仔细检查我的向量的分量,检查没有一个分量太大,如果这个差的一些分量非常大,可能你有一个 bug。如果它给你 10⁻,那么我会非常担心,也许有一个错误。万一你得到比这个更大的值,那就真的有问题了!你也许应该看看θ的各个分量。这样做你可能会发现dθ[i]
的值与dθ[approx.]
非常不同,并使用它来找出你的哪个导数是不正确的。
我做了一个很棒的表格供你在做 ML 申请时参考-
参考表
在一个理想的情况下,当你实现一个神经网络时,你会做什么,经常发生的是,你会实现前向传播,实现反向传播。然后你可能会发现这张毕业支票的价值相对较大。然后怀疑肯定有 bug,进去,调试,。在调试一段时间后,如果您发现它通过了 grad 检查,并且值很小,那么您就可以更加确信它是正确的(并且也有一种解脱的感觉:)。这种特殊的方法经常帮助我发现我的神经网络中的错误,我建议你在调试你的网络时也使用这种方法。
更多提示
- 不要在培训中使用,仅用于调试
每个时期的毕业生报到会使它变得非常慢
- 如果算法梯度检查失败,请查看组件
如果你的算法没有通过等级检查,查看组件会有很大帮助。有时它还会提示您错误可能在哪里。
- 正规化
如果你的 J 或成本函数有一个额外的正则化项,那么你也要计算它的导数并把它们相加
- 针对辍学者的不同策略
辍学者所做的是随机移除一些神经元,这使得很难获得他们执行梯度下降的成本函数。结果是,丢弃可以被视为优化某个成本函数 J,但是它的成本函数 J 是通过对它们可以在任何迭代中消除的所有节点的指数大子集求和来定义的。所以成本函数 J 是很难计算的,你只是在每次剔除那些我们使用 dropout 的随机子集时对成本函数进行采样。因此,很难使用 grad check 来复查有遗漏的计算。所以我通常做的是在不辍学的情况下实施毕业检查。因此,如果您愿意,可以将 keep-prob 和 dropout 设置为等于 1.0。然后打开辍学,并希望我的辍学实施是正确的。
您也可以使用一些非常优雅的泰勒展开式来实现这一点,但是由于本文的范围,我们在这里不讨论这一点。
结束的
就是这样,你只是看到了如何轻松地调试你的神经网络,并很容易地找到其中的问题。我希望梯度检查能帮助你发现问题或者调试你的网络,就像它帮助我一样
关于我
大家好,我是里希特·达利
LinkedIn—l【inkedin.com/in/rishit-dagli-440113165/
网站 — rishit.tech
如果你想问我一些问题,报告任何错误,提出改进建议,给出反馈,你可以随时给我发邮件——
- rishit.dagli@gmail.com
- hello@rishit.tech
揭穿 Python For 循环:For 循环的幕后
了解 Python 中 for 循环的实际工作方式,以及对 Python 中迭代器的理解。
蒂内·伊万尼奇在 Unsplash.com 的照片
循环。任何编程语言中最基本的构造之一。一般来说,循环帮助遍历一系列对象,一次访问一个元素。与其他流行的编程语言一样,Python 也有自己的循环实现,并附带了 While 和 For 循环,所做的事情或多或少与循环相同。
当我在探索 python 的时候,我发现 For 循环中发生了一些非常惊人的事情,我认为这是值得一写的。乍一看,在一个 for 循环中会发生如此惊人的事情,这似乎很平常,但实际上非常有趣。本文将涵盖以下内容:
- 迭代器,它们是什么,如何工作。
- Python 中 for 循环的实际实现。
Python 中的迭代器
在我们开始揭穿“For 循环”之前,我们需要首先建立对迭代器的理解,因为迭代器在它的工作中起着重要的作用。
什么是迭代器?
在 python 中,一切都是一个对象,就像 python 中的任何其他对象一样,迭代器也是一个对象,但这个对象可以被迭代到上,并且在调用时一次返回一个元素。
迭代器在 python 中随处可见。我们将在列表理解、生成器中找到迭代器,正如你可能已经猜到的,它们也在“For 循环”中实现。
迭代器是如何工作的?
如前所述,迭代器是一个可以被迭代的对象。创建迭代器对象的必要条件是它必须实现两个特殊的方法
- iter()方法。当调用 iterable 时,这个方法返回一个 iterator 对象。
一个 iterable 是一个对象,我们可以从中获得一个迭代器。例如列表、元组、字符串。
- next()方法。这个方法一次从一个 iterable 中返回一个元素。它用于迭代一个迭代器对象。
让我们看下面一个简单的代码示例,以便更好地理解迭代器。
# a list which is an iterable
numbers = [1,2,3,4,5]# creating an iterator object from the iterable (numbers)
num_iterator = iter(numbers) # returns an iterator#Iterating through num_iterator using next() method
print(next(num_iterator)) # output: 1
print(next(num_iterator)) # output: 2
print(next(num_iterator)) # output: 3
print(next(num_iterator)) # output: 4
print(next(num_iterator)) # output: 5# when no more elements left, exception is raised
print(next(num_iterator)) # StopIteration Exception Raised
使用 iter()方法,我们从数字列表中创建了一个迭代器对象。然后,我们使用 next()方法手动遍历迭代器的所有元素。一旦我们到达数字的末尾,如果我们继续调用迭代器上的 next()方法,就会引发 StopIteration 异常。
Python 中 For 循环的实际实现
既然我们对 python 中迭代器的工作原理有了很好的理解,现在我们可以看看 Python 中的 For 循环的幕后发生了什么。
需要 for 循环吗?
从前面的代码片段中我们可以看到,我们手动遍历列表,这对于一个包含大量数字或元素的列表来说是非常繁忙的。一定有更好更优雅的方法来做同样的事情,那就是 via For 循环。因此,我们之前的代码可以转换为以下代码:
for number in numbers:
print(number) # output: 1,2,3,4,5
只需两行代码和相同的功能。太好了。
For 幕后循环
现在看一下下面的代码片段
num_iterator = iter(numbers)while True:
try:
# get the next item
number = next(num_iterator)
except StopIteration:
break
看着上面的代码,你可能想知道为什么这里有 while 循环,而我们一直在谈论 for 循环?你现在看到的实际上是一个 **for 循环背后发生的事情。**上面的代码是 python 中一个 for 循环的实际实现。
每当对 iterable 调用 for 循环时,在内部使用 iter()方法从 iterable 创建迭代器对象,并使用无限 while 循环在 try/catch 块中使用 next()方法迭代迭代器对象的值。一旦我们到达迭代器中的元素末尾,就会引发 StopIteration 异常,我们就跳出了无限循环。
所以“for 循环”只是一个无限的“while 循环”,带有迭代器的实现。讽刺。
摘要
在本文中,我们学习了什么是迭代器,它们是如何工作的,以及一个 for 循环是如何在 python 内部实现的,它只是一个无限的 while 循环。
如果你喜欢这篇文章,请看看我的其他文章。帮我达到 500 个追随者,跟随我在媒体上获得更多这样惊人的内容。谢了。
在介质上阅读 Furqan Butt 的文字。大数据工程师,Python 开发者。让我们连接…
medium.com](https://medium.com/@furqan.butt)
分散强化学习
强化学习新范式的详细概述
世界上许多协会,如生物生态系统、政府和企业,在物理上是分散的,但在功能上是统一的。例如,一家金融机构的全球经营政策是利润最大化,因此看起来像一个单一的实体;然而,这种实体抽象是一种错觉,因为金融机构是由一组独立的人类代理组成的,他们在没有协作的情况下解决他们的优化问题。在深度强化学习中,最大化目标函数的过程将策略参数化为从状态到动作的函数。策略函数参数根据定义的目标函数的梯度进行微调。这种方法被称为 整体决策框架 ,因为策略函数的学习参数仅使用目标函数进行全局耦合。
注意在 整体决策框架 中行动是如何被代理被动选择的。来源:https://bair.berkeley.edu/blog/2020/07/11/auction/
在简要介绍了集中式强化学习框架的背景之后,让我们继续讨论一些有前途的分散式强化学习框架。
分散强化学习:通过本地经济交易的全球决策
文献[1]提出了一类分散式 RL 算法,该算法在不同抽象层次上建立了社会(全局策略或超级代理)和代理(动作)之间的关系。一个 社会决策框架 被定义在最高抽象层次上,以理解由代理局部解决的优化问题和由社会全局解决的优化问题之间的关系。在每个州,地方一级的代理人在拍卖中出价,拍卖的获胜者将州从一个转变为另一个;之后,它将转换后的状态出售给其他代理,从而传播当地的经济交易链。现在出现了一个关于拍卖机制和社会的特征的问题,这使得简单地从代理优化他们的拍卖效用的全局解决方案的隐含出现成为可能。通过 克隆的维克瑞社会 在抽象的第第二阶段提供了上述问题的解决方案,这确保了代理的支配策略均衡匹配社会的最优策略。[2]中详述的维克瑞拍卖的真实性属性保证了上述结果。在第三抽象级别,提出了一类 分散强化学习算法 ,其利用代理的拍卖效用作为优化目标,并因此仅使用针对代理的可学习参数的信用分配来学习在空间和时间上是全局的社会政策,该可学习参数在空间和时间上是局部保存的。第四抽象级别涉及克隆维克瑞协会的实现,该协会利用提议的分散强化学习算法,并提出一组名为 信用保存维克瑞实现 的最佳设计选择,该设计选择在全局和局部级别都表现最佳。
注意在 社会决策框架 中,行动如何主动选择何时激活。来源:https://bair.berkeley.edu/blog/2020/07/11/auction/
社会决策
让我们通过将马尔可夫决策过程(MDP)和拍卖机制联系在一个统一的符号下来建立基于社会的决策框架。
在 MDP(全局)环境中,输入空间是状态空间*,输出空间是动作空间*。一个代理代表一个策略 π: S → A 。使用转移函数τ:s×a→s、奖励函数r***😗s×a→ℝ和折扣因子γ指定一个目标函数如下:
在给定的状态 s 下,代理执行使 J(π)最大化的任务,并因此找到如下定义的最优动作:
在拍卖(本地)环境中,输入空间是单个拍卖项目 s,输出空间是出价空间𝔅.n 个代理中的每一个使用其各自的投标策略在竞争中对拍卖项目投标ψᵢ: {s} → 𝔅.设 b 是代表 n 个代理人出价的向量,那么每个代理人的效用可以用 vₛ 来定义:这个向量表示每个代理人对投标物品 s 的评价,以及由分配规则x:𝔅ⁿ→定价规则***p组成的拍卖机制*因此,效用函数可以规定如下:****
在拍卖理论中,一次拍卖是一个显性策略激励相容 (DSIC)如果在拍卖中独立于其他参与者的出价策略,对一个人的评估出价是最优的。维克瑞拍卖【2】将 Pᵢ(b 设定为第二高的出价,如果代理人 i 获胜则 Xᵢ(b)=1 为 0,如果代理人 i 失败则为 0,这就是 DSIC,意味着当每个代理人如实出价时会出现优势策略均衡。这导致社会福利最大化(∑vᵢ×Xᵢ(b),因此选择评价最高的投标人。DSIC 财产在维克瑞拍卖中的存在消除了代理在执行优化时考虑其他代理的需要,因此使用维克瑞拍卖构建的分散强化学习算法非合作地运行。**
定义
“一个 原语 (代理)ω是一个元组(ψ,ϕ),其中ψ: S→𝔅代表竞价策略,ϕ: S→S 代表转换。一个 社会 是一组被表示为ω^{1:N}.的原语**
最优出价(如[3]中所述):假设在每个州 s,如果代理 I 获胜,本地拍卖分配 Xᵢ(b)=1,如果代理 I 失败,分配 Xᵢ(b)=0。然后,所有的原始ω^i 投标各自的最优社会 q 值作为一个整体产生一个最优的全球政策。
最优竞价的优势策略(如[1]中所述):如果每个状态 s 的 vᵢ估值是最有利的社会 q 值,那么社会的最优全球政策与维克瑞机制下的原语的独特优势策略均衡相一致。——
经济交易视角
市场经济视角及其解释。来源:https://bair.berkeley.edu/blog/2020/07/11/auction/
因此,上述系统中的货币基于所收到的回报,并且财富分配的发生取决于未来的基元决定出价购买过去的基元所承担的信息处理劳动的成果,目的是将一种状态转换为另一种状态。
克隆的维克瑞协会。图 1 来源于[1]
对描述 clove Vickrey society 机制的上图的简明解释。来源:图 1[1]
基于策略的分散强化学习算法
来源:第 6 节[1]
在学习了利用克隆的 Vickrey 拍卖机制的分散强化学习算法的内部工作原理之后,如果您想了解更多关于使用该算法执行的实验,请参考第 7 节标题为[1]的实验。
在[1]中描述的分散强化学习算法模拟了由于使用克隆的维克瑞协会而导致的不合作的特征。在接下来的章节中,我们将熟悉另一种分散强化学习算法,但是是在合作控制环境中。
用于协同控制的深度分散强化学习
形式问题定义
给定一个由 N 个智能体控制的离散时间系统 f: X × U → U 表示为**
来源:文献[4]中的等式(1)
其中 xₖ ∈ X ⊆ ℝⁿ表示系统在时间步 k 的状态,
u_{i,k} ∈ Uᵢ ⊆ ℝ对智能体的控制 i ∈ ℕ = {1,…, N }和 U=U₁×U₂×…×U_{N} 联合控制空间。每个智能体 i ∈ ℕ根据当前状态 xₖ和控制 u_{i,k},从奖励函数 g: X × U → ℝ 中获得奖励 rᵢ。
来源:文献[4]中的等式(2)
每个代理的目标是适应他的控制律πᵢ: X → Uᵢ,在控制律元组
π=(π₁,π₂,…,π_{N})和γᵢ ∈ [0,1]作为折扣因子下,最大化他的长期折扣报酬
来源:文献[4]中的等式(3)
因此,确定性博弈可以由元组
G = (X, f ,U₁,…,U_{N},g₁,…,g_{N},γ₁,…,γ_{N})来定义,问题可以描述为:
问题陈述
给定博弈 g,每个代理人 i∈ N 知道系统动力学 f 和他自己的奖励函数 gᵢ.此外,每个代理 i∈ N 在时间步 k 接收他的当前报酬 r_{i,k},并且能够推导出其他代理的先前控制 u_{j,k1 },
∀ j∈ N{i},但是不能访问当前控制 u_{j,k},其他代理的控制法则πⱼ,它们的报酬函数 gⱼ或实际报酬。在这种情况下,每个智能体 i∈ N 的目标是调整其控制律πᵢ,以最大化上述定义的 Vᵢ^{π}。——【4】**
分散协同控制方法
为了解决上一节中提出的问题,用于协同控制的深度分散强化学习提出了一种依赖于时间的时间经验重放 (TER) 来解释由多个智能体组成的非平稳环境,使用虚拟经验重放* (IER) 来灌输系统的已知动态,并利用具有影响 Q 学习 (IQL) 的变量学习来诱导协调。这些机制是模块化的,因此让我们先介绍它们,然后再组合它们。***
时间体验回放(TER)
提出时间体验重放背后的基本概念是根据类似于优先体验重放的优先因子,将偏好更近的体验的想法与体验重放中可能的体验采样相结合。但是这里我们的关注点更倾向于最近的经历,因此我们引入了时间优先化* τ,它与收集状态转换后经过的时间成比例。***
来源:[4]中的等式(7)和(8)
因此,需要通过附加当前时间步长来生成新的体验元组,以灌输上述时间优先化因素。
来源:[4]中的等式(9)
然而,上述的 TER 方法在实践中导致了两个主要问题:(1)太多偏向于最近的经验可能导致代理的策略过拟合,以及(2)由于需要在每个时间步长为每个经验元组计算τ,这增加了采样过程的计算复杂度,使得 TER 在实践中不可行。为了克服上述问题,引入了两步采样过程。首先,从整个体验重放缓冲器 M. 中均匀随机地提取大小为 b 的宏批次 𝔅。随后,使用前面提到的时间优先化概率从𝔅采样大小为 t 的小批次tt≪b。这解决了这两个问题,因为通过从大小为 b 的𝔅采样降低了计算时间优先级的计算复杂度。此外,小批量均匀随机抽取防止在代理人的政策中过分强调最近的经历。**
此外,为了适应其他代理的策略变化,我们还需要考虑代理在其训练过程的不同阶段的可变探索率εₖ。当其他玩家的政策开始趋同时,降低探索会更有效。因此,我们提出了一个额外的勘探率依赖 b,产生一个时间相关的宏观批量 Bₖ.在早期训练过程中,即εₖ ≈ 1,经验应均匀随机抽样,这可以通过选择接近小批量 t 的 Bₖ来获得,而在后期训练过程中,即一旦εₖ → 0,Bₖ应接近最终的宏批量 b。随后,我们有如下宏批量:
来源:[4]中的等式(10)
想象中的经历回放(IER)
TER 对经验重放所做的修改为训练过程赋予了稳定性,因此代理人对变化的环境动态的接受度较低。此外,TER 避免了偏向于最近经验的学习,从而使智能体能够适应非平稳的环境动态。到目前为止,一个重要的假设是,环境动态与其他主体的行为分离,这通常是合理的,因为主体是独立和分散的。然而,我们知道系统动态,因此有可能通过边缘化其他代理的控制来使环境静止。这是想象的经历重演背后的基本概念(IER)。请注意,IER 仅用于模拟在正常环境条件下可能不会发生的体验。前面提到的常规经验元组可以用下面的底层系统动力学 f 和奖励函数 gᵢ来代替:
来源:文献[4]中的等式(12)
其中 u_{-i} = {u₁,…,u_{i-1},u_{i+1},…,uₙ},即除了代理 i. 之外的其他代理的控制。最终,**想象体验可以通过将其他代理的控制 u_{-i}替换为 0 来模拟,如下所示:**
来源:文献[4]中的等式(13)
想象的体验实际上并不存储在 ERM 中,而是用于采样探索率相关概率用于确定除了观察到的体验之外,是否还计算了想象的体验。最初,在训练过程中,代理大多执行随机控制的探索。因此,不可能从初始阶段的抽样观察中推断出其他代理的策略,因此应用 IER 来稳定训练过程是最有用的;因为在 IER,体验是以这样一种方式模拟的,即只有智能体 i 与环境互动,没有来自其他智能体的探索噪音。因此,与当前时间步长 k 处的想象体验的模拟相关联的概率与εₖ(当前探索速率)成比例,因此,p(k)∞εₖ.**
随后,在培训过程的后期阶段,代理的策略开始趋同。与后期探索相比,更重视主体之间的协调和对合作伙伴政策的适应。因此,在训练的后期阶段,通过产生模拟代理之间合作的经验,IER 可以用于诱导代理之间的协调。相应的采样概率被建议为 p _ { coord }(k)∞(1 εₖ).为了诱导协调,想象的体验需要通过 IER 产生,这样最终的算法需要混合的合作-竞争任务类型。为实现上述目标,提出了以下三种方案。**
第一种情况:代理人 i 的控制被放弃,因此代理人 I 可以观察其他代理人自己如何行为,以及由此产生的环境转换是否有益。来源:文献[4]中的方程(14)
第二种情况:代理 I 的控制被设置为等于所有其他代理的联合控制的平均值。来源:文献[4]中的等式(15)
第三种情况:所有其他代理的控制被设置为等于代理 I 的控制。来源:在[4]中的等式(16)
通过从上述三种情景中产生想象的经验,协调的可能性被耗尽了。第一个场景导致代理评估空闲是否可接受,而第二个和第三个场景计算代理 i 是否复制其他代理的平均控制或者所有其他代理是否应该坚持代理 i 的控制。
影响 Q-Learning (IQL)
以前对 ER 的修改通过稳定环境来解决不稳定的环境问题。此外,在多主体强化学习中经常使用的一种机制是可变学习率。用于合作控制的深度分散强化学习提出了一种使用可变学习率的多智能体信用分配任务的新方法,该方法试图将可变学习率与智能体对回顾性观察到的状态转换的个体贡献相关联。同样,引入了一个称为影响因子的量,它表示代理对联合控制的贡献,从而表示观察到的状态转换。**
时间步长 k 时代理 I 的影响因子。来源:[4]中的等式(17)
假设在 IQL 中,代理共享相同的控制空间 U₁ =。。。= U_{N}并且所有代理的控制同等地操纵系统,我们可以如下描述更新规则:
IQL 更新规则。来源:文献[4]中的方程(18)
其中 0 ≪ β ≪ σ ≪ α ≪ 1。使用上述 IQL 更新规则,我们可以同意,当一个适当的积极的经验被观察到,Q 值估计大幅增加,只有当代理人可以被认为是事件的发生。另一方面,当负面体验发生时,如果代理人至少有部分责任,代理人大多不鼓励转换到相应的状态-动作对。此外,代理需要这种责任驱动的类型的学习行为来克服多代理设置中的信用分配挑战。**
算法
在了解了模块化节 ter、IER 和 IQL 之后,我们现在准备详细说明最终算法如下:
协同控制的深度分散 RL 算法。来源:[4]
在前面的章节中唯一增加并且没有解释的是配合系数 ψ_{i,k} =sgn()。如果ψ_{i,k}的值为 1,那么代理人 i 和其他人被称为正协调,因此没有必要模拟 IER 提到的协调经验χ_{idle}、χ_{coop1}和χ_{coop2}。而且,主要用于λ_{high} ≥ λ_{i,k} ≥ λ_{low}的学习率σ被更大的学习率α所代替。因此,代理被说服在培训过程中强调合作经验。在智能体负协调的情况下,ψ_{i,k}等于-1。这里,除了采样的体验χₖ,还模拟了人工想象的体验χ_{idle}、χ_{coop1}和χ_{coop2},因此,代理对所有这些体验进行训练。这里使用了最低的学习率β,因为代理接受培训的经验并没有实际发生,而只是为了协调而想象出来的。因此,模拟若干协调体验的繁重计算任务可以在很大程度上减少,并且主要集中在与最高预期训练进度相关的事件上。**
为了了解更多关于使用上述算法进行的实验和模拟,我强烈建议您参考第 4 节,标题为[4]中的结果。
在这一点上,我们已经涵盖了两种有前途的方法,旨在实现分散强化学习,一种是在非合作环境中(“分散强化学习:通过本地经济交易进行全球决策”),另一种是在合作环境中(“用于合作控制的深度分散强化学习”)。
参考
- 分散强化学习:通过本地经济交易的全球决策。arXiv 预印本 arXiv:2007.02382 (2020)。
- 威廉.维克瑞。“反投机、拍卖和竞争性密封投标.”《金融杂志》,第 16 卷第 1 期,1961 年,第 8–37 页。 JSTOR ,www.jstor.org/stable/2977633.**
- Baum,E. B.《走向一个由白痴组成的自由放任经济的心智模型》。在 ICML,第 28-36 页,1996 年。
- 《合作控制的深度分散强化学习》 arXiv 预印本 arXiv:1910.13196 (2019)。
去中心化人工智能&捍卫隐私:联邦学习的天才
来源: Unsplash
伦理和非侵入式机器学习
很有可能,你的手机现在就在你五英尺之内。
事实上,2013 年的一项研究发现,72%的人大部分时间都在手机的范围内。2015 年的一项研究发现,63%的参与者每天离开手机不到一小时。另有四分之一的人根本不记得离开过他们的手机*。*
很明显,我们的设备,尤其是我们的手机,不断地产生数据。它们充满了传感器——既有跟踪你的触摸动作和浏览历史的数字传感器,也有跟踪你的物理位置和运动的物理传感器。你的手机是你的数据化身,而且它非常容易获取,这可能会令人不安。
从机器学习的角度来看,这非常有帮助。随着数据的增多,这是一个创造更智能的模型,产生更吸引人和个性化结果的绝佳机会。无论是根据你的位置来管理定制的搜索结果,还是监控你的浏览和社交媒体活动,以推荐合适的产品来购买,更多数据的应用数不胜数。
然而,从伦理上来说,你的活动、网络、对话、运动并不真正属于你的前景应该是令人不安的,如果不是可怕的话。在数字时代处理用户数据的组织需要非常谨慎,以免被恶意利用和操纵。如今,许多数字用户理所当然地对他们的数据被如何使用持严格态度。
现在,必须提出一个重要问题:如何在支持(而不仅仅是承认)用户数据隐私的同时,实现大数据带来的更个性化和更具吸引力的体验?
Google 想出了一个解决这个难题的方法:联合学习。在 2016 年的一篇论文中介绍了联合学习,它不是一种特定的算法,而是一种以道德隐私保护方式从用户数据中挖掘洞察力的结构化策略。
然而,为了理解这一点,我们首先必须理解部署人工智能模型的其他传统方法是如何工作的。假设我们正在使用 YouTube 的 app,其中一个核心功能就是它的视频推荐算法。
通常,这些类型的重模型存储在云中,这是有意义的——它们有数十亿个参数,并查看无数个潜在的视频。将模型存储在云中,并让用户通过请求连接到它会更有效率。
由作者创建
用户发送的请求以数据的形式出现,并随响应一起返回。例如,当你正在浏览 YouTube 时,你的手机已经发送了你的数据——你的浏览历史,你感兴趣的话题等等。—到云端,云端返回你可能喜欢的视频(回应)。
基于新连接的数据和你是否实际点击了推荐的视频,YouTube 的推荐算法不断接收新的输入和反馈,以了解它做得如何。它采用新的训练数据,因此可以生成预测,这些预测会随着新的趋势、想法和运动而变化。
显然,这里有许多隐私问题。所有的数据都集中在一个地方——云——每当需要机器学习模型时,你的数据就会被发送到那里,这是很常见的。许多数据泄露是致命的,因为数据过于集中在一个位置。创造比特币背后的驱动力是对银行的同样担忧——集中的资金储备。
另一方面,离线推理消除了对云的严重依赖。当手机处于舒适的状态时,例如接通电源、高电量电池、连接到安全的 wi-fi,它会下载原始型号的缩小版、移动优化版。使用离线推理有几个好处:
- 隐私。显然,对云的持续请求是不需要的。您的数据在您的手机上本地化,手机直接接收来自下载模型的响应。
- 降低有害数据泄露的风险。当每个用户的数据被本地化后,即使黑客能够访问云,这些信息——模型的版本,用户手机上下载的模型的性能——也没有多大用处。这从一开始就降低了实施数据泄露的动机。
- 运行该模型需要更少的带宽和电池。不断维护与云的请求-响应对话,特别是当成千上万的用户在同一时刻做同一件事时,计算成本非常高。离线推理已经得到了很好的发展,使用了模型压缩等方法来产生强大的预测,同时占用很小的存储空间。
- 更低的延迟。因为模型是本地化的,因此只为一个客户服务,所以预测的响应时间要快得多。在数字界面的世界里,一秒钟的每一分钟都价值不菲。
- 即使没有互联网连接,该模型也可以运行。这对于任何产品来说都是一个有价值的特性。例如,考虑一下谷歌翻译:如果你不能把它弹出来,在任何地方翻译文字和视觉形式的语言,它还会受欢迎吗?
因此,在分布式系统中部署模型时,在线和离线推理是标准。显然,从数据管理的角度来看,离线推理更加安全和隐私,但是您不能同时训练模型。另一方面,在线推理不太安全,但模型可以更新。
任何公司都知道,如果他们保持静态,他们将很快失去对需求动态本质的青睐。由于离线推断的局限性,这对于捍卫隐私和安全数据来说并不是一个大胜利。
随着知识的增加,可以提出一个更具体的问题:如何训练深度模型——用新数据更新——同时保护用户数据的隐私?
在最初的概念中,Google 为这个问题规定了一个解决方案框架:
- 选择设备样本来参与训练。这些通常是目前处于“舒适”和活跃状态的手机。
- 当前模型参数被下载到每个设备上。
- 设备在预设的时间段(例如 20 分钟)内训练它们的离线模型,使用本地训练数据来更新模型参数。
- 在预设的一段时间后,手机会将它们的模型参数上传到云端。
- 一种算法获取每个模型的参数——这些参数根据用户与它的交互方式(提供的训练数据)而有所不同——并将它们聚合起来,形成一个更新的全局模型。
- 启动另一轮模型更新。
由作者创建
联合学习如此聪明是因为它解决了离线和在线推理的问题。它允许公司保护用户的隐私,同时随着市场流动动态地更新他们的模型。
联合学习的关键在于聚合算法。联合学习是一种分布式学习,在利用大数据的力量不断优化模型的同时保护隐私。提出的初始算法“联邦平均算法”工作得足够好,其本质上对接收的参数执行加权平均。
让我们举一个联合学习的例子。假设一个短信服务正在测试他们的语言模型,它会根据用户已经输入的内容推荐他们下一步要输入的单词。
选择 100 个用户进行训练,并将当前的模型参数发送到他们的手机上。然后,在接下来的 48 小时内,模特们将会收到基于她们表现的表现更新和培训。例如,假设一个模型在用户已经输入“你好”之后推荐“你”。
如果用户确实输入或选择了“你”,那么该模型就接收到了当前正确决策过程的强化。如果用户没有键入“你”,这是模型要学习的新训练数据。联合学习只能在这些能够纯粹从本地数据收集标签的模型上操作。
我们打字的方式都不一样——一个青少年的短信里充满了缩写(“how r u”、“brb”、“lol/lmao”等)。)与一位杰出的作家风格不同。一家想要成功的公司应该有一个能够应对所有这些受众的模型,然而通过短信,我们交流了一些最隐私的信息——秘密、密码、故事。通过联合学习,每个消费者细分的独特见解可以以保密和安全的方式进行汇总。
联邦学习的天真模型的一个问题是,模型,尤其是非常深的模型,本质上可以记住更新的信息,其参数仍然发送到中央服务器。已经提出了另一种聚合算法,差分私有联邦平均,以进一步保护包含在各个模型参数中的信息。
随着大数据持续快速增长,隐私日益成为首要问题。继续研究联邦学习并将其确立为人工智能的标准是关键。
要点
- 在数字时代,我们的手机和其他设备越来越依赖于你。您的活动、网络、行动和信息需要是安全和隐私的。
- 在线学习集中了人工智能。用户将他们的数据发送到云中的模型,模型返回预测并被更新。离线学习分散了 AI,代价是无法用新的见解持续训练一个全球模型。
- 联合学习结合了在线和离线学习的优点,通过在本地数据上训练模型,然后聚集参数以形成更新的全局模型。通过一个去中心化的系统,可以在不接触个人数据的情况下训练一个全局 AI。
感谢阅读!
分散你的网站
IPFS + ENS
unsplash.com/photos/Q1p7bh3SHj8
当主持一个网站时,你通常会使用一个专门的副总裁,比如数字海洋、 Linode 、谷歌,或者亚马逊。设置好你的服务器后,你可以在 Google Domains 或 NameCheap 注册一个域名。最后一步是编辑您的 DNS 记录,将您的域指向您的服务器。现在,您可以通过导航到您的域名来访问您的网站。但是,这有一个问题。你的 VPS 控制着你网站的托管,域名服务维护着你域名的控制权。如果你的 VPS 宕机或者你正在使用的公司突然被列入你所在国家的黑名单会怎么样?如果 ICANN 把你的域名抢走了怎么办?或者你的域名服务关闭了?
虽然这些不太可能,但它们很重要,让你思考如果你不能再托管你的网站或者你的域名被拿走了,你会怎么做。
使用 IPFS(星际文件系统)和 ENS(以太坊名称服务)你可以以完全分散的方式托管和服务你的网站。
IPFS 被描述为
一个对等超媒体协议
旨在使网络更快、更安全、更开放
你可以把 IPFS 想象成 HTTP 或者 CDN(内容交付网络)。这是一种查询资源的方式,只不过不是由谷歌、亚马逊等控制的几个大型数据中心托管的资源。这些文件是分散的,由世界各地的任何人在不同的节点上运行。
HTTP 基于 URL 查找资源,但是 IPFS 使用散列来查找其网络上的资源。
IPFS 哈希的一个例子是 QMS 4 ustl 54 uo 8 fzr 9455 qaxzwumihyvmcx 9 ba 8 nu H4 uvv,可以通过类似 Cloudfare 的网关访问,例如cloud flare-ipfs . com/ipfs/QMS 4 ustl 54 uo 8 fzr 9455 qaxzwumihvmcx 9 ba 8 nu H4 uvv。
这个散列指向用于托管您自己的 IPFS 节点的起始文件,正如您所看到的,它只显示了到其他文件的链接。
QMS 4 ustl 54 uo 8 fzr 9455 qaxzwumiuhyvmcx 9 ba 8 nuh 4 uvv
但是一个 IPFS 哈希也可以指向一个网站,比如最近刚刚部署到 IPFS 的 tornado.cash (一个加密混合器)。
可以通过 ipfs.io 网关ipfs . io/ipfs/qmrvfzwyojemdccdsik 15m 7 VN 2n 1 bfnz 14 nwvxrhizzzx 5/访问。
总之,IPFS 提供了几个主要的好处
✅分散内容网络
✅不可改变
抵制✅审查
部署到 IPFS
您可以通过启动自己的节点将网站部署到 IPFS。首先下载 IPFS 围棋实现然后打开终端并运行
ipfs daemon
然后,您应该会看到以下输出
Initializing daemon...
go-ipfs version: 0.4.22-
Repo version: 7
System version: amd64/darwin
Golang version: go1.12.7
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/192.168.1.7/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/192.168.1.7/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: [http://127.0.0.1:5001/webui](http://127.0.0.1:5001/webui)
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready
现在你已经准备好固定你的站点了
ipfs add index.htmladded QmY9cxiHqTFoWamkQVkpmmqzBrY3hCBEL2XNu3NtX74Fuu index.html
6 B / 6 B [=========================================================] 100.00%
为了确保您的站点留在网络上,您可以将它固定到您的本地节点
ipfs pin add QmY9cxiHqTFoWamkQVkpmmqzBrY3hCBEL2XNu3NtX74Fuupinned QmY9cxiHqTFoWamkQVkpmmqzBrY3hCBEL2XNu3NtX74Fuu recursively
你现在可以通过你的网关导航到输出的散列,并看到你的站点ipfs.io/ipfs/QmY9cxiHqTFoWamkQVkpmmqzBrY3hCBEL2XNu3NtX74Fuu
固定到您自己的节点是很好的,但是,如果您的节点关闭或您托管的文件被删除,并且您的文件尚未通过网络传播,会发生什么呢?
一个很好的经验是将你的站点添加并固定到三个 IPFS 节点。你可以通过创建你自己的 IPFS 集群或者使用一个流行的已经设置好节点的固定服务来实现。如平特拉或太阳穴。
对于这个例子,我们将使用 Pintra。首先,导航到 pintra.cloud ,注册并导航到上传选项卡
上传单个文件或多个文件的目录。当您将文件添加并固定到本地节点时,您还可以固定来自的散列,以确保它在整个网络中传播。
如果你正在用 React 或 Gatsby 这样的框架创建一个 web 应用,你可以把你的build
或public
文件夹上传到 Pintra。或者你可以查看IPFS-部署来部署你的站点到 IPFS。
现在我们的网站托管在分散的抵制审查的 IPFS 网络上,但是导航到 ipfs.io/ipfs/QmY9cxiHqTFoWamkQVkpmmqzBrY3hCBEL2XNu3NtX74Fuu 很难记住,我们需要一个域名。
注册一个 ENS 域名
以太网名称服务提供
一种安全且分散的方式,使用简单、易读的名称来寻址区块链内外的资源。
ENS 不是在像 Google Domains 这样的网站上注册域名,而是一个非营利组织,提供不可变的.eth
域名,并在以太坊区块链上注册。
.eth
域名的主要目标是使加密货币地址可读。然而,ENS 增加了将你的域名链接到 IPFS 散列的支持,因此当一个.eth
域名进入你的浏览器时,它将解析到你在 IPFS 的网站。
例如,我的.eth
域名是 kohorst.eth 如果你将该域名输入你的加密钱包(如果有 ENS 解析器的话),它将解析为我的 eth 地址。更重要的是,如果你在浏览器中输入kohorst.eth/
(如果它有类似勇敢的 ENS 解析器,如果没有你可以输入kohorst.eth.link
它会解析)我的个人网站(托管在 IPFS)会解析!
第一步是购买你的 ENS 域名。导航至[app.ens.domains](http://app.ens.domains)
并搜索您的域名。
**注意:**要购买 ENS 域名,您需要以太网和兼容 Web3 的浏览器/扩展。我个人用 Metamask 推荐这个入门教程。
选择您希望购买域名的年数,然后按照购买步骤进行操作。
在您签名并验证您的交易后,您必须等待交易在以太网区块链上得到验证。交易完成后,您可以点击您的域名进行管理。
它看起来会像这样
app.ens.domains/name/kohorst.eth
有很多东西你可以添加到你的 ENS 域名你的 ETH 地址以及其他加密货币,如 BTC 或 LTC,你的电子邮件,Github 甚至 Twitter 用户名。最重要的是,你可以添加你的 IPFS 哈希。
点击添加按钮,在Content
下添加你网站的 IPFS 散列
您必须为要写入区块链的内容支付汽油费用,在交易被验证后,您应该能够导航到yourdomain.eth.link
并查看您的 IPFS 网站!
IPFS 和常规域名服务
没有以太或者不想让你的域名在.eth
结束?您可以将您的传统 DNS 指向您的 IPFS 哈希,这样您就可以保留您的.com
域名。你可以在这里了解更多信息。
在谷歌域名中,你需要注册一个指向 IPFS 网关 IP 地址的 A 和 AAAA 记录。你可以使用nslookup
来查找 IPFS 网关的 IPv4 和 IPv6 记录(一个功能良好的网关列表在这里可以找到)。
我使用的ipfs.io
网关其记录是
A 209.94.90.1
AAAA 2602:fea2:2::1
在您的 DNS 上注册这些,然后创建一个带有 dns link 值的 TXT 记录,如下所示
"dnslink=/ipfs/<HASH>"
lucakohorst.com的 DNS 记录
就是这样!现在你的域名将指向你的 IPFS 网站。
[## 卢卡斯·科霍斯特
科霍斯特. eth](http://kohorst.eth.link/) [## IPFS 为分布式网络提供动力
IPFS 的目标是超越 HTTP,为我们所有人建立一个更好的网络。今天的网络是低效和昂贵的
ipfs.io](http://ipfs.io/) [## 以太坊名称服务
ENS 提供了一种安全、分散的方式来解决区块链内外的资源问题
ens .域](https://ens.domains/) [## 轻松添加文件到 IPFS
Pinata 通过我们简单的 IPFS API 和工具包简化了分散存储。我们的 IPFS 大头针服务提高了您的…
pinata.cloud](https://pinata.cloud/)
决定在人工智能原型中测试什么
paweczerwiński 在 unsplash 拍摄的照片
决定测试什么是定义人工智能原型的第一步,也是最重要的一步。这个决定影响了原型设计中的所有其他决定。
定义测试中的假设很重要,因为原型是杂乱的。杂乱的实验给出混乱的结果;把相关的隐藏在偶然事件中。
原型是最终产品的粗略近似。从原型中获得的知识可能会改变游戏规则,引人入胜,而且完全令人惊讶。但是要自信地从原型中学习,效果或洞察力需要很大。
从原型中得到一个发现并加以概括是非常容易的,但后来发现这种学习与原型本身的一些缺陷直接相关。原型和最终产品之间的微小差异会影响学习。一些细节,比如元素加载的速度,或者被限制在几个用户行程之内,会对用户的反应产生非常真实的影响。
有了原型,我们寻找大的效果。一旦我们的注意力被吸引,事情就会变得显而易见。不是优化。对于优化,在设计过程的后期进行,并考虑对大型用户组进行 A/B 或多变量测试。
由于测试中有许多元素,反馈会有噪声。很难理清用户告诉我们和展示给我们的东西的因果关系。
我们可能想要测试的内容类型包括:
技术细节
- 模型的性能。
- 交付模型结果的速度。
- 来自模型的反馈率以及用户是否可以直观地“教授”系统。
界面
- 人工智能功能的交互性如何。
- 人工智能特性有独立的元素吗?如何将这些与系统的其他部分区分开来。
消息传递
- 解释人工智能算法;它做什么以及如何学习。
- 教用户如何让产品学习。
- 模型结果的数值;期望用户有多擅长算术。
- 我们是否以及如何传达错误信息。
误差校正
- 如何在出错时安装故障保险?
- 如何确定模型是否已经崩溃?
- 当模型崩溃时我们该怎么办。
- 如何从灾难性错误中恢复?
测试来自 simonoregan.com的人工智能原型
将这些测试分开很重要。为了测试技术细节对用户的影响,最好已经完成了界面、消息和错误通信的最终设计。
消息传递与接口和错误处理紧密相关,通常不会单独测试。相反,接口和消息传递或者错误处理和消息传递将成对测试。
要记住的重要一点是,我们不希望快速交换这些排列,希望我们能观察到用户反应的细微差异,以帮助我们确定最佳组合。对于小用户群,结果在统计上肯定不显著,通常也不具有普遍性和相关性。
相反,选择一个具有明确定义的预先假设的配置,并观察用户的行为是否如预期的那样,如果不是,为什么不是。
感谢您的阅读🙏🏻
这篇文章最初发表于simonoregan.com。
如果你喜欢这个,你可能会喜欢【部署时代】——每周更新的工具和思考,揭示了 2020 年代的新兴技术和趋势。
网飞近年来的内容战略
利用文本挖掘进行内容分析(自然语言处理)
OVID -19 为我们的日常生活带来了新的标准。社交距离和隔离的做法让我们花更多的时间呆在家里,否则我们会在工作日通勤上班或周末逛商场。
作为一个喜欢看电影的人,我决定每天晚上在网飞看 1-2 部电影。当我啜饮咖啡,翻阅网飞的电影名时,我意识到我花了太多时间来决定我想看哪部电影。我通常按流派搜索 15-20 个标题,并在划分电影区域之前阅读它们的描述。鉴于网飞有太多的选择,我们不都花了很多时间来决定看哪部电影吗?当我继续搜索电影,仍然不确定选择哪部电影时,我想知道网飞的整个内容团队是否每天都在解决同一个问题: 我应该为我的订户选择哪些内容?
对于网飞这样的流媒体平台来说,内容将是增加其付费用户基础的最重要的战略杠杆之一。快速浏览一下网飞 2019 年第四季度的财务报表就会发现,其付费用户数量高达 1.67 亿。(见下图 1)
如果网飞所有的付费用户组成一个国家,比如网飞共和国,它将是世界上第九大人口大国,比第八名落后一百万。
图 1:每季度付费用户净增数;资料来源:Srinivas Vadrevu 基于 2019Q4 财务报表数据对 2017Q1 至 2019Q4 各季度付费用户净增数的分析
图二:每个季度免费试用用户;资料来源:Srinivas Vadrevu 根据 2019Q4 财务报表数据对 2017Q1 至 2019Q4 各季度试用用户的分析
此外,有趣的是,2018 年第四季度试用用户激增至 920 万,随后 2019 年第一季度付费用户数量增加了 960 万。2019 年第一季度,大部分试用用户成为付费用户并创造了付费用户高峰吗?
虽然 2019 年每个季度试用用户都在减少,但从 2019 年第二季度到 2019 年第四季度,付费净新增用户在增加。是用户直接创建付费账户没有试用期!?没有用户层面的数据,很难回答这些问题。
与每个用户的收入相比,每个用户的内容支出在这几个季度中有什么变化?
收入和营销支出在 2019 年第四季度财务报表的历史分部部分有所提及。由于网飞提供的内容类型不同,内容支出的计算也有所不同。
图 3:网飞内容的类型;来源:网飞投资者关系-2018 年 1 月
截至 2018 年 1 月的会计处理文件提到,内容支出将被计算为流媒体内容资产的加+流媒体内容负债的变化。
下表提供了过去 12 个季度中每个季度的付费用户增加、收入、内容支出和营销支出等财务数据的快照。
图 4:收入、营销和内容支出分析;来源:Srinivas Vadrevu 基于网飞财务报表 2019Q4 的数据进行的分析
图 5:每个付费用户的平均收入和支出;资料来源:Srinivas Vadrevu 基于网飞财务报表 2019Q4 的数据进行的分析
- 每付费用户的平均收入在过去 4 个季度中不断增长,从 2018 年第 4 季度的 29 美元增长到 2019 年第 4 季度的 32 美元
- 从 2017 年第一季度到 2018 年第四季度,每个付费用户在平台上的内容支出逐渐增加。它在 2019 年第一季度大幅下降 20%至 20 美元,并在过去四个季度中一直增长,直到 2019 年第四季度达到 27 美元。
- 在过去的 12 个季度中,平台上每个付费用户的营销支出几乎保持不变——2-3 美元
图 6:每个季度内容现金支出和付费净会员增加;来源:Srinivas Vadrevu 基于网飞财务报表 2019Q4 的数据进行的分析
为了解释前面提到的 2019 年第一季度每用户内容支出的下降,让我们来看看每个季度总内容支出和净付费用户增加之间的关系。*2019 年第一季度,内容支出首次下降,付费新增用户创下近 12 个季度以来的新高。*这解释了为什么在过去的 12 个季度中,每个用户的内容支出处于历史最低点。
但是,到 2018 年第四季度,每个季度的内容支出都以大约 7%的速度持续增长。在 2019 年第一季度,他们减少了 15%到 5 亿美元的内容支出。在下一个季度,即 2019 年第二季度,付费净用户的数量从 960 万急剧下降到 270 万。看起来上个季度的内容支出可能会对下个季度(2019 年第二季度)的净付费用户增加产生影响。
我计算了上述指标,只是为了检查内容支出是否有任何重大变化,我们认为 2019 年第二季度出现了这种变化。我敢肯定,大多数跟踪网飞的股票分析师现在正忙于对其财务报表进行内容分析,为即将于 2020 年 4 月 21 日发布的收益公告做准备。然而,我更感兴趣的是探索网飞多年来做出的内容选择,而不是内容支出/财务指标。由于它所做的内容选择不仅让其截至 2016Q4 的 8900 万用户欣喜不已,还在未来三年内带来了 7800 万付费用户的增长(包括我!).
“当我们取悦我们的会员时,他们看得越多,我们就成长得越多”——网飞 2019Q1 致股东的信
那么,网飞增加了哪些内容来取悦用户呢?
我越是纠结于上述问题,就越想找到一种方法来回答这个问题。碰巧的是,我在网飞理工大学的博客上看到了一篇优秀的文章,阐述了网飞如何依靠预测数据模型来评估其跨语言的内容消费。我认为这是一个对电影和分析都有热情的人的好博客。鉴于对数据驱动的决策的如此强调,以找出内容及其创作生命周期,我推测这些决策应该作为模式出现在它添加到其平台的标题中。我决定在新冠肺炎封锁期间利用这段额外的时间学习一点 NLP(自然语言处理),并检查我是否可以应用任何基本的 NLP 技术来理解网飞对其内容所做的选择。由于网飞依靠消费者层面的数据来得出这些选择,我们或许可以在这个过程中发现一些客户偏好。
数据来源
为了探索这一点,我查看了两个数据源来对其内容策略进行三角分析—
(1):季度致股东信中的内容部分——每个季度,网飞都会发布一封致股东信,其中有一个内容部分。在这一部分中,网飞介绍了其内容选择、原因以及该季度的表现。
数据来源:网飞在其网站上给股东的信https://www . Netflix investor . com/financials/quarterly-earnings/default . aspx
(2)网飞在其平台上的实际标题列表。就网飞传达其内容战略而言,上述数据来源是自上而下的方法。使用网飞上的标题和它们的描述,实际的内容策略可以被破译。
数据来源:我使用了来自 kaggle.com的数据集,主要基于从 flixable.com网站收集的数据。Flixable 包含美国网飞上当前可用的所有电视节目和电影。
上述数据集没有将内容分类为网飞分类的三种类型的内容。在本文中,我们不会按自制标题、品牌和授权标题以及仅授权标题对内容选择进行分类。
在合并金融数据集和 Kaggle 数据集后,我发现 2018 年第二季度获得一个标题的内容花费最高—$ 860 万美元,而 2019 年第一季度获得一个标题的内容花费最低,为$ 560 万美元。
图 7:每个季度的总内容花费和每个标题的花费;来源:Srinivas Vadrevu 基于网飞财务报表 2019Q4 的数据进行的分析
在此之前,我开始处理来自两个数据集的文本,这是朱莉娅·西尔格和大卫·罗宾逊的“用 R 进行文本挖掘”的一大亮点。我发现这上面的内容对学习文本挖掘和绘制下面的图表非常有帮助。
网飞传达了哪些关于它的内容?
Miguel Henriques 在 Unsplash 上的照片
分析致股东信的内容部分(自上而下)
为了理解网飞在内容部分使用的关键主题,我从网飞发布给投资者的致股东信中收集了内容部分。我整理了最近 30 个季度(2012Q3 到 2019Q4)的数据。从这个数据集中,我从文本中提取了二元模型标记,在去除了停用词之后,从语料库中创建了二元模型的网络可视化。下图创建了一个二元模型的网络结构(两个单词的组合)。比如说,“la”+“casa”=“la casa”是一个二元模型,“case de”是另一个二元模型。两个二元模型在节点“casa”处连接,形成网络结构“la casa de”。
图 8:2012 年第三季度至 2019 年第四季度(30 个季度)致股东信中内容部分的常见二元模型;(二元模型计数> 4);资料来源:Srinivas Vadrevu 基于从网飞致股东的信中收集的数据进行的分析
我已经把上面的二元模型分成了几个大的主题类别。让我们来看看网飞传达给股东的关键主题:
- 原创内容(字:“原创”,红泡泡左边) - 在最近的三十个季度里,网飞几乎都在突出自己的原创内容。原创+电影、原创+故事片、原创+内容、原创+纪录片、原创+节目和原创+系列等等。
- 热门/热播系列(《黄色泡泡》)——绝命毒师、Bojack 骑士、漫威的超胆侠、Le Casa de Papel (金钱大劫案——英文版) Turbo F.a.s.t .、发展受阻、神圣游戏和铁杉树林
- **大众喜剧个人————【黄泡】——**演员:里奇·格威斯、编剧:杰姬·科恩
- 电视节目中的主要类型(节点词:“系列”,红色泡泡的右边部分)——电视剧、喜剧、儿童、动画、脚本系列、限量系列和电视系列。科幻流派
- 连续性- 网飞在推出后续剧集时都会提到这些剧集的名字——第二季、第三季和回归季
- 品种- 迎合品种繁多和口味多样;
- 地点聚焦--拉丁美洲和北美
- 优质- 奖项&节庆 **(绿色泡泡)——**传递优质内容。奥斯卡金像奖、金球奖、艾美奖提名、艾美奖奖和电影节等奖项经常被提及。
2014–2016 年至 2017–2019 年关键二元模型的变化
图 9:致股东信内容部分在三年时间窗内的常见二元模型——2017 Q1 至 2019Q4 和 2014Q1 至 2016Q4(计数> 4);资料来源:Srinivas Vadrevu 基于从网飞致股东的信中收集的数据进行的分析
当我在 2017 年至 2019 年和 2014 年至 2016 年的三年窗口中绘制常见二元模型时,除了上面提到的关键趋势外,内容重点还有一些变化。
- 与 2014 年至 2016 年相比,喜剧系列在 2017 年至 2019 年期间不再被频繁提及。
- 剧集和限量系列在 2017–2019 年被提及的频率更高
- 2014-2016 年第二季已经让位给 2017-2019 年回归的第三季。
- 当然,热门节目从 2014-2016 年到 2017-2019 年发生了变化
- 电视网络和互联网电视在 2017-2019 年没有被频繁提及
- 在过去的六年里,对原创内容的重视保持不变
那么,与之前的三年窗口(2014、2015、2016)相比,过去三年(2017、2018、2019)发生了什么变化?
近几年更强调剧情,限定剧集,延长季节,当然还有原创内容。较少强调喜剧系列、电视网络和网络电视
查尔斯·德鲁维奥在 Unsplash 上拍摄的照片
B.从《网飞》的实际内容解读内容策略
将他们所说的和他们所做的结合起来。
分析网飞上的所有标题及其描述(自下而上的方法)
Kaggle 数据集(上述数据描述中的第二个数据集)包含过去 12 年(从 2008 年到 2020 年 1 月 18 日)收集的标题信息。数据集中的字段如下:标题的名称、类型(电视节目或电影)、导演、演员、参与制作的国家、在网飞上添加的日期、原始发行年份、分级(美国电影协会或电视家长指南)、标题的持续时间、在类别中列出以及标题的简要描述。我使用标题的描述来提取它的关键内容选择,并列出 _in 类别来提取流派。
B.1 流派
根据添加的日期,我将季度添加到数据集,以研究每个季度添加了什么类型(电影/电视节目)、流派和主题。截至 2020 年 1 月,数据集显示网飞总共有大约 6234 本书。其中 68%(4265 个)是电影,其余的 1969 个标题被分类为电视节目
让我们快速浏览一下从 2016 年第一季度到 2020 年第一季度*(到 2020 年 1 月 18 日)每个季度添加的图书分类。虽然网飞每个季度都会增加越来越多的片名,但%的电影似乎遵循着一种循环模式。(参见下面的图 10)
- 平台上有电影的标题比例从 2017 年第一季度的 76%下降到 2017 年第三季度的 65%。
- 随后在 2018 年第一季度逐渐上升至 77%。然后,与 2018 年第一季度相比,2018 年 Q2 在该季度出版的图书总数下降了 48%(约 156 本)。电视节目的数量增加了 3 个标题,而电影标题减少了 159 个。这将百分比降至 70%
- 从 2018 年第三季度到 2019 年第四季度的下一季度,添加的电影片名的百分比持续下降,从 74%下降到 58%(最近 12 个季度最低)。
- 从 2019 年第四季度到 2020 年 1 月 18 日,电影片头%逐渐增加到 2019 年第四季度的 70%,2020 年第一季度截至 2020 年 1 月 18 日增加的片头的 80%。
图 10:根据电影和电视节目添加到网飞的季度,将标题分成电影和电视节目;资料来源:Srinivas Vadrevu 根据 Kaggle 的数据进行的分析
好了,这是关于标题的数量,让我们从数据中看一下热门类型
我们大多数人都偏爱几种类型。而有些人可能喜欢冒险、动作、犯罪、恐怖片等。其他人可能更喜欢爱情片、喜剧片或家庭电影。当我们浏览标题时,我们大多数人可能会根据流派来定位搜索。所以,我选择了流派作为一个重要的变量,来弄清楚网飞是如何添加电影和电视节目的。每本书通常分为 2-3 种类型。因此,我从数据集中的 listed_in 列中提取单词作为单词,去除停用词,以了解每年添加的标题下面列出了哪些热门流派。
2019 年新增的热门游戏类型
图 11:2019 年使用标题的 Listed_In 类别中的标记词提取的流派计数;资料来源:Srinivas Vadrevu 根据 Kaggle 提供的数据进行的分析
上图(图 6)描述了 2019 年按流派和类型(电影或电视节目)增加的标题数。电影和电视节目的五大流派完全相同
- 2019 年 Top 5 流派电影如下:国际、剧情、喜剧、动作、冒险。
- 2019 年电视节目的前 5 大类型如下:国际,戏剧,喜剧,犯罪,浪漫和儿童。
- 除了前三种类型,爱情片、纪录片和儿童片在电视和电影中也很常见。
- 与电视节目相比,电影中的顶级类型更加多样化。一些类型出现在电影的顶级类型中,但没有出现在电视节目的顶级类型列表中。惊悚、家庭、恐怖、奇幻、科幻、音乐剧和独立类型出现在电影的顶级类型列表中,但不包括电视节目。
- 犯罪、现实和动漫类型出现在电视节目的顶级类型列表中,但不在电影中。顶级电影类型列表中也没有基于语言的类型- 英国(英语)西班牙语和韩语。与电影相比,电视节目似乎更能迎合不同的口味和观众。
- 恐怖和奇幻成为 2019 年的热门主题,这些主题在 2018 年并不存在(见下图 7)
2018 年和 2017 年添加的热门类别
图 12:2018 年使用标题的 Listed_In 类别中的标记词提取的体裁统计;资料来源:Srinivas Vadrevu 根据 Kaggle 提供的数据进行的分析
图 13:2017 年使用标题的 Listed_In 类别中的标记词提取的流派计数;资料来源:Srinivas Vadrevu 根据 Kaggle 提供的数据进行的分析
2018 年和 2017 年展示了几乎相同的风格模式,除了一些变化-
- **电影:**纪录片和独立电影在 2017 年位居电影体裁前 5,但在 2018 年和 2019 年让位于动作和冒险。
- 电视变化:自然和科学是 2017 年的热门题材,但它们在 2018 年被真人秀、脱口秀、动漫和脱口秀取代
网飞电影的总体类型分布是怎样的?
图 14:使用数据集中所有标题的 Listed_In 类别中的标记词提取的流派的计数;资料来源:Srinivas Vadrevu 根据 Kaggle 提供的数据进行的分析
我能使用上面的数据(图 14)更好地从网飞的 6234 个书目中搜索吗?虽然网飞根据你的搜索选择在“流行精选”和“趋势精选”中为你筛选内容,你仍然可以使用上述数据更好地搜索流派组合。
这里有一个浏览流派组合的提示——一个关于网飞的标题通常分为 2-3 个流派。所以,下次当你在网飞上按流派组合浏览标题时,你可以从上面的列表中选择不太常用的流派,滚动到更常用的流派标签,从而缩小搜索范围。例如,如果您想观看恐怖惊悚电影,并且不想使用遥控器键入 15-16 个字符,请浏览恐怖行(您首先会在这些行中看到一组更窄的恐怖标题),然后在该行的标题标签中查找恐怖片…
B.2 分析故事主题
这里有类型,然后是吸引观众的故事。主题或情节主线是吸引观众参与内容的重要因素。与我分析给股东的信的方法类似,我从数据集中的描述列中提取了去除停用词后作为二元模型的令牌。这些二元模型代表了每年增加的标题的主题。让我从数据集中挑选一些电影和节目来说明这些描述在数据集中是如何表达的。
查尔斯·德鲁维奥在 Unsplash 上拍摄的照片
洛奇 :西尔维斯特·史泰龙因扮演洛奇·巴尔博亚而一举成名,洛奇是一名不知名的拳手,他曾作为宣传噱头向世界拳王阿波罗·奎迪开了一枪。
:这部引人入胜的续集以激动人心的高潮为特色,拳击手洛奇·巴尔博亚重返拳击台,与卫冕冠军阿波罗·奎迪进行复赛。
当一个小男孩失踪后,一个小镇揭开了一个神秘的故事,其中涉及秘密实验、可怕的超自然力量和一个奇怪的小女孩。
2020 年 1 月 18 日,网飞最热门的故事主题是什么?
使用上面的标题描述,我将所有的二元模型串在一起,并删除了停用词,以创建一个分别用于所有电影和电视节目标题的二元模型网络图。从网络图(图 15 和图 16)中,我大致确定了以下主题类别-
图 15 和图 16 的图例
将二元模型归入这些主题是我的判断。没有主题的名人是著名的明星或节目。我总共把二元模型分成了 8 类。请参见左侧的图例。
图 15:来自 4265 个电影标题的描述列的二元模型网络;资料来源:Srinivas Vadrevu 根据 Kaggle 的数据进行的分析
图 16:来自 1969 电视标题的描述栏的二元模型网络;资料来源:Srinivas Vadrevu 根据 Kaggle 的数据进行的分析
在上述主题类别中,有哪些顶级的双元模型?
纪录片/真实故事—
- 电影- 真实故事、纪录片、采访特辑、根据真人秀电视连续剧改编的电影
- 电视剧- 真实故事、真实故事、真实事件、真人秀系列、纪录片系列
- 影视剧通用— 真实故事
城市/地点—
- 电影- 纽约、洛杉矶、拉斯维加斯、旧金山、香港、墨西哥城、南非、北极和古代中国。偏远的岛屿,偏远的村庄,鬼屋,拖车公园,夏令营和寄宿学校。
- 电视节目- 纽约、洛杉矶和香港。没有提到具体的地点,如鬼屋等。
- 电影和电视节目的共同点- 纽约、洛杉矶和香港
职业—
- 电影- 警官、联邦调查局特工、绝密特工、首相、时装设计师、出租车司机、人力车司机、歌手兼作曲家、youtube 红人、法律学生、大学生、流行歌星、摇滚歌星、性工作者、毒枭、毒贩、讨债人和犯罪头目
- 电视节目- 警察、警官、联邦调查局特工、流行歌星、大学生和毒枭
- 电影和电视剧里常见的- 警察、毒枭、大学生和 FBI 特工
动作 —
- 电影- 权力斗争,路径交叉,力犯,返乡,联手,改变人生,家庭生活,挣钱,任务营救
- 电视节目- 交叉路径,交叉路径,合力和时间旅行
- 电影和电视剧的共同点- 交集和合力
个人事件—
- 电影- 三角恋,真爱平安夜,改变人生,一夜情,公路旅行,家庭生活,绝症,车祸,夏令营,包办婚姻。
- 电视剧- 私生活,真爱
- 影视剧常见的 - 真爱
主题/重大事件—
- 电影- 二战、外星人入侵、内战、恐怖阴谋、连环杀手、武术、功夫、摩登时代、恶灵、漫画、电子游戏、访谈、嘻哈、社交媒体、房地产、人工智能。
- 电视节目- 二战、嘻哈、黑暗秘密、童话、贩毒、武术、有组织犯罪、连环杀手、社交媒体、神秘死亡和现代
- 电影和电视剧都常见- 二战、嘻哈、社交媒体、武术、连环杀手
个人属性 -
- 电影- 十几岁的女孩,温文尔雅,无拘无束,非裔美国人,中年人,已婚夫妇,童年好友,疏远的父亲,单身母亲
- 电视节目- 单身妈妈,无拘无束,爱玩。
电影和电视剧中常见的- 单身母亲,自由奔放的
标题属性 —
- 电影- 获奖、快节奏、真人秀、喜剧特辑、动作片、特色访谈、档案镜头、剧情片、科幻片
- 电视剧- 艾美奖、艾美奖提名、获奖、喜剧类、动画类、真人版、黑色喜剧类、剧情类、剧集类
- 普通- 获奖、喜剧、剧情
流行名称—
- 电影- 洛奇·巴尔博亚,巨蟒剧团,凯文·哈特,比尔·伯尔,杰夫·敦哈姆
- 电视节目- 电动游侠
图 12 中的柱状图展示了所有上述按移动/电视节目分类并按频率降序排序的二元模型。主要主题如下:
真实故事、纪录片、二战、武术、纽约、洛杉机、警官、真爱是网飞电影和电视节目的常见主题
图 17 在网飞所有标题的描述中使用“ngrams”提取的二元模型的计数;资料来源:Srinivas Vadrevu 根据 Kaggle 提供的数据进行的分析
在附录中,您可以找到过去四年(2016 年至 2019 年)二元模型的同比频率图。上述主题或多或少地出现了,只是时间顺序略有不同。
所以,如果我要写一个以网飞为结尾的故事,我会用下面的提示和标题描述。我用电影和电视节目中常见的关键主题想到了下面的提示
这位获奖的电影制作人导演了一个真实的故事,讲述了纽约市一名警察是一名自由奔放的大学生的单身母亲的故事。她与一个毒枭不期而遇,并找到了真爱,导致了三人之间的错误喜剧
该提示包含了网飞标题描述中经常出现的所有关键主题。如果网飞上的内容很好地反映了用户的偏好,那么上述主题可能会吸引观众。然而,可以肯定的是,哪些主题推动了票房表现或用户参与度,这值得进一步探索。
结论
关于它的内容,网飞告诉了它的股东什么?
在过去的三十个季度中,网飞一直强调创造原创内容,并强调其热门系列(原创和授权,绝命毒师等)。)和顶级喜剧明星。他们提到了第二季、第三季和回归季等后续季的发布,这通常是观众接受和参与的标志。他们非常强调内容的多样性和迎合观众的不同口味。他们将拉丁美洲和北美的内容带到平台上,并传达给股东。当然,他们总是提到奖项(奥斯卡金像奖、金球奖、艾美奖),作为向订户和股东展示内容质量的信号。
过去三年,网飞在内容方面给了用户什么?
与电影相比,2019 年电视节目受到了更多关注。虽然每个季度添加的标题都在增加,但平台上包含电影的标题的百分比从 2017 年第一季度的 76%下降到 2017 年第三季度的 65%。
过去三年关注的类型:
- 在过去的三年里,网飞一直专注于国际(更广泛的观众群),戏剧,喜剧,浪漫,纪录片,武术,动作和冒险电影和电视节目。这与他们所说的基本一致。
- 与电视节目相比,电影似乎有更广泛的类型。一些在电影中更常见的类型,如惊悚片、家庭片、恐怖片、奇幻片、科幻片、音乐剧和独立片,在电视中并不常见。
- 有趣的是,犯罪、现实和动漫是电视剧中的热门类型,但在电影中却不是。顶级电影类型列表中也没有基于语言的类型——英国(英语)、西班牙语和韩语。
- 与电影相比,电视节目似乎更适合于吸引不同的口味和观众,因为它侧重于语言类型和国际内容(日本动漫)。
- 恐怖和幻想类型在 2019 年开始出现在顶级类型中。
网飞近三年新增内容主题:
(1)纪录片/真实故事——不少真实故事
(2)城市/地点— 电影和电视的常见地点—纽约、洛杉机和香港
(3)职业— 电视电影中常见的职业—警察、毒枭、大学生、FBI 特工
(4)动作- 电视剧和电影里的人物做的共同的事- 交集,合力。
(5)个人事件— 电视和电影中常见的个人生活事件*—真爱***
(6)话题/重大事件— 电视节目和电影常见 二战、嘻哈、社交媒体、武术
(7)个人属性--单亲妈妈,洒脱-**
(8)片名属性——获奖,喜剧
(9)流行/热门名字
- 电影- 洛奇·巴尔博亚,巨蟒剧团,凯文·哈特,比尔·伯尔,杰夫·敦哈姆
- 电视节目- 权力流浪者
根据图 12,电视节目和电影的常见主题是: 真实故事、纪录片、二战、武术、纽约市、洛杉机、警官、真爱是网飞电影和电视节目的常见主题/二元模型。
那么,这是否意味着“灯光,摄像机和行动”的任何提示与上述二元模型?在读者中的任何制片人准备资助这个项目之前,他们可能会问上面的提示是否会在票房上取得成功,或者是否有望获得巨大的订户参与?我会在另一篇文章中通过将票房收入与主题和类型联系起来来尝试回答这个问题。在这个时候,我们所知道的是网飞在体裁和故事主题方面的内容选择。
快乐阅读!如果你想进一步了解《致股东的信》或《头条新闻》主题中的年度重要内容,我在下面添加了一些图表。
附录:
图 18:2012 年第三季度至 2015 年第四季度致股东信内容部分使用“ngrams”提取的二元模型计数;Srinivas Vadrevu 的分析;数据:Kaggle 上的网飞电影和电视节目数据集。https://www.kaggle.com/shivamb/netflix-shows
图 19:2016 年第一季度至 2019 年第四季度致股东信内容部分使用“ngrams”提取的二元模型计数;资料来源:Srinivas Vadrevu 的分析;数据基于https://www.kaggle.com/shivamb/netflix-shows
图 20:在网飞电影标题的描述中使用“ngrams”提取的二元模型的计数;资料来源:Srinivas Vadrevu 根据 https://www.kaggle.com/shivamb/netflix-shows的数据分析
图 21:在网飞的电视节目标题描述中使用“ngrams”提取的二元模型的计数;资料来源:Srinivas Vadrevu 根据 https://www.kaggle.com/shivamb/netflix-shows的数据分析
免责声明 : 本文中表达的所有观点均为 Srinivas Vadrevu(以下简称“作者”)的观点,并不代表作者曾经、现在或将来隶属的任何实体的观点。以上所有观点都不是统计推断,而是作者基于模式的观点。本文作者对本文内容中的任何错误或遗漏不承担任何责任或义务。你不应该依靠这篇文章来作出任何商业、法律、投资或任何其他决定。虽然作者试图保持文章中的信息准确,但作者不对本文中包含的图形、图表和数据的完整性、准确性、可靠性、适用性或可用性做出任何形式的明示或暗示的陈述或保证。