淘优惠

淘优惠

2020 年,人工智能、数据科学、机器学习必知的 20 个术语(下)

热门文章 0

淘宝搜:【天降红包222】领超级红包,京东搜:【天降红包222】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】


在本文中,我们将继续解释 2020 年人们应知必会的人工智能、机器学习、数据科学的术语,这些术语都很重要,包括双下降(Double Descent)、人工智能伦理、可解释性(可解释人工智能)、全栈数据科学、地理空间、GPT-2、自然语言生成(Natural Language Generation,NLG)、PyTorch、强化学习和 Transformer 架构。

本文是《2020 年,人工智能、数据科学、机器学习必知的 20 个术语》的下篇。

这些定义是由 KDnuggets 的编辑 Matthew Dearing、Matthew Mayo、Asel Mendis 和本文作者 Gregory Piatetsky 编著的。

在本文中,我们将解释:

  • 双下降(Double Descent)现象
  • 人工智能伦理
  • 可解释性(可解释人工智能)
  • 全栈数据科学
  • 地理空间
  • GPT-2
  • 自然语言生成(Natural Language Generation,NLG)
  • PyTorch
  • 强化学习
  • Transformer 架构

这是一个非常有趣的概念,顶级的人工智能研究人员 Pedro Domingos 称之为 2019 年机器学习理论中最重要的进展之一。这种现象如图 1 所示:

