人工智能python实现-如何看待深度学习

9.1 重点内容回顾
9.1.1 人工智能的各种方法
9.1.2 深度学习在机器学习领域
9.1.3 如何看待深度学习
9.1.4 关键的推动技术
9.1.5 机器学习的通用工作流程
9.1.6 关键网络架构
9.1.7 可能性空间

第 9 章 总结

本章包括以下内容:

  • 全书的重点
  • 深度学习的局限性
  • 深度学习、机器学习与人工智能的未来
  • 在本领域进一步学习和工作的资源

本书内容已经接近尾声。这是最后一章,将会总结并回顾本书的核心概念,同时还会拓展你的视野,其内容超出你目前所学的相对基本的概念。学习深度学习和人工智能是一次旅程,读完本书只是旅程的第一站。我希望你认识到这一点,并能准备好独自迈向下一步。

首先我们将概览本书的重要内容,这应该会让你回忆起已经学过的一些概念。接下来,我们将会概述深度学习一些关键的局限性。想要正确地使用工具,你不仅应该知道它能够做什么,还应该知道它不能做什么。最后,我会给出我对于深度学习、机器学习和人工智能这些领域未来发展的猜测和思考。如果你想从事基础研究,应该对这一部分特别感兴趣。本章最后列出了一份资源和策略的简要清单,供你进一步学习人工智能并掌握最新进展参考。

9.1 重点内容回顾

本节简要综述了全书的重点内容。如果你需要快速过一下所学过的内容,那么可以阅读本节。

9.1.1 人工智能的各种方法

首先,深度学习不是人工智能的同义词,甚至也不是机器学习的同义词。人工智能(artificial intelligence)是一个古老而宽泛的领域,通常可将其定义为“将认知过程自动化的所有尝试”,换句话说,就是思想的自动化。它的范围非常广泛,既包括很基本的内容,比如 Excel电子表格,也包括非常高级的内容,比如会走路和说话的人形机器人。

机器学习(machine  learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)]。将数据转换为程序的这个过程叫作学习(learning)。虽然机器学习已经存在了很长时间,但它在 20世纪  90年代才开始取得成功。

深度学习(deep learning)是机器学习的众多分支之一,它的模型是一长串几何函数,一个接一个地作用在数据上。这些运算被组织成模块,叫作层(layer)。深度学习模型通常都是层的堆叠,或者更通俗地说,是层组成的图。这些层由权重(weight)来参数化,权重是在训练过程中需要学习的参数。模型的知识(knowledge)保存在它的权重中,学习的过程就是为这些权重找到正确的值。

虽然深度学习只是机器学习的众多方法之一,但它与其他方法并不处于同等地位。深度学习是突破性的成功。原因如下。

9.1.2 深度学习在机器学习领域中的特殊之处

在短短几年的时间里,深度学习在人们曾经认为对计算机来说极其困难的大量任务上取得了巨大的突破,特别是在机器感知领域,这一领域需要从图像、视频、声音等输入中提取有用的信息。给定足够多的训练数据(特别是由人类正确标记的训练数据),深度学习能够从感知数据提取出人类能够提取出的几乎全部信息。因此,有时会听到这种说法——深度学习已经解决了感知(solve perception),但这种说法只对感知的狭义定义而言才是正确的。

深度学习取得了前所未有的技术上的成功,以一己之力引发了第三次人工智能夏天(AI summer),这也是迄今为止规模最大的一次,人们对人工智能领域表现出强烈的兴趣,投入大量投资并大肆炒作。在本书的写作过程中,我们正处于这次人工智能夏天中。这一夏天是否会在不远的将来结束,以及它结束后会发生什么,都是人们讨论的话题。有一件事是确定的:深度学习已经为许多大型科技公司提供了巨大的商业价值,并且实现了人类水平的语音识别、智能助理、人类水平的图像分类、极大改进的机器翻译,等等,这与之前的人工智能夏天形成了鲜明对比。炒作很可能会烟消云散,但深度学习带来的持久经济影响和技术影响将会永远持续下去。从这个意义上来讲,深度学习与互联网很类似:它可能在几年的时间里被夸大炒作,但从长远来看,它仍然是一场改变我们经济和生活的重大革命。

