监督分类的对比损失
对比交叉熵损失和对比损失
最近,来自谷歌研究院和麻省理工学院的研究人员(Khosla 等人)发表了一篇名为“有监督的对比学习”的论文。在对比学习的基础上,提出了一种新的损失函数“对比损失”来训练有监督的深度网络。他们证明,在 ImageNet 数据集上,对比损失在一系列神经架构和数据增强机制的分类中的表现明显优于传统的交叉熵损失。
我发现这篇论文特别有趣,因为它的思想非常简洁,可能是监督分类任务甚至回归的一种简单而通用的改进。在进入细节之前,让我们首先回顾一下用于监督分类的损失函数(又名目标函数)的基础知识。
交叉熵损失
交叉熵,也称为对数损失、逻辑损失,可以说是分类中最常用的损失函数。顾名思义,它来自信息论,信息论测量两个概率分布之间的互熵, p 和 q 。它也与kull back-lei bler 散度密切相关,可以写成熵 H§ 与从 p 到 q 的 KL 散度之和:
H(p,q) = H§ + D_{KL}(p||q)
当用作分类的损失函数时,可以使用交叉熵来度量基础真实类分布和预测类分布之间的差异:
交叉熵损失
其中 M 是类的数量 c 和 y_c 如果类标签是 c 和*p(y = c |x)*是在给定输入特征向量 x 的情况下分类器认为标签应该是 c 的概率
对比损失
对比损失广泛应用于无监督和自监督学习中。这个损失函数最初是由 Yann LeCun 的小组的 Hadsell 等人在 2016 年开发的,它作用于成对的样本,而不是单个样本。它为每对样本定义了一个二进制指示符 Y ,表示它们是否应该被视为不相似(如果 x_1 、 x_2 被视为相似,则 Y = 0);否则 Y=1),以及一个可学习的距离函数*D _ W(x _ 1,x _ 2)*在一对样本 x_1 , x_2 之间,由权重 W 参数化对比损失定义为:
对比度损失函数
,其中 m > 0 为余量。裕度定义了样本嵌入空间周围的半径,使得不同的样本对仅在距离 D_W 在裕度内时对对比损失函数有贡献。
直观地,该损失函数鼓励神经网络学习嵌入,以将具有相同标签的样本彼此靠近放置,同时在嵌入空间中使具有不同标签的样本远离。
自我监督学习和监督学习的对比损失
在标签不可用并且目标是学习数据的有用嵌入的自我监督设置中,对比损失与数据扩充技术结合使用,以创建共享相同标签的扩充样本对。就像科斯拉论文中的插图一样,比熊犬图片的不同放大应该彼此靠近,远离任何其他图片,无论是其他狗还是猫。然而,正如作者指出的,这种通过自我监督对比损失学习的嵌入不一定对监督学习者有用,因为引入了假阴性:一只比熊犬的嵌入也应该与其他狗的嵌入在同一邻域,无论是柯基犬还是西班牙猎犬。
为了使对比损失适应监督学习,科斯拉和他的同事开发了一个两阶段程序,将标签和对比损失的使用结合起来:
- 阶段 1:使用对比损失来训练编码器网络,以嵌入由它们的标签引导的样本。
- 阶段 2:冻结编码器网络,并在已学习的嵌入之上学习分类器,以使用交叉熵损失来预测标签。
最初研究中的实验是在 ImageNet 上进行的。作者还评估了不同的数据增强选项和各种类型的最新架构,如 VGG-19 和 ResNets。
MNIST 和时尚 MNIST 数据集上的实验
我不是计算机视觉专家,我更感兴趣的是,对于通用分类问题,所提出的监督对比损失是否优于交叉熵。为了在我的笔记本电脑上运行比较典型损失函数和对比损失函数的有效性的实验,我选择了小得多的 MNIST 和时尚 MNIST 数据集。我还忽略了像素之间的空间关系,避免使用任何卷积层来模拟表格数据集。
我在接下来的实验中使用的架构非常简单,两个密集的隐藏层,每个都有 256 个神经元,通过泄漏的 ReLU 激活连接。最后一个隐藏层的输出被归一化,以将输出向量定位在单位超球面中。这种架构对于用对比损失和 MLP 基线训练的编码器是相同的。最后的分类层由对应于 10 个类别的 10 个单元组成。
遵循 Khosla 论文提出的相同过程:编码器在阶段 1 中使用对比损失进行预训练,然后在阶段 2 中被冻结以仅训练分类器。如下所示,在两个数据集上,具有监督对比损失的模型确实优于具有交叉熵损失的 MLP 基线,具有完全相同的架构。这种改善在时尚的 MNIST 上更高,一个比 MNIST 更困难的任务。
在 MNIST 和时尚 MNIST 数据集的保留测试集上的性能(准确性)。
另一个有趣的观察是,对于有监督对比损失的模型,学习曲线更平滑,这可能是由于预先训练的表示。
为了证实性能的提高是由于更好的嵌入空间,我使用交叉熵检查了来自 MLP 基线和使用对比损失学习的嵌入的 PCA 投影。作为阴性对照,我还检查了没有任何嵌入的原始数据空间的 PCA 投影。
**模型学习到的嵌入(或无嵌入)的 PCA 投影。**从左到右:原始数据空间;基线 MLP 的最后一个隐藏层;使用对比损失学习的投影
如散点图所示,MLP 模型和对比模型都比原始数据更好地聚类具有相同标签的样本,但是对比嵌入中的聚类更紧密。为了更加突出这一点,我绘制了 PCA 投影的密度,从对比嵌入中可以清楚地看到 10 个不同的聚类:
**显示模型学习的 PCA 投影密度的联合图。**从左到右:原始数据空间;基线 MLP 的最后一个隐藏层;使用对比损失学习的投影
上面的图是在 MNIST 数据上生成的,类似的观察结果也可以在时尚 MNIST 数据集上持续存在,尽管一些类混合在一起。
不同模特在时尚 MNIST 数据集上学习的表征的主成分分析。
总之,我的实验清楚地再现了原始研究的发现,即监督对比损失在分类任务中优于交叉熵。事实上,它还可以在更小的数据集上工作,无需数据扩充,也无需使用特定领域的架构,如卷积,这非常令人鼓舞。这表明监督对比损失可以作为任何监督任务的通用技术。我期待将其应用于未来的 ML 任务,并探索其在回归中的适用性。
这些实验使用的代码可以在这里找到:【https://github.com/wangz10/contrastive_loss
参考
为数据科学做出贡献
嘿大家好!
由于我们经常收到关于如何为 TDS 做贡献的问题,我收集了一些想法,希望能帮助那些有兴趣开始的人。
首先也是最重要的,我们已经投入了大量的精力为我们的 撰写面向数据科学的 **文章。**如果你还没看,就从那里开始吧!多年前,这篇文章只是两分钟的阅读。现在这是一个十分钟的阅读,可能值得你花时间!
当我与一位作者面对面时,我通常会转述上面文章的部分内容来回答他们的问题。如果有人问了一个我们在文章中尚未回答的问题,我会回去编辑指南,以便每个人都可以阅读答案。这些年来,这篇文章解决了我被问到的关于如何成为一名成功的 TDS 作家的所有问题。
我注意到,我们最好的作者专注于为读者带来价值。他们以直接、简单、有时甚至有趣的方式分享他们的想法、代码和经验。他们使用自己的文字、图表和图像使他们的内容真正独一无二。当阅读他们的文章时,你可以看出作者试图帮助读者发现和理解新事物。
**发表在《走向数据科学》上能帮你带来更多流量。**我们在出版物、时事通讯和社交媒体上展示我们收到的最佳文章。因此,对数据科学感兴趣可以帮助你得到他人的关注和推荐!
如果你想阅读其他 TDS 作者的建议,看看这个页面。我们在这里收集了一些我们认为可能会让你感兴趣和受到启发的文章。
请永远记住,我们喜欢收到新的投稿!如果你有兴趣向我们提交一篇文章,你可以在这里找到具体的说明。太简单了,我们迫不及待地想看看你写了什么!如果你愿意连接,我在 Linkedin 上。
感谢您对撰写《走向数据科学》的兴趣!
为初学者贡献开源
入门
我是如何在短短几周内从几乎不知道如何使用 GitHub 变成为熊猫做贡献的
关于开源的一句话
让我们从什么是开源开始:可以自由修改和重新发布的代码,它通常是合作开发的。
数据科学中使用的许多工具都是开源的,从 pandas 和 matplotlib 等 Python 包到 Hadoop 等程序,任何人都可以免费访问它们的事实极大地促进了该领域的访问。了解到这些工具的广泛使用和有效性,令人惊讶的是,志愿者们提供了这些工具,并且仍然在业余时间定期维护它们。
源代码管理允许多人同时在同一个代码库上工作。照片由扬西·敏在 Unsplash 拍摄
我该如何开始?
我第一次有了为开源做贡献的想法是在听 podcas t 的线性题外话时。以前,我认为为开源做贡献是软件工程师的专利,但在他们的节目中,他们涵盖了数据科学开源生态系统,我意识到我使用的许多工具都是该生态系统的一部分。
然而,当时似乎仍然很难想象所有的碎片是如何组合在一起的。我看了几个 GitHub 库,这似乎有点违背直觉,所以我把这个想法放在后面,但把它藏在心里,作为我将来想做的事情。
然后到了九月,我看到了一条关于 Hacktoberfest 的推文,在这个活动中,一个月内,你可以对开源做出 4 点贡献,并在过程中学习。这似乎是一个以有组织的方式尝试的完美机会,所以我报名了。
图片来自数字海洋
基本资源
我做的第一件事就是跟着一个 GitHub 教程。当然,我以前上传过一些代码,但是我不知道拉请求的来龙去脉,合并冲突,甚至不知道分支是什么。
外面有很多 GitHub 教程,但我看了活动主页上的那个,它真的很有用。这里可以找到。
之后,我需要找到几个需要帮助的项目。对我有帮助的是,我发现许多存储库用“好的第一期”或类似的标签来标记初学者可以帮助的问题。你可以在熊猫、 numpy 和 matplotlib 中找到例子。
概括地说,你可以去任何 github 仓库,切换到“问题”标签,并根据适当的标签进行过滤。
未决问题列表。来源:github.com
我与熊猫和 matplotlib 的经历
我不是软件工程师。如果你找到了这个教程,但也不是,你很幸运,我们还有很多可以做的!一些简单的事情可以从解决文档问题或处理您已经使用过并有经验的特定功能开始。
对于我对数据空间的第一个贡献,我修正了熊猫文档中的代码风格。你可以在这里看到未解决的问题,即文档使用了在 pandas 中不再使用的某些编码风格约定,所以我必须通过工具运行一些 python 文件来重新格式化它们,并合并回主分支。我提出的最后一个 pull 请求可以在这里看到,它需要一些 python 格式的知识,以及从 GitHub 下载和运行一个工具,所以如果你知道如何打开一个 Python 文件和如何安装一些东西,你可以很容易地做一些类似的事情!
我的第二个问题来自 matplotlib,需要从文档页面中删除术语表及其所有引用,我认为这是一个简单的任务,但结果是需要在本地构建文档和一些 html。幸运的是,维护人员非常乐于助人,一路指引着我。我的第二个拉动请求以及所有细节可以在这里找到。
我在路上学到了什么?
在你点击离开这篇文章之前,我想告诉你一些事情。
- 开源维护者都是不可思议的人。他们是志愿者,但是他们非常乐于助人和积极响应。我接触过的每个人都很乐意随时帮忙,不管是在深夜还是周末,即使没有紧迫的截止日期或公司盈利电话催得急。这些人对数据充满热情,他们激励我也这样做。
- 阅读投稿指南。大多数回购都有一个自述文件,解释他们接受捐款的首选方法。请注意,这些问题可能已经被分配了,或者有人已经开始处理它们了,所以在开始之前,请检查问题页面上的评论,并与维护人员沟通您想要开始处理它。
- 请勿发送垃圾邮件。开源贡献者和维护者非常忙碌,我在 Twitter 上看到了很多关于 Hacktoberfest 和其他活动的有用性的来回,其中有一种趋势是垃圾邮件小的改进,以满足您的拉请求配额。请确保您的开源贡献是有用的,或者是对“问题”选项卡上提到的某个问题的回应。
- 享受过程中的乐趣!我非常喜欢为开源做贡献,一旦我发现下一个我可以帮忙的问题,我会再做一次。
循环,中断,继续与朱莉娅在一起
Julia 的控制流基础知识
学会随波逐流-图片由迈克·刘易斯智慧媒体在 Unsplash 上发布
让我们继续探索朱莉娅的基础知识。之前我谈到了循环的和矢量化的和。在这里,我们将讨论如何在 Julia 内部使用控制流操作符。
什么是控制流操作符?
顾名思义,控制流操作符帮助我们塑造程序的流程。你可以从一个函数返回,你可以从一个循环中中断,你可以通过继续跳过一个循环的迭代。
简单的任务
为了理解这些概念,我们将尝试解决一个问题。没有比亲身体验更好的了,对吧?我们的挑战如下:
给定 2 个整数(a,b ),打印 a 和 b 之间最小的(最多)5 个整数,这样我们就不会打印能被 3 整除的数字。
例如如果a=5
和b=23
我们应该打印以下数字:
5
7
8
10
11
如果a
和b
彼此更接近,我们打印到b
的所有内容。下面是另一个关于a=2
和b=4
的例子:
2
4
如果你完全是编程新手,你可能想看看我的 FizzBuzz 文章[链接],在那里我解释了 for 循环和 modulo 函数。
首先,我们打印
本着循序渐进的精神,让我们构建我们的函数:
这只是打印从a
到b
之间的所有数字。
然后,我们继续
我们的问题是,这也打印可被 3 整除的数字,这不是我们想要的。为了在 for 循环中跳过这些数字,我们可以使用continue
。
所以无论何时rem(i,3) == 0
计算为true
,我们都将跳回循环的顶端,继续下一个i
。这就是continue
的作用。
让我们来测试一下:
julia> fancy_printer(3,10)4
5
7
8
10
厉害了,再也没有能被 3 整除的数字了!👏
最后,我们休息
有时候,我们需要从循环中休息一下——张肯尼在 Unsplash 上拍摄
以上照顾到了我们的一个问题,但是在a
和b
之间有超过 5 个不能被 3 整除的数的情况下,我们还是要处理。例如:
julia> fancy_printer(3,13)4
5
7
8
10
11
13
这意味着我们要小心的不是我们打印的内容,而是我们总共打印了多少次。为了处理这个问题,我们将引入另一个名为 printed 的变量,我们可以用它来计算我们打印的次数。如果这个值达到 5,我们就可以用 break 结束 for 循环,结束它。
让我们看看它是否有效🤞:
julia> fancy_printer(3,25)4
5
7
8
10
确实如此。但是现在所有这些 if 语句看起来有点难看…
越来越花哨
现在我们有了一个fancy_printer
函数,看起来没那么花哨。我来给大家介绍一下 短路操作工 。短路运算符&&
和||
可以将中频模块压缩成一个单元。他们将一个布尔表达式带到左侧并将一个动作带到右侧。&&
仅在布尔值为true
时评估动作,而||
仅在布尔值为false
时动作。
使用短路操作符
&&
和||
使你的代码更加简洁。
下面是这个更简洁的版本的样子:
%是余数运算符。i % 3 与 rem(i,3)相同
简洁紧凑的代码的确很酷!— 来源
结论
现在你知道了:
- 如果您想在任何时候停止循环,请使用
break
。 - 为了跳过你的循环迭代,
continue
是你的朋友。 - 三元运算符
&&
和||
可以让你的代码更小,可读性更好。
这里还有一些关于茱莉亚的文章:
如何使用 FizzBuzz 执行循环和条件函数
towardsdatascience.com](/learning-julia-the-simplest-of-beginnings-464f590e5665) [## 向量化朱莉娅的一切
告别 for loops,广播所有的东西
towardsdatascience.com](/vectorize-everything-with-julia-ad04a1696944)
控制你所能控制的:通过任务规划强化学习!
[2]
在这里我谈谈我们 NeurIPS 2019 的论文,将规划与强化学习代理 agraphnd 内在动机结合起来。
现实世界中的许多控制问题都有某种层次结构。当我们谈论真正的自主机器人时,理想情况下,我们希望它们获得对环境的最大控制。我们希望这发生在通过奖励功能很少或没有监督的基础上。此外,我们希望代理在环境中利用这些固有的任务层次,以使学习更加有效。通俗地说,就是想让机器人自己一个人呆着,没有任何规范,让它自己想明白一切。大多数方法只处理这些问题中的一个,因此我们[1]提出了一种同时处理所有这些问题的方法。
在开始使用这种方法之前,我们必须弄清楚我们所做的假设和某些术语。首先,我们假设环境有明确定义的任务空间,并且对我们可用。在我们的情况下,任务空间被定义为观察空间的子空间,例如物体的坐标,尽管机器人不知道语义。这意味着自我强加的目标对应于达到任务空间中的目标,例如,将对象移动到某个位置。
自然地,任务可以相互依赖,然而,现在仅仅学习这种依赖性就足够了,因为我们还需要知道在子任务中需要达到哪个确切的目标。举个例子,考虑一个仓库里的机器人。仓库中有一个重物太重,无法直接提起,因此机器人需要使用叉车。这个场景自然分解为 3 个任务(简化):机器人位置、叉车位置、重物位置。我们希望机器人自己想出应该移动到叉车,让叉车靠近重物,然后移动物体。这包括分别瞄准每个子任务的正确目标。
有机器人的仓库场景。我们提出的方法学习重物、叉车和机器人之间的正确任务依赖性。(1)
记住所有这些,在我们提议的方法中,这些是我们试图解决的主要挑战:
- 在使用代理执行首次展示之前,我们如何选择要尝试的任务?
- 假设任务之间有相互依赖关系,我们如何找到正确的任务依赖关系?
- 我们如何根据学习到的任务依赖关系生成子目标?
你能控制的框架
在《控制你所能》( CWYC)中,我们有多个部分共同发挥作用,以实现学习中的样本效率。但是在进入单个组件之前,我们需要一种方法来指导缺乏外在奖励的学习。人们可以依靠前向模型的预测误差作为替代奖励,但预测误差是不够的。它不够用的原因是在嘈杂的环境中。如果我们在环境中有不可预测的因素,这将产生持续的预测误差。因此,我们在以下所有组成部分中严重依赖惊喜对内在动机的衡量。在没有成功信号的情况下(如果任务被解决,则为 1),该算法更依赖惊喜作为替代奖励。如果一个事件/转变在一定的置信区间之外引起相当大的误差,我们说它是令人惊讶的,这使我们能够处理环境中的噪声。
任务选择器决定代理要尝试哪个任务。任务选择器实际上是一个多臂强盗,我们需要一种方法来适应它的臂分布。应该尝试的任务是可以改进最多的任务,因此我们引入改进/学习进度(成功的时间导数)作为更新分布的手段。
关于任务依赖性的信息包含在任务规划器中,它实际上是一个对任务图或上下文多臂 bandit 进行编码的矩阵(其中上下文是要解决的任务,动作是之前的任务)。我们根据单元格条目从任务规划器中抽取任务序列。作为示例,从任务 A 到任务 B 的转移概率与求解 B 所需的时间量成比例,给定求解任务 A 和在 B 的目标空间中在求解任务 B 之前求解任务 A 时看到的惊奇
子目标生成器使我们能够给定任务链中的任务转移来设置目标。即,这意味着假设我们知道我们想要稍后解决任务 B,生成器输出任务 a 的目标。子目标生成器可以被视为任务的目标空间上的潜在函数。同样,在没有成功信号的情况下,这种奖励被惊喜所主导。
下图总结了上述所有组件:
实验
我们在两个连续的控制任务上评估了我们的方法,一个合成工具使用任务和一个挑战性机器人工具使用任务,对照内在动机和分级 RL 基线。我们注意到的是,在缺乏一个良好的奖励的情况下,基线无法学习如何解决这些层次化的任务。这与这样一个事实紧密相关,即状态空间中只有很小一部分与解决任务相关。在一个形状良好的奖励面前,其他方法也能够解决任务。
我们在评估中使用的环境
下图是工具使用任务的性能图。我们的方法(CWYC)在层次结构中稍微复杂一点的任务上一直优于基线,比如拿起一个重物。详见[1]。
实验结果。HIRO 是另一种分层 RL 算法,ICM 是我们的内在动机基线,SAC(软行动者-批评家)是标准 RL 算法。
(2)
在动画(2)中,我们可以看到算法在机械臂任务中的训练进度。盒子太远,机器人无法自己够到,所以它需要意识到它应该先抓住钩子,才能成功地将盒子移动到目标位置(红色)。
此外,我们测量了算法的“资源分配”,即算法为每个单独的任务贡献了多少时间。在下图中,我们可以很好地说明我们的观点。基于我们的方法,通过使用意外信号及其与成功信号的组合,我们实现了有效的资源分配。无法解决的任务,如移动一个物体,随机出现在不同的地方,很快得不到关注。
图(a)示出了代理随时间的资源分配,图(b)示出了任务依赖图的学习编码,较高的数字意味着在展开任务链时任务转移发生的概率较高。图©是学习任务图的图形表示,注意,进入任务的箭头意味着该任务是箭头所源自的任务的依赖项。例如,loco(运动)是工具任务的依赖项。
然而,问题仍然存在,我们能否进一步简化我们的假设,就像在任务空间的情况下一样。对于一个导致高效学习的问题,我们能学习到高效的任务空间划分吗?假设我们不知道任务空间的哪一部分是可达的,我们如何学习为任务取样可行的目标?这个我们留待以后研究。
参考
[1] Blaes,Sebastian 等人控制你所能控制的:内在激励的任务规划代理,NeurIPS 2019
[2]图片取自 Pixabay
确认
这是马克斯·普朗克智能系统研究所自主学习小组的工作。
用眼睛控制鼠标
根据眼睛位置自动导航到坐标的鼠标(图片由作者提供)
仅从单个正面视角作为输入的眼睛姿态估计的机器学习方法
在这个项目中,我们将编写代码,在你每次点击鼠标时裁剪你眼睛的图像。使用这些数据,我们可以反向训练一个模型,从你的眼睛预测鼠标的位置。
我们需要几个图书馆
# For monitoring web camera and performing image minipulations
import cv2# For performing array operations
import numpy as np# For creating and removing directories
import os
import shutil# For recognizing and performing actions on mouse presses
from pynput.mouse import Listener
我们先来了解一下 pynput 的Listener
是如何工作的。
pynput.mouse.Listener
创建一个记录鼠标移动和鼠标点击的后台线程。下面是一个简化代码,当鼠标按下时,它打印鼠标的坐标:
from pynput.mouse import Listenerdef on_click(x, y, button, pressed):
"""
Args:
x: the x-coordinate of the mouse
y: the y-coordinate of the mouse
button: 1 or 0, depending on right-click or left-click
pressed: 1 or 0, whether the mouse was pressed or released
"""
if pressed:
print (x, y)with Listener(on_click = on_click) as listener:
listener.join()
现在,为了我们的目的,让我们扩展这个框架。然而,我们首先需要编写裁剪眼睛边框的代码。稍后我们将从on_click
函数中调用这个函数。
我们使用 Haar 级联对象检测来确定用户眼睛的包围盒。你可以点击下载探测器文件。让我们做一个简单的演示来说明这是如何工作的:
import cv2# Load the cascade classifier detection object
cascade = cv2.CascadeClassifier("haarcascade_eye.xml")# Turn on the web camera
video_capture = cv2.VideoCapture(0)# Read data from the web camera (get the frame)
_, frame = video_capture.read()# Convert the image to grayscale
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# Predict the bounding box of the eyes
boxes = cascade.detectMultiScale(gray, 1.3, 10)# Filter out images taken from a bad angle with errors
# We want to make sure both eyes were detected, and nothing else
if len(boxes) == 2:
eyes = []
for box in boxes:
# Get the rectangle parameters for the detected eye
x, y, w, h = box
# Crop the bounding box from the frame
eye = frame[y:y + h, x:x + w]
# Resize the crop to 32x32
eye = cv2.resize(eye, (32, 32))
# Normalize
eye = (eye - eye.min()) / (eye.max() - eye.min())
# Further crop to just around the eyeball
eye = eye[10:-10, 5:-5]
# Scale between [0, 255] and convert to int datatype
eye = (eye * 255).astype(np.uint8)
# Add the current eye to the list of 2 eyes
eyes.append(eye) # Concatenate the two eye images into one
eyes = np.hstack(eyes)
现在,让我们用这些知识写一个函数来裁剪眼睛的图像。首先,我们需要一个帮助函数来进行规范化:
def normalize(x):
minn, maxx = x.min(), x.max()
return (x - minn) / (maxx - minn)
这是我们的眼睛裁剪功能。如果找到了眼睛,它将返回图像。否则,返回None
:
def scan(image_size=(32, 32)):
_, frame = video_capture.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
boxes = cascade.detectMultiScale(gray, 1.3, 10) if len(boxes) == 2:
eyes = []
for box in boxes:
x, y, w, h = box
eye = frame[y:y + h, x:x + w]
eye = cv2.resize(eye, image_size)
eye = normalize(eye)
eye = eye[10:-10, 5:-5]
eyes.append(eye) return (np.hstack(eyes) * 255).astype(np.uint8)
else:
return None
现在,让我们编写我们的自动化程序,它将在我们每次按下鼠标按钮时运行。(假设我们已经在代码中将变量root
定义为我们想要存储图像的目录):
def on_click(x, y, button, pressed):
# If the action was a mouse PRESS (not a RELEASE)
if pressed:
# Crop the eyes
eyes = scan()
# If the function returned None, something went wrong
if not eyes is None:
# Save the image
filename = root + "{} {} {}.jpeg".format(x, y, button)
cv2.imwrite(filename, eyes)
现在,我们可以回忆起我们对 pynput 的Listener
的实现,并进行完整的代码实现:
当我们运行这个时,每次我们点击鼠标(如果我们的双眼都在视野中),它将自动裁剪网络摄像头并将图像保存到适当的目录中。图像的文件名将包含鼠标坐标信息,以及是右键还是左键单击。
这是一个示例图像。在此图像中,我在分辨率为 2560x1440 的显示器上的坐标(385,686)处执行左键单击:
一个例子(图片由作者提供)
级联分类器的准确率很高,我自己的数据目录到目前为止还没有看到任何错误。
现在,让我们编写用于训练神经网络的代码,以在给定眼睛图像的情况下预测鼠标位置。
让我们导入一些库
import numpy as np
import os
import cv2
import pyautoguifrom tensorflow.keras.models import *
from tensorflow.keras.layers import *
from tensorflow.keras.optimizers import *
现在,让我们添加级联分类器:
cascade = cv2.CascadeClassifier("haarcascade_eye.xml")
video_capture = cv2.VideoCapture(0)
让我们添加我们的助手函数。
标准化:
def normalize(x):
minn, maxx = x.min(), x.max()
return (x - minn) / (maxx - minn)
捕捉眼球:
def scan(image_size=(32, 32)):
_, frame = video_capture.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
boxes = cascade.detectMultiScale(gray, 1.3, 10) if len(boxes) == 2:
eyes = []
for box in boxes:
x, y, w, h = box
eye = frame[y:y + h, x:x + w]
eye = cv2.resize(eye, image_size)
eye = normalize(eye)
eye = eye[10:-10, 5:-5]
eyes.append(eye) return (np.hstack(eyes) * 255).astype(np.uint8)
else:
return None
让我们定义一下显示器的尺寸。您必须根据自己电脑屏幕的分辨率来更改这些参数:
# Note that there are actually 2560x1440 pixels on my screen
# I am simply recording one less, so that when we divide by these
# numbers, we will normalize between 0 and 1\. Note that mouse
# coordinates are reported starting at (0, 0), not (1, 1)
width, height = 2559, 1439
现在,让我们加载我们的数据(同样,假设您已经定义了root
)。我们并不关心是右键还是左键,因为我们的目标只是预测鼠标的位置:
filepaths = os.listdir(root)
X, Y = [], []for filepath in filepaths:
x, y, _ = filepath.split(' ')
x = float(x) / width
y = float(y) / height
X.append(cv2.imread(root + filepath))
Y.append([x, y])X = np.array(X) / 255.0
Y = np.array(Y)
print (X.shape, Y.shape)
让我们定义我们的模型架构:
model = Sequential()
model.add(Conv2D(32, 3, 2, activation = 'relu', input_shape = (12, 44, 3)))
model.add(Conv2D(64, 2, 2, activation = 'relu'))
model.add(Flatten())
model.add(Dense(32, activation = 'relu'))
model.add(Dense(2, activation = 'sigmoid'))
model.compile(optimizer = "adam", loss = "mean_squared_error")
model.summary()
以下是我们的总结:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 5, 21, 32) 896
_________________________________________________________________
conv2d_1 (Conv2D) (None, 2, 10, 64) 8256
_________________________________________________________________
flatten (Flatten) (None, 1280) 0
_________________________________________________________________
dense (Dense) (None, 32) 40992
_________________________________________________________________
dense_1 (Dense) (None, 2) 66
=================================================================
Total params: 50,210
Trainable params: 50,210
Non-trainable params: 0
_________________________________________________________________
让我们训练我们的模型。我们将在图像数据中添加一些噪声:
epochs = 200
for epoch in range(epochs):
model.fit(X, Y, batch_size = 32)
不,让我们用我们的模型用我们的眼睛移动鼠标。请注意,这需要大量数据才能正常工作。然而,作为一个概念的证明,你会注意到只有大约 200 张图片,它确实可以将鼠标移动到你正在查看的大致区域。当然,除非你有更多的数据,否则这是不可控的。
while True:
eyes = scan() if not eyes is None:
eyes = np.expand_dims(eyes / 255.0, axis = 0)
x, y = model.predict(eyes)[0]
pyautogui.moveTo(x * width, y * height)
这里有一个概念验证的例子。请注意,在拍摄这个屏幕记录之前,我用很少的数据进行了训练。这是我的鼠标根据眼睛自动移动到终端应用窗口的视频。就像我说的,这很不稳定,因为数据很少。随着更多的数据,它将有望足够稳定,以更高的特异性进行控制。只有几百张图片,你只能把它移动到你的视线范围内。此外,如果在整个数据收集过程中,没有拍摄到您注视屏幕特定区域(比如边缘)的图像,则该模型不太可能在该区域内进行预测。这是我们需要更多数据的众多原因之一。
根据凝视自动移动鼠标的视频
drive.google.com](https://drive.google.com/file/d/1TkU3rRS68U9vk4t7AB–NEQgyYH77Irm/view?usp=sharing)
如果您自己测试代码,记得在代码文件prediction.py
中将width
和height
的值更改为您显示器的分辨率。
您可以在此处查看本教程中的代码:
GitHub 是一个使用机器学习方法来控制具有眼睛姿态估计的计算机鼠标的项目
github.com](https://github.com/Ryan-Rudes/eye_mouse_movement)
利用图表和统计数据控制假新闻
公平的选举,安全的交易,公正的推荐?
你一定已经听说了来自中国的新威胁。不,我不是在说冠状病毒。
不,你没有?
上面这些东西叫做点击农场。他们已经是一个产业了。
一个点击农场可能包含货架上成千上万的 iPhones 和 Android 手机,以影响和操纵推荐系统,传播假新闻,影响公众舆论,有时甚至赢得选举——这是美国一些政客的当务之急。
假新闻无处不在。很多假用户也是如此。
在任何时候,数以百万计的交易都在我们日益互联的世界中发生。这些事务是有时间限制的,我们需要在动态造成任何损害之前尽早发现它们。
那么,我们能在这些欺诈交易发生时抓住它们吗?数据科学会拯救我们吗?
在这篇文章中,我将谈论MIDAS,一个基于微簇的边缘流异常检测器,旨在解决这个问题。
使用的数据:
为了解决这个问题,我们将使用在 MIDAS 论文中使用的 DARPA 入侵检测数据集。DARPA 在 87.7K 分钟内在 9.4K 源 IP 和 2.3K 目的 IP 之间进行 450 万次 IP →IP 通信。每个通信都是有向边(src_IP、dst_IP、时间戳、攻击)的形式,其中地面真实攻击标签指示通信是否是攻击(异常占总数的 60.1%)。数据如下图所示。
230.001.010.020,172.016.112.050,07/03/1998-18:17,neptune
230.001.010.020,172.016.112.050,07/03/1998-18:17,neptune
230.001.010.020,172.016.112.050,07/03/1998-18:17,neptune
230.001.010.020,172.016.112.050,07/03/1998-18:17,neptune
230.001.010.020,172.016.112.050,07/03/1998-18:17,neptune
但是在 MIDAS 中使用之前,我们必须将 src_node、dst_node 和 timestamp 改为整数。幸运的是,库的作者已经为我们做了这个预处理,我们可以从这里的一个预处理文件开始。你也可以在这里下载原始数据。处理后的文件如下所示:
2,3,1
2,3,1
3,4,2
3,4,2
5,9,2
5,9,2
算法思路:
a)计数最小草图(CMS):
所以首先,我们来谈谈 CMS,它是这个算法中使用的主要数据结构。来自维基百科:
在计算中, CMS 是一种概率数据结构,充当数据流中事件的频率表。它使用哈希函数将事件映射到频率,但与哈希表不同的是,它只使用亚线性空间,代价是由于冲突而导致的一些事件的过度计数。
简单来说,CMS 就是一个近似字典的 。一种数据结构,可以保存关键字的近似计数。
它被实现为具有 w 列和 d 行的网格,其中每一个 d 行具有不同的散列函数。每当我们遇到一个键,我们就根据行的散列函数将列中的所有行加 1。当我们需要检索键的值时,我们遍历所有行,并给出给定键的所有行中的最小值。
遍历所有的 j 行,得到键的最小值。h 是哈希函数,count 是这里的网格名。
这种数据结构的优点是,当网格的大小保持不变时,我们可以在恒定的时间内获得一个键的值。
b)流式假设检验方法(MIDAS):
上涨可能是危险的
先从简单的开始,说说两个顶点 u 和 v 之间的单条边。我们有这种边缘的过去趋势,我们可以看到在时间段 10 有相当大的上升。我们需要创建一个异常值来捕捉这种上升。在现实世界中,这种上升可能是 DDOS 攻击。或者,可能是从一个 IP 地址到另一个 IP 地址的抓取尝试。
那么,我们怎样才能抓住这样的上升趋势呢?
一种方法是假设时间序列遵循特定的生成模型,例如,高斯分布。然后,我们可以找到这个高斯分布的平均值和标准偏差,并使用它们来声明特定时间点的边缘是异常的。
但是那是一个相当严格的条件。 而分布可能是任何东西。因此,MIDAS 算法使用较弱的假设,即当前时间刻度(例如, t = 10)中的平均水平(即,边缘出现的平均速率)与当前时间刻度( t < 10)之前的平均水平相同。
因此,我们建立了一个假设检验,它避免了为每个时间点假设任何特定的分布。我们可以将过去的优势分为两类:
- 当前时间刻度( t = 10),
- 所有过去的时间刻度(tt 35】10)。
现在,设 sᵤᵥ 为从 u 到 v 到当前时间为止的总边数( t ≤10)。而 aᵤᵥ 是当前时刻从 u 到 v 的边数( t =10)。
我们可以使用两个 CMS 数据结构来保存所有边的这些计数。一个保存过去的命中,另一个保存两个节点之间的当前命中。
所以在( t = 10)的点击次数是 aᵤᵥ ,而在过去时间刻度( t < 10)的点击次数是sᵤᵥaᵤᵥ
现在,我们可以进行卡方拟合优度检验,该检验用于确定样本数据( t = 10)是否符合假设分布( t < 10)。我们的卡方统计是:
该统计/异常分数越高,出现异常边缘的可能性就越大。
MIDAS 算法看起来很简单:
c) MIDAS-R
上述思想在 MIDAS-R 算法中得到了扩展,增加了:
- 有些时间弹性——为什么考虑某个特定的时间滴答而不是最近的过去?最近过去的边也应计入当前时间刻度,但通过减少权重进行修改。使用我们的 CMS 数据结构实现这一点的一个简单而有效的方法如下:在每个时间点结束时,我们不是重置我们的 CMS 数据结构 aᵤᵥ ,而是将它的所有计数减少一个固定的分数 α ∈ (0,1)。这允许过去的边以减少的权重计入当前时间刻度。
- 我们使用的一个简单的直觉是,在这两种情况下,我们期望观察到突然出现大量边的节点。因此,我们可以像以前一样使用两个附加的 CMS 数据结构来跟踪边计数,除了计数与任何节点 u 相邻的所有边。具体来说,我们创建 CMS 计数器 aᵤ 和 sᵤ 来近似节点 u 附近的当前和总边数。给定每个传入的边缘( u,v ),我们然后可以计算三个异常性分数:一个是边缘( u,v ),如在我们之前的算法中一样;一个用于节点 u ,一个用于节点 v 。最后,我们通过取它们的最大值来组合这三个分数。
这导致更高性能的 MIDAS-R 算法。
编码/入门
我们从获取完整的代码开始:
git clone [https://github.com/bhatiasiddharth/MIDAS.git](https://github.com/bhatiasiddharth/MIDAS.git)
然后,我们可以:
- 运行
make
来编译代码并创建二进制文件。 - 运行
./midas -i darpa_midas.csv
。你也可以使用你的数据。
run 命令的输出如下:
当我们查看 scores.txt 文件时,我们看到:
然后,我们可以使用带有地面实况标签的原始 DARPA 文件来检查 AUC 分数。
from sklearn import metrics
from sklearn.metrics import precision_recall_curve
import pandas as pddata = pd.read_csv("darpa_original.csv", names=['src', 'dst', 'time', 'label'])
is_anom = data.label != '-'scores = pd.read_csv("scores.txt", header=None, squeeze=True)
fpr, tpr, _ = metrics.roc_curve(is_anom, scores)
auc = metrics.roc_auc_score(is_anom, scores)
precision, recall, _ = metrics.precision_recall_curve(is_anom, scores)
print("AUC: ", auc)
----------------------------------------------------------------
AUC: 0.9515446059172757
这是公关曲线:
import matplotlib.pyplot as pltplt.step(recall, precision, color='b', alpha=0.2,
where='post')
plt.fill_between(recall, precision, step='post', alpha=0.2,
color='b')plt.xlabel('Recall')
plt.ylabel('Precision')
plt.ylim([0.0, 1.05])
plt.xlim([0.0, 1.0])
plt.title('Precision-Recall curve')
与 SEDANSPOT 提供的基线(=0.64)相比,MIDAS-R 实现了更高的 AUC(= 0.95)(sedan spot 使用个性化的 PageRank 来检测次线性空间中的异常和每个边缘的恒定时间),同时运行速度也显著更快(0.39 秒对 84 秒)。
这是一个 48%的 AUC 改进,速度提高了 215 倍。
结论
MIDAS 提供了一个简单的框架来发现任何数据中的异常,这些异常可以用一个随时间变化的/动态的图表来表示。
它可以用于社交网络和交易网站中的各种用例,以检测微聚类和欺诈。
所以打倒新冠肺炎,打倒假新闻。
随着如此多的社交数据的出现,网络分析可以在改善我们的模型和产生价值方面提供很大帮助。如果您想了解更多关于图形算法的信息,请访问:
因为图表分析是未来
towardsdatascience.com](/data-scientists-the-five-graph-algorithms-that-you-should-know-30f454fa5513)
还有,这里有一个UCSanDiego在 Coursera 上的大数据图形分析课程,我强烈推荐学习图论的基础知识。
感谢西达尔特·巴蒂亚(《迈达斯》的原作者)
参考
西达尔特·巴蒂亚,布莱恩·胡伊,姬敏·尹,吉荣·申和克里斯特斯·法鲁索斯。" MIDAS:基于微团簇的边缘流异常检测器."2020 年 AAAI 人工智能大会(AAAI)。https://arxiv.org/abs/1911.04464
控制语言模型的文本生成
控制机器生成文本的样式和内容的实际操作方法
乔恩·弗洛布兰特在 Unsplash 上的照片
介绍
现在看到机器能够生成任何种类的流畅文本已经很酷了。但是,如果我们可以告诉机器生成什么风格或形式,而不需要为每种风格训练单独的模型,会怎么样呢?这将耗费大量的计算能力和时间。
如果我告诉你我们真的可以做到呢?介绍 PPLM ,代表即插即用语言模型。多亏了 优步人工智能 ,PPLM 是一种将预训练的语言模型与一个或多个属性模型相结合的方法,这些模型将能够指导文本生成。PPLM 最好的一点是,它不需要语言模型训练或微调,并且对可以使用的属性模型没有限制。
它是如何工作的
来源:优步艾博文
在官方的博客文章中,作者将 GPT-2 这样的大型语言模型描绘成一只猛犸,而将属性模型描绘成一只老鼠。GPT-2 训练的计算成本更高,就像猛犸因其体积而难以移动一样。解决方案是使用一个较小的模型(像一只老鼠),可以控制 GPT-2 的方向。
PPLM 使用了两种属性模型:词袋(BoW)和鉴别器。在词袋中,给出一个包含特定主题的所有相关词的文件来训练模型。该模型像分类器一样附加在基本语言模型(GPT-2)之上。通过这样做,GPT-2 将比以前更频繁地产生这些词。作者包括以下 BoW 作为例子开始:法律,军事,怪物,政治,积极的话,宗教,科学,空间,技术。
下图显示了在给定相同输入标记“关注的问题”的情况下,基于不同单词包的不同输出。
来源:优步艾博文
对于 Discriminator,主题属性可以由包含与该属性相关的不同类的样本的数据集来表示。然后,PPLM 可以根据作为输入提供的类生成相应的文本。作者包括了以下鉴别器例子:积极情绪,消极情绪,点击诱饵,非点击诱饵。
下图再次显示了基于正和负鉴别器类的相同输入令牌的不同输出。
来源:优步 AI 博文
现在我们已经了解了 PPLM 是如何工作的,让我们继续实现。由于时间关系,本文将主要关注 PPLM-鲍的实现。
履行
第 1 部分:微调 GPT2(正如我在上一篇文章中提到的)
在我之前的帖子中,我描述了如何微调 GPT2 以在您的自定义数据集中生成任何文本。这篇博客文章将使用那篇文章中的微调模型,该模型是根据书籍摘要训练的。如果你没有读过那篇文章,你可以先去看看那篇文章,或者用预先训练好的 GPT2 模型。拥有一个微调的模型将允许生成一个更具体的领域(例如,书籍摘要),而不仅仅是一般的文本。
使用 Pytorch 和 Huggingface 微调用于文本生成的 GPT2。我们在 CMU 图书摘要数据集上进行训练,以生成…
towardsdatascience.com](/fine-tuning-gpt2-for-text-generation-using-pytorch-2ee61a4f1ba7)
第 2 部分:下载回购
我们将使用优步研究所的官方回购,您可以通过以下方式下载他们的回购:
git clone https://github.com/uber-research/PPLM
cd PPLM/
第三部分:构建 PPLM 弓
造一个*。txt* 文件,包含与您希望生成的特定主题相关的单词。例如,如果我们想要生成浪漫书籍摘要,我们可以构建一个包含浪漫相关单词列表的浪漫 BoW:
第 4 部分:在微调的 GPT2 上运行 PPLM
现在,我们已经构造了 BoW 文本文件,我们可以用它来运行 PPLM:
CUDA_VISIBLE_DEVICES=$N python run_pplm.py -B /path/to/BoW/romance.txt --pretrained_model=/path/to/model/ --cond_text="The novel" —- num_samples=20 --length=150 --stepsize=0.03 --num_iterations=3 --window_length=5 --gamma=1.5 --gm_scale=0.95 --kl_scale=0.01 --colorama --verbosity='regular' --sample
上面的命令将使用/path/to/BoW/romance.txt
作为预训练模型/path/to/model/
上的弓分类器来运行 PPLM。我们将条件文本(输入文本)设置为“小说”,看看它之后会生成什么。我们生成 20 个长度为 150 的样本。请注意,--stepsize
可以用来控制主题的强度,因此增加它将导致生成的文本更频繁地包含在 BoW 中。--colorama
将用红色对生成文本中的蝴蝶结进行颜色编码,--sample
将确保模型用相同的种子生成不同的样本。您也可以使用预训练的 GPT-2,默认情况下没有指定任何模型将是“GPT 2-中等”。
如果您希望能够保存生成的输出,我已经添加了一个额外的命令行参数--save_path
,它将允许您保存(这里有代码)。您只需运行下面的命令,输出将保存到该文件夹中:
CUDA_VISIBLE_DEVICES=$N python run_pplm.py -B /path/to/BoW/romance.txt --pretrained_model=/path/to/model/ --cond_text="The novel" —- num_samples=20 --length=150 --stepsize=0.03 --num_iterations=3 --window_length=5 --gamma=1.5 --gm_scale=0.95 --kl_scale=0.01 --colorama --verbosity='regular' --sample --save_path="/path/to/save/romance.txt"
第五部分:瞧!您现在可以看到生成的样本
以下是使用 romance BoW 生成的一些示例,输入条件为文本“The novel…”:
这部小说以两个年轻人的故事开始,他们是英国一位富有实业家的女儿,和他的妻子,一位富婆美丽女儿的女儿,嫁给了同一个男人。他们结婚是为了永远在一起,他们没有孩子。他们的女儿原来是一个美丽的女人,她的丈夫在爱了她多年后,决定给她一生的爱来结婚…
这部小说讲述了年轻夫妇丽莎和大卫第二次结婚的故事。他们过着幸福的生活,但当大卫的父亲去世时,他们的婚姻注定要失败。这对夫妇与他们的鳏夫父亲和女婿住在一起,但他们有婚外情。
这部小说是一系列闪回故事,讲述了一个名叫苔莎的年轻孤儿的生活,她的母亲死于一场火灾,她住在自己工作的房子里。房子的主人是一个同名的女人。当苔莎去和她母亲住在附近的房子里几年时,她惊讶地看到一个英俊、迷人的年轻人。她爱上了他,但他不再爱她,她怀了她第一任丈夫的孩子…
更多例子可以在我的 Github repo 上查看。
结论
本文通过使用强大的语言模型 GPT-2 实现 PPLM,深入探讨了如何控制文本生成。PPLM 的强大之处在于它允许不同的属性模型组合来产生不同样式的文本。就是这样!希望你们能从这篇文章中学到一些东西,并期待在下一篇文章中见到你们!
如果感兴趣,这里有更多我写的文章😊
文本分类是自然语言处理中的一项常见任务。我们应用 BERT,一个流行的变压器模型,对假新闻检测使用…
towardsdatascience.com](/bert-text-classification-using-pytorch-723dfb8b6b5b) [## 基于 Pytorch 的 LSTM 文本分类
一步一步的指导你如何在 Pytorch 中建立一个双向 LSTM!
towardsdatascience.com](/lstm-text-classification-using-pytorch-2c6c657f8fc0)
参考资料:
[1] S. Dathathri,A. Madotto,J. Lan 等。,即插即用语言模型:控制文本生成的简单方法 (2020),2020 年学习表征国际会议
[2] R .刘、s .达塔瑟里、a .马多托等。、用即插即用语言模型控制文本生成、AI 博客
[3] S. Dathathri,A. Madotto,J. Lan 等。, PPLM 代码,Github
[4] 用变形金刚,拥抱脸和优步 AI 写
Conv2d:终于明白了向前传球会发生什么
2D 卷积层及其参数的直观和数学解释
介绍
深度学习的库和平台如 Tensorflow 、 Keras 、 Pytorch 、 Caffe 或 Theano 在日常生活中帮助我们,以至于每天都有新的应用让我们觉得“哇!”。我们都有自己最喜欢的框架,但它们的共同点是,它们通过易于使用、可按需配置的功能来简化我们的工作。但是我们仍然需要理解可用的参数是什么来利用这些框架给我们的所有能力。
在这篇文章中,我将尝试列出所有这些论点。如果您想了解它们对计算时间、可训练参数的数量以及卷积输出通道的大小的影响,那么这篇文章就是为您准备的。
输入形状:(3,7,7) —输出形状:(2,3,3) — K : (3,3) — P : (1,1) — S : (2,2) — D : (2,2) — G : 1
所有的 gif 都是用 python 做的。你将能够测试这些论点中的每一个,并且自己想象它们对我的 Github 上的脚本的影响(或者制作你的 gif)。
这篇文章的各个部分将根据以下论点进行划分。这些参数可以在 Conv2d 模块的 Pytorch 文档中找到:
- in _ channels(int)—输入图像的通道数
- out _ channels(int)—卷积产生的通道数
- kernel _ Size(int或tuple)—卷积核的大小
- 步距 ( int 或 元组 ,可选 ) —卷积的步距。默认值:1
- 填充(int或 元组 ,可选 ) —输入两边加零。默认值:0
- 膨胀(int或 元组 ,可选 ) —内核元素之间的间距。默认值:1
- 组(int,可选 ) —输入通道到输出通道的阻塞连接数。默认值:1
- 偏置 ( 布尔 ,可选 ) —如果
True
,向输出添加一个可学习的偏置。默认:True
最后,我们将让的所有键根据参数和输入通道的大小计算输出通道的大小。
什么是内核?
输入图像和内核之间的卷积
我来介绍一下什么是内核(或者说卷积矩阵)。内核描述了一个过滤器,我们将通过它来处理输入图像。简单来说,内核将通过应用卷积乘积在整个图像上从左到右、从上到下移动。该操作的输出被称为过滤图像。
卷积乘积
输入形状:(1,9,9) —输出形状:(1,7,7) — K : (3,3) — P : (0,0) — S : (1,1) — D : (1,1) — G : 1
举一个非常基本的例子,让我们想象一个 3 乘 3 卷积核过滤一个 9 乘 9 图像。然后,这个内核在整个图像上移动,以在图像中捕获所有大小相同的正方形。卷积乘积是一个元素级(或点级)乘法。这个结果的总和就是输出(或过滤)图像上的结果像素。
如果你还不熟悉滤波器和卷积矩阵,那么我强烈建议你多花一点时间来理解卷积核。它们是 2D 卷积层的核心。
可训练参数和偏差
可训练参数,也简称为“参数”,都是网络训练时会更新的参数。在 Conv2d 中,可训练元素是由组成内核的值。因此,对于我们的 3 乘 3 卷积核,我们有 3*3=9 个可训练参数。
有偏卷积积
为了更完整。我们可以包括偏差或不包括。偏差的作用是加到卷积乘积的和上。这个偏差也是一个可训练的 参数,这使得我们的 3 乘 3 内核的可训练参数的数量增加到 10 个。
输入和输出通道的数量
输入形状:(1,7,7) —输出形状:(4,5,5) — K : (3,3) — P : (0,0) — S : (1,1) — D : (1,1) — G : 1
使用层的好处是能够同时执行类似的操作。换句话说,如果我们想要对一个输入通道应用 4 个相同大小的不同滤波器,那么我们将有 4 个输出通道。这些通道是 4 个不同过滤器的结果。因此产生了 4 个不同的内核。
在上一节中,我们看到可训练参数构成了卷积核。因此参数的数量随着卷积核的数量线性增加。因此与所需输出声道的数量成线性关系。还要注意的是,计算时间也随着输入通道的大小和内核的数量成比例地变化**。**
请注意,参数图中的曲线是相同的
同样的原理适用于输入通道的数量。让我们考虑 RGB 编码图像的情况。这个图像有三个通道:红色,蓝色和绿色。我们可以决定在这 3 个通道的每一个上用相同大小的滤波器提取信息,以获得 4 个新通道。因此,对于 4 个输出通道,操作是相同的 3 倍。
输入形状:(3,7,7) —输出形状:(4,5,5) — K : (3,3) — P : (0,0) — S : (1,1) — D : (1,1) — G : 1
**每个输出通道是经过滤波的输入通道的总和。**对于 4 个输出通道和 3 个输入通道,每个输出通道是 3 个滤波后的输入通道之和。换句话说,卷积层由 4*3=12 个卷积核组成。
提醒一下,参数数量和计算时间与输出通道数量成比例变化。这是因为每个输出通道都链接到不同于其他通道的内核。对于输入通道的数量也是如此。计算时间和参数数量成比例增长。
内核大小
到目前为止,所有的例子都给出了 3 乘 3 大小的内核。其实它的大小的选择完全由你决定。可以创建核心大小为 11 或 1919 的卷积层。
输入形状:(3,7,9) —输出形状:(2,3,9) — K : (5,2) — P : (0,0) — S : (1,1) — D : (1,1) — G : 1
但是也绝对有可能没有方形核。有可能决定让内核具有不同的高度和宽度。在信号图像分析中经常会出现这种情况。例如,如果我们知道我们想要扫描信号或声音的图像,那么我们可能想要 5*1 大小的内核。
最后,你会注意到所有尺寸都由奇数和奇数定义。定义一个甚至的内核大小也是可以接受的。实际上,很少这样做。通常,选择奇数大小的内核是因为在中心像素周围有对称性。
由于卷积层的所有(经典)可训练参数都在内核中,参数的数量随着内核的大小线性增长。计算时间也成比例地变化。
大步
默认情况下,内核从左向右移动,从上到下逐像素移动。但是这种转变也是可以改变的。常用于下采样输出通道。例如,对于(1,3)的步长,滤波器从水平方向的 3 到 3 和从垂直方向的 1 到 1 进行移位。这会产生水平向下采样 3 倍的输出通道。
输入形状:(3,9,9) —输出形状:(2,7,3) — K : (3,3) — P : (0,0) — S : (1,3) — D : (1,1) — G : 1
步长对参数的数量没有影响,但是逻辑上,计算时间随着步长线性减少。
请注意,参数图中的曲线是相同的
填料
填充定义了在卷积滤波之前添加到输入通道的侧边的像素的数量。通常,填充像素被设置为零。输入通道延长**。**
输入形状:(2,7,7) —输出形状:(1,7,7) — K : (3,3) — P : (1,1) — S : (1,1) — D : (1,1) — G : 1
当您希望输出通道的大小与输入通道的大小相等时,这非常有用。简单来说,当内核为 3*3 时,输出通道的大小每侧减少一个。为了克服这个问题,我们可以使用填充 1。
因此,填充对参数数量没有影响,但会产生与填充大小成比例的额外计算时间。但一般来说,与输入声道的大小相比,填充通常足够小,以至于不会影响计算时间。
请注意,参数图中的曲线是相同的
扩张
在某种程度上,膨胀就是地核的宽度。默认等于 1,对应于 卷积期间输入通道上内核的每个像素之间的偏移。
输入形状:(2,7,7) —输出形状:(1,1,5) — K : (3,3) — P : (1,1) — S : (1,1) — D : (4,2) — G : 1
我在我的 GIF 上夸大了一点,但如果我们以(4,2)的膨胀为例,那么输入通道上的内核的*感受域在垂直方向上加宽了 4 * ( 3 -1)=8,在水平方向上加宽了 2 (3–1)= 4(对于 3 乘 3 的内核)。
就像填充一样,膨胀对参数的数量没有影响,对计算时间的影响也非常有限。
请注意,参数图中的曲线是相同的
组
在特定的情况下,组非常有用。例如,如果我们有几个串联的数据源。当没有必要对待他们相互依赖的时候。输入通道可以分组并独立处理。最后,输出通道在最后被连接。
如果有 2 组 2 个输入通道和 4 个输出通道。这就像将输入通道分成两组(每组一个输入通道),并使其通过一个输出通道数量减半的卷积层。然后输出声道被连接起来。
输入形状:(2,7,7) —输出形状:(4,5,5) — K : (3,3) — P : (2,2) — S : (2,2) — D : (1,1) — G : 2
需要注意的是,组的数量必须完全除以输入通道的数量和输出通道的数量(公约数)。
因此,参数的数量除以组的数量。关于 Pytorch 的计算时间,该算法针对组进行了优化,因此应该会减少计算时间。但是,还应该考虑到,必须将输出通道的组形成和连接的计算时间与相加。
输出通道尺寸
有了所有参数的知识,就可以从输入通道的大小计算出输出通道的大小。
知识就是分享。
支持我,获得访问 中我所有文章的一键点击此处 。
来源
深度学习教程,Y. LeCun
文档 torch.nn ,Pytorch
卷积神经网络,cs231n
卷积层,Keras
所有的图像都是自制的
所有计算时间测试都是在我的 GPU (GeForce GTX 960M)上用 Pytorch 执行的,如果你想自己运行它们或执行替代测试,可以从 GitHub 库 获得 。
随机变量的收敛性
用简单的术语解释不同的聚合模式
陈逸飞在 Unsplash 上的照片
随机变量的收敛;
一个随机变量序列(RVs)在重复多次后会遵循一个固定的行为
RVs (Xn)序列最初保持变化的值,并最终稳定在更接近 X 的数字。
但是,“收敛到一个接近 X 的数”是什么意思呢?
通常,RVs 可能不会精确地固定在一个最终的数字上,但是对于一个非常大的 n,方差会变得越来越小,导致序列收敛到一个非常接近 x 的数字。
所以,让我们学习一个符号来解释上述现象:
随着 n 变大,级数 Xn 收敛到最终值 X
作为数据科学家,我们经常会讨论一个算法是否收敛?现在,让我们通过下面的示例来观察上述收敛特性:
算法的收敛图
既然我们已经彻底了解了收敛的概念,那么让我们来理解在上面的上下文中“接近”应该有多“接近”吧?
按照数学家的说法,“接近”意味着要么提供两个 Xn 和 X 之间距离的上界,要么取一个极限。
下面,我们将根据取值限制列出三种主要的收敛类型**😗*
1)几乎必然收敛
2)概率收敛
3)分布的趋同性
但是,为什么我们会有不同类型的收敛,当它所做的只是确定一个数字的时候?这是因为,没有一种方法可以定义 RVs 的收敛性。
我将在下面的结构中解释每种收敛模式:
- **直觉和概念类比:**这将有助于初学者理解概念。如果是第一次接触,理解这些章节应该就足够了
- **定义和数学示例:**概念的正式解释,了解关键概念和三种模式之间的细微差别
不同收敛模式之间的关系:
如果一个级数收敛于“几乎必然”强收敛,那么这个级数也以概率和分布收敛。但是,反过来就不正确了
分布收敛:
**直觉:**这意味着随着 n 变得越来越大,我们在建模分布以及下一个输出时变得越来越好。
**定义:**一系列实数 RVs 依分布收敛如果当 n 增长到∞时 Xn 的 cdf 收敛到 X 的 cdf
其中 F 代表 cdf,对于所有 x € R 应该是连续的
由于它只依赖于随机变量序列和极限随机变量的 cdf,因此不要求两者之间有任何依赖关系。所以,分布的收敛不像概率的收敛和几乎必然的收敛那样,告诉我们任何关于联合分布或概率空间的东西。
批注:
**举例:**中心极限定理(CLT)
𝜇和𝜎是总体的平均值和标准差
问题:设 Xn 是 x₂,…suchx₁的随机变量序列,其 cdf 定义为:
给定 X~ exp(1 ),让我们看看它是否收敛于分布
**解法:**让我们首先计算 Xn 的 cdf 的极限:
当 Xn 的 cdf 等于 X 的 cdf 时,证明级数依分布收敛。
**概念类比:**在学习新技能的初始上升曲线期间,与技能被掌握时相比,输出是不同的。在一段时间内,可以肯定地说,产量或多或少是恒定的,并且在分布上趋于一致
概率收敛:
**直觉:**Xn 与 X 相差大于ε(固定距离)的概率为 0。换句话说,随着系列的进展,不寻常结果的概率不断缩小。
**定义:**称一个级数 Xn 按概率收敛于 X 当且仅当:
与分布收敛不同,概率收敛取决于联合 CDF,即 Xn 和 X 是相关的
符号:
例子:弱大数定律
因为“弱”和“强”大数定律是大数定律(LLN)的不同版本,并且主要基于收敛模式来区分,我们将在后面讨论它们。
问题:设 Xn 是随机变量序列 X₁,X₂,…such,xn~unif(2–1∕2n,2+1∕2n)
对于给定的定数 0 < ε<1, check if it converges in probability and what is the limiting value?
**解:**对于 Xn 以概率收敛到一个数 2,我们需要找出 P(|Xn — 2| > ε)对于某个ε是否趋向于 0
让我们看看分布是什么样的,RV 偏离收敛常数超过一定距离的概率变为 0 的区域是什么。
**概念类比:**根据每个班级随机抽取 10 名学生的表现得出的学校排名,不会反映学校的真实排名。但是,当每个班级越来越多的学生的表现被计入学校排名时,它就接近了学校的真实排名。
几乎确定收敛:
**直觉:**对于非常高的 n 值,Xn 收敛到 X 的概率几乎是确定的即 prob 为 1。
定义: 无穷序列 RVs X1(ω),X2(ω)… Xn(w)有一个概率为 1 的极限,就是 X(ω)
ω:定义随机变量的基础概率空间的样本空间
注意极限在概率收敛中是在概率之外,而极限在几乎必然收敛中是在概率之内。
符号:
举例:强收敛定律
**问题:**设 Xn 是一个随机变量序列,X₁、X₂,…such 认为
Xn = t + tⁿ,其中 T ~ Unif(0,1)
**解法:**我们把样本空间分成两个区域,应用下图所示的全概率定律:
当概率评估为 1 时,级数 Xn 几乎必然收敛
**概念类比:**如果一个人基于抛硬币的结果,从他的语料库中向慈善机构捐赠了一定的金额,那么 X1,X2 暗示了第一天,第二天捐赠的金额。随着时间的推移,本金将不断减少,因此慈善捐赠的金额几乎肯定会减少到 0,即概率为 1。
依概率收敛和几乎必然收敛的区别:
- “弱”大数定律是依概率收敛的结果,被称为弱收敛,因为它可以从较弱的假设中得到证明。它指出,随着 n 的增加,样本均值将更接近总体均值𝜇,但留下了 ε误差可能出现无限次的范围。
- 然而,几乎确定收敛是一个更具约束性的收敛,它认为两个平均值之间的差小于ε的情况会无限频繁地出现,即概率为 1。也就是说, 违反几乎必然收敛中所述的不等式仅在有限数量的情况下发生
- Eric Towers 在这里做了一个很好的区分。
希望这篇文章能让你很好地理解不同的融合模式
感谢阅读!!!
参考资料:
- https://www . probability course . com/chapter 7/7 _ 2 _ 4 _ convergence _ in _ distribution . PHP
- https://en . Wikipedia . org/维基/Convergence _ of _ random _ variables
强化学习算法的收敛性
学习一项任务的速度有什么简单的界限吗?Q-learning 背景下的研究。
D eep 强化学习算法可能是最近机器学习发展中最难对其性能设定数值界限的算法(在那些起作用的算法中)。理由是双重的:
- 深层神经网络是模糊的黑匣子,没有人真正理解它们如何或为什么如此好地融合。
- 强化学习任务收敛是 历史上不稳定因为从环境中观察到的稀疏奖励(以及底层任务的难度— 从零开始学习! )。
在这里,我将向您介绍一种启发式算法,我们可以用它来描述 RL 算法如何收敛,并解释如何将其推广到更多的场景。
来源——作者,哥斯达黎加。
一些相关的文章,可以在这之前看,或者在这之后看:
- 什么是马尔可夫决策过程?
- 强化学习的隐藏线性代数。
- 强化学习的基础迭代方法。
这篇文章解决了 的问题:像值迭代、q 学习和高级方法这样的迭代方法在训练时是如何收敛的? 在这里,我们将简要回顾马尔可夫决策过程(更多细节请参见上面的链接 1 和 3),解释我们如何将贝尔曼更新视为一个特征向量方程(更多信息请参见链接 2),并展示的数学运算,即值如何收敛到最优量。
回顾马尔可夫决策过程
马尔可夫决策过程是支持强化学习的随机模型。如果你很熟悉,你可以跳过这一部分。
MDP 就是一个例子。来源——我在 CS188 做的一个讲座。
定义
- 一组状态 s ∈ S ,动作 a ∈ A 。
- 一个转移函数 T(s,a,s’)。
- 一个奖励函数 **R(s,a,s’)。**这个函数 r 的任何样本都在区间[-Rmax,+Rmax]内。
- 区间[0,1]中的折扣因子 γ (gamma) 。
- 开始状态 s0 ,也可能是结束状态。
重要的价值观
MDP 有两个重要的特征效用-状态值和机会节点的 q 值。任何 MDP 或 RL 值中的 ***** 表示一个 最优量 。效用是 1)一个状态的 v 值和 2)一个状态、动作对的 Q 值T21。****
最佳值与最佳动作条件 q 值相关。然后值和 q 值更新规则非常相似(加权转换、奖励和折扣)。顶部)值与 q 值的耦合;mid) Q 值递归,bot)值迭代。我在加州大学伯克利分校 cs 188 的讲座。
我们试图做的是估计这些价值、q 值和效用,以便我们的代理人能够计划最大化回报的行动。
真实估计=最优策略。
来源,作者。美国印第安纳州詹姆斯敦。
概括迭代更新
在新内容的第一部分中,我将回忆我正在使用的 RL 概念,并强调获得一个方程组所需的数学变换,该方程组的以离散的步骤发展,并且具有收敛界限。
强化学习
RL 是我们试图“解决”和 MDP 的范例,但我们不知道底层环境。简单的 RL 解决方案是基本 MDP 求解算法(价值和策略迭代)的基于采样的变体。回想一下 Q 值迭代,这是我将重点关注的贝尔曼更新:
MDP 的 q 值迭代。
看看精确值迭代或策略迭代如何提炼为在上述等式中的每次赋值(←)后比较一个值向量,这是一轮递归更新。这些方法的收敛产生了与强化学习算法如何收敛成比例的度量,因为强化学习算法是价值和策略迭代的基于采样的版本,具有一些更多的移动部分。
回忆:Q-learning 是与 Q-value 迭代相同的更新规则,但是将转移函数替换为采样的动作,将奖励函数替换为实际样本, r ,从环境中接收。
线性算子和特征向量
我们需要将我们的 Bellman 更新公式化为一个线性操作符, B ,(矩阵是线性操作符的子集),看看我们是否可以让它表现为一个 随机矩阵 。随机矩阵保证有一个特征向量与特征值 1 配对。
λ x =Ax,其中 lambda=1.
也就是说,我们可以像研究特征空间的演化一样研究 RL 中的迭代更新。
现在,我们需要做一些符号上的改变,从矩阵中关于 Q 值的公式过渡到向量中作用于效用的公式(效用概括为值和 Q 值,因为它被定义为奖励的贴现和)。
- 我们知道效用与 q 值成正比;改变符号。我们将使用*。*
- 将实用程序重新排列为一个向量类似于许多编码库的
flatten()
功能(例如,将 XY 状态空间转换为跨越状态的 1d 向量索引)。我们得到。**
将 q 状态转换为特征值的通用效用向量。
这些变化对于将问题公式化为特征向量是至关重要的。
了解 Q-learning 的各个部分
从下面 Q 值迭代的基本方程开始,我们如何将它推广到线性系统?
MDP 的 q 值迭代。
在这种情况下,我们需要更改右侧,使其如下所示:
将我们的系统移向线性算子(矩阵)
这给我们留下了最后一种形式(合并本节的方程,以及本征值部分的结尾)。我们可以用这个作为我们需要的线性算子吗?考虑一下,如果我们使用的是最优策略(不失一般性),那么棘手的最大 over actions 就会消失,留给我们的是:
这是我们能得到的最接近的,使它成为一个纯特征向量方程。它非常接近所谓的广义特征向量。
来源——作者,香港维多利亚的山顶。
研究趋同
在本节中,我将推导出一个关系式,该关系式保证 N 步后ε的最小误差,并展示其含义。****
我们可以研究的系统
我们在上面看到,我们可以用一种非常接近特征向量的方式来制定效用更新规则,但是我们偏离了一个常数向量 r 来表示 MDP 的基本回报面。如果我们取两个效用向量的差会发生什么?常数项消失了。
取两个效用向量之间的差,我们看到, r 向量可以抵消。
我们现在有我们的系统,我们可以像特征向量的动态系统一样研究,但我们在效用之间的差异空间中工作,用矩阵B***—加权转移概率的总和。因为效用向量是相互定义的,所以我们可以神奇地重新排列这个(代入递归的贝尔曼方程,取范数)。*
贝尔曼更新后的误差减少了折扣因子。
研究任何效用估计之间的差异是巧妙的,因为它显示了 a)估计如何不同于真实值,或者 b)仅来自递归更新的数据如何演变(而不是小向量 r )。
ε-N 关系
任何收敛证明都将寻找误差界限**,ε,和步数, N ,(迭代)之间的关系。这种关系将使我们有机会用一个分析方程来限制性能。**
我们希望在步骤 N-b(N)-处效用误差的界限小于ε。该界限将是一个解析表达式,ε是一个标量,表示估计的和真实的效用向量之间的差的范数。
换句话说,我们在寻找ε的一个界限,这是 n 的函数
首先,我们知道(根据 MDP 的定义)每一步的回报,【r】,有界在区间[-Rmax,+Rmax]内。那么,把效用(报酬的贴现和)的定义看做一个几何级数,我们就可以把任意向量的差绑定到真实向量上。 ( 等比数列收敛的证明 )。
****
左)效用的定义:贴现报酬的期望总和。右)我们收敛的起点。从一个几何级数的收敛来考虑真实效用 U 和初始效用 U(0)之间的差异。
界限来自最坏情况的估计——其中每一步的真实回报是+Rmax,但我们将估计值初始化为-Rmax。唉,我们对我们的实用程序的误差有一个初始界限!回忆一下 U0 是我们初始化效用向量的值,然后每当我们运行贝尔曼更新时,索引就会增加。
贝尔曼更新— 初始化时的界限如何随着每一步而演变?上面,我们看到在每一步误差都减少了折扣因子(从递归更新中的总和总是预先加上一个伽玛)。随着每次迭代,这将演变成一系列递减的误差。
当前效用更新(U_i)与真实值 U 之差的收敛。
剩下的就是宣告界限,ε,相对于步数, N 。
结果——可视化融合
在上面等式的右边,我们有一个效用估计的精确度界限。
从逻辑上讲,对于任何ε,我们知道误差将在 N 步中小于ε。
我们还可以用数学技巧在ε和 N 之间来回变换——因此,如果我们知道我们希望估计值有多精确,我们就可以解决让我们的算法运行多长时间的问题!
通过取两边的对数,我们可以解出达到所述界限的迭代次数!
*我们发现的界限是状态空间上累积值误差的界限(下面的实线)。精明的读者会想知道的是,政策错误与此相比如何?从概念上来说,这意味着,*‘在多少个州,当前政策会与最优政策不同?’事实证明,随着数值的标准化(因此它们在数值上相似),政策误差收敛得更快,并且更快地达到零(没有渐近线!).
政策迷失空间中价值迭代与政策迭代的收敛性。策略的离散性使得策略迭代收敛更快在许多情况下** 。 来源。**
这代表了在某些情况下使用策略迭代优于值迭代的优势。它会带来更多的算法吗?
影响-限制最近的深度增强算法
绑定深度 RL 算法是每个人都想要的。近年来我们已经看到了令人印象深刻的成果,机器人可以跑、叠毛巾、玩游戏。如果我们在性能上有限制,那就太好了。
我们所能做的,必然是我们对世界的表述将如何趋同。我们已经证明效用函数将会收敛**。有两个持久的挑战:**
- 我们没有被赋予 奖励功能 对于现实生活中的任务,我们必须设计它。
- 运行这些迭代算法目前是不安全的。机器人探索涉及大量的力量、相互作用和(实际上)损害。
我们可以研究算法的收敛性,但是限制深度强化学习应用于现实世界任务的大多数工程问题是奖励工程和安全学习。
这就是我留给你们的——一个帮助我们设计更好系统的行动号召,这样我们就可以展示更多管理它的基础数学。
以下是我对人们在深度 RL 研究中使用的方法的总结。
获得 RL 算法要点的资源,无需浏览大量文档或方程。
towardsdatascience.com](/getting-just-the-gist-of-deep-rl-algorithms-dbffbfdf0dec)**
更多?订阅我关于机器人、人工智能和社会的时事通讯!
一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…
robotic.substack.com](https://robotic.substack.com/)**
对话代理:聊天机器人的一种更自信的形式
意图识别和客户体验是聊天机器人的未来。智能对话式人工智能代理是聊天机器人的新进展,它可以根据客户过去的对话、购买或浏览行为来预测客户的需求。
图片作者作者
在过去的几年里,人工智能的进步抓住了公众更大的想象力,并导致人工智能助手的普遍采用。然而,这种变化和创新的快速步伐伴随着对技术方向以及它将如何影响社会的越来越多的怀疑。
尽管如此,普遍的共识是,提高计算机以更自然的方式与人类互动的潜力对于人工智能与人类的关系进一步发展非常重要。
人工智能以前所未有的速度改变了通信环境。这些不仅包括媒体行业的彻底变革,还涉及我们与之沟通的合作伙伴。今天和电脑互动很平常。
它们已经进化得不仅仅是人与人之间对话的媒介,还可以以聊天机器人和虚拟助手的形式与人类互动。
这已经可以通过对话式人工智能来实现,对话式人工智能是一种合成的智能,使计算机能够理解、处理人类语言并对其做出反应。
通过利用先进的深度学习措施和自然语言理解(NLU),对话式人工智能可以提升到能够真正改变客户体验的地步。客户将不必感受到原始聊天机器人的局限性,因为它们的范围狭窄。
有了对话代理,你可以超越简单的聊天机器人的反应,使他们更有上下文。客户可以直接从聊天窗口做任何事情,从提交保险索赔到请求天气建议以及外出是否安全。
对话代理和聊天机器人的区别
对话代理不仅给你建议,还和你一起思考,帮你做决定。例如,他们可以搜索数据集,在您最喜欢的网站上预订您的旅行,还可以找到最合适的日期。
这些智能体使用自然语言理解,并且比聊天机器人更具情境性。此外,成功的对话代理可以跨各种面向客户的渠道实现,并使用真实的用户数据进行训练。
对话代理
据聊天机器人杂志报道,一个对话代理是:
“对话代理是一个软件程序,它解释并响应用户用普通自然语言所做的陈述。它将计算语言学技术与互联网上的交流相结合。”
对话代理是一个对话系统,它执行自然语言处理(NLP ),然后用人类语言响应查询。会话代理体现了计算语言学的实用用法,它通常被用作互联网上的虚拟代理,作为服务助理。
聊天机器人
根据牛津词典,聊天机器人是:
设计用来模拟与人类用户对话的计算机程序,尤其是在互联网上
聊天机器人是由人工智能驱动的设备,用于模拟和模仿人类对话的非结构化流。聊天机器人不同于目的驱动的对话代理,它利用人工智能在理解意图和分析话语背景的基础上,用一组特定的预定义回复来响应人类对话。
总结一下,对话代理和聊天机器人的区别是:
图片由作者
对话代理是如何工作的
如前所述,对话代理是进行自然语言处理并以人类语言回应对话的对话系统。所讨论的对话系统可以用于从输入通道读取,然后通过输出通道以图形、语音或触觉辅助的物理手势的形式回复相关响应。
该过程的第一步包括在一种自动语音识别器(ASR)或光学手写/手势识别器的帮助下,将现实世界的输入转换为机器代码。
在这之后,输入在自然语言理解(NLU)单元的帮助下被破译。这超越了标准的自然语言处理,包括词性标注、名称识别和语义/句法分析器。
在解密的同时,对话管理器还运行以跟踪对话的历史和状态,从而通过启动/终止相关的子任务域来保持对话不脱离逻辑轨道。
最后,响应被处理并交付给输出生成器,然后输出生成器匹配任何输入。
对话代理与人工智能的联系
走向模拟对话是人机交互发展的下一步。这种转变也已经发生,从我们的手机到网站到应用程序,人工智能聊天机器人无处不在。
我们可以向他们提出各种各样的问题,并以打字文本的形式得到答案。但是蜜月期并没有持续多久。
彭博贝塔公司的合伙人希文·齐尔利斯说:
“聊天机器人曾经很火,现在没那么火了。他们在客户支持和智能家电等少数几个狭窄的应用领域看到了一些早期成功,但人们越来越失望,因为他们的期望过高。”
用户报告说,随着他们的期望值开始上升,他们对聊天机器人的失望程度越来越高。这是因为聊天机器人无法进行前后关联的交流,这可能包括从同一个对话中获取线索。
聊天机器人也缺乏感知和理解用户情绪的同理心,无法对他们做出更自然的反应。这些限制之所以存在,是因为计算机无法在自然语言理解和对话方面取得与自然语言处理相同的进步。
那么,一个人如何超越简单的“我不明白”作为对意外查询或触发的回复呢?答案在于在对话代理中嵌入更好的上下文感。建立这种环境可能需要几个相互联系的知识积累层,这些知识是计算机通过它们参与的每一次互动积累起来的。
密歇根大学人工智能实验室主任说:“在整个对话过程中,你如何真正把握上下文?这是最大的挑战。你如何理解我在说什么,很大程度上取决于我在五句或十五句前说了什么。你正在建立一种对话状态。”
显而易见,在对话代理中引入上下文感并不简单——这是一个复杂的问题,计算机科学家正在试验许多不同的潜在解决方案。这就是人工智能的用武之地。
计算机科学家正在特别试验机器学习算法,并在两种技术的帮助下训练它们:强化学习和监督学习,这两种技术已被用于训练人工智能系统执行单独的任务。
强化学习包括在让系统说出它以前从未说过的话时,通过反复试验来教会系统。这有助于对话更快、更有效地进行。
科学家试图用不同的方式说同样的事情,以帮助对话代理学习映射系统,从而在给定对话的整体背景和任务目标的情况下,理解接下来要说什么。有了监督学习,计算机通过例子来学习。它训练对话系统学习在特定上下文中说的对话,然后模仿它们。
加深对话代理和 AI 之间联系的另一个因素是物联网能力的持续发展。每当传感器将物体和人的上下文数据中继到人工智能系统时,这些设备将有助于为人工智能系统提供更大的上下文。
当这些设备继续相互“交谈”时,它们将获得更好的上下文感觉,并且随着该上下文可用于对话,对话将变得更自然、有用和更好。
对话代理的应用和用例
正确部署的对话代理将彻底改变你与用户互动的方式、时间和地点。您可以通过任何渠道与消费者进行无缝、无错误、同步的互动。对话代理用例的范围很广,下面将提到其中最少的一个。
收集线索并促进转化
令人惊讶的是,比起销售人员,用户更信任对话代理。
图片来自凯捷
这种信任通过实现对话式人工智能程序赋予企业巨大的权力。例如,得克萨斯州的软件公司 Cigniti 在他们的对话代理上看到了 40%的转化率。
提供客户支持
对话代理也是客户支持的一个改变者。他们可以为客户答疑解惑,提供建议,帮助他们做决定等等。
图片由 Helpshift
客户也喜欢对话代理具有的即时可访问性。使用对话式人工智能也可以让你大规模地管理对话。事实上,对话代理帮助零售商在不需要额外员工帮助的情况下处理了 167%的订单量增长。
个人助理
也许,对话代理最普遍的应用是以个人助理的形式。这些助理做从理解开放式对话到满足用自然语言提出的请求的一切事情。
尽管个人助理代表着一个新兴的市场,却受到了消费者的极大热情。根据 KPCB 的一项研究,与文本相比,用户对这项技术的速度非常着迷。
这种热情反映在遥遥领先的市场领导者亚马逊的 Echo 的销量上,根据 TechCrunch 的数据,该公司在 2019 年售出了超过 1.469 亿台。
结论
在不久的将来,基于更广泛背景的对话将创造出更好、更有用的助手。人类通过上下文对话与人工智能系统互动和互动的能力将有助于计算机科学家将该技术嵌入对话代理。
然而,显而易见的是,具有无所不在和上下文相关的人工智能的对话代理将成为人类和计算机之间协作和互动关系背后的驱动力。而且,该领域最大的影响将来自于发现使人和计算机很好地相互合作的最佳方法。
面向开发者的对话式人工智能:你的堆栈中的四个基本层
对话式 AI 组件;资料来源:Rasa
打造一个 AI 助手很难。构建一个不仅能处理问题和执行任务,还能参与灵活的来回对话的人工智能助手可能会非常困难。它需要机器学习、工程最佳实践、强大的工具和有价值的用户对话形式的数据。
你可能认为构建伟大的人工智能助手意味着从头开始构建一切。但是,您不需要从基本的构建模块开始,就可以获得高性能、企业就绪、足够灵活的产品来满足您的需求。像 Rasa 这样的开源框架是介于自己构建一切和使用 SaaS 框架之间的中间地带,你不能根据你的用例和训练数据来定制这个框架。
Rasa 一直在发布开源软件,这些软件已经授权成千上万的个人开发者、初创公司和财富 500 强公司创造人工智能助手。Rasa 在开发者友好的工作流程中发布了应用研究,如 TED 政策,以及国会 NLU 架构。
Rasa 不是一个包罗万象的对话式人工智能平台。这是一个可定制的基础设施层,在即插即用的架构中提供对话式人工智能构建模块。在这篇文章中,我们将讨论构建人工智能助手所需的组件,以及 Rasa 如何融入您的堆栈。
Rasa 如何融入您的堆栈
每个对话式人工智能应用程序都由几个不同的层组成:
- 计算层
- 对话式人工智能基础设施层
- 工具/服务层
- 应用层
对话式 AI 组件;作者图片
假设你在做披萨。如果你精通比萨饼制作的细微差别,你会知道你需要生面团、奶酪、酱汁和配料的原料。
您可能有三种选择:
- 你可以自己做所有的配料
- 你可以定制预先准备好的配料,然后把所有的配料放在一起做比萨饼
- 或者你可以买一个比萨饼,里面所有的东西都是预先制作和选择的,你不能定制
披萨的解剖,作者图片
计算层
计算层是基础层,其他层位于其上。机器学习友好的编程语言,如 Python 和 Julia ,以及机器学习框架,如 TensorFlow、PyTorch 和 spaCy,构成了计算层。
这些开源框架提供了高级 API,使得构建和实验模型变得更加容易;它们带有预先打包的算法,可以解决常见的 ML 问题,如使用神经网络的机器翻译、命名实体识别等。他们中的一些人甚至帮助将模型部署到生产中。
把编程语言想象成构成比萨饼面团的原料,像面粉、油、盐和水。ML 框架可以被认为是你可以在超市找到的预先包装好的面团。使用开源软件库或框架来开始构建您的助手可能比从头开始构建更容易。
计算层;作者图片
对话式人工智能基础设施层
对话式人工智能基础设施层位于计算层之上。它提供了一个内聚的框架,帮助开发人员构建 AI 助手。Rasa 开源是一个用于构建 AI 助手的对话式 AI 框架。它包括识别意图和实体的自然语言理解能力、机器学习驱动的对话管理、有助于与流行的消息服务集成的连接器,以及可以被调用来与外部系统集成的定制动作。
把 Rasa 开源软件想象成你的披萨酱。从头开始制作具有挑战性,需要专业知识;但是使用预包装的版本,你可以根据自己的喜好定制和改造酱料,并专注于制作一个伟大的披萨,而不是酱料。
Rasa 开源是像 TensorFlow 这样的机器学习框架之上的一个抽象层。就像你可能不会编写自己的编程语言、算法或 TensorFlow 版本一样,你也不必构建自己的对话式人工智能基础设施组件。
对话式人工智能基础设施层;作者图片
Rasa 开源抽象出了构建人工智能助手所涉及的复杂性。但是它是完全可扩展和可定制的。您可以使用 Rasa 开源构建任何类型的助手。您可以将自己的工具插入 Rasa,或者在它的基础上构建额外的层。
由于人工智能助手可以是特定于用例和行业的,因此基于问题和训练数据挑选各种管道、策略和配置选项的能力可能是有价值的。例如,您可以使用像 BERT 这样的语言模型,转换或插入您的自定义模型。
Rasa 开源还使用机器学习策略和对话管理来处理非线性对话和杂乱的人类行为。用户经常会插入一些离题的信息,回到之前的话题,或者离题。他们通常以非线性和无序的方式说话。助理的目的是自动化对话或处理一定数量的客户服务请求,他必须能够处理这些类型的对话。状态机或开箱即用的 SaaS 聊天机器人平台并不最适合这些类型的用例,因为它们无法扩展到规则和 if/else 语句之外。
澄清一下,大部分 AI 助手里还是需要规则和业务逻辑的。如果您没有在真实用户中测试过,那么最初您也许可以使用状态机。
典型的状态机流程;资料来源:Rasa
但是当你开始用真正的用户测试它并添加更多的功能时,它很快变得难以置信的混乱、不可维护和难以扩展。
状态机意大利面条代码;作者图片
可定制的框架使用机器学习来预测下一个最佳行动,并根据对话历史进行归纳,允许您创建支持灵活、自然的多回合对话的助手。
工具/服务层
工具或服务层位于基础设施层之上。使用 Rasa 开源,您可以构建一个 MVP 助手,它可以进行对话,理解上下文,并执行某些任务。下一步是测试和改进你的助手。工具可以帮你做到这一点。Rasa X 提供了收集、可视化和审查用户对话的工具。它允许您与真实用户一起测试,建立 CI/CD 管道,并进行持续改进。把 Rasa X 或者其他工具想象成你披萨上的奶酪。它改善你的助手,就像奶酪如何使你的比萨饼更好!
工具/服务层;作者图片
应用层
应用层是你的 AI 助手生活的地方。它可以与其他系统和 web 应用程序共存。例如,一个企业的工资单、人力资源和 IT 系统都在这里。根据你的人工智能助手的使用情况,它可能会与一个或多个上述系统进行交互。这一层的应用程序也有用户界面,用户可以实际看到并与之交互。基于安全和隐私考虑,您可以将您的助手部署到云中或在本地托管它。
对话式 AI 组件;作者图片
结论
构建任务关键型对话式 AI 需要机器学习、对话数据、声音工程和强大的工具来设计、分析和改进对话式 AI 工作流。Rasa 使强大的对话式人工智能研究和工具可用于没有资源从头开始构建的开发人员,以及希望专注于解决有趣问题而无需重新发明轮子的组织。定制开源框架的能力,而不是从头开始构建或使用黑盒 SaaS 聊天机器人平台,已经使对话式人工智能开发不仅可以用于机器学习研究人员,还可以用于世界各地成千上万的开发人员。
智能虚拟助手和未来之路。
“你是机器人吗?”
奥克塔维安·罗斯卡在 Unsplash 上的照片
在一个快速发展的世界里,客户在与任何公司交谈时都要求高效和迅速**。这就是聊天机器人和智能虚拟助手发挥作用的地方。**
与基于规则的聊天机器人不同,人工智能系统能够参与更高级的对话,因此配备了多种功能来帮助甚至娱乐用户的日常活动。除了可定制的功能之外,它们的自学能力和可扩展性也使得虚拟助手在各种全球企业中广受欢迎。
根据 Grand View Research 的数据,全球智能虚拟助理市场规模在 2019 年的价值为 37 亿美元,在预测期内的复合年增长率(CAGR)为 34.0%。基于服务的公司对效率的需求以及人工智能数字助理在各种设备(如计算机、平板电脑和智能手机)之间的集成,预计将推动市场发展。
2020 年机器人能做什么?
毫无疑问,最近的技术进步极大地提高了聊天机器人和 IVAs 的性能。但是,不管乍看起来多么完美,我们都同意机器人仍然是可怕的健谈者。
基于规则的聊天机器人。人工智能驱动的聊天机器人。
基本的 基于规则的聊天机器人 只能在聊天中访问,并在单回合交换中工作。简而言之,它们对用户提出的问题做出反应,检测主要意图,并相应地返回一个预定义的答案。他们能够处理基本的日常查询,例如:常见问题解答、预订、在线订单或预约安排 ( 调查机器人、外语教师、旅游机器人&酒店机器人)。然而,一旦用户问了一个超出机器人已学知识范围的问题,它将自动导致失败。
另一方面,我们区分了人工智能驱动的聊天机器人,它们依赖于核心机器学习技术,如自然语言处理和信息检索(IR) 技术。通过应用这些方法,像脸书和谷歌这样的科技巨头已经发布了开放域多回合聊天机器人(见 Meena 和 Blender ,它们能够复制更像人类的对话。然而,由于深度学习的许多直接限制,开放域机器人的实现仍然极具挑战性。
搅拌机机器人
2020 年 4 月,脸书·艾 开发了和开源的 BlenderBot ,第一个将多种多样的对话技能——包括移情、知识和个性——融合在一个系统中的聊天机器人。
尽管 Blender 代表了对话式人工智能的巨大进步,但它仍远未达到人类的水平。挑战之一在于其捏造事实的倾向——因为句子是从统计相关性中产生的,而不是从知识数据库中产生的。因此,它可以对一个著名的超级巨星进行深入而连贯的描述,但却带有完全错误的信息。该团队打算进一步试验将知识数据库集成到聊天机器人的响应生成系统中。
资料来源:脸书研究
聊天机器人会被 IVAs 取代吗?
很有可能,是的。但是我们的“艺术级”Meena 和 BlenderBot 怎么样呢?他们似乎是非常聪明的聊天机器人,不是吗?
随着各行各业的企业寻求提升客户体验的方法,虚拟增值服务极有可能在聊天机器人上积聚势头。你现在一定想知道为什么是,答案相对简单。除了能够利用人工智能推动业务核心的转型,iva 还能够适应和参与更像人类的对话,并增强用户体验。
当所谓的声音革命正在发生的时候,一些组织相信化身模拟真人将会带来更成功的助手。有多成功?还有待见,字面意思。
哎呀!米娜和 BlenderBot 只能…聊天。
如果你正在读这篇文章,你很可能至少和 Alexa、谷歌助手、Siri、Cortana 或 Bixby 聊过一次。如果你还没有,你一定很好奇为什么语音人工智能在过去的几年里变得如此流行。让我们仔细看看!
由数字助理和高质量语音用户界面(vui)推动的对话式交互将在未来几年成为真正的游戏规则改变者。随着自动语音识别的进步,对语音搜索的巨大需求将导致智能扬声器和车载系统与 IVAs 齐头并进。
此外,语音技术在教育领域变得越来越重要。在 IBM Watson 机器学习加速器解决方案的支持下, DeepZen 开发了深度学习和神经网络,可以识别文本中的情感,并产生类似人类的语音。该组织认为语音技术可以帮助学生拼写和练习乘法表,以及教授他们关于人工智能和未来世界的知识。
“随着越来越多的教学应用被开发出来,语音助手在教育领域越来越受欢迎。**——**DeepZen
我从未见过虚拟助手。
一种不同的方法来自三星的子公司 STAR Labs,该公司在 CES 2020 上正式推出了其“人造人”项目 Neon。Neon 基本上是关于创造数字化身——计算机动画模拟的人——直到今天公众仍然不知道。该公司解释说,“在我们的 CES 展台和我们的宣传内容中展示的场景是虚构和模拟的,仅用于说明目的。”
霓虹“人造人”
更进一步来说, Replika 已经集成了一个 3D 化身的测试版,导致了用户方面的许多争议性反应。虽然许多人对与他们的 replika 及其背后的技术进行可视化交互感到兴奋,但其他人已经决定回到旧版本。自从更新以来,Replika 的 Twitter 页面上一直有用户对新的“可怕的令人毛骨悚然”的头像感到“不舒服”和“害怕”的评论。
因此,这些化身是否是成功的数字助理未来道路的一部分仍然是一个未决的问题。
带回家的信息。
考虑到自然语言处理技术的快速发展,语音搜索的兴起,以及电子商务和电子学习的发展,使用虚拟助手的组织的数量预计将在未来几年激增。换句话说,前面提到的新兴趋势让我们相信旧的传统的基于规则的聊天机器人很有可能被 IVAs 取代。
请记住,尽管如此,对话式人工智能开发面临的挑战和担忧数不胜数,机器人可能仍然存在缺陷。
对话式人工智能——关键技术和挑战——第 1 部分
来自 Unsplash 的 Eric Krull
语音界面和常规系统是 AI 技术在行业中的实际实现。本文将探索基础知识和技术,然后扩展到不同业务用例中面临的挑战。
1.对话系统
什么是对话系统或虚拟代理?最著名的虚构特工之一是《钢铁侠》中的贾维斯。它可以独立思考,帮助托尼做几乎任何事情,包括运行家务,处理海量数据集,提出智能建议,提供情感支持。Jarvis 最令人印象深刻的特点就是聊天能力,你可以像老朋友一样和他聊天,他也能毫不含糊地听懂你的话。幕后的技术是对话式人工智能。
对话式人工智能的核心是一个智能设计的语音用户界面(VUI)。与传统的 GUI(图形用户界面)相比,VUI 允许用户通过简单的语音控制(而不是在屏幕上点击十次)来执行嵌套查询,从而解放了用户的双手。
然而,我不得不承认,在完美的虚拟代理贾维斯和现有的对话式人工智能平台的能力之间仍然有很大的差距。
在过去的十年里,人机对话受到了学术界和工业界的大量关注。在研究实验室中,我们看到了以下运动:
- 自然语言理解已经从 人工标注 和 语言分析 走向 深度学习 和 序列化语言建模。
- 对话管理系统已经从策略 转移到 监督学习和强化学习 。
- 语言生成引擎已经从 预定义模板 和 语法解析 转移到 端到端语言转换器 和 注意机制。
此外,我们还看到对话产品在跨市场领域涌现。所有的大玩家都有他们标志性的虚拟代理,例如,苹果的 Siri,亚马逊的 Alexa,微软的 Cortana 和谷歌的 Dialogflow。(下图已过时,请仅用作参考)
来自的报道。艾
2.对话系统的关键组件
会话平台中有几个主要组件,1) ASR:自动语音识别,2) NLU:自然语言理解,3)对话管理,4)NLG:自然语言生成,5) TTS:文本到语音。(其他组件可能包括公共 API、集成网关、动作执行逻辑、语言模型培训堆栈、版本控制和聊天模拟等。)
为了简单起见,现在让我们探索一下基础知识。
简单的对话系统
2.1。ASR: 自动语音识别是一种在说话人语音记录和文字记录上训练的模型,然后进行微调以识别看不见的语音查询。大多数对话平台都将这一特性作为嵌入元素提供。因此,开发人员可以在他们的产品上利用最先进的 ASR(例如,语音输入、语音搜索、实时翻译和智能家居设备)。
2.2。NLU: 毫无疑问,会话系统中最重要的部分。ASR 只会转录你所说的话,但 NLU 会明白你到底是什么意思?自然语言理解可以看作是自然语言处理的一个子集。这种关系可以大致描述如下。
由 Sciforce
NLP 和 NLU 都是董事会的主题,所以我不会太深入这个主题,而是通过使用虚拟代理用例中的实际例子来解释这个高级概念。
一般来说,NLU 和 NLP 是围绕以下问题构建的:
- 符号化和标记。它们是文本预处理技术。标记化是需要应用于传统语言分析和深度学习模型的第一步。它将一个句子分成单词(或 n_grams),这些单词将在以后用于构建词汇表或训练单词嵌入算法。标记有时是可选的,它会将每个单词标记到词汇类别中。(如 ADJ、ADV、名词、NN)
- 依存关系和句法分析。这是语言分析中一种流行的技术,它将一个句子解析成它的语法结构。在深度学习时代之前,那些语法树被用来构成一个新的句子或一系列单词。
来自斯坦福 NLP
- 命名实体识别。它用于提取或识别一组预定义的单词实体。NER 的输出有时看起来非常类似于词性标注。结果也存储在 Python 元组中,例如(美国,“GPE”)。主要区别是 1)NER 模型可以通过新的标注来训练,以拾取特定领域的单词实体。2) NER 更注重语义,而概念标注更注重语法结构。
- 短语和模式匹配。短语匹配最简单的实现是使用基于规则的正则表达式。不要误会,正则表达式在无标签的数据集中还是有好处的。一个充分定义的模糊模式可以匹配数百个相似的句子。然而,这种基于规则的方法很难维护和扩展。更高级的方法包括使用 POC 标签或依赖性标签作为匹配序列,或者使用向量距离。
- 单词矢量化和嵌入。单词嵌入标志着 NLP 的开始,它引入了单词分布式表示的概念。在深度学习之前,语言学使用密集表示来捕捉文本的结构,并使用统计模型来理解关系。这种方法的缺点是缺乏表示上下文意义和单词推理的能力。单词嵌入提供了一种从高维空间学习在特定上下文中最好地表示单词的参数的解决方案。对于实际使用,您可以找到预先训练的单词嵌入模型,如word 2 vec,GloVe,或者如果您需要,您可以随时在您的新 vocab 集和训练语料库上微调这些模型。
凯瑟琳·王的文字嵌入
- 序列矢量化和嵌入。类似的概念,但不是对每个单词进行矢量化,序列嵌入侧重于找到较长文本作为一个整体的最佳表示。这种技术改善了需要理解较长文本块的特定 NLP 任务,例如,文本翻译、文本生成、阅读理解、自然问题和较长答案等。
凯瑟琳·王的序列建模
- 情感分析。分析一个表达式是正还是负的任务(可以理解为二元分类,1-正,0-负)?NLP 中最常见的任务之一,在对话式人工智能的使用中,情感分析可以为虚拟客户代理提供基准,以识别客户的情感和意图,然后提供不同的情感响应建议。
- 话题建模。它利用无监督的 ML 技术在大量未标记文档中寻找主题组。它有助于我们快速理解一组看不见的语料库的主题。在对话式人工智能的用例中,主题建模充当第一个过滤器,将用户查询分类到更高层次的主题,然后映射到更细粒度的意图和动作。
- 文本分类和意图匹配。这两项任务都使用监督学习,模型的质量在很大程度上取决于您如何准备训练数据。与主题建模相比,文本分类和意图匹配更加细粒度和确定性。你可以用下图来理解这种关系。当面对看不见的客户查询时,你的对话式人工智能系统将使用主题建模来过滤你的查询,使其成为一个宽泛的主题,然后使用文本分类和意图匹配将其映射到一个特定的操作。
凯瑟琳·王的意图匹配
- 语言建模。深度学习和 NLP 中的一个热门话题。所有你听说过的最先进的模型都是基于这个概念(伯特家族:艾伯特,罗伯塔;多任务学习者和少量学习:GPT-2)。为了让机器更好地理解人类语言,科学家训练它建立词汇和统计模型,以预测每个单词在上下文中的可能性。
凯瑟琳·王的语言模型
- 多回合对话系统。这是 NLU 和对话式人工智能中的一个高级主题。它是指在会话系统中跟踪和识别话题/意图变化的技术。我们如何更好地提取每个对话框中的信息,并绘制出用户复合意图背后的综合逻辑。
在对话式人工智能的用例中,NLU 的目标是解决语言混淆、歧义,概括语言理解,识别从人类到机器对话的领域和意图,然后提取关键的语义信息。
除了使用我上面提到的关键技术,AI 系统还需要找到用户查询的有用语义表示。最成功的一个是“框架语义”,它使用域、意图、实体和槽来制定语义结果。
- 领域 :可以链接到主题建模,它将查询和知识资源分组到不同的业务类别、目标和相应的服务中。比如“售前”、“售后”,或者“订单与交易”。
- 意图 :可以链接意图匹配和分类。它指的是一个领域内的特定任务或业务流程。它通常写在动词宾语短语中。例如音乐播放器域中的“搜索歌曲”、“播放音乐”或“喜爱的播放列表”。
- 实体和槽 :可以作为参数从域和意图中提取关键信息。如“歌名”、“歌手”。
一句“墨尔本明天的天气怎么样?”可以转换成吹塑结构,
-域名:“天气”
-意图:“查看天气”
-实体和槽位😦“城市”:“墨尔本”,“日期”:“明天”)
然后通过解析上述结构化数据来完成后续动作。
2.3。对话管理:对话式人工智能系统的另一个关键部分。它控制用户和代理之间的对话流。在最简单的版本中,DM 引擎将记住历史对话上下文,跟踪当前对话的状态,然后应用对话策略。
- 对话上下文: 在用户代理对话的会话过程中,所有的来回对话都会被上下文记住。域、意图、实体和槽等关键信息将保存在消息队列中,以供内存中搜索和检索。在对话之后,对话上下文可以被保存在数据库中用于进一步的分析。
- 对话状态跟踪 :对话状态跟踪器会记住对话中的逻辑流程。通过跟踪不同对话中的逻辑调整点,然后基于长期记忆建议响应,这将使代理更加智能和灵活。
- ****对话策略:基于对话的上下文和逻辑流,代理需要区分服务的优先级,触发某些事件,并请求实现。履行动作可以包括从数据库中检索用户信息、在知识库系统中搜索内容或者触发第三方 API。
例如:
Q :我要订披萨外卖 (intent=order_pizza,entity_time=null,entity_address = null,entity_type=null)。 A: 你想点什么类型的披萨?(插槽=类型,插槽=日期,插槽=地址)
Q :玛格丽塔。 (intent=order_pizza,entity_time=null,entity_address = null,entity _ type = Margherita)A:你希望你的披萨什么时候送到?*(槽=日期,槽=地址)*
Q :尽快。 (intent=order_pizza,entity_time=ASAP,entity_address = null,entity _ type = Margherita)A:您的{Margherita}披萨还需要点什么吗?*(跟进意图:附加产品切割)*
问: 一瓶可乐。 (intent=order_pizza,entity_time=ASAP,entity_address = null,type=Margherita,additional =coke) A:我们送披萨的地址是哪里?(插槽=地址)
**问: xx.xxx 。(intent=order_pizza,entity_time=ASAP,entity_address = xx.xxx ,type=Margherita,additional = coke)*A:谢谢,所以您订购了{ type }披萨,并附有{ additional },送货至{entity _ address} {ASAP}。(履行:更新 _ 订单,呼叫 _ 交付 _ 服务)
如您所见,会话期间需要填充槽和实体,父意图可以触发 follwo _ up 意图,然后将根据会话的状态激活操作实现。
2.4。NLG :自然语言生成引擎根据聊天系统的类型有不同的实现和技术栈。对于面向任务的闭域会话系统,NLG 是通过会话会话中提取的“ 槽 ”和“ 实体 ”的可互换参数响应模板来实现的。对于开放域聊天系统,文本生成将基于信息检索、机器理解、知识图等。
2.5。TTS :文本到语音引擎正在执行与 ASR 完全相反的任务。它将纯文本转换成语音记录,并与合成语音一起向最终用户播放。
基于以上讨论,下图提供了对话式人工智能系统更全面、更真实的视图。
凯瑟琳·王的对话式人工智能系统
3.语音用户界面和用户体验设计
GUI(图形用户界面)正主导着人机交互。它改变了个人电脑世界的游戏规则,推动了数字设备在日常生活中的广泛应用。现在我们面对着屏幕,无时无刻不在和他们互动。
但在未来十年,随着人工智能的进步,人机交互将转向语音。语音用户界面将是智能和物联网设备的新入口。例如,当你说“嘿谷歌”时,谷歌之家就会醒过来,并与你开始对话。在这种情况下,声音将成为新的鼠标和图形。
来自 unsplash的 Kelly sik kema
在 GUI 设计中,所有的用户交互都是预定义的,并由屏幕上的一系列点击或交换来引导。但是在 VUI 系统中,首先,用户的行为是不可预测的,会偏离故事主线。第二,在开放式对话中,用户可能随时改变话题,并且用户的请求可能具有需要满足的复合意图。最后,语音交互需要用户和代理的持续关注,因为双方都需要记住他们在之前的对话中说了什么。
最成功的对话式人工智能系统会在他们的 UI 和 UX 设计中考虑语音和图形的互补。一个成熟的系统应该结合这两种特性,为最终用户提供更丰富的身临其境的体验。
参考
- 深层话语聚合的多话轮对话建模。 arXiv:1806.09102【cs。CL]**
关于我,我是👧🏻现居澳大利亚墨尔本。我学的是计算机科学和应用统计学。我对通用技术充满热情。在一家全球咨询公司担任人工智能工程师领导👩🏻🔬,帮助组织集成人工智能解决方案并利用其创新力量。在LinkedIn上查看更多关于我的内容。**
对话式人工智能——关键技术和挑战——第二部分
来自 Unsplash 的 Arseny Togulev
让我们来探讨为面向任务的聊天机器人开发行业级对话式人工智能解决方案的关键挑战。
继我之前讨论关于对话式人工智能解决方案 的关键技术的帖子之后,我将深入探讨人工智能工程师团队在为您的客户或顾客构建虚拟代理或聊天机器人解决方案时会遇到的典型挑战。
让我们首先定义对话应用程序的范围和目标。
由凯瑟琳·王创作
对话代理可以分为两个主流。开放领域对话和面向任务的对话。
开放域对话的典型代理有 Siri、谷歌助手、脸书的 BlenderBot、谷歌的 Meena。用户可以在没有明确目标的情况下开始对话,话题不受限制。这些代理商将娱乐和情感反应融入他们的设计,并能够与最终用户进行长时间的对话。
大多数商用的虚拟代理都是面向任务的。它们包括你在银行网站上看到的聊天机器人,或者当你打电话给飞行中心热线时会和你打招呼的虚拟代理。这些代理是为特定的目标服务的。他们专注于封闭领域的对话,通常会通过响应来满足您的请求。面向任务的代理中的对话倾向于简短而有逻辑性。
现在我们对代理类型有了一个很好的定义,让我们来探索面向任务的对话领域中的挑战。(开放域对话超出了今天的主题,将在以后的帖子中讨论)
面向任务的对话
(请参考上一篇文章,了解下面架构图的详细解释)
对话式人工智能架构 —由凯瑟琳·王创建
1.融合,融合,再融合!
沿着聊天机器人建立一个摊位很容易。如果您参加了在线课程或跟进了教程笔记本,您大概可以在几个小时内设置一个语音代理。
但是在现实世界中,对话组件需要与现有的系统和基础设施无缝集成。虚拟代理的架构会因客户技术体系的数字成熟度而有很大差异。
如果你使用的是云平台上流行的对话服务(Dialogflow,Lex,Azure bot service 等。),而你的虚拟代理暴露在公众面前,先想想安全。本质上,bot 或虚拟代理是对您的核心对话服务的一系列 API 调用,确保解决方案具有健壮的认证和授权机制,并且敏感信息被加密。如果 bot/虚拟代理解决方案需要与您现有的系统或数据库进行交互,请设置一个外部 TCL/SSL 代理来解释和规范化请求,而不是让 bot 直接向您的核心系统发送未序列化的消息。使用外部代理的另一个潜在好处是,您可以构建一个通用的 RESTful API,使您能够快速扩展。
对话组件集成 -由 Catherine Wang 创建
如果你在云上使用对话服务,并为内部用户构建一个虚拟代理,这些代理很可能需要大量的信息检索。内部用户或员工希望使用虚拟代理作为一个知识搜索引擎让聊天机器人查找上一次的会议记录、税务发票、具体的公司政策或去年的提案。这种解决方案的关键是创建和维护一致的知识库和动态索引策略。知识库是智能体搜索空间的基础,它与答案的准确性相关。然而,文档和内容分散在组织中,缺乏管理和所有权。因此,构建这种类型的虚拟代理的第一步应该是设计全面的数据接收、管理和治理管道。如果你需要收集和查询的数据同时在线和离线,或者在多个云平台,就要小心了。
代理知识库的数据管道 —由 Catherine Wang 创建
上述解决方案的另一个关键部分是维护代理查询知识库的索引和知识本体。在最简单的版本中,虚拟代理由精选的 Q & A 集合支持,并将相似的问题与预定义的答案进行匹配。一个更高级的代理将具有语义搜索能力(可以通过弹性搜索实现),它可以理解自然语言并在知识库上执行查询搜索。最终的解决方案涉及机器理解,让机器理解语料库和长问题,从而在相关文档中找到答案的跨度。一个成熟的虚拟代理解决方案通常会堆叠这些组件来增加健壮性。
带信息检索的知识库 —由 Catherine Wang 创建
2.如何处理嵌套或复合意图匹配
在完美的场景中,用户会带着单一和直接的意图问一个问题。但是当人类交流时,我们更喜欢将几个意图组合成一个对话。
问题:你能帮我查一下天气吗?如果好的话,帮我订一张去 XXX 的票。
意图:[“查看天气”,“订票”]
在虚拟代理解决方案中,对话管理组件需要跟踪对话的状态,并从用户表达(或问题)中识别多个意图。一旦匹配了多个意图,下一步就是确定执行或实现的优先级。
潜在的解决方案可以是:
- 主要主题和平行意图,优先级分数
具有优先分数的平行意图-凯瑟琳·王
如果在您的用户场景中,意图自然地聚集到一个主题中,您可以使用自顶向下的设置,如上图所示。主主题分类器将帮助您深入了解意向子集,然后通过考虑预定义的优先级分数来匹配个人意向。
- 主要意图和跟进意图
意向层次——凯瑟琳·王
假设您的用户场景有一个自然的逻辑流,可以转换成一系列意图。那么更好的配置是设置主要意图和后续意图,类似于逻辑决策树。然后,虚拟代理将引导用户通过预定义的逻辑。
- 触发混淆和错误检测引擎,并使用恢复策略阐明意图。
该选项将在第 4 节中讨论。管理混乱和模糊 。
3.将对话映射到预定义任务的挑战。
机器和人类有不同的逻辑框架。人类的对话是直觉的和非线性的,但是机器程序是线性的、逻辑的和严格定义的。当设计你的对话代理时,考虑用户场景和用户通常会问什么问题。
由凯瑟琳·王创作
由凯瑟琳·王创作
一旦你理解了你的客户的行为,试着找到他们行为的关键驱动力和主题,然后为每种类型的主题(用户场景)开发一个任务流。请保持简单,易于遵循,并灵活扩展。(主分支和可选子节点)
Rakebots 的任务流示例
您的对话代理需要基于任务流进行配置,并保持主任务流更新,在早期阶段解决冲突的逻辑点。
假设您正在处理一个大型客户项目,其中有多个并行的业务部门,并且可能有数百个意图聚集在一个主题范围内。在这种情况下,您可以采用多代理架构。主代理控制子代理,子代理有自己的知识空间和意图配置。
多代理架构(Multi-Agent Architecture)——由 Catherine Wang 创建
【小心如果选择实现上述架构,不适合 PoC 或快速实验。始终从易于集成和部署的简单解决方案开始。当开发周期更加成熟和稳定时,获得一些速赢来建立势头,转向细粒度的架构设计。】
4.应该如何覆盖长尾意图?
长尾意图指的是你的虚拟代理在服务期间会收到的低频率和高方差的问题。
这可能会导致“出乎意料”或“超出词汇表”的错误。
解决这个问题的标准方法是建立一个知识库,并使用信息检索技术来为看不见的问题生成答案(而不是创建额外的问答对或定义新的意图映射)。
长尾理论——由凯瑟琳·王创作
无论你如何设计你的代理人的对话和潜在的任务流,长尾意图总是会发生。人类喜欢即兴创作和抽象,因此为看不见的和未知的事物做准备。
5.如何管理谈话中的困惑和歧义?
人类有一个强大的通信协议,能够迅速澄清模糊和混乱。
但是对于机器来说,为了消除歧义,我们需要设计一种机制来触发恢复和回退策略(AI 工程师定义的规则)。用户的表达(问题)可以分为三组,1)清晰直接的意图(易于理解和处理),2)未知的意图(超出范围的问题),以及 3)不确定的意图(具有潜在的匹配,但需要额外的澄清)
对话管理引擎应该能够确定当前用户表达式应该属于哪个组。总的想法是,我们假设常见的用户问题通常遵循正态分布。并且 DM(对话管理)正在使用分类阈值来对所接收的问题进行分类。
意向分类分布—Catherine Wang 创建
< ∂1, [Reject], trigger [Fallback] response
∂1<predict_proba trigger=“” response=“”></predict_proba>
predict_proba(expression)>预测 _proba(表达式)【∂2】,【接受】,触发【匹配意向】响应
6.如何设计 A/B 测试来提高你的虚拟代理?
依我拙见,A/B 测试是提高虚拟代理可用性和采用率的银弹。
在进行 A/B 测试之前,代理只在测试人员和开发人员可能在开发周期中有无意识偏见的避难所环境中使用。不要在特性路线图上做任意的决定,构建优先级应该由 A/B 测试结果来指导。
以下是代理 A/B 测试的一些设计原则:
- 在一段时间内运行测试,并为开/关测试功能设计一个时间间隔。
- 收集大量样本进行假设检验。
- 根据不同的人口统计数据建立测试组。
- 测试中分离 UI 变化和虚拟代理功能变化。
要跟踪的关键指标有:
- 激活率:随机用户在你的客户端应用上打开聊天机器人的比率。
- 混淆触发: 对话代理将用户表达分类为“不确定”并触发恢复策略的百分比是多少。
- ****回退率:会话会话中触发回退响应的比率。
- ****目标完成率:对话成功完成任务的百分比。
- 保持:用户在与虚拟代理的对话会话中保持多长时间。
- ****自助率:代理独立完成用户请求的频率(无触发回退,需要人工干预)。
- ****用户满意度:对使用虚拟代理服务的体验满意度进行评级的用户反馈。
7.通过持续学习提高你的对话代理
大多数工程团队不需要使用这种方法来改进他们的代理。对话式云平台(Dialogflow 或 Lex)将为您完成繁重的工作。
然而,如果你想从头开始构建你的对话系统,下面是一个构建持续学习管道的方法来改进你的对话系统。
持续学习 —凯瑟琳·王创造
为了训练你的对话模型,你需要准备一个相关的数据集。如果你已经向最终用户展示了你的代理,建立一个反馈回路来收集聊天记录,抄本,交易,博客等。然后将这些数据转换并标准化到训练数据库中。
如果您没有用户交互数据,请使用用户模拟器(例如…)与您的代理聊天,并从模拟对话中收集标记的数据(例如,分类或错误分类)。这些数据可用于训练恢复策略和对话状态跟踪模型。下一步是对用户目标(用户希望在聊天会话中完成的任务)进行采样,并在接下来的强化学习阶段将其用作奖励评估者。
最后,将您的代理暴露在网上,并启用在线学习机制。确保当越来越多的人使用它时,您的代理会变得越来越聪明。
(这是一个高级的话题,我不会在这篇帖子里讲得太深。如果你有兴趣探索更多,请联系我。)
这篇文章中所讨论的只是你在现实生活中所面临的一小部分问题。而且已经提到的每一个点都可以展开成一个研究帖。
我们在探索什么是可能的,在学习的同时建设未来。试着带着你的客户一起踏上旅程,真诚而透明地交流。
来自像素的像素
请记住,我们正在构建一个对话式的人工智能解决方案,所以为什么我们不能在考虑如何让我们的虚拟代理与最终用户更顺畅地交互之前,首先与我们的客户进行更好的沟通呢?
感谢阅读,下次见。
**关于我,我是一只👧🏻现居澳洲墨尔本。我学的是计算机科学和应用统计学。我对通用技术充满热情。在一家全球咨询公司担任 AI 工程师领导👩🏻🔬,帮助组织集成人工智能解决方案并利用其创新力量。在 LinkedIn 上查看更多关于我的内容。
与伯特的对话人工智能变得容易
使用 Rasa 和 Huggingface 即插即用变压器
一年多来,我一直在尝试使用 NLP 和 python 来自动安排约会,多亏了一个令人惊叹的免费开源对话工具 Rasa,我终于成功了。
事实是一年前,当我开始这个项目时,我现在使用的工具几乎不可用。当然不是我们今天看到的易于使用的形式。作为人工智能和 NLP 科学发展速度的一个证明,去年(2019 年 6 月)的这个时候,像 BERT 这样的变形金刚刚刚离开学术研究的领域,刚刚开始在谷歌和脸书等科技巨头的生产中看到。BERT 论文本身在 2018 年 10 月才发表(下面是论文链接)。
今天,由于像 Rasa 和 HuggingFace 这样的开源平台,BERT 和其他变压器架构可以以一种简单的即插即用方式使用。此外,Rasa 的数据科学家开发了一种基于转换器的特殊分类器,称为双重意图实体转换器或 DIET 分类器,为同时提取实体和分类意图的任务量身定制,这正是我们在阿根廷 Kunan S.A. 与我的团队开发的约会安排虚拟助理 MyTurn 的产品。
饮食结构图(image| Rasa
证据就在 p̶u̶d̶d̶i̶n̶g̶ f1 的成绩中
对于定量的人来说,在我用 DIET 替换了基于 ye ole Sklearn 的分类器后,我的 F1 分数在实体提取和意图分类方面都提高了 30%以上!!!!比较下图中的 SklearnIntentClassifier 和 diet_BERT_combined。如果你曾经设计过机器学习模型,你会知道 30%是很大的。就像那次你意识到你把车停在了洒水器的水管上。当事情以它们应该的方式运行时,这是多么令人惊奇的事情啊!
模型评估(image |bubjanes w/streamlit)
意向分类原始数字(image| bubjanes
智能的蓝图:config.yml
是科学还是艺术?都不是。它尝试超参数的每一种可能的组合,并选择给你最高指标的配置。这叫做网格搜索。
需要注意的是,伯特不是一粒神奇的药丸。事实上,对于我的特定任务和训练数据,单独的 BERT 预训练单词嵌入并没有提供好的结果(参见上面的 diet_BERT_only)。这些结果明显比 2019 年旧的基于 Sklearn 的分类器差。也许这可以通过在阿根廷科尔多瓦的非正式西班牙语聊天中发现的地区行话和口语来解释,我们的培训数据就是从那里生成的。根据 HuggingFace 文档,我们使用的多语言预训练 BERT 嵌入是“在最大的维基百科中的前 104 种语言的大小写文本上训练的”。
然而,我们获得的最高性能模型是通过使用 DIET 在我们自己的 Córdoba 数据上训练定制特征,然后在前馈层中将这些监督嵌入与 BERT 预训练嵌入相结合(参见上面 diet_BERT_combined 中的结果)。下面的小图显示了如何将基于科尔多瓦数据训练的“稀疏特征”与前馈层中的 BERT“预训练嵌入”相结合。此选项非常适合于训练数据很少的西班牙语项目。也就是说,组合模型的性能仅略好于使用没有 BERT 预训练嵌入的 DIET 的模型(参见上面 diet_without_BERT 的结果)。这意味着对于非英语语言的聊天机器人来说,训练数据量适中,DIET 架构可能就是你所需要的。
将自定义监督单词嵌入和 BERT 预训练单词嵌入结合到前馈层的示意图。(图片| 拉莎)
即插即用,适用于 realz
在安装了 Rasa ,并构建了一个符合你需求的助手(我建议在做这件事之前先看看 Rasa 的 YouTube 教程)之后,BERT 嵌入的实现是如此简单,几乎令人失望。
下面是我们使用的配置文件的一个例子。这一长串的超参数可能看起来让人不知所措,但是相信我,这比一年前容易多了。
Rasa 提供的可用超参数(image| bubjanes )
您必须下载 BERT 依赖项:
pip install "rasa[transformers]"
要集成 BERT 或在 HuggingFace 网站上可用的任何其他预训练模型,只需用您想要使用的任何预训练嵌入替换下面行中的model _ weightshyperparameter。
- name: HFTransformers NLP
model_weights: “bert-base-multilingual-cased”
model_name: “bert”
我们使用了Bert-base-multilingual-cased,因为它是适用于西班牙语的最佳模型。
参见我们的 github 获取本文中提到的配置文件的完整示例和其他链接。
结论
Rasa 的美妙之处在于它简化了自然语言理解(NLU)、命名实体识别(NER)和对话管理(DM)的模型训练,这是面向任务的对话系统所需的三个基本工具。尽管我们做了很多好的编程来使我们的系统工作得像现在这样好,但是在没有任何真正的 Python 技能的情况下,您可能可以完成大约 80%的 Rasa 虚拟助手的构建。
随着自然语言处理领域令人兴奋的进步,如变形金刚和预训练的单词嵌入,对话式人工智能领域近年来取得了长足的进步,从说“对不起,我不明白”的机器人,到真正成为曾经需要单调乏味的人类工作的日常任务的可行解决方案。
从哲学上讲,这项技术的目标不是用机器人取代人类,而是将重复和“机器人化”的日常任务,如数据输入或预约安排,分配给虚拟助理,并将人类的大脑空间留给需要只有人类才具备的技能的工作类型,如创造力和批判性思维。MyTurn 是一个简单但有先见之明的例子,表明对话式人工智能不是为大型科技公司保留的工具,而是事实上每个人都可以通过 Rasa 和 HuggingFace 等免费开源技术获得。
建议阅读:
汤姆·博克里什,乔伊·福克纳,尼克·鲍洛夫斯基,艾伦·尼科尔, Rasa:开源语言理解和对话管理,2017 年 12 月 15 日
阿希什·瓦斯瓦尼、诺姆·沙泽尔、尼基·帕尔马、雅各布·乌兹科雷特、莱昂·琼斯、关注是你所需要的一切,2017 年 12 月 6 日
高剑锋(微软),米卡赫尔·格里(微软),李立宏(谷歌),对话式人工智能的神经方法:问题回答,面向任务的对话和社交聊天机器人,2019 年 9 月 10 日
Jacob Devlin Ming-Wei Chang Kenton Lee Kristina Toutanova Google AI Language, BERT:用于语言理解的深度双向转换器的预训练,2018 年 10 月 11 日
皈依吧,福雷斯,皈依吧!
在运行体验中预测订阅
凯文·哈特斯坦 是一位 洞察数据科学 的研究员(2020 年冬)。他在达特茅斯学院获得了认知神经科学博士学位。他的研究生研究将机器学习技术应用于功能性神经成像数据,以了解大脑如何解释照片和绘画中的物体身份。
“我们正在利用最先进的科学技术和周到的人类工艺,提供一个引人入胜的循证平台,为每个人带来健康生活,一次一个人。”- 里克·亨里克森,Ongo Science 首席执行官(https://blog.ongo.life/)
为了我的洞察项目,我与 Ongo Science 合作,这是一家位于旧金山的初创公司。Ongo 是一个平台,为健康和保健领域的内容创作者构建应用程序,并促进与用户之间的信息流动。大多数在线健康专家会发布关于营养、冥想和运动训练等主题的信息,并计算“赞”或阅读评论来解读它们的影响。Ongo 支持更详细的视图,为内容创建者提供关于用户目标、进度和挑战的见解。这些信息有助于指导和定制新内容,并最大限度地提高参与度和影响力。数据在个性化健康和保健中的作用正在扩大。事实上,研究人员估计,普通人一生中会产生超过 100 万千兆字节的健康数据。
作为设备、应用和专家之间的纽带,Ongo 致力于简化数据摄取和分析流程,帮助人们过上更健康的生活。在我的咨询项目中,我分析了来自 The Run Experience 的数据,这是一个 Ongo 应用程序,提供与训练、受伤预防和比赛相关的内容,以及个性化教练和跑步者的社区中心。我利用与该应用的互动以及智能手机和可穿戴设备的数据来预测哪些用户会转向高级订阅计划。我这个项目的名字来源于 1994 年电影《T2》《T3》《阿甘正传》《T4》《T5》《T6》《T7》中人们的热情,他们用“跑,阿甘,跑!”的喊声鼓励主角然而,在这种情况下,目标是鼓励跑步体验的用户将从免费版本转换为付费订阅。
逃跑…
用户保留是移动应用的一个大问题,大约 80%的用户在安装后 3 天内离开,90%在第一个月内离开。尽管付费用户通常只占大多数应用程序用户的一小部分,但他们不太可能离开,平均每月以 5-30%的速度波动。来自持续订阅者的续订是一个重要的收入来源——尤其是对于处于初创阶段的应用程序——《哈佛商业评论》的分析估计,仅增加 5%的留存率就可以导致收入长期增长高达 95%。健康和健身应用在留住忠诚用户方面特别有效,75%的用户每周至少使用这些应用两次,26%的用户每周使用超过 10 次。
考虑到这些统计数据,我的项目旨在确定用户最终是否会根据他们最初的应用程序使用情况转向高级订阅。这些信息有助于将激励和促销的目标对准可能不会订阅的活跃用户,从而增加忠实用户的基础和相关收入。
数据过滤和特征工程
我被允许访问亚马逊网络服务上托管的超过 20 亿行数据,包括来自 Run Experience 应用程序的活动,以及来自该应用程序跑步跟踪器的 GPS 数据和来自已链接其帐户的 iOS 用户的 Apple HealthKit 数据。一个数据表还包括关于用户设定目标的信息(与健康、伤害预防、比赛等相关)。)和订阅历史。我从下面描述的用户群中筛选出大约 2400 万行数据,并根据下载日期对其进行临时调整,以便汇总和检查应用使用初期的活动。
过滤
许多订阅者在下载应用程序后立即加入,可能是因为他们之前有过 YouTube 频道的跑步体验。许多其他人最初开始 7 天免费试用高级功能,一旦试用结束就订阅。
在用 Ongo 推出一款应用之前,Run Experience 已经是 #1 的 YouTube 跑步频道。可能是因为以前有过这个渠道的经验,许多应用程序用户在下载应用程序后立即开始付费订阅。Run Experience 还提供 7 天免费试用,许多用户在第一天就开始试用。这些用户中的大多数在试用结束时会转变。在最初的爆发后,用户会在一段可变的时间内继续订阅,所以我假设那些需要更长时间才能做出决定的人更有可能是跑步体验的新手,他们的决定可能基于与应用程序本身的交互,而不是之前对内容的体验。
定义问题
我选择关注前两周没有订阅的活跃用户。这个决定允许我排除已经熟悉该产品的用户,并在足够长的时间内整合数据,以区分哪些用户会订阅,哪些不会订阅。这些用户在前两周的登录总数相似。
分析中包括的用户具有相似的总体活动,通过用于预测的 2 周期间的登录次数进行估计(虚线左侧)。
特色工程
应用程序中的数据涵盖了各种各样的活动类型,包括观看锻炼视频的元数据、应用程序中记录的 GPS 跑步轨迹以及帖子和赞等社交内容。下载应用程序后,每个用户还会被提示选择一个目标——整体健康、预防受伤、比赛或其他。如果 iOS 设备上的用户有记录这些信息的智能设备,那么链接了他们的 Apple HealthKit 数据的用户也有关于他们的步数以及心率和体重的信息。
这些功能是根据跑步体验应用程序收集的训练、社交和 GPS 跑步数据设计的。链接他们的苹果健康工具包数据的用户也有关于每日步数以及心率和体重的信息(前提是他们有智能设备来记录这些测量数据)。
“会话”数据包括关于用户观看了什么视频、他们是否完成了视频以及对会话的反馈(赞成或反对)的信息。用户也可以加入一个“计划”,如 5 公里或半程马拉松训练计划,由旨在达到特定目标的会议视频组成。社交互动包括在论坛上发表问题和评论,以及喜欢其他用户的帖子。GPS 数据包括每次跑步的距离和时间以及其他指标。
从这些广泛的数据中,我设计了 19 个特征。这些包括应用内活动的测量,如开始的视频会话数量和完成的百分比,程序注册和社交互动,以及用户在 30 分钟内记录 500 步以上或在两周内记录心率升高(超过 120 次/分钟)的次数。我的特性涵盖了广泛的用户行为,但是这个项目的未来迭代可能包括从数据中更细粒度的细节设计的特性,比如评论的实际文本;GPS 跟踪跑步的距离、时间和高度;和每分钟平均心率。
特征选择和模型比较
我比较了逻辑回归和随机森林模型来预测订阅。逻辑回归使用独立变量的线性组合来估计二元分类标签的对数优势比(在这种情况下,订户与非订户)。该模型的优势在于,模型为这些特征学习的权重可以指导解释各个特征如何对预测做出贡献。不幸的是,相关特征会掩盖彼此的影响,导致预测特征的权重较低。随机森林分类是一种非线性集成模型,它使用 bagging 和随机特征采样来构建决策树森林,每个决策树都为最终预测贡献一张“选票”。在不相关的树上聚合信息增加了模型的鲁棒性,并在共线特征之间划分了重要性,但牺牲了解释的方便性,尽管仍然可以使用诸如基尼系数重要性等指标从模型中提取特征重要性。
Python 的 scikit-learn 包为这两个模型提供了简单的实现,以及交叉验证和评估的功能。我首先将数据分成 60/20/20 的训练/验证/测试部分。我对训练数据使用了 5 重交叉验证的递归特征消除(使用 scikit-learn 的 RFECV) 来为每个模型选择特征,在每个折叠内的训练和测试数据中对订阅者和非订阅者的比例进行分层。因为订阅者比非订阅者少得多,所以在初始化每个模型时,我使用 class_weight=“balanced” 参数对这些类进行加权,使其与它们的逆频率成比例。因为从商业角度来看,准确识别订户和非订户非常重要,所以我使用了 w 八分 F1 分数(精确度和召回率的组合,按频率加权,以及组合和跨类别加权)作为评估指标。该过程表明逻辑回归的最佳特征数为 6,随机森林的最佳特征数为 12。
用于特征选择、模型比较和模型评估的训练/验证/测试分割。
我用选定数量的特征,使用递归特征消除,在所有训练数据中重新训练每个模型。在这一步,我还使用了 SMOTE 来处理数据中的类不平衡。SMOTE 通过使用 k-Nearest-Neighbors 算法在特征空间中找到与该类的实际样本接近的点,在训练数据中创建少数类的新样本,重复该过程,直到训练数据中的正类和负类(订户和非订户)的数量相等。我通过评估验证数据的性能来比较这两个模型。随机森林表现更好,加权 F1 分数为. 74,相比之下,逻辑回归的加权 F1 分数为. 65。这是有意义的,因为大部分数据由各种活动类型的计数组成。随机森林建模特别适合这种类型的数据,因为它通过在组成森林的决策树的每个分支的每个要素的值范围内查找信息切割点来进行。与逻辑回归中隐含的线性假设相比,这种非线性方法可能导致更好的拟合。
最终模型评估
对于最终的模型评估,我在跨训练和验证集汇集的数据上训练了随机森林模型,并再次使用 SMOTE 来解决类不平衡问题。我使用了在模型比较阶段确定的相同特性,并在保留的测试集上评估了模型。最终的模型表现相当好,加权 F1 分数为 0.79,准确度为 0.78。
最终模型在延期测试中的性能指标 se*t .*AUC= . 74|加权 F1 = .78 | 精确度= .79
该模型在识别非订阅者方面表现尤为出色( Precision =.87 ,Recall =.86),这表明该模型将有助于识别尽管整体活动水平相对较高但不太可能订阅的用户。Ongo 和 Run Experience 可以将这一模式投入使用,激励这一人群进行转换,可能通过提供进一步的激励措施,如折扣率或高级教练服务预览。
功能重要性和可行见解
查看从随机森林模型中提取的功能重要性分数可以发现,在预测谁会转换时,操作尤其重要。到目前为止,两周内的登录次数是最重要的功能,开始的会话次数和来自 Apple HealthKit 的关于步数和心率升高的信息也显示出很大的重要性。早期干预可以带来更高的订阅率和收入的显著增加。
从随机森林模型中提取的特征重要性分数(基尼重要性)。红色条代表来自跑步体验应用的功能,黑色条代表来自 Apple HealthKit 的数据
这些功能很好地跟踪了直觉——开始并完成锻炼或有证据表明运动量较大的用户往往会坚持使用该应用程序。然而,有些违背直觉的是,用户的最初目标并不能预测最终的订阅,并且在特性选择阶段就被排除了。这表明,目标的差异通常与订阅可能性的变化无关,至少在我的项目中检查的样本中是如此。社交互动也不是很有预测性,尽管这些互动相当罕见。将这种见解转化为行动的另一种方式是 Ongo 和 Run Experience 鼓励用户专注于立即开始锻炼和跑步,而不是花时间在社区平台上滚动。虽然不清楚这种关系是否是因果关系,但遵循这种模式的用户更有可能订阅。
我很有兴趣看看苹果 HealthKit 数据中观察到的模式是否适用于下载应用程序后立即订阅的用户。一旦用户链接了他们的 HealthKit,之前记录的步数、心率和体重数据就可用于跑步体验。这些数据可以区分下载应用程序是否与活动增加有关,或者用户在下载应用程序之前是否已经比非用户更活跃。
我的最终成果包括一个在 Jupyter 笔记本中实现的工作流程,该工作流程从 Ongo 在 AWS 上的 S3 桶中获取数据;清理、预处理,并在时间上与应用程序下载日期保持一致;和运行体验应用程序中的 Apple HealthKit 数据和活动的工程师功能。然后将数据输入到模型中,以预测该应用程序的活跃用户在最初使用一段时间后没有订阅的订阅可能性。
使用机器学习将 pdf 转换为有声读物
使用 ML 将 pdf 和图像转换成有声读物或播客
这个项目最初是由 和佐藤 设计的。
我把这个帖子拍成了视频。看看吧!
散步——这是新冠肺炎最大的(也是唯一的)乐趣之一,不是吗?如今,你可以步行做任何事情:听新闻、参加会议,甚至写笔记(通过语音听写)。走路的时候唯一不能做的事情就是看机器学习研究论文。
还是不能?
在这篇文章中,我将向您展示如何使用机器学习,通过计算机视觉和文本到语音转换,将 PDF 或图像格式的文档转换为有声读物。这样,您可以在旅途中阅读研究论文。
但是你应该吗?这由你来决定。
想直接跳到代码?在 GitHub 上查看。
但首先:这要归功于 Kaz Sato ,一位在日本的谷歌工程师,他最初创建了这个项目(他正在根据计算机科学教科书创建日语有声读物)。我把借来的建筑稍加改动。
我们将通过三个主要步骤来构建 PDF 到有声读物的转换器:
- 从 pdf(或图像)中提取文本
- 决定将文本的哪些部分包含在有声读物中
- 将文本转换成口语
在这篇文章中,我将向您展示如何将这篇密集的研究论文(“通向自动规范化和通用人工智能的一条有前途的道路”)转换成有声读物。它看起来是这样的:
从 pdf 到文本
首先,我们将使用 OCR 从文档中提取文本。您可以使用许多不同类型的工具来完成这项工作,例如:
- Calamari ,在开源 Python 库上
- 谷歌云视觉人工智能 API
- (新!)Google Cloud 文档 AI API 。这个 API 不仅提取文本,还智能地解析表格和表单
对于这个项目,我使用了 Vision API(比新文档 AI API 便宜),发现质量相当不错。查看 Kaz 的 GitHub repo ,看看你到底是如何调用 API 的。
当您通过 Vision API 传递文档时,会返回原始文本和布局信息。下面是回应的样子:
如您所见,API 不仅返回页面上的原始文本,还返回每个字符的(x,y)位置。
在这一点上,如果你是个傻瓜,你可以把所有的原始文本直接转储到有声读物中。但是你不是一个傻瓜,你可能不希望这样做,因为那样你会听到各种各样无趣的东西,比如图像标题、页码、文档页脚等等。
所以下一步,我们将决定哪些原始文本应该包含在有声读物中。
在 pdf 中查找相关文本
我们希望在有声读物中包含研究论文的哪一部分?可能是论文的标题、作者的名字、章节标题、正文,但这些都没有用红色突出显示:
事实证明,识别这些相关部分是一个棘手的问题,有许多可能的解决方案。在这篇文章中,我将向您展示两种方法,一种是快速但不干净的方法,另一种是高质量但需要更多工作的方法。
使用机器学习查找相关文本
当你看一篇研究论文时,你可能很容易通过注意布局来掩饰不相关的部分:标题大而粗;字幕很小;正文为中等大小,位于页面中央。
利用页面上文本布局的空间信息,我们也可以训练一个机器学习模型来做到这一点。我们向模型展示了一堆正文、标题文本等等的例子,希望它能学会识别它们。
这是这个项目的原作者 Kaz 在试图将教科书变成有声读物时采取的方法。
在这篇文章的前面,我提到 Google Cloud Vision API 不仅返回页面上的文本,还返回它的布局。它将文本分组为块(页面、块、段落、单词和字符),并返回它在页面上的位置。具体来说,对于每个单词,它都返回一个类似如下的边界框:
"boundingBox": {
"normalizedVertices": [
{"x": 0.9248292,"y": 0.06006006},
{"x": 0.9384966,"y": 0.06006006},
{"x": 0.9384966,"y": 0.067567565},
{"x": 0.9248292,"y": 0.067567565}
]
}
上面的边框描述了一个单词在页面上的位置,以及它有多大。
我们可以用这些数据来训练一个模型。下面我们来看看 Kaz 收集的数据:
显然,Kaz 正在转换的书是日文的。对于每一个文本块,他都创建了一套特征来描述它:文本块中有多少个字符?它有多大,在页面上的什么位置?包围文本的框的长宽比是多少(例如,一个窄框可能只是一个侧栏)?
请注意,在上面的电子表格中还有一个名为“label”的列。这是因为,为了训练机器学习模型,我们需要一个带标签的训练数据集,模型可以从中“学习”对于训练数据中的每个文本块,Kaz 必须手动将该文本块标记为“正文”、“标题”、“标题”或“其他”。标注训练数据总是 ML 项目中比较耗时的部分之一,这次也不例外!
这就是为什么,当我重新创建 Kaz 的项目时,我使用了一个黑客来避免它(下面会有更多)。
在 Kaz 收集并标记了一堆文档后,他使用 Google Cloud AutoML Tables 训练了一个机器学习模型。这是一个基于表格数据构建模型的无代码工具。这里有一个小的 gif 展示了这个工具的样子,以及 Kaz 如何用它来训练一个模型:
如您所见,该模型相当准确(约 95%的精确度和召回率)!所以 Kaz 使用这个模型作为一个中间步骤来确定将哪些文本放入有声读物。
用 Spit、Glue 和字体大小查找相关文本
看,我不是娘娘腔——我一生中花了很多时间来标记训练数据(尽管,这些天来,你真的不必)。但是对于这个项目,我想知道我是否可以使用一个简单的启发式方法(一个可以让我避免标记数据的方法)来代替。
我觉得光看字体大小就能学到很多东西。比如:论文的标题很可能是用最大的文字尺寸写的。同时,正文是文档中最常见的文本。根据这些观察,我使用了这个启发法:
- 计算所有单词的字体大小
- 计算最常见的字体大小。用字体大小“body”来标记文本的每一位
- 计算最大字体大小。将该字体大小每一位文本标记为“标题”
第一步,计算字体大小,我减去单词周围的 y 坐标:
接下来,为了看看我的想法是否可行,我绘制了文档中字体大小的分布:
你可以看到在右边,有一个点(最大的文本)代表文档标题(woohoo!).同时,中间那一大段点,就是正文。标题和其他文档元数据,甚至更小的文本,都在图的左侧。
这个图表给了我信心,我的小技巧会起作用,至少对这个文档是这样(注意,它并不适用于所有的研究论文,尤其是那些有花哨的侧栏或垂直布局的论文!).
然而,这里有一个棘手的问题,正文字体大小在一个范围内(不是一个固定值)。这是因为我不是像我们通常认为的那样计算字体大小(即 12 磅),而是作为减去的像素值,并且有一些噪声。找出界限(例如,什么是正文的界限?),我用的是 Jenks Natural Breaks 算法(如果你没听说过这个,没关系——我在这个项目之前也没听说过!).
我知道我说的有点快,所以请在这里或 Twitter 上给我留言,我一定会回答你的问题!
从文本到口语
这个项目最有趣的部分无疑是选择一个电脑声音来做我们的解说员。为此,我使用了谷歌文本到语音转换 API,它使用了一种叫做 WaveNet 的技术来产生非常逼真的声音。API 支持许多声音和语言,你可以直接从产品页面的输入文本中自己比较它们。
我选择男声读论文题目,女声读论文正文。以下是由此产生的“有声读物”听起来的样子:
不算太坏,对吧?
反正目前就这些了。
如果你做出了这样的好东西,请与我分享,我会在社交媒体上展示它!