图 1:测试 / 训练误差与模型大小(来源:

误差先随着模型的增大而减小,然后随着模型开始过拟合而增大,但随着模型大小、数据大小或训练时间的增加,误差又会再次减小。

经典的统计理论认为,过大的模型会因为过拟合而变得更糟。然而,现代机器学习实践表明,一个非常大的深度学习模型通常要比一个较小的模型更好。

OpenAI 博客指出,这种情况发生在 CNN、ResNet 和 Transformer 中。OpenAI 研究人员观察到,当模型不够大,还无法适应训练集时,较大的模型会有较高的测试误差。然而,在超过这个阈值之后,拥有更多数据的大型模型开始表现得更好。

请阅读 OpenAI 的博客原文,以及 Rui Aguiar 更详细的解释。

人工智能伦理关注的是实用人工智能技术的伦理学。

人工智能伦理是一个非常广泛的领域,包含了各种各样看似非常不同的伦理关注方面。对人工智能的应用,以及所有类型的技术的担忧,更广泛地说,只要这些技术最初被构想出来的时候,就一直存在。然而,考虑到最近人工智能、机器学习和相关技术的爆炸式发展,以及它们越来越快地被广泛采用和融入社会,这些伦理问题已经上升为人工智能领域内外许多人关注的焦点。

虽然深奥和当前抽象的伦理问题(如有情感的机器人未来的潜在权利),也可以纳入人工智能伦理的框架之中,但眼下更为紧迫的问题,如人工智能系统的透明度、这些系统的潜在偏见,以及在所述系统的工程中包含所有类别的社会参与者的代表性,对大多数人来说,可能是更重大、更直接的问题。人工智能系统是如何作出决策的?这些系统对世界和其中的人们做出了什么样的假设?这些系统是由一个占主导地位的多数阶级、性别和整个社会的种族所构建的吗?

美国旧金山大学(University of San Francisco)应用数据伦理中心主任 Rachel Thomas 就人工智能伦理的工作做了如下阐述,它超越了与人工智能系统的底层创建直接相关的问题,并考虑到了众所周知的更广阔的前景:

创办科技公司,以合乎道德的方式打造产品; 倡导和推动更加公正的法律和政策; 试图追究不良行为者的责任; 以及该领域的研究、写作和教学。

自动驾驶汽车的出现,带来了与人工智能伦理相关的其他具体挑战,还有潜在的人工智能系统武器化,以及日益加剧的国际人工智能军备竞赛。与某些人要我们相信的相反,这些问题并非注定会出现在反乌托邦的未来,但这些问题需要一些批判性的思考、适当的准备、以及广泛的合作。即使我们认为已经充分考虑到了这一点,人工智能系统仍然可能被证明是独特的,存在地方性的问题,而人工智能系统的意外后果,人工智能伦理的另一个方面,还需要加以考虑。

随着人工智能和机器学习在我们生活中占据越来越大的比重,智能手机、医疗诊断、自动驾驶汽车、智能搜索、自动信贷决策等都应运而生。有了人工智能做出的决策,这个决策的一个重要方面就随之出现了:可解释性。人们通常可以解释他们基于知识的决策(这种解释是否准确,是一个单独的问题),这有助于其他人对此类决策的信任。人工智能和机器算法能够解释它们做出的决策吗?这对于下面很重要:

  • 提高对决策的理解与信任;
  • 确定责任或不利因素,以防万一;
  • 在决策中避免歧视和社会偏见。

我们注意到,GDPR 需要某种形式的可解释性。

随着美国国防部研究计划局(Defense Advanced Research Projects Agency,DARPA)在 2018 年启动 XAI 计划,可解释人工智能(Explainable AI,XAI)日渐成为一个主要领域。

图 2:可解释人工智能文氏图(Venn Diagram)。来源:

可解释性是一个涵盖了多方面的主题。它既包含单个模型,也包含整合它们的更大的系统。它不仅涉及模型输出的决策是否可以解释,而且还涉及围绕模型的整个过程和意图是否能够得到适当的解释。其目的的是在正确性和可解释性之间进行有效的权衡,同时提供一个良好的人机界面,帮助将模型转化为最终用户可理解的表示。

可解释人工智能的一些比较流行的方法包括 LIME 和 SHAP 等。

Google(可解释人工智能服务)、IBM AIX360 和其他供应商现在都提供了可解释性工具。

另请参见 KDnuggets 博文:Preet Gandhi 写的《可解释人工智能》(Explainable AI)和论文《可解释人工智能(XAI):概念、分类、机遇、负责任的人工智能面临的挑战》(Explainable Artificial Intelligence (XAI): Concepts, Taxonomies, Opportunities and Challenges toward Responsible AI)(arxiv 1910.10045)。

全栈数据科学家是数据科学独角兽的缩影。全栈数据科学家具备以下技能:统计学家,能够对现实生活中的场景进行建模;计算机科学家,能够管理数据库并将模型部署到 Web 上;商业人士:能够将洞察力和模型转化为可操作性的洞察力,提供给最终用户,而最终用户通常是不关心后端工作的高级管理人员。

下面是两个非常棒的演讲,可以让你了解端到端数据科学产品的不同细微之处。

  1. Emily Gorcenski 的《全栈数据科学:使用技术准备》(Going Full Stack with Data Science: Using Technical Readiness

视频地址:

  1. 视频:DataCamp 的#42《全栈数据科学》(与 Vicki Boykis 合作)。请阅读此视频的文字版。

视频地址:

地理空间是一个术语,指的是任何具有空间 / 位置 / 地理组成部分的数据。由于追踪用户行动轨迹并作为副产品创建地理空间的技术的出现,地理空间分析越来越受欢迎。用于空间分析的最著名的技术,称为地理信息系统(Geographic Information Systems,GIS),产品有 ArcGIS、QGIS、CARTO 和 MapInfo 等。

为了追踪当前新型冠状病毒的流行情况,约翰・霍普金斯大学(Johns Hopkins U.)系统科学与工程中心开发了 ARCGIS 仪表板 。

地理空间数据可用于从销售预测建模到评估政府资助计划的应用。因为数据是针对特定位置的,所以我们可以收集到很多见解。不同国家记录和测量其空间数据的方式不同,程度也不同。一个国家的地理边界是不同的,必须作为每个国家特有的边界来对待。

GPT-2 是 OpenAI 创建的基于 Transformer 的语言模型。GPT-2 是一种生成语言模型,这意味着它是基于模型以前学到的知识,通过逐字预测哪个词在序列中出现在下一个词来生成文本。在实践中,向模型展示用户提供的提示,然后生成后续单词。通过训练,GPT-2 可以用来预测大量(高达 40 GB)互联文本中的下一个单词,并且完全使用 Transformer 解码器块(这与 BERT 形成对比,BERT 使用编码器块)。有关 Transformer 的更多信息,请参见下面的内容。

GPT-2 并不是一项特别新颖的项目;然而,它与类似模型的区别在于,它可训练参数的数量,以及这些训练参数所需的存储大小。尽管 OpenAI 最初发布的是缩小版的训练模型――因为出于担心该模型可能会被恶意使用――但整个模型仍然包含了高达 15 亿个参数。这个 15 亿个可训练参数模型就需要 6.5 GB 的训练参数(与“训练模型”同义)存储。

GPT-2 一经发布,就引起了大量的炒作和广泛的关注,这在很大程度上是由于它所附带的一些精选的例子,其中最著名的例子是,记录了在安第斯山脉发现一头讲英语的独角兽的新闻报道,该报道可以在这里阅读。GPT-2 模型的一个独特应用以 AI Dungeon 的形式出现,AI Dungeon 是一个在线文本冒险游戏,将用户提供的文本作为输入到模型中的提示,生成的输出用于提升游戏和用户体验。你可以在这里试试 AI Dungeon。

尽管通过下一个单词预测生成文本是 GPT-2 和解码器块 Transformer 的主要功能,但它们在其他相关领域也显示出了潜力,比如语言翻译、文本摘要、音乐生成等等。有关 GPT-2 模型的技术细节和更多信息,请参阅 Jay Alammar 制作的 GPT-2 图解,实在太棒了。

在自然语言理解方面取得了重大进展:使计算机能够解释人类的输入并提供有意义的回应。许多人每天都通过个人设备享受着这项技术,比如 Amazon Alexa 和 Google Home。不出所料,孩子们真的很喜欢听笑话。

这里的技术是,机器学习的后端进行各种输入的训练,例如“请给我讲个笑话”,它就可以从规定的可用响应列表中选择一个。如果 Alexa 或 Google Home 可以讲一个原创的笑话,一个基于人类编写的大量笑话的训练而即兴创造出来的笑话,那会怎么样呢?这就是自然语言生成。

原创的笑话只是一个开始(经过训练的机器学习模型甚至可以变得很有趣吗?)。作为强大的应用程序自然语言生成正在开发,用于生成人类可理解的数据集摘要的分析。你还可以通过自然语言生成技术来探索计算机的创造性方面,这种技术可以输出原创的电影脚本,甚至是 David Hasselhoff 主演的电影脚本,以及基于文本的故事,类似于你可以学习的长短期记忆网络的教程,它是一种带有反馈的递归神经网络架构,这是今天的另一个热门研究课题。

虽然计算机生成语言的商业分析和娱乐应用可能很有吸引力,而且会改变文化,但在伦理方面的担忧已经开始升温。自然语言生成自动生成并散布的“虚假新闻”的能力正在引起人们的不安,即使它的意图并非出于邪恶。例如,OpenAI 一直在小心翼翼地发布他们的 GPT-2 语言模型,研究表明,该模型可以生成令人信服的文本输出,很难被发现是人工合成的,并且可以进行微调以防止滥用。现在,他们正在利用这项人工智能发展的研究,以更好地了解如何控制这些令人担忧的偏见和恶意使用文本生成器的可能性,人工智能可能会给人类带来麻烦。

Torch 包于 2002 年首次发布,并在 C 语言中实现,它是一个张量库,使用了一系列的算法开发,以支持深度学习。Facebook 人工智能研究室很喜欢 Torch,并在 2015 年初对该库进行了开源,该库还整合了许多机器学习工具。次年,他们发布了该框架的 Python 实现,名为 PyTorch,针对 GPU 加速进行了优化。

随着强大的 Torch 工具现在可供 Python 开发人员使用,许多主要参与者将 PyTorch 集成到他们的开发技术栈中。如今,这个曾经是 Facebook 内部的机器学习框架已经成为最常用的深度学习库之一,越来越多的企业和研究人员成为 PyTorch 用户,OpenAI 就是其中新进者之一。Google 在 2017 年发布的与之竞争的软件包 TensorFlow,从一开始就主宰了深度学习社区,但现在,显然有可能在 2020 年晚些时候被 PyTorch 赶超。

如果你正寻找你的第一个机器学习包来学习,或者你是一个经验丰富的 TensorFlow 用户,你可以从 PyTorch 开始,自己找出最适合你的开发需求的框架。

与监督学习和无监督学习一样,强化学习(Reinforcement Learning,RL)是机器学习的一种基本方法。其基本思想是一种训练算法,为尝试执行某些计算任务的试错决策“智能体”提供奖励反馈。换句话说,如果你在院子里扔一根棍子让名为 Rover 的狗子去取回来,而你的新狗子决定将棍子还给你作为奖励,那么下一次它将会更快、更有效地重复同样的决定。这种方法令人兴奋的特点是,无需标记数据,该模型就可以探索已知的和未知的数据,并通过编码的奖励引导来找到最优解决方案。

强化学习是国际象棋、视频游戏中令人难以置信的、破纪录的、战胜人类的竞赛之基础,也是 AlphaGo 的致命一击,AlphaGo 在没有任何指令硬编码到算法中情况下就学会了下围棋。然而,尽管人工智能超能力的这些发展意义重大,但它们都是在定义明确的计算机表示中执行的,比如规则不变的游戏。强化学习并不能直接推广到现实世界的混乱状态,就像 OpenAI Rubik 的 Cube 模型可以在模拟中解决难题一样,但是当通过机械臂进行迁移时,人们花了很多年才看到结果远非完美。

因此,在强化学习领域还有很多有待开发和改进的地方,人们在 2019 年见证了一个潜在的复兴正在进行。将强化学习扩展到现实世界,将是 2020 年的热门话题,重要的实现已经正在进行中。

Transformer 是一种基于自我注意力机制的新型神经网络架构,特别适合用于自然语言处理和自然语言理解。它是由 Google 人工智能研究人员在 2017 年的论文《注意力就是你所需要的一切》(Attention Is All You Need)中提出的。Transformer 是一种在编码器和解码器的帮助下将一个序列“转换”为另一个序列的架构,但它并不使用递归网络或长短期记忆网络。相反,它使用注意力机制,允许它查看输入序列中的其他位置,以帮助改善编码。

这里有一个例子,Jay Alammar 解释得很好。假设我们想翻译这句话:

“The animal didn’t cross the street because it was too tired”

这句话中的 “it” 是指什么呢?人们明白 “it” 指的是 “the animal”,而非 “street”,但这个问题,对计算机来说却很难。当对 “it” 一词进行编码时,自我注意力机制将注意力集中在 “The animal” 上,并将这些单词与 “it” 联系起来。

图 3:当 Transformer 对 “it” 一词进行编码时,注意力机制的一部分集中在 “The Animal” 上,并将它的表示与 “it” 的编码联系起来。来源:

Google 报告称,Transformer 在翻译任务方面明显优于其他方法。许多自然语言处理框架都使用了 Transformer 架构,比如 BERT(取自Bidirectional Encoder Representations from Transformers 的首写字母)及其后代。

如果你想看很棒的、可视化的图解,请查看 Jay Alammar 绘制的《Transformer 图解》(The Illustrated Transformer)。

作者简介:

Gregory Piatetsky,博士,KDnuggets 总裁,也是大数据、数据挖掘和数据科学领域的领军人物。它是领先的数据挖掘和数据科学研究会议 KDD 的联合创始人,也是 ACM SIGKDD 的联合创始人和前任主席。曾在两家初创公司担任首席科学家。

2021年10月23日通过了什么法律


原创 使用OpenAI CLIP链接图像和文本

介绍尽管深度学习已经彻底改变了计算机视觉和自然语言处理,但使用当前最先进的方法仍然很困难,需要相当多的专业知识。诸如对比语言图像预训练(CLIP)等OpenAI方法旨在降低这种复杂性,从而...

2021-10-30 23:26:36 3294 1

原创 HOG:概述

HOG是什么?方向梯度直方图,也称为HOG,是一种特征描述符,类似于Canny边缘检测器。它用于计算机视觉和图像处理中的目标检测。该技术统计图像局部区域中梯度方向的出现次数。该方法类似于边...

2021-10-29 19:57:48 2311

原创 人脑认知计算模型简介(上)

引入这是本系列的第一篇文章,即“腹侧颞叶皮层时空功能磁共振成像的认知计算建模”。将介绍认知计算建模的主题及其在大脑解码研究中的使用案例。让我们开始吧。所有相关资料都位于我的Github页面...

2021-10-27 22:31:41 918

原创 基于模式匹配的PCB基准标记检测

这可能很容易忘记,但我们的电子设备内部发生的一切并不是魔法。有些产品是如此复杂,以至于没有一个人能够准确地理解每个零件是如何相互作用的,而制造过程是存在的,因此出厂的产品能够正常工作,这一...

2021-10-26 22:16:25 180

原创 构建情绪检测应用程序

计算机视觉(Computer Vision,CV)可能是一个理论性很强的领域,需要有大量的ML和数学知识来理解为诸如目标检测、人脸识别和目标跟踪等主题提供动力的算法。如果你在理论上没有经验...

2021-10-25 22:00:07 1274

原创 在 PyTorch 中使用 Detectron2 进行对象检测的指南

目标检测是深度学习的流行应用之一。让我们首先考虑一个现实生活中的例子。大多数人会在手机中使用 Google 相册,它会根据“事物”选项下的照片自动将照片分组。我在下面附上一个片段。你可以观...

2021-10-24 22:10:28 1293

转载 双一流博士导师整理:最新的计算机视觉学习路线(含时间分配建议)

因工作需要,年初花了4个月左右时间学习了机器学习、神经网络相关的知识,工作日每天大概学习4-6个小时,周末每天大概10个小时,工作中的需求应对也得心应手了。想快速入门的话,从自己的经验看,...

2021-10-22 21:28:07 137

原创 使用卷积神经网络开发图像分类模型

简介我最近的一篇文章是关于卷积网络、它的工作和组件:在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。简而言之,CNN 是一种深度学习...

2021-10-22 21:28:07 1024 1

原创 提高计算机视觉任务的图像质量

介绍当我们开始从事任何基于计算机视觉的任务时,我们所有人都面临的几个问题是,要么是缺乏数据,要么是数据质量的问题。数据量较少仍然只有两种可能的解决方案,一种是尝试获取更多数据或继续使用不同...

2021-10-21 23:59:36 258

原创 使用 Python 实现的卷积神经网络初学者指南

目录卷积神经网络简介其组成部分输入层卷积层池化层全连接层CNN 在数据集上的实际实现CNN简介卷积神经网络是一种专为处理图像和视频而设计的深度学习算法。它以图像为输入,提取和学习图像的特征...

2021-10-19 23:24:23 5496 3

原创 使用 Tensorflow 2 进行自定义对象检测的一般方法

在本文中,将向你介绍如何使用 Tensorflow 2 训练你自己的自定义对象检测器。这不是进行特定类型检测的教程,而是我们可以用来检测任何东西的常用方法。要使用 Tensorflow 对...

2021-10-18 21:00:00 540

原创 使用 OpenCV 将卷积实现为图像过滤器

卷积简介卷积是计算机视觉 (CV) 中的一个流行术语。在讨论如何实现 CV 任务时,经常会提到卷积神经网络。因此,任何 CV 追求者都必须完全理解“卷积”一词。卷积是几个图像处理运算符使用...

2021-10-17 21:00:00 312

原创 使用 OpenCV 构建你的第一个可视化工具

介绍在当今世界,我们看到数以千计的优秀产品,以及销售这些产品的跨国公司。它们的共同点是它们是从一个想法不断发展而来的。每天,我们的脑海中都会有几十个想法,让我们深入思考并深入想象。从为窗帘...

2021-10-16 21:18:35 475

转载 有粉丝想转行推荐算法,我的一些看法

最近公众号后台收到一个读者的留言,他在某手机厂商做CV开发工作,想转行推荐系统,让我拿拿主意。从前途角度考虑,我是非常建议的。大厂必备核心――推荐系统从商业角度来讲,互联网主要起到平台作用...

2021-10-15 19:39:15 201

原创 使用 OpenCV 创建一个有趣的应用程序滤镜,如 Facebook!

介绍计算机视觉是一个越来越流行的关键词,从工作到娱乐,它的应用无处不在。在这篇文章中,我想给大家介绍一下计算机视觉和图像处理中常用的一些常用技术:按位算子、切片技术。然后,创建一个有趣的应...

2021-10-15 19:39:15 123

转载 中国计算机专业的大学生相比于美国差在哪里?

链接:https://www.zhihu.com/question/31074647编辑:深度学习与计算机视觉声明:仅做学术分享,侵删作者:邦彦https://www.zhihu.com/...

2021-10-13 22:00:00 204

转载 2021入坑图像分割,我该从哪儿入手?

推荐入门论文:《Fully Convolutional Networks for Semantic Segmentation》。FCN,卷积神经网络用于图像语义分割的开山之作。目前已经引用...

2021-10-12 21:00:00 48

原创 如何在 Python 中使用 OpenCV 在图像上添加水印

简介水印是企业和在线内容信用标记的重要组成部分。它可以以标志、签名或印章的形式出现,对创作者来说是独一无二的。在向数字世界中的对象创建者提供所有权或信用时,它是一个非常重要的工具。大多数专...

2021-10-11 23:36:32 662

原创 开始使用 OpenCV 进行对象跟踪

介绍OpenCV 是一个很好的处理图像和视频的工具。无论你是想让你的照片呈现 90 年代的黑白效果,还是执行复杂的数学运算,OpenCV 都可以随时为你服务。如果你对计算机视觉感兴趣,则必...

2021-10-09 23:58:57 660

原创 关于跳过连接你需要知道的一切

介绍我们需要训练更深的网络来执行复杂的任务。训练深度神经网络很复杂,不仅限于过度拟合、高计算成本,而且还有一些不一般的问题。我们将解决这些问题,以及深度学习社区的人们是如何解决这些问题的。...

2021-10-08 23:57:32 3291 1


学习pytorch框架技术 pytorch设计

pytorch框架百度百科,pytorch教程,pytorch框架原理,pytorch框架解读

本教程会介绍使用seq2seq模型实现一个chatbot,训练数据来自Cornell电影对话语料库。对话系统是目前的研究热点,它在客服、可穿戴设备和智能家居等场景有广泛应用。

传统的对话系统要么基于检索的方法――提前准备一个问答库,根据用户的输入寻找类似的问题和答案。这更像一个问答系统,它很难进行多轮的交互,而且答案是固定不变的。要么基于预先设置的对话流程,这主要用于slot-filling(Task-Oriented)的任务,比如查询机票需要用户提供日期,达到城市等信息。这种方法的缺点是比较死板,如果用户的意图在设计的流程之外,那么就无法处理,而且对话的流程也一般比较固定,要支持用户随意的话题内跳转和话题间切换比较困难。

因此目前学术界的研究热点是根据大量的对话数据,自动的End-to-End的使用Seq2Seq模型学习对话模型。它的好处是不需要人来设计这个对话流程,完全是数据驱动的方法。它的缺点是流程不受人(开发者)控制,在严肃的场景(比如客服)下使用会有比较大的风险,而且需要大量的对话数据,这在很多实际应用中是很难得到的。因此目前seq2seq模型的对话系统更多的是用于类似小冰的闲聊机器人上,最近也有不少论文研究把这种方法用于task-oriented的任务,但还不是太成熟,在业界还很少被使用。

本文使用的Cornell电影对话语料库就是偏向于闲聊的语料库。

本教程的主要内容参考了PyTorch官方教程。读者可以从这里获取完整代码。 下面是这个教程实现的对话效果示例:

首先我们通过下载链接下载训练语料库,这是一个zip文件,把它下载后解压到项目目录的子目录data下。接下来我们导入需要用到的模块,这主要是PyTorch的模块:

接下来我们需要对原始数据进行变换然后用合适的数据结构加载到内存里。

Cornell电影对话语料库是电影人物的对话数据,它包括:

  • 10,292对电影人物(一部电影有多个人物,他们两两之间可能存在对话)的220,579个对话
  • 617部电影的9,035个人物
  • 总共304,713个utterance(utterance是对话中的语音片段,不一定是完整的句子)

这个数据集是比较大并且多样的(diverse),语言形式、时代和情感都有很多样。这样的数据可以使得我们的chatbot对于不同的输入更加鲁棒(robust)。

首先我们来看一下原始数据长什么样:

解压后的目录有很多文件,我们会用到的文件包括movie_lines.txt。上面的代码输出这个文件的前10行,结果如下:

注意:上面的move_lines.txt每行都是一个utterance,但是这个文件看不出哪些utterance是组成一段对话的,这需要?movie_conversations.txt?文件:

每一行用”+++$+++”分割成4列,第一列表示第一个人物的ID,第二列表示第二个人物的ID,第三列表示电影的ID,第四列表示这两个人物在这部电影中的一段对话,比如第一行的表示人物u0和u2在电影m0中的一段对话包含ID为L194、L195、L196和L197的4个utterance。注意:两个人物在一部电影中会有多段对话,中间可能穿插其他人之间的对话,而且即使中间没有其他人说话,这两个人物对话的内容从语义上也可能是属于不同的对话(话题)。所以我们看到第二行还是u0和u2在电影m0中的对话,它包含L198和L199两个utterance,L198是紧接着L197之后的,但是它们属于两个对话(话题)。

为了使用方便,我们会把原始数据处理成一个新的文件,这个新文件的每一行都是用TAB分割问题(query)和答案(response)对。为了实现这个目的,我们首先定义一些用于parsing原始文件?movie_lines.txt?的辅助函数。

  • ?把movie_lines.txt?文件切分成 (lineID, characterID, movieID, character, text)
  • ?把上面的行group成一个个多轮的对话
  • ?从上面的每个对话中抽取句对

接下来我们利用上面的3个函数对原始数据进行处理,最终得到formatted_movie_lines.txt

上面的代码会生成一个新的文件formatted_movie_lines.txt,这文件每一行包含一对句对,用tab分割。下面是前十行:

接下来我们需要构建词典然后把问答句对加载到内存里。

我们的输入是一个句对,每个句子都是词的序列,但是机器学习只能处理数值,因此我们需要建立词到数字ID的映射。

为此,我们会定义一个类,它会保存词到ID的映射,同时也保存反向的从ID到词的映射。除此之外,它还记录每个词出现的次数,以及总共出现的词的个数。这个类提供方法来增加一个词,?方法来增加句子,也提供方法来去除低频的词。

有了上面的Voc类我们就可以通过问答句对来构建词典了。但是在构建之前我们需要进行一些预处理。

首先我们需要使用函数来把unicode字符变成ascii,比如把à变成a。注意,这里的代码只是用于处理西方文字,如果是中文,这个函数直接会丢弃掉。接下来把所有字母变成小写同时丢弃掉字母和常见标点(.!?)之外的所有字符。最后为了训练收敛,我们会用函数去掉长度超过的句子(句对)。

上面的代码的输出为:

我们可以看到,原来共有221282个句对,经过处理后我们只保留了64271个句对。

另外为了收敛更快,我们可以去除掉一些低频词。这可以分为两步:

1) 使用函数去掉频次低于?的词。

2) 去掉包含低频词的句子(只保留这样的句子――每一个词都是高频的,也就是在voc中出现的)