我对深度学习特别乐观,因为即使未来十年没有进一步的技术进展,将现有算法部署到所有适用的问题上,就能够带来大多数行业的变革。深度学习就是一场革命,目前正以惊人的速度快速发展,这得益于在资源和人力上的指数式投资。从我的立场来看,未来很光明,尽管短期期望有些过于乐观。将深度学习部署到可能应用的所有领域需要超过十年的时间。

9.1.3 如何看待深度学习

关于深度学习,最令人惊讶的是它非常简单。十年前没人能预料到,通过梯度下降来训练简单的参数化模型,就能够在机器感知问题上取得如此惊人的结果。现在事实证明,你需要的只是足够大的参数化模型,并且在足够多的样本上用梯度下降来训练。正如费曼曾经对宇宙的描述:“它并不复杂,只是很多而已。”

在深度学习中,一切都是向量,即一切都是几何空间(geometric     space)中的点(point)。首先将模型输入(文本、图像等)和目标向量化(vectorize),即将其转换为初始输入向量空间和目标向量空间。深度学习模型的每一层都对通过它的数据做一个简单的几何变换。模型中的层链共同形成了一个非常复杂的几何变换,它可以分解为一系列简单的几何变换。这个复杂变换试图将输入空间映射到目标空间,每次映射一个点。这个变换由层的权重来参数化,权重根据模型当前表现进行迭代更新。这种几何变换有一个关键性质,就是它必须是 可微的(differentiable),这样我们才能通过梯度下降来学习其参数。直观上来看,这意味着从输入到输出的几何变形必须是平滑且连续的,这是一个很重要的约束条件。

将这个复杂的几何变换应用于输入数据的过程,可以用三维的形式可视化——你可以想象一个人试图将一个纸球展平,这个皱巴巴的纸球就是模型初始输入数据的流形。这个人对纸球做的每个动作都类似于某一层执行的简单几何变换。完整的展平动作系列就是整个模型所做的复杂变换。深度学习模型就是用于解开高维数据复杂流形的数学机器。

这就是深度学习的神奇之处:将意义转换为向量,转换为几何空间,然后逐步学习将一个空间映射到另一个空间的复杂几何变换。你需要的只是维度足够大的空间,以便捕捉到原始数据中能够找到的所有关系。

整件事情完全取决于一个核心思想:意义来自于事物之间的成对关系(一门语言的单词之间,一张图像的像素之间等),而这些关系可以用距离函数来表示。但请注意,大脑是否通过几何空间来实现意义,这完全是另一个问题。从计算的角度来看,处理向量空间是很高效的,但也很容易想到用于智能的其他数据结构,特别是图。神经网络最初来自于使用图对意义进行编码这一思路,这也是它被命名为神经网络(neural  network)的原因,相关的研究领域曾经被称为联结主义(connectionism)。如今仍在使用神经网络这一名称,纯粹是出于历史原因,这是一个极具误导性的名称,因为它与神经或网络都没有关系,尤其是和大脑几乎没有任何关系。更合适的名称应该是分层表示学习(layered representations  learning)或层级表示学习(hierarchical representations learning),甚至还可以叫深度可微模型(deep  differentiable model)或链式几何变换(chained geometric transform),以强调其核心在于连续的几何空间操作。

9.1.4 关键的推动技术

目前正在展开的技术革命并非始于某个单项突破性发明。相反,与其他革命一样,它是大量推动因素累积的结果——起初很慢,然后突然爆发。对于深度学习来说,我们可以找出下列关键因素。

  • 渐进式的算法创新,它们首先在   20年内逐渐为人们所知(从反向传播算法开始),然后在 2012年之后更多的科研力量涌入深度学习领域,这种创新的速度越来越快。
  • 大量可用的感知数据,这对于实现在足够多的数据上训练足够大的模型是必要的。它是消费者互联网的兴起与摩尔定律应用于存储介质上的副产物。
  • 快速且高度并行的计算硬件,且价格很低,特别是    NVIDIA公司生产的   GPU。NVIDIA一开始生产的是游戏   GPU,后来生产的是从头设计用于深度学习的芯片。   NVIDIA的CEO黄仁勋很早就注意到了深度学习的潜力,决定将公司的未来赌在这上面。
  • 复杂的软件栈,使得人类能够利用这些计算能力。它包括      CUDA语言、像    TensorFlow这样能够做自动求微分的框架和 Keras,Keras让大多数人都可以使用深度学习。

