为什么故事点对于软件工程师来说是一个可怕的度量
以及用什么来衡量绩效
照片由 Cookie 在 Unsplash 上的 Pom 拍摄
让我们面对现实吧,我们的行业痴迷于“越多越好”的理念——一心多用,长时间工作,忙碌,完成很多事情。
然而,随着我们拥抱一种新的工作方式,远程工作,分布式环境,我们,工程经理,需要放下过去不再有用的东西。这包括使用虚荣指标和老式的方法来衡量生产率。
因为越多并不总是越好,尤其是在衡量一个软件工程师的表现时。
不要:用完成的故事点来衡量软件工程师的表现
Josh Appel 在 Unsplash 上拍摄的照片
故事点的使用一直是一个巨大的争论话题。有人说它对敏捷软件开发团队有用,也有人说它对商业毫无用处。他们两个都是正确的。但是在我职业生涯的最后二十年里,作为一名软件开发人员和工程经理,我在许多软件开发团队中工作过,所以我有一个强烈的观点。故事点对于软件开发者的表现来说是一个糟糕的衡量标准。
为什么故事点不是一个好的绩效指标?
并非所有的故事点都是相同的
故事点是相对于给出评估的人或团队的知识的复杂性的度量。因此,一个团队的故事点 3 可能不等于另一个团队的故事点 3。因此,当你比较来自不同团队的多名工程师的交付时,故事点不是正确的衡量标准。
更大的故事点并不意味着更大的影响
在软件开发中,简单就是美。通常,大故事点是复杂代码路径的结果,奖励大故事点间接鼓励软件开发人员考虑复杂和过度设计他们的解决方案。对于一个工程师来说,了解他们工作效率的最好方法是看他们交付了什么样的成果,以及他们对客户产生了什么样的影响。而不是他们写了多少代码或者他们的代码有多复杂。
故事点给出了太多的灵活性,并鼓励更少的责任
故事点并没有告诉我们一个软件工程师有多负责和可靠。当然,他们可能从事最复杂(相对)的故事,但这并不意味着他们尽了最大努力,按时交付,并体现了正确的行为。关于故事点最糟糕的事情是,它使软件工程师避免承诺任何日期。我知道许多软件工程师通常不希望承诺一个截止日期,以防他们发现任何未知,但是不对什么时候完成某件事情设定预期,或者没有任何里程碑是完全不负责任的。
高级工程师可能编码时间更少
随着工程师职业生涯的进展,他们可能会发现实际的编码/开发工作越来越少,因为他们将做其他需要更多资历的事情,如计划、故事分解、指导、入职、代码审查等。如果他们为大型科技公司工作,这一点尤其正确,因为需要更多的协调和知识共享。从百分比来说,会接近或者超过 50%,这取决于公司的规模,项目的复杂程度,以及资历。
Do:根据他们所在级别的预期能力来衡量绩效
首先,让我澄清一下:一个工程师的表现永远不应该用工作的小时数或编写的代码行数来衡量。应该用产生的结果来衡量它们。
然而,这听起来有点抽象,所以让我进一步解释。
科技公司倾向于根据对工程师和软件开发人员的级别和角色的预期能力来衡量他们的表现。像 FAANG(脸书、亚马逊、苹果、网飞和谷歌)这样的大型科技公司已经记录了关于这种预期的信息,所以在某种程度上,这是非常客观的。
常见的能力(按初级->高级的期望顺序排列)有:
- 专门技能
- 规划工作技能(将一个大问题分解成可管理的任务)
- 评估技能
- 沟通技巧
- 利益相关者管理技能
- 影响技能
- 指导技能
初级开发人员不一定需要具备利益相关者管理技能和影响力技能,但随着他们在职业阶梯上的攀升,他们将需要展示更多来自底层的技能。
Do:获得软件工程师的定性反馈,例如:360 度反馈
Raymond T. 在 Unsplash 上的照片
作为一名软件工程师,在当今这个软件开发日益复杂的时代,仅仅埋头编码是不够的。能够与他人合作交付成果是软件开发人员角色的重要组成部分。因此,从与他们合作的人那里获得对软件工程师的 360 度反馈是很重要的,以了解他们作为团队的一部分在交付成果方面有多有效。在今天的工作环境中,聪明的混蛋没有立足之地。
衡量什么是重要的
查尔斯·德鲁维奥在 Unsplash 上拍摄的照片
简而言之,在考虑软件开发人员的表现时,有定性和定量的衡量标准。像 360 度反馈这样的定性指标和像发布功能的影响这样的定量指标经常被关注,但是看看其他虚荣的指标,比如代码行,完成的故事点应该被避开。
- 不要:用完成的故事点来衡量软件工程师的表现
- Do:根据他们所在级别的预期能力来衡量绩效
- Do:获得软件工程师的定性反馈,例如:360 度反馈
📩注册订阅作者的时事通讯,定期获得关于你科技职业的建议和资源。您还将立即收到一个链接和密码,为您的职业发展下载免费赠品。
首席技术官工具包——面向技术领导者的工具和资源
为什么记录你的成就会有助于你的职业生涯
你应该问自己的 5 个问题
照片来自马克-奥利维尔·乔多因在 Unsplash
如果说 2020 没有教会我什么,那就是它教会了我什么时候该后退一步,反思我职业生涯中发生的事情。今年年初,我打开了 OneNote,记录了每个项目、重大决策和结果。当我是这个项目的首席数据科学家和开发人员时,我尤其会这样做。这个笔记本让我每个月都有针对性的反思会议,以更好地了解我自己和我的位置。我也可以把这些笔记带到与我的经理的一对一谈话中,更好地讨论我的成就。在这些反思过程中,我问了自己几个问题。当你回顾自己的成就时,以下是我最想问的五个问题:
1.你喜欢什么?
2.你学到了什么?
3.还有什么比这更好的呢?
4.我收到了什么反馈?
5.你的成长机会是什么?
你喜欢什么?
当我记笔记并反思我所做的工作时,我喜欢问自己:我最喜欢那份工作的什么?我发现这是一个很有帮助的问题,因为它让我更深入地了解了我的工作中我喜欢做什么,不喜欢做什么。利用这些信息,我可以和我的老板讨论如何着手更符合我职业目标的项目。
当我开始我现在的职位时,我不确定我会在哪里结束,但我知道我喜欢在数据科学领域工作并与其他人合作。当我开始记录我的工作并反思我所做的项目时,那些与老板的对话帮助我塑造了现在的角色。我向我的老板表示,我喜欢在领导岗位上工作,并且有兴趣在这个领域承担更多的工作。强调这一点,我能够在加入几个月后进入团队领导的角色。
随着我在这个职位上的继续,我继续讨论什么进展顺利,什么不顺利,以及我的兴趣所在,他可以帮助指导我的职业生涯朝着正确的方向发展。
你学到了什么?
当我在看一个我已经完成的大项目时,我想记下我从这次经历中学到的东西。无论多小,突出工作中的任何收获都是必不可少的。由于数据科学还包含许多软技能,我经常发现自己在与同事的交流中记录了改进或了解了业务的一个新方面。即使这项成就现在对你来说可能看起来微不足道,你也会有一份详尽的清单用于你的年度回顾。
我领导的第一批大项目中,有一个项目让我与我的团队,一个国际团队,以及我们雇佣的承包商互动。该项目的最初目标是领导承包商开展工作,并在需要时提供帮助。不幸的是,直到为期两个月的项目工作的最后一周,他们才得以进入我们的工作区。当我评估情况时,我从这个项目中学到了一些有价值的经验。我学会了如何:
- 制定一个计划,当事情出错时能够重新评估和计划,
- 根据每个部分的能力将工作分配给不同的团队,
- 开发 CI/CD 管道,利用计算集群在 3 小时内运行大量工作负载,
- 以及如何确保在项目结束时达到重要的里程碑。
这个项目并不完美,如果我们早点让承包商进入,结果可能会更好。我从那项工作中学到的经验帮助我理解了如何成为一名更好的团队领导,以及如何与不同的个人合作来实现共同的目标。
无论规模有多大或有多小,总有一些教训可以从你的项目中吸取。记下这些教训供以后参考。即使是不按计划进行的项目也能教会你很多东西。需要克服最大挑战的项目是那些会让你在如何处理这种情况上与众不同的项目。这些课程将有助于你解释你作为一名数据科学家、开发人员和领导者的成长。
还有什么比这更好的呢?
现在,我已经检查了所学到的经验教训,这是一个很好的时间来看看什么可以做得更好。认识到你哪里犯了错误或表现不好,可以告诉你以后需要改进的地方。在我与任何人交谈之前,我首先反思我自己的工作。
回想一下我之前解释的那个项目,第一件可以做得更好的事情是确保我们可以快速进入承包商的工作区。由于这个问题,其他人需要离开他们的工作,项目被推迟,以重新安排本应由承包商完成的工作的优先级。然而不幸的是,我们环境的访问问题不是我能控制的。
我能控制的一件事是他们如何实施工作。承包商写了很大一部分工作是用纯 SQL 写的,但是团队主要使用 Python。这个设计决策是基于这样一个事实,即承包商主要使用 SQL。还有什么比这更好的呢?我本可以向承包商表达这一事实,并要求将代码翻译成 Python,但当时,我没有想到这一点。
记下这些情况可以让你重新评估你是如何处理问题的,以及你可以在哪里改变你的方法。
我收到了什么反馈?
另一种确定需要改进的地方的方法是提问。我经常向我的亲密同事、老板或曾协助过某个项目的导师询问他们对工作具体方面的反馈。我这样做是因为他们可能看到了不同的事情,我认为没问题,但从他们的角度来看,他们可以做得不同。
另一个要求反馈的好理由是了解更多。通常,我收到的反馈不是关于我的领导决策,而是基于我的准则。这个反馈让我思考我的设计决策,了解哪些方面可以改进,并了解用于获得相同结果的不同技术。
获得反馈是一次很好的学习经历,尤其是在数据科学领域。讨论你的同事的技术并获得他们的意见可以给你新的想法来继续你的分析或调整它。但请记住,反馈不需要被视为 100%的事实。有时反馈是建设性的和有用的。其他时候,反馈只是一个建议。理解必须实施的反馈和属于建议类别的反馈之间的区别。你收到的反馈越多,就越容易看出区别。
例如,当我的团队进行代码审查时,我们在拉请求中留下注释。注释说明了要批准拉取请求需要进行哪些更改。如果评论是一个不需要执行的建议,但是你可能想要考虑它,我们声明。
“这是一个建议…”
“你可以考虑……”
“只是一个想法,但是,你试过…?”
你的成长机会在哪里?
现在我反思了我的工作,我知道:
- 我喜欢的,
- 我学到的是,
- 还有什么比这更好的,
- 还有,我收到了什么反馈。
考虑到所有这些信息,最后一步是了解我的成长领域。正如我前面提到的,记录你的成就可以帮助你的职业生涯。现在你对下一步有了一个好的起点。从这份详尽的笔记列表中,你可以确定是否有一系列你想提高的技能,提高这些技能的最佳方法,以及如何利用这些技能前进。
继续之前的同一个项目例子,我记下了我想要提高的有价值的领导技能。通过这项工作,我意识到了与不同团队有效合作的重要性。这些技能在那个项目中发挥了很好的作用,我看到了它们如何应用到更广泛的团队中。
我们有一个数据工程团队,我们知道这个团队,但当时并没有与之密切互动。每当我们遇到数据问题时,我们要么制定一个变通办法,要么在有人通过小道消息得知后等待解决方案的出现。相反,我们需要团队之间强有力的合作来有效地解决我们的数据质量问题。
我没有忽视这个问题,而是将我在那个项目中开始学习的技能应用到了实践中。到年底,我已经让两个团队紧密合作,一起解决问题。如果我没有评估我以前的项目并继续提高我在这方面的技能,这是一个重要的增长领域,我可能会错过。
最后的想法
无论项目是大是小,从你所做的工作中总有东西可以学习。利用这些项目来反思你所做的事情,确定你可以改进的地方,并推动自己成长。与你的经理、导师和同事一起工作,你可以进一步了解如何在不同的情况下运用你的技能。记住,你的技能不仅仅是技术,还有软技能!
同样,在评估我的工作时,我的五个问题是:
- 你喜欢什么?
- 你学到了什么?
- 还有什么比这更好的呢?
- 我收到了什么反馈?
- 你的成长机会是什么?
在评估自己的工作时,你通常会问自己什么问题?
如果你想阅读更多,看看我下面的其他文章吧!
为什么数据测试不能防止数据管道损坏
数据是一个动态的、通常是非结构化的实体,当涉及到确保数据质量时,仅仅测试并不能拯救您的管道。
2021 年,仅靠数据测试不足以确保数据准确可靠。正如软件工程团队利用 New Relic、DataDog 和 AppDynamics 等解决方案来监控其应用程序的健康状况一样,现代数据团队也需要类似的监控和可观察性方法。以下是如何利用测试和监控来 防止数据管道 损坏,并实现高数据可靠性。
对大多数公司来说,数据是新的软件。
像软件一样,数据是企业成功的基础。它需要“永不停机”,数据停机时间https://www.montecarlodata.com/the-rise-of-data-downtime/要像应用程序停机时间五个九一样认真对待,有人吗?).就像您的软件一样,遵守您团队的数据 SLA 对于保持您公司的竞争优势至关重要。
虽然许多团队会使用他们应用于测试软件的准确性和可靠性的相同的可靠方法来测试他们的数据是有道理的,但是我们的行业正处于一个转折点:仅仅进行数据测试是不够的。
在运行分析之前,依靠数据测试来发现数据管道中的问题,相当于在部署新软件之前,相信单元和集成测试能够识别有问题的代码,但这在现代数据环境中是不够的。同样,如果没有跨整个代码库的应用程序监控和可观察性,就不可能有真正可靠的软件,如果没有跨整个数据基础设施的数据监控和可观察性,就不可能实现完全的数据可靠性。
最好的数据团队不是完全依赖测试,而是利用双重方法,将数据测试与整个管道的持续 监控和可观察性 相结合。
让我们仔细看看这意味着什么,以及如何开始对您自己的堆栈应用数据监控。
什么是数据测试?
数据测试是在管道的不同阶段验证您对数据的假设的过程。基本的数据测试方法包括使用固定数据的模式测试或定制数据测试,这有助于确保 ETL 顺利运行,确认您的代码在一小组众所周知的场景中正常工作,并防止代码更改时出现倒退。
数据测试通过对空值、唯一性、引用完整性和其他常见的数据问题指示器进行静态测试来提供帮助。这些工具允许您设置手动阈值,并对您关于数据的基本假设的知识进行编码,这些知识应该在管道的每次运行中保持不变。
事实上,数据测试对于特定的、众所周知的问题是一个很好的解决方案,当新数据或新代码打破了您最初的假设时,它会向您发出警告。您甚至可以使用测试来确定您的数据是否满足有效性标准,例如保持在预期范围内或具有唯一值。这在精神上非常类似于软件工程师使用测试来警告他们预期可能发生的众所周知的问题的方式。
但是,就像单元测试本身不足以保证软件的可靠性一样,数据测试本身也不能防止数据管道的损坏。
以下是 3 个理由为什么需要结合测试和监控的混合方法来为现代数据堆栈铺平道路。
数据变化很大
在软件工程中,我们大量使用测试来发现代码中的预期问题。然而,每个软件工程师都知道,如果她希望交付一个高度可靠的应用程序,这是不够的。生产环境的可变性比任何工程师在开发过程中预期的都要多。
无论是业务逻辑中的边缘情况,软件组件之间难以预测的交互,还是系统的意外输入,软件问题都不可避免地会发生。因此,一个稳健的可靠性策略将把测试作为健全性检查与监控和可观察性结合起来,以验证实际生产环境中的正确性和性能。
数据也不例外。虽然测试可以检测和预防许多问题,但是数据工程师不可能预测开发过程中的所有可能性,即使她能够预测,也需要大量的时间和精力。
在某些方面,数据甚至比传统软件更难测试。即使是中等规模的数据集,其可变性和复杂性也是巨大的。让事情变得更复杂的是,数据还经常来自“外部”来源,这些来源注定会在没有通知的情况下发生变化。考虑到规模和合规性限制,一些数据团队甚至很难找到一个可以轻松用于开发和测试目的的代表性数据集。
监控和可观察性填补了这些空白,为这些不可避免的(也可能是有问题的)管道变更提供了额外的可见性。
端到端覆盖至关重要
对于许多数据团队来说,创建一个健壮的、高覆盖率的测试套件是极其费力的,并且在许多情况下可能是不可能的或者不可取的——尤其是如果已经存在几个未覆盖的管道的话。虽然数据测试可以用于较小的管道,但它不能很好地扩展到现代数据堆栈。
大多数现代数据环境都极其复杂,数据从几十个来源流入数据仓库或数据湖,然后传播到 BI/ML 供最终用户使用,或者传播到其他运营数据库以供使用。在从源到消费的过程中,数据将经历大量的转换,有时要转换数百次。
现实情况是,数据在其生命周期的任何阶段都可能中断,无论是由于源位置的更改或问题、对管道中某个步骤的调整,还是多个管道之间的复杂交互。为了保证高数据可靠性,我们必须能够端到端地了解管道中的破损情况。至少,当数据在系统中传播时,我们必须有足够的可观察性,以便能够对问题进行故障诊断和调试。
考虑到以下几个原因,数据测试变得非常有限,包括:
- 您的管道可能会利用几个 ETL 引擎和代码框架,这使得在您的组织中保持一致的测试策略非常具有挑战性。
- 转换和测试之间的强耦合给系统带来了不可靠性——任何对 ETL 的有意变更(或者,在某些情况下,意外的失败)都将导致测试无法运行和遗漏问题。
- 流水线阶段的复杂性和绝对数量使得达到良好的测试覆盖率变得非常困难。
这仅仅触及了数据测试在确保完全数据可靠性方面的局限性。
数据测试债务
虽然我们都渴望有很大的测试覆盖率,但是数据团队会发现他们的部分管道没有被覆盖。对于许多数据团队来说,根本不存在覆盖率,因为在管道开发的早期,可靠性常常让位于速度。
在这一点上,回过头来为现有管道添加测试覆盖可能是一项巨大的投资。如果关于现有管道的关键知识掌握在您的数据团队中的几个精选的(通常是非常早期的)成员手中,追溯性地解决您的测试债务将会,在最好的情况下,转移资源和精力,否则这些资源和精力可能会花费在为您的团队移动针头的项目上。在最糟糕的情况下,如果你团队中的许多早期成员已经不在公司了,并且文档不是最新的,那么解决测试债务几乎是不可能的。
可靠的监控和可观察性方法可以帮助减轻数据测试债务带来的一些挑战。通过使用基于 ML 的方法,从过去的数据中学习并监控新的输入数据,团队能够在很少或没有投资和民俗知识的情况下创建对现有管道的可见性,并减少数据工程师和分析师的负担,以减轻测试债务的增加。
下一步:数据监控和可观察性
2021 年,数据工程师正处于一个关键时刻,要么跟上我们不断增长、不断发展的数据需求,要么满足于不可靠的数据。对大多数人来说,没有选择。
就像软件一样,数据需要测试和监控,以确保一致的可靠性。现代数据团队必须将数据视为一个动态的、不断变化的实体,并采用不同的方法,不仅关注严格的测试,还关注持续的 监控和可观察性 。
通过像对待软件可靠性一样对待数据可靠性,数据团队可以确保他们的数据在任何时候都处于健康状态,并跨越数据健康的几个关键支柱,包括卷、模式、新鲜度、沿袭和分发,以免影响您的业务。
有兴趣了解更多关于数据监控和可观察性的知识吗?伸出手去 巴尔摩西利奥加维什 ,还有 蒙特卡洛团队 。
本文由 Lior Gavish 合著。
为什么机器学习的未来很小
IOT 机器学习
微型智能机器有很大的可能性
TinyML 是一项新兴的人工智能技术,前景广阔——其多功能性、成本效益和微小的外形使其成为一系列应用的令人信服的选择。
在亚洲部分地区,财产损失、农作物遭劫、伤害、死亡和报复性杀戮正在上升。
*为什么?*由于人类和大象之间的冲突不断升级——人象冲突(HEC)——在人口密集的地区。
据 WILDLABS 统计,仅在印度,每年就有 400 人和 100 头大象因 HEC 而丧生。
降低 HEC 的一个方法是为居住在大象栖息地附近的社区建立早期预警系统。但这并不容易——这些栖息地通常很难进入,无线连接有限,而且没有电。
然而,一种新兴的人工智能 (AI)技术正在帮助寻找解决方案——tiny ml。
tinyML 是什么?
TinyML,或微型机器学习 ,通过将微型机器部署到需要它们的区域来工作。
TinyML 的特点是:
- 小型且便宜的机器(微控制器)
- 超低功耗消耗
- 小内存容量
- 低延迟(几乎即时)分析
- 嵌入式机器学习算法
让我们更仔细地考虑一下。
tinyML 中使用的微型机器是微控制器——为特定任务设计的紧凑集成电路——由于嵌入式机器学习而智能工作*。它们在非常低的功率下运行,提供即时结果,并且便宜。事实证明,它们在诸如 HEC 早期预警系统等一系列应用中具有不可估量的价值。*
微控制器本身并不新鲜——今天估计有 2500 亿个微控制器在使用中(T1)——它们是 T2 物联网(T3)不断增长的足迹不可或缺的一部分。
但是 tinyML 中使用的微控制器非常小,有时大约为几毫米,并且消耗超低功率,大约为几毫瓦。它们的内存容量也非常小,通常不到几百千字节。
使 tinyML 微控制器“智能”的机器学习和深度学习算法通常被称为嵌入式机器学习或嵌入式深度学习系统。这是因为运行算法的微控制器被认为是嵌入到它们所属的专用系统中的。
由于 tinyML 系统中的大多数分析都是直接在微控制器上进行的,即现场或边缘,结果是即时。这在低延迟很重要的情况下——例如在快速移动的预警系统中——以及访问云服务器的潜在延迟是个问题的情况下非常有用。
tinyML 的挑战
在一个机器学习算法变得越来越大、资源越来越密集的世界,tinyML 如何融入其中?
将事情放在背景中,考虑近年来机器学习模型呈指数增长——在截至 2020 年的三年内,从不到 1 亿百万个参数到 1750 亿个参数!
更重要的是,他们使用的能源比以往任何时候都多——根据一项估计,BERT (一种最近开发的自然语言处理模型)的单次训练的碳足迹足以在纽约和旧金山之间往返飞行。
训练和部署现代机器学习算法显然需要大量资源。因此,大多数现代机器学习算法部署在相对强大的设备上,并且通常可以访问云,在那里进行大量资源密集型计算。
但是更大并不总是更好,tinyML 在较小的一端扮演着重要的角色。
tinyML 如何工作
为了在 tinyML 强加的显著资源约束内工作,嵌入式 tinyML 算法采用以下策略:
- 只部署了预训练模型的推断(其资源密集度较低),而不是模型训练(其资源密集度较高)——注意,随着技术的发展,未来的努力将尝试将一定程度的训练整合到 tinyML 系统中
- 通过移除一些突触(连接)和神经元(节点),tinyML 模型下的神经网络被修剪
- 量化用于减少存储数值所需的内存,例如通过将浮点数(每个 4 字节)转换为 8 位整数(每个 1 字节)
- 知识提炼用于帮助识别和保留模型中最重要的特征
这些策略中的一些会导致降低模型精度。
例如,修剪和量化神经网络会降低网络捕获关系和推断结果的粒度。因此,在 tinyML 中,模型大小和准确性之间有一个必要的权衡,实现这些策略的方式是 tinyML 系统设计的一个重要部分。
小方法收获大收益
尽管受到限制,tinyML 仍在帮助寻找传统人工智能技术不起作用的情况下的解决方案。
例如,在前面描述的 HEC 环境中,tinyML 成本低、功耗低(单个纽扣电池可以为微控制器供电多年)且数据传输要求低,因此是理想的选择。嵌入式 ML 为每个微控制器提供足够的智能来识别现场的大象威胁,而无需频繁地向云服务器传输数据来做出决策。这相当于节省了大量电能,并大大降低了对带宽和连接性的依赖。
更一般地说,tinyML 的关键特性——低成本、延迟、功耗和数据传输要求——扩展到各种用例,在这些用例中,考虑到现实世界的实际限制,这些特性非常重要。
tinyML 的应用
让我们看看 tinyML 发挥巨大作用的其他几个例子:
1.工业预测维护
现代工业系统需要持续监控,但在许多情况下,这对于传统系统来说并不容易。
例如,考虑位于远处的风力涡轮机。这些很难访问,并且连接性有限。
TinyML 可以通过部署具有低带宽和连接需求的智能微控制器来提供帮助。这正是澳大利亚一家名为 Ping 的初创公司在其风力涡轮机监控服务中引入的内容。
Ping 的 tinyML 微控制器(物联网框架的一部分)使用嵌入式算法持续自主地监控涡轮机性能。只有在必要时,才会访问云以获取汇总数据。
这提高了 Ping 在潜在问题变得严重之前提醒涡轮机操作员的能力。
2.农业
在非洲,木薯是每年数亿人的重要食物来源。然而,它不断受到各种疾病的侵袭。
为了帮助解决这一问题,宾夕法尼亚州立大学运营的开源项目 PlantVillage 开发了一款名为 Nuru 的人工智能驱动应用,可以在没有互联网接入的手机上工作——这是偏远非洲农民的一个重要考虑因素。
Nuru 应用程序通过分析田间的感官数据,成功减轻了对卡萨瓦作物的威胁。
作为 Nuru 开发的下一步,PlantVillage 计划更广泛地使用 tinyML,在远程农场部署微控制器传感器,以提供更好的跟踪数据进行分析。
TinyML 还在农产品的生产链中找到了新的用途,比如咖啡豆。例如,两家挪威公司 Roest 和 Soundsensing 开发了一种在咖啡豆烘焙过程中自动识别“第一裂纹” 的方法。
识别第一个裂纹是至关重要的——在第一个裂纹出现后的烘烤时间对加工过的咖啡豆的质量和味道有很大的影响。这些公司在他们的咖啡豆烘焙机中加入了一个 tinyML 驱动的微控制器来完成这项工作,这提高了咖啡烘焙过程的效率、准确性和可扩展性。
3.卫生保健
开源硬件合作组织 Hackaday 一直在利用其太阳能驱蚊系统对抗蚊子传播的疾病,如疟疾、登革热和寨卡病毒。
该系统的工作原理是搅动水箱和沼泽中的死水,剥夺蚊子幼虫生长的机会(幼虫需要死水才能存活)。
使用小型机器人平台搅动水,这些平台仅在必要时运行(节能),使用雨水和声学传感数据分析。使用低功耗和低带宽协议发送汇总统计数据和警报(警告蚊子大量繁殖事件)。
4.保护
除了前面描述的 HEC 示例之外,tinyML 在保护工作中的一些其他应用包括:
- 加泰罗尼亚理工大学的研究人员一直在使用 tinyML 来帮助减少印度西里古里-贾拉拉巴德铁路线上与大象的致命碰撞。在过去的 10 年里,已经发生了 200 多起这样的碰撞。研究人员设计了一个太阳能声学和热传感器系统,带有嵌入式机器学习,作为早期预警系统。
- TinyML 正被用于西雅图和温哥华附近的水域,以帮助减少繁忙航道上的鲸鱼袭击风险。嵌入机器学习的传感器阵列执行连续实时监控*,并在鲸鱼靠近时向船只发出警告。*
tinyML 的未来是光明的
TinyML 为已经建立的边缘计算(现场计算)和物联网系统带来了增强的功能。
重要的是,它以低成本、低延迟、低功耗和最低连接要求的方式实现了这一点*——这使得 tinyML 系统易于在各种应用中部署。*
这就是为什么有些人将 tinyML 的扩展称为走向“*无处不在的边缘计算”*的一步。
因此,当传统的机器学习继续向更复杂和资源密集型系统发展时,tinyML 将满足光谱另一端更小的日益增长的需求。
随着物联网的不断发展,微控制器设备的数量已经达到数千亿,tinyML 将扮演一个重要的角色。
这就是为什么哈佛副教授 Vijay Janapa Reddi,tinyML 的领先研究员和实践者,将机器学习的未来描述为“微小而明亮”。
Reddi 相信 tinyML 将在未来的几年里深入到日常生活中,因此,对于任何想了解它并参与其中的人来说,这是一个真正的机会。
同样热心的还有皮特·沃登,谷歌研究工程师和 TensorFlow Lite 的技术负责人,tensor flow Lite 是一个实现 tinyML 模型的软件框架。
Warden 认为 tinyML 将在未来影响几乎每个行业,零售、医疗保健、农业、健身和制造业等等。
概括起来
- TinyML 是机器学习的一个新兴领域,其特点是 低成本、延迟、功率、内存和连接要求,并且正在为一系列应用增加价值
- 鉴于其资源限制和现场部署,tinyML 系统通常用于预训练机器学习模型的推理
- 机器学习算法被嵌入到 tinyML 系统中,它们通过常规算法的修剪、量化和知识提炼来适应资源约束
- TinyML 的应用范围从工业预测性维护、农业、医疗保健和保护到未来更多潜在的应用
- tinyML 的未来似乎光明,tinyML 系统的多功能性和成本效益表明机器学习的最大足迹可能是在未来几年通过 tiny ml
原载:https://highdemandskills.com/blog/
https://highdemandskills.com/blog/
为什么 CLI 对数据科学家至关重要
创建更高效的机器学习工作流的 CLI 示例和使用案例
图片来自 Unsplash
当我第一次学习数据科学时,我并没有特别强调理解诸如 Unix/Linux 和 Bash 之类的术语。对于一个没有计算机科学背景的人来说,这似乎很陌生,很难理解,但我很快意识到命令行界面(CLI) 在管理您的数据科学工作负载中是多么重要。要成为一名强大的数据科学家/MLE 或仅仅使用一般的软件,您需要能够在您的机器上轻松地导航和使用 CLI。除了舒适的 Jupyter 笔记本设置之外,数据科学中还有很多使用 CLI 的用例。例如,当运行计算机视觉工作负载时,人们经常使用名为 argparse 的 Python CLI 接口库向 ML 脚本传递参数。如果您正在迁移到 AWS、Azure 或其他 ML 云提供商,则需要 CLI 来适当地供应和移动您的资源。甚至在我们熟悉的 Jupyter 笔记本的数据科学狩猎场中,也有可能编写包含 Bash 脚本的单元格,我们将深入研究这些脚本。在这篇文章中,我将从整体上介绍如何开始使用 CLI、Bash 的常见用例/技巧以及数据科学和编程。
**注意:**我用的是 Mac,所以我所有的命令都是基于 Unix/Linux 的,对于 Windows 机器上的命令,我还附上了一些额外的资源,你可以跟着看。
目录
- 基本 Bash 命令
- 编写您的第一个 Bash 脚本
- Jupyter 笔记本中的 Shell 脚本
- Argparse
- 结论
1.基本 Bash 命令
在我们开始创建实际的 Bash/shell 脚本之前,我们将介绍一些日常使用的更基本的命令。
印刷工作目录
你几乎要把你的机器当成一个目的地。CLI 是您导航目的地的地图,您向它发出命令/指示,告诉它您想去哪里。 pwd 命令 有助于告诉您当前在地图上的位置,或者您是否想知道您在机器中的位置。
作者截图
如你所见,我们得到了当前的位置。
创建目录
作为一名开发人员,文件夹和目录这个词在你的字典中应该是同义词。设置项目时,您可能需要创建各种目录来管理数据或将文件移动到适当的位置。要通过 CLI 创建目录,我们使用 mkdir 命令 。
创建名为 MediumExample 的目录
执行这个命令后,我现在可以在桌面上看到一个目录。
作者截图
光盘(更改目录)
现在您已经创建了一个目录,您可能希望在该目录中工作,以便能够完成项目所需的工作。要更改目录,我们使用 cd 命令 ,它现在会将你的机器指向你想要的目录。
作者截图
如您所知,我现在位于我们创建的 MediumExample 目录中。
触控
现在假设我们在我们的工作目录中,我们想要创建一个 python 文件,我们可以开始工作了。 触摸命令 允许我们创建所需类型的新文件。如果我们运行 touch test.py ,那么我们会在我们的目录中看到一个 python 文件。
作者截图
ls(列表文件)
如果我们想要一个我们正在处理的所有文件或目录的列表,使用 ls 命令 可以让你看到目录的内容。如果我们在我们创建的目录中运行 ls,我们将看到我们刚刚创建的 python 文件。
作者截图
这些只是帮助您开始使用 CLI 的一些基本命令。如需更多导航 CLI 的基本命令,请点击此链接。
2.编写您的第一个 Bash 脚本
既然我们已经介绍了一些基本的 shell 命令,那么通常可以将其中的几个命令结合在一起,在 CLI 中编排更复杂的操作来管理您的工作流。一个 Bash 脚本允许我们创建一个文件,该文件将执行您试图构建的命令和逻辑。Bash 有自己的语法,我们不会深入研究,但是如果你想快速入门,点击下面的链接。Bash 脚本由。我们将使用触摸命令创建一个 example.sh 文件,在我们到目前为止一直使用的目录中创建这个文件。每个 bash 文件都以下面一行开始。
在所有 bash 脚本中
现在,我们可以添加我们想要的任何命令,并根据工作流的需要操作我们的文件。我们可以首先添加一个命令来创建一个新的子目录,并向我们的终端返回一条消息“Hello World”。
创建目录并返回“Hello World”
Echo 是一个命令,本质上相当于 Python 中的 print 语句。现在要运行 bash 脚本,运行 bash example.sh ,example 是您为文件命名的任何内容。如果您在之后运行 ls 命令,您应该会看到一条“Hello World”消息和一个创建的子目录。
作者截图
这个例子很简单,但是在将来,bash 脚本经常被用来与各种服务/工具(如 Docker 或云提供商,如 AWS)协调工作流,以便能够与您的本地机器和资源进行交互/对话。
3.Jupyter 笔记本中的 Shell 脚本
对于所有的 Jupyter Notebook stans 来说,也有一个很好的特性,可以创建 Bash 单元来执行。
在朱庇特笔记本里狂欢
通过在单元顶部添加 %%sh ,您已经将该单元变成了一个可以执行传统 bash 脚本的代码块。如果您不在 Jupyter 实验室类型的环境中,无法启动终端来处理您的资源,那么使用这个特性非常方便。
作者截图
4.Argparse
在 ML、Cloud 和一般编程中,你会看到一个常见的 Python 库是 Argparse。Argparse 允许你在命令行 中传递参数给你的脚本。当你为云中的服务提供 ML 脚本时,你会看到它在计算机视觉项目以及 AWS 中被频繁使用。为了理解 argparse,我们可以制作一个简单的计算器应用程序**,我们可以从 CLI 使用它。**
导入解析器
首先,我们导入 argparse 并创建一个解析器。下一步是添加我们可以从 CLI 传入的参数。
计算器的参数:Num1,Num2,Operation
现在我们已经添加了数字参数和一个操作符,我们需要能够处理这些操作符并应用必要的逻辑来创建一个基本的计算器应用程序。
传递的解析参数
现在参数已经被解析并传递到我们创建的基本计算器逻辑中。要查看 argparse 提供的计算器的运行情况,我们可以进入 CLI。
作者截图
我们将该结构中的 python filename.py args 以及我们创建的任何参数传递给我们的 CLI,并看到我们的应用程序正在工作。Argparse 非常容易使用,并且有很棒的文档,可以帮助你创建非常强大的应用程序,并通过 CLI 将项目中的各种服务缝合在一起。
结论
我希望这篇文章能够很好地介绍如何使用 CLI。在学习数据科学的过程中,非 CS 或技术背景的人常常会跳过掌握 CLI 等步骤。我不能强调 CLI 在管理您的资源以及与其他服务和提供商进行交互时是多么重要,因为您只需从 Jupyter 笔记本电脑升级您的应用程序。
请随时在 LinkedIn 上与我联系,或者在 Medium 上关注我。分享任何想法或反馈,谢谢阅读!
为什么美国食品和药物管理局监管医疗人工智能产品对每个人都有好处
医疗人工智能技术可能会随着明确的审批流程而飙升
尽管 FDA 没有维护已批准人工智能产品的公共数据库,但两项研究已经确定了在 160 和 225 之间已批准的产品。
在 STAT 发现 FDA 批准的 161 种产品中,只有 73 种在公开文件中披露了用于验证的患者数据的数量 ,其中:
- 观察到的患者从 0 到 15,000 不等
- 只有 7 种产品提供其数据集的种族构成
- 只有 13 个产品提供其数据集的性别构成
数据标准的不一致破坏了对医疗人工智能产品的信任,并危及其未来的增长。一些公司声称与 FDA 有关于使用多样化数据集的通信,例如人工智能乳腺成像检测提供商 iCAD。但是这些很少被写进他们的 FDA 文件。
这种方法不同于 FDA 对新药的长期严格审查。为什么这很重要?将新的救命人工智能产品推向市场至关重要。统一这么做保护了患者,获得了对这些新工具的信任,为更安全、更广泛地使用人工智能打开了市场。
FDA 为产品提供一致、清晰的审批流程有哪些主要好处?
新产品
在我从事医学人工智能的工作中,我看到了研究人员竭尽全力创建一流的模型。然而,不明确的监管框架限制了应用深度学习解决医疗问题的数量,更少的人将这些技术商业化。
我们看到深度学习的使用正在爆炸。模型可以拯救生命,提高可及性,降低成本,改善病人护理。一条清晰的市场路径鼓励医疗人工智能的创新。
更好的型号
医学文献中充满了不同的数据集如何产生更好的模型的例子。机器学习之前的经典医疗方法就是如此,AI 有潜力改善或减少医疗偏差。
我已经写了关于多样化的数据集如何能够提高跨种族、收入和教育水平的预测。在其他人口统计中也是如此——例如,最近的一项斯坦福研究显示,基于图像的人工智能模型的数据主要来自加利福尼亚州、马萨诸塞州和纽约州。这些州的患者并不能代表美国的所有人。确保工程师在各地培训模型将创造出适用于每一位患者的模型。
基于顶级研究人员输入的一组最佳实践也会改进模型。例如,如果工程师在测试前的模型创建的任何步骤中使用测试数据,模型就不太可能超出其初始数据集。
一套清晰的指导方针将确保所有进入市场的人工智能产品产生的模型不仅仅是纸上谈兵——它们实际上是可行的。
广泛使用
如果没有监管提供一个框架来建立对有效性和安全性的信任,医疗人工智能产品的使用就会受到限制。
欧文·比尔德在 Unsplash 上的照片
上次生病为什么要吃抗生素?或者你的医生开的最后一张处方?
监管机构的目标是确保产品安全有效。这样做意味着更多的人会对人工智能感到舒适,无论是癌症检测算法还是医生的手术助理。
性能监控
目前,没有标准来监控人工智能产品的批准后。对于非人工智能医疗器械,存在上市后安全性监测。FDA 不能对人工智能产品使用同样的标准,人工智能产品适应得更快。但是,需要有一个标准。
这将有助于回答以下问题:
- 如果你的人工智能产品在现实世界的设置中无效怎么办?
- 当你继续更新和训练它时,你的模型仍然有效吗?
- 在什么情况下需要重新申请批准(例如,如果您的产品从为放射科医生突出显示 X 射线切换到识别条件会怎样)?
明确地说,深度学习模型比许多药物和传统技术适应和发展得更快。但是我们需要了解批准后的变更过程是什么样的。我们需要创建一个流程来监控性能和安全性。
患者隐私
许多医疗提供商在不通知患者的情况下,使用人工智能系统来辅助决策。一个常见的理由是,他们使用这些工具进行操作,而不是进行研究。然而,在传统环境中,未经证实的药物需要患者同意才能参与经批准的受监控的研究。
现在,运营和研究的定义是主观的。对收集患者数据的担忧似乎也在增加,像阿森松岛涉嫌向谷歌出售可识别的患者数据。围绕什么定义研究以及如何收集患者数据来定义协议将降低患者和公司的风险。
降低成本
现在,公司没有多少动力去收集和多样化他们的数据,保护模型,并采取其他措施来改进他们的产品。为什么?没有框架。如果 FDA 发布一个所有公司都必须遵守的框架,它们将承担这样做的费用——并在长期内降低成本。
审批的不确定性增加了成本。如果公司通过正式程序申请,可能比与 FDA 的团队进行非正式沟通更便宜。要求和时间表会更清楚。这降低了公司和 FDA 的成本。最终是病人。
稳定性
在特朗普政府的最后几天,它提交了一项提案,要求将许多医学人工智能类别永久豁免于 FDA 审查。几周后,拜登政府搁置了这项提议。医学 AI 的命运不应该随着国家政治的变化而改变。
虽然适应性是这个新领域的关键,但我们应该为人工智能医疗产品建立一个稳定的标准——就像我们对非人工智能医疗产品一样。
结论
虽然我们不想让医疗人工智能这样一个快速变化的新领域陷入困境,但为审批和上市后表现提供一个基本的监管框架将:
- 增加公众对人工智能的信任
- 改进市场上的医疗人工智能
- 扩大人工智能的使用
- 保护病人
这些好处将加速人工智能在应用 中的使用,改善患者护理、医疗结果和可及性**。他们还将确保上市产品的正常运行。因此,我们可以有一个未来,医学人工智能使医学更好和造福我们所有人**。
注:截至 2021 年 1 月,FDA 在此提出了基于 AI 的软件行动计划 。
为什么 IDE 不是基于 SQL 的分析的未来
查询需要 ide 中没有的上下文。【在 hyperquery 中你会有更好的写作时间。]
这看起来像一个 IDE,是吗?所以,不是这个。[图片来自 Freepik]
我只想说:传统的 IDE 格式不太适合为分析工作编写查询。我会先解释原因,然后告诉你能做些什么。
首先,我的解释——当您编写或阅读查询时,有两件事您真的需要知道,而 ide 在这方面确实做得不够:
- 🗃数据上下文: *这些表和列是什么?*查询对表和列进行操作。不了解这些基本成分代表什么,你将在黑暗中飞行。
- 📈业务上下文: 这个查询的目的是什么?SQL 的产品通常不是代码本身——而是你从中获得的洞察力,它通常存在于你的
.sql
文件之外。
让我们更深入地考虑这些,然后考虑一些解决方案。
IDE 是为代码上下文而构建的,而不是数据上下文 🗃
开始编写查询时,您做的第一件事是什么?
select ... from ...
您写下select
和from
,然后寻找表格和列(以及关于这些表格和列的信息)来填充空白。
然而,传统的 ide 被构造成提供代码上下文,而不是这种类型的数据上下文。如果您曾经使用过现代的 IDE,您知道您可以立即跳转到对象定义。太棒了。这使得获取编程所需的上下文变得更加容易——这种上下文是在代码库中的一个单独文件中定义的。除了文件结构视图为您指明方向之外,IDE 还使您能够管理包含数百个相互交织的文件的代码库。
但这并不是 SQL 所需要的。
你不需要跳转来理解你的查询——你需要深入的文档。
需要铲子的时候不要用锤子。♠️[图片来自 Freepik]
与代码库不同,SQL 文件[通常]是独立的文件,只依赖于表,意味着 ide 中引用跳转所带来的好处大大减少了。您的依赖关系只有一层。另一方面,你做需要的那种表格和列信息通常需要深度。例如,我会花时间寻找关于表的附加文档,还有谁使用过它们,在 Github 中引用它们的管道以理解它们的出处,等等。简单地说,现在的任何 SQL IDEs 都缺乏对这种深度信息的访问。
IDE 没有业务上下文的位置📈
假设您已经知道如何获得足够的数据上下文来编写查询。接下来你会做什么?通常情况下,你会想要写下你的工作(至少如果你想有任何希望理解你所做的决定或在未来获得的洞察力)。
代码不是产品。你的洞察力是。💡[图片来自 Freepik]
"但是罗伯特,那么的自文档代码和注释呢?"你可能会说。
根据我的经验,单独的松散的 SQL 文件,无论组织得多么好或者注释得多么好,都不足以跟踪您的工作。我总是发现自己要么让他们跟着降价走,要么把他们放在一个单独的笔记工具里。为什么?
因为 SQL 是你和你的数据之间的一个接口,而不是传统的编程语言。
换句话说,SQL 几乎总是达到目的的手段,而不是目的本身。因此,这意味着代码本身并不是故事的全部。代码、动机、结果——这些都是理解查询目的所必需的,而 IDE 中几乎没有空间来放置这种形式的上下文。
解决方法
好吧。所以我已经告诉你,ide 没有数据上下文或业务上下文的空间,但我没有提供任何解决方案。事实上,没有太多的选择。
- 汇总数据发现+查询 IDE/SQL 笔记本+ doc app 数据发现工具修复数据上下文问题,单独的 doc app 将解决业务上下文问题。这是我们向早期客户推荐的,但这有一个严重的问题:一切都是脱节的,很难管理和保持同步。此外,想到在一个应该只需要一个应用程序的工作流程中使用 3 个应用程序,我就头疼。
- Whale
如果您正在寻找一个准系统解决方案,请查看 whale ,它使您能够使用命令行数据发现和 markdown 文件中的可执行 SQL 将数据上下文和业务上下文结合起来。也存在一些基于开源笔记本的解决方案,但我们通常发现它们笨重或不发达(plain Jupyter notebooks+Knowledge-repo、专营权、 Querybook )。
如果您正在寻找一个更优雅的解决方案,我们可以为您的数据环境、业务环境和查询提供一个和谐共处的地方。
概念,满足 SQL 笔记本,具有深度集成的数据发现。
我们称之为:Hyperquery——数据分析师的协作工作空间
我们正在构建一个 SQL 优先的工作区,它优雅地将查询编辑器转变为一个令人愉快的文档工具(想想概念),具有易于访问和深度集成的数据发现功能。我们一直在与一些早期客户合作,考虑到他们的反应,我们相信这是编写 SQL 的最佳方式。我们保证你从未用过这样的东西。在 hyperquery.ai 注册加入等候名单——我们将在接下来的几周内推出我们的邀请专用平台。
结束语
我们在编写查询时搜索的上下文信息不仅仅是为了方便。 SQL 查询及其组成组件需要上下文才有意义。没有上下文,你不仅是在浪费时间,而且是在鲁莽行事!😉
下次编写查询时请记住这一点——获取上下文,编写文档,您将拥有一个更加可持续的工作流。如果你想要一个工具让这变得更容易管理,在这里注册 Hyperquery。
Tweet@ imrobertyi/@ hy perquery打招呼。👋
关注我们LinkedIn。🙂
为什么彩虹色地图有问题
彩色地图效果的比较。彩色地图,从左到右,彩虹,冷-暖。修改自 Moreland (2009)。
在科学可视化中,将标量值映射到颜色是一个基本过程。尽管无效,彩虹彩色地图仍然被大多数科学可视化工具使用。这种彩色地图因模糊数据、引入假象和迷惑用户而臭名昭著(Moreland,2009)。
甚至华尔街日报在“天气预报应该越过彩虹”中警告我们,Matlab 在“彩虹的烦恼”中写了博客。
Moreland (2009 年)探索了发散彩色地图在科学可视化中的应用,并提供了在科学可视化应用中通常表现良好的发散彩色地图,如图 1 所示。与发散彩色地图相比,图 2 显示彩虹彩色地图无法捕捉数据变化。
彩虹彩色地图的主要问题是它在感知上不一致。这意味着数据值中的等阶并不映射到感知颜色中的等阶。结果,数据中的细微细节被掩盖了,用户会发现很难比较数值。
彩虹颜色图也有问题,因为它不是单调的。这意味着随着数据值的增加,颜色并不总是变得更亮或更暗。这可能会在可视化中引入假象,从而难以看到趋势。
最后,彩虹色图经常被用来显示具有大动态范围的数据。这意味着最小和最大数据值之间有很大的差异。彩虹色图不太适合显示动态范围较大的数据,因为它会压缩数据,很难看到微小的变化。
科学家们已经提出了许多彩虹彩色地图的替代品,如喷射彩色地图。然而,jet 彩色地图由于许多相同的原因也有问题。一个更好的选择是冷暖色图,这在许多科学可视化工具中都有。冷色调的颜色图在感觉上是一致和单调的,并且在可视化具有大动态范围的数据时表现良好。
图一。冷暖色图,一种连续发散的色图,非常适合在科学可视化应用中使用。
图二。彩色地图效果的比较。彩色地图从左到右依次是彩虹色、冷暖色。修改自 Moreland (2009)。
参考
K. Moreland,“用于科学可视化的发散彩色地图”,《视觉计算进展》,第 5876 卷,柏林,海德堡:施普林格柏林海德堡,2009 年,第 92–103 页。doi:10.1007/978–3–642–10520–3 _ 9。
为什么 S.T.A.R 方法在数据科学面试中不起作用,该怎么办
办公时间;数据科学面试
使用 G.I.C.F .方法给出一个清晰而有吸引力的答案
数据科学面试中最常见的问题之一是被要求谈论以前的数据科学项目。面试官要求你从你过去的经历中描述一个有影响力或有趣的项目。
这个问题可以出现在数据科学面试过程的任何一个环节。你可能会在技术电话筛选或现场面试中被问到这个问题,但底线是,如果你想在数据科学领域工作,你应该预料到这个问题。每个公司都这么问。
然而,尽管这很常见,许多人并没有为这个问题做准备。他们认为这是非技术性的,因此不需要提前准备。
但是,没有准备这个关于过去数据科学项目的问题是一个错误!许多人对这类问题没有很好的回答,他们甚至可能因此而面试失败。
当你回答一个关于以前项目的问题时,做好准备至关重要。你的回答需要有条理,这样你就可以轻松地提出必要的观点,吸引面试官。
许多人用来回答这类问题的结构是 S.T.A.R 方法。虽然 S.T.A.R 方法确实提供了结构,但它不是在数据科学面试中描述以前项目的最佳方法。
在本文中,我们将概述为什么 S.T.A.R 方法在面试中不起作用,并介绍一个替代框架,它将帮助您在下次面试官要求您描述过去的数据科学项目时给出清晰而有吸引力的答案。
让我们开始吧。
目录
- 什么是 S.T.A.R 方法?
- 为什么 S.T.A.R 方法在面试中不起作用?
1。订单没有时间限制
2。缺乏灵活性 - 除了 S.T.A.R 方法,还有什么更好的替代方法?
1。目标目标
2。冲击
3。C 哈兰格斯4。发现 - 结论
什么是 S.T.A.R 方法?
为了理解为什么 S.T.A.R 方法不起作用,让我们首先确定我们理解什么是 S.T.A.R 方法。
S.T.A.R 方法是人们在面试中用来回答行为问题的框架。它是这样分解的:
- 状况:从设定场景开始,为你的故事提供任何必要的背景或细节。
- 提问:继续描述在那种情况下你的任务或职责是什么。
- T21 行动:解释你采取了什么行动来完成这项任务。
- 结果:分享你行动的结果。
作为一种讲故事的方式,S.T.A.R 方法非常有意义。你从设定场景开始,然后把你自己介绍到那个场景中,描述你做了什么,最后以你行为的影响结束。它依靠一种最自然的方式来安排故事:按时间顺序。你从你必须做的事情开始,然后以你做的事情结束。
为什么 S.T.A.R 方法在面试中不起作用?
虽然 S.T.A.R 方法非常自然,并且确实提供了结构,但它不是回答有关以前数据科学项目的问题的理想框架,原因有两个:时间限制和灵活性。
订单没有时间限制
先说时间限制的问题。S . t . a . r 方法把结果放在最后。虽然从事情实际发生的顺序来看,这是合乎逻辑的,但这意味着直到最后你才会讨论你的工作和项目的影响,但结果是你答案中最重要的部分!
记住,从面试官的角度来看,这个问题的总体目标是什么。他们想知道你是否是这个职位的合适人选。他们想看看你是否能成为一名潜在的员工,这意味着面试官更关心项目的结果而不是背景。
像你在 S.T.A.R 方法中所做的那样,把这一重要部分放在最后是有风险的。如果你没有时间了,你将错过讨论你答案中最重要部分的机会。
在面试中,时间不够是很有可能的。当面试官问你以前的数据科学项目时,他们可能在寻找一个 2 分钟或 20 分钟的答案。不能保证你有足够的时间来完成你想说的一切,所以把结果留到最后不是一个好主意。
缺乏灵活性
S.T.A.R 方法的另一个问题是灵活性,或者说缺乏灵活性。S.T.A.R 方法在某些方面过于结构化。这是一个循序渐进的计划,没有给面试官留下参与的空间。
如果面试官对情况不感兴趣,而是想了解更多你的行动怎么办?如果面试官花了很多时间询问情况的更多细节,而你没有时间了解行动和结果,该怎么办?
一个更好的结构将会为你提供与面试官互动的空间,并根据他们的兴趣和面试流程修改你的答案**。S.T.A.R 方法很适合讲故事,但是面试不应该是故事。这应该是一次对话,而这正是 S.T.A.R 方法的不足之处。**
有什么比 S.T.A.R 方法更好的替代方法?
知道什么在面试中不起作用只会让你到此为止。现在我们知道了 S.T.A.R 方法的问题,让我们检查一个替代框架,它允许你在给你必要的灵活性的同时组织你的答案。
我推荐的框架也有四个步骤:
- 目标
- 影响
- 挑战
- 发现
让我们检查这四个步骤,以及这个框架如何解决 S.T.A.R 方法出现的问题。
目标
我的框架的第一步是总结项目的目标。你的公司当初为什么选择做这个项目?该项目旨在解决什么业务问题?
虽然这一步类似于 S.T.A.R 方法中的情景部分,但一个重要的区别是长度。你应该只用一句话来解释你项目的目标。你不是在设置场景,而是简单地解释项目的目的是什么。
如果需要提供更多项目目标之外的语境让面试官理解,可以在这里再加一句。在这里你可以提供一些信息,比如你什么时候做的这个项目,你和什么公司一起做的,它持续了多长时间,等等。
总的来说,你的答案的目标部分应该不要超过两句话。虽然一些初始的背景很重要,但是你应该尽量简短,这样你就可以快速进入你的回答的各个部分,向面试官展示为什么你是一个好的候选人
影响
解释完项目的目标后,现在你可以进入项目最重要的部分:影响。S.T.A.R 方法把这一部分留到了最后(结果),但通过把这作为你框架的第二部分,你确保了你有时间讨论你能够实现的目标,这显示了你作为候选人的能力。
当解释你的项目的影响时,说出数字是至关重要的。例如,这是一个关于过去数据科学项目的面试问题答案的第一部分。
我去年做过的最有趣的数据科学项目是一个旨在通过在我们的应用程序上提供新功能来提高客户保留率的项目。新功能是提供货物预计到达时间的预测。这是一个为期六个月的项目,我们能够将客户保持率提高 20%。
在这个例子中,您可以看到我解释项目目标的速度,以及我提供的度量标准如何清楚地显示影响。这么快就说出结果会引起面试官的兴趣,这在面试中至关重要。如果你让他们听你的,你所有的答案都将有更好的机会脱颖而出,引起你的注意。
当你完成了目标和影响,这一切加起来应该只有几句话,你已经给出了项目的基本概况。正是在这一点上,你应该抓住机会与面试官互动。
问面试官他们是想让你提供更多的背景还是深入项目的细节?让面试官选择你接下来要走的方向。这再次让面试官参与进来,让你的回答更像是一次谈话而不是一份报告。
如果面试官要求更多的背景信息,给出更多的背景信息,但是尽量简短。背景看起来很重要,但是对你的面试没有什么帮助。项目的背景并不能解释为什么你是一个好的候选人,所以避免花太多时间在背景信息上。
挑战
面试官可能会对你对项目的基本概述感到满意,但大多数时候他们会想要更多的细节。当面试官让你继续描述项目时,你可以进入回答框架的第三部分:挑战。
我建议讨论项目的 2 到 3 个挑战。在选择要讨论的挑战时,目标是混合使用技术和非技术示例。
技术挑战是您在项目中可能遇到的与数据科学相关的实际问题。以下是一些您可以用来思考技术挑战的问题:
- 在定义成功指标时有问题吗?
- 获取数据很难吗?
- 数据集很大吗?你是怎么处理的?
- 数据质量高吗?
- 你是如何处理这些数据的?
- 在模型培训和部署方面有什么挑战吗?
非技术挑战包括一系列与数据科学没有直接关系的问题。这可能是在项目管理和与其他团队和领导的协调等领域。以下是一些可能引发非技术性挑战的问题,供您讨论:
- 你有没有遇到其他车队的反对或阻碍?
- 你是如何让其他人接受你的想法的?
- 截止日期有什么困难吗?
- 你做了什么来解除你自己或你的团队的封锁?
为什么要用挑战作为描述项目的方式?为什么不描述一下这个项目呢?
永远记住这次面试的目的,甚至这个特定问题的目的也是让面试官决定你是否是这份工作的合适人选。通过描述一个项目你所面临的一些挑战,你展示了你可以交付成果。
从挑战的角度来看待事物可以让你谈论自己。如果你只是描述项目的整体,面试官会不清楚你具体做了什么来推动这个项目。
这实际上不是讨论挑战。相反,你应该着重展示你是如何介入并解决挑战的。这是一个很好的方式来表明你有资格并且能够对你工作的地方产生真正的影响。
虽然你可能有很多很好的观点要说,但是记得要继续和面试官交流。在你讨论完每个挑战后,问面试官他们是否想听更多的细节,或者他们是否想让你继续描述这个项目。你希望面试官保持专注。
发现
斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上拍摄的照片
在你谈完挑战后,如果你还有时间,你需要一个方法来总结你的答案。
与 S.T.A.R 方法不同,我们不想把最重要的信息留到最后,但我们也想在与面试官的谈话中以高潮结束。为了做到这一点,我建议分享一个来自这个项目的有趣发现。
有很多不同的东西可以被视为有趣的发现。您可以分享:
- 数据出乎意料的一面
- 你从工作中获得的洞察力
- 有趣的观察
这看起来好像你只是在分享有趣的事实,那么这对你的面试有什么帮助呢?在答案的挑战部分,你向面试官展示了你能完成这个项目。通过分享一个有趣的发现,你向面试官展示了你也喜欢这个项目。
表现出你对自己的工作有天生的兴趣是向面试官保证你关注细节和成长能力的好方法。你在乎,因此更有可能将你的注意力和努力投入到工作中。在激烈地讨论挑战后,它还会温柔地结束你的回答。
记住这是你回答的结尾。你希望这一部分保持简短,这样你的回答就不会拖拖拉拉,让面试官厌烦。把自己限制在项目中的一件事情上。
结论
虽然 S.T.A.R 方法是组织故事的有效方式,但它不是向面试官解释过去的数据科学项目的最有效方式。
相反,我推荐目标、影响、挑战、发现模型。这种模式将基本信息放在第一位,并使用一种让您专注于自己对项目的贡献的结构。
当使用这种模式时,要记得给面试官留下交流的空间,就像我在整篇文章中讨论的那样。你不希望你的回答感觉像一份报告。当你完成框架的各个步骤时,让面试官指导你他们想要多少细节。
描述一个先前的数据科学项目肯定会出现在几乎所有的数据科学面试中。因此,没有做好准备是一个非常可以避免的错误。使用我的框架,你可以计划和组织你的回答,给出一个清晰的、信息丰富的、有效的答案,给面试官留下深刻印象,并充分利用你的时间。
感谢阅读!
如果你喜欢这个帖子,想支持我…
- 订阅我的 YouTube 频道 !
- 跟我上 中 !
- 连接上 Linkedin !
- 前往emmading.com/resources获取更多关于数据科学面试技巧和策略的免费资源!
为什么世界需要数据企业家
从一个个人故事中了解为什么数据计划在过去十年中失败了,但在今天仍然充满挑战。从数据产品管理到数据创业,作为整体应对未来数字化的方法。
在数据科学领域工作了近十年后,在商业分析、商业智能、高级分析、机器学习以及人工智能等各个领域,我最终不得不接受从数据中创造价值是一个挑战,而且可能永远是一个挑战。虽然我在职业生涯的最初几年提供实践数据科学解决方案,但在后来的阶段,我与人共同创立了一家名为 Mindfuel 的公司,并开始从更具战略性的角度研究和分析组织生态系统和环境,所谓的数据计划就诞生于其中。这是我目前发现的情况。
2010 年代的数据科学浪潮
十年前,欧洲市场掌握在商业智能解决方案及其提供商手中。在大多数情况下,数据在关系数据库中被历史化,SQL 是处理它们的首选编程语言。在一天结束时,会生成一个业务报告,或者在业务用户可以访问的服务器上部署一个仪表板。多亏了一些大玩家,一门新的学科即将从美国飘洋过海来到欧洲,它的名字叫“数据科学”。
这是一场炒作的开始。人们希望使用先进的方法从数据中获得更多——更多信息、更多见解、更好的行动——简单地说:更多价值。新的需求出现了。我们分析师学会了开发模型、创建展示、构建原型,甚至部署首批飞行员。我们非常自豪地向高管们展示了公司的下一个大型灯塔项目,他们同时感到兴奋和高兴。此外,他们为我们提供了进一步的财政资助和预算,使我们能够继续下去。
他们的期望非常明确:请从这些计划中传递价值。其中一些利益相关者投入了大量资金。他们资助了能力中心、数据实验室、人工智能中心、数据单元,当然,还有所有必要的技术来构建最先进的“数据宇宙”。CDO 被雇来挖金子。市场一直在无限增长,直到有一天,第一个利益相关者问了一个神奇的问题:*“我大概什么时候能获得投资回报?”*从这一刻起情绪倾斜了。
在意识到只有有限数量的数据计划真正回报了所有的努力或有一天达到收支平衡后,知名研究机构跳了出来,并解释说 ~90%的数据计划不会进入生产。我们都不得不承认,开发技术解决方案在某种程度上起了作用,但不足以交付‘价值’。
最后,这种炒作在十年结束时慢慢变平,今天的决策者开始在批准预算和投资之前首先要求 ROI 概念。
我对我们为何失败的观察
是的,我们失败了。我们共同失败了:专家、供应商、用户和客户,以及他们的员工和利益相关者。
以下是预览:技术不是唯一的责任。在过去的十年里,我们在设计和开发更好的模型、更好的基础设施以及更好的平台方面取得了进步,或者总结为:更好的解决方案。由于现有的和新的提供商和开源社区的努力,在数据集上执行回归模型或扩展模型变得前所未有的简单,这需要通过简单的点击获得更多的计算能力。
然而,不知何故,一个适当的组织环境的相应转变被错过了。我的主要观察总结如下:
- 人们假装敏捷,但仍然以瀑布模式思考,或者至少努力将敏捷方法付诸实践
- 组织仍然缺乏适当的数据操作模型来开发数据产品,以及如何将这些数据产品集成到目标生态系统中的相应过程
- 总的来说,数据世界很少考虑用户的需求。直到今天——主要的焦点是可行性
- 文化和思维方式的挑战:我们如何在业务部门之间进行合作——尤其是在数据方面
- 关注产出,而不是结果:产出和结果的区别是什么?我们一直在执行项目,而不是开发产品,不是吗?
- 没有人对商业案例负责,也没有人确保投资会有适当的回报
所有这些观察都与数据科学中众所周知的挑战无关,例如有多少数据是可访问的、可用的或准备好进行分析的,但远远超出了数据空间。
从数字产品管理中学到的东西
出于对现状的某种沮丧,2019 年,我将我的发现提交给了我的一个最好的朋友,也是今天 Mindfuel Max 的联合创始人,他当时是一名数字产品经理。他立刻遇到了一些站不住脚的假设:
- 你开发的不是产品,而是项目。
- 在制定解决方案时,你没有考虑可取性。
- 您没有考虑适销性,因为您的解决方案将在市场上与其他解决方案竞争。
- 谁拥有您的解决方案的可行性?然而,它不能是数据产品的所有者。
我的情绪从沮丧到愤怒再到动力。他说得有道理!当他更详细地向我解释产品管理的核心以及产品经理的具体角色和职责时,这敲响了警钟,并提出了一些合理的问题:这对数据科学项目来说意味着什么?数据科学项目的产品负责人或项目负责人可以负责 ROI 吗?或者由典型的业务所有者来承担责任,他向项目提供需求和领域知识?但是,她/他是否有资格拥有整个解决方案?难道她/他不是最终以用户的角色成为解决方案的接受者吗?如果是,谁最终拥有数据产品?为什么在数据空间中没有合适的产品经理角色?
Mindfuel 的数据产品管理方法
牢记对利益相关者的价值创造承诺,Max 和我很快就进入了这个旅程的下一步 数据产品管理 。适应(数字)产品管理的方法和框架为未来如何实现和交付数据计划打开了一个全新的视角。我们将敏捷框架、执行引擎和产品管理工具的方法和概念与 CRISP-DM、ML- & DataOps 的产品相结合,并在所有这些基础上融入了数据战略领域的原则。这导致了一种整体的方法,这种方法大于其各部分的总和。
为什么世界需要数据企业家
然而,我们所有的努力导致了这样一个事实:除了数据产品管理之外,这个故事还可以添加更多内容。我们意识到数据产品管理是规程的一部分,称为https://mindfuel.ai/。
data reneur就是这种“下蛋的长毛奶羊”十年前曾经是数据科学家。当船以全速航行时,每个项目中的船长保持航向。一个人接受风险并渴望交付承诺的投资回报。她/他是拥有比 ML 模型更大的产品愿景的人。他/她时刻牢记用户的愿望,并相应地创造业务关键型成功,同时在实践中理解和应对数据世界的挑战。****
数据企业家的定义
但从更全面的角度来看,还不止于此:
这是一个人物有勇气失败,迅速从中吸取教训,并在这个旅程中创造了一个不断增长的生命周期。创新和价值创造齐头并进的循环。这种人尊重这样一个事实:投资者的钱不是免费的午餐,而是需要以合理的倍数回报,不仅要考虑商业利益,还要考虑道德和伦理,尤其是在涉及数据及其被滥用的潜在危险时。一个数据创业者总是真正关心数据在今天的产品中是如何使用的——以及将来会如何使用——同时考虑产品的更大目标。数据企业家用人们喜爱的创新和可持续的数据产品取悦世界。他/她设计和制造的每一件产品都让环境变得更好——一步一步,一个想法一个想法,一个产品一个产品。**
总有一天,data reneur将成为每个数据计划的一部分,确保价值和数字化的成功。**
你对此有什么想法?就我们而言,我们将继续我们的旅程,最终降低数据计划失败的百分比,我们期待着一路上的任何同伴。
为什么深度强化学习中的策略梯度定理有问题
或者,我喜欢称之为“折扣因子的魔法”
伊卡洛斯号的飞行,b y 雅各布·彼得·戈威——【https://commons.wikimedia.org/w/index.php?curid=27493281】T2
多亏了我的导师 Proutiere 教授,我第一次发现这个问题,是在检查我去年 2020 年秋季在 KTH 举办的强化学习(EL2805)课程第二次实验室会议的提案时。
这个问题严重到足以影响大多数深度强化学习算法,包括 A3C [7]、SAC [8]、ACKTR 算法[9]等。
大致上,这是我的主管发给我的电子邮件:
嘿,阿莱西奥,我有一个关于政策梯度定理的问题。平均值是关于μ的,μ是一个贴现态分布。但是,一般来说,人们如何证明我们使用由政策π诱导的静态政策分布产生的经验,而不是贴现分布μ?
为了充分理解他的意思,我和我的主管之间来回发送了几封电子邮件是必要的(在我的辩护中,他的第一封电子邮件含糊不清,前面引用的句子是那封电子邮件的“澄清”版本:))。
如果你还不知道我在说什么,让我简单地提醒你一下政策梯度定理[1]是如何工作的。
政策梯度定理
尽管 PG 定理很简单,但它已经实现了我们目前看到的深度强化学习的许多成就。
基本想法如下:
我们是否可以通过使用某个目标函数 J(θ)相对于θ的梯度来改善由θ参数化的策略π的性能?然后,通过简单地使用随机梯度上升方法,我们可以根据该梯度改善策略的性能。
为了定义目标函数 J(θ),通常使用期望总折扣报酬标准
由θ参数化的政策π的期望报酬标准。
简要描述:
- 第一个期望就是保单的贴现值π, ,而第二个期望是第一个期望的对偶形式(第一个考虑时间,第二个考虑状态-行为空间*;*查看遍历定理更好的理解这种对偶性)。
- 在第二个期望中,我们对策略π诱导的贴现状态分布μ取一个期望。
π诱导的贴现态分布;p0 指初始状态分布;P(s_t=s|s_0=z)是使用策略π时,在时间 t 达到状态 s 的概率(假设初始状态为 z)。
PG 定理是如何发挥作用的?对于贴现准则,PG 定理规定 J(θ)的梯度简单地为
政策梯度定理(另见[1]);为简洁起见,我省略了归一化因子 1/1-γ(在论文中经常被省略,因为它与贴现态分布中的 1-γ因子相抵消)
注意期望是如何类似于 J(θ)的对偶形式的。该公式可能看起来微不足道,但事实并非如此,原因如下:
在 PG 定理中,J(θ)的梯度不依赖于贴现态分布μ的梯度,即使μ依赖于策略π。
这个结果在强化学习博客中经常被忽略,但它特别重要,因为它说明了 J(θ)的梯度是相对于贴现状态分布μ取的平均值,当θ变化时,我们不需要考虑这个分布如何相对于θ变化。
然而,贴现态分布是所有问题的根源。
那么,现代深度强化学习算法有什么问题呢?
现在,几乎所有的强化学习算法都使用一个折扣因子。因此,如前所述,总期望贴现回报的梯度取决于贴现状态分布μ。
因此,用于更新策略的样本应按照贴现态分布μ进行分布。
然而,在几乎所有的论文中,如果不是全部的话,策略是使用在执行策略π时收集的状态样本来更新的。换句话说,为了更新策略,我们使用根据π诱导的策略上分布分布的样本,而不是折扣分布μ。
有什么区别?简而言之,这类似于从状态分布中去掉贴现因子。
- 策略梯度计算不正确,因为我们使用的样本不是按照μ分布的。
- 因此,我们没有优化原始目标函数 J(θ)。
- 很明显,这个问题对深度强化学习领域中获得的所有经验结果的有效性提出了质疑,并且可能会损害现代深度强化学习算法在现实世界应用中的适用性。
以前没有人讨论过这个问题吗?
当我第一次和我的主管讨论这个问题时,它看起来像是一个没有人考虑过的新事物。但快速搜索发现,作者在[2],“政策梯度是梯度吗?(Nota 和 Thomas),最近对同一问题提出了担忧(它于去年,2020 年发表)。
- 在【2】中 Nota 和 Thomas 声称这样计算的梯度不是任何函数的梯度。使用这种梯度的算法不能保证收敛到一个“好的”参数θ。
- 此外,总是在[2]中,他们表明有可能构造"一个反例,其中不动点相对于贴现和未贴现目标"[2]都是全局相似的。
- 再深入一点,我们会注意到,类似的问题以前也在[3]和[4]中提出过(这两篇论文中托马斯都是作者之一)。
非常令人惊讶的是,没有多少研究人员意识到这个问题。这可能是由于缺乏对强化学习和马尔可夫决策过程的理论理解。
怎么才能解决呢?
有修复。
很脏,但很简单。
在马尔可夫决策过程中,使用折扣因子和达到最终状态是等价的(另见 puter man【10】,第 5.3 节,他讨论了使用折扣因子和拥有最终状态之间的相似性)。
**贴现相当于在马尔可夫决策过程中引入一个终态。**这也相当于拥有一个几何分布的视界长度。
因此,我们只需要人工引入以某个概率 1-γ终止轨迹的可能性。
这显然是一个疯狂的想法。强化学习算法已经受到高样本复杂性的困扰,因此这一变化可能会使它变得更糟。此外,这种变化并不真正适用于现实世界的情况。
…也许我们应该降低折扣系数?
或者,另一个想法是简单地贬低贴现因子。萨顿和巴尔托已经在[6]中讨论过,贴现因子在持续的环境中毫无意义。
对于连续设置,没有剧集的概念,优化平均奖励更有意义。此外,这是最接近真实应用程序的持续设置。
不幸的是,这方面的研究很少,因为大部分努力都放在创建新的基于折扣的算法上。
同样,在[5]中,作者讨论了当使用函数逼近时,折扣强化学习如何不是优化问题,以及我们应该求助于平均奖励强化学习。然而,请注意,作者在[5]中讨论的问题与我在本文中强调的问题不同
结论
伊卡洛斯的飞行,b y 雅各布·彼得·戈威——https://commons.wikimedia.org/w/index.php?curid=27493281
这篇文章的目的是提高正确使用贴现版本的政策梯度定理的意识。绝大多数论文不正确地使用了这一梯度,并给出了几乎没有理论依据的结果。
深度强化学习的经验进展与我们对该领域的理论理解不匹配。
“深入研究政策梯度”[11]的作者研究了这个问题,发现梯度估计值与“真实”梯度相关性很差。此外,他们注意到优化景观往往不能反映潜在 MDP 的回报景观。
简而言之,他们声称
总的来说,我们的结果表明,深层强化学习算法的理论框架通常无法预测实践中出现的现象。这表明,构建可靠的深度 RL 算法需要超越以基准为中心的评估,转而从多方面理解它们通常不直观的行为[11]。
相反,我们正在见证一场战斗,以创建尖端的深度强化学习算法来提高 Atari 游戏或 MuJoCo 环境中的分数,尽管这是以减少理论理解为代价的。
我们应该更多地思考这些问题,避免重蹈伊卡洛斯的覆辙。
感谢您的阅读!
参考
- 用函数逼近强化学习的政策梯度方法。辊隙。第 99 卷。1999.
- 克里斯·诺塔和菲利普·托马斯。2020.政策梯度是梯度吗?。AAMAS (2020)。
- 托马斯菲利普。“自然演员-评论家算法中的偏见。”机器学习国际会议。PMLR,2014 年。
- 经典政策梯度:保持贝尔曼的最优原则。 arXiv 预印本 arXiv:1906.03063 (2019)。
- 纳伊克,阿布舍克等人。“折扣强化学习不是一个优化问题。” arXiv 预印本 arXiv:1910.02140 (2019)。
- 萨顿,理查德 s 和安德鲁 g 巴尔托。强化学习:介绍。麻省理工学院出版社,2018。
- 深度强化学习的异步方法。机器学习国际会议。PMLR,2016。
- 软演员-评论家算法和应用。 arXiv 预印本 arXiv:1812.05905 (2018)。
- 吴,,等,“基于 kronecker 分解近似的深度强化学习的可扩展信赖域方法” arXiv 预印本 arXiv:1708.05144 (2017)。
- 马尔可夫决策过程:离散随机动态规划。约翰威利&之子,2014。
- 安德鲁·易勒雅斯等人,《深入研究政策梯度》学习代表国际会议(ICLR) 。2020.
为什么用 16 位图像训练 CNN 不起作用
在 Keras 和 Tensorflow 中使用 Uint16 图像实现 CNN 时的注意事项
最近我在做一个项目,训练 CNN 识别卫星图像中的开阔海洋现象,我很难得到结果。这些图像是 GeoTIFF 格式,这是科学界基于 TIFF 格式的一种流行文件类型,尤其适用于使用 GIS 的应用程序。根据来源,“高精度值(16 位)以及地理信息被保留,用于基于机器学习的方法的开发……”以及图像的检查
暗示它们是三个通道的图像,尽管图像在视觉上是灰度的。嗯,训练还是不顺利,我也不知道为什么。经过几个小时的谷歌搜索,阅读 github 问题线程,浏览 StackOverflow,我终于找到了一个解决方案,我希望它可以节省你的时间。
如果你已经在大量数据上训练了神经网络,特别是图像,你会知道你必须成批地将图像传递给你的网络进行训练,因为总数据量大于你的计算机一次可以加载到它的工作存储器中的数据量。这种技术在 TensorFlow 中的实现是从他们的Image Data Generator
类中调用的flow_from_directory()
。我的项目中的代码,创建策略学习中使用的测试、训练和验证图像集,最初看起来像
其中color_mode
被设置为‘rgb’
,因为根据 TensorFlow 的文档
我知道我的图像有三个通道。然而,我最终能够在一些 github 问题线程中追踪到 TensorFlow 当前未设置为处理 16 位 RBG 图像,它会尝试将我的图像的第一个通道中包含的像素值压缩到 0 到 255 之间,这是 8 位图像的允许值,而不是保留 0 到 65535 之间的准备好的高分辨率 16 位像素值。通过快速检查生成器加载的一个图像像素数组,我验证了这是真的:
我所有的图像都是单调的白色图像!难怪它学不到任何东西…总之,经过进一步的检查,我发现我的图像中的像素值都包含在第一个通道中,是灰度合成孔径雷达图像,而其他通道包含其他信息。这些信息可能在其他机器学习应用中有用,但对于 CNN 的训练,我只对像素数据感到满意,更重要的是 Tensorflow 可以处理 16 位灰度图像。因此,只需将上面生成器代码中的参数color_mode
改为‘grayscale’
,就像这样
让我开始得到结果!为了验证这一点,我们可以再次查看一个图像数组:
现在我们有了一些 CNN 可以适当借鉴的数据。虽然我希望这对你们中的一些人有所帮助,并在我和其他人遇到的特定问题上为你们节省一些时间,但我们也可以从解决问题的步骤中学习。当谈到 CNN 和一般的神经网络时,它们可能是一种黑箱,这意味着无论它们是否工作,都很难确定原因。就像这个问题一样,它们不工作的原因通常与提供给网络的数据质量有关。因此,开始故障排除的一个好地方是仔细检查您的数据源,并确保传递的信息是您的神经网络类型能够消化的形式。如果还是不行,就多加几层(开玩笑…大部分)。感谢阅读!
为什么先用 SQL 再用熊猫?
大西洋海岸线,石头,数据,更多石头。葡萄牙 2019。(作者供图)
我想把这项工作扩展成一系列教程视频。如果你感兴趣,请订阅我的时事通讯保持联系。
介绍
数据分析是任何数据相关项目中最重要的步骤之一。不考虑上下文(例如,商业、机器学习、物理等。),有很多种方法可以弄对…或者弄错。毕竟,决策往往取决于实际发现。同时,在你找到之前,没有人能告诉你要找什么。
由于这些原因,尽可能保持过程平稳是很重要的。一方面,我们想快速进入本质。另一方面,我们不想让代码变得复杂。如果清理代码的时间比清理数据的时间长,您就知道有些事情不对劲。
在本文中,我们主要关注获取数据。更准确地说,我们展示了如何使用 Python 的两个关键分析库,即 Pandas 和 SQL ,获得相同的结果。使用一个示例数据集(见后面),我们描述一些与准备和数据分析相关的常见模式。然后我们解释如何用它们中的任何一个得到相同的结果,并讨论哪一个可能是优选的。因此,不管你是否知道一种方法,但不知道另一种,或者你对两种方法都很熟悉,我们都邀请你阅读这篇文章。
示例数据集
来自 Kaggle 的“NIPS Papers”将作为一个示例数据集。出于以下原因,我们特意选择了这个数据集:
- 它以 SQLite 文件的形式提供,因此我们可以模拟一个常见的场景,其中数据是从关系数据库(例如数据仓库)中获得的。
- 它包含不止一个表,所以我们还可以展示如何组合数据,这是一个经常遇到的问题。
- 它是不完美的:会有 nulls、NaNs 和其他一些常见的问题……生活;)
- 它很容易理解,只包含两个数据表(“作者”和“论文”),加上第三个来建立它们之间的多对多关系。由于这一点,我们可以专注于方法而不是实际内容。
- 最后,数据集也以 CSV 文件的形式出现。
欢迎你自己去探索。然而,由于我们关注的是方法,我们将讨论的内容限制在最低限度。让我们开始吧。
获取数据
选择数据的方式取决于数据的格式和存储方式。如果格式是固定的,我们在如何选择上就没有什么选择了。然而,如果数据位于某个数据库中,我们有更多的选择。
最简单也可能是最天真的方法是一个接一个地获取它,并将它们作为 CSV 文件存储在本地。这不是最好的方法,主要有两个原因:
- 总数据量不必要地变大。你必须处理不是信息的多余数据(索引、辅助列等)。).
- 根据数据的不同,笔记本电脑将包含大量的清理和处理代码开销,从而影响实际的分析。
这些你都不想要。然而,如果您对数据毫无头绪,那么获取所有数据是最安全的选择。
让我们看看“NIPS”有哪些表和列。
表格authors
import pandas as pddf_authors = pd.read_csv("data/authors.csv")
df_auhtors.info()# returns
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9784 entries, 0 to 9783
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 9784 non-null int64
1 name 9784 non-null object
dtypes: int64(1), object(1)
memory usage: 153.0+ KB
表papers
df_papers = pd.read_csv("data/papers.csv")
df_papers.info()# returns
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7241 entries, 0 to 7240
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 7241 non-null int64
1 year 7241 non-null int64
2 title 7241 non-null object
3 event_type 2422 non-null object
4 pdf_name 7241 non-null object
5 abstract 7241 non-null object
6 paper_text 7241 non-null object
dtypes: int64(2), object(5)
memory usage: 396.1+ KB
表paper_authors
如前所述,该表使用author_id
和paper_id
外键链接前两者。另外,它有自己的主键id
。
图一。显示“论文”表中数据的前 5 行。(图片由作者提供)。
正如我们从图像中看到的(当我们更深入地分析时也是如此),考虑到title
列,pdf_name
列多少有些多余。此外,通过调用df_papers["event_type"].unique()
,我们知道该列有四个不同的值:'Oral', 'Spotlight', 'Poster'
或NaN
(这表示出版物实际上是一篇论文)。
比方说,我们想要过滤掉pdf_name
以及任何代表非普通报纸的出版物的条目。在 Pandas 中这样做的代码看起来像这样:
df = df_papers[~df_papers["event_type"] \
.isin(["Oral", "Spotlight", "Poster"])] \
[["year", "title", "abstract", "paper_text"]]
这条线由三部分组成。首先,我们传递df_papers["event_type"].isin(...)
,这是一个条件给我们一个二进制掩码,然后我们将它传递给df_papers[...]
,本质上是过滤行。最后,我们将一个列列表["year", "title", "abstract", "paper_text"]
附加到剩下的部分(再次使用[...]
),从而指出我们想要保留的列。或者,我们也可以使用.drop(columns=[...])
来指示不需要的列。
实现相同结果的更好的方法是使用 Pandas 的.query
方法,而不是使用二进制掩码。
df = df_papers \
.query("event_type not in ('Oral', 'Spotlight', 'Poster')") \
.drop(columns=["id", "event_type", "abstract"])
代码看起来更干净,关于.query
的一件好事是,我们可以使用@
-符号来引用另一个对象,例如.query("column_a > @ass and column_b not in @bees")
。另一方面,这种方法有点慢,所以当不得不过度重复时,您可能希望坚持使用二进制掩码方法。
使用 SQL 获取数据
熊猫完成了任务。然而,我们有数据库是有原因的。它们经过优化,可以高效地搜索表并根据需要提供数据。
回到我们的问题,我们在这里实现的只是对列和行的简单过滤。让我们将任务委托给数据库本身,并使用 Pandas 来获取准备好的表。
Pandas 提供了三个可以帮助我们的函数:pd.read_sql_table
、pd.read_sql_query
和pd.read_sql
,它们既可以接受查询,也可以接受表名。不支持 For SQLite pd.read_sql_table
。这不是问题,因为我们对查询数据库级别的数据感兴趣。
import sqlite3 # or sqlalchemy.create_engine for e.g. Postgrescon = sqlite3.connect(DB_FILEPATH)
query = """
select
year,
title,
abstract,
paper_text
from papers
where trim(event_type) != ''
"""df_papers_sql = pd.read_sql(query, con=con)
我们来分解一下。
首先,我们需要连接到数据库。对于 SQLite,这很容易,因为我们只提供了一个数据库文件的路径。对于其他数据库,还有其他的库(例如,Postgres 的psycopg2
或者更通用的:sqlalchemy
)。重点是创建数据库连接对象,该对象将熊猫指向正确的方向并对认证进行排序。
一旦解决了这个问题,剩下的唯一事情就是构造正确的 SQL 查询。SQL 通过select
语句过滤列。类似地,用where
子句过滤行。这里我们使用trim
函数从空格中删除条目,留下所有内容,只留下一个空字符串。我们使用trim
的原因是针对这个例子的数据内容,但一般来说where
是放置条件的地方。
使用read_sql
时,数据会自动DataFrame
过滤,所有行和列都会进行预过滤,如上所述。
很好,不是吗?
让我们继续前进…
加入,合并,收集,组合…
数据通常存储在多个表中。在这些情况下,拼接数据集成为分析之前的附加步骤。
这里的关系相当简单:在authors
和papers
之间有一个多对多关系,两个表通过第三个,即papers_authors
链接。让我们来看看熊猫是如何处理案件的。为了便于讨论,让我们假设我们希望找到发表论文最多的“多产”作者。
df_authors \
.merge(
df_papers_authors.drop(columns=["id"]),
left_on="id",
right_on="author_id",
how="inner") \
.drop(columns=["id"]) \
.merge(
df_papers \
.query("event_type in ('Oral', 'Spotlight', 'Poster')") \
[["id", "year", "title", "abstract", "paper_text"]],
left_on="paper_id",
right_on="id",
how="left") \
.drop(columns=["id", "paper_id", "author_id"]) \
.sort_values(by=["name", "year"], ascending=True)
…对于 Python 来说,这只是一行代码,但这里为了清楚起见,我们将其分成了几行。
我们从表authors
开始,想要分配papers
。Pandas 为“组合”数据提供了三个功能。
pd.concat
-按行或列连接表格。类似于 SQL 的union
。pd.join
-就像 SQL 的join
一样连接两个表,但是要求索引是实际的 DataFrame 索引。pd.merge
-相同,但更灵活:可以使用索引和列进行连接。
为了“得到”到papers
,我们首先需要将内连接到papers_authors
表中。但是,两个表都有一个id
列。为了避免冲突(或自动前缀),我们在加入之前删除了papers_authors.id
列。然后,我们在authors.id == papers_authors.author_id
上连接,之后我们也从结果表中删除id
。进入papers_id
,我们再次执行连接。这一次,是一位左派——加入为我们不想消灭的“无纸化”作者。我们也借此机会过滤前面描述的df_papers
。然而,保持papers.id
是必要的,否则熊猫会拒绝加入他们。最后,我们删除所有索引:id, paper_id, author_id
,因为它们没有带来任何信息,并且为了方便起见对记录进行排序。
使用 SQL 进行组合
现在,使用 SQL 也有同样的效果。
query = """
select
a.name,
p.year,
p.title,
p.abstract,
p.paper_text
from authors a
inner join paper_authors pa on pa.author_id = a.id
left join papers p on p.id = pa.paper_id
and p.event_type not in ('Oral', 'Spotlight', 'Poster')
order by name, year asc
"""
pd.read_sql(query, con=con)
这里,我们从线8.
开始“向外”构建它,随后连接其他表,第二个表使用线11.
修剪。剩下的只是使用a, p, pa
作为别名进行排序和过滤。
效果是一样的,但是使用 SQL,我们避免了必须管理索引,这与分析无关。
数据清理
让我们来看看结果数据集。
图二。组合表的前五行。(图片由作者提供)
新创建的表包含缺失值和编码问题。这里,我们跳过修复编码,因为这个问题是特定于数据内容的。但是,缺少值是一个非常常见的问题。Pandas 提供了.fillna(...)
和.dropna(...)
等,根据约定,我们可以用不同的值填充 nan。
使用 SQL 进行数据清理
数据库也有自己的方式来处理这个问题。这里,fillna
和dropna
的对应词分别是coalesce
和is not null
。
使用coalesce
,我们的查询处理数据集,注入任何值以防丢失。
"""
select
a.name,
coalesce(p.year, 0) as year,
coalesce(p.title, 'untitled') as title,
coalesce(p.abstract, 'Abstract Missing') as abstract,
coalesce(p.paper_text, '') as text,
from authors a
join paper_authors pa on pa.author_id = a.id
left join papers p on p.id = pa.paper_id
and p.event_type not in ('Oral', 'Spotlight', 'Poster')
order by name, year asc
"""
聚集
我们的数据集是使用 SQL 准备、“修复”和获取的。现在,让我们假设我们想根据作者每年写的论文数量对他们进行排名。此外,我们还想计算每个作者每年“产出”的总字数。
同样,这是另一个标准的数据转换问题。让我们来看看熊猫是如何处理的。起点是关节和干净的桌子。
df["paper_length"] = df["paper_text"].str.count()df[["name", "year", "title", "paper_length"]] \
.groupby(by=["name", "year"]) \
.aggregate({"title": "count", "paper_length": "sum"}) \
.reset_index() \
.rename(columns={"title": "n_papers", "paper_length": "n_words"}) \
.query("n_words > 0") \
.sort_values(by=["n_papers"], ascending=False)
我们通过计算空格来计算文章的长度。虽然认为论文中的每个单词都被一个空格分隔是幼稚的,但它确实给了我们一些估计。第1.
行通过.str
属性实现,同时引入一个新列。
稍后,我们通过应用一系列操作来形成一个新表:
- 我们将表缩小到感兴趣的列。
- 我们使用
name
和year
列聚合该表。 - 当我们对剩下的两列应用不同的聚合函数时,我们使用接受带有指令的字典的
.aggregate
方法。 - 这种聚集导致了双重索引。行
6.
将name
和year
恢复到列。 - 其余列的名称保持不变,但不再反映数字的含义。我们在第
7.
行进行了修改。 - 对于以前缺失的值,可以安全地假设它们的字数等于零。为了建立排名,我们使用
.query
来消除它们。 - 最后,为了方便起见,我们对表格进行了排序。
总表如图 3 所示。
图 3。排名是一个汇总表格。(图片由作者提供)
使用 SQL 进行聚合
现在,让我们再一次使用 SQL 实现相同的结果。
"""
select
d.name,
d.year,
count(title) as n_papers,
sum(paper_length) as n_words
from (
select
a.name,
coalesce(p.year, 0) as year,
coalesce(p.title, 'untitled') as title,
length(coalesce(p.paper_text, ''))
- length(replace(coalesce(p.paper_text, ''), ' ', '')
as paper_length
from authors a
join papers_authors pa on pa.author_id = a.id
left join papers p on p.id = pa.paper_id
and p.event_type not in ('Oral', 'Spotlight', 'Poster')
) as d
group by name, year
having n_words > 0
order by n_papers desc
"""
这个查询可能看起来比 Pandas 代码更麻烦,但事实并非如此。我们将所有的工作和聚合结合在一个步骤中。多亏了子查询和函数,在我们的特定示例中,我们甚至可以在开始分析之前得到结果。
该查询包含一个子查询(第8.-18.
行),除了删除abstract
和引入paper_length
列之外,几乎所有内容都保持不变。SQLite 没有与str.count()
等价的词,所以我们使用length
和replace
来计算空格和所有其他单词之间的差异。稍后,在第19.
行,我们将d
指定为引用子查询表的别名。
接下来,结合了count
和sum
的groupby
语句是我们使用 Pandas 的.aggregate
方法所做的。这里,我们也使用having
应用第21.
行的条件。having
语句的工作方式与where
相似,只是它在聚合的“内部”操作,而where
则应用于一个表,该表是为了删除它的一些记录而制定的。
同样,结果表是完全相同的。
结论
熊猫和 SQL 可能看起来很像,但本质是很不一样的。Python 是一种面向对象的语言,Pandas 将数据存储为类似表格的对象。此外,它提供了多种方法来以任何可能的方式转换它们,这使它成为一个优秀的数据分析工具。
另一方面,Pandas 制定数据集的方法只是 SQL 的另一个“化身”。SQL 是一种声明性语言,自然适合于获取、转换和准备数据集。如果数据驻留在关系数据库中,让数据库引擎执行这些步骤是更好的选择。这些引擎不仅针对这一点进行了优化,而且让数据库准备一个干净方便的数据集有助于分析过程。
SQL 的缺点是,在创建数据集之前,可能很难阅读和确定要丢弃的数据和要保留的数据。运行在 Python 上的 Pandas 允许我们将数据集的一部分分配给变量,检查它们,然后做出进一步的决定。
尽管如此,这些临时变量经常会使工作空间变得拥挤不堪…因此,除非您有疑问,否则有充分的理由使用 SQL。
你如何分析你的数据?;)
还会有更多…
我计划把文章提升到一个新的水平,并提供简短的视频教程。
如果您想了解关于视频和未来文章的更新,订阅我的 简讯 。你也可以通过填写表格让我知道你的期望。回头见!
为什么使用虚拟分类器是明智之举
建立基线,将您的模型性能与虚拟模型进行比较
Y 你早上醒来,点燃你最喜欢的香味蜡烛,煮些咖啡和早餐,打开 Spotify 听些果酱,开始新的一天。在享受早晨的例行公事时,你突然有了一个想法:如果有一种方法可以在一首流行歌曲真正流行起来之前准确预测它,会怎么样?
因此,像任何其他数据科学家一样,你打开笔记本电脑,从 Spotify 找到一些数据,在预处理数据后,建立一个随机森林模型。你很快扫了一眼你的初始模型的准确度分数,并不期望它很高——因为,让我们面对它,你什么时候第一次就有过一个伟大的模型——但是,那是什么?
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score#building Random Forest model
clf_rf = RandomForestClassifier(random_state=42)
clf_rf.fit(X_train, y_train)#making predictions and printing accuracy score
y_pred = clf_rf.predict(X_test)
print(accuracy_score(y_test, y_pred)) #0.9371
哇,准确率高达 93.7%!牛逼!嗯…也许不是。当我们查看该模型的混淆矩阵(更多信息见下文)时,我们看到了我们最初期望看到的情况:我们的模型的预测能力没有那么强。该模型只在 56%的情况下正确预测了一首流行歌曲,但它正确识别了 99%的不受欢迎的歌曲。这就是为什么我们的准确性分数是倾斜的!
让我们倒回去一分钟……
混淆矩阵是什么?它的目的是什么?还有,我们怎么知道 56%的人气预测对我们掌握的数据不好?
输入虚拟分类器(dun dunnnn…)
为了能够真正理解并改进我们模型的性能,我们首先需要为我们拥有的数据建立一个基线。毕竟,如果我们不知道我们的模型相对于基线表现如何,我们如何改进它呢?
“如果你不能衡量它,你就不能改进它”——开尔文爵士
这就是为什么建立一个基线模型,我们可以比较我们的模型的性能是如此重要,这就是虚拟分类器发挥作用的地方。
什么是虚拟分类器?
伪分类器就像它听起来的那样!它是一个分类器模型,无需尝试在数据中寻找模式即可做出预测。默认模型本质上是查看哪个标签在训练数据集中出现频率最高,并基于该标签进行预测。但是,在我们继续构建虚拟分类器之前,我们需要知道如何将手头的模型与虚拟分类器进行比较。
那么,我如何比较我的模型和虚拟分类器呢?
我们可以查看许多指标和图像来比较我们的模型与基线模型的性能。其中一个指标是准确性得分,这是我们之前兴奋不已的 93.7%。
精度= TP+TN / (TP+FP+TN+FN)
其他指标包括精确度、召回率和 f1 分数:
精度= TP/(TP+FP)
回忆= TP/(TP+FN)
F1 = 2(召回率*精度)/(召回率+精度)*
一般来说,您使用哪个分数取决于您试图回答的问题和您正在处理的数据类型。在这个预测歌曲流行度的例子中,我们主要关心正确识别流行歌曲,因此回忆分数变得更加重要。有关指标的更多信息,请参考此文章。所有这些指标及其组合平均值可从 sklearn 的分类报告中获得:
from sklearn.metrics import classification_report
等等,你提到了视觉效果,但我看到的都是分数。你说的是混淆矩阵吗?
是的。你可以使用的最容易理解的视觉效果之一(我推荐你使用)是混淆矩阵。
图片由 memegenerator.net 提供
混淆矩阵显示矩阵上模型预测的真阳性(TPs)、假阳性(FPs)、真阴性(TNs)和假阴性(FNs)的原始计数或百分比(您可以根据自己的喜好更改下面的 normalize 参数)。你可以使用 scikit-learn 的 plot_confusion_matrix 来创建这个视觉效果。这是我们初始模型的混淆矩阵:
正如我上面提到的,在这里我们可以看到,模型在 99%的时间里正确预测了不受欢迎的歌曲(TNs,左上象限),但对流行歌曲(TPs,右下象限)的预测为 56%。
现在我们知道了如何通过使用不同的度量和混淆矩阵来比较我们的模型和虚拟分类器,让我们构建一个虚拟分类器。
from sklearn.dummy import DummyClassifier
from sklearn.metrics import plot_confusion_matrixclf_dummy = DummyClassifier(random_state=42)
#establishing random_state for reproducibilityclf_dummy.fit(X_train, y_train)
y_pred = clf_dummy.predict(X_test)
plot_confusion_matrix(estimator=clf_dummy, X=X_test, y_true=y_test,
normalize=’true’, cmap=’Blues’)
好吧,我们的虚拟分类器似乎把我们的大部分数据归类为不受欢迎的。让我们看一下我们的数据的 value_counts,看看我们是否能找出为什么会出现这种情况。
y_train.value_counts(normalize=True)#0 0.885503
#1 0.114497
#Name: is_popular, dtype: float64
啊哈!在我们的数据集中,冷门歌曲比流行歌曲多得多,所以虚拟分类器预测冷门歌曲比流行歌曲多。
这解释了为什么我们的随机森林分类器在正确识别不受欢迎的歌曲方面如此出色,但在识别流行歌曲方面却不太成功,而这正是我们最终要做的。
那么,我们能做些什么来解决这个问题呢?
Elena Mozhvilo 在 Unsplash 上的照片
出击救援!这个问题被称为“类不平衡问题”,解决这个问题的一种方法是使用 SMOTE 进行过采样。本质上,我们使用 SMOTE 创建与实际数据相似的合成样本来均衡我们的类。但是,因为我们的数据集中有分类列,所以使用 SMOTENC 会产生更好的结果。
from imblearn.over_sampling import SMOTE, SMOTENCsm = SMOTENC(categorical_features=cat_cols, random_state=42)
X_train_sm, y_train_sm = sm.fit_resample(X_train, y_train)
y_train_sm.value_counts(normalize=True)#1 0.5
#0 0.5
#Name: is_popular, dtype: float64
阶级失衡根除了,现在怎么办?
完美!既然我们已经解决了类不平衡问题,让我们更新我们的虚拟分类器和随机森林分类器。更新虚拟分类器是必要的,因为我们使用它作为基线;它需要基于与我们所有其他模型相同的精确数据。
#updating Dummy Classifier with SMOTE’d data
clf_dummy_sm = DummyClassifier(random_state=42)
clf_dummy_sm.fit(X_train_sm, y_train_sm)
y_pred = clf_dummy_sm.predict(X_test)#fitting RF Classifier to SMOTE’d data
clf_rf = RandomForestClassifier(random_state=42)
clf_rf.fit(X_train_sm, y_train_sm)
y_pred = clf_rf.predict(X_test)
现在,由于虚拟分类器,我们可以真正解释我们的模型的性能。这是并排的新混淆矩阵(左:虚拟分类器,右:随机森林)。
类别不平衡后虚拟分类器(左)和随机森林(右)的混淆矩阵用 SMOTENC 解决。
我们可以看到,与虚拟分类器相比,随机森林模型在预测不受欢迎的歌曲方面表现出 48%的优势,在预测流行歌曲方面表现出 8%的优势。似乎我们的随机森林模型过度拟合了(哈!有什么新鲜事?).
但是,嘿,回去享受你的早晨吧;您可以调整您的随机森林模型,并在以后尝试一些其他模型!
如果你想查看我在这里作为例子使用的歌曲人气预测项目,你可以在GitHub上查看。
为什么要用 Docker 容器进行机器学习?
解决“Tt 在我的机器上工作”的问题
Annamária Borsos 摄影
首先:微服务
在谈论容器化之前,首先要理解微服务的概念。如果一个大的应用程序被分解成更小的服务,那么这些服务或小进程中的每一个都可以被称为微服务,它们通过网络相互通信。微服务方法与难以扩展的整体方法相反。如果一个特定的特性出现了一些问题或崩溃,所有其他的特性也会遇到同样的问题。另一个例子是,当对特定功能的需求严重增加时,我们被迫增加资源,例如不仅用于该特定功能而且用于整个应用程序的硬件,从而产生不必要的额外成本。如果采用微服务方法,将应用程序分解成一组更小的服务,那么这个成本可以降到最低。应用程序的每项服务或功能都是以某种方式隔离的,我们可以在不影响其他应用程序功能的情况下进行扩展或更新。为了将机器学习投入生产,让我们考虑应用程序需要分解为更小的微服务,如摄取、准备、组合、分离、训练、评估、推理、后处理和监控。
集装箱化
微服务架构也有它的缺点。当您在一台服务器上开发您的机器学习应用程序时,您将需要与包含依赖关系的微服务相同数量的虚拟机(VM)。每个虚拟机将需要一个操作系统、库和二进制文件,并消耗更多的硬件资源,如处理器、内存和磁盘空间,即使微服务没有真正运行。这就是码头工人进来的原因。如果一个容器没有运行,剩余的资源将成为共享资源,可供其他容器访问。您不需要在容器中添加操作系统。让我们考虑一个由应用程序 1 和应用程序 2(分别为。APP 1 和 APP 2)。如果您想要横向扩展 APP 1 或添加其他应用程序,如下面的方案所示,您可能会受到可用资源的限制,只能使用虚拟机而不是容器。如果你决定向外扩展,只有 APP1 而不是 APP 2(只保留一个),APP 2 将成为所有容器进程的共享。
虚拟机与容器化(作者图片)
Docker 和机器学习:解决“它在我的机器上工作。”
创建一个在我们的计算机上工作的机器学习模型并不复杂。但是,当您与想要大规模使用该模型的客户合作时,这种模型可以在全球所有类型的服务器上扩展和运行,这就更具挑战性了。开发完模型后,它可能在您的笔记本电脑或服务器上运行得很好,但在其他系统上就不太好了,比如当您将模型转移到生产阶段或其他服务器时。许多事情都可能发生,如性能问题、应用程序崩溃或没有得到很好的优化。另一个具有挑战性的情况是,我们的机器学习模型当然可以用 python 等单一编程语言编写,但应用程序肯定需要与用其他编程语言编写的其他应用程序进行交互,以进行数据摄取、数据准备、前端等。Docker 允许更好地管理所有这些交互,因为每个微服务可以用不同的语言编写,允许可伸缩性和独立服务的轻松添加或删除。Docker 带来了可复制性、可移植性、易部署性、粒度更新性、轻便性和简单性。
当一个模型准备好了,数据科学家的焦虑是这个模型不能再现真实生活的结果,或者当工作与队友分享时。有时,这不是因为模型,而是因为需要复制整个堆栈。Docker 允许在任何地方轻松复制用于训练和运行机器学习模型的工作环境。Docker 允许将代码和依赖项打包到容器中,这些容器可以移植到不同的服务器上,即使是不同的硬件或操作系统。训练模型可以在本地机器上开发,并且可以通过额外的资源(如 GPU、更多内存或强大的 CPU)轻松移植到外部集群。通过将模型封装到容器中的 API 中,并使用 OpenShift(一个 Kubernetes 发行版)之类的技术部署容器,可以很容易地将模型部署到全球。这种简单性也是支持机器学习应用容器化的一个很好的论据,因为我们可以使用模板自动创建容器,并访问包含现有用户贡献容器的开源注册表。Docker 允许开发人员跟踪容器映像的不同版本,检查谁用什么构建了一个版本,并回滚到以前的版本。最后,另一个论点是,即使它的一个服务正在更新、修复或关闭,你的机器学习应用程序也可以继续运行。例如,如果您需要更新嵌入在整个解决方案中的输出消息,就没有必要更新整个应用程序并干扰其他服务。
来源
https://www.ibm.com/cloud/learn/docker
为什么数据工程在数据科学之前不流行?
推动数据工程成为焦点的力量分析
当我在研究数据科学的前景时,我发现了一个有趣的发现:数据工程现在比数据科学发展得更快,这可能会造成数据工程师的大量短缺。这让我开始思考。这对整个 data domain 意味着什么?这是好事吗?为什么现在发生了?
在很大程度上,数据工程是数据科学的上游。数据工程师构建数据仓库和数据管道的工作使数据分析师、数据科学家和机器学习工程师能够构建模型并从数据中获得洞察力。为什么这个应该先于数据科学的领域在数据科学越来越受欢迎之后变得越来越受欢迎?
在这篇文章中,我提供了我对这些问题的看法,并给出了我对在可预见的未来你应该成为数据工程师还是数据科学家的想法。如果你认为数据工程是适合你的职业,我也给你一些数据工程资源(来自真正的专家)。
如果您喜欢视频格式,请在此观看:
问题
不管是好是坏,世界并不总是线性运转的。数据科学变得很性感,因为许多顶尖的科技公司都在用它赚钱。非科技公司看到了数据科学和机器学习提供的价值,他们很快跟进。
不幸的是,对于许多追随这一趋势的公司来说,他们没有数据基础设施来恰当地利用数据科学家。他们招聘的许多数据科学职位最终都涉及到数据工程工作,而他们并不一定是这方面的专家。我个人认为这个错误给这些公司造成了数百万甚至数十亿美元的损失。这也导致了市场上关于数据科学家做什么的许多困惑(这是另一篇文章的主题)。
顶级科技公司在描述他们的机器学习模型的成功时忽略了一点,**他们已经建立了支持数据科学的基础设施。**多年来,他们的员工中一直有数据工程师或类似的角色,有时甚至从公司成立之初就有,以确保数据可以被复杂的工具利用。
这并不是说顶级科技公司只是在更早的时候雇佣了这些角色,他们也是在考虑数据和可扩展性的情况下建立业务的。他们花了大量时间预先考虑如何存储他们的数据,并使其长期对他们有用。这是许多大型科技公司普遍存在的一个主题。他们建立系统在他们特定的商业环境中为他们工作。
例如,脸书、谷歌、微软和相当多的其他巨头都有自己的内部使用的机器学习工具套件。你认为他们没有独特的方法来管理他们收集的大量数据吗?对于这些技术公司中的大多数来说,如果他们不能一致地监控他们的数据,他们的业务根本就不会运转。
校正
这些大型科技企业很早就雇佣了数据工程师,但他们那些不太懂技术的同行呢?
我认为,数据工程的受欢迎程度大幅上升,是因为这些不太注重技术的公司意识到他们犯了一个巨大的错误。在雇用所有这些数据科学家之前,他们需要雇人来修复他们的数据。与尖端科技公司和初创公司不同,大多数其他公司都没有明确设计成规模化。他们需要大量的帮助来升级他们的数据基础设施,使其可用于分析、机器学习,并最终用于人工智能。
可以想象,这不是一个小任务。数据工程的繁荣是对公司在意识到他们还没有准备好之前就直接加入数据科学潮流的一种纠正(如果你对你的公司是否准备好数据科学感兴趣,你可以看看我的视频,数据科学采用的 5 个阶段)。
这是什么意思?
那么,我对此的看法是积极的、消极的还是矛盾的呢?
我个人认为这对数据科学和 AI 的未来非常好。拥有更好数据的公司可以构建清晰的基础设施,专注于构建有用的模型,而不是临时任务。在我看来,这可能是真正的数据科学或人工智能革命的跳板。
这也有助于进一步明确该领域的角色。数据科学家是该领域许多角色的统称。更清晰地区分他们的工作和数据工程师的工作,为公司和求职者消除了模糊性。
最重要的是,这向我表明,在可预见的未来,数据科学将变得更加流行。同样,如果公司在数据科学家的上游管道上投入如此巨大,当他们最终将现有的数据基础设施置于一个好位置时,对数据科学家、机器学习工程师和人工智能研究人员的需求会有多大?
为什么是现在?
需要说明的是,对于许多公司来说,数据工程师并不是一个全新的角色。他们被称为数据架构师、ETL 开发人员、数据库开发人员,甚至 SQL 开发人员。那么,为什么现在会特别流行呢?
老实说,这些都只是猜测,但我认为有几个因素相当重要:
- 数据科学已经腾飞了这么多。许多公司已经有足够的时间来组建完整的数据科学团队。公司也有足够的时间意识到,这些团队没有创造出预期的价值,因为他们缺乏高质量的数据。
- 雪花和其他几家大公司已经公开了重点明确的数据项目。其他公司正在意识到市场对数据相关项目的重视程度。
- 很难不自私地对待最后一个问题,但我认为数据社区正在强调高质量数据的重要性。我在 LinkedIn 上看到过很棒的谈论这个的帖子,我看到过信息化的视频和文章(比如这篇叫做,为什么数据工程现在很流行?,还有这个类似主题的 Reddit 帖子,我也有不少伟大的嘉宾在我的播客上讨论这些事情。我认为,疫情鼓励人们在 LinkedIn 这样的平台上发表更多意见,这真的有助于传播关于数据质量的观点。
你应该成为一名数据工程师吗?
既然我在这篇文章中谈论了这么多数据工程的价值,那么一个问题可能会自然而然地出现,你应该成为一名数据工程师吗?你甚至应该考虑这一点,而不是作为一名数据科学家吗?
老实说,这真的取决于你的兴趣和能力。首先,您应该探索 data domain 中不同角色之间的差异。我的视频(由一位数据科学家讲解的)不同的数据科学角色,应该会给你一些这方面的额外信息。
毫无疑问,我认为对大多数人来说,现在获得一个数据工程的职位比获得一个数据科学的职位更容易。如果你觉得你会喜欢它,那么尽一切办法去做吧。从我的角度来看,大多数数据工程角色比其他数据角色有更多的结构和更清晰的期望。数据工程仍然有许多分析成分,但是,顾名思义,与软件工程相比,数据分析和数据科学确实有更多的相似之处。
尽管如此,从数据工程师到数据科学家肯定是可行的,特别是如果你发现你更喜欢模型构建和探索活动。这是我的朋友 Sundas Khalid 在她的旅程中做的一个视频,名为为什么我离开数据工程进入数据科学。
我不是数据工程师,所以对我的想法有所保留。对于那些有兴趣了解这个职业的人,这里有一个来自西雅图数据工程师的视频,关于如何进入数据工程,名为数据工程路线图——如何快速学习数据工程(由 FAANG 数据工程师制作)。
我希望这篇文章能帮助您更好地理解数据环境,尤其是当它与数据工程相关时。如果您喜欢这篇文章,记得在 Medium 上关注我以获取更多类似的内容,并且注册我的简讯以获得我的内容创作和数据科学行业其他学习资源的每周更新!
下次再见,祝您的数据科学之旅好运!
肯
为什么我们永远发展不了 AGI
以及为什么我们仍然会
约书亚·索蒂诺在 Unsplash 上拍摄的照片
如果你还没有听说人类对实现强大人工智能(或最近被称为 AGI)的巨大追求,你一定是生活在岩石下。每天,我们都被宣布人工智能研究取得最新突破的新闻轰炸,我们被告知超级智能机器的时代即将到来。像 DeepMind 和 OpenAI 这样的公司正在努力使这一追求成为现实,像 Elon Musk 或 Max Tegmark 这样的人担心人工智能会使人类灭绝(幸运的是,到那时我们可能会逃到火星)。
有些人甚至不同意强人工智能在理论上的可实现性。有些人甚至说,人类和我们能制造的任何机器之间有一个根本的区别,无论我们如何努力,总会有一些领域人类会更胜一筹。
在这篇文章中,我将提出这些人用来破坏 AGI 发展的五个主要论点,并对这些论点提出反驳。
由于哥德尔的不完全性定理,人工智能可能从根本上受到限制
我们的第一个论点是一个老论点:事实上,它最早是在 1961 年由已故哲学家 J. R .卢卡斯提出的。潜在地,它甚至比那更古老,可能起源于杰出的奥地利数学家库尔特·哥德尔。
这一论点最重要的部分是哥德尔的不完全性定理,这就是为什么我将尝试解释它们。原则上,通过公理化数学思维,哥德尔表明,在任何足够强大的形式(公理化)算术系统 F 中,F 中有不能在 F 中被证明或被证伪的陈述,即该系统是不完整的。这意味着给定数论和命题逻辑(形式系统 F)的任何公理,都不可能构造一台输出 F 的所有定理的计算机。哥德尔展示这一点的方式基本上是首先假定一个算术形式系统,然后在这个形式系统中构造一个特殊的句子(恰当地称为哥德尔句子 G )来表达 F 中的这个陈述:
哥德尔句 G:“我不是 f 的定理”
这是一个自我指称的陈述,感觉有些自相矛盾:这个句子暗示了它自己的非定理性。它显然不可能是 F 的一个定理,因为如果它是,它将导致一个矛盾。不幸的是,如果它不是一个定理,那么 F 就是不完全的,因为完全性要求对于 F 的所有陈述,要么陈述本身要么它的否定是一个定理。如果 G 不是 F 的一个定理,那么它表达了一个不能用 F 证明的真陈述。
不完备性定理也是以下述方式循环的:我们可能把 G 作为附加公理加到 F 上,试图“塞住漏洞”,使系统完备。不幸的是,由于与之前完全相同的论证,这一点失败了:我们再次构造了另一个哥德尔句子 G’:
哥德尔句 G ':“我不是 F+G 的定理。”
即使我们能够在一个单一的句法表达式中捕获所有这些哥德尔句子,比如说来自一类表达式 Gω的任何 G,我们仍然能够构造另一个哥德尔句子 Gω+1 等等。等等。可以想象,序数中的下一个将是 2Gω,然后是 Gω ** 2 等等。因此,无论我们如何努力,这个系统将永远是不完整的。而且,没有算法可以进行这种“哥德化”。
这样一来,我们现在可以提出卢卡斯论点了。大致是这样的:
既然 AGI 必须能够完成人类能完成的任何智力任务,它也必须能像我们一样完成哥德尔魔术。然而,如果一台机器是纯计算性的,它必须在某种正式的系统中运行,因此它不能检测自己的不完整性。另一方面,我们人类可以“在系统之外”思考,并像哥德尔一样认识到它的缺陷。所以,头脑简直比任何机器都强大,无论多快多强。
虽然这一论点主要适用于昨天的人工智能系统,这些系统基于一阶逻辑,大致像定理证明器一样工作,但它也可以同样适用于当前的神经网络式人工智能,因为它必须嵌入到某种图灵机中,因此必须像任何计算系统一样受到限制。
另一方面,我认为同样的论点也适用于人类!虽然乍一看我们似乎能够逃脱哥德式的陷阱,但我强烈怀疑我们能否无限期地这样做。毕竟,即使是序数命名系统在有限的步骤之后也会崩溃。如上所述,我们有ω,2ω,ω2,ωω,ωωω,…,但在某些时候,我们没有进一步的命名方案,我们遇到了问题。没有一个单一的方案来命名所有的序数。
没有递归相关的符号系统给每一个建设性的序数命名。
-阿隆佐·邱奇&斯蒂芬·克莱尼
作为一个更实际的说明,我认为我们每天都无法走出我们的“正式系统”,例如我们思考出生和死亡的方式。既然我们被困在这个空间和这个时间,我们就不可能想象自己已经死了。直觉上,我们可能意识到宇宙即使在我们死后也会存在,但我们很难想象。
我们更难想象没有任何空间或时间。在这种情况下,我们的直觉完全失灵了。也许这就是为什么我们不能到达物质现实的底部的原因。既然我们根植于其中,我们就没有办法从外部感知它。然而,这并没有对 AGI 的发展构成重大威胁,因为如果 AGI 有和我们一样的基础(物理现实),它最终会受到同样机制的限制。因此,如果没有其他证据表明我们的思想具有超凡脱俗的力量,我想我们可以放心地驳回这个论点。
人类意识不是算法
https://www.amazon.com/Emperors-New-Mind-Concerning-Computers/dp/0192861980
这个论点基本上是前一个论点的延续,扩展到适应我们最近的发现,并通过关于我们意识机制和假设物理学的假设得到加强。它最初是由最近的诺贝尔奖获得者罗杰·彭罗斯表达的。在他的书《皇帝的新思想》中,他认为人类意识不能被任何图灵机建模,因此也不能被今天已知的任何计算机建模,因为它从根本上是基于量子力学,更具体地说是量子引力。假设是真核细胞中被称为微管的微小结构小到足以展示量子行为,因此它们可能是大脑推理能力的来源。例如,微管可以处于不同状态的量子叠加状态,它们甚至可以与其他微管纠缠在一起,可能将量子状态传播到整个人脑。这并不意味着大脑是一台量子计算机。实际上,彭罗斯声称大脑不仅仅是量子计算机。为什么?因为即使量子计算机能够在多项式时间内解决 NP 完全问题(顺便说一句,该假设似乎是错误的,尽管它尚未被证明),它也永远无法解决无法计算的问题,而这正是彭罗斯声称大脑能够做到的。
术语“不可计算的函数”源自 Alan Turing,他将哥德尔的数学理论应用于计算,并提出了著名的停止问题。停机问题询问给定的计算机程序在给定特定输入的情况下是否最终会停止或无限期运行。图灵已经表明,一般来说,没有算法可以解决这个问题或任何可简化为停机问题的问题。这个论点是循环的,就像哥德尔的论点一样:即使你有一个解决停机问题的神谕(一个可以免费为你解决问题的神奇机器),总会有另一个与你的有神谕的新机器有关的停机问题。
因此,彭罗斯的论点甚至比乍看起来更有力:由于不可计算性的循环性质,根据该理论,大脑不仅优于任何图灵机,而且优于任何图灵机和任何可能存在的神谕。
所有这一切都意味着,我们永远不能指望建立一个像人类思维一样有能力的人工智能,因为我们知道的机器只能通过算法解决问题。
老实说,作为一个人,知道我们有办法克服甚至无法计算的问题,因此我们的思维在某种程度上是在系统之外的,这种感觉会很好。然而不幸的是,我认为不可计算性的论点适用于人类,就像卢卡斯的论点一样:在某个时刻,我们的理解会崩溃。对于我们这些凡人来说,这一点可能来得更早,对于彭罗斯或哥德尔这样的天才来说,这一点可能来得更晚,但它不可避免地会出现。
让我也提一下微管的理论有一个固有的缺陷:物理学家 Max Tegmark 指出微管太大了,以至于不能展示量子力学效应:它们在仅仅 10e-13s 后就会发生退相干(量子信息的丢失)。虽然这些时间后来被其他人修正为 10 到 100 微秒,但仍然太快了。当然,这并没有完全排除彭罗斯的理论:大脑中可能还有其他更小的结构能够进行量子计算。
对彭罗斯理论的另一个批评是争论性的:使用物理学、神经科学或生物学尚不知道的效应有点太模糊,无助于证伪主张。这些主张似乎是人为构建的,因此目前我们无法指望用经验来证明或反驳它们。从科学的角度来看,不可证伪的理论是无用的。
人工智能必须在世界上行动,以获得人类拥有的知识和思维
一个流行的理论认为,我们人类由于所处的特定环境而进化出了高级思维能力。根据哲学家 Hubert Dreyfus 的说法,没有身体的计算机根本无法获得智能,因为人类的大部分知识都是隐性的。它不能通过读书来学习,而必须通过模仿擅长某项技能的老师来获得。对德雷福斯来说,遵循规则(无论是编程的还是学习的)是最低级的能力。最高层次,专家表现,是隐性知识,即使是经常练习的专家也不能轻易解释。例如,你当然知道如何走路。然而,如果你试图向某人解释你是如何做的,那将是非常困难的。
与此相关的另一个问题是,因为计算机没有身体,也不与世界互动,它们不理解因果关系,也没有简单的方法让它们获得因果关系。处理反事实和回答因果问题是我们人类拥有一般智能的先决条件。
对我来说,这个论点似乎有一定的正确性,因为与世界互动是我们人类学习的主要方式之一。另一方面,我不确定这样说是否公平,因为我们不能解释我们获得的隐性知识,它不能被计算机学习。在我看来,这更多的是关于有意识和无意识知识的争论。虽然有意识的知识位于层次的“顶端”并使我们感知它,但无意识的知识是自动的,不能被体验。因此,我们也很难解释它。
举个例子,再考虑一下步行。当你小的时候,你试着走路,那是非常困难的。你必须有意识地思考你脚的每一个小动作。然而,随着你的技能增加,你慢慢忘记了个别的小动作,因为知识慢慢变得无意识。这是一件好事,因为有意识的感知能力肯定非常有限。同样的过程也可能发生在 AGI。首先,AGI 将获得技能,它将不得不“思考”每一小步。随后,这种技能将被添加到“无意识记忆”中,或者被硬编码到子神经网络中,调整这种硬编码程序的能力将变得更加有限,而执行能力将会提高。
关于因果关系,人们普遍承认它是人工智能所必需的(例如,见https://spectrum . IEEE . org/tech-talk/artificial-intelligence/machine-learning/understanding-causality-is-the next-challenge-for-machine-learning),并且有人试图将其纳入当前的模型中(https://syncedreview . com/2020/10/29/deep mind-introduces-algorithms-for-causage-reason-in-probability-trees/)。
人工智能可能永远不会达到自我提高的程度
最近,AGI 的大部分讨论都围绕着一个观点,即奇点类型的事件导致自我发展的人工智能系统在没有任何进一步人类干预的情况下以失控的方式发展,导致它在几天甚至几小时内变得超级智能,达到人类水平的智能。这个理论是基于指数增长的概念:一旦有一个人工智能具有人类水平的智能,并且这个人工智能可以稍微改进自己,进化的人工智能将再次稍微改进自己,以此类推,直到我们拥有远远优于任何人类的超级智能。在某种程度上,自我完善的人工智能假说模拟了我们自己的生物进化,只是在更小的时间范围内。因为与我们不同,人工智能应该也有能力改进它的硬件(我们还不能通过技术显著地改进我们的大脑),这个过程将更加强大。
然而,这个故事的问题是,我们实际上并没有成功构建任何自我改进的人工智能。今天的机器学习算法能够在一定程度上修改自己,例如一次性学习算法,但它远没有达到人类发展的水平。遗传算法可能能够通过类似于生物生命的机制进行自我改进,但它们通常需要人类进行大量的微调才能正确工作。另一方面,自我改进的人工智能最初只需要新生儿的智力,并可以从那时起发展到任何需要的智力水平。
然而,已经有了一种理论上的方法来开发自我完善的人工智能。它被称为哥德尔机器(哥德尔又来了),由于尔根·施密德胡伯发明。哥德尔机器是一个假设的计算机程序,每当它为当前任务找到一个更好的策略时,它就使用一个递归策略来自我改进。机器具有定义的输入和输出,并试图最大化效用函数,这可能取决于机器的状态和输入(环境)。这台机器被证明是最优的,尽管它受到限制,即它需要设定非常具体的目标,不像人类那样,在生活中似乎没有任何大的预定义目标。
我们可能永远不会承认人工智能是智能的
最后但同样重要的是,我向你们提出一个论点,不是反对发展 AGI 的可能性,而是反对我们认识这一伟大壮举的能力。
这场争论与人工智能定义的模糊性密切相关。因为我们并不真正知道我们在寻找什么,所以可能我们永远无法实现它,或者更糟糕的是,我们永远无法意识到我们已经实现了。
如果我们能精确地定义智力,我们也许能发现更多关于我们自己的智力,我们不仅能量化其他生物的智力,也能量化无生命物体的智力。那样的话,在某个确定的时刻,我们可以说我们已经构建了一个和我们的智能大致相当的人工智能。现在,我们正在来回讨论智力的本质,我们还没有真正得出一个明确的答案。
由于定义如此不精确,我们会遇到“移动门柱”的危险。让我引用一篇来自 MindHacks 的关于马文·明斯基的批评文章:
[马文·明斯基]对人工智能认知中的“移动门柱”问题做了一个简单的评论,这掩盖了人们如何看待人工智能的大部分问题。
就人工智能的历史发展而言,我当然觉得这是一个有效的论点。让我给你举几个例子,人们期望从人工智能中得到的东西,最终都被开发出来了,但是从来没有让社区满意过:
“机器永远不会下棋。”(IBM 深蓝在 1997 年击败了加里·卡斯帕罗夫)。
“机器可以下棋,但它完全是机械的.”(DeepMind AlphaZero 不仅击败了人类棋手,还击败了使用直观方法下棋的最佳国际象棋引擎)。
“机器永远不会翻译。”(Google Translate 支持 109 种语言,可以在它们之间进行高准确率的翻译)。
“机器永远也不可能驱动汽车。”(尽管就全自动驾驶汽车而言,我们仍未达到这一水平,但人工智能可以说在通常的道路场景中比人类驾驶得更好)。
当然,仍然有一些领域人类比机器更好,但它们越来越少了。我们人类似乎还剩下两个主要优势:
- 我们可以同时完成所有这些任务。人工智能可以完成一些特定的任务,但它还不能适应一个全新的任务。
- 我们知道自己在做什么。可以说,就智力而言,这算不上什么优势,但它赋予了我们机器还不具备的品质,比如移情和情感。
我想说,如果第一个问题解决了,我们可以确信我们已经实现了 AGI,因为一个能够适应新任务并有效解决它们的智能机器不一定也需要完成第二个问题。此外,我觉得第二点(意识)是一个更难解决的问题,甚至在我们开发出 AGI 后的一段时间内也可能无法解决。
结论
最终,我认为我们将能够开发出强大的人工智能,尽管这可能不是在我们有生之年。此外,我们甚至可能不知道我们实现了这一非凡的壮举,要么是因为人工智能的本质与我们太不一样,要么是因为人工智能可能真的太聪明了,以至于我们不知道。据我们所知,这可能已经发生了…
无论如何,即使我们对实现 AGI 没有那么大的把握,我们仍然应该花一些精力研究和评估这种可能性会带来的风险,并思考我们如何处理任何潜在的负面后果。它可能会拯救我们的文明。
为什么我们可能以错误的方式看待大脑
…对人工智能有重要影响
大脑试图从概念的角度来理解世界,其中大部分是用语言,在某些情况下是用数学来表达的。
但我们对世界的概念理解遭遇了一个先有鸡还是先有蛋的问题:这种理解所依据的概念首先来自哪里?你如何用旧的术语建立一个新的理论,并确保它不会受到术语中固有的隐含假设的影响?
洛克、休谟和贝克莱周围的 18 世纪经验主义者仍然对现代科学的思维方式和思考方式施加着强大的影响。根据经验主义,世界是一个等待被发现的客观地方。我们的传感器找到这种客观现实的真实描述,并用概念和抽象的语言表达出来。但是这真的抓住了我们大脑的运作方式吗?
哲学是通过语言与我们智力的蛊惑进行的战斗。
路德维希·维特斯坦根
公共领域。
认知神经科学是一个相对年轻的领域,但它所依赖的许多术语都非常古老,其中一些可以追溯到古希腊。19 世纪的伪科学学派 颅相学 表明了类似的研究大脑的方法是多么危险。 颅相学 描述了不同的大脑区域负责不同的专门任务的想法,因此左上方的一部分负责编织,而右下方的一部分写诗(见图)。
这听起来像是伪科学,但有些人认为现代认知神经科学是在一个不同的、更微妙的层面上实践“新颅相学”,该领域中许多最受欢迎的概念,如注意力、记忆、推理或想象,可以追溯到 19 世纪有影响力的美国心理学家威廉·詹姆斯,如果不是在他之前的思想家的话。我们仍然在寻找大脑中概念的特定功能和算法实现 在任何人对大脑实际上如何工作有丝毫线索之前很久就被发明出来了 。
大卫·马尔的范式 概括了这一点,即我们首先从信息处理的角度考虑一个函数,然后寻找一个算法,然后找到完成该工作的算法的神经实现 (然而,我不想在这里误导任何人,因此必须指出,计算神经科学之父之一的马尔一直强调所有三个组成部分之间的相互作用,并从解剖学层面开始了他的职业生涯)。
尽管如此,这种观点在该领域仍然具有广泛的影响力,相应地,我们仍然大多认为大脑是从 外到 的:这与 冯·诺依曼的 隐喻大脑是一个信息处理器密切相关。我们认为大脑是一台计算机,它处理感官输入,并根据计算后获得的洞察力采取行动。
但是正如神经学家 捷尔吉·布扎基 在他的巨著 中所主张的,大脑从里到外 ,这一观点至少可以说是有局限性的。本文的其余部分将基于s书中的观点,探索这种观点如何影响神经科学和人工智能,当前的观点如何不足以捕捉大脑实际在做什么,以及远离它如何可以帮助我们更好地了解大脑。**
赢的事情都做了;快乐的灵魂在于行动。
特洛伊罗斯和克瑞西达,第一幕,第一场
输入对我们来说是如何获得意义的?我们如何确定我们感知的事物对我们是否重要?
buzáki 的答案非常简单:以对有机体有意义的方式将输入结合在一起的唯一方法是通过行动。 行动在意义上奠基我们的感官 。生物体对感觉输入做出反应的能力是这种生物体首先发展出传感器的唯一原因。大脑不关心客观世界的真相,只关心帮助它满足需求的信息。大脑不仅处理和权衡证据,而且积极探索。没有行动就没有感知,感知往往是一个主动的过程,无论是嗅嗅、头部运动、回声定位还是微扫视。
儿童最初通过随意踢来了解他们身体的物理特性,并通过无意义的牙牙学语开始了解他们说话的运动技能,这些无意义的牙牙学语包含了人类嘴巴能够发出的所有音节。他们采取行动,当他们的行为通过父母的鼓励性反馈或踢椅子的痛苦反馈与世界上的结果联系在一起时,他们的行动就会以一种有意义的方式扎根。
甚至可以说,科学只是随着实验者的进步,扮演了世界的主动操纵者的角色,才真正开始的。伽利略就是一个很好的例子,他从比萨斜塔投掷物体来探索重力的奥秘。
亚历克斯·瓦西在 Unsplash 上的照片
相应地,一个有机体能够行动的 速度 决定了其感知的 相关时标 :当你不能足够快地行动时,了解某事是没有意义的,这正是我们在自然界观察到的。树木不能移动,所以用扫视的眼睛实时捕捉周围环境是没有意义的。我们的肌肉速度与我们的认知速度密切相关,有一个进化的论点认为肌肉速度是限制因素。
Buzsáki 声称,这里可以为神经科学得出一些基本结论,挑战所谓的以表征为中心的范式:不要问某个神经元或神经元组合计算什么以及这种计算代表什么,我们应该问它做什么。
从务实的角度来看,解决这个问题也很重要。当前的神经科学范式塑造了每天设计和进行实验的方式。在许多研究中,例如在记忆研究中,通常给受试者提供刺激,并在处理这些刺激时记录他们的神经活动。然而,从由内而外的角度来看,仅仅记录这种神经活动是不够的,因为它没有任何依据。
这就像记录一种失落的语言的文字,而罗塞塔石碑并不存在。
根据 buzáki 的说法,大脑的词汇库是由 内部生成的动力序列组成的。单词 可以被认为是神经元集合水平上的序列。 学习不是在暴露于外部刺激的过程中创造新的序列,而是选择哪些预先存在的内部序列需要被补充,以最匹配新的体验 。大脑不是一开始就像一张白纸,而是具有预先存在的、稳定的动力。这些动态序列组成了一个字典,里面充满了最初没有意义的单词, 学习意味着为这些单词创建一个开始有意义的上下文。
在不深入研究神经科学细节的情况下,一个例子是海马体和前额叶皮层之间新记忆的形成(海马体在记忆形成中的强烈参与令人印象深刻表现为海马体损伤的患者显示出完全无法形成新记忆):这里海马体充当序列生成器,新皮层学习挑选出那些与经历相关联的序列的子集,将短期序列(海马体)转化为长期记忆(皮层)。
这里有一个有趣的类似于人工智能中的一些概念。
在人工智能的早期,社区专注于基于符号的方法来构建智能系统:世界的抽象符号表示被硬编码到计算机中,教它们获得关于世界的常识和抽象推理。这是一种非常优秀的由外而内的方法,但事实证明,这根本行不通,部分原因是不可能从抽象的推理表得出任何真实世界的行为。
上面写着:“最初是一个字!”现在我犹豫了!谁来帮我达成一致?
不可能,字这么高的奖,
我必须翻译出来,否则(……)
天助我!我现在明白了我所需要的
并写下保证:在开始是契约! ——歌德、浮士德**
同样,很有可能从抽象开始,向下移动到行动,最终无法解释大脑。
人工智能和由内向外方法之间的另一个有趣的相似之处是以一种称为 储层计算 的神经网络架构的形式存在。油藏计算机由一个输入层、一个隐藏层和一个输出层组成,很像普通的递归神经网络。但是,由于所谓的丢失和爆炸梯度问题,递归神经网络很难通过反向传播进行训练。
规避这些梯度问题的一个聪明的方法是简单地 根本不训练隐藏层,在随机初始化之后保持它固定 。模型 的 库于是构成了一个固定的、非线性的动力系统,包含了大量不同的预先连线的动力序列(你可以把它想象成一群相互交流的神经元)。然后 学习的目的不是从零开始 学习动态,而只是教会网络的输出层 巧妙地将油藏中已经存在的动态匹配到数据中的相关序列 。
请注意与 buzáki 观点的相似之处:根据他的说法,大脑已经通过其预先布线和数十亿神经元在数百万亿个连接中耦合在一起的疯狂组合财富,将大量复杂的非线性动力学带到了桌面上。当我们学习行动时,我们不需要从零开始,而是通过将它们与现实世界中有用的结果相匹配,让它们获得意义。
这也是一种规避神经网络中经常面临的 灾难性遗忘 问题的方法:当学习新的东西时,他们倾向于破坏他们以前学习的能力,即使新任务原则上与旧任务相对相似。从由内而外的大脑的角度来看,如果学习新的东西意味着学习全新的动态,这将破坏旧的动态,但如果这意味着将新学到的东西整合到预先存在的动态模式中,灾难性的遗忘就会自然避免得多。
深度学习中另一个指向类似方向的有趣的最新发展是边缘弹出算法:这种算法不是通过调整权重,而是通过简单地删除对网络性能没有任何意义的连接来训练一个足够大的随机初始化的网络(类似于彩票假设),有效地 发现一个预先配置的子网执行网络任务,而不需要任何训练。
必须指出的是,储层计算近年来已经过时,LSTMs 和 GRUs 等架构是建模顺序数据的更受欢迎的选择。然而,我认为由内向外方法的想法仍然可以为人工智能和机器学习社区提供一些灵感。谁知道呢:类似的架构可能会在未来的某个时候卷土重来。
“强有力的理由产生强有力的行动。”
约翰王,第三幕,第四场
胡安·鲁米姆普努在 Unsplash 上的照片
buzáki 走得更远,认为我们的许多高级推理能力,如思维和认知,最终可以被视为内化的行为。
记忆可以通过世界上的事件被映射到预先存在的动态模式来建立,这些动态模式构成了与其内容最接近的匹配。未来的计划甚至可能被理解为 对反向 行动的片断记忆。
内化行为给人类带来了巨大的进化优势 想象一个假想的未来 。 我们想象中的计划是 假设的行动序列,不需要在现实中表演,而是可以在模拟的世界内部表征中尝试。这允许足够复杂的大脑根据对其后果的 预测 来选择行动,整合过去的经验以及来自环境的感官输入。行动的可能结果变得越复杂,大脑增加的循环和复杂程度就越多,但最终目的是一样的。
抽象思维可能进一步作为空间思维的副产品出现(正如我在关于思维的几何学的文章中更深入地讨论的那样,以及芭芭拉·特沃斯基在她的书《运动中的思维》中论证的那样),并且与海马体和内嗅皮层中物理位置和导航的空间处理有关。
这一点得到了以下事实的支持:前额叶皮层(通常被认为负责所有使我们成为人类的东西)是建立在与运动皮层相似的神经架构上的。虽然初级运动皮层直接投射到脊髓和肌肉,但前额叶皮层却间接投射到边缘系统的大脑区域,如下丘脑、杏仁核和海马,从而作用于我们负责情绪调节的高级大脑区域,而不是直接作用于我们的肌肉。
“我一直认为人们的行为是他们思想的最好诠释者.”
― 约翰洛克
大脑已经变得非常擅长思考和理解现实。但是,如果大脑存在的主要原因是计算积分或炫耀他们的一般知识,他们就不会在这里了。
这就是为什么我认为 Buzsáki 提出了这样一个令人信服的案例:如果我们将大脑视为一个巨大的动态库,其主要目标是通过行动与有意义的经验相匹配,这直接使得大脑在实践中实际上是有用的,这使他的理论植根于进化论。
我们对行动和智力的超脱可能被视为一个世纪以来身体和精神之间笛卡尔式分裂的副产品。现在是时候克服这一概念分歧了,因为行动可能真的是智力的核心。观察神经科学和人工智能的下一次突破是否真的会是行动驱动的,将更强的由内而外的方法整合到它们的中心概念中,这仍然是更加令人兴奋的。
最后一点,我必须强调,在本文的范围内,我不得不省略许多有趣的细节,我只能建议更深入地阅读 buzáki 的书或在 Youtube 上看到他的一个演讲(例如这里或这里)。我最近还在我的播客上和他交谈过,更详细地探讨了他的许多想法(和一些神经科学)。
为什么我们不再将转换率作为主要指标
违反 AB 测试的独立性假设和改变贵公司的主要度量标准的影响
乔纳森·彼得森在 Unsplash 上拍摄的照片
改变任何公司的主要指标都不是一件简单的事情。为什么你会问?原因有很多,但我想到了其中的一些:
- 该公司长期以来一直使用这一指标
- 预测是根据历史值做出的
- 团队 okr 包括反对它的目标
- 人们理解指标和推动指标的杠杆
- 很容易发现与期望值的偏差
- 可以快速确定指标变化的原因
单是这份候选名单就足以让任何人大汗淋漓了!所以想象一下,当我在 Gousto 的第一个月,我们菜单部落的产品负责人建议我们的主要指标,菜单转换率(MCVR)可能是我们在实验中使用的错误指标,因为它违反了统计独立性的假设时,我有多惊讶。
现在用什么侵犯了谁???
当你使用转化率作为实验的衡量标准时,你会有意识地或下意识地这样做,假设你有一个独立观察的样本。
这基本上意味着一个事件的结果对另一个事件的结果没有影响。
例子:想象掷骰子两次。第一轮的结果不会影响第二轮的结果,因此我们可以说这些事件是独立的。
任何一家拥有“粘性”产品的公司,如果其商业模式依赖于客户每周的回访,都有违背这一假设的风险。这不是您可以选择忽略的“最佳实践”类型的决策。用于分析 AB 检验结果的大多数推断性统计检验(如 2 样本 t 检验)的基础是假设观察值相互独立。
也许这还不清楚,或者你认为这对你的测试没有影响。让我向你保证,即使是最轻微的依赖也会导致严重的结果偏差
为什么我们违反了独立的假设(AOI)
我们是一项基于订阅的服务,客户每周都会回来订餐,因此我们很自然地将每周 MCVR 作为我们的主要 KPI。我们没有考虑每日或基于时段的 MCVR,因为大多数客户一周订购一次,所以即使这发生在多个时段,也可以在该周只统计一次。接下来的一周,顾客(有些是新顾客,有些是前一周的顾客)会回来下订单,我们会再次把他们视为独特的顾客。在整个实验过程中,我们会一遍又一遍地这样做,通常是 3-5 周。在实验结束时,我们将对每周独立访客和订单的总数求和,然后除以其他,得出我们的 MCVR*。
*注意:计算 MCVR 的另一种方法是,只取整个实验期间的唯一用户和唯一订单,并将前者除以后者。这种方法也不是没有局限性。虽然观察是独立的,但你忽略了订单频率,但这超出了本文的范围。
起初这似乎是一个合理的方法,如果我们没有一个粘性的产品,并且从第 1 周、第 2 周开始的用户再也看不到(至少在测试期间),这可能是一个合理的方法。但是随着用户一周又一周的回来,我们的观察并不是独立的。为什么你会问?
好吧,想想看——如果我们开发了一个功能或降低了我们的价格或做了其他事情,说服你购买,我们做的那件事,它已经在你身上起作用了,所以一次又一次地计算你将意味着我们对你作为一个数据点的观察是不独立的,我们正在偏向我们的结果。换句话说,客户在某一周做的事情会影响他们在下一周做的事情。我们在 MCVR 的主要 KPI 无效。
这有什么影响,实际上严重吗?
它增加了你的假阳性率,FPR(或 1 型错误率),所以是的,它是严重的!Frequentist 统计已经依赖于接受基于你设置的显著性水平,所有获胜结果的某个百分比将是假的——通常是 5% (α=0.05)。用不独立的观察来运行测试会导致你的 1 型错误率的膨胀。
假阳性率是假设无效(对照)假设为真时拒绝该假设的概率。如果你运行了 100 个显著性水平为 5%的实验,并且有 10 个获胜者。其中 5 个可能是假阳性*。问题是,哪 5 个。概率不是婊子吗!
我知道我们的假阳性率高于我们根据我在别处读到的论文研究而设定的阈值。我只是不知道差了多少。
这是对世界的一种简化的看法,实际上,它们可能都是假阳性,或者都不是,或者介于两者之间。
发现我们真正的假阳性率
如果我们要改变实验的主要指标,我们需要证明这是错误的指标,并且我们正在做出错误的决定。
我们证明这一点的方法是获取一些历史数据,并对其进行 A/A 测试模拟,以显示我们真正的假阳性率是多少。使用一个随机的和最近的数据集,我模拟了 30,000 个 A/A 测试,用于 1,3 和 5 周的“实验”。
对于 1 周的模拟,我预计误报率为 5%,因为我们只计算一次用户(独立的),我将显著性水平设置为 5%。除此之外,我唯一的期望是,我们会看到超过 5%的“成功测试”,因为我们在一次又一次地计算回来的用户。
结果
正如我预期的那样,我们 1 周的假阳性率是 5%,但是我发现我们 3 周测试的假阳性率高达 9%,5 周测试的假阳性率接近 12%(如下图 1 所示)。
把这个放在上下文中。成功测试的行业平均水平在 20–25%之间,这意味着可能有高达 50%的成功测试有可能是假成功,而不是只有 20%。
下面的图 1 开始时有点“起伏不定”,但随着模拟次数的增加,假阳性率开始稳定,我们可以看到,在我们的随机数据集上,即使没有进行任何实验,我们也将找到“赢家”。
图 1:1、3 和 5 周 A/A 测试的假阳性率
有了这个新的世界观,我们开始寻找新的度量标准。
新指标——每用户平均订单数(AOPU)
我之前提到过,我们忽略了订单频率,只关注转化率(不正确的从属版本),所以我们的目标是找到某种类型的混合(复合)指标,来考察独特的转化率和订单频率。我知道这个标准是什么,奥普,我只是需要帮助每个人理解它。接下来是痛苦的几个月,我写了一些关于我们为什么远离皈依的内部文章。新的衡量标准是什么?是怎么算出来的?为什么会更好?TL;我论文的博士版本是:
AOPU =总订单数/独立用户数=转化率 x 订单频率
这一提议的指标允许我们监控转化率和订单频率的灵敏度和变化,而不会违反独立性假设,从而为我们提供一个更全面、统计上更合理的指标。
我们已经成功地使用了 AOPU 将近 8 个月了。会议中的对话、OKRs、分析和实验都是基于这个新的标准。围绕菜单转换的讨论已经成为过去。
这很可能是我一生中做过的最恐怖的作品之一,但我必须承认,这是最有收获的作品之一。
最后的想法
我们不是世界上唯一一家依靠用户一次又一次回来的基于订阅的企业。你甚至不需要订阅模式就能拥有“粘性”产品。超市、亚马逊、Spotify、Slack、网飞等都有定期回头客。无论你的商业模式是什么,如果你有定期回头客,并且你像我们一样关注每日/每周的转换率,对你自己的数据进行一些 A/A 测试,看看你自己的 FPR 是什么样的。谁知道呢,你甚至可能需要改变你自己的主要指标。
你可以在 Twitter 上关注我,或者用最少的努力在 Medium 上关注我和 废话连篇 。
为什么我们必须选择 Kubernetes 气流执行器
在生产环境中部署气流的技巧
尼科沃尔波尔皮克斯拜
首先,我说的是一个坚实的、可扩展的气流基础设施。
如果你需要一点气流,最多 50 个 Dag,最多 2 个开发者建造 Dag。你不需要在意我会说什么,只要用 docker-compose,ec2,或者局部用芹菜来调配你的气流,你就开心了。
以下是我在生产中部署气流的黄金法则:
- 使用头盔进行气流展开
- 创建外部数据库。不要使用 PostgreSQL 容器。
- 在托管云中部署 Kubernetes。
- 使用 Kubernetes 执行程序
在这篇文章中,我将集中在最后一个。
我关心的哪些问题有解决方案:
1 —控制 Kubernetes 集群上的资源(内存、CPU)。
2 —许多开发人员从事不同的项目,并有不同的认可级别。所以他们使用不同的运营商和方式来建立数据管道。
3 —等幂和一致性 Dag
让我们一起去解决问题:
**我们在云端一般会付出什么?**资源(内存、CPU)
因此,当有人使用 PythonOperator 创建一个包含许多任务的 DAG 来构建数据框时。您知道这个 DAG 使用了多少内存和 CPU 吗?如果你正在处理芹菜,那就复杂了,因为我们在同一个 worker 中运行许多任务。在 Kubernetes 中,每项工作都是一个 pod,因此您需要预先设置工人资源,这是一个问题,因为我们有多个任务需要不同的资源。
然后,最好使用 Kubernetes executor 和 REQUIRE 当有人编写 DAG 时,他们必须设置资源。这样,每个任务都是 Kubernetes 上的一个 pod,具有不同的请求资源。
请看这个简单的示例(您可以在气流默认示例中找到更多信息):
酷,所以你问我:我怎么能强迫某人设置资源?当然是利用你的说服力。不,这可以工作,但您可以在您的 CI 管道上使用阿德单元测试并进行验证。这个比第一个选项容易=)。
现在,有人会对我说:在我的公司,我们使用气流只是为了编排。我们使用芹菜,我们只使用 KubernetesPodOperator,我们不在 DAGs 中进行转化。然后,当我们需要使用其他操作符时,首先我们测量 de 资源消耗,我们知道使用它是安全的,因为任务使用低资源,并且我们可以通过并行度限制来控制同一工作机上的任务数量。
**PLUS:**air flow Kubernetes executor 比 celery 更具可伸缩性,即使我们使用 KEDA 来伸缩 celery(另一篇文章的主题)。如果你理解了最后一段,你可以想象为什么我能保证它。如果您使用默认 HPA 进行气流缩放,您就不了解 celery (scheduler、Redis、worker)是如何工作的。做一个测试,用一个使用高 CPU 的任务构建一个 dag,您将看到 HPA 扩展更多的工作线程。但我们没有更多的任务,我们有一个任务运行使用更多的 CPU,另一个工人不会帮助我们。
最后同样重要的是,监控是关键。我用 Prometheus 和 Grafana,它得到所有吊舱指标和气流 Postgres 指标。指标在本地开发和生产环境中非常重要。
开发者需要本地的这些度量来设置初始资源。该公司需要监控以下问题的答案:
哪些任务(pod)消耗更多内存(max)?哪些任务(pod)消耗更多 CPU(最大值)?
哪些任务(pod)花费了很长的时间和资源(max)?
我的任务消耗 ABC 曲线(max)是多少?
有了这些答案,公司可以为 Dag 校准资源,并知道他们需要优先处理哪些任务,以及根据资源消耗进行重构排序。
不同的公司有不同的必需品问题,你可以和团队交流,了解必需品。
通过这种部署,开发人员需要更多地关注幂等性。他们需要创建一致的任务,每次执行都花费相同的资源,因此,当运行这些任务时,他们通常会获得相同的结果。
气流 Grafana 仪表板—自行创建
图表中的这条红线是当我们不设置任务中的资源限制时可能发生的情况。这个任务需要更多的资源,如果库伯内特需要这些资源来完成其他任务,他会杀死这个豆荚。我们可以有一个全局配置来创建 pod 限制,但重要的是:任务不能完成工作,或者它会花费不必要的资源。
因此,我建议您可以优化您的资源,因为这是我们向云支付的费用。您可以确切地知道哪些任务是瓶颈,并且可以对监控您的集群有更深入的了解。
***我并不是说使用 Kubernetes executor 更容易,您的团队需要更多的 Kubernetes 和容器知识,规则流只是一个批处理编排。因此,流式传输或批处理间隔最长可达一分钟,还有其他更好的解决方案,也许您只能创建管道来监控这些流式传输管道。
来源:
为什么我们需要关注科技界女性的活动
以及为什么男人应该至少参加一个
克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片
我最近参加了一个数据科学领域的女性黑客马拉松。当我和我的同事谈论这件事时,有人问我为什么我们需要专门针对女性的活动。为什么女性不能参与所有人的活动?这让我开始思考。对我来说,不是男人让环境对女人充满敌意,也不是他们不允许女人成功。其实我已经可以很轻松的和男同事交朋友了。他们很支持我,我不觉得他们对待我的方式和其他人有什么不同。这些问题对一些女性来说确实存在,但对我来说从来没有。
那么,我为什么要参加女性科技活动呢?为什么大多数女人?我有我的理由,那就是对女性不利的固有的系统缺陷。这个列表不仅仅适用于女性。这对任何少数人来说都是相当普遍的。这是:
证明自己的压力
当你是唯一的一个或少数民族的一员时,你必须证明你是属于他们的。摆脱你是一名“多元化雇员”的印象是一种持续的压力。再说一次,这不是我有意识意识到的事情。只是存在于自己脑海里的东西。
低估自己能力的倾向
雪莉·桑德伯格在她的书《向前一步》中说,女性往往会低估自己的能力。研究也多次证明了这一点。局外人情结进一步助长了这种低估,并增加了表现的压力。
代表性别的压力
任何环境中的少数群体都觉得他们代表了更广泛的思想、观念或概念。不知何故,他们的行为代表了整个社区,而不仅仅是他们自己。如果你是大多数人,你只代表你自己。但如果你是少数派,你就代表了你的同类。
如果你曾经在世界各地旅行过,我敢肯定你被视为一个游客。虽然没有人对你有什么不同,但你不觉得你代表了比你自己更重要的东西吗?你的行为不知何故延续或消除了一种刻板印象?
这最终导致害怕因为错误的原因而被记住。我不想被人认为是“犯了错误的女人”。你会吗?由于我们的行为有更高的(感知的,在我们自己的头脑中)后果,我们需要格外小心。
榜样的稀缺
当处于多数时,很容易找到与你相关的人,也很容易找到值得你尊敬的人。但是女性崇拜的榜样少得多。在你问为什么男人不能成为女人的榜样之前,是因为上面的挑战是女人独有的。我很乐意与克服了这些挑战的女性交谈,并向她们学习。
此外,女子唯一的项目使这个竞技场变得公平。他们带走了代表的负担,允许女性做自己,犯错,并接受挑战。这些活动帮助我们找到榜样,看到这么多其他女性做我们做的事情让我们感到我们有归属感。
在以女性为中心的活动中,我观察到女性倾向于自由谈论偏见和问题,包括那些只存在于她们自己头脑中的问题。我第一次参加这样的活动时,发现作为一名女性,我在我的领域面临的大多数问题都是普遍性的。这些问题,以及随后的成功故事,打动了我,激励了我。
回到为什么我现在总是渴望参加这样一个以女性为中心的活动,是因为它们让我能够找到我所在领域的女性来交谈。我总能找到能引起我共鸣的故事。每次我参加这样的活动,我都会对技术领域的女性、她们的奋斗和赋权故事产生全新的尊重。它们证实了我正在走的路,增强了我的信心,让我觉得我真正属于这里,属于科技世界。
有人指出,作为男性,他们不会参加以女性为中心的活动,因为他们会觉得自己是个局外人。相反,我会敦促他们参与。他们会遇到周围最好、最善良的人,他们总是乐于助人。我相信,当你听到我们这边的故事时,你也许能更好地理解我们。你会理解为什么这样的事件会存在,我们女人热切地希望彼此支持。如果你有任何偏见,我相信在参加了这样的活动后,你不会有偏见;).对许多人来说,我保证你会听到一些故事,尽管你是一个男人。
出于所有这些原因以及更多原因,我强烈认为我们仍然需要以女性为中心的科技活动,至少在科技世界恢复性别平衡之前,或者在我们女性没有这样的故事可讲之前。
为什么我们需要更多的人工智能产品所有者,而不是数据科学家
关于人工智能产品开发中一个至关重要但未被充分利用的角色
如果你认为人工智能(AI)是昙花一现的炒作,那就再想想吧。斯坦福 2021 年人工智能指数显示,全球企业人工智能投资达到创纪录的 670 亿美元。去年的人工智能投资甚至超过了 2019 年的历史最高水平 40%。根据普华永道第 22 届全球首席执行官调查,77%的财富 500 强首席执行官计划开始或已经采用人工智能计划。鉴于对人工智能的投资稳步增加,数据科学面临交付切实成果的压力。
来源:10 大排行榜 AI 状态。
将人工智能集成到你的业务中的潜在回报是巨大的。根据 2020 年麦肯锡全球人工智能调查,人工智能为一个精英人工智能从业者群体贡献了超过 20%的 EBIT。此外,这些人工智能高绩效者比竞争对手在人工智能计划上花费更多的预算。他们也有能力在内部开发人工智能解决方案,而不是依赖外部供应商。
安迪·凯利在 Unsplash 上的照片
随着数据科学的成熟,该领域真正实现宣传的压力也越来越大。该领域需要提供切实的业务优势。人工智能产品成功的一个重要但未被充分利用的角色是人工智能产品所有者(AI PO)。
在这篇文章中,我分享了我对 AI POs 的重要性和所需技能的看法。AI POs 不是只给 AI 产品开发团队配备数据科学家,而是增加了成功开发 AI 产品的机会。文章描述了如何建立成功的 AI 产品团队,AI PO 的角色,以及学习成为 AI PO 的资源。
首先,我们来分析一下一个传统产品负责人和一个 AI 产品负责人的角色。
产品负责人 vs. AI 产品负责人
产品负责人的角色在 Scrum 框架中定义。Scrum 是一种流行的敏捷开发方法。该框架需要产品所有者、Scrum Master 和开发人员的角色。
Scrum 非常注意在 Scrum 主管和产品所有者之间划分产品和人员的职责。产品负责人负责最大化 Scrum 团队的价值。她创建了一个产品愿景,与利益相关者沟通,并对产品积压进行优先排序。Scrum alliance 声明 PO 需要业务、用户体验、技术和沟通技巧。
作者图片
AI PO 角色是常规 PO 角色的扩展、专门化版本。AI POs 继承普通 PO 的职责。他们扩展它们以最大化基于人工智能的产品的影响。
基于人工智能的产品不同于传统的软件产品。首先,AI 使用数据隐式地学习模式,而不是开发者显式地实现规则。其次,基于人工智能的产品有机会随着输入数据不断改进。第三,机器学习让我们能够建造这种质量的产品,像语音助手、自动驾驶或医疗诊断。因此,销售点需要调整他们的技能来提供基于人工智能的产品。
作者图片
那么,AI POs 需要哪些技能呢?首先,人工智能 POs 需要了解基于人工智能的应用程序的潜力和缺陷。AI 擅长什么,奋斗在哪里?基于人工智能的解决方案可以解决哪些业务问题,它被放错了位置?
接下来,AI POs 需要特别注意监控 AI 模型的预测。人工智能基于统计假设,因此预测总是带有一定程度的不确定性。根据上下文,一个错误的预测可能会导致严重的后果。人工智能 POs 应该能够设计人工智能应用程序,以便在需要时包括人类决策。
在生产环境中以 ML 为核心的产品仍然是一个新生的学科,因此在这个领域运营的项目经理和企业家都在学习很多东西。—Mor,AI 创业者
另外,基于人工智能的产品是动态的。他们衡量顾客对他们预测的反应。人工智能产品还需要考虑对数据的持续调整。在设计基于 AI 的产品时,AI POs 需要牢记 AI 的良性循环。智能产品的真正力量来自于它们基于新数据不断改进的能力。
人工智能飞轮允许基于人工智能的产品不断改进。作者图片
技术方面,AI POs 的技术知识越多越好。AI POs 既不需要以前是开发者,也不需要拥有计算机科学硕士学位。然而,很难理解用人工智能实现什么是容易的,什么是几乎不可能的。如果没有适当的技术背景,人工智能产品的可行性很难评估。请注意,这里有不同的意见,其他人认为技术知识既不需要采购订单也不需要人工智能采购订单。
最后但同样重要的是,AI POs 理解 AI 开发不同于软件开发工作流。AI 开发测试不同的假设,快速迭代。传统的软件开发可以遵循更加模块化和结构化的方法。理解 ML 开发不像传统软件开发那样是线性的,这对于与涉众交流期望和按时交付价值是至关重要的。
“由于人工智能项目的开发生命周期是基于“搜索”而不是“规划”,公司需要受过训练的专业人士将产品视为优化问题,而不是编程问题。”——阿德南·博兹,艾产品管理学院创始人
普通采购订单与人工智能采购订单的重点领域。作者图片
在理解了 AI PO 的角色之后,让我们来分析 AI PO 在 AI 产品团队中是如何工作的。
构建数据产品团队
交付基于人工智能的产品取决于组建跨职能团队。跨职能团队由具有互补技能和角色的专家组成。我经常看到一心一意的数据科学团队努力实现他们的模型。要求数据科学家完成将基于人工智能的产品带给客户所需的所有角色是失败的秘诀。
模范人工智能产品开发团队。作者图片
相反,AI PO 通过最大化商业价值来支持数据科学家。上图展示了一个由跨职能专家组成的原型人工智能产品开发团队。不要纠结于角色,它们可以从一个产品变成另一个产品。有些产品可能需要 AI UI/UX 设计师,有些可能不需要。但是,我确实相信所有的 AI 产品团队至少应该有一个 AI PO。您还可以看到,数据科学家只是团队中的一个角色,还有许多其他角色。
现在你知道人工智能程序是做什么的了,继续读下去,看看你能从哪里学到成为人工智能程序的技能。
人工智能 POs 的资源
正如你所看到的,人工智能 POs 可以在人工智能产品的生产中发挥重要作用。幸运的是,有很多资源可以教你成为一名 AI PO:
- AI 解决方案产品管理由阿德南·博兹
- AI 产品经理 Nanodegree by Udacity
- AI for every onebydeep learning . AI
首先我要推荐的是阿德南·博兹的 AI 产品管理学院。Adnan 在斯坦福大学从事教学工作,在英伟达工作,成绩斐然。他还创办了人工智能产品管理研究所,开发人工智能 POs。Adnan 帮助有抱负的产品所有者进入人工智能领域,并收到了非常积极的学生反馈。
上面提到的爱宝资源。作者图片
Udacity 纳米学位看起来很全面,很有价值。我听到了关于该计划的良好反馈。该计划需要两个月的时间,涵盖了各种人工智能 PO 技能,以及数据集创建、模型构建和人工智能产品监控。
最后,我是 deeplearning.ai 内容的热心推广者,并在“AI for Everyone”课程发布前亲自审阅了该课程。它并不完全针对开发人工智能产品所有者,但该课程有助于您了解人工智能产品的内部工作原理、优势和局限性。对于人工智能 POs 来说,理解人工智能的非技术基础是至关重要的,这是本课程教给你的。
请注意,这不是赞助帖,是我个人推荐。
关键要点
看完这篇文章,希望你明白,我们需要的不是更多的数据科学家,而是更多的 AI POs。AI PO 支持人工智能产品团队,而不是要求数据科学家覆盖所有产品开发阶段。AI PO 专注于通过基于人工智能的产品创造价值。
- 人工智能 POs 对于成功开发基于人工智能的应用程序至关重要
- 人工智能 POs 了解人工智能的优势和缺陷,设计使用人工智能飞轮的产品,并了解人工智能开发工作流程
- 人工智能产品团队需要各种技能,不仅仅是数据科学家
看完这篇帖子,你对 AI POs 的需求和它们的作用有了更好的理解。如果你想听更多关于商业、项目管理和数据科学的交集,在媒体、 LinkedIn 或 Twitter 上关注我。
来源
Daniel Zhang、Saurabh Mishra、Erik Brynjolfsson、John Etchemendy、Deep Ganguli、Barbara Grosz、Terah Lyons、James Manyika、Juan Carlos Niebles、Michael Sellitto、Yoav Shoham、Jack Clark 和 Raymond Perrault,“人工智能指数 2021 年年度报告”,人工智能指数指导委员会,斯坦福大学人工智能研究所,斯坦福,加利福尼亚州,2021 年 3 月。
斯坦福大学的《人工智能指数 2021 年度报告》在 Attribution-no derivatives 4.0 International 下获得许可。要查看本许可证的副本,请访问http://creativecommons.org/licenses/by-nd/4.0/.
Tara Balakrishnan,Michael Chui,Bryce Hall,Nicolaus Henke,“全球调查:2020 年人工智能的状况”,麦肯锡 分析,2021 年 3 月从 McKinsey.com 检索。
为什么我们在回归分析中使用最小二乘法
背景
简单的线性回归非常简单。这是人们在探索机器学习领域时遇到的第一个算法。然而,它的起源在于统计。从业者后来将其应用偷偷带入机器学习和其他几个领域,如商业和经济学。任何上过概率统计本科一年级的人都可以做简单的线性回归。它所需要的是通过一堆数据点找到最佳拟合线的方程。为此,您需要遵循一个标准协议,计算实际目标值和预测值之间的差值,对它们求平方,然后最小化这些差值的平方和。表面上,回归和概率之间没有明显的联系。更多的是和微积分有关。但是,回归分析还有更激动人心的一面,它被导入 python 库的满足感和便利性所掩盖。
放大回归
让我们思考一个关于假想数据集的简单回归问题,其中 X 和 Y 保持它们惯用的身份——解释变量和目标变量。简而言之,回归的圣杯是发掘一条擅长以最小误差逼近目标变量(y 值)的线。但是,忍住。与其寻找直线,不如考虑所有标绘在 x 轴上的 x 值。考虑穿过每个 x 轴的平行于 y 轴的线。如果有帮助的话,画在纸上,如下所示。
(在 MS Paint 中创建)
灰色线条代表什么?嗯,如果你考虑到现实世界中存在的动荡因素,那么 Y 可以是给定 x 的任何值。例如,尽管学习了相同的小时数,但你可能在两次独立的月度测试中得分不同。因此,所有的线都指定了 Y 的值域,对于每个 x 都是实数。
如果我现在要求你估计给定 x 的目标变量,你会怎么做?答案将揭开回归的概率全景。如果我给你一个给定 X-P(Y|X)的条件概率分布,会不会有帮助?当然,它会,但没有办法提取一个准确的分布函数。所以,我们做了一个假设,许多假设中的第一个。假设给定 X,P(Y|X)的 Y 的概率遵循正态分布。为什么正常?根据您正在处理的数据集的先验知识,您可以自由选择任何合适的分布。然而,由于很快就会清楚的原因,我们将求助于正态分布。
我们将在上面绘制的图的 z 轴上表示这个概率分布。如下图所示,P(Y|X)遵循正态分布。红点是每个 P(Y|X)的平均值。原谅图像的质量。我用 MS paint 制作了它们,以便于展示。
(在 MS Paint 中创建)
解开正态分布的参数
好吧,我们建立了分配的类型。它的参数——均值和方差呢?为了做出合理的估计,我们需要数据集中每个给定 X 的 Y 的均值和方差。此时,开始摆弄回归线 a+bX 是明智的。
如前所述,我们希望找到系数 a 和 b,使得计算 a+bx 可以得到实际 y 值的最佳估计值。考虑到 y 呈正态分布,最佳估计值是多少?请注意,在从正态分布中随机抽取值时,大多数情况下会得到平均值。所以,明智的做法是赌 a+bX 是 Y|X 的均值或期望值。
由乳胶制成
这是一个明显而低调的事实。因为我们假设 a+bx 是 Y|X 的期望值,所以我们也猜想所有的均值都位于回归线 a+bx 上。这是使用回归模型的必要条件。这么想吧,如果真实的均值没有躺在一条线上,用线性回归是否明智?现在你可能想知道人们是如何确定线性度的?我们不能,因为真正的价值是一个谜。那我为什么要拿这个来烦你?在实际的机器学习中,人们认为线性的存在是理所当然的,并继续进行建模。无论如何,建模后测试可用于确定线性回归模型的准确性。这里重要的是了解潜在的假设。
好的,如何处理方差?为了保持同质性,我们假设所有 Y|X 的方差值都是常数。同质性意味着方差的同质性。这个概念应该有一个单独的位置。然而,对我们来说,知道最小二乘估计在它不存在时是错误的就足够了。一直读到最后,你会发现为什么。
由乳胶制成
贝叶斯回归全景图
理解超过这一点的东西需要贝叶斯定理的知识。我的本科教授曾经说过,“同学们,如果不知道贝叶斯定理,你们将无法进行任何有价值的机器学习。”因此,我将跳过它的详细解释,希望作为人工智能的爱好者,你对 Bayes 和他的思想很熟悉。
让我们概括一下到目前为止我们所做的事情。我们从一个由解释变量和目标变量 X 和 Y 组成的假想数据集开始。然后,我们试图计算出给定 X 时 Y 的概率。为此,我们假设 Y|X 遵循均值为 a+bX 的正态分布。因此,我们还建立了所有 Y|X 的平均值位于回归线上。
太好了,是时候开始寻找圣杯了。我们需要找到 a 和 b 的最佳估计值,是什么决定了这些估计值?你猜对了——手头的数据。参数 A 和 B 应该使得概率 P(a=A,b=B|data)最大。
由乳胶制成
怎么做呢?贝叶斯来拯救我们了。根据贝叶斯定理:
由乳胶制成
因此,我们可以写
由乳胶制成
在本文的其余部分,我将把上面的等式称为贝叶斯。
注意,没有可靠的数据,a 和 b 是不确定的。它们可以从实数集中取任何值。P(a=A,b=B)是得到 a=A 和 b=B 的概率,与手头的数据值无关。假设我们想用每日最高温度来模拟冰淇淋销售的回归。
由乳胶制成
你的朋友托马斯·贝叶斯,碰巧也是甜点行业的专家,欣然同意为这项研究提供任何帮助。根据他的经验,他建立了(A,B)的概率分布模型。很好,你现在对(A,B)最可能的值有了更好的了解。然而,在许多情况下,你不会得到托马斯的支持。在这样无可奈何的条件下,假设(A,B)的任何一个集合都是同样可能的。从概率上讲,P(A=a1,B=b1),也称为先验概率或只是先验,假设是均匀分布的。
总而言之,先验不受数据的影响,顾名思义,它们反映了我们对回归模型的初步概念。
回到我们的问题。我们也假设先验分布是均匀的。我们的目标是最大化贝叶斯的右边。因为 P(a=A,b=B)在(A,B)的所有集合中都是常数,所以我们可以忽略该项。
由乳胶制成
接下来,认识到 P(数据)仅仅是一个常数。为什么?它是在所有 A,B 对中获得数据的总概率,一组特定的 x,y。对于每对 A,B,P(data| a=A,b=B)是一个介于 0 和 1 之间的实数(你很快就会明白为什么)。因此,这些概率的总和 P(data)是一个常数。
由乳胶制成
比例两边的常数都可以去掉。
P(data|a=A,b=B)是得到数据的概率,给定参数 A 和 B,所有提供的值集(X,Y)也可以写成 P(X,Y|a=A,b=B)。根据条件概率的规则,这个我就不深究了,P(X,Y|a=A,b=B)可以进一步简化为 P(Y|X,a=A,b=B)。
由乳胶制成
我们的问题归结为最大化 P(Y|X,a=A,b=B)。假设 P(Y|X)服从正态分布,平均值为 a+bX,方差为σ。在提供的数据中,Y 可能不同于 a+bX。因此,对于 P(Y|X,a=A,b=B),我们的目标是找到从均值为 a+bX 且方差为σ的正态分布中得到 Y=y 的概率。
由于所有的 Y|X 都是独立的,我们可以把 P(Y|X,a=A,b=B)简化为所有个体 P(Y=y|X=x,a=A,b=B)的乘积。
由乳胶制成
挖掘最小二乘逼近函数
正态分布的概率密度函数 pdf 为:
由乳胶制成
与离散分布不同,连续分布不定义特定点的概率。你只能在一个数值范围内对 pdf 进行积分,比如说 x1
在我们的例子中,我们可以通过在一个相当小的范围内对 pdf 进行积分来近似计算下面的概率。
由乳胶制成
通过计算,我们可以进一步写出
由乳胶制成
我向数学专家道歉,我耍了一个卑鄙的手段。为了简单起见,我取消了积分运算,引入了比例符号而不是等式。这些都是在被积函数 dy 对所有 x,y 都相同的假设下完成的。
只剩下一些数学运算了。为了最大化令人望而生畏的 L,让我们首先在两边取一根圆木。
由乳胶制成
右边的第一项是常数。因此,代数要求最大化 log(L),我们需要最小化第二项。现在,看看第二学期。你发现什么了吗?答对了。你发现了著名的最小二乘近似项。
最大化 L 需要最小化第二项,这恰好是最小平方逼近函数。
由乳胶制成
认识到最小二乘近似是在以下条件下进行回归分析的适当程序:
- 对于给定的 x,目标变量 y 遵循正态分布
- 回归参数的所有值都是同等可能的。也就是说,先验服从均匀分布
- 对于所有的 Y|X,方差值被假定为常数。否则,我们不可能从求和项中取出它
与这些条件的任何偏差都将导致必须遵循替代程序。在这种情况下,你必须重复整个练习。
结论
我写这篇文章的目的是为了分享为什么我们在做回归分析时会求助于最小化平方差的和。当我第一次看到这个启示时,我大吃一惊。为了在机器学习中做一些很酷的事情,许多人经常掩盖底层的数学。也许,一个人可能永远不会专业地要求这种知识。但是对它视而不见,你就错过了美丽的机器学习。真是满眼都是。