代码的输出为:

18005个词之中,频次大于等于3的只有43%,去掉低频的57%的词之后,保留的句子为53165,占比为82%。

前面我们构建了词典,并且对训练数据进行预处理并且滤掉一些句对,但是模型最终用到的是Tensor。最简单的办法是一次处理一个句对,那么上面得到的句对直接就可以使用。但是为了加快训练速度,尤其是重复利用GPU的并行能力,我们需要一次处理一个batch的数据。

对于某些问题,比如图像来说,输入可能是固定大小的(或者通过预处理缩放成固定大小),但是对于文本来说,我们很难把一个二十个词的句子”缩放”成十个词同时还保持语义不变。但是为了充分利用GPU等计算自由,我们又必须变成固定大小的Tensor,因此我们通常会使用Padding的技巧,把短的句子补充上零使得输入大小是(batch, max_length),这样通过一次就能实现一个batch数据的forward或者backward计算。当然padding的部分的结果是没有意义的,比如某个句子实际长度是5,而max_length是10,那么最终forward的输出应该是第5个时刻的输出,后面5个时刻计算是无用功。方向计算梯度的时候也是类似的,我们需要从第5个时刻开始反向计算梯度。为了提高效率,我们通常把长度接近的训练数据放到一个batch里面,这样无用的计算是最少的。因此我们通常把全部训练数据根据长度划分成一些组,比如长度小于4的一组,长度4到8的一组,长度8到12的一组,…。然后每次随机的选择一个组,再随机的从一组里选择batch个数据。不过本教程并没有这么做,而是每次随机的从所有pair里随机选择batch个数据。