未来,深度学习不仅会被专家(研究人员、研究生与具有学习背景的工程师)使用,而且会成为所有开发人员工具箱中的工具,就像当今的  Web技术一样。所有人都需要构建智能应用程序——正如当今每家企业都需要一个网站,每个产品都需要智能地理解用户生成的数据。实现这个未来需要我们创造一些工具,它们可以让深度学习的使用更加容易,每个具有基本编程能力的人都可以使用。Keras是朝着这个方向迈出的第一大步。

9.1.5 机器学习的通用工作流程

我们已经拥有非常强大的工具,能够创建将任何输入空间映射到任何目标空间的模型,这非常好,但机器学习工作流程的难点通常是设计并训练这种模型之前的工作(对于生产模型而言,也包括设计和训练这种模型之后的工作)。理解问题领域从而能够确定想要预测什么、需要哪些数据以及如何衡量成功,这些都是所有成功的机器学习应用的前提,而   Keras和  TensorFlow等高级工具是无法帮你解决这些问题的。提醒一下,第  4章介绍过典型的机器学习工作流程,下面我们来快速回顾总结一下。

(1)定义问题:有哪些数据可用?你想要预测什么?你是否需要收集更多数据或雇人为数据集手动添加标签?

(2)找到能够可靠评估目标成功的方法。对于简单任务,可以用预测精度,但很多情况都需要与领域相关的复杂指标。

(3)准备用于评估模型的验证过程。训练集、验证集和测试集是必须定义的。验证集和测试集的标签不应该泄漏到训练数据中。举个例子,对于时序预测,验证数据和测试数据的时间都应该在训练数据之后。

(4)数据向量化。方法是将数据转换为向量并预处理,使其更容易被神经网络所处理(数据标准化等)。

(5)开发第一个模型,它要打败基于常识的简单基准方法,从而表明机器学习能够解决你的问题。事实上并非总是如此!

(6)通过调节超参数和添加正则化来逐步改进模型架构。仅根据模型在验证集(不是测试集或训练集)上的性能来进行更改。请记住,你应该先让模型过拟合(从而找到比你的需求更大的模型容量),然后才开始添加正则化或降低模型尺寸。

(7)调节超参数时要小心验证集过拟合,即超参数可能会过于针对验证集而优化。我们保留一个单独的测试集,正是为了避免这个问题!

9.1.6 关键网络架构

你应该熟悉以下三种网络架构:密集连接网络、卷积网络和循环网络。每种类型的网络都针对于特定的输入模式,网络架构(密集网络、卷积网络、循环网络)中包含对数据结构的假设,即搜索良好模型所在的假设空间。某种架构能否解决某个问题,这完全取决于数据结构与网络架构的假设之间的匹配度。

这些不同的网络类型组合起来,很容易实现更大的多模式网络,就像组合乐高积木一样。某种程度上来说,深度学习的层就是信息处理的乐高积木。我们来快速看一下输入模式与适当的网络架构之间的对应关系。

  • 向量数据:密集连接网络(Dense层)。
  • 图像数据:二维卷积神经网络。
  • 声音数据(比如波形):一维卷积神经网络(首选)或循环神经网络。
  • 文本数据:一维卷积神经网络(首选)或循环神经网络。
  • 时间序列数据:循环神经网络(首选)或一维卷积神经网络。
  • 其他类型的序列数据:循环神经网络或一维卷积神经网络。如果数据顺序非常重要(比如时间序列,但文本不是),那么首选循环神经网络。
  • 视频数据:三维卷积神经网络(如果你需要捕捉运动效果),或者帧级的二维神经网络(用于特征提取)+循环神经网络或一维卷积神经网络(用于处理得到的序列)。
  • 立体数据:三维卷积神经网络。

下面快速回顾一下每种网络架构的特点。

1.密集连接网络

密集连接网络是 Dense层的堆叠,它用于处理向量数据(向量批量)。这种网络假设输入特征中没有特定结构:之所以叫作密集连接,是因为Dense层的每个单元都和其他所有单元相连接。这种层试图映射任意两个输入特征之间的关系,它与二维卷积层不同,后者仅查看局部关系。

