绪论概要介绍 人工智能 、机器学习和深度学习
目前,深度学习很容易和神经网络混为一谈。这是因为由于神经网络很好地解决了贡献度分配问题,它成为了深度学习主要采用的模型。事实上,深度学习也可以采用其他模型,比如,深度信念网络还不了解。
人工智能 (Artificial Intelligence, AI ) ,简单来讲,就是让机器拥有人类的智慧,这也是我们长期的目标。
目前,随着神经科学、认知心理学等学科的发展,我们对大脑的结构有了一定的了解,但对大脑的智能是如何产生的,还知道的很少,我们不理解大脑的运作原理,以及如何产生意识、情感、记忆等功能。因此,通过“复制”人脑来实现人工智能是不切实际的。
1950年, 阿兰 · 图灵 (Alan Turing) 发表的论文 《Computing Machinery and Intelligence》 讨论了创造一种“智能机器”的可能性。
一个人在不接触对方的情况下,通过一种特殊的方式和对方进行一系列问答。如果在相当长时间内,他无法根据这些问题判断对方是人还是计算机。那么可以认为这个计算机是智能的。
图灵测试引导了人工智能很多研究方向。因为要使得计算机通过图灵测试,计算机就必须具备理解语言、学习、记忆、推理、决策等能力。这样,人工智能就延伸出了许多不同的子学科:机器感知 计算机视觉 语音信息处理、学习 模式识别 机器学习、语言 自然语言处理、记忆 知识表示、决策规划 数据挖掘等。
1956年达特茅斯 (Dartmouth) 会议标志着人工智能学科的诞生。
在这次会议上,“人工智能”被提出作为本领域的研究名称,同时,人工智能的研究使命也被确定。
John McCarthy提出了人工智能的定义:
人工智能就是要让机器的行为看起来就像是人所表现出的智能行为一样。
目前,人工智能的主要研究领域大体可分为以下几个方面:
1956年达特茅斯会议后,研究者对人工智能的热情高涨,之后的十几年是人工智能的黄金时期。
这一时期研究者开发出了一系列智能系统,比如几何定理证明器、语言翻译器 等。这些初步的研究成果使得研究者对开发出具有人类智能的机器过于乐观,低估了实现人工智能的难度。
随着研究的深入,研究者意识到了对项目难度评估的不足,原来的乐观预期受到严重打击,人工智能的研究开始陷入低谷。
20世纪70年代,研究者意识到知识对于人工智能的重要性。特别是对于一些复杂的任务,需要专家来构建知识库。
在这一时期,出现了各种各样的 专家系统 (Expert System) ,并在特定的专业领域取得了很多成果。
机器学习 (Machine Learning , ML) 是指从有限的观测数据中学习/猜测出具有一般性的规律,并利用这些规律对未知数据进行预测的方法。
机器学习是人工智能的一个重要分支,并逐渐成为推动人工智能发展的关键因素。
当我们用机器学习来解决实际任务时,会面对多种多样的数据形式声音 图像 文本,不同数据的特征构造方式差异很大。对于图像,可以自然地表示为一个连续的向量;对于文本,因为其一般是由离散符号组成,并且每个符号都在计算机内表示为无意义的编码,很难找到合适的表达方式:因此,在实际任务中使用机器学习模型一般会包含以下几个步骤:
上述流程中,每步特征处理以及预测一般都是分开进行的,传统的机器学习主要关注构建预测函数。
事实上,在实际操作过程中,不同预测模型的性能相差不多,反而特征处理部分对系统的准确性有至关重要的影响。
特征处理一般都需要人工干预完成,利用人类的经验来选取好的特征并最终提高机器学习系统的性能。因此,很多机器学习问题变成了特征工程。
接上文,为了提高机器学习系统的准确率,我们需要把输入信息转换为转换为有效的特征 / 表示。
如果有一种算法可以自动地学习出有效的特征,并最终提高机器学习模型的性能,那么这种学习就叫做表示学习*(Representation Learning)*。
对于“好的表示”,没有明确的标准,但一个好的表示一般具有以下优点:
表示学习的关键是解决语义鸿沟。
语义鸿沟问题是指输入数据的底层特征和高层语义信息之间的不一致性和差异性。
以表示颜色为例:
以不同名字来命名不同的颜色
局部表示又称离散表示或符号表示
局部表示可以表示为one-hot向量:假设所有颜色的名字构成一个词表 υ \upsilon υ,词表大小为 | υ \upsilon υ |。我们可以用一个 | υ \upsilon υ |的one-hot向量来表示每一个颜色。
局部特征的优点
局部特征的不足之处
和局部表示相比较,分布式表示的向量维度较低。
只需要一个三维的稠密向量就可以表示所有颜色
承接上文,对嵌入有如下解释
使用神经网络来将高维的局部表示空间 R ∣ υ ∣ \mathbb{R}^{|\upsilon|} R∣υ∣ 映射到一个非常低维的分布式表示空间 R D , D ≪ ∣ υ ∣ \mathbb{R}^{D},D\ll|\upsilon| RD,D≪∣υ∣。在这个低维空间中,每个特征不再是坐标轴上的点,而是分散在整个低维空间中。
对嵌入的定义
将一个度量空间中的一些对象映射到另一个低维的度量空间中,并尽可能保持不同对象之间的拓扑关系。
在传统的机器学习中,也有很多有关特征学习的方法主成分分析 线性判别分析 独立成分分析。
传统的机器学习一般是通过人为地设计一些准则,然后根据这些准则来提取有效的特征。
特征的学习和最终预测模型的学习是分开进行的,因此学习到的特征不一定可以提升最终模型的性能。
要学习到一种好的高层语义表示(分布式表示),通常需要从底层特征开始,经过多步非线性转换才能得到。
深层结构的优点是可以增加特征的重用性,从而指数级地增加表示能力。
表示学习的关键是构建具有一定深度的多层次特征表示。
承接表示学习,为了学习一种好的特征,需要构建具有一定“深度”的模型,并通过学习算法来让模型自动学习出好的特征表示底层特征→中层特征→高层特征,从而最终提升模型的准确率。
“深度”是指原始数据进行非线性转换的次数
深度学习即从数据中学习出一个“深度模型”的学习方法。
深度学习是机器学习的一个子问题,它的目的是从数据中自动学习到有效的特征表示。
通过多层转换,可以把原始数据变成更高层次、更抽象的表示。
这些学习学到的表示可以替代人工设计的特征,从而避免“特征工程”。
目前,深度学习采用的模型主要是神经网络模型,其主要原因是神经网络模型可以使用误差反向传播算法,从而可以比较好地解决贡献度分配问题。
传统机器学习方法面对复杂任务需要将一个任务的输入和输出之间人为地切割成许多子模块/阶段,每个子模块分开学习。
这种学习方式有两个问题,这些问题增加了机器学习方法在实际应用中的难度:
端到端学习又称端到端训练。
在学习过程中不进行分模块/分阶段训练,直接优化任务的总体目标。
在端到端学习中,一般不需要明确地给出不同模块/阶段的功能,中间过程不需要人为干预。
端到端学习的训练数据为“输入-输出”对的形式,无需提供其他额外信息。
早期的神经科学家构造了一种模仿人脑神经系统的数学模型,称为人工神经网络,简称“神经网络”。
而在机器学习领域,神经网络是指由很多人工神经元构成的网络结构模型,这些人工神经元之间的连接强度是可学习的参数。
神经元的激活规则
神经元输入到输出之间的映射关系,一般为非线性函数
网络的拓扑结构
不同神经元之间的连接关系
学习算法
通过训练数据来学习神经网络的参数
早期的神经网络模型并不具备学习能力。
首个可学习的人工神经网络是赫布网络。它采用一种基于 赫布规则 的无监督学习。
感知器是最早的具有机器学习思想的神经网络,但其学习方法无法扩展到多层的神经网络上。
1980年左右,反向传播算法才有效地解决了多层神经网络的学习问题,并成为最为流行的神经网络学习算法。
神经网络的发展大致经过五个时期。
这是神经网络发展的第一个高潮,在其期间,研究者们提出了许多神经元模型和学习规则。
这是神经网络发展的第一个低谷期,在此期间,神经网络的研究处于长年停滞及低潮状态。
这是神经网络发展的第二个高潮期。在此期间,反向传播算法重新激发了人们对神经网络的兴趣。
但梯度消失问题阻碍着神经网络的进一步发展,特别是循环神经网络。
在此期间,支持向量机和其他更简单的方法在机器学习领域的流行度逐渐超过了神经网络。
在20世纪90年代中期,统计学习理论和以支持向量机为代表的机器学习模式开始兴起。
相较之下,神经网络的理论基础不清晰,优化困难,可解释性差等缺点更加凸显。
在此期间,研究者逐渐掌握了训练深层神经网络的方法,使得神经网络重新崛起。
3.随着大规模并行计算以及GPU设备的普及,计算机的计算能力得以大幅提高。此外,可供机器学习的数据规模也越来越大。在强大的计算能力和海量的数据规模的支持下,计算机已经可以端到端地训练一个大规模神经网络,不需要借助预训练的方式。
本书在开始给出了一张知识结构图
嵌入 :将数据从局部表示向分布式表示转换的过程
贡献度分配问题:深度学习中把数据输入组件后,各个组件对最终输出结果的影响程度
one-hot向量: 在局部表示中,表示数据的向量只有在表示数据所属的维度为1,其余维度为零
9.建立矩阵a ,初始化为[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]],输出(0,0),(1,2),(2,0),(3,1) (提示使用 b = np.array([0, 2, 0, 1]) print(a[np.arange(4), b]))
在不看提示时,a的shape为(4,3),我对实现的预想如下:
a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
temp = np.array([0,2,0,1])
print(a[:,temp])
out:
[[ 1 3 1 2]
[ 4 6 4 5]
[ 7 9 7 8]
[10 12 10 11]]
了解提示后,完成代码及输出如下:
a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
temp = np.array([0,2,0,1])
print(a[np.arange(4),temp])
out:
[ 1 6 7 11]
比较不同,发现第一个代码块是对整列进行处理。