原始的输入通常是batch个list,表示batch个句子,因此自然的表示方法为(batch, max_length),这种表示方法第一维是batch,每移动一个下标得到的是一个样本的max_length个词(包括padding)。因为RNN的依赖关系,我们在计算t+1时刻必须知道t时刻的结果,因此我们无法用多个核同时计算一个样本的forward。但是不同样本之间是没有依赖关系的,因此我们可以在根据t时刻batch样本的当前状态计算batch个样本的输出和新状态,然后再计算t+2时刻,…。为了便于GPU一次取出t时刻的batch个数据,我们通常把输入从(batch, max_length)变成(max_length, batch),这样使得t时刻的batch个数据在内存(显存)中是连续的,从而读取效率更高。这个过程如下图所示,原始输入的大小是(batch=6, max_length=4),转置之后变成(4,6)。这样某个时刻的6个样本数据在内存中是连续的。

因此我们会用一些工具函数来实现上述处理。

函数把batch个句子padding后变成一个LongTensor,大小是(max_length, batch),同时会返回一个大小是batch的list lengths,说明每个句子的实际长度,这个参数后面会传给PyTorch,从而在forward和backward计算的时候使用实际的长度。

函数和类似,但是它输出的第二个参数不是lengths,而是一个大小为(max_length, batch)的mask矩阵(tensor),某位是0表示这个位置是padding,1表示不是padding,这样做的目的是后面计算方便。当然这两种表示是等价的,只不过lengths表示更加紧凑,但是计算起来不同方便,而mask矩阵和outputVar直接相乘就可以把padding的位置给mask(变成0)掉,这在计算loss时会非常方便。