密集连接网络最常用于分类数据(比如输入特征是属性的列表),比如第 3章的波士顿房价数据集。它还用于大多数网络最终分类或回归的阶段。例如,第   5章介绍的卷积神经网络,最后通常是一两个Dense层,第   6章的循环神经网络也是如此。

请记住:对于二分类问题(binary  classification),层堆叠的最后一层是使用sigmoid激活且只有一个单元的Dense层,并使用binary_crossentropy作为损失。目标应该是     0或  1。

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(num_input_features,)))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(optimizer='rmsprop', loss='binary_crossentropy')

对于单标签多分类问题(single-label  categorical  classification,每个样本只有一个类别,不会超过一个),层堆叠的最后一层是一个Dense层,它使用softmax激活,其单元个数等于类别个数。如果目标是  one-hot编码的,那么使用  categorical_crossentropy作为损失;如果目标是整数,那么使用sparse_categorical_crossentropy作为损失。

model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(num_input_features,)))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(num_classes, activation='softmax'))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy')

对于多标签多分类问题(multilabel   categorical  classification,每个样本可以有多个类别),层堆叠的最后一层是一个 Dense层,它使用 sigmoid激活,其单元个数等于类别个数,并使用binary_crossentropy作为损失。目标应该是  k-hot编码的。

model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(num_input_features,)))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(num_classes, activation='sigmoid'))

model.compile(optimizer='rmsprop', loss='binary_crossentropy')

对于连续值向量的回归(regression)问题,层堆叠的最后一层是一个不带激活  Dense层,其单元个数等于你要预测的值的个数(通常只有一个值,比如房价)。有几种损失可用于回归问题,最常见的是mean_squared_error(均方误差,MSE)和mean_absolute_error(平均绝对误差,MAE)。

model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(num_input_features,)))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(num_values))

model.compile(optimizer='rmsprop', loss='mse')

2.卷积神经网络

卷积层能够查看空间局部模式,其方法是对输入张量的不同空间位置(图块)应用相同的几何变换。这样得到的表示具有平移不变性,这使得卷积层能够高效利用数据,并且能够高度模块化。这个想法适用于任何维度的空间,包括一维(序列)、二维(图像)、三维(立体数据)等。你可以使用 Conv1D层来处理序列(特别是文本,它对时间序列的效果并不好,因为时间序列通常不满足平移不变的假设),使用Conv2D层来处理图像,使用Conv3D层来处理立体数据。

卷积神经网络卷积网络是卷积层和最大池化层的堆叠。池化层可以对数据进行空间下采样,这么做有两个目的:随着特征数量的增大,我们需要让特征图的尺寸保持在合理范围内;让后面的卷积层能够“看到”输入中更大的空间范围。卷积神经网络的最后通常是一个 Flatten运算或全局池化层,将空间特征图转换为向量,然后再是Dense层,用于实现分类或回归。

注意,大部分(或者全部)普通卷积很可能不久后会被深度可分离卷积(depthwise separable convolution,SeparableConv2D层)所替代,后者与前者等效,但速度更快、表示效率更高。对于三维、二维和一维的输入来说都是如此。如果你从头开始构建一个新网络,那么一定要使用深度可分离卷积。SeparableConv2D层可直接替代 Conv2D层,得到一个更小、更快的网络,在任务上的表现也更好。

一个常见的图像分类网络如下所示(本例是多分类)。

model = models.Sequential()
model.add(layers.SeparableConv2D(32, 3, activation='relu',input_shape=(height, width, channels)))

model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.MaxPooling2D(2))

model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.SeparableConv2D(128, 3, activation='relu'))
model.add(layers.MaxPooling2D(2))

model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.SeparableConv2D(128, 3, activation='relu'))
model.add(layers.GlobalAveragePooling2D())

model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(num_classes, activation='softmax'))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy')

3.循环神经网络

循环神经网络(RNN,recurrent  neural network)的工作原理是,对输入序列每次处理一个时间步,并且自始至终保存一个状态(state,这个状态通常是一个向量或一组向量,即状态几何空间中的点)。如果序列中的模式不具有时间平移不变性(比如时间序列数据,最近的过去比遥远的过去更加重要),那么应该优先使用循环神经网络,而不是一维卷积神经网络。

