数据科学中更好的软件编写技巧:死程序不会说谎
实用程序设计员的每周指导章节阅读
本周的指导和帖子是基于“务实的程序员:从熟练工到大师”的第四章:务实的偏执狂。这一章的重点是确保你的程序做它们应该做的事情,如果它们没有按预期执行,你可以用最快的方式找出原因。
根据您使用的编程语言,可以用不同的方式支持契约式设计。至少,Python 3 可以通过对函数及其返回值使用参数类型来强制实现这一点。强制执行合同的另一个好方法是在你的函数的早期做断言(断言)或者简单地在事情不符合你的合同时抛出异常。请注意,断言无论如何都会引发异常。想一想,是失败并停止执行好,还是用垃圾填充一个表好?你什么时候能发现那是垃圾?你能在那个时间点纠正它吗?你还会有底层数据来做修正吗?
学会知道什么时候使用断言和/或什么时候引发异常,也就是说,当你知道一个边界、一个合同并且你想要执行它,或者至少告诉一个更高级的程序有问题并且你对此无能为力。当遇到特殊情况时,你可以自己解决,或者让更高级的程序来处理。最后,如果没有更高级别的程序可以处理这种情况,整个程序将被暂停。
我知道对于某些人来说断言和异常的用法可能很难理解,所以让我试着为你建立一个心理模型。异常是发生在程序上的异常事件。如果你负责那个程序的调用并捕捉那个异常,你必须决定你是否有足够的上下文来处理那个异常,需要把那个异常提交给调用你的程序。最后,如果没有人能处理这个异常,程序就会崩溃,你可以调试这个异常是怎么回事。如果你知道在这种特殊情况下该怎么做,那么就由你来处理。也许是重试,也许你需要使用默认值,…只是要确定处理决定,因为这可能会污染你的数据。
至于如何抛出更高的异常,有两种方法:断言或者抛出。一般来说, raise 会在你遇到无法直接处理的错误情况时使用,但更高级的程序可能会处理,例如文件不存在或为空……另一方面, assert 会在你发誓这种情况不会发生时使用。在这两种情况下,异常都被抛出。
当你发现你的程序发生了“不好的”事情,你知道这不应该发生,你也知道没有别的办法,抛出异常的方法是通过断言。这将会给上层程序抛出一个异常,它必须决定如何处理这个异常。一个例子是,你期望一个 int 作为输入,你得到一个字符串,这是契约破坏,更高的程序要求你处理不正确的数据,为什么你的程序会决定为什么契约被破坏?正确处理该异常应该是调用者的责任。这可能需要一个断言。
根据您所在的组织,如何使用异常和断言可能会变得很有哲理。另一方面,它也可能受制于非常具体的规则。一个组织可能更喜欢一种方法而不是另一种方法,这可能有真正合理的原因。学习规则,如果没有规则,围绕它进行讨论,并运用你的最佳判断。无论如何,死亡程序不会说谎。与其在未来一年不得不处理被污染的数据,不如杀了它。
跑步之前,应该先学会走路。通常,人们在没有太多编程知识的情况下进入数据科学,突然被要求处理 Python 中现有的 ETL,或者设计新的 ETL。务实的做法是学习编程!如前所述,Python 是一种多范式语言。过程化编程可能是最广为人知的方法,尤其是在笔记本环境中使用 Python 的时候。线性规划和函数的使用…
如果您使用 pytest 或其他一些库,您可能会开始对面向对象编程产生一些疑惑。也许你只是复制了食谱,并没有深入研究这个范例。你的机会来了。我在 Python 中找到了这篇关于面向对象的写得很好的初级读本,它也链接到了其他资源。如果您要编写可靠的 ETL,您将需要了解一些 OOP 知识。
如果你操作数据,迟早你会想使用 lambda 函数,映射,过滤,减少,…或者如果你使用 numpy / pandas,你会对 apply 等感兴趣。同样,你可以按照菜谱做,但是同样,如果你想在函数式编程方面变得更强,我又找到了一本有趣的关于 Python 中函数式编程的入门书。它远未完成,但它链接到其他资源来填补空白,一旦开始,你就会想了解更多!
我说过很多次:熟能生巧!在最初的两周,我向你们推荐了来自 CheckiO 的练习。随意在那里注册一个账号,沿着一个岛到一个岛的路径,获取 Python 方面的知识。还有其他资源可以用来练习编程。自 2015 年以来,每年圣诞节前的几天,在 12 月份,降临节代码提出小问题,精灵和圣诞老人面临着传递礼物!你也可以看看你所在的地区是否有编码 dojos,或者实际上,我发现它们也是一个很好的实践场所。
这是我对第四章“实用程序员:从熟练工到大师”阅读的补充,作为提高数据科学中软件写作技能的媒介。下周我们将学习第五章:弯曲或断裂。
在软件领域 20 多年了。目前在 Shopify 担任数据科学家。在深度学习、机器学习/分析、云计算、物联网、领域特定语言、遗传算法和编程、人工生命/智能以及所有技术领域的研究兴趣!通过点击查看所有帖子
原载于 2021 年 4 月 13 日 http://thelonenutblog.wordpress.com**的 。
数据科学中更好的软件写作技巧:实用项目
实用程序设计员的每周指导章节阅读
语用学的定义(韦氏词典)
与事实或实际事务有关的,通常排除智力或艺术方面的:与理想主义相对的实际的。
但是,你真的能排除内心所有的事情吗?你能从技术决策中去除所有政治因素吗?可能这么想就是理想化了吧!务实意味着促进基于事实的信息和实际方面超过其他考虑,但其他考虑也可能是要处理的事实。真正的务实可能不是切断头脑和心灵之间的联系,而是找到一个正确的平衡,在这个平衡中,一个人既尊重事实,又考虑到其他追求,这样最终我们会得到一个切实可行的解决方案。
本周的指导和帖子基于“实用程序员:从熟练工到大师”的第八章,也是最后一章:实用项目。这一章把我们到目前为止学到的所有东西都总结成一个很好的视图,并提供了一个很好的学习总结。
如果你想过实用主义的数据科学家(或程序员)生活,你必须在团队工作的各个方面贯彻实用主义。您应该自动化每一个重复的方面,并确保您的工件的测试也是自动化的。没有需要随着时间重复的手动步骤。
务实的团队不应该允许打破窗户(见本系列的第一篇文章)。第二,你应该始终监控你的“环境”,不要让它随着时间的推移而退化。即使是缓慢的退化,如果任其发展,也会在未来造成大问题。这可能会以多种方式蔓延:如果不加注意,数据的线性增长可能会是一个挑战。你可能需要调整你的资源久而久之,为什么不自动化呢?如果你决定走这条路,如果你不想以一个巨大的账单结束的话,确保你对一段时间内允许的增长因素有所限制!那么数据的指数级增长呢?如果这种增长跟随着你的“客户”基础,调整资源可能不是一个财务问题,但如果不是呢?你应该尽快解决这个问题。也许有其他方法来聚集数据,并使其仍然相关。
正如我们在前面章节看到的,沟通是王道。团队内部的沟通以及与涉众和组织其他部分的沟通。我经常发现,这本书在这个问题上提供的最佳建议是创建一个品牌。当你开始一个项目时,给它一个名字,并且总是引用它。如果它能自己创造一个你想要达到的更好的精神形象。
然后就是一堆提醒。不要重复自己!重构以消除这些重复。创造正交性,不是围绕工作职能,而是围绕功能。
价值测试和可重复测试。价值以及良好的数据科学家水平的文件。不是为了某个过程而制作的文档,也不是为其他不愿意阅读它的人而制作的文档(如果他们要阅读它,就去做,但要确保它满足他们的需求,而不是其他无用的额外内容)。几个月后,当/如果你需要回到你设计的那段代码或算法,你还能记得你做的所有小决定吗?我打赌不会。如果你离开组织,团队还能维护和增强功能吗?让文档尽可能接近代码。如果你有跨越许多代码的概念,例如系统级信息,首先让它对你自己和你的数据科学家同事有意义。使其可访问,并且不要重复在更接近代码或算法的层次上找到的信息。我特别喜欢提示 67:“把英语当作另一种编程语言”。这意味着所有适用于你的代码的都应该适用于你的文档…
最重要的是,记住足够好就是足够好。这个世界上没有完美,即使你能做到,目标第二天也会离你而去。
“实用程序员:从熟练工到大师”系列阅读到此结束。希望这能帮助你成为更好的数据科学程序员!继续编程,继续练习!
在软件领域 20 多年了。目前在 Shopify 担任数据科学家。在深度学习、机器学习/分析、云计算、物联网、领域特定语言、遗传算法和编程、人工生命/智能以及所有技术领域的研究兴趣!通过点击查看所有帖子
原载于 2021 年 6 月 3 日【http://thelonenutblog.wordpress.com】。
数据科学中更好的软件编写技巧:工具和错误
实用程序设计员的每周指导章节阅读
本周的指导和帖子基于“务实的程序员:从熟练工到大师”的第三章:务实的方法。那一章的重点之一是关于交易的工具,以及掌握这些工具。
如果你现在习惯的唯一工具是 Jupyter 或者另一个类似笔记本的环境,也许是时候尝试不同的方法了。只使用类似笔记本的环境可能会给你带来不好的编程习惯,这可能很难改变。尝试使用支持 IDE 的 Python 来编写一些 Python 代码,比如 PyCharm 就是其中之一,或者甚至是您将在命令行上执行的纯文本。学习不同的编码方法,这将帮助你理解这些方法的成本和收益。
作为一名数据科学家,尝试不同的方法来查询数据,也许你的组织已经支持不同的数据库?学习如何使用 pyspark、SQL……如果这适用于你的工作,尝试不同的深度学习框架。工具是无穷无尽的,你不需要对它们都有很深的了解,但你应该尝试一下,看看它们的优缺点,有意识地选择哪一个最适合你和手头的任务。
工具很重要的另一个领域是调试他们的代码(或查询),我在这个领域看到了许多初级程序员和数据科学家要解决的问题。
本周我的文章的重点是调试。Python 练习将包括调试一个小的 Python 函数。如果你发现 bug 比较早,你在 Python 里面大概也没那么初级吧!尽管如此,我还是鼓励你把这些步骤当作练习来完成。记住,熟能生巧!
将这段代码放在您最喜欢的 Python 执行环境中,让我们按照书中概述的调试过程进行调试。
- 干净地编译代码:对于 Python 来说,这应该不成问题… Python 是一种解释型语言。但是,例如,如果您将代码保存在 Jupyter 笔记本中,您可能会忘记之前运行了什么。因此,一个好的方法是重启内核,一个单元一个单元地重新执行代码。你的 Jupyter 笔记本电池坏了吗?也许你可以花时间把它们按照你想要的顺序排列。
- 理解错误报告:通读函数意图和三个“测试”语句。你能理解什么是预期的行为吗?也许你能马上发现这个错误!
- 重现 bug:bug 可重现吗?在这个具体的例子中,它应该已经很容易被复制了,但是在现实生活中,你可能需要做一些工作来使它在一个步骤中被复制。为了更好地理解您看到的行为,您还想添加其他测试吗?你能运行这些测试并一步再现问题吗?
- 可视化你的数据:这里有许多方法是可行的。您可以决定使用 pdb,Python 调试器(如果您还不了解调试器,了解它可能是个好主意)。例如,如果您正在处理 ETL,您可能必须查询由 Python 文件生成的数据。如果您的 ETL 正在为一些机器学习阶段准备数据,您可能希望创建一种自定义的方式来可视化那些“错误的”数据。
- 跟踪:除了使用调试器之外,或者在这种情况下,您可以在代码中添加一些跟踪。可以通过日志文件进行跟踪(在这种情况下,我强烈建议使用支持跟踪级别的日志框架,例如 INFO、ERROR、DEBUG……以便您可以保留设计良好的跟踪,供将来调试使用),或者对于像这样的简单问题,您可以简单地决定添加一些打印语句来跟踪数据流。
- 查看损坏的变量:这不是你通常用 Python 必须做的事情,但是如果你使用其他编程语言,要注意这是可能发生的事情。例如,在 C 语言中,你可以在内存中的任何地方写任何东西,所以一个来自程序另一部分的简单的索引错误可能会破坏“你的”变量。
你还没发现窃听器吗?不要绝望,还有几步路可以走!
- 橡皮鸭:向其他人解释问题,或者如果你像我们许多人一样因为 COVID 而被禁闭,向你的猫解释,或者如果你独自被困在一个荒岛上,向威尔逊解释!大声说出来也许能帮你想明白。
- 排除过程:正如作者在书中所说,错误可能出现在操作系统、编译器或第三方产品中。然而,在我 25 年以上的软件职业生涯中,只有一次我遇到的错误可以追溯到编译器,那是很久以前的事了,在 Fortran 编译器中。而且只有一次错误可以追溯到计算机主板的错误硬件设计。这些错误通常很难发现,所以它们不经常发生是件好事。通常情况下,如果你的 bug 涉及到软件的其他部分,可能是你没有以正确的方式解释第三方文档。
- 惊奇元素:当你发现自己认为这个 bug 是不可能的,是时候重新评估你所坚持的真理了。微妙的暗示,这里可能就是这样。
这里发生了什么?在这种情况下,当你知道 Python 是如何工作的时候就很简单了。Python 中的默认参数不会在每次调用函数时重新计算,而是在解析函数定义时才重新计算一次。每次在没有第二个参数的情况下调用该函数时,对同一个“空”列表的引用将被用作默认参数。对“空”列表所做的任何更改都将成为后续调用的“新”默认参数,这些调用不会提供第二个参数。
了解交易工具包括了解你使用的编程语言。Python 有很多好的特性,因为它是一种多范例编程语言。在 Python 中,您可以使用过程式编程方法、面向对象方法或函数式编程方法。这些给了 Python 很大的灵活性,也给了你很大的伤害自己的可能性!花时间学习你使用的编程语言,它使什么变得容易,以及它在什么地方使事情变得困难。
这是我对《实用程序员:从熟练工到大师》第三章阅读的补充,作为提高数据科学中软件写作技能的媒介。下周我们将看一看第四章:务实的偏执狂。
在软件领域 20 多年了。目前在 Shopify 担任数据科学家。在深度学习、机器学习/分析、云计算、物联网、领域特定语言、遗传算法和编程、人工生命/智能以及所有技术领域的研究兴趣!通过点击查看所有帖子
原载于 2021 年 4 月 7 日【http://thelonenutblog.wordpress.com】。
数据科学中更好的软件写作技巧:当你编码时
实用程序设计员的每周指导章节阅读
来自 Pixabay 的 Gerd Altmann 拍摄的封面图片。
本周的指导和帖子基于“实用程序员:从熟练工到大师”的第六章:当你编码时。本章的重点是你在编程时应该记住的一些小事。编码是一个迭代的过程,需要注意。如果你没有给予它应有的关注,你可能会碰巧陷入编码。让我们来看看书中提到的一些主题。
巧合编码与故意编程
如果没坏就不要修理它。对于可信的代码片段来说,这可能是真的,但是当你正在编写新的代码,或者在现有的代码中添加新的代码行时,你不能确定它没有被破坏,直到它经受了考验。到那时可能就太晚了。有人可能会受到这个 bug 的影响,修复这个 bug 需要的时间比早期发现的时间要长。所以,要仔细考虑你在编码什么,为什么要编码。当你对你需要编码的东西有了更好的理解时,不要害怕重构。把事情简单化,确保不重复自己。这并不是因为一段代码之前就在那里,所以它仍然需要在那里。不断地重新评估你正在编写的代码。
算法速度
特别是在数据科学中,您会遇到这样的情况,计算算法速度将有助于您理解为什么分析在某些情况下可以工作,但随着数据大小的增加,会花费太多时间。如果你非常依赖 Jupyter 笔记本电脑,要知道现在大多数计算资源都有多个内核。如果你想从多核处理中获益,你必须调整你的代码来利用它。例如在 scikit learn 中,许多类都有方法,在这些方法中你可以指定类似 n_jobs 的东西来告诉这些方法它可以使用多少个处理器。
如果依赖 python 循环,随着数据的增长,处理过程会变得很长。也许这些循环算法中的一些可以用 numpy 转换成矩阵运算?如果不是,习惯 Python 中的多处理将是有益的。通过这种方式,您可以将处理任务划分到多个进程上,这些进程将受益于您的可用内核。然而,你需要考虑减少结果,也许只是简单地将所有的输出连接在一起,或者可能更复杂…至少知道可能性可以使程序运行几个小时而不是几天。
为了让多重处理变得容易,我前段时间做了一个小的助手类。如果需要,请随意使用。
用法相当简单,首先,这里有一个简单的用法示例。reducing 函数嵌入在方法调用(reduce.append)中。
simpleMultiprocessing::Creating a process for elements 0-124 simpleMultiprocessing::Creating a process for elements 125-249 simpleMultiprocessing::Creating a process for elements 250-374 simpleMultiprocessing::Creating a process for elements 375-499 simpleMultiprocessing::Creating a process for elements 500-624 simpleMultiprocessing::Creating a process for elements 625-749 simpleMultiprocessing::Creating a process for elements 750-874 simpleMultiprocessing::Creating a process for elements 875-999 simpleMultiprocessing::All jobs submitted simpleMultiprocessing::All jobs ended [7750, 23375, 39000, 54625, 70250, 85875, 101500, 117125] 499500
你可以很容易地添加一个合适的缩减函数,如下例所示。
simpleMultiprocessing::Creating a process for elements 0-124 simpleMultiprocessing::Creating a process for elements 125-249 simpleMultiprocessing::Creating a process for elements 250-374 simpleMultiprocessing::Creating a process for elements 375-499 simpleMultiprocessing::Creating a process for elements 500-624 simpleMultiprocessing::Creating a process for elements 625-749 simpleMultiprocessing::Creating a process for elements 750-874 simpleMultiprocessing::Creating a process for elements 875-999 simpleMultiprocessing::All jobs submitted simpleMultiprocessing::All jobs ended [7750, 23375, 39000, 54625, 70250, 101500, 117125] 413625
如果您需要调试其中一个多处理函数,将 simpleMultiprocessing 类的用法改为使用 protectedMultiprocessing 可能会有所帮助。在下一个例子中,我们通过主动为其中一个元素引入一个异常来展示它是多么的有用。如果在 simpleMultiprocessing 的情况下出现异常,我们会悄悄地丢失该作业和所有结果。这里我们意识到了问题,但仍然得到了其他结果。缺点是 reducing 函数被调用得更频繁,但在正常情况下,艰苦的工作无论如何都是由 mapping 函数完成的。
protectedMultiprocessing::Creating a process for elements 0-124 protectedMultiprocessing::Creating a process for elements 125-249 protectedMultiprocessing::Creating a process for elements 250-374 protectedMultiprocessing::Creating a process for elements 375-499 protectedMultiprocessing::Creating a process for elements 500-624 protectedMultiprocessing::Creating a process for elements 625-749 protectedMultiprocessing::Creating a process for elements 750-874 protectedMultiprocessing::Creating a process for elements 875-999 protectedMultiprocessing::All jobs submitted An error occured... while processing item: 666 exception: integer division or modulo by zero protectedMultiprocessing::All jobs ended [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, [...], 663, 664, 665, 667, 668, 669, 670, [...], 995, 996, 997, 998, 999] 498834
你可以用多重处理做更多有趣的事情,这是值得学习的。同样,对于简单的多处理用例,请随意使用我上面的类。
还有更
第六章还有更多内容:重构、单元测试和邪恶巫师。由于这本书写得很好,我就不赘述了。但是我只想说:在你编码的时候不要害怕重构。很多时候,当我给我的工作增加复杂性时,我发现有很多方法可以保持干燥(不要重复)。通过重构,我能够简化流程,甚至使代码更容易理解。参数化可以让你走得更远。
最后,我恳求你,做单元测试!并将它们与您的代码一起保存。python 中有很好的单元测试框架: unittest 随 Python 一起发布,我经常使用 pytest ,你可以使用 mock ,或者假设。即使没有框架,你也可以使用准系统 asserts 做好单元测试工作,所以没有借口。这本书就单元测试的主要目标给出了很好的指导。当您稍后将更新代码时,这种可能性很高,您会很高兴有现有的单元测试来验证基础。
这是我对第六章“实用程序员:从熟练工到大师”阅读的补充,作为提高数据科学中软件写作技能的媒介。下周我们将看一下第 7 章:项目前。
原载于 2021 年 4 月 30 日 http://thelonenutblog.wordpress.comhttps://thelonenutblog.wordpress.com/2021/04/30/better-software-writing-skills-in-data-science-while-you-are-coding/。
比 GPT 3 更好——来看看 BlenderBot 2.0:脸书最新的聊天机器人
人工智能|新闻
而且是开源的!
从类人对话式人工智能来说,我们可能比我们想象的更近。
2020 年 4 月,脸书发布并开源了当时有史以来最大的聊天机器人; BlenderBot 。虽然 GPT-3 盖过了它,但与 OpenAI 的超级明星相比,BlenderBot 的能力毫不逊色。脸书人工智能团队选择将基于大型变压器的语言模型的超级成功趋势——blender bot 拥有 94 亿个参数,创下了当时的纪录——与其他技术相结合,以提高性能。
他们的最终目标是创造一个聊天机器人,能够“根据情况要求,提问和回答各种问题,展示知识,并表现出同理心、风度翩翩、引人入胜、严肃或有趣。”人类的对话是微妙含义和突然转变的复杂舞蹈。BlenderBot 本该成为最好的人工智能舞者。
除了通常的大规模训练(使用大量互联网数据),他们使用混合技术和世代策略。
- 混合技能: BlenderBot 在一项名为混合技能对话 (BST)的任务中进行了微调,该任务由三种不同的技能组合而成:展示独特的个性,利用先前的知识,展示同理心。什么时候应用这些技能是这种方法具有挑战性的原因。例如,系统应该区分人们什么时候需要被倾听,什么时候他们在问一个修辞性的——而不是真正的——问题。
- **世代策略:**聊天机器人通过优化困惑度来训练——困惑度是一种衡量模型在预测下一个令牌时有多自信的指标。然而,脸书的团队认为,控制聊天机器人消息的长度——以及其他策略——可以提高性能。
人类评估者承认,BlenderBot 明显更有吸引力——他们更喜欢与它进行长时间的交谈——并且感觉比任何其他竞争对手都更有人情味,包括谷歌的 Meena(当时最先进的)。
现在,脸书人工智能团队又向前迈出了一步。7 月 16 日,他们发布了开源 BlenderBot 的继任者: BlenderBot 2.0 。在这篇文章中,我将强调它相对于以前的对话式人工智能的改进,并解释它如何与 GPT-3 相比较。
blender bot 2.0——上下文聊天机器人的力量
BlenderBot 2.0 建立在 BlenderBot 的独特功能之上。它表现出鲜明的个性,能够利用先前的知识并表现出同理心。然而,它更擅长举行多节对话和运用知识。它更忠实地记得以前的交互,并且它的话语事实上更一致。我们可以将这些改进归结为两个新特性:
- 一个长期的本地记忆库。
- 随时随地访问互联网的能力。
长期本地记忆存储
BlenderBot 2.0 学会了从大量人类对话数据中进行对话。它知道对话是如何构建的,以及根据上下文应该使用的风格。然而,我们谈论的内容在不断变化。当我们与另一个人交谈时,我们对彼此的所有共享的先验知识对于交谈的成功至关重要。
由于这个原因,BlenderBot 2.0 有一个长期的内存存储。它可以把大量的知识写在里面,供以后使用。脸书大学的研究人员 Jason Weston 和 Kurt Shuster 在他们的博客中分享了一个例子来说明这是如何发生的:
BlenderBot 2.0 保存了关于自身及其伙伴的内存知识——已编辑。原创于脸书博客
这一功能最有希望的一面是,随着系统不断生成话语,它创建了自己的背景、个性和生活经历,这些都被存储起来,并随着时间的推移保持稳定。因为它还保存了关于其对话伙伴的信息,所以它建立了我们所说的健壮的虚拟关系。
BlenderBot 2.0 可以引出你在之前的对话中谈到的话题或想法。例如,“如果你几周前与它谈论汤姆·布拉迪,它可能会在未来的对话中提到 NFL,因为它知道这是一个与你相关的话题。”共同的记忆滋养了我们的关系。这种能力使它比其他任何对话式人工智能都更像人类。
互联网接入增加知识
与其他语言模型相反,BlenderBot 2.0 并不局限于它已经被训练过的知识或者它已经存储在本地存储器中的知识。它可以访问互联网以搜索相关的上下文信息。如果你提到一些系统不知道的东西,它会立即去寻找关于这个话题的最新信息。然后,它可以使用这些信息来推进对话,并进一步阐述某个主题或其个性。
例如,在下面的例子中,与 BlenderBot 2.0 交谈的人提到了海湾地区。BlenderBot 搜索这个词,并立即使用它来创建自己的一个新方面:“我住在旧金山湾区。”
BlenderBot 2.0 访问互联网来查找上下文信息—经过编辑。原创于脸书博客
这个特性的威力是双重的:首先,BlenderBot 2.0 不会过时。像 GPT-3 这样的系统是用静态数据训练的,所以世界上发生的新事物不会被系统捕捉到。相反,BlenderBot 2.0 总是可以再次查找信息来更新它已经知道的内容。
第二,它对几乎所有事物都有无限的知识。因为它不会忘记它所知道的(由于它的记忆库),它可以在以前的知识上建立一个人物角色。在我们拥有的最丰富的数据库的帮助下,它可以一直保持增长的特性;互联网。
结合记忆和外部知识——一个独特的架构
BlenderBot 2.0 背后的想法是创建一个对话式人工智能,可以添加对话中不包含的信息。这是一个可以创新地推动对话走向新道路的系统。为了实现这一点,BlenderBot 2.0 使用了脸书的检索增强生成方法。它允许系统不仅根据对话本身,而且通过访问其存储器或互联网数据来决定对什么做出响应。
BlenderBot 2.0 算法结构——在脸书博客中
我们人类以类似的方式发展——保持距离。我们感知世界,并与世界互动,以获取知识和生活经验。我们与其他人发展关系,也从不同的来源(包括互联网)学习。我们获取关于世界的信息,并将其与我们先前的知识相结合,小心地储存在我们的记忆数据库中。这就是我们进化和成长的方式,也是我们决定下一步做什么的方式。所有这些,加上我们自身的稳定性,造就了我们。BlenderBot 2.0 是我们最接近以这种方式构建的人工智能。
比 GPT 3 号有更多的记忆和知识
GPT 3 号是无记忆的
这个高超的语言模型在许多不同的生成任务中被证明是成功的。它掌握了语言的形式,以至于它的文本甚至可以轻易地愚弄精通技术的人。然而,它的一个缺点是记忆力差。在适当的提示下,GPT 3 号可以成为一名优秀的诗人,但第二天它又会变成一名新手。该系统并不打算保存以前的对话。相比之下,我可以向 BlenderBot 2.0 提到,我喜欢早餐吃西兰花和鲑鱼,三周后它可能会建议我在菜里加入土豆。
GPT-3 的内存不足不仅仅是一个与实用程序相关的缺点。这让它缺乏个性。不可避免地感觉我们在和一台机器对话。在一段时间内,它可以让我们忘记它是一堆 1 和 0。但它最终总是暴露自己,因为它没有一个稳定的行为。
GPT-3 已经过时了
许多用户发现 GPT 3 号的另一个缺点是缺乏最新知识。GPT-3 是在一个变化比以往任何时候都快的世界中根据静态数据进行训练的——全球数据量每两年翻一番。以这种方式训练的系统可能成为幻觉的受害者——对不真实的信息充满信心。例如,一个用户问 GPT-3 史蒂夫·乔布斯现在在哪里,系统回复:“我在加州库比蒂诺的苹果总部。”史蒂夫·乔布斯十年前就去世了,但是 GPT-3 没有储存这些知识。
这不仅降低了 GPT-3 的实用性,甚至还会带来危险。这就是为什么 OpenAI 的研究人员建议不要将该系统用于高风险类别。我们希望对话式人工智能总是给我们最新的信息。如果有一天我们要依赖这些系统,我们将需要它们每分钟都被更新。
结论
BlenderBot 2.0 是向类人对话式人工智能的又一次飞跃。就目前而言,它具有人格、同理心、记忆力,并能从互联网上获取和使用知识。下一个技术挑战是多模态;一个聊天机器人可以使用图像——或其他类型的感知数据——来更接近地模仿人类相互交流的方式。
另一个至关重要的挑战是安全性。微软的 Tay 证明了这些系统很容易走上仇恨和不宽容的道路。我们应该让这些系统充满道德过滤器,以避免它们产生“不安全或攻击性的言论”。脸书人工智能团队开发了两种方法来对抗恶意意图:固有的安全性和对困难提示的鲁棒性。
要完全信任这些系统还有很长的路要走,但似乎人工智能的安全、道德和问责现在是推动该领域发展的大型科技公司的优先事项。我想大多数人会同意我的看法,这些方面比实现 AGI 更为紧迫。我们最终会实现这个目标,但最重要的是我们要尽可能做到最好。
订阅我的免费每周简讯明日之心获取更多关于人工智能的内容、新闻、见解和思考!
此外,请随时在 LinkedIn 或 Twitter 上发表评论和联系!😃
推荐阅读
在 Hadoop 和云之间:我们将何去何从?
在后新冠肺炎时代,企业必须准备好快速应对和适应。旧的 Hadoop 技术在这个新世界中有一席之地吗?
在 2021 年的新兴世界,大数据和机器学习仍然是圣杯,而对卓越速度和敏捷性的需求继续加快云的采用。旧的 Hadoop 技术在这个新世界中有一席之地吗?为了阐明这个问题,让我们思考一下什么是 Hadoop,以及云是如何影响 Hadoop 的。
在这篇文章中,你会:
- 了解 Hadoop
- 探索云上的 Hadoop
- 借助现代云平台展望未来
了解 Hadoop
Hadoop 为何如此重要?
曾几何时,随着我们业务的增长,我们开始产生太多的数据,无法用一台计算机来存储和处理。
也许是时候升级了?好的,所以我们买了一台更好的电脑,比以前的更先进,当然也更贵。
直到有一天,我们又一次产生了太多的数据,这台新电脑也放弃了。然而,购买一台又一台先进的计算机实在是太贵了,负担不起。
如果有太多的数据需要存储在一台计算机上,那么把它分成小块,存储在多台计算机上怎么样?
如果用一台计算机处理所有数据花费太长时间,我们为什么不把处理任务分成更小的任务,让多台计算机并行处理这些数据块呢?
你可能已经猜到了,Hadoop 让这两个想法成为了现实。
再也不用花一大笔钱去追求市场上最先进的计算机了!企业可以购买更多负担得起的日常电脑,以满足不断增长的存储和处理更多数据的需求**。**因此, Hadoop 的核心是提供一个可靠、可扩展且经济高效的平台,通过将非常大的工作负载分布在许多单独的计算机上来存储和处理数 Pb 的数据。
Hadoop 生态系统是什么样子的?
Hadoop 的核心组件
作者图片
作为存储层, **HDFS 是捕获所有数据处理任务的数据、中间结果和最终结果的地方。**在 HDFS 存储一个文件时,系统将它分成大小均匀的数据块,并将这些数据块存储在许多单独的计算机中(也称为 Hadoop 集群)。
如果说 HDFS 是将大数据分解成可管理的块进行存储,那么 **MapReduce 就是将一个大问题分成许多小块,这样你就可以并行处理它们,更快地解决问题。**Map 任务在存储数据的计算机上单独处理数据块,而 Reduce 任务将从各个计算机获得的所有结果组合成一个结果集。
MapReduce 负责数据处理,而 YARN 则负责资源管理,确保每一项工作都分配到合适的计算机上完成。这种使 Hadoop 能够运行除 MapReduce 之外的不同工作负载,最终扩展 Hadoop 功能以支持其他应用处理流数据或运行临时数据分析。
Hadoop 生态系统的其他部分
作者图片*(并非生态系统的所有开源组件都包括在内)*
凭借其 3 个核心组件,Hadoop 只是一个存储和处理数据的通用平台,没有任何搜索或查询结构化数据的特殊功能。这意味着它需要其他组件来形成分析大数据的完整解决方案。
例如,我们需要 Sqoop 和 Flume 分别将结构化数据(来自关系数据库或数据仓库)和事件数据(来自物联网设备或社交媒体网络)批量收集到 HDFS 进行分析和洞察。
此外,我们需要额外的工具来满足不同的任务,如用 Pig 编程,用 Hive 或 index 查询结构化数据,用 Solr 搜索。此外,其他工作流管理工具,如 Oozie,也在调度和管理 Hadoop 任务中起着至关重要的作用。
简而言之,正是开源组件的更大生态系统使得 Hadoop 在回答业务问题时非常有用。
十秒钟外卖
Hadoop 的核心是提供一个可靠、可扩展且经济高效的平台,通过在许多单独的计算机上分配非常大的工作负载来存储和处理数 Pb 的数据。 您可以购买您需要的多少台计算机,安装您想要的组件,留下您不需要的,并根据您的业务需求添加您的细微差别。
探索云上的 Hadoop
云是如何融入 Hadoop 的?
到目前为止,我们只讨论了公司购买、构建和维护许多计算机来存储和处理大数据的本地 Hadoop。但是从那以后,技术发生了巨大的变化。
如果可以在云端运行 Hadoop 会怎么样?换句话说,你只需从 AWS、谷歌云平台或微软 Azure 等云提供商那里租用你需要的多少台电脑,安装 Hadoop 并处理你想要多长时间(或多短时间)的数据,同时像每月支付电费一样支付给他们。
在我们探讨为什么有人愿意将 Hadoop 从内部迁移到云之前,理解云的含义很重要。这里有一个简单的定义,摘自我最喜欢的书“像我 10 一样解释云”。
云是一个计算机网络,通过互联网提供某种服务。你不关心那些电脑在哪里或者它们是如何工作的。你永远看不到他们。你从来不碰它们。它们只是一群供你使用的联网计算机。
—托德·霍夫
我们为什么要考虑在云上运行 Hadoop 呢?
在云上运行 Hadoop 的想法包含了许多引人注目的优势。下面是将 Hadoop 迁移到云中可以很好地解决的两个关键问题。
作者图片
如果不提及以下两点关于在云上运行 Hadoop 的要点,这将是不完整的。
- **许多公司不能或不愿意完全放弃昂贵的长期本地基础设施。**因此,他们可以选择混合云架构来在本地运行某些作业(如果出于安全原因数据无法上传到云中),并在云上处理其他工作负载。那样生活会更复杂,但在特殊情况下会足够好。
- 在云上运行 Hadoop 并不是解决所有问题的灵丹妙药。比如不能保证存更多的钱。不管你是否使用,你仍然需要为你所请求的东西付费。安装 Hadoop 组件、微调性能和正确处理网络仍然需要时间和专业知识。
十秒钟外卖
既然在云上运行 Hadoop 仅仅意味着一切如常,但是在云中,处理大数据进行分析和洞察还远远不是一个完美的解决方案。然而,它确实提供了一些希望,因为云可以节省您的大量工作,同时让您的 Hadoop 更快地启动和运行。
借助现代云平台展望未来
随着我们更深入地进入新的云世界,我个人看不出在云上运行 Hadoop 的意义。当我们也有一系列选择来通过现代云平台存储和分析大数据时,我们为什么要降低要求呢?
但首先,我们需要知道有哪些选择。所以让我们来了解一下吧!
选项 1:托管 Hadoop 服务
Being 是在云上运行 Hadoop 的一个进步,首选意味着利用云提供商提供的预打包 Hadoop 服务。一些例子包括 AWS Elastic MapReduce (EMR)、Google Cloud Dataproc 和 Microsoft Azure HDInsight。
它是这样工作的:**你按需创建 Hadoop 集群,定义需要什么 MapReduce 或 Spark 作业,让它们执行那些数据处理任务,并在得到结果后关闭它们。**虽然您仍然需要为消耗的计算资源付费,但您不必担心如何手动安装和配置 Hadoop 组件以及管理它们的性能。
然而,许多组织持怀疑态度,因为这样的预打包服务可能不足以应对复杂的需求或者导致供应商锁定。而且之前没用过 Hadoop 的人也在完全绕过它来避免复杂性和高学习曲线。
选项 2:云大数据解决方案
正如您可能已经猜到的那样,对于那些以前从未使用过 Hadoop 并且很可能负担不起专业知识的人来说,云提供商提供的大数据解决方案可能是真正的解决方案。简单地说,让我们永远摆脱 Hadoop。
在数据生命周期的每个阶段(即摄取、存储、处理和分析、探索和可视化),主要云提供商,如 【亚马逊】谷歌 和 微软 提供多种解决方案,专门满足终端用户不断变化的大数据需求。只要看一看他们的产品,我们就可以很容易地看到,与 Hadoop 生态系统相比,他们的选择真的是无穷无尽,而且同样多才多艺。还有呢?大多数云解决方案的直观图形用户界面意味着用户可以更快地从数据中获得洞察力并做出明智的决策**,而不必首先成为所有方面的技术专家。**
云解决方案的另一个关键卖点是人工智能(AI)和机器学习(ML)的附加组件。选项可以从现成的预训练 ML 模型到托管 AI 平台(用于从头构建您自己的模型)不等。用准确的预测为数据驱动的决策提供信息的能力是 Hadoop 难以企及的。
当然,生活中的每一件事,总有潜在的取舍。在这种情况下,如果您要用其他东西替换 Hadoop,一定的学习曲线是不可避免的。此外,你对特定于供应商的解决方案参与得越多,你就离开源世界和随心所欲工作的权力越远。
十秒钟外卖
一方面,摆脱 Hadoop 意味着远离开源解决方案,但提供了便利性、易用性和更强的 AI/ML 能力。另一方面,选择托管 Hadoop 平台需要关于 Hadoop 工具的专门知识,同时保留使用任何您想要的开源工具的自由。不幸的是,不存在完美的一刀切的解决方案,因为这是一个选择和优先事项的问题。
离别的思绪
用于大数据的旧 Hadoop 技术在这个大数据和机器学习的新世界中有一席之地吗?我想说,至少现在,Hadoop 不会很快完全消失。但我们正处于过渡阶段,不同的组织在不同程度上表现出让云补充或取代 Hadoop。
**由于速度和敏捷性的重要性,**云的采用不再是“是否”的问题,而是“多快”和“到什么程度”的问题。在后新冠肺炎时代,企业必须准备好快速响应和适应,云数据解决方案将蓬勃发展,并可能成为加速大规模创新和释放额外商业价值的重要因素。
如果你正在读这篇文章,感谢你的时间,我真的希望你能从这篇文章中得到一些价值。欢迎访问我在https://thedigitalskye.com/的博客,或者通过 LinkedIn 和 Twitter 与我取得联系,了解关于数据、商业和其他任何事情的激动人心的故事。各位,万岁,繁荣昌盛!
参考
【http://thedigitalskye.com】原载于 2021 年 3 月 1 日http://thedigitalskye.com/2021/03/02/between-hadoop-and-the-cloud-where-do-we-go-from-here/。****
小心数据分析中的偏见
影响数据分析的认知和统计偏差以及如何克服它们
作为一名产品分析师,你有没有遇到过这样的情况:你的团队有了一个产品想法(你认为这个想法非常棒),进行分析和实验,结果看起来不错,然后发布,却发现这个想法实际上很糟糕?然后你开始怀疑也许执行不正确——营销或运营方面出了什么问题?但是你有没有想过**问题可能在你这边?**可能,在你的分析中有一些失败将洞察力引向你不自觉希望、的方向,而不是它应该在的地方**。**
你可能已经注意到了这个迹象——当你继续挖掘数据,直到洞察力似乎“正确”。
图片来源:https://imgs.xkcd.com/comics/machine_learning.png
人类这种影响自己判断的主观天性被广泛称为 偏见 。引用维基百科的说法,认知偏差是一种“偏离 规范 或理性判断的系统性模式”。它已经在许多社会心理学和行为经济学研究中得到确认和使用,因为它影响人们在日常生活中的决策,包括在数据分析工作中。
偏见的类型
首先,让我们探讨一下常见的、对数据分析工作有重大影响的各种偏差。
认知偏差
认知偏差主要是干扰分析流程的主观性——假设、假设、研究问题,以及最终的探索性优先排序。
- 确认偏见:以确认一个人的先入之见的方式搜索、解释、关注和记忆信息的倾向(来源:维基百科)。这种偏差通常发生在表演的人有一个预先确定的假设,其中数据分析被用来证明它。然后他们继续查看数据,直到这个假设被证明。
- 可用性偏差:高估记忆中“可用性”更大的事件的可能性的倾向,这可能受到记忆有多近或它们可能有多不寻常或情绪化的影响(来源:维基百科)。根据组织中发生的历史事件或分析师的经验,会有一些分析师首先努力和优先分析的“首要”项目和问题。
- 框架:从相同的信息中得出不同的结论,这取决于信息是如何呈现的(来源:维基百科)。根据你分析的角度,有些方法可能太窄或太宽。有时,即使选择使用“绝对数字”或“百分比”,或者数据可视化中使用的轴刻度,也会给得出的结论带来巨大的差异。**
左图以某种方式显示了相关性,但当 viz 被调整到正确的比例时,它不再显示相关性(Pic credit:Sarah Leohttps://medium . economist . com/errors-we ve-draw-a-first-8 cdd 8 a 42d 368)
让我们举一个这些偏见结合在一起的例子。
假设你是一家电子商务公司的业务分析师。业务开发团队提出了一个请求,他们注意到交易量略有增加,希望了解这一现象的原因。
然后你还记得几周前有报道说市场某个位置发生了滥用推广的行为,膨胀了平台的总交易量。你怀疑同样的事情,虽然已经发生过一次,而且已经处理过了,但还会再次发生( 可用性偏差 )。
然后记住这个假设,你开始列出研究问题来证明这个 ( 证实偏差 )。你看之前欺诈区域的交易,他们的推广交易,他们新用户的交易等等。
然后观察该地区新用户促销交易的增加,您得出结论总体交易增加是由于在那里提出 100 万笔交易数据的欺诈。尽管 100 万笔交易仅占整个平台 1 亿笔交易增量的 1%,但这种情况还是会发生——这是我们最初的问题陈述( 框架偏差 )。
这不是分析和做出商业决策的理想方式,对吗?
在维基百科页面上阅读更多关于认知偏见的内容。
统计偏差
统计偏差大多是我们在做分析时不自觉陷入的技术谬误。
- 选择偏倚:在选择个体、群体进行数据分析时引入的偏倚,这种方法不能实现适当的随机化,从而确保获得的样本不能代表待分析的人群(来源:维基百科)。对于数据分析师来说,这主要发生在 产品实验 中。有些情况下,实验发生在预先选择的表现最佳的客户群,但实际推出的是所有客户群,这产生了不同的结果。或者当实验在几天的时间框架内完成时,该时间框架不能捕捉产品性质的每周季节性。
- 生存偏差:关注那些通过了某些选择过程的人或事,而忽略那些没有通过的人或事的逻辑错误,通常是因为他们缺乏可见性(来源:维基百科)。这种生存偏差会导致一些 错误信念 于治疗所给予的积极影响。例如,你正在分析你的产品中忠诚顾客的行为。你会发现,这些忠诚的客户大多来自客户推荐,最后,你会推荐客户推荐来获得潜在的忠诚客户。你可能会忘记,无论如何,客户推荐在你的新客户获取中占了很大一部分。
- 遗漏变量偏倚:选择偏倚的一个更具统计学特异性的版本,这是统计模型遗漏一个或多个相关(混杂)变量的情况。在数据建模中,这可能会导致模型拟合不足。或者当它被拟合时,它 可能不会足够健壮 ,因为遗漏了变量。
当识别和理解时,这些统计偏差比认知偏差更容易预防,因为技术细节可以被注意到和解决。
克服偏见
现在你知道了在数据分析过程中可能出现的不同偏差,你可能会问“我该怎么办?”。这里有一些提示,你可以用来更好地意识到偏见,并防止它们妨碍分析的客观性。
心态
- ****不要固执己见。你可能听说过“强有力的观点弱有力的持有”这句话,简单来说就是尽管你已经做了调查,并且(你觉得)你很了解自己的东西,但仍有可能你错了。记住确认偏差及其代价,然后向新想法敞开心扉——甚至是那些挑战你观点的想法。即使在检查了那个新想法之后(客观地!)你发现你最初的看法是对的,你会对此更加肯定:)
- 实验重点。作为上一点的延续,我们可能想训练我们的思维,把分析当成一次旅行,中间有一些实验。通过这些实验,我们探索数据并揭示洞察力而不管我们反对它们的立场。
- 避免走捷径。可以理解的是,大多数科技公司(尤其是初创公司)生活在高速时代,所有事情都需要在一个实例中完成。作为一名分析师,我们被推动着快速获得洞察力,并且更经常地以可用性偏差做出结论,或者以省略变量偏差创建数据模型,因为它们是我们的首选。在这种情况下,分析师和他们的领导应该站出来,在教育用户分析方面发挥咨询作用——这些事情可以很快完成,也不能很快完成。记住可靠的结果只能通过正确的方法和技术来实现。
执行技术
- 重新表述你的分析目标和假设。将分析目标从一个是/否的问题转变为一个更加精细和没有方向的问题。例如,不是“发现新产品是否增加交易”——这是一种假设积极影响的向上语气,我们可能想将其改为“新产品的表现如何?”——哪个更中性。
在 Unsplash 上由 Tachina Lee 拍照
- 从不同角度丰富你的分析。为了避免主观性,你可能想把自己放在一个分析的直升机视图中。思考分析中涉及的不同组件以及它们可能如何相互作用,该产品的变化将如何影响不同细分市场的客户—新客户、低使用率客户和忠诚客户。与其他分析师、研究人员、产品经理或设计师进行讨论可能有助于**获得新的观点。**
- 合适的样本和数据选择。特别是对于产品实验设置中的选择偏差,从不同客户群中获取随机样本以获得代表性,确保在进行统计测试之前达到最小样本量,并运行足够长时间的实验以覆盖数据带来的短期波动(即周末的高流量),这一点很重要。
最后的话
知道并意识到偏见的存在是一回事。然后你需要在进行分析时更加注意,做清单以防止偏见干扰分析。希望本文和技巧可以帮助您交付更好的数据分析结果。
小心数据转移
数据科学
训练数据和实施后数据之间的差异会导致模型性能不佳
艾莉娜·格鲁布尼亚克在 Unsplash 上的照片
用机器学习算法建立的预测模型在现实世界中往往表现不佳。
即使是由一些世界顶尖专家建造的人工智能,也常常难以在“实验室”之外复制出有前途的性能。一个突出的例子是在谷歌开发的医疗保健人工智能系统。
人工智能应用旨在帮助诊断。从癌症筛查到疾病检测和风险预测。
当在实验室环境中进行培训和评估时,这些应用非常成功。但是当在真实世界中进行测试时,例如在泰国的诊所中,性能无法与实验室环境相匹配。
在这种情况下,提供给算法的数据质量低于训练数据。但是许多不同的潜在原因导致了同一个问题:数据移动。
数据偏移是一个用来描述数据分布变化的术语。发生这种变化的原因有很多。然而,它们可以归结为三个主要机制。
- 导致目标变量发生变化的原因(与所使用的解释变量无关)。
- 导致解释变量变化的原因。
- 改变目标变量和解释变量之间潜在关系和/或模式的原因。
下面将进一步阐述这些机制。
理解数据转移的根源和影响是解决模型性能比预期差(模型性能下降)相关问题的先决条件。
分区在
想象一下。
您希望实现一个预测模型。这样做的过程很清楚。
首先,对可用于训练和验证的数据进行冗长而彻底的探索。然后,开发一堆各种各样的机器学习模型。
最后,正确选择和实现在各种验证过程中表现良好的模型。
什么会出错?
嗯,很多事情。人工智能和人工智能模型最常见的问题之一是数据底层分布的变化。无论是使用相当简单的回归模型还是复杂的算法,如深度神经网络,数据转移都是建模者头疼的一个常见原因。
1。先验概率转移
上面列出的第一种机制正式称为先验概率转移。
它描述了目标变量的分布发生变化,而解释变量(或输入变量)的分布不变的情况。
这可能是由于状态的改变。让我们假设您想要预测给定处方药药店将销售多少,以确保有效的供应管理。
你有一个模型,它考虑了居住在附近的人数、该药物治疗的疾病的发病率、该药物和替代药物的价格以及药房之间的距离。
但是不可预见的事情发生了,导致对该药物的需求发生了变化,尽管解释需求的变量没有变化。
快速嗅觉测试-检查是否应该花费更多资源来检测潜在的先验概率转移-只是绘制 1)用于训练和验证的数据集和 2)模型表现不佳的新数据集的直方图。
如果直方图看起来像下面这样,我们的嗅觉测试表明发生了变化。
由来自 G. Sarantidis 的代码生成的直方图。来源:https://gsarantitis.wordpress.com/
2.协变量移位
所列的第二种机制,改变了(的分配!)解释变量(或协变量或输入变量)是协变量移位。
在上面的例子中,如果居住在药店附近的人口大量增加,将会发生协变量转移,但这些人(出于某种原因)都没有任何条件要求他们需求所述药物。
测试协变量变化的一种方法是将新数据(来自模型实施但表现不佳的时期)与训练数据混合。
取出随机样本作为测试数据,并使用剩余的数据来训练模型,以预测观察值是源于原始训练数据还是新数据。
如果原始训练数据和新数据无法区分,就不太可能有协变量偏移。
如果它们是可区分的,你应该重新训练你的模型。
3.概念漂移
列出的第三种机制,即目标变量和解释变量之间关系的变化,通常被称为概念漂移。
发生这种情况有几个原因。其中有选择(一种确定性的观测去除),周期性变化(未被检测到),以及非平稳性。
概念漂移在时间序列中很常见。如何处理取决于具体问题,有时会受到可用数据的限制。
关于这件事的很好的介绍可以在这里找到。
外卖食品
数据偏移是机器学习方法的各种实现中的常见问题。从图像识别到预测建模。
发现和解决它们的困难程度因情况而异。
但是思考它们、测试它们、处理它们或者意识到它们如何对给定模型或算法的良好运行提出挑战是至关重要的。
所以亲爱的数据科学家们,当心数据转移。
小心紧缩的数据科学金字塔!
许多大型组织都在努力解决如何有效领导数据科学家的问题。以下是我所学到的。
- gaur av D lath iya 在 Unsplash 上拍摄的照片
前几天,我在阅读一篇关于人口老龄化的人口统计学论文时,突然想到人口金字塔和数据科学组织之间有一个相似之处。紧缩型人口金字塔是指金字塔底部变窄,即年轻人的比例较低。年轻人相对于老年人的低比例可能会导致人口抚养比的问题。我看到一些组织遭受同样的现象,但在数据科学、ML 和 AI 技能领域。试图利用数据科学和人工智能的大型传统组织似乎容易出现这种情况。
亚历山大·安德鲁斯在 Unsplash 上的照片
让我用木工来说明我的观点。年轻人可能在学校学过或没有学过一些基本的木工技能,通常开始为一个更有经验的木匠工作,磨砺他们的技能和经验,也许专攻木工的某个领域,然后从那里开始。过了一段时间,有些人会开始自己做生意,也许会自己雇佣刚从学校毕业的木匠。其他一些人没有发展的雄心或技能,他们会离开木工行业或留在他们觉得舒适的职位上。当老木匠退休时,他或她最有经验和才华的木匠将接替他/她的位置。这种情况接近于一个“固定”的金字塔,也就是说,你有一个相对较大的低技能或低经验的木匠群体,接着是一个较小的更有技能或更有经验的木匠群体,以此类推。随着更有技能/经验的团队指导技能/经验较少的团队,一段时间后,一个更小的团队将“提升”到下一个级别。
数据科学中的情况有些不同。多亏了我们大学的灵活性和适应性——我无法充分强调我对此有多高兴——许多刚毕业的数据科学家拥有令人印象深刻的技能。是的,他们可能缺乏一些经验,可能倾向于过度设计,但通过一些适当的指导,这可以变得尖锐。事实上,由于技术变化的速度很快,许多年轻的数据科学家拥有他们年长的同事可能缺乏的技能,因为他们上大学时不存在这些技能。这就是为什么数据科学家跟上其专业领域的最新发展至关重要。好的组织允许他们的数据科学家这样做。好的组织还会确保年轻的数据科学家能够从年长且更有经验的同事那里学习如何在商业环境中应用他们的技能。如果这种情况发生,数据科学可以接近我们在木匠身上看到的“静止的”金字塔。
唉,事实并非总是如此。通常情况下,年长的数据科学家是伪装的商业智能人士,他们没有多少东西可以教给年轻一代(除了坏习惯)。只要这些人没有被赋予领导角色,他们就是无害的。当没有适当数据科学背景的人被要求领导数据科学团队时,问题就出现了。这很少奏效。是的,我们都听说过关于营养学家或艺术史学家成为杰出的数据科学领导者的故事,但这些都是例外。我听到许多数据科学家抱怨说,他们的组织雇佣了一个不太熟练的经理。我从数据科学家那里听到的抱怨比从其他部门的人那里听到的更多。出现这种情况的原因有很多。首先,在许多(传统)组织中,数据科学(或 ML 或 AI)不是业务的核心。他们只是雇佣了一大批数据科学家,因为他们想“用人工智能做点什么”。然后,该团队通常向更传统的职能部门(如 IT 或营销)报告,因此由这些部门的人员管理。这并不总能带来幸福的婚姻。
另一个原因是——我们需要诚实地面对这一点——没有多少数据科学家同时是好经理和好数据科学家。因此,公司希望让他们的(昂贵的)数据科学家担任适合他们的角色是合乎逻辑的。但是,现实是,这种情况会导致很多挫折。我个人认为这(部分)解释了一些数据科学团队遭受的高周转。
你可能想知道为什么所有这些似乎更经常发生在(传统公司的)数据科学部门,而不是其他职能部门。例如,我还没有见过很多组织的财务部门都是金融天才,但首席财务官是没有学位或多年金融经验的人,但这正是我在一些组织中看到的数据科学。
再比如法律。许多没有大型法律部门的组织仍然有一个首席法律官,如果需要的话,他会雇佣法律助理。然而,首席法律官将与首席运营官、CMO 和其他高管坐在一起,而数据科学家在最好的情况下,坐在首席运营官、CMO 或首席技术官组织的某个深处。当然,有些组织有首席数据官或首席科学官,但这些人通常不擅长(数据)科学。我很幸运,我曾经向一家大公司的首席科学官汇报过,他实际上有科学背景,但我觉得这是一个例外。
那么解决办法是什么呢?首先,我们需要鼓励年轻的数据科学家投资于领导技能,以便数据科学领导角色可以由数据科学家来担任,而不是由退休的 BI 人员来担任。
这并不容易,因为年轻的数据科学家经常觉得这种东西很无聊。此外,领导力有时会与政治混淆。我认识的大多数数据科学家讨厌公司政治,这是理所当然的。这通常是破坏性的,不符合公司的利益,而且相当无聊。但是,在大型组织中,如果您希望您的数据科学团队保持业务相关性并普遍繁荣,政治也是必不可少的。我见过一个案例,数据科学领导者感觉自己凌驾于公司政治之上,只关注技术方面的东西。最初,她赢得了团队成员的尊重。他们对她的技术实力印象深刻,他们喜欢她不玩政治游戏这一事实。然而,一段时间后,她的团队变得与业务完全无关,人们会从她的团队转移到其他部门。最初为她欢呼的那些人很快就抱怨她没有照顾他们的利益并离开了。顺便说一下,请注意,像这样的案例强化了这样一种观点,即数据科学家不具备在大型组织中取得成功的管理技能,这让我们回到了起点。
其次,组织最好考虑让谁负责数据科学团队,以及该团队如何融入组织的其他部分。正如我上面提到的,我知道许多数据科学家对级别比他们高的人缺乏技能感到沮丧。有时是因为这些数据科学家并不总是看到那些人确实拥有的技能,那么这就是教育的问题。但有时你只需要为工作雇佣合适的人。请注意,我并不是说他们都应该有博士学位。这大多是不相关的。很久以前,我是一个大型组织中一个小团队的成员。顺便说一句,我们都有博士学位,只有老板没有。然而,他也比我们更有知识和经验,所以没有人质疑他的领导能力,恰恰相反。
最后,让我重复一遍,我上面描述的现象在将数据科学作为其业务核心的组织中不会发生。我主要在试图利用数据科学和人工智能的大型传统公司中看到这种情况。显然,在这些组织中,数据科学存在领导问题,或者至少是感觉上的领导问题。数据科学家需要证明,在领导力方面,数据科学不仅仅是 BI++。
在 Unsplash 上由 Boitumelo Phetla 拍摄的照片
小心熊猫的虚拟变量陷阱
使用pandas.get_dummies()
对数据进行编码时需要记住的重要注意事项
由 www.freepik.com sentavio 制作的 Man vector
处理分类变量是机器学习管道的重要组成部分。虽然机器学习算法可以自然地处理数字变量,但这对于它们的分类对应项是无效的。虽然有像 LightGBM 和 Catboost 这样的算法可以固有地处理分类变量,但大多数其他算法都不是这样。这些分类变量必须首先转换成数字量,以输入到机器学习算法中。有许多方法可以对分类变量进行编码,比如一次性编码、顺序编码、标签编码等。但是本文着眼于 pandas 的虚拟变量编码,并揭示了它的潜在局限性。
分类变量—快速介绍
一个 变量 的值在多个类别中变化,称为分类变量,如性别、头发颜色、种族、邮政编码或社会保险号。两个邮政编码或社会保险号的总和没有意义。同样,邮政编码列表的平均值也没有意义。分类变量可以根据它们分组的元素种类分为两个子类别:
分类变量|作者图片
- 名义变量是那些类别没有自然顺序或排序的变量。例如,我们可以用
1
表示红色,用2
表示蓝色。但是这些数字没有数学意义。也就是不能相加,也不能取平均值。属于这一类别的例子有性别、邮政编码、头发颜色等。 - 有序的变量有一个内在的顺序,这在某种程度上是有意义的。一个例子是跟踪学生的成绩。另一个例子是 T4 人的社会经济地位。
用“`pandas.get_dummies()``编码分类变量
现在我们知道了什么是分类变量,很明显我们不能在机器学习模型中直接使用它们。它们必须被转换成有意义的数字表示。这个过程叫做编码。有很多编码分类变量的技术,但是我们将特别关注由 pandas 库提供的一种叫做[get_dummies()](https://pandas.pydata.org/docs/reference/api/pandas.get_dummies.html)
的技术。
顾名思义,pandas.get_dummies()
函数将分类变量转换成哑变量或指示变量。让我们通过一个简单的例子来看看它是如何工作的。我们首先定义一个由公司员工属性组成的假设数据集,并使用它来预测员工的工资。
我们的数据集看起来像这样:
df
员工数据集|作者图片
我们可以看到在上面的数据集中有两个分类列,即Gender
和EducationField
。让我们使用pandas.get_dummies()
将它们编码成数字量,它返回一个虚拟编码的数据帧。
pd.get_dummies(df)
作者图片
列Gender
被转换成两列— Gender_Female
和Gender_Male
,它们的值要么是 0,要么是 1。例如,Gender_Female
在有关员工是女性的地方有一个value = 1
,在不是女性的地方有一个value = 0
。对于列Gender_Male
也是如此。
虚拟编码性别变量|作者图片
类似地,列EducationField
也根据教育领域分成三个不同的列。事情到现在都很明显了。然而,当我们使用这个编码数据集来训练模型时,问题就开始了。
虚拟变量陷阱
假设我们想要使用给定的数据来建立一个机器学习模型,该模型可以预测员工的月薪。这是一个回归问题的经典例子,其中目标变量是MonthlyIncome.
。如果我们使用pandas.get_dummies()
对分类变量进行编码,可能会出现以下问题:
1️⃣.多重共线性问题
通过维恩图描绘多重共线性|图片由作者提供
注:上图非常直观的解释了多重共线性。感谢凯伦·格雷斯-马丁以如此清晰的方式解释了这个概念。请参考下面的链接转到文章。
https://www.theanalysisfactor.com/multicollinearity-explained-visually/
回归模型的假设之一是观测值必须相互独立。多重共线性发生在回归模型中的独立变量相关时。那么为什么相关性是一个问题呢?为了帮助你详细理解这个概念,避免重复发明轮子,我会给你看一篇由吉姆·弗罗斯特写的伟大作品,他非常简洁地解释了这个概念。以下段落来自同一篇文章。
回归分析的一个关键目标是隔离每个自变量和因变量之间的关系。对回归系数的解释是,当你保持所有其他自变量不变时,它代表自变量每变化 1 个单位,因变量的均值变化。
如果所有变量都是相关的,那么模型将很难判断某个特定变量对目标的影响有多大,因为所有变量都是相关的。在这种情况下,回归模型的系数将不会传达正确的信息。
pandas.get_dummies 的多重共线性问题
考虑上面的雇员例子。让我们从数据集中分离出Gender
列,并对其进行编码。
如果我们仔细观察,Gender_Female
和Gender_Male
列是多共线的。这是因为一列中的值1
自动暗示另一列中的值0
。这个问题被称为虚拟变量陷阱,可以表示为:
Gender_Female = 1 - Gender_Male
解决方案:删除第一列
多重共线性是不可取的,每次我们用pandas.get_dummies(),
编码变量都会遇到这个问题。解决这个问题的一种方法是删除其中一个生成的列。因此,我们可以删除Gender_Female
或Gender_Male
,而不会潜在地丢失任何信息。幸运的是,pandas.get_dummies()
有一个名为drop_first
的参数,当设置为True
时,它就能做到这一点。
pd.get_dummies(df, drop_first=True)
作者图片
我们已经解决了多重共线性,但是当我们使用 dummy_encoding 时,还存在另一个问题,我们将在下一节中讨论这个问题。
2️⃣.训练集和测试集中的列不匹配
为了用给定的雇员数据训练模型,我们首先将数据集分成训练集和测试集,将测试集放在一边,这样我们的模型就不会看到它。
from sklearn.model_selection import train_test_splitX = df.drop('MonthlyIncome', axis=1)
y = df['MonthlyIncome']X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2, random_state=1)
下一步是对训练集和测试集中的分类变量进行编码。
- 编码训练集
pd.get_dummies(X_train)
正如所料,Gender
和EducationField
属性都被编码成数字量。现在,我们将对测试数据集应用相同的过程。
- 编码测试集
pd.get_dummies(X_test)
等等!定型集和测试集中存在列不匹配。这意味着训练集中的列数不等于测试集中的列数,这将在建模过程中引发错误。
解决方案 1: Handle unknown by using .reindex and .fillna()
解决这种类别不匹配的一种方法是将对训练集进行哑编码后获得的列保存在一个列表中。然后,照常对测试集进行编码,并使用编码的训练集的列来对齐两个数据集。让我们通过代码来理解它:
# Dummy encoding Training set
X_train_encoded = pd.get_dummies(X_train)# Saving the columns in a list
cols = X_train_encoded.columns.tolist()# Viewing the first three rows of the encoded dataframe
X_train_encoded[:3]
作者图片
现在,我们将对测试集进行编码,然后重新排列训练和测试列,并用零填充所有缺失的值。
X_test_encoded = pd.get_dummies(X_test)
X_test_encoded = X_test_encoded.reindex(columns=cols).fillna(0)
X_test_encoded
作者图片
如您所见,现在两个数据集拥有相同数量的列,
解决方案 2:使用**One Hot Encoding**
另一个更好的解决方案是使用[sklearn.preprocessing](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.preprocessing).OneHotEncoder().
。此外,我们可以使用handle_unknown="ignore"
来解决由于稀有类别而导致的潜在问题。
#One hot encoding the categorical columns in training setfrom sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(sparse=False, handle_unknown='ignore')
train_enc = ohe.fit_transform(X_train[['Gender','EducationField']])#Converting back to a dataframe
pd.DataFrame(train_enc, columns=ohe.get_feature_names())[:3]
作者图片
# Transforming the test settest_enc = ohe.fit_transform(X_test[['Gender','EducationField']])#Converting back to a dataframe
pd.DataFrame(test_enc,columns=ohe.get_feature_names())
作者图片
注意,你也可以通过设置参数drop=’if_binary’
来删除 OnehotEncoder 中每个特性的一个类别。更多细节请参考文档。
结论和要点
这篇文章研究了如何使用 pandas 对分类变量进行编码,以及与之相关的常见注意事项。我们还详细研究了避免这些陷阱的可行解决方案。我希望这篇文章能让你直观地了解什么是哑变量陷阱,以及如何避免它。此外,本文中引用的两篇文章是很好的参考,尤其是如果您想更深入地研究与多重共线性相关的问题。我强烈推荐他们。
👉有兴趣看我写的其他文章。这个 回购 包含了我分类写的所有文章。
超越准确性:NLP 模型的行为测试
ACL 2020 最佳论文奖(研究论文演练)
作者图片
在自然语言处理 (NLP)中,我们经常将某种准确性度量视为我们模型正确性的证明。但是很明显,这种自动化的客观评估最终导致高估了模型的性能,主要是因为测试分割的代表性不足和低容量。另一方面,对于如此大量的训练数据,模型很可能学习某些特定于任务的快捷方式以在测试数据上表现良好,而不是学习一些可能对当前任务有用的低级基本语言属性。
考虑到这些普遍存在的挑战,研究人员引入了 清单 的概念。清单是一种新的评估方法,用于 NLP 模型的综合功能测试,其中我们有一个由语言 能力组成的矩阵,例如命名实体转换、否定、对错别字的鲁棒性等,以及测试类型,如最小功能测试 (MFT)、方向期望 (DIR)和不变性测试作者还发布了 CheckList 作为工具,使用户能够使用精心制作的模板、 词汇库、、扰动、上下文感知建议使用 、罗伯塔 等生成大量测试用例。现在让我们详细了解一下测试类型—
- 最小功能测试(MFT) 在其能力范围内,在一些精选的任务特定测试样本上检查模型的行为。它的灵感来自软件工程的单元测试。例如检查消极情绪的否定——
句子: 饭菜不差。(消极或积极情绪)
理想情况下,在这种情况下,模型应该能够预测和理解否定,并输出积极或中性的情绪,如果没有,那么测试用例将被视为模型的失败。
2.方向期望(DIR) 查看具有相同意图的当前句子的任何扩展是否改变了模型预测一定的量。比如说—
原句 :我不喜欢这种食物。(-ve 感悟)
修饰句 :我不喜欢这种食物。 真是无味 。(-ve 感悟)
理想情况下,在这种情况下,模型不应该在相反的方向上显著改变情绪。如果超过了用户定义的阈值,那么测试用例将被视为模型失败。
3.不变性测试(INV) 通过扰动原始句子来查看类别标签是否改变。扰动可以是 NER 级别的(比如改变句子中的位置),用同义词替换单词,引入一个字符的输入错误,等等。比如说—
原句 :我要你们成为第一个飞往加拿大的人。(预测 A 类)
修饰句 :我要你们第一个飞到Cuba*(预测 A 类)*
理想情况下,在这种情况下,模型不应该改变类标签。如果是这样,那么测试用例将被视为模型的失败。
评估 SOTA 模型
作者们继续前进,为情感分析、机器理解和 Quora 问题对的任务评估了一些最先进的(SOTA)研究和商业模型。他们选择了微软,谷歌和亚马逊的付费 NLP APIs 作为商业模型的选择,选择了 BERT,RoBERTa 作为研究模型的选择。来自论文的下图显示了情感分类任务的各种语言能力测试的上述测试类型的结果。
(修改)图 1 来自来源
让我们来理解上表中用红色圈出的例子—
作者测试了所有 5 个模型的健壮性属性,方法是在推文中添加随机 URL、用户名,甚至诱导一个字符交换作为输入错误。因此,理想的预期是情绪不会改变*(不变性测试),*,但是他们发现商业模型的失败率为 5%–25%,研究模型的**失败率为 3%–11%**这是非常令人震惊的,因为这些是非常简单的鲁棒性检查,没有涉及任何显式的复杂性,然而模型却混淆了。
作者测试了所有 5 个模型的 NER 属性,方法是用其他位置替换实际位置,变换人名等。理想的预期是,这不应该影响预测,并让模型将其预测切换到完全不同的类别。但令人惊讶的是,他们发现一些模型的失败率高达 20% ,这意味着它们只有 80%的准确率,如果你在文本中改变一个人的名字,预测就会被推翻。这暗示了训练这些模型的训练数据具有一些常见姓名的主要出现,并且模型已经以某种方式学习了姓名和情感的一些关联,而不是忽略这一点并且仅仅关注触发情感的语言属性和结构。像 RoBERTa 这样的研究模型,即使不完美,也有不错的表现。
作者通过否定给定文本中的否定词、中性词和肯定词来测试所有 5 个模型的否定属性。结果确实令人惊讶,因为他们发现对于某些模板,有些模型****100%失败,然而,几乎所有的模型都有超过 30% 的失败率。
另外,我想请你花至少 2 分钟时间看看上面图片的其他结果。我敢肯定,你会震惊的!!
因此,很明显,如果你已经注意到作者选择的转换类型是非常直接和简单的,没有任何进一步的困难分层,然而付费模型显示了它们的显著局限性。话虽如此,现在看起来是时候使用这样的框架和常规的测试分割测试来更彻底地测试我们的 ML 模型了。
注释工具
为了便于大规模生成测试用例,作者开源了清单,启用了模板化功能和屏蔽语言模型建议(如 BERT 和 RoBERTa ),以获得任何屏蔽词的扰动建议和通用扰动,如字符交换(模拟错别字)、缩写、名称和位置变化(用于 NER 测试)等。一个样本模板如下所示—
Sample _ Template = " I { NEGATION } { POS _ VERB } the { THING } "
我不喜欢这食物。
我不喜欢这道菜。
Sample_Test_3 =我不喜欢这项服务。
等等…
他们围绕这一点设计了一个非常简单易用的用户界面,以方便非技术人员也能大规模地生成示例。请务必检查其他功能,网址为—
https://github.com/marcotcr/checklist/blob/master/notebooks/tutorials/visual_suggest.gif
P.S. 我也正在为这篇论文做一个多语种字幕的视频讲解。一旦发布,我会在评论中更新!同时,我在我的频道上已经解释了很多论文,你可以在— 查看
https://www.youtube.com/c/TechVizTheDataScienceGuy
更新—2020 年 8 月 2 日
视频讲解者
清单
你也可以查看我写的其他研究论文的解释
如果你仍然对某件事感到困惑,一定要朗读这篇文章。也向作者们说声“ Hi ”,感谢他们的贡献。
**论文题目:**超越准确性:NLP 模型的行为测试与清单
**论文链接:**https://www.aclweb.org/anthology/2020.acl-main.442.pdf
**论文代号:**https://github.com/marcotcr/checklist
组织:微软研究院,华盛顿大学,加州大学欧文分校
我希望这篇简短的阅读值得你花时间。如果你喜欢这段内容,一定要在 拍拍 让大家知道。
谢谢!
超越异常检测
异常检测!=威胁检测。
来自 Pixabay 的奇莫诺
任何熟悉安全操作中威胁检测的人都可能听过类似的解释。它总是像这样,“剖析正常行为,然后检测异常。”该过程包括从您环境中的几个不同传感器生成数据,并使用该数据来定义某种基线阈值。然后,您可以根据超出该特定阈值的任何传感器数据生成警报。这一切都有点抽象——让我们更深入一点。
熟悉机器学习的人都会知道监督学习和非监督学习这两个术语。通常人们将无监督学习与异常检测联系在一起,但我们实际上可以使用其中任何一种来检测异常。事实上,我们可以将机器学习的思想应用于人类学习和静态分析。最佳威胁检测通常由静态检测(规则)、机器学习和人类学习的某种组合组成。我们将把无监督学习的重点放在聚类上,将监督学习的重点放在分类上。
**聚类。**当人类和算法执行聚类时,它们会为不同的数据块生成逻辑组。这些组将从数据特征的组合中出现,而不是依赖于任何特定的特征作为标签。换句话说,数据中不应该直接显示“该产品属于 A 组”。分析师或算法会根据该产品与 A 组中其他产品的“接近度”将该产品归入 A 组。在异常检测中,分析师或算法会生成这些组,并且“接近度”的测量值是阈值。如果一个数据项位于这个阈值之外,离集群太“远”,这就是异常。
安全分析师可以根据工作时间生成一个简单的聚类。如果组织有 9-5 个工作时间,我们可以在下午 1 点左右生成一个阈值为+/- 4 小时的集群。任何超出这个时间范围的事情都会产生警报。更现实的集群应该根据服务、交互时长、数据量和其他因素将不同的交互分组到用户和管理员的不同基本活动中。奇怪的活动会落在这些集群之外,分析师可以对它们进行调查。如果他们发现活动是良性的,他们可以将它们添加到一个新的集群组中,或者扩展阈值以消除这些错误警报。
分类。关于数据项的哪些特征是特征还是标签,没有正式的规定。我们可以将数据的任何特征指定为标签,并使用其他特征来预测它。在这种情况下,我们使用数据中的不同字段来预测另一个字段。分析师或算法可以选择哪些字段提供最佳阈值,以便仅警告真正的异常。我们还可以将不同流中的不同数据条目组合成一个单个数据对象,然后使用不同的数据条目进行高保真预测。
例如,如果我们考虑一个 NGINX 日志条目,我们在一个条目中有以下特征:IP 地址、日期、方法、URL、协议、状态、发送的字节、referer 和用户代理。现在,让我们想象一家企业,其中大多数用户在工作日的任何时候都使用/home URL 从浏览器访问 web 服务器。他们的请求使用 GET 方法,响应非常大,因为它提供了整个网页。然而,有些开发人员通过 API 从他们的代码中访问 web 服务器。他们向/api URL 发出 POST 请求,并得到简短的响应。他们通常只在临近工作日开始时提出这些要求。在这种情况下,使用 POST 方法的早期请求、简短响应和无用户代理字符串的组合将强烈预测/api URL。
上述方法将允许您检测异常,我们可以调查这些异常以发现威胁,对吗?这依赖于几个假设:
- 攻击流量比真实流量更加动态。换句话说,您的真实流量将通过聚类和分类保持可预测性,而攻击流量将是不可预测的流量。
- 在您能够生成的所有可用异常检测算法中,您选择的算法将最好地检测攻击。如果您专注于最佳异常检测,您将实现最佳威胁检测。
这些都是很强的假设。这些可能支持最基本的攻击,但高级攻击者正试图使针看起来像干草,这样你就不会看到他们的攻击是异常的。与此同时,大多数环境的变化速度正在迅速加快,因此新的异常流量将会越来越频繁地出现。还有,在不使用实际攻击数据测试这些算法的情况下,如何验证这些假设?即使您想使用异常检测,您也会想看看您的异常检测算法对实际攻击数据的效果如何。然后,使用真实的攻击数据,您可以生成算法,直接将数据对象分类为恶意或良性。您还可以让您的数据对象生成方法匹配不同的攻击生命周期,而不仅仅是做出有根据的猜测。你甚至可以将你的异常检测方法与其他方法结合起来,生成非常逼真的警报。
无论我们是在生成规则,训练分析师,还是使用机器学习,我们都应该有真实的数据,用我们实际上在寻找的东西来标记。在这种情况下,我们应该有良性传感器数据,我们将使用这些数据在异常检测方法中分析正常行为,和我们还应该有相同的传感器数据用于我们想要检测的恶意行为。因此,异常检测是不够的,它本身不会让您检测到巨大的威胁。
超越法典:一个可以训练的代码生成模型
codeT5 模型的概述和实践教程
潘卡杰·帕特尔在 Unsplash 上的照片
随着最近 OpenAI Codex 模型的发布,代码生成正在成为 NLP 世界的一个热门话题,这不仅仅是炒作。如果你看一个 Codex 演示,你会看到这些模型将如何塑造软件编程的未来。然而,从研究人员的角度来看,如果需求超出了通过 API 进行尝试,那么使用法典模型可能是不可实现的,因为预先训练的模型不是公开可用的。从技术上来说,你可以使用发表的论文复制 Codex,但你需要一个大型的 GPU 集群,只有少数人能够访问或负担得起。在我看来,这种限制会减慢研究的速度。想象一下,如果作者不共享预先训练好的权重,我们的 BERT 下游应用会减少多少。希望 Codex 不是唯一的代码生成模型。
这篇文章将概述 codeT5,这是一个编码器-解码器代码生成模型,具有公开可用的预训练检查点,您现在就可以尝试。此外,这篇文章包含了如何使用这个模型的实践教程。
CodeT5 概述
CodeT5 [1],顾名思义,是基于 T5 [2]编解码模型。与其他代码生成模型相比,它使用一种新颖的标识符感知预训练目标,该目标利用代码语义,而不是像对待任何其他自然语言(NL)文本一样对待源代码。该模型在许多编程语言中的代码生成和其他任务(如代码摘要、代码翻译、克隆检测和缺陷检测)中显示了有希望的结果。
作者发布了两个预训练模型:一个 6000 万的小版本和一个 2.2 亿的基础版本。他们还在他们的公共 GCP 桶中发布了他们所有的微调检查点。此外,这两个预先训练好的模型都可以从流行的 huggingface 库中获得。
预培训
依次使用两个不同的目标对 CodeT5 进行预训练。在前 100 个时期中,用识别符感知的去噪目标来优化模型,该目标训练模型以区分识别符(即,变量名、函数名等。)和特定编程语言(PL)关键字(例如,if、while 等。).然后,使用双峰双代物镜优化 50 个时期。最后一个目标旨在改进 NL 描述和代码之间的一致性。
**识别器感知的去噪目标。**seq 2 seq 模型中的去噪目标用去噪函数掩盖输入序列。然后,解码器尝试恢复原始输入。识别符感知的去噪在三个任务之间以相等的概率交替进行:
- *掩蔽跨度预测(MSP)。*这个任务类似于 T5 预训练中使用的任务,除了他们使用整体工作掩蔽来避免掩蔽子令牌(例如
##ing
)。此任务提高了模型捕获 PLs 语法信息的能力,从而提高了代码生成性能。 - *标识符标记(IT)。*在这个任务中,训练模型预测令牌是否是代码标识符,迫使模型学习代码语法和数据流。
- *屏蔽标识符预测(MIP)。*所有的标识符(如变量名、函数名等。)都隐藏在这个任务中。此外,相同标识符的所有出现都使用相同的标记令牌(即 MASK0)来屏蔽。该模型被训练成以自回归方式预测由标识符和匹配的标记令牌组成的序列。MIP 旨在提高 PL 语义理解,这有助于缺陷检测任务。
下图显示了同一数据样本的标识符感知去噪目标的每个任务的模型输入和目标的示例。
由 Amine Elhattami 执行的标识符感知去噪预训练任务
**双峰双代。**模型被训练用于双向转换,或者从代码到 NL 描述,或者同时从 NL 描述到代码。这个目的类似于 T5 的区间屏蔽,这里屏蔽的区间是整个 NL 描述标记或代码标记。该目标旨在缩小预培训和微调之间的差距。在预训练中,解码器仅看到离散的屏蔽跨度和标识符,而在微调中,解码器生成完整的 NL 描述或代码。下图显示了同一个数据样本的每个任务的模型输入和目标的示例。
由 Amine Elhattami 进行的双峰双代预训练
标记器
CodeT5 使用特定于代码的标记器,因为默认的 T5 标记器将一些常见的代码标记编码为未知标记。例如,花括号{
映射到未知令牌<unk>
。
CodeT5 记号赋予器是一个字节对编码(BPE) [3]记号赋予器,其词汇表大小类似于 T5 (32k)加上一些特殊的记号。在预训练期间,该标记化器跳过所有不可打印的字符和出现次数少于三次的标记,这导致标记化序列最多减少 45%。较短的靶序列有两个优点。首先,它加速了训练。第二,它使生成任务变得更容易。
训练前数据集
CodeT5 在公开可用的 CodeSearchNet 数据集[4]上进行预训练,该数据集包含约 200 万个训练样本,由六种 PLs (Javascript、Java、Go、Python、Ruby 和 PHP)中的代码和描述对组成。此外,作者从 BigQuery 收集了 C 和 C#数据集。但是,请注意,C 和 C# dataset 是不向公众发布的。但是,微调模型是可用的。
微调
CodeT5 已经在各种 PLs 中的大量下游任务上进行了微调。下表总结了所有任务。
Amine Elhattami 的下游任务列表
我的想法
在我看来,CodeT5 是一个有趣的模型,因为它可以在同一个预训练模型的多个下游任务中取得良好的结果,特别是在多任务模型中。此外,该模型需要更少的数据进行微调,这意味着训练时间短。例如,java 代码生成数据集只包含 100k 个训练样本。减少数据需求是一个至关重要的方面,因为您可能知道,数据收集是一项耗时的任务。然而,我认为有些地方作者本可以改进:
- 作者声称,与仅编码器和仅解码器模型相比,编码器-解码器模型更优越。然而,如果能与 Codex 模型进行比较就更好了,因为在本文发布时它已经可用了。
- 作者使用 CodeBLEU 作为代码生成任务的评估指标,正如 Codex 论文中所解释的那样,这并不理想。我知道他们选择了这个指标来与当前的结果进行比较。然而,如果能在人类评估数据集[5]上看到结果就更好了,该数据集通过单元测试评估功能正确性。
实践教程
使用预先训练的模型
以下示例显示了如何使用 huggingface 库来使用预训练模型。该模型可以执行任何预训练任务。但是,您将只使用预先训练的模型来进行自己的微调。
预训练模型示例
使用微调模型
要使用经过微调的模型,您必须下载所需的模型二进制文件和正确的模型配置文件。以下脚本下载两者。
下载微调模型
下载完成后,您就可以使用这个模型了。以下示例将预测 python 函数的 docstring。
微调模型示例
微调您的模型
除了预训练和微调的模型,作者还分享了他们的源代码,这意味着你可以微调你的模型。下面的例子训练了 python 代码摘要的微调。更多信息,请查看的知识库。
微调示例
请注意,上面脚本中使用的数据是 code 5[1]作者共享的现有公共数据集(BSD 许可证)的集合。下表描述了每个子数据集的来源。
Amine Elhattami 的子数据集列表
结论
这篇文章概述了 CodeT5 模型,并提供了使用公共检查点和训练模型的例子。也包含了我个人的想法。要了解更多细节,我邀请您阅读 CodeT5 白皮书并查看它们的源代码。我知道 Codex 是一个新手,但是 CodeT5 是目前你可以在任何合理的基础设施上训练的最好的模型(我认为)。
此外,我正在开发一个 VS 代码扩展,它允许您将任何代码生成模型连接到 VS 代码自动完成。所以,敬请期待!
*除特别注明外,所有图片均为作者所有。
在你走之前
在 Twitter 上关注我,我经常在那里发布关于软件开发和机器学习的微博。
参考
[1] CodeT5:用于代码理解和生成的标识符感知的统一预训练编码器-解码器模型。
[4] 评估语义代码搜索状态的 CodeSearchNet 挑战
[5] 人体评估数据集
[6] 将语言映射到编程环境中的代码
[7] CodeXGLUE:用于代码理解和生成的机器学习基准数据集
【8】通过神经机器翻译在野外学习 Bug 修复补丁的实证研究
[9] 设计:通过图形神经网络学习全面的程序语义进行有效的漏洞识别
除了相关系数和均方误差
回归模型比较的 MAD 分析——提高您对极限情况的理解。
作者图片
回归模型的性能可以用一个数字来概括——我们可以将模型在验证/测试集上的输出与实际情况进行比较。比较回归模型性能的常规方法有均方误差(MSE) 和相关系数,如 Spearman 秩序相关系数(SROCC) 或 Pearson 线性相关系数(PLCC) 。
在许多情况下,这些就足够了,但是,我们可以做得更好——深入了解模型预测的极限情况。
最大差异(MAD)分析于 2008 年在这篇视觉期刊论文中首次提出。后来在 2020 年进行了改进和扩展,举办了一场 gMAD 比赛。两篇论文都是针对评价图像质量评价方法的问题。其中模型比较受到验证数据的高成本的限制——来自人类观察者的主观分数。MAD 分析的关键思想是对两个竞争模型的预测差异最大的例子进行基准测试。
根据我的经验,最好的解释通常是基于一个例子。这篇文章中的一个例子可以在一本 Jupyter 笔记本中找到,供那些对即插即用感兴趣的人使用。
问题设置
在机器学习中,一切都从数据开始。我们正在解决的回归问题是基于来自 kaggle 的 CalCOFI 数据集(超过 60 年的海洋学数据)的一个很小的子集(不是 i.i.d .也不代表仅用于示例的数据集)。我们对模拟水的盐度和温度之间的关系感兴趣。
自变量和目标变量的散点图。图片作者。
为了模拟这种关系,我们使用了六种回归模型——从一阶多项式到六阶多项式。在这里,我们对最佳模型性能不感兴趣——模型只是用于举例。
每极预测与地面真实目标的散点图。图片作者。
最大差异分析
给定两种回归方法,MAD 过程的假设是任何两个条件之间的距离将更好地反映在更精确的尺度中。
例如,如果两个点根据二阶多项式拟合而接近,根据一阶多项式拟合而远离,并且根据地面实况而接近,则二阶拟合被认为是更好的模型,对于根据二阶多项式拟合而远离并且根据一阶多项式拟合而接近的情况,情况相反。
模型预测差异巨大的点选择示例。由红线连接的点将由 MAD 分析选取。图片作者。
实际例子
让我们把手弄脏,投入到 MAD 分析的实践中去。
在我们的示例中,对于每对回归方法,我们选择 100 对条件,这些条件根据测试方法具有不同的质量,根据基准方法具有相似的质量。因此,对于两个回归量 Rt 和 Rb,我们选择以下条件 oi 和 oj:
类似的 100 个条件,反之亦然。我们需要为基础数据中被认为相似和不同的东西建立规则。这总是有点棘手,理想情况下应该包括模拟温度分布,并选择一个统计上合理的阈值。然而,为了举例说明,如果两次测量之间的绝对温度差小于 1 度,我们假设这两次测量具有相同的温度,否则温度是不同的。
在选择了分数预测在两种方法中显著不同的点之后,我们可以计算统计数据。任何合理的措施都会奏效。
这里,我们通过测量一种方法将一对图像分类为相同或不同的能力来量化该方法的性能。和报告精度——被测试的质量度量正确分级并识别为不同的对的数量除以所选对的总数。行中的高值表示相应行中的度量对相应列中的度量的攻击成功率很高。
矩阵的每一项都是来自相应行的测试度量与来自相应列的基准质量度量配对时的精度。模特是按平均分排序的。图片作者。
请注意,根据 PLCC 和 RMSE 的说法,四阶、五阶和六阶多项式的性能相当。MAD 分析讲述了一个不同的故事,与其他模型相比,四阶拟合可以更好地区分配对。有趣的是,三阶拟合也比六阶多项式表现更好。内在 MAD 分析可以显示过度拟合的迹象。
如何用于主动学习
对于许多应用来说,我们用来比较算法性能的基本事实可能很难获得或者很难获得。想象一下,在上面的例子中,我们有机会获得 100 个额外的测量值。我们将对一组已知独立变量(温度)的五次多项式与六次多项式的预测值进行散点图绘制,然后选择他们最不一致的水盐度测量值进行采样。
该设置实现了两个目的:
- 我们得到了关于哪种方法区分得更好的信息
- 我们得到了一个新的度量标准来完善这个模型
总结和超越
实践和研究经验告诉我,没有单一的方法可以告诉你你的模型有多好。总会有一个指标支持你的解决方案,而另一个则反对。
MAD 分析是理解模型性能的另一种方法。MAD 不仅仅是规模比较的程序。除了比较模型之外,它还可以适用于在模型最不一致的情况下顺序获取地面实况数据的主动学习。虽然它在一维输出中的应用相当简单,但是将它扩展到更高的维度可能具有挑战性。
在错误分析中,有更多的技术是有用的,尤其是在模型投入生产之前!我强烈推荐这篇来自 Neptune.ai 的文章,它介绍了探索数据的更多方法。
如果你喜欢这篇文章,请与朋友分享!要阅读更多关于机器学习和图像处理的信息,请点击订阅!
我错过了什么吗?不要犹豫,直接给我留言、评论或发消息吧!
超越 CTRL+F
使用单词嵌入在文档中实现语义搜索
雷切尔·福雷兹在 Unsplash 上的照片
介绍
我们都习惯于这样的情况:我们需要在文档中找到一段文本,但却不太记得它到底是什么。我们可以回忆起一些重要的单词或文章的整体意思,但大多数文本处理器(从记事本到 Microsoft Word)只允许我们进行词汇搜索(即在文本中搜索与我们提供的输入完全匹配的内容)。确实没有别的办法:找到我们要找的东西的唯一方法是点击CTRL+F
(或者一些等价的组合,这取决于您的系统)来搜索一个单词或一个小表达式,并浏览一个潜在的大结果列表,直到我们找到与我们要找的东西相对应的那个。
当我们不确定目标结果中包含的某些确切单词时,这种做法会更加不方便。我们可能需要搜索不同同义词和不同词序的组合,直到找到匹配。
我最近一直在思考一个想法,那就是根据文本的意思而不是确切的单词来比较摘录。显而易见,不同的文本段落可以表达非常相似的意思,同时使用不同的词语、表达方式和词语安排。还有一种情况是,有时一段文字被修改了,但人类读者可以很容易地识别出它是从哪里来的。然而,从算法上确定它们之间的等价性绝非易事。
在本文中,我们将应用一种结合了 单词嵌入 和 词性过滤 的技术来实现文档内的语义搜索。为了说明这种技术的工作原理以及我们可以获得的结果,我们将尝试在简·奥斯汀的《傲慢与偏见》中搜索几段在书中不完全匹配的摘录。在第一个应用程序中,我们将从书中的第一个句子开始,搜索逐渐改变的版本,直到短语减少到最少。然后,我们将从巴西葡萄牙语翻译中提取一些段落,通过简单地调用 Google Translate 将它们转换成英语,并尝试在原文中找到这些段落。
在本文中,我不会深入讨论 Python 实现的细节。如果你感兴趣,你可以在 GitHub 上查看详细的笔记本这里。你也可以通过这个链接在 Google Colab 上打开它,这将允许你使用一个简单的表格自己运行一些关于古腾堡计划公共领域图书目录中任何作品的例子。
该方法
下面是我们在一本书里查找一段意思相同的段落的一系列步骤:
- 使用 单词嵌入 将书中的每个单词和请求的句子转换为密集向量表示(在这种情况下,我们将使用手套嵌入)。这种表示捕获了 300 维向量空间中单词的含义和。如果你对“单词嵌入”这个术语的含义没有信心,我强烈建议你花几分钟时间玩一下 TensorFlow 嵌入投影仪。真的很好玩!
- 将 词性 (如名词、动词、介词等)掩码应用于书籍和请求的句子:不属于任意定义的相关词性列表的每个单词都将嵌入转换为空向量。我见过的大多数 NLP 应用程序更喜欢从文本中删除一列停用词(经常出现的词,可以从文本中删除而不会失去太多意义)。我个人倾向于使用一个允许的词类列表,这让我可以更好地控制哪些词类将被保留或屏蔽。对于这个应用程序,我基本上保留了所有的名词、形容词和动词。
- 将 词袋 方法应用于句子嵌入:对句子中每个词的嵌入进行平均,并获得单个向量来表示其语义内容。用这种方法,文章意思的表达就是每个单词意思的平均值。
- 使用一个滑动窗口,将单词袋句子嵌入和词性过滤器应用于整本书,滑动窗口的长度为所请求的句子加上一个选定的边距(考虑到我们可能会提供所需摘录的一个非常短的版本),并对窗口内的单词嵌入进行平均。
- 计算请求句子嵌入和滑动窗口嵌入之间的 余弦距离 。
- 选择书中距离所要求的句子最近的位置。
总之,我们从书中找到与输入内容意思相似的段落的方法非常简单:我们将采用一个固定字数的滑动窗口,删除不相关的单词,平均出单个单词的意思,并满足于更接近输入内容的窗口。
搜索具有相似含义的文本
在这一系列的例子中,我们将从书中的第一句话开始,并使用我们提出的策略来搜索日益修改(屠宰,真的!)的版本。
这是我们要寻找的原始句子:
一条举世公认的真理是,一个富有的单身男人一定想要一个妻子。
首先,让我们尝试寻找完全相同的句子,以确保代码正常工作:
搜索精确匹配
毫无疑问,搜索成功了。毕竟,我们在寻找完全相同的句子。让我们把它变得更难一点,并改变 synonims 的一些单词:
搜索修改的句子
太好了!我们确实找到了对应的原句。但是,我们可以看到结果中有一点错位:缺少前 4 个单词,在末尾添加了 3 个额外的单词(或 4 个标记,考虑到点号)。这是反应的常见假象。因为我们使用的是滑动窗口,所以句子之间有很大的重叠,结果通常会靠右或靠左的几个单词。
现在,让我们超越同义词,更实质性地修改句子,包括一些简化。因为我们的输入会比我们预期的输出短一些,所以我们将以 10 的边距进行搜索(滑动窗口将比提供的输入长 10 个单词)。实际上,当使用由这种方法驱动的搜索引擎时,用户可能不得不试验这个参数。
搜索简单句
我们又有比赛了!
现在,让我们尝试一个极端的例子,只提供句子的要点作为算法的摘录。我们将再次使用 10 个单词的空白。
搜索最小句子
进展不太顺利。该算法找到了一个与我们在书中想要的原始句子不对应的匹配。
但是,我们可以循环浏览一些最热门的结果,看看是否会弹出实际的句子:
浏览多个结果
仔细查看前 10 个结果,我们看到我们正在寻找的原始摘录对应于条目 5 和 6。结果之间有很多重叠,所以在这个选择中实际上只有 4 个不同的部分,其中我们想要的结果是第三个。
编写一个识别这些重叠并将它们合并成单一结果的函数是相当简单的。在这种情况下,我们想要的摘录将是列表中的第三个结果。
根据译文寻找原文
我们现在将转移到一个略有不同的应用程序,在这个应用程序中,我们将查找与巴西葡萄牙语翻译相对应的摘录,而不是搜索从原著中手动修改的句子。
对于这些摘录,我们将使用googletrans
库自动将它们翻译回英语。然后,我们将使用我们的搜索例程,尝试在原书中找到相应的摘录。
你会注意到译文与原文大相径庭。虽然它肯定有相同的意思,但单词的选择和顺序是非常不同的。
我们从几个单句开始,从书中的第一句开始,然后再尝试几个单句:
单句
现在,稍微长一点的:
较长的句子
显然,翻译回英语的文本具有相同的含义,但措辞明显不同:
多个句子
较短的段落更难准确找到,但我们仍然能够正确识别它们:
简短对话
当我们提供更长的句子作为输入时,该方法更加健壮,因为找到另一个部分匹配的情况要少得多:
整段
在所有这些例子中,该方法能够从原始文本中识别出正确的摘录(在左边或右边给出或取出几个单词),即使翻译与原始文本非常不同。
结论
本文中提出的方法在搜索文档中与给定句子的意思相对应的摘录方面表现得非常好。将单词翻译成有意义的向量表示的核心和灵魂是由 GloVe word embeddings 提供的,大多数 NLP 工具都是从nltk
包中使用的。
我们将这种技术应用于一本书中某个段落的严重修改/简化版本的输入,以及一本书翻译的摘录,都得到了相似的正面结果。
不可否认,在给出的结果中有一些精选,尤其是在选择margin
参数时。在实际应用中,用户可能需要为该参数尝试几个不同的值,或者滚动候选结果的简短列表。然而,没有一个比当前的CTRL+F
程序更复杂,我们都不得不比我们想要的更频繁地执行。
通过一些小的修改,如合并重叠的结果和提高正确识别结果中相应段落的开始和结束的能力,该技术可以很容易地应用于搜索大型文档中的内容,这在目前是一项低效和耗时的任务。
如果您想知道如何选择通过结合单词嵌入和单词包方法来表示句子,而不是直接使用 transformers 来表示句子嵌入,请知道我的初衷正是如此。然而,当我使用单词嵌入的方法来获得基线结果时,我被结果的健壮性惊呆了,所以我决定保持简单并像这样呈现它们。
进一步的工作
在这一分析的下一次迭代中,我确实打算调查使用适当的句子嵌入会如何影响结果。
我相信这种方法可以作为一些文本处理程序的附件或作为 web 服务来实现。如果我有时间实现其中的任何一个,我会在这里发布链接!
我还认为这可以应用于监督学习的合成数据集的生成:基于翻译的书籍,它可以用于生成成千上万个具有等价含义的段落示例。
我们连线吧!
如果你觉得这篇文章很有趣,并且想要联系,请在 LinkedIn 上给我留言!你也可以看看我在 Medium 或Fabio-a-Oliveira . github . io上的一些作品。
超越线性量子关系
使用量子正态分布的经验教训
量子机器学习要不要入门?看看 动手量子机器学习用 Python 。
我想我卷入了一些事情。恐怕我现在也把你卷进来了。它始于一个无害的量子正态分布。我想如果我们用量子位来模拟高斯正态分布会很酷。
真的是。
用 Qiskit 创建正态分布是小菜一碟,因为 Qiskit 为此提供了一个现成的量子电路,如下面的清单所示。
作者图片
通常,这种类型的分布描述了一个群体的特征。我在最后几篇文章中使用的例子是一个人的身高。大多数人的身高接近平均水平。但是,一个人的身高离平均值越远,就越不可能看到这样的人。例如,你很少看到身高超过 2.1 米(6.9 英尺)的人,但你经常看到身高在 1.8 米(5.9 英尺)左右的人。
正态分布本身很好,但还没用。将这个值与一个因变量联系起来会很有趣,比如这个人是否需要闪开。
我不知道我在做什么。
我从简单开始。
我翻转了代表因变量(不属于正态分布的那个)的量子位,只有当我们将其他量子位中的一个测量为 1 时。
这种天真的方法奏效了,并产生了一些好的结果。
作者图片
但这意味着什么呢?一个状态的量子位越多是 1(而不是 0),闪避的概率就越高?这意味着个子小的人(数值为 011=3)比个子高的人(数值为 100=4)更容易闪避。
所以,我建立了一个人的身高和闪避需求之间的线性关系。我展示了一种比通过非门选择每个状态并逐个模拟效果更好的方法。
我们可以利用量子位的顺序,以及量子位的位置越高,它的效果就越高的事实。
我费力地编写了下面的代码。
首先,我们旋转三个量子位元中的每一个。第二,我们需要考虑一个问题,那就是我们不能简单地将量子位元所代表的机率相加。这对于最多由三个量子位组成的正态分布是可管理的。
所以,经过大量的反复试验,我想出了这个具体例子的一个概括,它适用于任何数量的量子位和任何斜率。
它工作得很好,并且产生了与从属伯努利变量的线性关系,即使对于如下所示的六量子位正态分布也是如此。
作者图片
所以,我坐在椅背上,想:“如果闪避的需要并不线性地依赖于人的身高呢?如果这个关系是二次的呢?如果这种关系可以用一个任意函数来描述呢?”
我花了将近一周的时间来编写产生线性依赖关系的函数。所以仅仅十行代码就完成了一周的工作。但是当然,我不允许自己不尝试创建这样一个函数。
于是,我开始思考一个二次关系。
这一次,我很幸运。我只花了四个小时就想出了如何修改我的代码来产生这个美丽的关系。
作者图片
四个小时听起来还不错。嗯,我也是这么想的。但是后来,我又看了看。变化是三个小字。
这是二次函数。
变化是在val = val + sign * prob_to_angle(step*(2**sum(2**q for q in part)))
行增加了2**
值得称赞的是,我不得不提到这四个小时的结果超出了我的预期。函数允许我们用公式表达任何可能的关系。
例如,下图所示的 sigmoid 函数怎么样?
作者图片
只需用这条线代替上面提到的线(对于四量子位正态分布):
val = val + sign * prob_to_angle(step*(5/(1+e**(0.8*(8-sum(2**q for q in part))))))
无意中,我创建了一个函数,它处理多个量子位如何形成一个变量。它抽象了单个量子位的处理,并提供了一个编程接口来插入我们想要的任何关系函数。
结论
这篇文章简要总结了过去几周关于如何对不同的发行版建模以及如何使用它们的文章。在量子计算中,我们经常使用伯努利分布,因为它们自然地符合量子位的概率观点。
但是在数据科学中,我们通常使用各种分布,比如正态分布。此外,我们不仅希望用这样的分布来表示我们的数据,而且我们还使用它们来模拟两个变量之间的关系。
因此,这篇文章探讨了如何使用我们已经开发的代码来建模这样的关系。
在我的下一篇文章中,我们将深入探讨这个函数。
量子机器学习要不要入门?看看 动手用 Python 学习量子机器 。
在这里免费获得前三章。
超越 ML Ops:业务自动化的治理
如何用商业政策和 IT 系统操作机器学习
对于企业应用和业务自动化,机器学习(ML)很少孤立使用。部署的 ML 模型几乎总是被一个“策略层”或一组业务规则所包围,以管理它如何被调用以及如何解释结果。有关为什么需要这些规则的详细信息,请参见上一篇文章。
结果,我们剩下三个很大程度上独立的生命周期,每个周期出于不同的原因产生新的版本:
三个独立的生命周期需要协调
当我们有新的数据进行训练时,当数据科学家改进他们的模型或应用新的算法时,新的 ML 模型就会被创建。同时,业务分析师细化业务策略,管理新产品的引入或营销推广。在 IT 方面,当引入新系统、应用新技术或开发新的应用程序版本时,就会发生升级。
正如所料,由于数据科学、业务和 IT 是独立的部门和独立的角色,我们的行业已经达成了很大程度上独立的治理解决方案:
- 数据科学:MLOps 专注于 ML 模型的治理,包括再培训、版本控制和对漂移和公平性的监控。
- 业务:数字决策,或决策管理——或自动化平台忙于业务规则、工作流程或其他形式的业务政策的版本化。
- IT: CI/CD 和数据治理分别专注于支持应用开发和数据治理。
实际上,我们现在有三个半独立的生命周期需要协调。我们可以允许它们自主旋转,使用各自的“最新和最好的”,或者我们可以将它们锁定在一起,强制进行某种“全局版本控制”。
您应该选择哪一个取决于上下文,这是我们将在本文中探讨的。我们将使用三个经典的 ML 用例来使其更加具体:
- 客户流失—管理零售业或电信业的客户保持率
- 产品推荐——根据购买倾向对产品进行排名
- 贷款风险评分——评估贷款承销的违约风险
“一次完成”:端到端升级
作为第一个示例,我们将探讨一个需要跨以下方面进行协调的案例:
假设我们预测了客户流失风险——客户取消产品订购的可能性——并且该预测目前使用的是一个 ML 模型,该模型针对客户细分、产品订购、时间客户和月度使用进行了培训。
这四项数据记录了客户的类型、他们订阅了多少产品以及他们使用了多少产品。但是,为了记录客户最近主动决定继续与我们合作的情况,我们还可以包括一个新字段,比如说, TimeOfLastSubscription。
添加新的数据字段会引发全面的变化:
- ML 训练需要从某个操作数据存储(由某个 IT 系统提供)中找到并提取新的数据字段。当被调用时,重新训练的 ML 模型现在除了原始的四个参数之外还需要新的 TimeOfLastSubscription 字段。
- 在业务方面,当请求基于 ML 的预测时,我们现在需要提供新的字段。此外,由于我们的预测现在更好了,我们可能能够删除现有的政策规则(例如,“如果客户在不到 3 个月前订购了产品,则永远不要提供保留优惠”)。
- 连锁反应持续到 IT 系统中,现在当请求保留提议决策时,IT 系统也需要提供 TimeOfLastSubscription 。负责跟踪订阅的 IT 系统也需要将这些数据提供给 ML 培训,从而形成闭环。
总之,当您向整个循环添加数据时,通常需要跨数据科学、业务和 IT 部门以协调的方式进行所有更改。就当这是“重大升级”吧。
“ML+规则”:预测与政策协同升级
作为第二个例子,我们将看一个案例,ML 和策略版本需要协调,但 IT 系统不需要。
考虑一个基本的产品推荐系统,其中我们使用 ML 来提供“购买倾向”预测。对于特定的客户和产品对,这可以预测客户购买产品的可能性。这种预测使我们能够创建一个排序的产品列表,以便向每个客户推广。围绕这一预测,我们通常有一套规则来过滤客户不符合条件的产品、客户所在地区没有的产品或客户已经拥有的产品。
现在考虑在我们的产品目录中引入一种新产品。最初,我们拥有该产品的客户非常少,因此 ML 模型不太可能准确地推荐它。结果是,我们没有向足够多的客户或错误的客户推荐它,因此新产品的采用速度很慢。
这个“先有鸡还是先有蛋”的问题需要通过积极的干预来解决,例如通过推翻基于 ML 的预测来推荐新产品并引导采用。在这种方法中,我们添加了一个规则,该规则“窃取”与新产品目标受众相似的旧产品的一定比例的推荐,并将这些推荐重定向到新产品。随着时间的推移,随着 ML 模型赶上并开始足够频繁地推荐新产品,这种重定向规则可以被逐步淘汰。
从实际治理的角度来看,这需要我们协调到新 ML 模型的升级和新版本的业务策略(包括重定向规则)。
这个用例是一个一般情况的例子,其中新的或重新训练的 ML 模型需要逐渐引入到操作系统中。当预测(还)不可靠时——不管是什么原因——有一段时间我们会忽略或调整预测以达到期望的业务结果。
“使用最新”:独立的 ML 升级
在许多情况下,来自 ML 模型的预测发展得比前两个例子慢得多。在这些稳定时期,在中断之间,我们可以频繁地自动重新训练和升级 ML 模型,而不需要与政策规则协调或审查 IT 系统。
例如,考虑贷款批准场景中的风险分数。ML 模型用于评估客户拖欠贷款的风险,给出客户的信息和历史,结合所申请贷款的规模和类型。该风险模型可以频繁地重新训练,以使评分更加精确,但是调用该模型所需的参数保持不变,并且返回的预测只会随着时间的推移而逐渐变化。
在这些情况下,当需要预测时,我们总是可以调用最新的 ML 模型版本,并且不需要对策略规则进行调整。然而,这要求用于重新训练模型的流水线是健壮的,并且能够检测数据错误,例如,并且监控 ML 模型随时间的漂移。
此外,即使有这些安全措施,谨慎的业务团队仍然会每月或每季度执行一次业务模拟——跨政策规则和预测——以确保生成的贷款决策提供预期的业务成果,并符合有关公平性等的法规。
总结
将机器学习应用于业务自动化并不困难,因为需要复杂的 ML 技术。它通常主要基于结构化数据,而回归或决策树等“经典”ML 方法通常足以对业务交易进行评分、风险评估和分类。
棘手的是业务自动化的“操作”方面(大规模决策)以及不断变化的业务目标和政策规则。改进基于最大似然的预测——当政策改变时——需要基于用例及业务环境而变化的方法。
在本文中,我们看了三个场景:
- 跨数据科学、业务和 IT 的端到端发布
- 数据科学和商业版本的协调
- 独立 ML 再培训
Greger 在 IBM 工作,常驻法国。以上文章为个人观点,不一定代表 IBM 的立场、策略或观点。
超越监控:可观察性的兴起
意见
现代数据和机器学习系统需要监控和可观察性。原因如下。
图片由作者提供。
重复的数据集或陈旧的模型可能会导致意想不到的(但严重的)后果,单靠数据监控是无法捕捉或预防的。解决办法?可观察性。
巴尔摩西蒙特卡洛 和 阿帕纳迪纳卡兰【CPO】*阿里泽艾 的联合创始人,讨论它与传统监测有何不同,以及为什么它对于构建更值得信赖和可靠的数据产品是必要的。*
垃圾进,垃圾出。这是数据和 ML 团队中的一个常见说法,有充分的理由-但在 2021 年,它不再是足够的。
数据(及其支持的模型)可能会在管道中的任何一点中断,仅仅在接收时考虑数据质量问题是不够的。类似地,当您部署 ML 模型时,可能会出现无数在测试或验证期间没有发现的问题,不仅仅是数据本身。
当你不知道你的环境中发生了什么,更不用说它是如何发生的,它会损害你的分析和实验的完整性,更不用说你的利益相关者的信任。
对于企业来说,这可能意味着收入损失、资源浪费和不明智的决策。在现实世界的应用中,由坏数据驱动的 ML 模型的后果可能更加严重。例如,2020 年,底特律的一名黑人在被面部识别软件错误识别后被错误逮捕并入狱,可能是因为偏见问题,其中包括以白人和男性为主的训练数据集。
不可否认,ML 中的坏数据问题非常普遍。由于种族主义、性别歧视和攻击性的标签,麻省理工学院最近撤下了他们全部 8000 万个微型图像数据集,在在线艺术项目 ImageNet Roulette 暴露出类似问题后,庞大的 T2 ImageNet 图书馆删除了 60 多万张图像。这些数据集多年来一直被用于训练 ML 模型——有严重缺陷的标签等等。
数据质量问题很常见,因为它们很难解决。以大多数数据和 ML 项目所需的规模维护干净、高质量的数据极其耗时——如果没有正确的方法,这几乎是不可能的。这就是可观察性的用武之地。
定义数据可观察性
界定“垃圾数据”(不管它存在于系统中的什么地方)影响的一个简单方法是通过软件应用程序可靠性的镜头。在过去十年左右的时间里,软件工程师利用 New Relic 和 DataDog 等目标解决方案来确保应用程序的高正常运行时间(换句话说,工作的、高性能的软件),同时将停机时间(中断和落后的软件)降至最低。
在数据方面,我们把这种现象叫做 数据停机 。数据宕机指的是数据不完整、错误、丢失或不准确的时间段,随着数据系统变得越来越复杂,它只会成倍增加,从而支持无止境的源和消费者生态系统。
通过将软件应用程序可观察性和可靠性的相同原则应用于数据和 ML,可以识别、解决甚至预防这些问题,让数据团队对其数据充满信心,从而提供有价值的见解。
数据监控与数据可观察性
经常出现的一个问题是:“我已经监控了我的数据。为什么我也需要可观测性?”
这是个很好的问题。长期以来,这两者一直被交替使用,但是监控和可观察性是两个非常不同的东西。
数据可观察性支持监控,这是大多数技术从业者都熟悉的:我们希望在出现问题时第一个知道,并快速排除故障。数据质量监控以类似的方式工作,当数据资产看起来与既定的度量或参数不同时,向团队发出警报。
例如,如果某个值超出了预期范围,数据没有按预期更新,或者 1 亿行突然变成了 100 万行,数据监控就会发出警报。但是,在为数据生态系统设置监控之前,您需要了解我们刚刚讨论过的所有属性,这就是数据可观察性的用武之地。
数据可观察性还通过提供关于数据的粒度、上下文信息来实现主动学习。团队可以探索数据资产,审查模式变更,并确定新问题或未知问题的根本原因。相比之下,监控基于预定义的问题发出警报,以聚合和平均值的形式表示数据。
有了数据可观察性,公司可以洞察数据健康的五个关键支柱:新鲜度、分布、容量、模式和沿袭。对于机器学习从业者来说,可观察性有助于提供一定程度的信心,即提供给模型的数据是完整的和最新的,并且在可接受的范围内。
数据可观察性的五大支柱。图片由巴尔·摩西提供。
当问题出现时,模式和沿袭的可见性有助于快速回答关于哪些数据受到影响的相关问题;可能进行了哪些更改,何时进行的,由谁进行的;以及哪些下游消费者可能会受到影响。
可观察性包括对数据健康五大支柱的监控,还包括对问题和端到端自动化数据谱系的警报和分类。这些功能结合在一起,使得数据可观察性成为现代数据堆栈的必备功能。
一个空值破坏了仪表板
知道你的数据管道坏了是一回事。但是你怎么能真正弄清楚发生了什么以及为什么呢?
与监控不同,当数据管道中断时,数据可观察性可用于处理 根本原因分析 。理论上,根本原因听起来就像运行几个 SQL 查询来分割数据一样简单,但在实践中,这个过程可能相当具有挑战性。事件可能以不明显的方式出现在整个管道中,并影响多个(有时是数百个)表。
例如,数据停机的一个常见原因是数据的新鲜度,即数据异常过时。这种事件可能是由多种原因造成的,包括作业卡在队列中、超时、合作伙伴未及时提供其数据集、错误或意外的计划更改从 DAG 中删除了作业。
通过获取数据资产的历史快照,数据可观察性为您提供了确定“为什么”的必要方法在破损的数据管道背后,即使问题本身与数据本身无关。此外,许多数据可观测性解决方案所提供的谱系赋予了跨职能团队(即,数据工程师、数据分析师、分析工程师、数据科学家等)。)协作解决数据问题的能力,以免它们成为更大的业务问题。
ML 监控与 ML 可观察性
当在生产中信任您的数据时,数据可观察性是一个难题,但是您的 ML 模型呢?
类似于数据可观察性如何帮助回答为什么*,ML 可观察性使模型所有者能够对模型故障进行根本原因分析。当模型性能下降时,监控会向您发出警报。ML 可观察性帮助你弄清为什么。一旦出现问题,弄清楚需要做什么是更大、更难的问题。*
对于软件应用程序,您通常会关注 SLA 和应用程序停机时间。对于机器学习,你看到的是数据和性能与基线的偏差。
ML 可观察性允许团队从生产中的培训、验证或之前的时间周期设置基线,并比较转变到性能下降的根本原因。
有了 ML 可观察性,公司可以洞察模型健康的主要支柱:模型和特征漂移检测、输入和输出数据质量、模型性能和可解释性。
当问题出现时,ML 可观察性使从业者能够查明为什么模型的性能在生产中不如预期,以及当他们应该重新训练他们的模型、更新他们的训练数据集、向他们的模型添加新特征或者甚至回到绘图板时的清楚信号。
大海捞针
那么 ML 可观测性是如何工作的呢?让我们举个例子:你预测交易是否是欺诈的模型出了问题,并开始有更多的误报。我们如何弄清原因?
能够自动显示性能较低的群组对于追踪模型对于特定数据子集的性能好坏至关重要。ML 可观察性有助于您缩小特定地理区域、特定客户群或特定时间窗口中是否存在明显更多的误报。
性能下降的一个常见原因是漂移。因为模型是根据数据训练的,当数据与他们已经看到的相似时,他们表现得很好。可观察性比较基线分布和当前分布之间的分布变化。有漂移时,模型所有者可以进行有针对性的上采样。
理论上,根本原因在 Jupyter 笔记本中听起来很容易,但在实践中,您必须通过自动设置和即时分析,在数十亿次预测中将其扩展到数百个功能、模型和模型版本。
ML 可观测性。图片由 Aparna Dhinakaran 提供。
我们很高兴看到下一代数据和 ML 领导者如何解决这个问题,使回答这个问题和许多其他问题变得更加容易。
超越标签,用 OpenAI CLIP 进入图像语义搜索时代
用 OpenAI CLIP 探索真实世界用例的 Google Colab 代码笔记本
作者图片
问题陈述:
假设你是一名作家,你正在寻找与你的博客或书相匹配的最佳图片。你脑海中有一个搜索短语,比如“老虎在雪地里玩耍”。你进入 Pixabay 或 Unsplash 等无版权图片网站,尝试各种关键字组合,如**【老虎】【雪】【虎雪】**等,找到相关图片。
如果你幸运的话,你会在第一页或者在前 N 名检索结果中找到你正在寻找的精确图像。
由于这些网站中的图片只有标签,你受到标签检索结果的限制,你需要人工监督进一步过滤与你的搜索词**“老虎在雪地里玩耍”最相关的图片。**
如果您经常寻找与您的搜索短语相关的图像,这是一个问题,并且在从标签中检索的图像上进一步过滤非常耗时。
你需要的是在检索到的带有标签的图片上进行语义搜索。
语义搜索是指搜索引擎考虑搜索短语的意图和上下文含义的能力。语义搜索不是试图在输入短语中找到单词的精确匹配,而是捕捉更广泛的上下文和单词之间的关系,并检索与搜索查询的上下文更密切相关的结果。
如果 Pixabay/Unsplash 库中的每个图像都用一个描述它的句子加了标题和,那么我们可以使用 Sentence-BERT 或其他类似的算法将句子编码成一个向量,并执行相似性来提取前 N 个标题和语义上与搜索查询匹配的相关图像。
但是给数据库中的每张图片加标题是很昂贵的。大多数时候我们最好的只是标签。 OpenAI 夹子来救我们了。
解决方案:
在文字搜索中,如果你问一个类似**“美国第 45 任总统是谁?”如果你有数百万的文档来寻找答案,你首先做一个轻量级**过滤器(例如; BM25 in Elastic Search )可以快速浏览所有百万个文档,并获得可能有答案的前 100 个左右的文档。然后你使用一个更重的算法(例如:句子-BERT 语义搜索)来从这 100 个过滤的文档中提取出确切的段落。
对于给定的搜索查询,首先,我们有一个轻量级的快速过滤器来查找潜在的候选文档。我们称这个为寻回犬。检索者的目标是筛选出明显的负面案例。
然后我们有阅读器,它使用计算量更大的算法(例如:基于 Transformer)来缩小到文档中使用语义搜索得到答案的精确区域。
将类似的类比应用于图像搜索,我们看到,基于标签检索给定搜索查询的图像是非常快速和轻量级的。这是取回器的部分。例如,您只需使用标签**“Tiger”**进行搜索,就可以从 Pixabay 中检索到 Tiger 的所有图像。
作者使用 Pixabay 图像制作的图像
然后我们有 OpenAI CLIP 作为我们的阅读器,它使用计算量更大的算法来编码我们从标签中检索到的每个图像,以与我们编码的句子进行比较,例如:“老虎在雪地里玩耍”,并基于语义相似性返回前 N 个结果。
作者使用 Pixabay 图像制作的图像
OpenAI 剪辑
OpenAI 最近(2021 年 1 月 5 日)推出了一个名为 CLIP 的神经网络,它可以从自然语言监督中高效地学习视觉概念。CLIP 代表对比语言-图像预训练。
CLIP 建立在大量关于零镜头转换、自然语言监督和多模态学习的工作之上。你可以点击阅读更多关于夹子的信息。
对于我们的用例,我们需要了解 CLIP 是用一大组带有相应标题的图像来训练的,因此当对图像和文本的编码都应用相似性度量(例如:余弦)时,它学会了预测哪个图像标题(文本)与哪个图像紧密匹配。
所以在训练之后,你可以给出一个随机的图像,然后在向量空间中用两个向量的短语找到该图像的余弦相似度“这是一张狗的照片吗?”,“这是猫的照片吗?”并且看哪一个具有最高的相似性来找到图像的类别。所以在某种程度上,它具有像 GPT-2 和 GPT-3 一样的零射击分类能力。
图片来自 OpenAI 剪辑博客
密码
说够了给我看看代码😃
一个易于使用的谷歌 Colab 笔记本可以在这里找到。
我改编了 OpenAI 剪辑团队最初的 Github repo 的代码。
我将关注我为这个用例修改的代码部分。
1.使用 Pixabay 检索给定标签的图像
首先,我们使用 Pixabay API 来检索给定搜索标签的图像。例如: Tiger 并使用易于使用的绘图库 ipyplot 显示检索到的图像。
从 Pixabay 检索到标签为 Tiger 的图像
作者使用 Pixabay 图像制作的图像
2.预处理图像和文本的功能
在下面的代码中,我们对图像和文本进行预处理,对它们进行编码,并用模型将它们转换成固定大小的向量。
我们也有一个函数来寻找编码文本短语之间的余弦相似性,例如:“老虎玩雪”和所有检索图像的向量。然后我们基于相似性对图像进行排序以获得与文本短语相似的前 N 个图像。
3.用任何短语搜索,得到前 N 个语义相似的图片
在这一节中,下面的代码获取任何搜索短语,如**“老虎在雪地里玩耍”,将文本编码成一个向量,并计算所有图像向量的余弦相似度**,过滤前 N 个选择并显示。
输出:在过滤了从标签(Tiger)中检索的 Pixabay 图像后,我们得到了与我们的搜索短语**“Tiger playing in the snow】、**最相似的前 N 个图像。
作者使用 Pixabay 图像制作的图像
类似地,用短语**“浸在水中的老虎”**搜索会检索到如下所示的这些图像。
作者使用 Pixabay 图像制作的图像
再来一个:
搜索短语— “老虎坐在树枝上”
作者使用 Pixabay 图像制作的图像
使用自然语言处理的问题生成——教程
我推出了一个非常有趣的 Udemy 课程,名为“使用 NLP 生成问题”,扩展了这篇博文中讨论的一些技术。如果你想看一看,这里是链接。
结论
希望你喜欢我们如何使用两天前刚刚发布的 OpenAI 的前沿研究,并解决了一个现实世界的问题。
祝 NLP 探索愉快,如果你喜欢它的内容,请随时在推特上找到我。
如果你想学习使用变形金刚的现代自然语言处理,看看我的课程使用自然语言处理的问题生成
超越可视化的基础
最新指南
不要对你的创造性努力沾沾自喜
来源: Pixabay
示例数据:https://www . ka ggle . com/arashnic/HR-analytics-job-change-of-data-scientists?select=aug_train.csv
回到 2019 年 6 月,我在 Medium 上写了我的第一篇文章。我一直对数据可视化充满热情,并想写一篇关于它的文章,更多的是为我自己,而不是为任何阅读它的人。我创建了示例视觉效果,并梳理资源以找到有见地的提示,但我真的不期望人们真的会阅读它。令我惊讶的是,人们读了它,并告诉我一些我思维中的错误。差不多两年了,有了更多的经验之后,是时候用我现在所知道的来更新这个指南了。
免责声明:我绝不是专家,我只是这门手艺的学生。这些真的只是我试错学来的新手小技巧,想分享一下!
提示 1:做一些研究
l̶e̶s̶s̶o̶n̶̶1̶:̶̶k̶n̶o̶w̶̶w̶h̶a̶t̶’̶s̶̶a̶v̶a̶i̶l̶a̶b̶l̶e̶̶t̶o̶̶y̶o̶u̶
在创建视觉效果或图形之前,了解数据的组成和试图用数据展示的内容是至关重要的。首先要检查的几件事:数据存储在哪里以及如何存储,数据的类型是什么——数值型、分类型、二进制型等等,以及是否需要先进行标准化或转换(通过标识符汇总或标准化文本来创建类别是否有益?)一旦你开始想象,这会改变你的方法,帮助你更好地考虑你的选择。例如,如果您的数据不断更新,当您完成时,停滞的图形可能没有帮助。
为什么这一步很重要?很容易假设您的数据是干净和完美的,但通常情况下,它远非如此。尤其是当数据由用户输入或从网上搜集时,事情会变得非常混乱(当 M&T 和 M&T 有两个独立的类别时会出现的挫折值得采取预防措施),当你努力可视化你的数据时,你希望它尽可能清晰。快速浏览一下,确保你有正确的数据,并且数据的格式有助于你形象化。如果不是,为了节省时间,首先预处理这些数据对您最有利。
来源:Taylor fog arty——这些数据可能看起来相对干净,但根据您计划如何可视化,您可能需要采取一些步骤。你可能想了解“上一份新工作”的真正含义,或者“相关经验”是如何衡量的。您可能还想通过删除非数字字符将“经验”列转换成数字值。这些步骤将帮助你确保你的视频讲述你想要的故事。
“知道有什么可用的”和“做研究”有什么区别?以前,我认为为了创造视觉效果,了解你所拥有的工具是很重要的,然而,我开始意识到,努力去了解你需要工具的材料会更好。知道这些工具仍然很重要,但是你可能有一个你最熟悉的工具,这很好!然而,如果你想探索和学习一些新的东西,可以看一看我的原始文章,寻找一些不同的选择。
提示 2:考虑你的选择
̶l̶e̶s̶s̶o̶n̶̶2̶:̶̶p̶i̶c̶k̶̶t̶h̶e̶̶r̶i̶g̶h̶t̶̶k̶i̶n̶d̶̶o̶f̶̶g̶r̶a̶p̶h̶
如前所述,有很多不同的工具可以使用,在你开始视觉化之前应该考虑这些工具以及你想要创建的视觉类型。如果您有持续提取的数据,并且不断更新视觉效果会很有好处,那么有一些软件可以帮助您毫不费力地做到这一点,如 Tableau 或 Microsoft Power BI。或者,如果你想为一个报告或文章创造一个停滞的视觉效果,这是不必要的,可能会引起更多的混乱。方法的选择在很大程度上取决于舒适度,但也取决于工具在帮助你创建你心目中的视觉效果方面有多有用。
无论您决定使用哪种可视化方法,在呈现数据时都可能有很多选项可供选择!你想用线形图或条形图,甚至冲积图?重要的是要记住,每种类型的视觉都有特定的目的和目标,你应该确保这些与你的目标一致。如果你想显示事物如何随时间变化,折线图比一系列饼图好得多(至少在大多数情况下)。你可能认为研究已经随着最后一个提示结束了,但是,还是要做你的研究!通过真正理解你创造的视觉类型,它将帮助你使它更具交流性和有效性。
来源:Taylor fog arty——上面的三张图片代表相同的数据,但不一定是相同的信息。堆叠条形图(左)显示了数据集中显示的申请人总数,以及他们如何按性别细分的高级视图。饼状图(中间)只告诉你性别的细分,但没有显示有多少申请人组成了数据集。表格(右侧)显示了细分情况,但也允许您查看每个类别的确切申请人数以及所有类别标签。
在你开始创建图表之前,用手勾画出你所想象的图表的样子或它将包含的内容通常是有帮助的,这样你就有了一个开始的地方。从那里,您可以查看相似类型的图表,以添加视觉上更有趣的变化或图表。
技巧 3:不要害怕定制
̶l̶e̶s̶s̶o̶n̶̶3̶:̶̶c̶u̶s̶t̶o̶m̶i̶z̶e̶̶y̶o̶u̶r̶̶v̶i̶s̶u̶a̶l̶s̶,̶̶d̶o̶n̶’̶t̶̶s̶e̶t̶t̶l̶e̶̶f̶o̶r̶̶o̶r̶a̶n̶g̶e̶̶a̶n̶d̶̶b̶l̶u̶e̶
定制可能是你最好的朋友,特别是如果你想在公共场合使用你的视觉效果。如果你不是,如果视觉是为了一个任务或探索的目的,自定义视觉可能不值得你花时间。同样,这一切都回到你的视觉目标。
如果你想让视觉效果更有凝聚力,视觉上更有趣,可以考虑使用某种定制来帮助表达你的观点。当然,为了清晰起见,你应该总是添加标题、图例等,但是你也可以使用颜色、突出显示的数据点和尺寸来赋予你的视觉效果以生命。只要这些自定义不偏离视觉效果的目的或隐藏重要信息,它们就有助于将读者的注意力引向特定的结论。
重要的是要记住颜色是有意的。颜色是一种很好的视觉品牌,并使他们有凝聚力的方式,但如果使用不当,它会无意中造成混乱。跨视觉效果重用颜色变化可以通过将一个值与另一个值相关联来帮助连接它们,但是如果它们在视觉效果中不一致,它可能会导致读者第一眼就误解视觉效果。
来源:Taylor fog arty——虽然这种视觉效果本身看起来不错,但如果它存在于包含提示 2 中的表格的仪表板中,可能会引起混淆,因为绿色刻度对应不同的值,第一个值代表申请人数,而这个刻度代表所需的平均培训小时数。
如果视觉材料是为其他人制作的,例如雇主或客户,颜色和其他附加物的使用可能有助于视觉材料的消费。通过利用他们品牌的颜色、字体和术语,你的受众会积极地联想到这种识别,并可能对视觉效果或内容更加开放。
技巧 4:谨慎添加
̶l̶e̶s̶s̶o̶n̶̶4̶:̶̶b̶e̶̶c̶a̶r̶e̶f̶u̶l̶̶h̶o̶w̶̶y̶o̶u̶̶e̶n̶c̶o̶d̶e̶
我们在创造视觉效果时喜欢做的一件事是添加额外的信息层,不管它们是否相关,以防某些东西很有趣。或者额外的几层可能对你的结论很重要。无论哪种方式,添加数据都需要深思熟虑和谨慎。我们不应该让我们内心的创造力永远占上风。
视觉效果必须清晰,但视觉效果必须吸引人,必须有趣。同样,我们循环回到视觉的目标来决定哪条路线更好。如果你的目标是创建一个发人深省和美丽的视觉,然后编码到你的心的内容,但如果你的目标是有效地沟通信息,你可能要重新考虑。如果你编码的数据没有增加任何新的理解或帮助读者得出相同的结论,在这种情况下应该避免。
来源:Taylor fog arty——这种视觉效果试图用气泡图来显示性别、专业和申请人数,但它在几个关键方面失败了。这也显示了清理数据的重要性——如果您查看带注释的气泡,您会发现许多气泡缺少一个或多个我们试图查看的变量。虽然这可能会让您深入了解数据集中缺失值的位置,但如果您的目标是查看按性别划分的专业,这并不能完成工作。许多气泡非常小,如果没有工具提示,就不可能知道它们代表什么。
有时,如果能表达重点,基本条形图是最好的选择。大部分人都知道如何非常快速的解读一个条形图,折线图,或者饼状图,基本上一目了然。当你的发现需要快速消化或无需解释时,使用简单性。
提示 5:不要忘记上下文
̶l̶e̶s̶s̶o̶n̶̶5̶:̶̶c̶r̶e̶a̶t̶e̶̶y̶o̶u̶r̶̶g̶r̶a̶p̶h̶̶c̶o̶m̶p̶l̶e̶t̶e̶l̶y̶
绝对不要忘记你的标题和标签,以确保你的读者理解数据,但也不要忘记在你完成创建后考虑数据的上下文。这可以帮助你再次检查你的视觉显示的信息是否是你想要的,也可以防止你做得过火。希望在整个过程中,你已经记住了你的视觉效果的目标和目的,但是如果没有,你应该现在就返回。确保看到该视觉效果的人能够理解它——毕竟,您可能已经使用数据有一段时间了,应该比第一次看到它的人对它有更好的理解。
额外提示:犯错
正如我在开头提到的,我不是专家,但我学到的东西很大程度上是通过试错。不要害怕犯错误,但一定要从中吸取教训!你创造的第一个视觉效果不会完美,这没关系。修改它,接受批评,因为它们只会在你的旅程中帮助你。
蟒蛇熊猫的数量之外
如何处理文本数据?
萨曼莎·加德斯在 Unsplash 上的照片
Pandas 是使用最广泛的 Python 库之一。它提供了许多功能和方法来执行有效的数据分析和操作。
我们倾向于将表格数据与数字联系起来。然而,大量的原始数据是以文本形式出现的。幸运的是,Pandas 有几种方法来处理文本数据。
操作字符串的方法可以通过 str 访问器来访问。在本文中,我们将通过例子来探讨这些方法。
让我们从用模拟数据创建一个样本数据框开始。
import pandas as pddf = pd.DataFrame({ "FirstName": ["Jane","john","Ashley", "MATT", "Alex"],
"LastName": ["Doe", "Smitt", "Adams", "Tull", "Morgan"],
"Address": ["Houston, TX", "Dallas, TX", "San Antonio, TX",
"Palo Alto, CA", "San Diego, CA"]})df
(图片由作者提供)
我们注意到的第一件事是名字中的字母不兼容。有大写字母也有小写字母。最好是标准格式的。
我们可以将它们全部转换成大写或小写。熊猫有两种操作方法。
df["FirstName"] = df["FirstName"].str.lower()df["LastName"] = df["LastName"].str.lower()df
(图片由作者提供)
我们可以通过组合名字和姓氏来创建姓名列。
df.insert(2,
"Name",
df["FirstName"].str.cat(df["LastName"], sep=" "))df
(图片由作者提供)
我使用了 insert 函数,能够在姓氏之后创建新的列。默认情况下,新列添加在末尾,但是插入允许在特定位置创建新列。
str 访问器下的 cat 方法组合字符串。它用在 insert 函数的第三个参数中,我们在这里定义新列的值。
字符串的另一个常见操作是拆分。在某些情况下,文本数据包含多条信息。例如,“地址”列包括城市和州名。我们可以通过拆分该列来提取城市或州的信息。
df["State"] = df["Address"].str.split(",", expand=True)[1]df
(图片由作者提供)
在某些情况下,我们需要根据字符串过滤数据点(即行)。例如,我们可能对以字母 j 开头的名称或包含“TX”的地址感兴趣。
startswith 和 endswith 方法允许分别基于字符串的第一个或最后一个字母进行过滤。如果我们在一个字符串中搜索一个字符序列,那么可以使用 contain 方法。所有这些方法都可以在 str 访问器下使用。
df[df["Name"].str.startswith("j")]
(图片由作者提供)
df[df["Address"].str.contains("TX")]
(图片由作者提供)
值得注意的是,startswith 和 endswith 方法接受多个字符。因此,我们可以使用它们来过滤以字符序列开头或结尾的字符串。
replace 方法可用于替换字符串中的字符序列。让我们做一个例子来演示它是如何使用的。
df["Address"] = df["Address"].str.replace("TX", "Texas")df
(图片由作者提供)
str 访问器还可以用于对字符串进行索引。例如,我们可以用“str[:2]”表达式选择前两个字符,用“str[-2:]”表达式选择后两个字符。
(图片由作者提供)
结论
Pandas 字符串方法组合在 str 访问器下。我们已经介绍了您可能会更经常使用的工具。
文本数据拥有非常有价值的信息,将永远存在于我们的生活中。因此,学会如何操纵和处理它是非常重要的。
感谢您的阅读。如果您有任何反馈,请告诉我。
超越普通变压器
一瞥 NLPs 最先进建筑的发展前景
乔斯林·莫拉莱斯在 Unsplash 上的照片
现在是 2017 年,论文《注意力是你需要的全部》为 NLP 提供了一个新的有前途的架构:变压器。四年后——深度学习领域的永恒 Transformer 仍然是最先进的架构,用于各种 NLP 任务。但是世界并没有停滞不前——至少在这个领域没有,更多的论文已经开始转变,并为进一步的发展提供了新的方法。我想在这里讨论一些有前景的。
我们将从 2019 年已经发表的论文开始:“ Transformer XL:超越固定长度上下文的专注语言模型”。下面这篇论文将是“重整器:高效的变压器”,在最近一篇文章(2021 年 6 月)之前:“打包:迈向 2 倍 NLP BERT 加速”将被讨论。
关于 Transformer 还有很多有前途的文章,但是我必须做出选择,这样这篇文章就不会超出范围。我希望我没有对任何一位论文作者不公🙃!
Transformer-XL:超越固定长度上下文的注意力语言模型
本文讨论变压器处理不定长文本的有限能力。标准转换器使用最大长度、截断和填充来处理不同的序列长度。同时,这种固定长度是扩展依赖学习的障碍,在扩展依赖学习中,注意机制会抓住超过这一限制的连接。
虽然短期依赖性可能不会对大多数用例造成问题,但是固定长度限制可能会由于截断及其不遵守语义边界的属性而降低性能。作者称之为语境碎片。
他们的解决方案听起来很简单:通过不从头开始计算隐藏状态,最后一个状态可以作为当前段的内存状态。有了这种循环连接,信息不会丢失,而是会从一个状态传递到另一个状态。这显然解决了丢失语义信息的问题,并导致了长期的依赖性。
与普通变形金刚相比的变化可以在注意力层中找到。键和值将由来自前一段的缓存进行扩展。我不想谈论更多的细节。但是我强烈推荐阅读 Transformer XL 论文中的章节带状态重用的段级递归。
在关注层内使用先前段的缓存需要一些额外的改变。作者提出的问题是:"[……]当我们重用状态时,如何保持位置信息的一致性?(戴等 2019)。而在默认转换器中,序列顺序由位置编码提供。当使用缓存时,不考虑前一状态的位置编码(我们刚刚讨论过)。这导致性能不佳。为了克服这个问题,作者的方法是只编码隐藏状态中的相对位置信息,并将其注入注意力得分。从他们的角度来看,这种方法更直观:
例如,当查询向量 qτ,I 涉及关键向量 k τ,≤i 时,不需要知道每个关键向量的绝对位置来识别片段的时间顺序。(戴等 2019)
相对距离足以使查询向量能够通过元素的不同距离来区分元素。此外,可以从相对距离获得绝对位置。请在原始论文中阅读更多关于这方面的内容。
总结一下:通过缓存之前的片段来改善注意力机制似乎是一个有希望的步骤。这不仅增加了长期依赖性,而且还解决了文本分割带来的上下文碎片问题。
改革者:高效的变压器
变压器是有很多参数的巨大模型。从零开始训练他们实际上只能由行业或平等的大玩家来完成。幸运的是,我们可以使用像伯特这样预先训练好的模型。但即使是 24 层版本的 BERT,也很难在单个 GPU 系统上进行训练。如果我们不希望这种模型只能由大公司来训练和运行,变压器需要变得更有效率。
Kitaev、Kaiser 和 lev Shaya——改革者论文的作者介绍了解决上述问题的三项变革:
- 使用可逆层仅存储整个模型的激活的单个副本。这将使存储激活所需的内存减少 N 倍
- 在前馈层内分割激活并将它们作为块进行处理有助于减少这些层所需的内存。前馈层通常比例如关注层广泛得多,因此负责高存储器使用率。
- 使用局部敏感散列注意力,将注意力层内的因子从 O(L ) 改变为 O(L log L)
作者确信“[……]与标准变压器相比,这些技术对训练过程的影响可以忽略不计”(Kitaev 等人,2020)。我将谈论第一个和最后一个想法——在我看来,它们是最有趣的。为了不至于失控,第二种方法将不再讨论。
可逆变压器
在他们的论文中:可逆残差网络:不存储激活的反向传播, Gomez 等人提出了可逆残差网络 (RevNets)。这个想法是,每次激活都可以从下一层恢复,并且在反向传播期间不需要存储——以计算换取更多的内存。剩余层(也称为跳过连接)执行对单个输入和单个输出进行操作的功能:
可逆层有两个输入:
根据这些等式(并通过减法反转):
在*可逆变压器的上下文中,*这意味着前馈层( G )和关注层( F )被组合在可逆模块内。
Y₁ = X₁ + Attention(X₂) 和 Y₂ = X₂ + FeedForward(Y₁)
通过这种实现,不再需要存储激活;因此节省了内存。即使这意味着需要稍微多一点的计算。
区分位置的哈希注意
变形金刚的核心是注意力机制。不是没有原因,最初的论文叫做注意力是你所需要的全部。因此,开发出使这种机制更有效的方法只是时间问题。
在标准转换器中,使用缩放的点积注意力:
输入包含查询和键以及值。所有查询和键的点积都是在缩放之前计算的。之后,应用 softmax 函数。最后,中间矩阵和值矩阵的矩阵乘法产生关注度分数。
作者正在寻找一种更有效的记忆注意力机制,并提出了位置敏感哈希注意力(LSH) 的想法。目的是将复杂度从 O(L ) 降低到 *O(L log L)。*粗略地说,该算法旨在将数据点分组到所谓的桶中,以便彼此接近的数据点以很高的概率获得相同的散列。与其他散列技术相比,散列冲突被最大化,而不是最小化。在最近邻居的帮助下,我们可以将注意力集中在靠近查询的关键字上。
下面你看一下 LSH 在论文中阐述的注意事项:
单个查询位置 I 的等式
*‘P’*指’ i’ 为部分的集合,’ z’ 表示配分函数。 LSH 背后的思想是集合 P 元素被限制为关注单个哈希桶的元素:
LSH 作为全神贯注的近似方法,能够通过增加计算成本来减少内存使用,计算成本随着哈希数的增加而增加。希望这将使大型变压器更容易使用——不仅仅是对在多个 GPU 上运行它们的机构。
包装:接近 2 倍 NLP BERT 加速度
如前所述,预训练 BERT 是因为它对计算能力的巨大需求,只适用于大型行业或研究机构。Kosec、Fu 和 Krell——这篇论文的作者希望通过去除填充来提高效率,从而减少这一障碍。他们提出了一种算法,利用维基百科数据集将预训练速度提高了 2 倍。
处理填充令牌可以被视为计算的浪费。文本长度分布越宽,在这个过程中损失的计算就越多。打包方法希望完全填充每个序列长度,因此不再需要填充。这种想法基于这样的假设,即序列是可以互换的,所以顺序并不重要。装箱方法是一个经典的规划问题(装箱或下料问题)。由于该问题是 NLP 特有的,因此提出了两种算法:
- 最短包装优先直方图包装
- 非负最小二乘直方图打包
理解这些算法的细节并不重要;分析包装带来的问题要重要得多。作者们通过详细地解决这些问题做了大量的工作。让我们谈一谈它们。
顾名思义,BERT(来自变压器的双向编码器表示)利用了双向自我关注。但是,打包(填充段,不留出填充空间)会创建没有相应序列的段。像 GPT3 这样注意力不集中的语言模型不会面临这个问题,因为它们只关注以前的标记。本文介绍了用于注意层的掩模,以防止不同序列之间的污染。让我们看看文章中提供的一些代码:
mask = np.array([[1, 1, 1, 2, 2]]) # input
zero_one_mask = tf.equal(mask, mask.T) # 0, 1 mask #for use with softmax:
softmax_mask = tf.where(zero_one_mask , 0, -1000)
这个实现创建了一个块对角掩码,减少了填充,并且可以简单地由像 numpy 这样的框架实现。
包装面临的另一个挑战是损失和准确性的计算。在 BERT 中,交叉熵损失是按序列计算的。当使用打包时,不再为序列计算损失。该模型将收敛到不同的最优值。为了解决这个问题,作者的想法是:
“为了实现每序列丢失,我们通过处理每令牌丢失来有效地‘解包’传入的逻辑和标签。我们计算属于第一序列的所有记号的损失,然后计算属于第二序列的所有记号的损失,等等“”(Kosec,et al. 2021)。
本文中有一个很好的代码示例解释了它们的实现——请查看。
与其他两篇文章不同,打包方法旨在优化前期培训。尽管这个过程可能会花费大量的时间和金钱,但这里显示的改进是有希望的。
现在,我们已经了解了改善变压器的各种方法,不得不说,所有这些方法都是优化性能而非质量输出的独特方法。这可能是由于我的选择和这样一个事实,即 Transformer 作为一个有前途的架构越来越只对大玩家可用,或者至少是由他们创建的。GTP3 就是一个典型的例子。
我希望这些描述是可以理解和理解的。解释的一些概念不是特别容易理解,所以解释本身并不是最直接的任务。谢谢你一直读到最后。下次见——再见。
参考
艾丹·戈麦斯,叶萌·任,拉克尔·乌尔塔森和罗杰·b·格罗斯:可逆残差网络:不存储激活的反向传播。 arXiv: 1707.04585,2017
阿什什·瓦斯瓦尼、诺姆·沙泽尔、尼基·帕尔马、雅各布·乌兹科雷特、莱昂·琼斯、艾丹·戈麦斯、卢卡斯·凯泽和伊利亚·波洛苏欣:你所需要的只是关注。arXiv:1706.03762, 2018
马特伊·科塞克、傅生和马里奥·迈克尔·克雷尔:打包:向 2 倍 NLP BERT 加速前进。arXiv:2107.02027, 2021
Nikita Kitaev,ukasz Kaiser 和 Anselm Levskaya:改革者:高效的变革者。arXiv:2001.04451, 2020
戴子航,,,Jaime Carbonell,Quoc V. Le,Ruslan Salakhutdinov:Transformer-XL:固定长度语境之外的注意力语言模型。arXiv:2019
感谢所有写出如此精彩文章的作者!🤗
Bhattacharyya 核和数据集上的机器学习
使用集合元素的概率分布来提取特定于集合的特征
塞布·阿特金森在 Unsplash 上拍摄的照片
当一个特征不是被定义为单个数字,而是一组对象时,集合上的机器学习问题就出现了。一个很好的例子是,当您试图根据订单历史推断客户的一些情况时。我在过去的这些文章中介绍了 set 上的深度学习方法:
但是在本文中,我将回顾如何使用内核方法来学习集合。
核心方法
最新一代的数据科学家可能从未使用过任何内核方法。然而,在大约 20 年前,它们被广泛使用。它们都基于将输入空间映射到另一个空间,其中给定的机器学习问题可以使用线性方法来解决:
尖括号表示点积。那么任何函数都可以用线性组合来表示:
内核方法的要点是,您并不真的需要在输入空间中导出映射。知道核函数就足够了。核函数可以被认为是指示两个数据点之间的相似性。最著名的基于核的方法是支持向量机,但还有很多,包括核 PCA,高斯过程和贝叶斯优化。
Bhattacharyya 内核
原始核定义在单个向量的输入空间上。如果你的输入空间是向量集呢?我们可以找到每个集合中向量的概率分布,并计算核函数作为两个概率分布相似性的度量[1,2]。一个很好的相似性度量是 Bhattacharyya 系数:
来源:https://en.wikipedia.org/wiki/Bhattacharyya_distance
该系数计算两个分布之间的重叠。它总是大于零,并且具有一个很好的性质,即 **BC(p,p) = 1,**这使得可以将其解释为两个分布之间的“角度”的余弦。它可以对指数族的所有概率分布进行封闭形式的计算,如正态、伯努利、多项式等。Bhattacharyya 系数实际上是一个正定矩阵,因此是集合间核的一个很好的候选。
量子力学中的类比
在量子力学中,系统(稳态)状态由波函数 ψ(x) 定义,其平方模数是概率密度函数:
以下量称为转变幅度:
而它的平方模是*跃迁几率,*也就是系统处于ψ1 态也处于ψ2 态的几率。可以看到,跃迁幅度是复数希尔伯特空间中的 Bhattacharyya 核,它给出了 Bhattacharyya 系数平方对概率的解释,即一个分布的样本也可以解释为第二个分布的样本。换句话说,它可以解释为两个概率密度函数的重叠。
概率乘积核
这些内核值得一提,因为它们是 Bhattacharyya 内核的扩展。它们被定义为:
对于 ρ=1/2 ,这个内核简化为 Bhattacharyya 内核。当 ρ=1 时,该核称为*期望似然核。*这个内核没有一个很好的性质 K(q,q) = 1 ,除非 ρ=1/2 。此外,在一般情况下,积分不能保证收敛。
实验性研究
我们创建了一个简单的实验来衡量基于 Bhattacharyya 内核的算法的表达能力。我们生成了 1000 组数字,每组数字都遵循带有随机参数的正态分布。然后,对于每个集合,我们拟合正态分布,并尝试预测 60%分位数是高于还是低于指定值。
在这里,我们定义了集合的数量和分布参数的范围、集合大小的范围、目标分位数和比较值。我们现在将为每个参数集生成随机参数集:
该数据框包含每个集合的正态分布参数以及集合大小。我们现在准备生成集合:
对于每个集合,我们可以计算分位数目标变量以及平均值和标准偏差。这里我们遵循频率主义者的方法。贝叶斯方法需要稍微不同的实验设计。
作者图片
这种情况下的核函数可以解析计算。给核函数两个自变量,让 𝑚 1 和 𝑠 1 是第一分布的参数,而 𝑚 1 和 𝑠 1 是第二分布的参数。
则内核计算如下:
作者图片
是时候分成训练集和测试集,并使用支持向量分类器进行训练了:
训练集和测试集的模型准确性
model.score(X_train, y_train, )0.9775model.score(X_test, y_test, )0.975
准确率相当高,但即使在训练集上也不是 100%。通过调整超参数 𝜌 ,使用更一般的概率乘积核可能有助于获得更高的精度
结论
在本文中,我们讨论了 Bhattacharyya 内核和相关内核,当训练数据表示集合而不是数据点时,这些内核会很有用。这个核的假设是,符合相似概率分布的集合彼此相似。我们设计了一个简单的实验来评估支持向量机分类器的内核性能。实验结果不错,但并不令人印象深刻。我们可以注意到,核函数不依赖于集合大小,只要它们符合相同的分布,它就会将不同的集合视为相同的,即使它们的大小非常不同。使用贝叶斯方法代替频繁方法可以帮助我们在核建模中保留关于集合大小的信息。这篇文章的所有代码都在我的 github 页面上。
参考
[1]t .杰巴拉和 r .孔多尔(2003 年)。Bhattacharyya 和期望似然核。人工智能讲义(计算机科学讲义系列), 2777 。https://doi.org/10.1007/978-3-540-45167-9_6
[2]t .杰巴拉、r .孔多尔和 a .霍华德(2004 年)。概率乘积核。机器学习研究杂志, 5 。
偏见和差异背后的直觉
偏差和方差通常用技术术语表示,但它们也有直观的解释。
如果你参加机器学习课程,在某些时候你会遇到偏差-方差权衡。你可能觉得你有点理解它,但不是真的。后来,你看到这两个词在书籍、文章和谈话中随处可见,你意识到你对什么是偏差和方差仍然没有很好的直觉。这篇文章是给你的。
我不打算进入技术定义,我将省略任何公式。我假设我的观众理解基本的 ML 概念,例如为什么数据被分为训练集、验证集和测试集,一些超参数的选择如何影响训练模型的“复杂性”(例如,决策树的最大深度越高,决策规则集越精细),以及交叉验证如何用于为模型找到好的超参数。
让我们从定义偏差和方差开始:
- 一些模型过于简单,忽略了训练数据中的重要关系,而训练数据本可以提高它们的预测。据说这样的模型有很高的偏差。当一个模型有很高的偏差时,它的预测总是错误的,如果不是整个范围的话,至少对于数据的某些区域是这样。例如,如果您试图用一条线来拟合散点图,其中数据似乎遵循曲线-线性模式,那么您可以想象我们不会有很好的拟合。在图的某些部分,线会落在曲线下面,而其他部分会在曲线上面,笨拙地试图跟随曲线的轨迹。由于直线跟踪模型的预测,因此我们可以看到,当直线低于曲线时,预测始终低于实际情况,反之亦然。所以当你想到“偏差”这个词时,就想到预测总是偏离。高偏差模型被称为欠拟合【训练数据】,因此训练数据和测试数据的预测误差都很高。
- 有些模型过于复杂,在寻找变量之间重要关系的过程中,它们也会偶然发现某些关系,而这些关系最终只是噪音的结果。换句话说,该模型考虑了训练数据中的某些“侥幸”,这些数据不能推广到测试数据。在这种情况下,模型的预测再次被关闭,但重要的是:它们是而不是 持续关闭。稍微改变一下数据,我们最终会得到非常不同的预测。为什么?因为模型对数据的变化过于敏感和反应过度。高方差模型被称为过度拟合【训练数据】,因此它们的预测误差在训练数据上看似很低,但在测试数据上却很高,因此缺乏通用性。
上述极端情况分别由下图的左侧和右侧表示:
中间的垂直虚线显示了一种“快乐的中间状态”(没有双关语的意思),其中模型的复杂性正好是模型既不欠拟合也不过拟合的量。垂直轴表示模型的预测误差。红色曲线代表测试数据的平均误差。图片作者。
也许下面的类比会帮助你的直觉:假设你刚和你的两个朋友看完一部电影。你现在转向每个人,问“你觉得这部电影怎么样?”。你的一个朋友是个内向的人,为了避免拖累谈话,他会给你一个笼统的说法,比如“很好”另一个朋友是外向的人,为了延长谈话时间,他对电影进行了复杂的分析,有很多细节似乎“离题了”。听完每个朋友的话,你仍然不知道他们喜欢这部电影。所以你转向你的第一个朋友,请他详细说明一些,你要求另一个朋友简化他们的描述,避免跑题。你能猜出哪个朋友偏差大,哪个方差大吗?如果你仍然不确定,我鼓励你从头再看一遍这篇文章。答案应该是明确的。
既然您对这些概念已经比较熟悉了,那么让我们将它们与这些术语在更一般的上下文中的使用联系起来。
- 你可能听过人们称一个有偏见的人(偏见)。这和 ML 中的偏倚有关系吗?很高兴你问了。当我们说某人有偏见时,我们的意思是他们倾向于妄下结论,忽视相反的证据。这可以是有意的,也可以是无意的。小孩子经常会有偏见,因为他们通过泛泛而谈来了解世界(例如陌生人的危险),在成长的过程中,他们完善了他们的世界模型。另一个常见的情况是当我们提到有偏硬币时:如果一个模型非常适合,那么(测试数据上的)误差应该看起来像随机噪声,就像无偏硬币的结果看起来随机且不可预测一样。但是,如果模型在数据的某个区域有偏差,那么预测总是高于或低于标准,使得误差总是分别为负或正。因此,误差的符号就像一枚有偏差的硬币。
- 方差呢?方差还有很多其他的名字。我更喜欢更广泛的术语可变性,其他术语包括利差和风险(后者在金融领域很常见,指的是缺乏可预测性),但让我们坚持使用方差。在更广泛的背景下,当我们说某事有很高的方差时,这意味着它倾向于对反馈反应过度。想象一个函数,它的输出对输入的变化非常敏感。这和 ML 有什么关系?回想一下,对于 ML 算法,输入是训练数据,输出是经过训练的模型,然后可以使用该模型来获得对测试数据的预测。因此,当我们使用稍有不同的训练数据重新训练同一模型时,高方差模型的预测会以意想不到且看似随机的方式发生变化。在英语中,我们用“对某事读得太多”来描述这种我们在没有模式的地方看到模式的行为。因此,你可以说高方差模型对训练数据的细微差别和微妙之处解读过多,将噪声误认为信号。
也许下面的可视化可以帮助巩固你的理解:
上图中的每个点代表一个训练实例,也就是一个训练好的模型。从一个点变化到另一个点的是训练数据。如果经过训练的模型在测试数据上的误差很低,它的点应该落在红色圆圈内。当这些点聚集在一起时,这意味着底层的训练模型是一致的,当它们散开时,这意味着它们具有高方差。低偏差低方差的最佳点对应于左下方的目标。图片作者。
如果到目前为止你还和我在一起,那么有一件事应该是清楚的:为了知道我们的模型是否有高偏差,高方差,或者是否在最佳点,我们需要三样东西:
- 在训练集和测试集之间拆分数据,以便我们可以比较训练和测试数据的错误。
- 一遍又一遍地重新训练相同的模型(这里相同意味着我们使用相同的超参数),以查看预测如何响应训练数据的变化而变化。
- 重新训练几个不同的模型(这里的不同是指使用另一组超参数),以便我们可以比较不同复杂程度的训练模型。我们通常将这一步骤称为超参数调整,但在正确的上下文中,它也称为模型选择。为了正确地做事,我们应该对训练数据、验证数据和测试数据进行三分:我们选择在验证数据上具有最佳性能的模型,并在测试数据上评估该模型,以获得最终(更现实)的性能估计。或者,如果我们愿意支付额外的培训费用,我们可以使用交叉验证。
交叉验证包括将“训练数据”分成 k 个折叠(我使用引号,因为说训练和验证数据更准确):我们训练 k 次,每次使用除了一个折叠之外的所有折叠进行训练(显示为绿色),剩余的一个折叠(显示为蓝色)进行验证。验证折叠在每次迭代之间旋转(在上面的视图中称为 split)。图片取自scikit-learn.org。
即使您对 ML 相对陌生,步骤 1 和 3 应该看起来很熟悉,但对步骤 2 来说不一定如此。这一步让数据科学家看起来像是在 excel 电子表格中打开他们的数据,手动更改数字,以便他们可以重新训练一个新模型,看看它的预测会发生什么。深呼吸:实际上根本不是这么回事。在实践中,步骤 2 几乎总是被跳过,因为步骤 3 已经可以告诉我们是否过度拟合以及过度拟合到什么程度,所以步骤 2 更像是描述如果我们的模型过度拟合会发生什么。在使用交叉验证时,从某种意义上说,您可能会认为第 2 步是在内部实现的,因为每次迭代之间的训练数据相差一倍。例如,在上面的视图中,迭代 4 和 5 中使用的训练数据集具有相同的折叠 1-3,但是折叠 4 和 5 在两次迭代之间交换。
如果有太多东西要打开,你不是唯一一个。有些微妙之处需要时间去理解。数据科学家倾向于反复无常地使用他们的术语,这也于事无补。例如,许多数据科学家交替使用测试数据和验证数据这两个词,并假设从上下文中可以清楚地看出这一点。这可能会让新的数据科学家感到困惑,但我希望您在阅读本文后不会感到那么困惑。
最后一点,对于神经网络,情况有所不同,但是如果有足够的兴趣,我将在后续文章中写这方面的内容。
偏差、一致性和为数据驱动的工作设计 KPI
我们将在本文中讨论“数据驱动”意味着什么,以及为什么坚实的统计基础是一个重要的因素。
一、关键绩效指标:数字胜于雄辩
假设你是初创公司雇佣的第一位数据科学家。他们没有数据驱动的文化或框架,这就是他们让你参与变革的原因。你从哪里开始?以下是您需要采取的步骤:
- 开始衡量:没有数据就不能被数据驱动。着手建立强大的数据收集渠道。例如,如果公司运营一个网站,记录用户做的任何事情。他们采取的行动、花费的时间等。然后需要将日志存储在某个数据库中。这是一项数据工程任务。数据科学家不应该害怕卷起袖子,帮助做一些事情。它可以是内部解决方案或工具,如谷歌分析或微软的 clarity 。
- 定义 KPI:术语 KPI 代表“关键绩效指标”。这是一个总结你所关心的健康状况的数字。静息心率是心脏健康的一个关键性能指标(大多数人会从降低心率中受益)。可以有不同的 KPI 来衡量不同的事物。为了保持事物的可解释性,它们最好是单调的。这意味着你总是想让他们更高或更低。比如每天新用户的数量。你会想尽你所能让它变得更高。这些 KPI 已经成为整个组织的通用语言。正在实施的所有计划都应与正在跟踪的核心 KPI 之一相关联。这有助于量化工作的影响和确定项目的优先级。仔细考虑 KPI 的行为方式及其属性非常重要。这就是统计估计理论的一些知识大有帮助的地方。
- 监控 KPI:一旦人们对 KPI 达成一致,你就可以从你建立的数据管道中想出计算它们的最佳方法,等等。是时候设置一些仪表板了,每个人都可以随着时间的推移直观地看到它们,看看它们的功能如何帮助移动它们等等。您已经为数据驱动型组织奠定了基础,每个人在日常生活中都需要您的数据。现在,您可以在 KPI 上设置监视狗,以便在出现突然变化时利用异常检测和警报。您可以设置受控环境来测量各种变化和功能对这些 KPI 的影响,并在统计实验设计和假设检验中应用您的专业知识。随着公司的发展,你可能会扩大团队来满足所有这些需求。
在本文中,我们将关注第二个要点,利用统计评估理论来设计可靠的 KPI。
二汇总统计:数据->数量
作为一名数据科学家,你必须获取数据库中的原始数据,并将其提炼为可操作的东西。通常,这包括将其总结为几个数字,每个人都可以理解,每个人都同意应该被驱动到一些目标值。大多数情况下,这些目标是“尽可能低”或“尽可能高”。例如,如果你想让你的网站的用户的页面加载时间低,平均加载时间可能是一个 KPI,你想把它变为零。所有 KPI 的共同主题是什么?
- 它们总是基于一些数据。
- 他们以某种方式将这些数据汇总成一个数字。
这些正是“汇总统计”的确切属性。它们是将您的数据作为输入并输出一个数字的函数。如果 x1,x2,…是你的数据点,T(。)是函数,t 是我们的汇总统计数据:
T(x1,x2,…) = t
由于几个世纪以来,人们在汇总统计理论及其属性方面投入了大量精力,因此将我们的 KPI 建立在这些理论的基础上是有意义的。在博客的其余部分,我们将互换使用这两个术语。
对数据的贪婪
每一个数据科学家都应该对数据充满贪婪。就像吸血鬼如果不总是渴望鲜血就不算是吸血鬼。假设您收集了一些数据,并基于这些数据计算了一个 KPI。然后你意识到,一些数据已经被删除了。您回溯步骤并设法恢复丢失的数据。然后,根据完整的数据集再次计算 KPI。很明显,基于较大数据集的第二个数字应该被认真对待,而第一个数字(基于较小数据集)应该被丢弃。这是因为更多的数据模糊地转化为更多的信息。
这个概念可以在决策质量方面具体化。如果你根据有更多数据支持的 KPI 来做决定,从长远来看,你会做出“更明智”的决定,因此会更“成功”。现在,这不是一个牢不可破的法律。很容易构建一个病理案例,收集稍微多一点的数据会有伤害。但从长远来看,更多的数据确实会给拥有它的人带来优势(所有其他因素,如数据的性质和质量是相同的)。
从这个思考过程的逻辑结论来看,它意味着最值得信赖的汇总统计数据是根据无限多的数据计算出来的。由于我们总是处理有限的数据,我们只能努力尽可能接近这个假设值。这个讨论中隐含的一个假设是,如果我们收集了无限量的数据,我们的汇总统计数据将具有某个固定值。这意味着它“收敛”于某个东西,当然不是所有汇总统计数据(甚至是大部分汇总统计数据)的情况。但是不有这个属性的汇总统计是没有目的的;不会真的去任何地方,所以,我们应该要求他们这样做。我们暗示的另一件事是,我们的汇总统计数据应该可以在越来越大的数据量上以合理的效率进行计算。
脚注 1:作为一个例子,考虑一个公平的硬币(同样可能正面或反面落地)。假设我们收集十次投掷的数据。不知何故,我们正好有五个头和五条尾巴。如果我们以逻辑的方式估计使用这个数据的头的概率(头的数量除以总投掷数),我们碰巧在正确的答案上是李子,0.5)。收集数据再折腾一次,只能让我们远离正确答案。即使我们收集了更多的数据,我们也不会比 10 次投掷做得更好。但是,我们看到这个数据,却无从得知硬币其实是公平的。它很可能是一个有 60%正面概率的硬币,碰巧给了你 5 个正面和反面。如果我们知道正面的真实概率,就没有必要抛硬币和收集数据了。鉴于我们依靠数据来估计硬币的真实性质,尽可能多地收集总是明智的。
脚注 2:这让人想起另一个行为类似的定律(依靠大量数据的统计特性),热力学第二定律。爱因斯坦宣称这是最不可能被任何东西取代的物理理论。
II-B 终极游戏:无限数据
我们已经将汇总统计描述为一个函数,它将您的数据作为输入,并生成一个标量作为输出。我们将此描述为:
T(x1,x2,…xn) = t
其中 T(…)是可以接受任意数量的数据作为输入的函数,T 是计算出的汇总统计数据。例如,我们可以定义:
T(x1,x2,…xn) =(x1+x2+…+xn)/n __(1)
这是样本平均值。或者我们也可以定义:
T(x1,x2,…xn) =x1 __(2)
或者
T(x1,x2,…xn) =7.5 __(3)
等式(2)中的汇总统计仅仅是样本中的第一个数据点,并且它具有不期望的属性。无论 n 有多大(收集的数据量),它都不会“沉淀”。如果你做了两次实验,每次都收集了大量的数据,你会得到不同的值,因为每次收集的第一个样本是不同的。我们可以说这个统计不收敛。
对于等式(1)中的统计数据(样本均值),每次我们收集(比如说)一百个数据点时,结果都会发生变化,但是随着我们收集的移动,对于大多数分布,结果开始收敛,并且我们开始在重复实验时获得一致的结果。
无论我们收集了多少数据,等式(3)中的统计量(仅 7.5)都是收敛的,但由于显而易见的原因,这是无用的。
很明显,我们希望我们的统计数据具有趋同性。这符合整个‘科学实验应该是可重复的’的理念。在统计学中,数据中固有的随机噪声使得这种可重复性变得困难,但是对于足够大的数据集的收敛保证应该是不可协商的。这使我们想到了我们希望汇总统计数据/ KPI 具有的最重要的属性。
三一致性
如果您设法找到一个收敛的汇总统计数据,如果收集了大量数据,它收敛到的值是生成数据的分布本身固有的一些属性。例如,无限量数据的样本平均值就是分布的真实平均值。在数据量有限的情况下(任何真实世界的情况都是如此),我们仅仅是在估计真实的平均值。在这个阶段,我们的汇总统计不仅仅是一个汇总统计(一个总结我们数据的数字),而是对数据之外的东西的估计。如果在收集大量数据时,估计量收敛于任何估计量,则称为一致估计量。任何汇总统计量都可以被标记为分布的任何属性的估计量。例如,等式(2)中的汇总统计量是分布平均值的估计量。但是它不是一个一致的估计量,因为即使对于一个无限的样本,它也不能决定真实的平均值(不能决定任何事情)。成为一个“估计者”是给汇总统计一个目的。我们的 KPI 应该是汇总统计数据,用于估计我们想要测量的系统的一些固有属性。
III-A 不一致的例子
对大多数分布一致的估计量是样本均值。事实上,这大致就是统计学的大数定律所说的:样本均值收敛于真实均值。也就是真正的中庸存在的时候。作为病理情况的例子的分布是柯西分布,其中真实均值不存在(它不会爆炸或任何东西,只是真正不存在)。如果我们从该分布中收集一些样本,并根据它们按照等式(1)计算样本均值,那么无论我们收集多少样本,它都不会收敛到任何值,而是随机跳跃。另一个均值不存在的分布是形状参数为< 1 的洛马克斯分布。在这种情况下,它会爆炸到∞。
另一个对大多数分布收敛的汇总统计是中位数。它被定义为这样一个点,使得随机样本高于或低于它的可能性相等。为了从数据的随机样本中估计它,我们取样本的“中点”:
- 按升序排列数据。
- 如果样本数为奇数,则第 n 个位置的点为中值,否则为第 n 个和第(n+1)个点的中点。
上述汇总统计将收敛到为大多数分布生成数据的分布的真实中值。当样本是伯努利随机变量(可以是 0 或 1,每个概率为 0.5)时,就会出现病理情况。不管收集了多少样本,上面描述的汇总统计同样可能是 0、1 或 0.5。因此,当我们增加样本量时,它不会收敛到一个单一的数字。结论是,几乎总是可以构建一个病理分布,使得任何汇总统计数据都不会收敛。
仅有 III-B 一致性是不够的
对于分布的任何给定性质,可能有许多相一致的估计量。例如,如果我们想估计一个分布的平均值,我们从它那里收集一些样本,对它们进行平均,得到样本平均值:
T(x1,x2,…xn) =(x1+x2+…+xn)/n __(1)
对于大多数分布来说,均值实际上是存在的,根据大数定律,当 n → ∞时,样本均值将收敛到真实均值。但这里有另一个估计平均值的汇总统计数据:
T(x1,x2,…xn) =(x1+x2+…+xn)/(n+1)
这也符合吗?当 n → ∞时会发生什么?分母中的(n+1)也可以是 n,因为与大的 n 相比,1 可以忽略不计。因此,该估计量也收敛于真实均值,并且也是一致的。同样的道理,我们可以把分母中的 n 和任何有限的数相加,最终仍然得到一致的估计量。
我们也可以忽略一些样本,把它们从分子中的和中省略掉。这也不会使估计量不一致,因为当 n 趋于无穷大时,一些丢失的样本没有影响。
如果上面讨论的所有估计量都是一致的,我们如何在它们之间进行选择?虽然一致性是我们希望所有评估者都具备的,但我们还可以要求其他东西。大多数这些会告诉我们,方程中的估计量是这里讨论的所有估计量中“最好的”。
IV 无偏性
我们看到了估计量的一致性是一个重要的属性,它促进了可重复性的科学租户(至少如果收集了足够的样本)。但是这还不足以确定最好的评估者或者排除一些明显不好的评估者。在这一节中,我们将讨论一个标准,它确实有助于我们排除除一个估计量之外的所有估计量。它被称为 UMVUE 标准,在拼写时也会发出令人愉快的声音。
IV-一个简单的无偏性
一致性的性质是指当收集的样本数量足够大时,估计量的行为。在现实世界中,我们总是在处理数量有限的数据。有限的样本量意味着我们的估计器可能不会直接到达它所估计的任何数量。我们从汇总统计中得到的数字将是“off”;它会有一些误差(比如 e)。此外,这个误差是一个随机量(如果不是,我们就从我们的汇总统计中减去它,就不再有误差了)。如果我们用相同的样本量重复实验(或者考虑在平行宇宙中进行的实验),我们将得到这个误差的不同值。因此,误差项是产生样本的分布、样本数量以及我们用来将样本汇总成一个数字的汇总统计量的函数。处理嘈杂的误差项是工作描述的一部分。我们可以退而求其次,研究它的性质。一致性要求要求随着收集的样本变得足够大,误差变为零。无偏性要求要求即使对于有限的样本,误差平均为零。如果这个平均值不为零,那么它的值就叫做估计量的偏差。
让我们回到我们在第 III-B 节中讨论的一些例子。如果我们收集 n 个样本,并基于它们计算样本均值,我们会得到真实均值的一致且无偏的估计值。另一种估计方法是在分子或分母(或两者)上加一个有限的数。
T(x1,x2,…xn)=((x1+x2+…+xn)+C1)/(n+C2)_(4)
如果 c1 和 c2 都为零,我们将得到常规样本均值。同样清楚的是,只要 c1 和 c2 是有限的,估计量仍然是一致的(因为大的 n 将使 c1 和 c2 不相关)。但是无偏性呢?这次我们不能指望 n 是大的,因为无偏性对任何 n 都成立(不仅仅是大的)。不难看出,使等式①中的估计量对所有 n 都无偏的唯一方法是 c1=c2=0。因此,无偏性的额外要求帮助我们排除了一整族都一致的估计量。另一方面,在一个估计量中,除了有限数量的样本之外,我们去掉了所有的样本;例如:
T(x1,x2,…xn)= (x1+x2)/2
或者
T(x1,x2,…xn) = x1
将是无偏的,但不一致,因为无论 n 变得多大,仍会有一些噪声。这是否意味着一旦我们既考虑无偏性又考虑一致性,样本均值是唯一仍然有效的估计量?不完全是。
最小方差无偏估计量
如果我们决定取出有限数量的样本,取剩下的样本的平均值,会怎么样?比方说,我们总是去掉前两个样本:
T(x1,x2,…xn)=(x3+x4+…+xn)/(n-2)_(5)
首先,如果我们有两个或更少的样本,这种估计就失效了,而样本均值(来自等式①)甚至对一个样本也有效。但是让我们先把这个放在一边,假设我们总是有三个或更多的样本。
等式(5)中的估计器正在做与等式①几乎相同的事情,但是在丢弃一些数据之后。所以,它在某些可量化的方面一定是次等的。然而,它检查盒子是否一致和公正。它的不足之处在于方差更大。如果在给定的有限样本量下多次运行该实验,则等式(5)中的估计值将比等式(1)中的样本均值“波动”更多,即使它们的平均值都是真实均值。
这就是最小方差无偏估计量概念的由来。可能有许多无偏估计量,并且它们可能都是一致的,但是对于任何给定的样本量,只能有一个无偏估计量具有最小的方差。不难看出,在本节考虑的所有估计量中(这些估计量基本上以某种方式损害了样本均值),等式①中的样本均值对于生成数据的所有基础分布具有最低的方差。对于正态分布,它具有任何无偏估计量的最小方差,周期。然而,如果生成样本的基础分布是均匀的,则有另一个估计器的表现也比样本均值更好,它是无偏的,但具有更小的方差(见此处)。
为什么不偏倚
不清楚无偏性是不是我们应该一直争取的东西。当然还有其他评估标准(比如效率,我们在这里不讨论)。但我认为这是 KPI 背景下值得追求的东西。我们之前讨论过,我们希望我们的 KPI 是一些潜在属性的估计值的汇总统计。我们也希望估计量是一致的。这必然意味着,随着样本数 n 的增加,任何偏差都应趋于零。这种偏差最终趋于零的特性被称为“渐近无偏性”。如果我们不要求 KPI 的无偏性,当样本数 n 很小时,可能会有一些非零偏差。但是,当 n 趋于无穷大时,偏差将减小到零(因为我们确实需要一致性,这需要渐近无偏性)。因此,增加 n 将导致 KPI 的系统性变化。这一点在 V-B 部分的图 1 中得到了证明,即样本中位数,一个有偏估计量。
这种运动是不受欢迎的。这意味着,即使基础分布(比如你的平台性能或其吸引新用户的能力)没有改变,我们也可以注意到 KPI 的系统性变化,因为我们收集了不同数量的样本。由于我们将跟踪这些 KPI,并在人们移动时提醒他们,这是有问题的。我们不希望对一些系统性的运动发出警报,因为这种运动的唯一原因是我们收集了或多或少的数据。
在无偏估计量中,方差最小的估计量应该是首选的。当单个估计量保证在被估计的潜在参数的所有可能值上具有最小方差时,它被称为“一致最小方差无偏估计量”或 UMVUE。
五.更多例子
到目前为止,我们已经讨论了样本均值的变异估计量。显而易见的估计量(样本均值本身)被证明是正确的。再来说几个事情不太明显的地方。
正态分布的方差
正态分布可能是统计学中最著名的。中心极限定理,即无论单个样本的分布如何,足够大数量的 iid 样本的平均值都接近它,这赋予了它一种无处不在的特性。
它完全由两个参数确定,均值和方差。我们前面提到过,样本均值是真实均值的最小方差无偏估计量。对于方差,有一个转折。因为它被定义为平均值的均方差,所以显而易见的是:
- 先求样本均值(μ1)(估计真实均值,我们不知道)。
- 计算每个点和样本平均值之间的差异。
- 计算所有这些差值的平方,然后取这些平方的平均值。
我们称这个估计量为σ1 = ∑(xi-μ) /n。事实证明,这是真实方差σ的有偏估计量。如果我们除以 n-1 而不是 n,我们可以“修复”这个问题并消除偏差。这导致另一个估计量 s 恰好是无偏的:s = ∑(xi-μ) /(n-1)。要了解为什么会出现这种情况,请参见这里的。它也是正态分布方差的 UMVUE。
V-B 中位数
我们在第 III-A 节中把中位数描述为分布中的一个点,使得从中随机抽取的样本有可能小于中位数,也有可能大于中位数。所以,“将分布减半”的观点。对于许多分布来说,样本中位数是一个有偏估计量。如果分布是对称的(像正态分布),这不是问题。但是在大多数情况下,我们会计算中值,这些数量总是正的(比如延迟,人的高度,等等)。).并且这种分布必须是非对称的,因为它们的右尾趋向于无穷大,而左尾在零处有界。用于描述总是为正的数量的一个流行分布是对数正态分布。在下图中,我从对数正态分布中抽取了一些样本(如图所示)。然后,我重复这个实验 10 万次,估计每次的中间值。这 100,000 个中间值绘制在直方图中。它们的平均值以紫色显示,真实的中值(我知道,因为我生成了数据)以黑色显示。您可以看到,紫色线从正偏差开始,随着收集的样本数量的增加,该偏差减小到零(渐近无偏)。
图 1:随着样本量的增加,中位数偏差缩小。一些样本(如图所示)是从对数正态分布中产生的。对于每个样本大小,该实验重复 100,000 次,并将 100,000 个中值绘制在直方图中。这 100,000 个中间值的平均值是紫线,而真正的中间值是黑线。
我在下面包含了用于生成该图的代码。
点过程的 V-C 失效率
到目前为止,我们已经讨论了根据样本(x1,x2,…xn)收集的数据。这些可能是某些操作、评级等的等待时间。为了说明数据有不同的风格,考虑一下一段高速公路上的事故数量。对于高速公路的设计者来说,一个很好的 KPI 是事故发生率(比如每年的事故数量)。在这种情况下,数据的单位是观察窗的长度。再比如,我目前在微软 Azure 做数据科学家。我们的客户从我们这里租赁虚拟机。我们担心这些虚拟机中的崩溃(一种点过程)。我们使用的一个关键 KPI 是我们看到崩溃的比率;每虚拟机小时的崩溃次数。数据收集的单位是观察到的虚拟机小时总数,崩溃率的估计值是观察到的崩溃总数除以同一观察期间的虚拟机小时总数。更新理论中有一个定理(布莱克威尔定理)说,这是一个对各种各样的点过程的真实失效率的无偏估计量。
使用 Amazon SageMaker Clarify 的机器学习模型中的偏差检测
理解 AI/ML 环境中的偏差,它可能发生在 AI 生命周期的什么地方,面临的挑战,以及如何使用 SageMaker Clarify 来检测数据集和 ML 模型中的偏差
来源:https://unsplash.com/
1.介绍
你的 AI 解决方案公平可信吗?
如果几年前有人问这个问题,那么他/她很可能不会被重视。
传统上,人工智能/机器学习解决方案的重点一直是开发新算法和优化现有模型以提高性能准确性。
我们假设人工智能模型的决策是公平的,人们可以信任它。
然而,最近的一些实例已经挑战了人工智能模型的公平概念。
亚马逊人工智能招聘也被发现没有公平地评价候选人,并显示出对女性的偏见。(链接
基于人工智能的预测刑事再犯风险的解决方案被发现可以预测黑人被告的更高风险值。(链接)
一种旨在预测哪些患者可能需要额外医疗护理的医疗保健风险预测算法被发现存在偏见,白人患者比黑人患者更受青睐。(链接)
在上述所有例子中,AI solution 做出的决定都是有偏见的。模特不应该根据自己的种族、性别、宗教或社会经济背景来做决定。
重要的问题是,我们能做些什么来确保人工智能/人工智能解决方案没有偏见。朝着这个方向的第一步是意识到我们的数据和算法中存在偏见,然后采取措施减轻偏见的影响。
在这项研究中,我们重点了解人工智能和人工智能解决方案中存在的意外偏差,它在人工智能生命周期中的表现,识别偏差的挑战以及领先的云供应商为该问题提供的工具和技术。然后,我们应用 AWS SageMaker Clarify 来检测真实世界数据集和基于这些数据集训练的模型上的偏差。
2.AI/ML 生命周期中的偏差
什么是 AI 偏见?
偏见没有单一的定义,可以根据问题的背景有不同的含义。我遇到过一个这样的定义,它指出“人工智能偏见是机器学习算法输出中的异常现象。这可能是由于算法开发过程中的偏见假设或训练数据中的偏见。”
AI 偏差的来源有哪些?
人工智能偏见可以在许多方面表现出来。下面我们描述 AI/ML 模型中偏差的重要原因
来源:图片由作者提供,灵感来自论文《金融领域机器学习的公平标准》
哪里出现偏差
为了有效地识别偏见,我们需要在人工智能生命周期中寻找偏见的存在。
来源:作者图片,灵感来自https://docs . AWS . Amazon . com/sage maker/latest/DG/clarify-fairness-and-explability . html
预训练阶段的偏差
1.训练数据创建期间的偏差检查需要验证数据是否没有任何选择偏差,是否代表不同的细分市场;创建的数据标签和要素没有偏见
模型训练中的偏差&验证
2.最近,在开发公平性度量方面已经做了大量的工作。这些公平性指标包含在算法的目标函数中吗
3.我们的模型验证和测试管道是否包括对相关公平性指标的检查
模型部署期间的偏差
4.一个在开发和验证时没有偏差的模型,如果用于对未经训练的数据进行预测,可能会给出有偏差的结果。我们是否包括检查以确定这一点
模型监控期间的偏差
5.我们如何减轻模型部署后可能随着时间推移而产生的偏见的影响?是否创建了反馈循环来跟踪随时间的漂移,并将这些反馈发送给算法进行自我修复?
3.偏差检测的主要挑战
来源:图片来自作者,灵感来自论文《数据驱动的人工智能系统中的偏见》
大体上,我们可以将这些挑战分为四类:
1.*数据收集:*在为模型构建任务收集数据时,通常没有关于代表性不足的细分市场的足够数据。这导致了选择偏差。此外,随着众包数据的日益流行,人们需要考虑数据和标签创建者的个人偏见。
2.敏感特征:我们如何识别可能导致意外偏差的敏感特征。目前还没有标准的方法来帮助识别这些敏感特性,我们依靠探索性分析和领域知识来识别这些特性。
3.*多模态数据:*当前许多识别和减轻偏倚的方法都是为结构化数据建立的。但越来越多的人工智能解决方案是在包括文本/图像/视频在内的多模态数据上进行训练的。需要加强偏差检测能力以处理多模态数据。
4.复杂特征工程:特征工程改善了模型性能,但同时复杂特征很难追溯到起源。当我们在处理当代 NLP 和计算机视觉解决方案时,这一挑战会变得更大,在这些解决方案中,来自开源数据的预训练嵌入非常普遍。
4.云供应商的偏差检测产品
下面,我们确定了来自领先云供应商(如 IBM、微软、AWS)的著名偏差检测工具包。这些工具包与供应商提供的其他 AI/ML 产品很好地集成在一起。
IBM**😗***AI Fairness 360 toolkit(AIF 360)**是一款开源软件工具包,可以帮助检测和消除机器学习模型中的偏见。AIF360 使人工智能开发人员和数据科学家能够轻松检查他们机器学习管道中多个点的偏差,根据他们的情况使用适当的偏差度量。它还提供了一系列最先进的偏差缓解技术,使开发人员或数据科学家能够减少任何发现的偏差。
微软 : Fairlearn 是一个开源工具包,让数据科学家和开发人员能够评估和改善他们的人工智能系统的公平性。它有两个组成部分:一个交互式可视化仪表板和不公平缓解算法。这些组件旨在帮助在公平性和模型性能之间进行权衡。
AWS : 亚马逊 SageMaker Clarify 为机器学习开发人员提供了对其训练数据和模型的更大可见性,以便他们可以识别和限制偏差并解释预测。通过检查您指定的属性,Clarify 服务有助于在数据准备期间、模型训练之后以及您部署的模型中检测潜在的偏差。它还提供了量化不同类型的可能偏差的详细报告。
5.使用 AWS SageMaker Clarify 进行偏差检测
为了证明偏差检测解决方案的有效性,我们将 AWS SageMaker Clarify 应用于两个数据集的偏差检测:
i)问题陈述:
- 识别数据集中的偏差
- 识别模型预测中的偏差。
二)数据来源:
Dataset1 是一个 Kaggle 数据,用于测量印度不同邦的不同电信运营商在 4G、3G 等电信网络中的掉话率,测量时间为一个月。
来源:取自 Kaggle 的样本数据
数据集 2 是模拟投资世界中真实数据集的合成数据。对于那些对合成数据感兴趣的人,请参考我之前关于该主题的博客。
来源:综合数据,图片由作者提供
iii)使用 SageMaker Clarify 进行偏差检测的解决方案:
我们利用 SageMaker Clarify 来确定上述两个数据集的偏差。下面是数据集中偏差检测的高级解决方案。
来源:作者图片
第一步,我们识别那些可能导致偏差的属性。这些属性可能与性别、年龄、国籍等有关。
二。一旦我们确定了敏感属性,我们就确定了这些属性中代表不受欢迎群体的值的范围。
三。敏感属性和敏感值被提供给偏差算法。
四。在偏差算法中,数据集根据指定的敏感要素和值分为受欢迎组和不受欢迎组。
动词 (verb 的缩写)进行统计测试,并为偏差检测计算训练前和训练后的度量。基于对统计指标的解释,我们确定是否存在偏差。
四)探索性分析结果:
在偏倚检测过程之前,对两个数据集进行了数据探索。
数据集 1
我们观察到数据集 1 有更多来自一些优势群体的观察结果。大多数数据是针对 4G 网络测量的,几乎 80 %的观察结果是客户对掉话感到满意的。
来源:作者图片,数据集 1 的探索性分析
数据集 2:
数据集 2 是经过清理和归一化的合成数据。我们删除了一些可以识别最终客户的敏感属性,并使用 SMOTE(一种合成过采样方法)平衡了训练数据。
来源:作者图片,数据集 2 的探索性分析
v)偏差检测结果
a)数据集 1 上的偏差检测结果
对于数据集 1,我们使用敏感属性检查偏差的存在,如具有较少观察值的网络类型、代表不足的州以及订户较少的运营商。
对于大多数敏感特征,我们发现统计指标如 KL 散度、JS 散度(测量不同组的结果分布在熵上彼此偏离多少)是显著的,从而表明数据中存在偏倚。我们还发现了 CDDL 度量的统计显著值,该度量通过数据的子组来测量差异。
来源:作者提供的图片,来自数据集 1 的预训练指标的偏差检测结果
下表有助于解释上面分享的一些培训前指标:
来源:AWS Image,https://docs . AWS . Amazon . com/sage maker/latest/DG/clarify-measure-data-bias . html
基于对上述预训练指标**的解释,我们得出结论,在数据集 1 中存在显著偏差。**由于在数据集 1 中发现了明显的偏差,我们没有继续在该数据上建立模型。
b)数据集 2 上的偏差检测结果
对于数据集 2,我们对敏感属性进行了偏差测试,如年龄和某些标识金融产品来源的标志。
以下是我们在上述测试中获得的一些预培训指标结果。
来源:作者图片,澄清偏差检测的预训练结果
我们在敏感特性的大多数统计指标中没有发现明显的偏差。这可能是由于数据是合成产生的,并且我们在偏差检测之前应用了平衡和标准化技术。唯一可见的偏差是在阶层不平衡指标中,该指标衡量不同群体之间成员数量的不平衡。
由于在数据集 2 中没有发现偏差,我们继续在数据上训练了一个分类模型,该模型预测客户选择给定产品的倾向。对生成的模型预测进行了偏差检测测试,以下是训练后指标的结果
来源:作者图片,培训后偏差指标的结果
下表有助于解释上面分享的一些培训后指标
来源:图片 AWS,https://docs . AWS . Amazon . com/sage maker/latest/DG/clarify-measure-post-training-bias . html
根据培训后指标的结果,我们得出结论,模型预测中不存在任何重大偏差。
6。未来的挑战
为了更广泛地采用偏置检测解决方案,仍然需要应对一些公开的挑战,如下所示:
目前,偏见和公平的概念高度依赖于应用程序,没有一个统一的方法可以应用于一个问题。
没有商定的方法来选择衡量偏差的属性。
在选择用于测量偏差的特定预训练偏差度量时缺乏标准化;这仍然受到社会、法律和其他非技术因素的指导
需要进一步研究图像/文本/视频等非结构化数据的偏差识别。
7。参考文献
- 亚马逊 SageMaker Clarify—https://docs . AWS . Amazon . com/SageMaker/latest/DG/Clarify-fairness-and-explability . html
2)AI Fairness 360-https://developer . IBM . com/technologies/artificial-intelligence/projects/AI-Fairness-360/
- 金融领域机器学习的公平性度量—https://pages.awscloud.com/rs/112-TZM-766/images/Fairness.Measures.for.Machine.Learning.in.Finance.pdf
4)fair learn—https://www . Microsoft . com/en-us/research/publication/fair learn-a-toolkit-for-assessing-and-improving-fair-in-ai/
-
数据驱动的人工智能系统中的偏差 —介绍性调查—https://arxiv.org/pdf/2001.09762.pdf
免责声明:本文分享的观点是我个人的观点,不一定代表富达国际或任何关联方的观点。