?则利用上面的两个函数把一个batch的句对处理成合适的输入和输出Tensor。

示例的输出为:

我们可以看到input_variable的每一列表示一个样本,而每一行表示batch(5)个样本在这个时刻的值。而lengths表示真实的长度。类似的target_variable也是每一列表示一个样本,而mask的shape和target_variable一样,如果某个位置是0,则表示padding。

我们这个chatbot的核心是一个sequence-to-sequence(seq2seq)模型。 seq2seq模型的输入是一个变长的序列,而输出也是一个变长的序列。而且这两个序列的长度并不相同。一般我们使用RNN来处理变长的序列,Sutskever等人的论文发现通过使用两个RNN可以解决这类问题。这类问题的输入和输出都是变长的而且长度不一样,包括问答系统、机器翻译、自动摘要等等都可以使用seq2seq模型来解决。其中一个RNN叫做Encoder,它把变长的输入序列编码成一个固定长度的context向量,我们一般可以认为这个向量包含了输入句子的语义。而第二个RNN叫做Decoder,初始隐状态是Encoder的输出context向量,输入是(表示句子开始的特殊Token),然后用RNN计算第一个时刻的输出,接着用第一个时刻的输出和隐状态计算第二个时刻的输出和新的隐状态,...,直到某个时刻输出特殊的(表示句子结束的特殊Token)或者长度超过一个阈值。Seq2Seq模型如下图所示。