Keras中有三种   RNN层:SimpleRNN、GRU和LSTM。对于大多数实际用途,你应该使用GRU或LSTM。两者中LSTM更加强大,计算代价也更高。你可以将  GRU看作是一种更简单、计算代价更小的替代方法。

想要将多个 RNN层逐个堆叠在一起,最后一层之前的每一层都应该返回输出的完整序列(每个输入时间步都对应一个输出时间步)。如果你不再堆叠更多的 RNN层,那么通常只返回最后一个输出,其中包含关于整个序列的信息。

下面是一个单层 RNN层,用于向量序列的二分类。

model = models.Sequential()
model.add(layers.LSTM(32, input_shape=(num_timesteps, num_features)))
model.add(layers.Dense(num_classes, activation='sigmoid'))

model.compile(optimizer='rmsprop', loss='binary_crossentropy')

下面是 RNN层的堆叠,用于向量序列的二分类。

model = models.Sequential()
model.add(layers.LSTM(32, return_sequences=True,input_shape=(num_timesteps, num_features)))

model.add(layers.LSTM(32, return_sequences=True))
model.add(layers.LSTM(32))
model.add(layers.Dense(num_classes, activation='sigmoid'))

model.compile(optimizer='rmsprop', loss='binary_crossentropy')

9.1.7 可能性空间

你想要用深度学习来做什么?请记住,构建深度学习模型就像是玩乐高积木:将许多层组合在一起,基本上可以在任意数据之间建立映射,前提是拥有合适的训练数据,同时这种映射可以通过具有合理复杂度的连续几何变换来实现。可能性空间是无限的。本节将会用几个例子来激发你的思考,思考除基本的分类和回归任务之外的可能性,这二者一直是机器学习最基本的任务。

下面是我提到的应用领域,我将其按输入模式和输出模式进行了分类。请注意,其中不少应用扩展了可能性的范围。虽然在所有这些任务上都可以训练一个模型,但在某些情况下,这样的模型可能无法泛化到训练数据之外的数据。 9.2节和  9.3节将会讨论未来可以如何突破这些局限。

  • 将向量数据映射到向量数据
    • 预测性医疗保健:将患者医疗记录映射到患者治疗效果的预测。
    • 行为定向:将一组网站属性映射到用户在网站上所花费的时间数据。
    • 产品质量控制:将与某件产品制成品相关的一组属性映射到产品明年会坏掉的概率。
  • 将图像数据映射到向量数据
    • 医生助手:将医学影像幻灯片映射到是否存在肿瘤的预测。
    • 自动驾驶车辆:将车载摄像机的视频画面映射到方向盘的角度控制命令。
    • 棋盘游戏人工智能:将围棋和象棋棋盘映射到下一步走棋。
    • 饮食助手:将食物照片映射到食物的卡路里数量。
    • 年龄预测:将自拍照片映射到人的年龄。
  • 将时间序列数据映射为向量数据
    • 天气预报:将多个地点天气数据的时间序列映射到某地下周的天气数据。
    • 脑机接口:将脑磁图(MEG)数据的时间序列映射到计算机命令。
    • 行为定向:将网站上用户交互的时间序列映射到用户购买某件商品的概率。
  • 将文本映射到文本
    • 智能回复:将电子邮件映射到合理的单行回复。
    • 回答问题:将常识问题映射到答案。
    • 生成摘要:将一篇长文章映射到文章的简短摘要。
  • 将图像映射到文本
    • 图像描述:将图像映射到描述图像内容的简短说明。
  • 将文本映射到图像
    • 条件图像生成:将简短的文字描述映射到与这段描述相匹配的图像。
    • 标识生成   /选择:将公司的名称和描述映射到公司标识。
  • 将图像映射到图像
    • 超分辨率:将缩小的图像映射到相同图像的更高分辨率版本。
    • 视觉深度感知:将室内环境的图像映射到深度预测图。
  • 将图像和文本映射到文本
    • 视觉问答:将图像和关于图像内容的自然语言问题映射到自然语言答案。
  • 将视频和文本映射到文本
    • 视频问答:将短视频和关于视频内容的自然语言问题映射到自然语言答案。几乎是一切皆有可能,但不完全是一切。下一节我们将会看到深度学习不能做什么。

作者:

喜欢围棋和编程。

 
发布于 分类 编程标签

发表评论

电子邮件地址不会被公开。