# 1. 人工智能
# 1.1 人工智能概述
人工智能是一种模拟人类智能的技术,它可以让计算机完成类似于人类的任务,例如语音识别、图像识别、自然语言处理和决策制定等。人工智能的核心是机器学习,它是一种让计算机从数据中学习的技术。随着技术的不断发展,人工智能正在被越来越广泛地应用于各个领域,例如医疗、金融、交通和制造业等。
# 1.1.1 人工智能的发展历史
下图是从1950年至2017年之间,人工智能领域出现的一些里程碑式的事件。总结下来会分为3大阶段:
[1] 第一次浪潮(非智能对话机器人)-- 20世纪50年代到60年代
- 1950年10月,图灵提出了人工智能(AI)的概念,同时提出了图灵测试来测试 AI。图灵测试提出没有几年,人们就看到了计算机通过图灵测试的“曙光”
- 1966年,心理治疗机器人 ELIZA 诞生,它的实现逻辑非常简单,就是一个有限的对话库,当病人说出某个关键词时,机器人就回复特定的话。
- 第一次浪潮并没有使用什么全新的技术,而是用一些技巧让计算机看上去像是真人,计算机本身并没有智能。
[2] 第二次浪潮(语音识别)-- 20世纪80年代到90年代
- 在第二次浪潮中,语音识别是最具代表性的几项突破之一。核心突破原因就是放弃了符号学派的思路,改为了统计思路解决实际问题。在《人工智能》一书中,李开复详细介绍了这个过程,他也是参与其中的重要人物之一。
- 第二次浪潮最大的突破是改变了思路,摒弃了符号学派的思路,转而使用了统计学思路解决问题。
[3] 第三次浪潮(深度学习+大数据)-- 21世纪初
- 2006年是深度学习发展史的分水岭。杰弗里辛顿在这一年发表了《一种深度置信网络的快速学习算法》,其他重要的深度学习学术文章也在这一年被发布,在基本理论层面取得了若干重大突破。
- 之所以第三次浪潮会来主要是2个条件已经成熟:1)2000年后互联网行业飞速发展形成了海量数据,同时数据存储的成本也快速下降,使得海量数据的存储和分析成为了可能。2)GPU的不断成熟提供了必要的算力支持,提高了算法的可用性,降低了算力的成本。
- 在各种条件成熟后,深度学习发挥出了强大的能力。在语音识别、图像识别、NLP等领域不断刷新纪录。让 AI 产品真正达到了可用(例如语音识别的错误率只有6%,人脸识别的准确率超过人类,BERT在11项表现中超过人类…)的阶段。
- 第三次浪潮来袭,主要是因为大数据和算力条件具备,这样深度学习可以发挥出巨大的威力,并且 AI 的表现已经超越人类,可以达到“可用”的阶段,而不只是科学研究。
人工智能3次浪潮的不同之处
- 前两次热潮是学术研究主导的,第三次热潮是现实商业需求主导的。
- 前两次热潮多是市场宣传层面的,而第三次热潮是商业模式层面的。
- 前两次热潮多是学术界在劝说政府和投资人投钱,第三次热潮多是投资人主动向热点领域的学术项目和创业项目投钱。
- 前两次热潮更多时提出问题,第三次热潮更多时解决问题。
# 1.1.2 人工智能的3个级别
这里将人工智能分为3个级别,分别是:弱人工智能、强人工智能、超人工智能。
[1] 弱人工智能
- 又称限制领域人工智能(Narrow AI)或应用型人工智能(Applied AI),指的是专注于且只能解决特定领域问题的人工智能。
- 例如:AlphaGo、Siri、FaceID……
[2] 强人工智能
- 又称通用人工智能(Artificial General Intelligence)或完全人工智能(Full AI),指的是可以胜任人类所有工作的人工智能。
- 强人工智能具备以下能力:1)存在不确定性因素时进行推理,使用策略,解决问题,制定决策的能力。2)知识表示的能力,包括常识性知识的表示能力。3)规划能力。4)学习能力。5)使用自然语言进行交流沟通的能力。6)将上述能力整合起来实现既定目标的能力。
[3] 超人工智能
- 假设计算机程序通过不断发展,可以比世界上最聪明,最有天赋的人类还聪明,那么,由此产生的人工智能系统就可以被称为超人工智能。
目前所处的阶段
- 我们当前所处的阶段是弱人工智能,强人工智能还没有实现,而超人工智能更是连影子都看不到,所以“特定领域”目前还是 AI 无法逾越的边界。
- ChatGPT 是一种基于规则和机器学习的聊天机器人,它可以通过对话和预定义的回答来与用户交互。虽然它可以回答许多常见问题,但它不是强人工智能。强人工智能是指具有类似于人类智力的自主决策和学习能力的 AI 系统。(摘自ChatGPT自己的回答~)
# 1.1.3 人工智能的能力边界
从理论层面来解释 AI 的能力边界,图灵在上世纪30年代中期,就在思考3个问题:
- 世界上是否所有数学问题都有明确的答案?
- 如果有明确的答案,是否可以通过有限的步骤计算出答案?
- 对于那些有可能在有限步骤计算出来的数学问题,能否有一种假象的机械,让他不断运动,最后当机器停下来的时候,那个数学问题就解决了?
图灵设计出来一套方法,后人称它为图灵机。今天所有的计算机,包括全世界正在设计的新的计算机,从解决问题的能力来讲,都没有超出图灵机的范畴。通过上面的3个问题,图灵已经划出了界限,这个界限不但适用于今天的 AI ,也适用于未来的 AI 。
在一些特定场景中, AI 可以表现的很好,但是在大部分场景中,AI 并没有什么用。
- 世界上有很多问题,只有一小部分是数学问题。
- 在数学问题里,只有一小部分是有解的。
- 在有解的问题中,只有一部分是理想状态的图灵机可以解决的。
- 在后一部分(图灵机可解决的部分),又只有一部分是今天的计算机可以解决的。
- 而 AI 可以解决的问题,又只是计算机可以解决问题的一部分。
# 1.1.4 传统软件与人工智能对比
传统软件是「if-then」的基本逻辑,人类通过自己的经验总结出一些有效的规则,然后让计算机自动的运行这些规则。传统软件永远不可能超越人类的知识边界,因为所有规则都是人类制定的。简单的说:传统软件是「基于规则」的,需要人为的设定条件,并且告诉计算机符合这个条件后该做什么。
人工智能现在已经发展出很多不同分支,技术原理也多种多样,这里只介绍当下最火的深度学习。深度学习的技术原理跟传统软件的逻辑完全不同:机器从「特定的」大量数据中总结规律,归纳出某些「特定的知识」,然后将这种「知识」应用到现实场景中去解决实际问题。
# 1.1.5 机器学习、人工智能、深度学习的关系
1956 年提出 AI 概念,短短3年后(1959) Arthur Samuel 就提出了机器学习的概念:
Field of study that gives computers the ability to learn without being explicitly programmed.(机器学习研究和构建的是一种特殊算法,能够让计算机自己在数据中学习从而进行预测)
所以,机器学习不是某种具体的算法,而是很多算法的统称。机器学习包含了很多种不同的算法,深度学习就是其中之一,其他方法包括决策树,聚类,贝叶斯等。深度学习的灵感来自大脑的结构和功能,即许多神经元的互连。人工神经网络(ANN)是模拟大脑生物结构的算法。不管是机器学习还是深度学习,都属于人工智能(AI)的范畴。所以人工智能、机器学习、深度学习可以用下面的图来表示:
# 1.2 人工智能赋能评估
# 1.2.1 数据角度评估
[1] 基于规则的旧时代
在人工智能普及之前,大家用的产品都是「基于规则」的。我们通过总结规则,然后让计算机自动的执行这些规则。基于规则的好处就是:所以人都能知道在什么情况下得到什么结果,一切都是可以预判的。但是基于规则的方法也有很大的弊端:很多问题,很难(甚至无法)总结出有效的规则。
[2] 基于数据的 AI 时代
人工智能发展到现在,最核心的底层逻辑是:「基于数据」。简单说就是:从海量数据中找规律,这些规律是很抽象的,并不能总结成具象的规则。比如:
- 给机器看海量的猫和狗的照片,它就具备了「区分猫和狗」的能力
- 给机器海量的中英文对照文章,它就具备了「中英文翻译」的能力
- 给机器海量的文章,它甚至可以具备「写文章」的能力
基于数据的好处是:只要有足够多的优质数据,那么机器就能学会某些技能,数据越多,能力越强。
但是基于数据的方法也有明显的弊端:机器只能告诉你「是什么」,但是无法告诉你「为什么」。
[3] 数据角度评估的3要素
由于人工智能是「基于数据」的,因此想要用人工智能,需要考虑业务场景的数据3要素:1)数据可获取 2)数据全面 3)数据多。
它们3个类似金字塔的结构,先有「数据可获取」再谈「数据全面」,有了「数据全面」再谈「数据多」。
- 数据可获取:想要解决问题,就需要具备「跟这个问题相关的数据」。比如给机器看海量的猫和狗的照片,它就具备了「区分猫和狗」的能力。这里需要的数据不光是照片本身,还需要将照片里的猫和狗标注出来。
- 数据全面:假如我们只能看到 10% 的照片,现在让你区分照片中是猫还是狗,这会非常难。当我们能看到照片的 50% 时,还能猜一下。当我们可以看到100%的照片时,就很容易分辨了。
- 数据多:猫大概有40多个品种,狗大概有接近200个品种,并且照片可以从不同的角度,不同的背景,不同的光线下拍摄,会产生无数种组合。想要有效的区分猫和狗,需要大量的不同的照片才行。kaggle(很权威的 AI 竞赛网站)上有很多区分猫和狗的训练数据,大部分都是上万的量级。区分猫和狗这种非常简单的任务都需要上万的数据,对于更复杂的任务,就需要上百万甚至上亿的数据。具体要多少跟你要解决的问题复杂度、模型选择、预期结果都有关系。不过有一条原则是不会变:数据越多,效果越好。
# 1.2.2 特征角度评估
[1] 特征评估及人工智能基本原理
当我们看过很多俄罗斯人和其他国家的人时,我们就会根据经验总结出俄罗斯人的特征:鼻子长、个字高、蓝眼睛、白皮肤、眼窝深、剃毛发达、说俄罗斯语…
当我们遇到一个没见过的外国人时,我们就用这套「经验」来套在这个人身上,看是否符合,如果很多特征都符合,那么就会猜测这个是俄罗斯人。
人工智能的原理基本就是上面的过程,如下图:
[2] 特征象限图
并非所有问题都需要 AI 来解决,AI 的优势是可以处理海量的特征,不但可以处理表面的特征,还能找到背后隐藏的特征。当我们把特征数量和确定性画一个坐标,就能指导我们什么问题适合用 AI,什么问题不适合用:
- 特征少+确定性弱:适合人工解决
- 特征少+确定性强:适合规则解决
- 特征多+确定性强:适合规则解决
- 特征多+确定性弱:「可以考虑」 AI 解决
# 1.2.3 学习角度评估
基于规则的能力边界很小,很多实际问题无法通过规则的方法来解决。人工智能可以扩大计算机的能力边界,除了扩大能力边界外,人工智能还有一个非常重要的特性——持续学习,不断提升能力上限。
想要让机器实现持续学习的能力,需要具备2个条件:1)是否可以获得反馈数据?2)数据是否可以形成闭环?
[1] 有效的反馈
跟人类识字的学习过程类似,机器也需要「有效的反馈」来实现持续的学习,如果没有反馈数据,那么有问题的地方会一直存在问题,永远无法进步。
[2] 数据可以形成闭环
所谓的数据闭环就是将「行动 – 反馈 – 修正 – 再行动」循环自动的在机器上运转,完全不需要人参与。
# 1.2.4 黑箱角度评估
深度学习的工作原理不是讲逻辑(基于规则),而是大力出奇迹(基于统计),这就从根本上会导致两个问题:
- 深度学习只能告诉你「是什么」,但是不能告诉你「为什么」
- 没人能预知在什么情况下会出现错误
下面的图片就会展示一些人工智能所犯下的「低级错误」。而最可怕的是:当我们发现问题时,并不能针对具体问题来对症下药。
- 过去的计算机科学大部分是基于规则的,可以做到对症下药。
- 而深度学习则完全不一样,当我们发现问题时,只能全局优化(比如灌更多的数据)。
由于以上局限性,评估哪些问题适合使用AI的时候,可以从2个角度来评估:1)是否需要解释 2)错误容忍度
我们先从这2个角度来看看普及率较高的AI应用:
案例 | 是否需要解释 | 错误容忍度 |
---|---|---|
语音识别 | 用户只关心效果好不好,并不关心背后的原理是什么 | 偶尔出现一些错误并不影响对整句话的理解。少量出错是可以接受的。 |
人脸识别 | 同上 | 相比语音识别,用户对出错的容忍度要低一些,因为需要重新刷脸。 |
机器翻译 | 同上 | 跟语音识别类似,只要大面上准确,并不影响整体的理解。 |
我们再看一些 AI 和人力结合的具体应用:
案例 | 是否需要解释 | 错误容忍度 |
---|---|---|
智能客服 | 用户不关心是人工服务还是机器服务,只要能解决我的问题就行 | 如果机器客服不能理解我的意图,无法帮我解决问题,用户会很不满意。所以当机器搞不定 的时候需要人工来补位 |
内容审核 | 对于审核不通过的内容,需要解释原因。通过的内容不需要解释为什么。 | 有一种职业叫「鉴黄师」,目前正在逐步被机器替代,但是并没有完全替代,因为有时候机器会拿不准,这个时候人工来复审 |
最后看一些不适合AI落地的场景:
案例 | 是否需要解释 | 错误容忍度 |
---|---|---|
推导定理 | 科学是绝对严谨的,一定是从逻辑上推导出来的,而不是统计出来的。 | 如果有例外就不能称作定理,一定是绝对正确没有错误的。 |
写论文 | 人工智能已经可以写小说,诗歌,散文。但是论文这种文体要求非常严谨的上下文逻辑。 | 论文里是不允许有错误的,全文的逻辑要非常清晰,哪怕一个细节出现了逻辑问题,也会造成整篇论文没有价值。 |
如果我们把上面提到的案例全部放在象限中,大致如下:
所以,在评估的时候有3条原则:
- 解决方案越需要解释背后的原因,越不适合用深度学习。
- 对错误的容忍度越低,越不适合使用深度学习。
- 上面2条并非绝对判断标准,还需要看商业价值和性价比,自动驾驶和医疗就是反例。
# 2. 机器学习
# 2.1 机器学习概述
# 2.1.1 机器学习的基本思路
无论使用什么算法,使用什么样的数据,最根本的思路都是以下3步:
- 把现实生活中的问题抽象成数学模型,并且清楚模型中不同参数的作用。
- 利用数学方法对这个数学模型进行求解,从而解决现实生活中的问题。
- 评估这个数学模型,是否真正的解决了现实生活中的问题,解决的如何?
当我们理解了这个基本思路,就能发现:不是所有问题都可以转换成数学问题的,那些没有办法转换的现实问题 AI 就没有办法解决,同时最难的部分也就是把现实问题转换为数学问题这一步。
# 2.1.2 监督学习、无监督学习、强化学习
机器学习根据训练方法大致可以分为3大类:监督学习、无监督学习、强化学习。其他诸如“半监督学习”之类的说法都是基于上面3类的变种,本质没有改变。
[1] 监督学习
- 在分类过程中,如果所有训练数据都有标签,则为有监督学习,用于分类或者回归。典型的例子就是KNN、SVM。
- 举例:不仅把书给学生进行训练给书本分类的能力,而且把分类的结果(哪本书属于哪些类别)也给了学生做标准参考。
[2] 无监督学习
- 如果数据没有标签,就是无监督学习了。比如:k-means聚类算法、主成分分析
- 举例:只给学生进行未分类的书本进行训练,不给标准参考,学生只能自己分析哪些书比较像,根据相同与相似点列出清单,说明哪些书比较可能是同一类别的。
[3] 半监督学习
- 其训练数据的一部分是有标签的,另一部分没有标签,而没标签数据的数量常常远远大于有标签数据数量(这也是符合现实情况的)。
- 隐藏在半监督学习下的基本规律在于:数据的分布必然不是完全随机的,通过一些有标签数据的局部特征,以及更多没标签数据的整体分布,就可以得到可以接受甚至是非常好的分类结果。可以用来分类、回归、聚类、降维。
- 举例:给学生很多未分类的书本与少量的清单,清单上说明哪些书属于同一类别。
[4] 强化学习
- 强化学习更接近生物学习的本质,因此有望获得更高的智能。它关注的是智能体如何在环境中采取一系列行为,从而获得最大的累积回报。通过强化学习,一个智能体应该知道在什么状态下应该采取什么行为。
- 举例:最典型的场景就是打游戏。2019年1月25日,AlphaStar(Google研发的,采用了强化学习的训练方式) 完虐星际争霸的职业选手“TLO”和“MANA”。
# 2.1.3 机器学习实操的7个步骤
机器学习在实际操作层面一共分为7步:1)收集数据 2)数据准备 3)选择模型 4)训练 5)评估 6)参数调整 7)预估。
实操案例
假设我们的任务是通过酒精度和颜色来区分红酒和啤酒,下面详细介绍一下机器学习中每一个步骤是如何工作的。
[1] 收集数据
我们在超市买来一堆不同种类的啤酒和红酒,然后再买来测量颜色的光谱仪和用于测量酒精度的设备。这个时候,我们把买来的所有酒都标记出他的颜色和酒精度,会形成下面这张表格。
颜色 | 酒精度 | 种类 |
---|---|---|
610 | 5 | 啤酒 |
599 | 13 | 红酒 |
693 | 14 | 红酒 |
… | … | … |
这一步非常重要,因为数据的数量和质量直接决定了预测模型的好坏。
[2] 数据准备
在这个例子中,我们的数据是很工整的,但是在实际情况中,我们收集到的数据会有很多问题,所以会涉及到数据清洗等工作。
当数据本身没有什么问题后,我们将数据分成3个部分:训练集(60%)、验证集(20%)、测试集(20%),用于后面的验证和评估工作。
[3] 选择模型
研究人员和数据科学家多年来创造了许多模型。有些非常适合图像数据,有些非常适合于序列,有些用于数字数据,有些用于基于文本的数据。在这个例子中,由于只有2个特征,颜色和酒精度,我们可以使用一个小的线性模型,这是一个相当简单的模型。
[4] 训练
大部分人都认为这个是最重要的部分,其实并非如此,数据数量和质量、还有模型的选择比训练本身重要更多。这个过程就不需要人来参与的,机器独立就可以完成,整个过程就好像是在做算术题。因为机器学习的本质就是将问题转化为数学问题,然后解答数学题的过程。
[5] 评估
一旦训练完成,就可以评估模型是否有用,这是我们之前预留的验证集和测试集发挥作用的地方,评估的指标主要有 准确率、召回率、F值。这个过程可以让我们看到模型如何对尚未看到的数是如何做预测的,这意味着代表模型在现实世界中的表现。
[6] 参数调整
完成评估后,可能希望进一步改进训练。进行训练时,我们隐含地假设了一些参数,可以通过人为的调整这些参数让模型表现的更出色。
[7] 预估
上面的6个步骤都是为了这一步来服务的,这也是机器学习的价值。这个时候,当我们买来一瓶新的酒,只要告诉机器他的颜色和酒精度,他就会告诉你,这时啤酒还是红酒了。
# 2.2 常见机器学习算法
以下是一些常见的机器学习算法:
算法 | 训练方式 |
---|---|
线性回归 (opens new window) | 监督学习 |
Logistic回归 (opens new window) | 监督学习 |
线性判别分析 (opens new window) | 监督学习 |
决策树 (opens new window) | 监督学习 |
朴素贝叶斯 (opens new window) | 监督学习 |
K邻近 (opens new window) | 监督学习 |
学习向量量化 (opens new window) | 监督学习 |
支持向量机 (opens new window) | 监督学习 |
随机森林 (opens new window) | 监督学习 |
AdaBoost (opens new window) | 监督学习 |
高斯混合模型 | 非监督学习 |
限制波尔兹曼机 (opens new window) | 非监督学习 |
K-means 聚类 (opens new window) | 非监督学习 |
最大期望算法 | 非监督学习 |
# 3. 深度学习
# 3.1 深度学习概述
# 3.1.1 深度学习的原理解释
这里引用李开复在《人工智能》一书中的解释,以识别图片中的汉字为例:
假设深度学习要处理的信息是“水流”,而处理数据的深度学习网络是一个由管道和阀门组成的巨大水管网络。网络的入口是若干管道开口,网络的出口也是若干管道开口。这个水管网络有许多层,每一层由许多个可以控制水流流向与流量的调节阀。根据不同任务的需要,水管网络的层数、每层的调节阀数量可以有不同的变化组合。对复杂任务来说,调节阀的总数可以成千上万甚至更多。水管网络中,每一层的每个调节阀都通过水管与下一层的所有调节阀连接起来,组成一个从前到后,逐层完全连通的水流系统。
那么,计算机该如何使用这个庞大的水管网络来学习识字呢?
比如,当计算机看到一张写有“田”字的图片,就简单将组成这张图片的所有数字(在计算机里,图片的每个颜色点都是用“0”和“1”组成的数字来表示的)全都变成信息的水流,从入口灌进水管网络。
我们预先在水管网络的每个出口都插一块字牌,对应于每一个我们想让计算机认识的汉字。这时,因为输入的是“田”这个汉字,等水流流过整个水管网络,计算机就会跑到管道出口位置去看一看,是不是标记由“田”字的管道出口流出来的水流最多。如果是这样,就说明这个管道网络符合要求。如果不是这样,就调节水管网络里的每一个流量调节阀,让“田”字出口“流出”的水最多。
这下,计算机要忙一阵了,要调节那么多阀门。好在计算机的速度快,暴力的计算加上算法的优化,总是可以很快给出一个解决方案,调好所有阀门,让出口处的流量符合要求。
下一步,学习“申”字时,我们就用类似的方法,把每一张写有“申”字的图片变成一大堆数字组成的水流,灌进水管网络,看一看,是不是写有“申”字的那个管道出口流水最多,如果不是,我们还得再调整所有的阀门。这一次,要既保证刚才学过的“田”字不受影响,也要保证新的“申”字可以被正确处理。
如此反复进行,直到所有汉字对应的水流都可以按照期望的方式流过整个水管网络。这时,我们就说,这个水管网络是一个训练好的深度学习模型了。当大量汉字被这个管道网络处理,所有阀门都调节到位后,整套水管网络就可以用来识别汉字了。这时,我们可以把调节好的所有阀门都“焊死”,静候新的水流到来。
与训练时做的事情类似,未知的图片会被计算机转变成数据的水流,灌入训练好的水管网络。这时,计算机只要观察一下,哪个出水口流出来的水流最多,这张图片写的就是哪个字。
深度学习大致就是这么一个用人类的数学知识与计算机算法构建起来的整体架构,再结合尽可能多的训练数据以及计算机的大规模运算能力去调节内部参数,尽可能逼近问题目标的半理论、半经验的建模方式。
# 3.1.2 传统机器学习和深度学习对比
[1] 相似点
在数据准备和预处理方面,两者是很相似的。它们都可能对数据进行一些操作:数据清洗、数据标签、归一化、去噪、降维。
[2] 不同点
传统机器学习的特征提取主要依赖人工,针对特定简单任务的时候人工提取特征会简单有效,但是并不能通用。
深度学习的特征提取并不依靠人工,而是机器自动提取的。这也是为什么我们说深度学习的可解释性很差,因为有时候深度学习虽然能有好的表现,但并不知道它的原理是什么。
# 3.1.3 深度学习的优缺点
[1] 优点
- 学习能力强:从结果来看,深度学习的表现非常好,他的学习能力非常强。
- 覆盖范围广,适应性好:深度学习的神经网络层数很多,宽度很广,理论上可以映射到任意函数,所以能解决很复杂的问题。
- 数据驱动,上限高:深度学习高度依赖数据,数据量越大,他的表现就越好。在图像识别、面部识别、NLP等部分任务甚至已经超过了人类的表现。同时还可以通过调参进一步提高它的上限。
- 可移植性好:由于深度学习的优异表现,有很多框架可以使用,例如 TensorFlow、Pytorch。这些框架可以兼容很多平台。
[2] 缺点
- 计算量大,便携性差:深度学习需要大量的数据很大量的算力,所以成本很高。并且现在很多应用还不适合在移动设备上使用。目前已经有很多公司和团队在研发针对便携设备的芯片。这个问题未来会得到解决。
- 硬件需求高:深度学习对算力要求很高,普通的 CPU 已经无法满足深度学习的要求。主流的算力都是使用 GPU 和 TPU,所以对于硬件的要求很高,成本也很高。
- 模型设计复杂:深度学习的模型设计非常复杂,需要投入大量的人力物力和时间来开发新的算法和模型,大部分人只能使用现成的模型。
- 没有”人性”,容易存在偏见:由于深度学习依赖数据,并且可解释性不高。在训练数据不平衡的情况下会出现性别歧视、种族歧视等问题。
# 3.1.4 典型的4种深度学习算法
典型的4种深度学习算法有卷积神经网络(CNN)、循环神经网络(RNN)、生成对抗网络(GAN)、深度强化学习(RL)。
[1] 卷积神经网络-CNN
- 典型的 CNN 由3个部分构成:卷积层、池化层、全连接层。
- 卷积层负责提取图像中的局部特征;池化层用来大幅降低参数量级(降维);全连接层类似传统神经网络的部分,用来输出想要的结果。
[2] 生成对抗网络–GAN
- GAN通过生成器的神经网络模型生成新的数据,而由鉴别器的神经网络模型评估这些数据的真实性。循环这一步骤,直至算法认为生成的数据达到标准。
- 使用GAN创建新的合成图像,生成器会接受随机数并返回图像。
[3] 循环神经网络–RNN
- RNN是一类具有短期记忆能力的神经网络。循环神经网络已经被广泛应用在语音识别、语言翻译以及图片描述等任务上。
- 在RNN中,神经元不但可以接受其他神经元的信息,也可以接受自身的信息,形成具有环路的网络结构,RNN由此得名。
[4] 深度强化学习-RL
- 强化学习是机器学习的一个分支,强调如何基于环境行动,以取得最大化的预期利益,其灵感来源于心理学中的行为主义理论,即有机体如何在环境的奖励或惩罚刺激下,逐步形成对刺激的预期,产生能最大化利益的习惯性行为。
- 例如:Agent表示机器人,Enviroment表示环境,强化学习其实是在环境和机器人之间的互动,环境通过对机器人产生奖励,刺激机器人产生下一个Action,如此不断进行下去,这与条件反射非常像。
# 3.1.5 自己对深度学习发展的看法
以下是我自己对深度学习的一点儿看法,说的也不一定对,仅供参考。
现有的一些效果比较好的算法,其本质很多都是仿生,生命科学的发展和突破,也会极大的促进人工智能的发展和突破。
- 卷积神经网络CNN是参考人类视觉原理实现的。生成对抗网络RNN其实就是羊群与狼群的共同进化过程。循环神经网络RNN参考人类理解文字的原理,其中的LSTM改进就是看内容抓重点。深度强化学习RL其实就是赏罚机制,宠物驯化过程就是采取这种方式。
- 数学建模时接触到的现代优化算法,例如:遗传算法、蚁群算法、鱼群算法...其参考的也是遗传变异过程、蚁群和鱼群的寻路过程。
- 若是对生物大脑的记忆的具体机制真正弄清楚,AI科学家就可以照葫芦画瓢去用机器实现,人工智能领域也将会迎来重大突破。
# 3.2 卷积神经网络-CNN
# 3.2.1 CNN 的基本介绍
CNN 最擅长的就是图片的处理,它受到人类视觉神经系统的启发。目前 CNN 已经得到了广泛的应用,比如:人脸识别、自动驾驶、美图秀秀、安防等很多领域。
CNN 有2大特点:
- 能够有效的将大数据量的图片降维成小数据量。
- 能够有效的保留图片特征,符合图片处理的原则。
# 3.2.2 CNN 解决了什么问题
在 CNN 出现之前,图像对于人工智能来说是一个难题,有2个原因:
1)图像需要处理的数据量太大,导致成本很高,效率很低。
- 现在随随便便一张图片都是 1000×1000 像素以上的, 每个像素都有RGB 3个参数来表示颜色信息。假如我们处理一张 1000×1000 像素的图片,就需要处理3百万个参数。
- CNN 解决的第一个问题就是“将复杂问题简化”,把大量参数降维成少量参数,再做处理。在大部分场景下,降维并不会影响结果。比如1000像素的图片缩小成200像素,并不影响肉眼认出来图片中是一只猫还是一只狗,机器也是如此。
2)图像在数字化的过程中很难保留原有的特征,导致图像处理的准确率不高。
- 图片数字化的传统方式简化一下,假如有圆形是1,没有圆形是0,那么圆形的位置不同就会产生完全不同的数据表达。但是从视觉的角度来看,图像的内容并没有发生变化,只是位置发生了变化。
- CNN 解决了这个问题,他用类似视觉的方式保留了图像的特征,当图像做翻转,旋转或者变换位置时,它也能有效的识别出来是类似的图像。
# 3.2.3 人类的视觉原理
深度学习的许多研究成果,离不开对大脑认知原理的研究,尤其是视觉原理的研究。
人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。下面是人脑进行人脸识别的一个示例:
对于不同的物体,人类视觉也是通过这样逐层分级,来进行认知的:
我们可以看到,在最底层特征基本上是类似的,就是各种边缘,越往上,越能提取出此类物体的一些特征(轮子、眼睛、躯干等),到最上层,不同的高级特征最终组合成相应的图像,从而能够让人类准确的区分不同的物体。
那么我们可以很自然的想到:可以不可以模仿人类大脑的这个特点,构造多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类呢?答案是肯定的,这也是许多深度学习算法(包括CNN)的灵感来源。
# 3.2.4 CNN 的基本原理
典型的 CNN 由3个部分构成:1)卷积层 2)池化层 3)全连接层
卷积层负责提取图像中的局部特征;池化层用来大幅降低参数量级(降维);全连接层类似传统神经网络的部分,用来输出想要的结果。
Step1:卷积——提取特征
这个过程可以理解为我们使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值。卷积层的运算过程如下图,用一个卷积核扫完整张图片:
在具体应用中,往往有多个卷积核,可以认为,每个卷积核代表了一种图像模式,如果某个图像块与此卷积核卷积出的值大,则认为此图像块十分接近于此卷积核。如果我们设计了6个卷积核,可以理解:我们认为这个图像上有6种底层纹理模式,也就是我们用6中基础模式就能描绘出一副图像。以下就是25种不同的卷积核的示例:
总结:卷积层的通过卷积核的过滤提取出图片中局部的特征,跟上面提到的人类视觉的特征提取类似。
Step2:池化层——数据降维,避免过拟合
池化层简单说就是下采样,它可以大大降低数据的维度。下图中,我们可以看到,原始图片是20×20的,采样窗口为10×10,最终将其下采样成为一个2×2大小的特征图。
总结:池化层相比卷积层可以更有效的降低数据维度,这么做不但可以大大减少运算量,还可以有效的避免过拟合。
Step3:全连接层——输出结果
这个部分就是最后一步了,经过卷积层和池化层处理过的数据输入到全连接层,得到最终想要的结果。经过卷积层和池化层降维过的数据,全连接层才能”跑得动”,不然数据量太大,计算成本高,效率低下。
典型的 CNN 并非只是上面提到的3层结构,而是多层结构,例如 LeNet-5 的结构就如下图所示:卷积层 – 池化层- 卷积层 – 池化层 – 卷积层 – 全连接层
# 3.2.5 CNN 的实际应用
卷积神经网络 – CNN 很擅长处理图像,而视频是图像的叠加,所以同样擅长处理视频内容。
[1] 图像分类、检索
- 图像分类是比较基础的应用,他可以节省大量的人工成本,将图像进行有效的分类。对于一些特定领域的图片,分类的准确率可以达到 95%+,已经算是一个可用性很高的应用了。
- 典型场景:图像搜索…
[2] 目标定位检测
- 可以在图像中定位目标,并确定目标的位置及大小。
- 典型场景:自动驾驶、安防、医疗…
[3] 目标分割
- 简单理解就是一个像素级的分类。它可以对前景和背景进行像素级的区分、再高级一点还可以识别出目标并且对目标进行分类。
- 典型场景:美图秀秀、视频后期加工、图像生成…
[4] 人脸识别
- 人脸识别已经是一个非常普及的应用了,在很多领域都有广泛的应用。
- 典型场景:安防、金融、生活…
[5] 骨骼识别
- 骨骼识别是可以识别身体的关键骨骼,以及追踪骨骼的动作。
- 典型场景:安防、电影、图像视频生成、游戏…
# 3.3 生成对抗网络–GAN
# 3.3.1 GAN 的基本介绍
生成对抗网络 – GAN 是最近几年很热门的一种无监督算法,它能生成出非常逼真的照片以及视频。
GAN的设计初衷:监督学习的训练集需要大量的人工标注数据,这个过程是成本很高且效率很低的。而人工判断生成结果的好坏也是如此,有成本高和效率低的问题。而 GAN 能自动完成这个过程,且不断的优化,这是一种效率非常高,且成本很低的方式。
# 3.3.2 GAN 的基本原理
生成对抗网络(GAN)由2个重要的部分构成:
- 生成器(Generator):通过机器生成数据(大部分情况下是图像),目的是“骗过”判别器
- 判别器(Discriminator):判断这张图像是真实的还是机器生成的,目的是找出生成器做的“假数据”
Step1:固定「判别器D」,训练「生成器G」
- 我们使用一个还 OK 判别器,让一个「生成器G」不断生成“假数据”,然后给这个「判别器D」去判断。
- 一开始,「生成器G」还很弱,所以很容易被揪出来。但是随着不断的训练,「生成器G」技能不断提升,最终骗过了「判别器D」。到了这个时候,「判别器D」基本属于瞎猜的状态,判断是否为假数据的概率为50%。
Step2:固定「生成器G」,训练「判别器D」
- 当通过了第一阶段,继续训练「生成器G」就没有意义了。这个时候我们固定「生成器G」,然后开始训练「判别器D」。
- 「判别器D」通过不断训练,提高了自己的鉴别能力,最终他可以准确的判断出所有的假图片。到了这个时候,「生成器G」已经无法骗过「判别器D」。
Step3:循环阶段一和阶段二
- 通过不断的循环,「生成器G」和「判别器D」的能力都越来越强。
- 最终我们得到了一个效果非常好的「生成器G」,我们就可以用它来生成我们想要的图片了。
# 3.3.3 GAN 的优缺点
[1] 3个优势
- 能更好建模数据分布(图像更锐利、清晰)
- 理论上,GAN 能训练任何一种生成器网络。其他的框架需要生成器网络有一些特定的函数形式,比如输出层是高斯的。
- 无需利用马尔科夫链反复采样,无需在学习过程中进行推断,没有复杂的变分下界,避开近似计算棘手的概率的难题。
[2] 2个缺陷
- 难训练,不稳定。生成器和判别器之间需要很好的同步,但是在实际训练中很容易D收敛,G发散。D/G 的训练需要精心的设计。
- 模式缺失问题。GAN 的学习过程可能出现模式缺失,生成器开始退化,总是生成同样的样本点,无法继续学习。
# 3.3.4 GAN 的典型算法
GAN 算法有数百种之多,大家对于 GAN 的研究呈指数级的上涨,目前每个月都有数百篇论坛是关于对抗网络的。下图是每个月关于 GAN 的论文发表数量:
可以在 the-gan-zoo (opens new window) 开源项目里查看几乎所有的 GAN 算法,这里挑了10个比较有代表性的算法如下:
# 3.3.5 GAN 的实际应用
GAN 目前主要用于图像生成领域,以下介绍几种常见的实际应用。
[1] 生成图像数据集
人工智能的训练是需要大量的数据集的,如果全部靠人工收集和标注,成本是很高的。GAN 可以自动的生成一些数据集,提供低成本的训练数据。
[2] 生成人脸照片
生成人脸照片是大家很熟悉的应用,但是生成出来的照片用来做什么是需要思考的问题,因为这种人脸照片还处于法律的边缘。
[3] 生成照片、漫画人物
GAN 不但能生成人脸,还能生成其他类型的照片,甚至是漫画人物。
[4] 图像到图像的转换
简单说就是把一种形式的图像转换成另外一种形式的图像,就好像加滤镜一样神奇。例如:把草稿转换成照、把卫星照片转换为Google地图的图片、把照片转换成油画、把白天转换成黑夜。
[5] 文字到图像的转换
在2016年标题为“ StackGAN:使用 StackGAN 的文本到逼真照片的图像合成 (opens new window) ”的论文中,演示了使用 GAN,特别是他们的 StackGAN,从鸟类和花卉等简单对象的文本描述中生成逼真的照片。
[6] 照片到Emoji
GAN 可以通过人脸照片自动生成对应的表情(Emoji)。
[7] 照片编辑
使用GAN可以生成特定的照片,例如更换头发颜色、更改面部表情、甚至是改变性别。
[8] 预测不同年龄的长相
给一张人脸照片, GAN 就可以帮你预测不同年龄阶段你会长成什么样。
[9] 提高照片分辨率,让照片更清晰
给GAN一张照片,他就能生成一张分辨率更高的照片,使得这个照片更加清晰。
[10] 照片修复
假如照片中有一个区域出现了问题(例如被涂上颜色或者被抹去),GAN可以修复这个区域,还原成原始的状态。
# 3.4 循环神经网络–RNN
# 3.4.1 RNN 的基本介绍
NLP里最常用、最传统的深度学习模型就是循环神经网络 RNN。这个模型的命名已经说明了数据处理方法,是按顺序按步骤读取的。与人类理解文字的道理差不多,看书都是一个字一个字,一句话一句话去理解的。
# 3.4.2 RNN 的基本原理
RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。
假如需要判断用户的说话意图(问天气、问时间、设置闹钟…),用户说了一句“what time is it?”,我们需要先对这句话进行分词,然后按照顺序输入 RNN。
RNN 的缺点也比较明显,通过上面的例子,我们可以发现,短期的记忆影响较大(如橙色区域),但是长期的记忆影响就很小(如黑色和绿色区域),这就是 RNN 存在的短期记忆问题。
- RNN 有短期记忆问题,无法处理很长的输入序列
- 训练 RNN 需要投入极大的成本
由于 RNN 的短期记忆问题,后来又出现了基于 RNN 的优化算法。
# 3.4.3 RNN 的优化算法
RNN 是一种死板的逻辑,越晚的输入影响越大,越早的输入影响越小,且无法改变这个逻辑。LSTM(长短期记忆网络) 做的最大的改变就是打破了这个死板的逻辑,而改用了一套灵活了逻辑——只保留重要的信息。
LSTM 类似下面的划重点,它可以保留较长序列数据中的「重要信息」,忽略不重要的信息。这样就解决了 RNN 短期记忆的问题。
GRU 是 LSTM 的一个变体,它保留了 LSTM 划重点,遗忘不重要信息的特点,在 long-term 传播的时候也不会被丢失。GRU 主要是在 LSTM 的模型上做了一些简化和调整,在训练数据集比较大的情况下可以节省很多时间。
# 3.4.4 RNN 的实际应用
只要涉及到序列数据的处理问题,都可以使用到,NLP 就是一个典型的应用场景。
- 文本生成:类似上面的填空题,给出前后文,然后预测空格中的词是什么。
- 机器翻译:翻译工作也是典型的序列问题,词的顺序直接影响了翻译的结果。
- 语音识别:根据输入音频判断对应的文字是什么。
- 生成图像描述:类似看图说话,给一张图,能够描述出图片中的内容。这个往往是 RNN 和 CNN 的结合。
- 视频标记:他将视频分解为图片,然后用图像描述来描述图片内容。
# 3.5 深度强化学习-RL
# 3.5.1 RL 的基本介绍
强化学习并不是某一种特定的算法,而是一类算法的统称。如果用来做对比的话,它跟监督学习,无监督学习是类似的,是一种统称的学习方式。
强化学习算法的思路非常简单,以游戏为例,如果在游戏中采取某种策略可以取得较高的得分,那么就进一步「强化」这种策略,以期继续取得较好的结果。这种策略与日常生活中的各种「绩效奖励」非常类似。
# 3.5.2 RL 的算法分类
免模型学习(Model-Free)和有模型学习(Model-Based)是强化学习算法的2大分类,二者的重要差异是:智能体是否能完整了解或学习到所在环境的模型。
- 有模型学习:对环境有提前的认知,可以提前考虑规划,但是缺点是如果模型跟真实世界不一致,那么在实际使用场景下会表现的不好。
- 免模型学习:放弃了模型学习,在效率上不如前者,但是这种方式更加容易实现,也容易在真实场景下调整到很好的状态。所以免模型学习方法更受欢迎,得到更加广泛的开发和测试。
# 3.5.3 RL 的实际应用
强化学习目前还不够成熟,应用场景也比较局限。最大的应用场景就是游戏了。
[1] 机器人领域
- 机器人很像强化学习里的「代理」,在机器人领域,强化学习也可以发挥巨大的作用。
[2] 游戏领域
- 2016年:AlphaGo Master 击败李世石,使用强化学习的 AlphaGo Zero 仅花了40天时间,就击败了自己的前辈 AlphaGo Master。
- 2019年1月25日:AlphaStar 在《星际争霸2》中以 10:1 击败了人类顶级职业玩家。
- 2019年4月13日:OpenAI 在《Dota2》的比赛中战胜了人类世界冠军。
# 4. 自然语言处理基本理论
# 4.1 NLP概述
自然语言处理(NLP)就是在机器语言和人类语言之间沟通的桥梁,以实现人机交流的目的。人类通过语言来交流,狗通过汪汪叫来交流。机器也有自己的交流方式,那就是数字信息。
不同的语言之间是无法沟通的,比如说人类就无法听懂狗叫,甚至不同语言的人类之间都无法直接交流,需要翻译才能交流。而计算机更是如此,为了让计算机之间互相交流,人们让所有计算机都遵守一些规则,计算机的这些规则就是计算机之间的语言,NLP 就是人类和机器之间沟通的桥梁。
# 4.1.1 NLP 的2大核心任务
[1] 自然语言理解
- 自然语言理解就是希望机器像人一样,具备正常人的语言理解能力,由于自然语言在理解上有很多难点,所以 NLU 至今还远不如人类的表现。
- 自然语言理解的5个难点:1)语言的多样性 2)语言的歧义性 3)语言的鲁棒性 4)语言的知识依赖 5)语言的上下文
[2] 自然语言生成
- 自然语言生成 NLG 是为了跨越人类和机器之间的沟通鸿沟,将非语言格式的数据转换成人类可以理解的语言格式,如文章、报告等。
- NLG 的6个步骤:1)内容确定 2)文本结构 3)句子聚合 4)语法化 5)参考表达式生成 6)语言实现
# 4.1.2 NLP 的5个难点
NLP 存在以下5个难点:
- 语言是没有规律的,或者说规律是错综复杂的。
- 语言是可以自由组合的,可以组合复杂的语言表达。
- 语言是一个开放集合,我们可以任意的发明创造一些新的表达方式。
- 语言需要联系到实践知识,有一定的知识依赖。
- 语言的使用要基于环境和上下文。
# 4.1.3 NLP 的4个典型应用
[1] 情感分析:互联网上有大量的文本信息,这些信息想要表达的内容是五花八门的,但是他们抒发的情感是一致的:正面/积极的 – 负面/消极的。通过情感分析,可以快速了解用户的舆情情况。
[2] 聊天机器人:例如 Siri、小冰这些机器人,未来随着智能家居,智能汽车的发展,聊天机器人会有更大的使用价值。
[3] 语音识别:语音识别已经成为了全民级的引用,微信里可以语音转文字,汽车中使用导航可以直接说目的地.
[4] 机器翻译:目前的机器翻译准确率已经很高了,大家使用 Google 翻译完全可以看懂文章的大意。
# 4.1.4 NLP 的2种途径及3个核心步骤
NLP 可以使用传统的机器学习方法来处理,也可以使用深度学习的方法来处理,2 种不同的途径也对应着不同的处理步骤。
中文 NLP 语料预处理的 4 个步骤
- 中文分词——词性标注——命名实体识别——去除停用词
英文 NLP 语料预处理的 6 个步骤
- 分词——词干提取——词形还原——词性标注——命名实体识别——分块
方式 1:传统机器学习的 NLP 流程
语料预处理(中文语料预处理 4 个步骤、英文语料预处理的 6 个步骤)——特征工程(特征提取、特征选择)——选择分类器
方式 2:深度学习的 NLP 流程
语料预处理(中文语料预处理 4 个步骤、英文语料预处理的 6 个步骤)——设计模型——模型训练
# 4.2 NLP具体步骤
# 4.2.1 分词
分词就是将句子、段落、文章这种长文本,分解为以字词为单位的数据结构,方便后续的处理分析工作。
- 分词的原因:1)将复杂问题转化为数学问题 2)词是一个比较合适的粒度 3)深度学习时代,部分任务中也可以分字
- 中英文分词的3个典型区别:1)分词方式不同,中文更难 2)英文单词有多种形态,需要词性还原和词干提取 3)中文分词需要考虑粒度问题
- 中文分词的3大难点:1)没有统一的标准 2)歧义词如何切分 3)新词的识别
- 3个典型的分词方式:1)基于词典匹配 2)基于统计 3)基于深度学习
分词工具
- 中文分词工具:Hanlp (opens new window)、Stanford分词 (opens new window)、ansj分词器 (opens new window)、哈工大LTP (opens new window)、KCWS分词器 (opens new window)、jieba (opens new window)、IK (opens new window)、清华大学THULAC (opens new window)、ICTCLAS (opens new window)
- 英文分词工具:Keras (opens new window)、Spacy (opens new window)、Gensim (opens new window)、NLTK (opens new window)
# 4.2.2 词干提取与词形还原
词干提取和词形还原都是将长相不同,但是含义相同的词统一起来,这样方便后续的处理和分析。它们是英文语料预处理中的一个环节。
- 词干提取和词形还原的 4 个相似点:1)目标一致 2)部分结果一致 3)主流实现方式类似 4)应用领域相似
- 词干提取和词形还原的 5 个不同点:1)原理上不同 2)词形还原更加复杂 3)具体实现方式的侧重点不同 4)呈现结果有区别 5)应用领域上,侧重点不完全一致
- 3 种词干提取的主流算法:1)Porter 2)Snowball 3)Lancaster
- 英文的词形还原可以直接使用 Python 中的 NLTK 库,它包含英语单词的词汇数据库。
词干提取和词形还原在 NLP 中的所处位置:
词干提取 – Stemming
- 词干提取是去除单词的前后缀得到词根的过程。
- 常见的前后词缀有「名词的复数」、「进行式」、「过去分词」…
词形还原 – Lemmatisation
- 词形还原是基于词典,将单词的复杂形态转变成最基础的形态。
- 词形还原不是简单地将前后缀去掉,而是会根据词典将单词进行转换。比如「drove」会转换为「drive」。
# 4.2.3 词性标注
[1] 词性标注概述及存在的困难
词性标注就是在给定句子中判定每个词的语法范畴,确定其词性并加以标注的过程,这也是自然语言处理中一项非常重要的基础性工作。在研究者长期的研究总结中,发现汉语词性标注中面临了许多棘手的问题。
- 汉语是一种缺乏词形态变化的语言,词的类别不能像印欧语那样,直接从词的形态变化上来判别。
- 常用词兼类现象严重,《现代汉语八百词》收取的常用词中,兼类词所占的比例高达22.5%,而且发现越是常用的词,不同的用法越多。由于兼类使用程度高,兼类现象涉及汉语中大部分词类,因而造成在汉语文本中词类歧义排除的任务量巨大。
- 研究者主观原因造成的困难,语言学界在词性划分的目的、标准等问题上还存在分歧。目前还没有一个统的被广泛认可汉语词类划分标准,词类划分的粒度和标记符号都不统一。词类划分标准和标记符号集的差异,以及分词规范的含混性,给中文信息处理带来了极大的困难。
[2] 词性标注4种常见方法
以下是4种常见的词性标注方法:
[3] 词性标注工具推荐
- Jieba:“结巴”中文分词,Python 中文分词组件,可以进行词性标注。Github地址 (opens new window)
- SnowNLP:一个python写的类库,可以方便的处理中文文本内容。Github地址 (opens new window)
- THULAC:由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。Github地址 (opens new window)
- StanfordCoreNLP:斯坦福NLP组的开源,支持Python接口。Github地址 (opens new window)
- HanLP:是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。Github地址 (opens new window)
- NLTK:是一个高效的Python构建的平台,用来处理人类自然语言数据。[Github地址](https://github.com/nltk/nltk 官网:http://www.nltk.org/)
- SpaCy:工业级的自然语言处理工具,遗憾的是不支持中文。Gihub地址 (opens new window)
# 4.2.4 命名实体识别
命名实体识别(NER),又称作“专名识别”,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。简单的讲,就是识别自然文本中的实体指称的边界和类别。
[1] 4类常见的实现方式
早期的命名实体识别方法基本都是基于规则的。之后由于基于大规模的语料库的统计方法在自然语言处理各个方面取得不错的效果之后,一大批机器学习的方法也出现在命名实体类识别任务。宗成庆老师在统计自然语言处理一书粗略的将这些基于机器学习的命名实体识别方法划分为以下几类:
- 有监督的学习方法:这一类方法需要利用大规模的已标注语料对模型进行参数训练。目前常用的模型或方法包括隐马尔可夫模型、语言模型、最大熵模型、支持向量机、决策树和条件随机场等。值得一提的是,基于条件随机场的方法是命名实体识别中最成功的方法。
- 半监督的学习方法:这一类方法利用标注的小数据集(种子数据)自举学习。
- 无监督的学习方法:这一类方法利用词汇资源(如WordNet)等进行上下文聚类。
- 混合方法:几种模型相结合或利用统计方法和人工总结的知识库。
值得一提的是,由于深度学习在自然语言的广泛应用,基于深度学习的命名实体识别方法也展现出不错的效果,此类方法基本还是把命名实体识别当做序列标注任务来做,比较经典的方法是 LSTM+CRF、BiLSTM+CRF。
[2] NER 的相关数据集
数据集 | 简要说明 | 访问地址 |
---|---|---|
电子病例测评 | CCKS2017开放的中文的电子病例测评相关的数据 | 测评1 (opens new window) | 测评2 (opens new window) |
音乐领域 | CCKS2018开放的音乐领域的实体识别任务 | CCKS |
位置、组织、人名… | 这是来自GMB语料库的摘录,用于训练分类器以预测命名实体,例如姓名,位置等。 | kaggle (opens new window) |
口语 | NLPCC2018开放的任务型对话系统中的口语理解评测 | NLPCC (opens new window) |
人名、地名、机构、专有名词 | 一家公司提供的数据集,包含人名、地名、机构名、专有名词 | boson (opens new window) |
[3] NER 的相关工具
工具 | 简介 | 访问地址 |
---|---|---|
Stanford NER | 斯坦福大学开发的基于条件随机场的命名实体识别系统,该系统参数是基于CoNLL、MUC-6、MUC-7和ACE命名实体语料训练出来的。 | 官网 (opens new window) | GitHub 地址 (opens new window) |
MALLET | 麻省大学开发的一个统计自然语言处理的开源包,其序列标注工具的应用中能够实现命名实体识别。 | 官网 (opens new window) |
Hanlp | HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。支持命名实体识别。 | 官网 (opens new window) | GitHub 地址 (opens new window) |
NLTK | NLTK是一个高效的Python构建的平台,用来处理人类自然语言数据。 | 官网 (opens new window) | GitHub 地址 (opens new window) |
SpaCy | 工业级的自然语言处理工具,遗憾的是不支持中文。 | 官网 (opens new window) | GitHub 地址 (opens new window) |
Crfsuite | 可以载入自己的数据集去训练CRF实体识别模型。 | 文档 (opens new window) | GitHub 地址 (opens new window) |
# 4.2.5 句法分析
句法分析是自然语言处理中的关键技术之一,它是对输入的文本句子进行分析以得到句子的句法结构的处理过程。对句法结构进行分析,一方面是语言理解的自身需求,另一方面也为其它自然语言处理任务提供支持。
[1] 常见分类
根据句法结构的表示形式不同,最常见的句法分析任务可以分为以下 3 种:
- 句法结构分析:作用是识别出句子中的短语结构以及短语之间的层次句法关系。
- 依存关系分析:作用是识别句子中词汇与词汇之间的相互依存关系。
- 深层文法句法分析:对句子进行深层的句法以及语义分析。
[2] 相关工具
- StanfordCoreNLP:斯坦福开源的工具,提供成分句法分析功能。Github地址 (opens new window) | 官网地址 (opens new window)
- Berkeley Parser伯克利大学开源的工具,提供英文的句法分析功能。官网地址 (opens new window)
- SpaCy:工业级的自然语言处理工具,遗憾的是不支持中文。Gihub地址 (opens new window) | 官网地址 (opens new window)
- FudanNLP:复旦大学自然语言处理实验室开发的中文自然语言处理工具包,包含信息检索: 文本分类、新闻聚类;中文处理: 中文分词、词性标注、实体名识别、关键词抽取、依存句法分析、时间短语识别;结构化学习: 在线学习、层次分类、聚类。Github地址 (opens new window)
# 4.2.6 文本挖掘
[1] 文本挖掘的意义
文本挖掘的意义就是从数据中寻找有价值的信息,来发现或者解决一些实际问题。
[2] 文本挖掘的5个步骤
文本挖掘的5个步骤:1)数据收集 2)文本预处理 3)数据挖掘和可视化 4)搭建模型 5)模型评估
[3] 7种文本挖掘的方法
- 关键词提取:对长文本的内容进行分析,输出能够反映文本关键信息的关键词。
- 文本摘要:许多文本挖掘应用程序需要总结文本文档,以便对大型文档或某一主题的文档集合做出简要概述。
- 聚类:聚类是未标注文本中获取隐藏数据结构的技术,常见的有K均值聚类和层次聚类。
- 文本分类:文本分类使用监督学习的方法,以对未知数据的分类进行预测的机器学习方法。
- 文本主题模型:是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。
- 观点抽取:对文本(主要针对评论)进行分析,抽取出核心观点,并判断极性(正负面),主要用于电商、美食、酒店、汽车等评论进行分析。
- 情感分析:对文本进行情感倾向判断,将文本情感分为正向、负向、中性。用于口碑分析、话题监控、舆情分析。
# 4.3 Transformer的基本原理
Transformer模型来自论文 Attention Is All You Need (opens new window)。这个模型最初是为了提高机器翻译的效率,它的Self-Attention机制和Position Encoding可以替代RNN。因为RNN是顺序执行的,t时刻没有完成就不能处理t+1时刻,因此很难并行。但是后来发现Self-Attention效果很好,在很多其它的地方也可以使用Transformer模型。这包括著名的OpenAI GPT和BERT模型,都是以Transformer为基础的。当然它们只使用了Transformer的Decoder部分,由于没有了Encoder,所以Decoder只有Self-Attention而没有普通的Attention。
# 4.3.1 模型概览
首先把模型看成一个黑盒子,如下图所示,对于机器翻译来说,它的输入是源语言(法语)的句子,输出是目标语言(英语)的句子。
把黑盒子稍微打开一点,Transformer(或者任何的NMT系统)都可以分成Encoder和Decoder两个部分,如下图所示。
再展开一点,Encoder由很多结构一样的Encoder堆叠(stack)而成,Decoder也是一样。如下图所示。注意:每一个Encoder的输入是下一层Encoder输出,最底层Encoder的输入是原始的输入(法语句子);Decoder也是类似,但是最后一层Encoder的输出会输入给每一个Decoder层,这是Attention机制的要求。
每一层的Encoder都是相同的结构,它由一个Self-Attention层和一个前馈网络(全连接网络)组成,如下图所示:
每一层的Decoder也是相同的结构,它除了Self-Attention层和全连接层之外还多了一个普通的Attention层,这个Attention层使得Decoder在解码时会考虑最后一层Encoder所有时刻的输出,它的结构如下图所示。
# 4.3.2 加入Tensor
前面的图示只是说明了Transformer的模块,接下来加入Tensor,了解这些模块是怎么串联起来的。输入的句子是一个词的序列,我们首先通过Embedding把它变成一个连续稠密的向量,如下图所示。
Embedding之后的序列会输入Encoder,首先经过Self-Attention层然后再经过全连接层,如下图所示。
我们在计算时需要依赖所有时刻的输入,...,,不过我们可以用矩阵运算一下子把所有的计算出来。而全连接网络的计算则完全是独立的,计算i时刻的输出只需要输入就足够了,因此很容易并行计算。下图更加明确的表达了这一点。图中Self-Attention层是一个大的方框,表示它的输入是所有的,...,,输出是,...,。而全连接层每个时刻是一个方框(但不同时刻的参数是共享的),表示计算只需要。此外,前一层的输出,...,直接输入到下一层。
# 4.3.3 Self-Attention简介
比如要翻译如下句子”The animal didn’t cross the street because it was too tired”(这个动物无法穿越马路,因为它太累了)。这里的it到底指代什么呢,是animal还是street?要知道具体的指代,需要在理解it的时候同时关注所有的单词,重点是animal、street和tired,然后根据常识我们知道只有animal才能tired,而street是不能tired的。Self-Attention用Encoder在编码一个词的时候会考虑句子中所有其它的词,从而确定怎么编码当前词。如果把tired换成narrow,那么it就指代的是street了。
而LSTM(即使是双向的)是无法实现上面的逻辑的。为什么呢?比如前向的LSTM,我们在编码it的时候根本没有看到后面是tired还是narrow,所有它无法把it编码成哪个词。而后向的LSTM呢?当然它看到了tired,但是到it的时候它还没有看到animal和street这两个单词,当然就更无法编码it的内容了。当然多层的LSTM理论上是可以编码这个语义的,它需要下层的LSTM同时编码了animal和street以及tired三个词的语义,然后由更高层的LSTM来把it编码成animal的语义。但是这样模型更加复杂。
下图是模型的最上一层Encoder的Attention可视化图,这是tensor2tensor工具输出的内容。我们可以看到,在编码it的时候有一个Attention Head注意到了Animal,因此编码后的it有Animal的语义。
# 4.3.4 Self-Attention详细介绍
下面我们详细的介绍Self-Attention是怎么计算的,首先介绍向量的形式逐个时刻计算,这便于理解,接下来我们把它写出矩阵的形式一次计算所有时刻的结果。
对于输入的每一个向量(第一层是词的Embedding,其它层是前一层的输出),我们首先需要生成3个新的向量Q、K和V,分别代表Query向量、Key向量和Value向量。Q表示为了编码当前词,需要去注意(attend to)其它(其实也包括它自己)的词,我们需要有一个查询向量。而Key向量可以认为是这个词的关键的用于被检索的信息,而Value向量是真正的内容。
我们对比一下普通的Attention(Luong 2015),使用内积计算energy的情况。如下图所示,在这里,每个向量的Key和Value向量都是它本身,而Q是当前隐状态,计算energy 的时候我们计算和。然后用softmax变成概率,最后把所有的加权平均得到context向量。
而Self-Attention里的Query不是隐状态,并且来自当前输入向量本身,因此叫作Self-Attention。另外Key和Value都不是输入向量,而是输入向量做了一下线性变换。当然理论上这个线性变换矩阵可以是Identity矩阵,也就是使得Key=Value=输入向量。因此可以认为普通的Attention是这里的特例。这样做的好处是模型可以根据数据从输入向量中提取最适合作为Key(可以看成一种索引)和Value的部分。类似的,Query也是对输入向量做一下线性变换,它让系统可以根据任务学习出最适合的Query,从而可以注意到(attend to)特定的内容。
具体的计算过程如下图所示。比如图中的输入是两个词”thinking”和”machines”,我们对它们进行Embedding(这是第一层,如果是后面的层,直接输入就是向量了),得到向量,。接着我们用3个矩阵分别对它们进行变换,得到向量和。比如,图中的shape是1x4,是4x3,得到的是1x3。其它的计算也是类似的,为了能够使得Key和Query可以内积,我们要求和的shape是一样的,但是并不要求和它们一定一样(虽然实际论文实现是一样的)。
每个时刻t都计算出,,之后,我们就可以来计算Self-Attention了。以第一个时刻为例,我们首先计算的内积,得到score,过程如下图所示。
接下来使用softmax把得分变成概率,注意这里把得分除以之后再计算的softmax,根据论文的说法,这样计算梯度时会更加稳定。计算过程如下图所示。
接下来用softmax得到的概率对所有时刻的V求加权平均,这样就可以认为得到的向量根据Self-Attention的概率综合考虑了所有时刻的输入信息,计算过程如下图所示。
这里只是演示了计算第一个时刻的过程,计算其它时刻的过程是完全一样的。
# 4.3.5 矩阵计算
前面介绍的方法需要一个循环遍历所有的时刻t计算得到,我们可以把上面的向量计算变成矩阵的形式,从而一次计算出所有时刻的输出,这样的矩阵运算可以充分利用硬件资源(包括一些软件的优化),从而效率更高。
第一步还是计算Q、K和V,不过不是计算某个时刻的了,而是一次计算所有时刻的Q、K和V。计算过程如下图所示。这里的输入是一个矩阵,矩阵的第i行表示第i个时刻的输入。
接下来就是计算Q和K得到score,然后除以,然后再softmax,最后加权平均得到输出。全过程如下图所示。
# 4.3.6 Multi-Head Attention
这篇论文还提出了Multi-Head Attention的概念。其实很简单,前面定义的一组Q、K和V可以让一个词attend to相关的词,我们可以定义多组Q、K和V,它们分别可以关注不同的上下文。计算Q、K和V的过程还是一样,这不过现在变换矩阵从一组变成了多组,,…。如下图所示。
对于输入矩阵X(time_step, num_input),每一组Q、K和V都可以得到一个输出矩阵Z(time_step, num_features)。如下图所示。
但是后面的全连接网络需要的输入是一个矩阵而不是多个矩阵,因此我们可以把多个head输出的Z按照第二个维度拼接起来,但是这样的特征有一些多,因此Transformer又用了一个线性变换(矩阵)对它进行了压缩。这个过程如下图所示。
上面的步骤涉及很多步骤和矩阵运算,我们用一张大图把整个过程表示出来,如下图所示。
我们已经学习了Transformer的Self-Attention机制,下面我们通过一个具体的例子来看看不同的Attention Head到底学习到了什么样的语义。从下面两图的对比也能看出使用多个Head的好处——每个Head(在数据的驱动下)学习到不同的语义。
# 4.3.7 位置编码
注意:这是Transformer原始论文使用的位置编码方法,而在BERT模型里,使用的是简单的可以学习的Embedding,和Word Embedding一样,只不过输入是位置而不是词而已。
我们的目的是用Self-Attention替代RNN,RNN能够记住过去的信息,这可以通过Self-Attention“实时”的注意相关的任何词来实现等价(甚至更好)的效果。RNN还有一个特定就是能考虑词的顺序(位置)关系,一个句子即使词完全是相同的但是语义可能完全不同,比如”北京到上海的机票”与”上海到北京的机票”,它们的语义就有很大的差别。我们上面的介绍的Self-Attention是不考虑词的顺序的,如果模型参数固定了,上面两个句子的北京都会被编码成相同的向量。但是实际上我们可以期望这两个北京编码的结果不同,前者可能需要编码出发城市的语义,而后者需要包含目的城市的语义。而RNN是可以(至少是可能)学到这一点的。当然RNN为了实现这一点的代价就是顺序处理,很难并行。
为了解决这个问题,我们需要引入位置编码,也就是t时刻的输入,除了Embedding之外(这是与位置无关的),我们还引入一个向量,这个向量是与t有关的,我们把Embedding和位置编码向量加起来作为模型的输入。这样的话如果两个词在不同的位置出现了,虽然它们的Embedding是相同的,但是由于位置编码不同,最终得到的向量也是不同的。
位置编码有很多方法,其中需要考虑的一个重要因素就是需要它编码的是相对位置的关系。比如两个句子:”北京到上海的机票”和”你好,我们要一张北京到上海的机票”。显然加入位置编码之后,两个北京的向量是不同的了,两个上海的向量也是不同的了,但是我们期望Query(北京1)Key(上海1)却是等于Query(北京2)Key(上海2)的。具体的编码算法我们在代码部分再介绍。位置编码加入后的模型如下图所示。
一个具体的位置编码的例子如下图所示。
# 4.3.8 LayerNorm
前面介绍过Batch Normalization,这个技巧能够让模型收敛的更快。但是Batch Normalization有一个问题——它需要一个minibatch的数据,而且这个minibatch不能太小(比如1)。另外一个问题就是它不能用于RNN,因为同样一个节点在不同时刻的分布是明显不同的。当然有一些改进的方法使得可以对RNN进行Batch Normalization,比如论文 Recurrent Batch Normalization (opens new window)。
Transformer里使用了另外一种Normalization技巧,叫做Layer Normalization。我们可以通过对比Layer Normalization和Batch Normalization来学习。
假设我们的输入是一个minibatch的数据,我们再假设每一个数据都是一个向量,则输入是一个矩阵,每一行是一个训练数据,每一列都是一个特征。BatchNorm是对每个特征进行Normalization,而LayerNorm是对每个样本的不同特征进行Normalization,因此LayerNorm的输入可以是一行(一个样本)。
如下图所示,输入是(3,6)的矩阵,minibatch的大小是3,每个样本有6个特征。BatchNorm会对6个特征维度分别计算出6个均值和方差,然后用这两个均值和方差来分别对6个特征进行Normalization,计算公式如下:
而LayerNorm是分别对3个样本的6个特征求均值和方差,因此可以得到3个均值和方差,然后用这3个均值和方差对3个样本来做Normalization,计算公式如下:
因为LayerNorm的每个样本都是独立计算的,因此minibatch可以很小甚至可以是1。实验证明LayerNorm不仅在普通的神经网络中有效,而且对于RNN也非常有效。
BatchNorm看起来比较直观,我们在数据预处理也经常会把输入Normalize成均值为0,方差为1的数据,只不过它引入了可以学习的参数使得模型可以更加需要重新缓慢(不能剧烈)的调整均值和方差。而LayerNorm似乎有效奇怪,比如第一个特征是年龄,第二个特征是身高,把一个人的这两个特征求均值和方差似乎没有什么意义。论文里有一些讨论,都比较抽象。当然把身高和年龄平均并没有什么意义,但是对于其它层的特征,我们通过平均”期望”它们的取值范围大体一致,也可能使得神经网络调整参数更加容易,如果这两个特征实在有很大的差异,模型也可以学习出合适的参数让它来把取值范围缩放到更合适的区间。
# 4.3.9 残差连接
每个Self-Attention层都会加一个残差连接,然后是一个LayerNorm层,如下图所示。
下图展示了更多细节:输入,经self-attention层之后变成,,然后和残差连接的输入,加起来,然后经过LayerNorm层输出给全连接层。全连接层也是有一个残差连接和一个LayerNorm层,最后再输出给上一层。
Decoder和Encoder是类似的,如下图所示,区别在于它多了一个Encoder-Decoder Attention层,这个层的输入除了来自Self-Attention之外还有Encoder最后一层的所有时刻的输出。Encoder-Decoder Attention层的Query来自下一层,而Key和Value则来自Encoder的输出。
# 5. 参考资料
[1] 一文看懂卷积神经网络-CNN(基本原理+独特价值+实际应用) from EasyAI (opens new window)
[2] 什么是生成对抗网络 – GAN?(基本概念+工作原理) from EasyAI (opens new window)
[3] 一文看懂循环神经网络-RNN(独特价值+优化算法+实际应用) from EasyAI (opens new window)
[4] 一文看懂什么是强化学习?(基本概念+应用场景+主流算法) from EasyAI (opens new window)
[5] RNN 结构详解 from 机器之心 (opens new window)
[6] 「75页PDF」面向所有人的机器学习科普大全 from EasyAI (opens new window)
[7] 「65页PDF」深度学习精华汇总-产品经理的AI知识库 from EasyAI (opens new window)
[8] 「41页PDF」引入AI前需要评估的 from EasyAI (opens new window)
[9] 训练集、验证集、测试集(附:分割方法+交叉验证)from EasyAI (opens new window)
[10] 预训练(Pre-train)from EasyAI (opens new window)
[11] 循环神经网络简介 from 李理的博客 (opens new window)
[12] 「59页PDF」自然语言处理 NLP 基本概念大全(免费下载)from EasyAI (opens new window)
[13] 自然语言处理-Natural language processing | NLP from EasyAI (opens new window)
[14] Transformer图解 from 李理的博客 (opens new window)
[15] 详解Transformer (Attention Is All You Need)from 知乎 (opens new window)
[16] The Illustrated Transformer from Jay Alammar (opens new window)