Encoder是个RNN,它会遍历输入的每一个Token(词),每个时刻的输入是上一个时刻的隐状态和输入,然后会有一个输出和新的隐状态。这个新的隐状态会作为下一个时刻的输入隐状态。每个时刻都有一个输出,对于seq2seq模型来说,我们通常只保留最后一个时刻的隐状态,认为它编码了整个句子的语义,但是后面我们会用到Attention机制,它还会用到Encoder每个时刻的输出。Encoder处理结束后会把最后一个时刻的隐状态作为Decoder的初始隐状态。

实际我们通常使用多层的Gated Recurrent Unit(GRU)或者LSTM来作为Encoder,这里使用GRU,读者可以参考Cho等人2014年的[论文]。

此外我们会使用双向的RNN,如下图所示。

注意在接入RNN之前会有一个层,用来把每一个词(ID或者one-hot向量)映射成一个连续的稠密的向量,我们可以认为这个向量编码了一个词的语义。在我们的模型里,我们把它的大小定义成和RNN的隐状态大小一样(但是并不是一定要一样)。有了Embedding之后,模型会把相似的词编码成相似的向量(距离比较近)。

最后,为了把padding的batch数据传给RNN,我们需要使用下面的两个函数来进行pack和unpack,后面我们会详细介绍它们。这两个函数是:

计算图:

1) 把词的ID通过Embedding层变成向量。 2) 把padding后的数据进行pack。 3) 传入GRU进行Forward计算。 4) Unpack计算结果 5) 把双向GRU的结果向量加起来。 6) 返回(所有时刻的)输出和最后时刻的隐状态。

输入:

  • : 一个batch的输入句子,shape是(max_length, batch_size)
  • : 一个长度为batch的list,表示句子的实际长度。
  • : 初始化隐状态(通常是零),shape是(n_layers x num_directions, batch_size, hidden_size)

输出:

  • : 最后一层GRU的输出向量(双向的向量加在了一起),shape(max_length, batch_size, hidden_size)
  • : 最后一个时刻的隐状态,shape是(n_layers x num_directions, batch_size, hidden_size)

EncoderRNN代码如下,请读者详细阅读