《DEEP LEARNING with Python》第二十章 结论

第二十章 结论

Conclusions

本章内容

  • 本书的重要启示
  • 可用于进一步学习和实践应用技能的资源
  • Important takeaways from this book
  • Resources for learning further and applying your skills in practice

我们先来概览一下本书的要点,帮助你回忆起一些已经学过的概念。然后,我们会提供一份简短的资源和学习策略清单,帮助你进一步学习机器学习,并及时了解最新进展。

成为一名高效的人工智能从业者是一个循序渐进的过程,而读完这本书仅仅是你迈出的第一步。我希望你能意识到这一点,并做好充分的准备,以便能够独立完成接下来的学习。

回顾关键概念

Key concepts in review

本节简要总结了本书的主要内容。如果您需要快速回顾所学知识,可以阅读这几页内容。

人工智能的各种方法

Various approaches to artificial intelligence

首先,深度学习并不等同于人工智能(AI),甚至也不等同于机器学习:

  • 人工智能(AI)是一个古老而广泛的领域,通常可以理解为“所有试图自动化人类认知过程的尝试”。其范围从非常基础的Excel电子表格,到非常先进的能够行走和说话的人形机器人。

  • 机器学习是人工智能的一个特定子领域,旨在仅通过训练数据自动开发程序(称为模型)。将数据转化为程序的过程称为学习。尽管机器学习由来已久,但直到 20 世纪 90 年代才开始蓬勃发展,并在 21 世纪初成为人工智能的主流形式。

  • 深度学习是机器学习的众多分支之一,其模型由一系列依次应用的几何变换构成。这些变换被组织成称为“层”的模块:深度学习模型通常是由多个层堆叠而成,或者更一般地说,是由多个层构成的图。这些层由权重参数化,权重是在训练过程中学习到的参数。模型的知识存储在其权重中,学习过程就是找到这些权重的“好值”——即能够最小化损失函数的值。由于所考虑的几何变换链是可微的,因此可以通过梯度下降法高效地更新权重以最小化损失函数。

  • 生成式人工智能是深度学习的一个特定子集,其模型能够生成文本、图像、视频或声音。这些模型通常非常庞大——拥有数十亿个参数。它们以自监督的方式进行训练;也就是说,它们被训练来重建输入中人为缺失或损坏的部分——例如,图像去噪、预测句子中的下一个词等等。这种学习过程使模型能够学习其输入空间的复杂“映射”(嵌入流形),这些映射可用于对新的输入进行采样。随着 ChatGPT 或 Midjourney 等产品的兴起,这些模型已将人工智能带入了“消费”时代。

  • Artificial intelligence (AI) is an ancient, broad field that can generally be understood as “all attempts to automate human cognitive processes.” This can range from the very basic, such as an Excel spreadsheet, to the very advanced, like a humanoid robot that can walk and talk.

  • Machine learning is a specific subfield of AI that aims at automatically developing programs (called models) purely from exposure to training data. This process of turning data into a program is called learning. Although machine learning has been around for a long time, it only started to take off in the 1990s, before becoming the dominant form of AI in the 2000s.

  • Deep learning is one of many branches of machine learning, where the models are long chains of geometric transformations, applied one after the other. These operations are structured into modules called layers: deep learning models are typically stacks of layers — or, more generally, graphs of layers. These layers are parameterized by weights, which are the parameters learned during training. The knowledge of a model is stored in its weights, and the process of learning consists of finding “good values” for these weights — values that minimize a loss function. Because the chain of geometric transformations considered is differentiable, updating the weights to minimize the loss function is done efficiently via gradient descent.

  • Generative AI is a specific subset of deep learning, where models are capable of generating text, images, videos, or sound. These models tend to be very large — billions of parameters. They’re trained in a self-supervised manner; that is, they’re trained to reconstruct artificially missing or corrupted parts of an input — for instance, denoising images, predicting the next word in a sentence, and so on. This learning process enables the models to learn sophisticated “maps” (embedding manifolds) of their input space, which can be used for sampling new inputs. These models have launched AI into its “consumer” era with the rise of products like ChatGPT or Midjourney.

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

深度学习在机器学习领域有何独特之处?

What makes deep learning special within the field of machine learning

短短几年间,深度学习在诸多以往被认为对计算机而言极其困难的任务领域取得了巨大突破,尤其是在机器感知领域:从图像、视频、音频等数据中提取有用信息。只要拥有充足的训练数据(特别是经过人类正确标注的训练数据),深度学习几乎可以从感知数据中提取出人类能够提取的任何信息。因此,人们有时会说深度学习“解决了感知问题”——尽管这种说法仅适用于对感知的较为狭义的定义。

由于其前所未有的技术成就,深度学习一手缔造了第三次也是迄今为止规模最大的一次人工智能热潮:人工智能领域迎来了一段充满浓厚兴趣、投资热潮和炒作的时期。本书撰写之时,我们正处于这一热潮之中。这一热潮是否会在不久的将来结束,以及热潮结束后将会发生什么,目前仍是争论的焦点。但有一点可以肯定:与以往的几次人工智能热潮截然不同,深度学习为大大小小的科技公司都创造了巨大的商业价值,并在消费领域取得了巨大的成功,实现了媲美人类的语音识别、聊天机器人助手、逼真的图像生成、媲美人类的机器翻译等等。这股热潮或许会(而且很可能会)消退,但深度学习持续的经济和技术影响将长期存在。从这个意义上讲,深度学习可以类比于互联网:它或许会在几年内被过度炒作,但从长远来看,它仍将是一场重大的革命,彻底改变我们的经济和生活。

我对深度学习尤其乐观的原因之一是,即使未来十年我们不再取得任何技术进步,将现有算法应用于所有适用问题也将对大多数行业带来颠覆性的变革。深度学习堪称一场革命,由于资源和人才的指数级投入,其发展速度目前令人惊叹。就目前而言,未来一片光明,尽管短期预期可能有些过于乐观;要充分发挥深度学习的潜力,可能还需要数十年时间。

如何思考深度学习

How to think about deep learning

深度学习最令人惊讶的地方在于它的简单性。十五年前,没人会想到我们能用梯度下降法训练的简单参数模型,在机器感知和自然语言处理问题上取得如此惊人的成果。而现在看来,你只需要足够大的参数模型,并用梯度下降法在足够多的样本上进行训练即可。正如费曼曾经形容宇宙那样:“它并不复杂,只是很大。 ” [1]( As Feynman once said about the universe, “It’s not complicated, it’s just a lot of it.” )

在深度学习中,一切皆向量;也就是说,一切皆几何空间中的一个模型输入(文本、图像等)和目标首先被向量化——分别转换为初始输入向量空间和目标向量空间。深度学习模型中的每一层都对其输入的数据执行一个简单的几何变换。模型中的所有层共同构成一个复杂的几何变换,该变换又可分解为一系列简单的变换。这个复杂的变换试图将输入空间逐点映射到目标空间。该变换由各层的权重参数化,权重会根据模型的当前性能进行迭代更新。该几何变换的一个关键特征是它必须是 可微的,这是我们能够通过梯度下降法学习其参数的必要条件。直观地说,这意味着从输入到输出的几何变换必须是平滑且连续的——这是一个重要的约束条件。

将这种复杂的几何变换应用于输入数据的整个过程可以用三维可视化的方式呈现:想象一个人试图展开一个纸团,这个纸团就是模型初始的输入数据流形。人对纸团的每一个动作都类似于对一层数据进行简单的几何变换。完整的展开动作序列就是整个模型的复杂变换。深度学习模型是用于展开高维复杂数据流形的数学机器。

这就是深度学习的魅力所在——将意义转化为向量,转化为几何空间,然后逐步学习将一个空间映射到另一个空间的复杂几何变换。你只需要足够高维的空间,就能捕捉原始数据中所有关系的全部内涵。

整个理论的核心在于两个关键理念:意义来源于事物之间的成对关系 (例如语言中的词语之间、图像中的像素之间等等),并且 这些关系可以用距离函数来捕捉。但需要注意的是,大脑是否通过几何空间来实现意义则完全是另一个问题。从计算的角度来看,向量空间处理起来很高效,但我们很容易设想出其他用于智能的数据结构——特别是图。神经网络最初源于使用图来编码意义的想法,这也是它们被命名为神经网络的原因;相关的研究领域过去被称为连接主义。如今, “神经网络”这个名称纯粹是出于历史原因而存在的——这是一个极具误导性的名称,因为它们既不是神经的,也不是网络的。尤其值得注意的是,神经网络与大脑几乎没有任何关系。更合适的名称应该是分层表示学习层次表示学习,或者甚至是深度可微模型链式几何变换,以强调连续几何空间操作是其核心。

Nowadays, the name neural network exists purely for historical reasons — it’s an extremely misleading name because they’re neither neural nor networks. In particular, neural networks have hardly anything to do with the brain. A more appropriate name would have been layered representations learning or hierarchical representations learning, or maybe even deep differentiable models or chained geometric transforms, to emphasize the fact that continuous geometric space manipulation is at their core.

关键使能技术

Key enabling technologies

当前正在发生的这场技术革命并非始于任何一项突破性发明。相反,如同其他任何革命一样,它是众多促成因素长期积累的结果——起初缓慢,随后爆发式增长。就深度学习而言,我们可以指出以下几个关键因素:

  • 算法的渐进式创新最初持续了二十年(从反向传播开始),然后在 2012 年后随着更多研究投入到深度学习中,创新速度越来越快。其中一项重大突破是 2017 年的 Transformer 架构。
  • 大量图像、视频和文本数据的可用性,是实现“我们只需要在足够大的数据上训练足够大的模型”这一目标的前提。而这又是消费互联网兴起和摩尔定律应用于存储介质的副产品。如今,最先进的语言模型都是基于互联网上很大一部分数据进行训练的。
  • 快速、高度并行的计算硬件以低廉的价格供应,尤其是英伟达生产的GPU——最初是游戏GPU,后来是专为深度学习从零开始设计的芯片。英伟达CEO黄仁勋很早就注意到了深度学习的蓬勃发展,并决定将公司的未来押注于此,而这一决定最终获得了巨大的成功
  • 使人类能够使用这种计算能力的复杂软件层堆栈包括:CUDA 语言、TensorFlow、JAX 和 PyTorch 等可进行自动微分的框架,以及使大多数人能够接触到深度学习的 Keras。
  • Incremental algorithmic innovations, first spread over two decades (starting with backpropagation) and then happening increasingly faster as more research effort was poured into deep learning after 2012. One major such breakthrough was the Transformer architecture in 2017.
  • The availability of large amounts of image, video, and text data, which is a requirement to realize that sufficiently large models trained on sufficiently large data are all we need. This is, in turn, a by-product of the rise of the consumer internet and Moore’s law applied to storage media. Today, state-of-the-art language models are trained on a large fraction of the entire internet.
  • The availability of fast, highly parallel computation hardware at a low price, especially the GPUs produced by NVIDIA — first gaming GPUs and then chips designed from the ground up for deep learning. Early on, NVIDIA CEO Jensen Huang took note of the deep learning boom and decided to bet the company’s future on it, which paid off in a big way.
  • A complex stack of software layers that makes this computational power available to humans: the CUDA language, frameworks like TensorFlow, JAX, and PyTorch that do automatic differentiation, and Keras, which makes deep learning accessible to most people.

未来,深度学习将不再仅限于研究人员、研究生和工程师等具有学术背景的专业人士使用;它将成为每位开发者工具箱中的必备工具,就像如今的Web技术一样。每个人都需要构建智能应用:正如如今每个企业都需要网站一样,每个产品都需要智能地理解用户生成的数据。要实现这一未来,我们需要开发出能够让深度学习变得极其易用,且任何具备基本编程能力的人都能轻松上手的工具。Keras正是朝着这个方向迈出的重要一步。

通用机器学习工作流程

The universal machine learning workflow

拥有一个功能极其强大的工具,能够创建将任何输入空间映射到任何目标空间的模型固然很好,但机器学习工作流程的难点往往在于设计和训练这些模型之前的所有工作(对于生产模型而言,也包括之后的工作)。理解问题领域,从而确定在给定数据的情况下要预测什么,以及如何衡量成功,是任何成功的机器学习应用的前提,而这并非 Keras 和 TensorFlow 等高级工具所能提供的。作为回顾,以下是对第 6 章中描述的典型机器学习工作流程的简要概述:

  • 明确问题所在。有哪些数据可用?你想预测什么?你需要收集更多数据,还是需要雇人手动标注数据集?
  • 找到一种可靠的方法来衡量目标的达成情况。对于简单的任务,预测准确率或许可以作为衡量标准;但在许多情况下,则需要使用复杂且特定领域的指标。
  • 准备好用于评估模型的验证流程。具体来说,您应该定义训练集、验证集和测试集。验证集和测试集的标签不应泄露到训练数据中:例如,对于时间序列预测,验证集和测试集的数据应晚于训练数据。
  • 将数据向量化,方法是将其转换为向量,并对其进行预处理,使其更容易被神经网络处理(归一化等)。
  • 开发一个能够超越简单常识基准模型的初始模型,从而证明机器学习可以解决你的问题。但情况并非总是如此!
  • 通过调整超参数和添加正则化,逐步优化模型架构。仅基于验证集上的性能进行更改,不要基于测试集或训练集。记住,你应该先让模型过拟合(从而确定一个大于实际需求的模型容量),然后再开始添加正则化或缩小模型规模。调整超参数时,要警惕验证集过拟合——即超参数可能过度针对验证集。避免这种情况正是使用独立测试集的目的!
  • 将最终模型部署到生产环境中——例如作为 Web API、作为 JavaScript 或 C++ 应用程序的一部分、在嵌入式设备上等等。持续监控其在真实数据上的性能,并利用您的发现来改进模型的下一次迭代!
  • Define the problem. What data is available, and what are you trying to predict? Will you need to collect more data or hire people to manually label a dataset?
  • Identify a way to reliably measure success on your goal. For simple tasks, this may be prediction accuracy, but in many cases, it will require sophisticated, domain-specific metrics.
  • Prepare the validation process that you’ll use to evaluate your models. In particular, you should define a training set, a validation set, and a test set. The validation-set and test-set labels shouldn’t leak into the training data: for instance, with temporal prediction, the validation and test data should be posterior to the training data.
  • Vectorize the data by turning it into vectors and preprocessing it in a way that makes it more easily approachable by a neural network (normalization and so on).
  • Develop a first model that beats a trivial common-sense baseline, thus demonstrating that machine learning can work on your problem. This may not always be the case!
  • Gradually refine your model architecture by tuning hyperparameters and adding regularization. Make changes based on performance on the validation data only, not the test data or the training data. Remember that you should get your model to overfit (thus identifying a model capacity level that’s greater than you need) and only then begin to add regularization or downsize your model. Beware of validation-set overfitting when tuning hyperparameters — the fact that your hyperparameters may end up being overspecialized to the validation set. Avoiding this is the purpose of having a separate test set!
  • Deploy your final model in production — as a web API, as part of a JavaScript or C++ application, on an embedded device, etc. Keep monitoring its performance on real-world data and use your findings to refine the next iteration of the model!

关键网络架构

Key network architectures

读完本书后,您应该熟悉的网络架构类型包括:密集连接网络卷积网络循环网络扩散模型Transformer模型。每种模型都针对特定的数据模态:网络架构编码了 关于数据结构的假设——一个假设空间,寻找合适模型的过程就在这个空间中进行。特定架构能否解决特定问题,完全取决于数据结构与网络架构假设的匹配程度。

The families of network architectures that you should be familiar with after reading this book are densely connected networks, convolutional networks, recurrent networks, Diffusion Models, and Transformers. Each type of model is meant for specific data modalities: a network architecture encodes assumptions about the structure of the data — a hypothesis space within which the search for a good model will proceed. Whether a given architecture will work on a given problem depends entirely on the match between the structure of the data and the assumptions of the network architecture.

这些不同的网络类型可以轻松组合,构建更大的多模态模型,就像拼搭乐高积木一样。某种程度上,深度学习层就像信息处理的乐高积木。表 20.1 简要概述了输入和输出模态之间的映射关系以及相应的网络架构。

输入 输出 模型
向量数据 类别概率,回归值 密集连接的网络
时间序列数据 类别概率,回归值 循环神经网络,Transformer
图片 类别概率,回归值 卷积神经网络
文本 类别概率,回归值 Transformer
文字、图片 文本 Transformer
文字、图片 图片 VAE,扩散模型

表 20.1:不同数据类型的模型架构

现在让我们快速回顾一下每种网络架构的具体特点。

密集连接的网络

Densely connected networks

密集连接网络是由 Dense多层网络堆叠而成,用于处理向量数据(其中每个样本都是一个数值或类别属性的向量)。这类网络不预设输入特征的特定结构:之所以称为 密集连接,是因为每一层的所有单元都Dense与其他所有单元相连。该层试图映射任意两个输入特征之间的关系;这与二维卷积层不同,后者仅关注局部关系。

密集连接网络最常用于分类数据(例如,输入特征为属性列表的数据),例如第 4 章中使用的波士顿房价数据集。它们也常被用作大多数网络的最终分类或回归阶段。例如,第 8 章介绍的卷积神经网络通常以一到两层结束Dense,第 13 章介绍的循环神经网络也是如此。

记住,要进行二元分类,请在层堆栈的末尾添加一个 Dense只有一个单元且带有sigmoid激活值的层,并将该激活值用作 binary_crossentropy损失函数。您的目标值应该是 0 或 1:

1
2
3
4
5
6
7
8
9
import keras
from keras import layers

inputs = keras.Input(shape=(num_input_features,))
x = layers.Dense(32, activation="relu")(inputs)
x = layers.Dense(32, activation="relu")(x)
outputs = layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.compile(optimizer="rmsprop", loss="binary_crossentropy")

要执行单标签分类(每个样本恰好只有一个类别),请在层堆栈的末尾添加一个Dense单元数等于类别数且带有softmax激活函数的层。如果目标变量是独热编码,则使用 (x, y)``categorical_crossentropy 作为损失函数;如果它们是整数,则使用 (x, y) sparse_categorical_ crossentropy

1
2
3
4
5
6
inputs = keras.Input(shape=(num_input_features,))
x = layers.Dense(32, activation="relu")(inputs)
x = layers.Dense(32, activation="relu")(x)
outputs = layers.Dense(num_classes, activation="softmax")(x)
model = keras.Model(inputs, outputs)
model.compile(optimizer="rmsprop", loss="categorical_crossentropy")

要执行多标签分类(其中每个样本可以属于多个类别),请在层堆栈的末尾添加一个Dense单元数等于类别数且具有sigmoid激活值的层,并将该激活值用作 binary_crossentropy损失函数。您的目标应该进行 k 热编码:

1
2
3
4
5
6
inputs = keras.Input(shape=(num_input_features,))
x = layers.Dense(32, activation="relu")(inputs)
x = layers.Dense(32, activation="relu")(x)
outputs = layers.Dense(num_classes, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.compile(optimizer="rmsprop", loss="binary_crossentropy")

要对连续值向量进行回归Dense,请在层堆栈的末尾添加一个单元数等于要预测的值的数量(通常是一个值,例如房价)且不启用激活函数的层。回归可以使用多种损失函数,最常用的是均方误差mean_squared_error(MSE)。

1
2
3
4
5
6
inputs = keras.Input(shape=(num_input_features,))
x = layers.Dense(32, activation="relu")(inputs)
x = layers.Dense(32, activation="relu")(x)
outputs = layers.Dense(num_values)(x)
model = keras.Model(inputs, outputs)
model.compile(optimizer="rmsprop", loss="mse")

卷积神经网络

ConvNets

卷积层通过对输入张量中不同的空间位置()应用相同的几何变换来处理空间局部模式。这使得表示具有平移不变性,从而使卷积层具有极高的数据效率和模块化特性。这种思想适用于任何维度的空间:一维(连续序列)、二维(图像)、三维(体数据)等等。您可以使用Conv1D卷积层处理序列,Conv2D使用图像层处理图像,使用Conv3D体数据层处理体数据。作为卷积层的更精简、更高效的替代方案,您还可以使用深度可分离卷积层,例如SeparableConv2D……

卷积神经网络ConvNets)由卷积层和最大池化层堆叠而成。池化层可以对数据进行空间下采样,这对于在特征数量增长时保持特征图大小合理,以及使后续卷积层能够“看到”更大范围的输入数据至关重要。卷积神经网络通常以最大池化层Flatten 或全局池化层结尾,将空间特征图转换为向量,然后通过后续的分类或Dense回归层来实现分类或回归任务。

这是一个典型的图像分类网络(在本例中为类别分类),它使用SeparableConv2D多层结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
inputs = keras.Input(shape=(height, width, channels))
x = layers.SeparableConv2D(32, 3, activation="relu")(inputs)
x = layers.SeparableConv2D(64, 3, activation="relu")(x)
x = layers.MaxPooling2D(2)(x)
x = layers.SeparableConv2D(64, 3, activation="relu")(x)
x = layers.SeparableConv2D(128, 3, activation="relu")(x)
x = layers.MaxPooling2D(2)(x)
x = layers.SeparableConv2D(64, 3, activation="relu")(x)
x = layers.SeparableConv2D(128, 3, activation="relu")(x)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(32, activation="relu")(x)
outputs = layers.Dense(num_classes, activation="softmax")(x)
model = keras.Model(inputs, outputs)
model.compile(optimizer="rmsprop", loss="categorical_crossentropy")

构建非常深的卷积神经网络时,通常会添加 批量归一化层以及残差连接 ——这两种架构模式有助于梯度信息在网络中平滑流动。

Transformers

个人注:Transformer 的命名由来。

“Transformer” 这个名字并非随意而取,它由该论文的第一作者 Ashish Vaswani 及其团队在 2017 年提出。这个名字背后既有技术本质的支撑,也有一点点对流行文化的致敬。

以下是这个名字由来的三个核心维度:

  1. 技术本质:改变实体的“形态” (Transforming)

在传统的循环神经网络(RNN)中,信息是像流水一样顺序处理的。而 Transformer 的核心操作是自注意力机制(Self-Attention)

  • 转换 (Transform):模型并不只是“阅读”文字,而是将每一个输入的词元(Token)通过注意力权重,转换成一个新的、包含了上下文信息的向量表示。
  • 空间重构:它将输入的原始特征空间,通过多层叠加,不断地“转换”到更高维、更具语义的表示空间。这种对数据表示形式的不断“变换”,是其名字最直接的工程学含义。
  1. 结构对称性:从编码到解码的转化

Transformer 最初是为机器翻译设计的,其架构分为两大部分:

  1. Encoder(编码器):负责将源语言(如中文)“转换”为抽象的语义概念。
  2. Decoder(解码器):负责将这些抽象概念“转换”回目标语言(如英文)。

这种“输入 \(\rightarrow\) 语义 \(\rightarrow\) 输出”的全程转换逻辑,使得 Transformer 就像一个大型的语言信号转换器

  1. 流行文化:致敬《变形金刚》

这是一个有趣的幕后故事。在命名时,Google 的研究团队确实想到了 《变形金刚》(Transformers)

  • 模块化思想:就像变形金刚是由各种零件组合、可以变换形态一样,Transformer 模型也是高度模块化的。它由许多完全相同的“层(Layers)”堆叠而成,这些层可以根据任务需求灵活调整。
  • 名字的竞争:据说团队当时也考虑过类似“Cargo Net”或“Attention Net”的名字,但显然“Transformer”听起来更酷、更具未来感,也暗示了这种模型能够“变幻”出处理各种任务(视觉、语音、文本)的强大潜力。
  1. 为什么它没有叫 "AttentionNet"?

虽然自注意力机制是其核心,但作者们认为 “Transformer”更能体现出模型对信息流的重塑能力

  • RNN 是在“传递” (Recurrent) 信息。
  • CNN 是在“过滤” (Convolutional) 信息。
  • Transformer 是在“重构/转化” (Transforming) 信息。

Transformer 会查看一组向量(例如词向量),并利用神经注意力机制 将每个向量转换为能够感知 集合中其他向量所提供的上下文信息的表示。当处理的对象是一个有序序列时,还可以使用位置编码来创建能够同时考虑全局上下文和词序的 Transformer,从而比 RNN 或一维卷积神经网络更有效地处理长文本段落。

Transformer 可用于任何集合处理或序列处理任务,包括文本分类,但它们尤其擅长 序列到序列的学习,例如将源语言中的段落翻译成目标语言。

序列到序列Transformer由两部分组成:

  • TransformerEncoder将输入向量序列转换为上下文感知、顺序感知的输出向量序列的函数
  • 一个TransformerDecoder接受输出结果TransformerEncoder以及目标序列的函数,预测目标序列中接下来应该是什么。

个人注:不是说Transformer模型只有解码层吗?

这是一个非常经典的概念混淆点。之所以你会产生“Transformer 只有解码层”的印象,是因为你最近接触的大多是类似 GPT 这样的模型,但从 Transformer 的原始定义和全貌来看,它确实是一个由编码器(Encoder)和解码器(Decoder)组成的“两件套”。

我们可以从以下三个维度来拆解这个误区:

  1. 原始定义:序列到序列 (Seq2Seq)

Transformer 诞生于 2017 年的论文《Attention is All You Need》,最初是为了解决机器翻译(例如:中文 \(\rightarrow\) 英文)而设计的。

  • Encoder(编码器)的作用:它像是一个“深度理解者”。它观察整个源句子(比如“我爱编程”),通过自注意力机制,把每个词都转化成包含全局背景的向量。它不负责预测,只负责“理解”
  • Decoder(解码器)的作用:它像是一个“创造者”。它手里拿着 Encoder 给出的“理解笔记”,结合已经翻译出来的词,去预测下一个词是什么。
  1. 为什么你听到的往往只有“解码层”?

随着技术演进,研究者发现 Transformer 的这两个组件可以“拆开卖”,并由此衍生出了三大流派:

  1. 仅编码器 (Encoder-only)
    • 代表作:BERT
    • 特点:擅长理解、分类、判别(比如判断一段话的情绪),但不擅长生成长文本。
  2. 仅解码器 (Decoder-only)
    • 代表作:GPT 系列、Llama、Claude
    • 特点:这就是你现在最熟悉的大模型。它们去掉了 Encoder,直接在 Decoder 里完成理解和生成。由于这类模型在“生成”任务上表现极佳,导致目前市面上 90% 的流行模型都是这一类,所以你会产生“Transformer 只有解码层”的错觉。
  3. 完整版 (Encoder-Decoder)
    • 代表作:T5、BART
    • 特点:依然保持原始结构,在翻译和长文本摘要任务中表现依然稳健。
  4. 如何理解你引用的这段话?

这段话描述的是最完整、最严谨的 Transformer 逻辑

  • “将输入向量转换为上下文感知的输出向量”:这就是 Encoder 在做的事情。它把每个孤立的词变成了带有“灵魂”(上下文信息)的特征向量。
  • “接受输出结果...预测接下来应该是什么”:这就是 Decoder 在做的事情。它不是凭空乱猜,而是参考 Encoder 提供的“上下文感知向量”来决定下一个字。

形象类比:同声传译

  • Encoder 是那个听众:他听完一整段中文,脑子里形成了一个关于这段话意思的“核心轮廓”(上下文感知向量)。
  • Decoder 是那个翻译员:他根据听众传过来的“核心轮廓”,结合自己刚说出的英文单词,努力憋出下一个英文单词。

总结一下:

你看到的 GPT 类大模型确实只有解码器(或者说,它们把“理解”的功能也整合进了解码过程),但 Transformer 的标准教科书定义永远包含 Encoder(读)Decoder(写) 两部分。

如果你只处理单个向量序列(或集合),那么你只需要使用TransformerEncoder.

以下是一个序列到序列转换器,用于将源序列映射到目标序列(例如,此设置可用于机器翻译或问答系统):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from keras_hub.layers import TokenAndPositionEmbedding
from keras_hub.layers import TransformerDecoder, TransformerEncoder

# Source sequence
encoder_inputs = keras.Input(shape=(src_seq_length,), dtype="int64")
x = TokenAndPositionEmbedding(vocab_size, src_seq_length, embed_dim)(
encoder_inputs
)
encoder_outputs = TransformerEncoder(intermediate_dim=256, num_heads=8)(x)
# Target sequence so far
decoder_inputs = keras.Input(shape=(dst_seq_length,), dtype="int64")
x = TokenAndPositionEmbedding(vocab_size, dst_seq_length, embed_dim)(
decoder_inputs
)
x = TransformerDecoder(intermediate_dim=256, num_heads=8)(x, encoder_outputs)
# Predictions for target sequence one step in the future
decoder_outputs = layers.Dense(vocab_size, activation="softmax")(x)
transformer = keras.Model([encoder_inputs, decoder_inputs], decoder_outputs)
transformer.compile(optimizer="adamw", loss="categorical_crossentropy")

这是TransformerEncoder整数序列二元分类的一个单独示例:

1
2
3
4
5
6
7
inputs = keras.Input(shape=(seq_length,), dtype="int64")
x = TokenAndPositionEmbedding(vocab_size, seq_length, embed_dim)(inputs)
x = TransformerEncoder(intermediate_dim=256, num_heads=8)(x)
x = layers.GlobalMaxPooling1D()(x)
outputs = layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.compile(optimizer="adamw", loss="binary_crossentropy")

循环神经网络

Recurrent neural networks

循环神经网络(RNN)的工作原理是每次处理一个时间步长的输入序列,并始终保持一个状态(状态通常是一个向量或一组向量)。对于感兴趣的模式在时间平移中不保持不变的序列(例如,近期数据比远期数据更重要的时间序列数据),应优先使用循环神经网络而不是一维卷积神经网络。

Keras 提供了三种 RNN 层:SimpleRNN``______GRU``____________LSTM。在大多数实际应用中,您应该使用 `______GRU______ LSTM``。 LSTM______功能更强大,但成本也更高;您可以将______视为______`GRU的更简单、更经济的替代方案。

要将多个 RNN 层堆叠在一起,堆叠中最后一层之前的每一层都应该返回其输出的完整序列(每个输入时间步都对应一个输出时间步);如果没有堆叠任何进一步的 RNN 层,则通常只返回最后一个输出,其中包含有关整个序列的信息。

下面是一个用于向量序列二元分类的单层循环神经网络(RNN):

1
2
3
4
5
inputs = keras.Input(shape=(num_timesteps, num_features))
x = layers.LSTM(32)(inputs)
outputs = layers.Dense(num_classes, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.compile(optimizer="rmsprop", loss="binary_crossentropy")

这是一个用于向量序列二元分类的堆叠式 RNN 层:

1
2
3
4
5
6
7
inputs = keras.Input(shape=(num_timesteps, num_features))
x = layers.LSTM(32, return_sequences=True)(inputs)
x = layers.LSTM(32, return_sequences=True)(x)
x = layers.LSTM(32)(x)
outputs = layers.Dense(num_classes, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.compile(optimizer="rmsprop", loss="binary_crossentropy")

深度学习的局限性

Limitations of deep learning

构建深度学习模型就像玩乐高积木:只要有合适的训练数据,并且可以通过合理复杂度的连续几何变换实现映射,就可以将各个层连接起来,将几乎任何事物映射到任何事物。

但问题在于——这种映射关系通常无法以可泛化的方式学习。深度学习模型就像一个庞大的、插值式的模式数据库。它们在模式匹配方面的优势也是它们的核心弱点:

  • 它们从根本上来说难以适应新情况。 由于训练后参数固定,它们只能检索或复制与训练数据相似的模式。一旦输入数据显著超出这种熟悉的分布范围——无论底层任务多么简单——它们的性能都会急剧下降,因为它们缺乏超越记忆经验的灵活泛化机制。这就解释了为什么即使是大型模型在新任务或熟悉问题的简单变体(例如 ARC-AGI 任务)上也会失败。
  • 它们对措辞和其他干扰因素非常敏感。深度学习模型对输入呈现方式的表面变化表现出高度敏感性,例如细微的措辞变化(考虑低层次模型中的提示敏感性)或难以察觉的扰动(考虑视觉中的对抗样本),这表明它们缺乏像人类一样强大的理解能力。
  • 它们通常无法学习可泛化的算法。 深度学习模型的连续性和几何特性使其从根本上不适合学习精确的、离散的、逐步执行的算法,例如经典计算机科学中那些至关重要的算法。这些模型通过插值来近似处理此类过程,而不是实现稳健且可泛化的程序。
  • They fundamentally struggle to adapt to novelty. Because their parameters are fixed after training, they can only retrieve or replicate patterns similar to their training data. Faced with inputs significantly outside this familiar distribution — no matter how simple the underlying task — their performance degrades drastically, as they lack mechanisms for fluid generalization beyond their memorized experience. This explains why even large models fail on novel tasks or simple variations of familiar problems — like ARC-AGI tasks.
  • They’re very sensitive to phrasing and other distractors. Deep learning models exhibit high sensitivity to superficial variations in input presentation, such as minor phrasing changes (consider prompt sensitivity in LLMs) or imperceptible perturbations (consider adversarial examples in vision), indicating a lack of robust, human-like understanding.
  • They often can’t learn generalizable algorithms. The continuous, geometric nature of deep learning models makes them fundamentally ill-suited for learning exact, discrete, step-by-step algorithms, such as those that are the bread and butter of classical computer science. Models approximate such processes through interpolation rather than implementing robust, generalizable procedures.

你应该始终抵制将深度学习模型拟人化的诱惑。它们的性能建立在逐点的统计模式之上,而非类似人类的经验基础,因此当遇到与训练数据偏差的情况时,它们会变得非常脆弱。

认为仅仅增加模型规模和训练数据就能实现通用智能的说法已被证明是不够的。虽然规模扩大可以提升在记忆测试等基准测试中的表现,但它无法解决深度学习的根本局限性,这些局限性源于其核心范式——将静态插值曲线拟合到数据上。五年来,LLMs的指数级增长并未克服这些限制,因为其底层方法仍然没有改变。

到2024年,这一认识促使人们转向测试时自适应(TTA)模式,即模型在推理阶段进行搜索或微调,以适应新的问题。尽管TTA方法已取得重大突破,例如OpenAI的o3在2024年底超越了人类基准测试ARC-AGI-1,但这种性能提升是以极高的计算成本为代价的。高效且类人化的自适应仍然是一个完全开放的问题,难度稍高的ARC-AGI-2基准测试至今仍未得到解决。我们仍然需要在概念层面取得进一步的进展,而不仅仅是简单的扩展或穷举搜索。

未来可能会发生什么?

What might lie ahead

要实现类人流体智能(human-like fluid intelligence)(以及ARC-AGI-2),就必须突破现有方法的固有局限性。深度学习虽然擅长以价值为中心的抽象,从而实现模式识别和直觉,但它从根本上缺乏以程序为中心的抽象能力,而后者正是离散推理、规划和因果理解的基础。人类智能能够无缝地融合这两种能力——未来的人工智能也必须做到这一点。

While deep learning excels at value-centric abstraction, which enables pattern recognition and intuition, it fundamentally lacks capabilities for program-centric abstraction, which underpins discrete reasoning, planning, and causal understanding. Human intelligence seamlessly integrates both — future AI must do the same.

未来的关键发展可能包括

  • 混合模型——未来的模型很可能会将已学习的算法模块(提供推理和符号操作)与深度学习模块(提供感知和直觉)相结合。这些系统或许能够动态地学习使用控制流、变量、递归和复杂数据结构等编程原语。
  • 深度学习引导的程序搜索——程序合成——能够自动发现符合规范的可执行代码,为以程序为中心的抽象提供了一条途径。然而,它对低效离散搜索的依赖是一个主要的瓶颈。一项关键的进步在于利用深度学习来引导这种搜索,利用对程序结构的学习直觉,高效地在庞大的程序组合空间中导航,就像人类开发者利用经验和直觉来缩小选择范围一样。
  • 模块化重组和终身学习——我们将摒弃从零开始训练的单体式端到端模型。未来的AI系统将使用庞大的可重用模块化组件库,这些组件库可以从经验中汲取知识,并应用于各种问题。这些组件库将包含“几何”(基于深度学习)模块和“算法”模块。当遇到新问题时,这类AI系统会获取相关模块,并动态地将它们重组为适应当前情况的新模型。每当系统在解决问题的过程中产生可重用组件时,该组件就会被添加到组件库中,从而可用于系统未来可能遇到的所有任务。
  • Hybrid models — Future models will likely integrate learned algorithmic modules (providing reasoning and symbolic manipulation) with deep learning modules (providing perception and intuition). These systems might learn to use programming primitives like control flow, variables, recursion, and complex data structures dynamically.
  • Deep-learning guided program search — Program synthesis — automatically discovering executable code that meets specifications — offers a route to program-centric abstraction. However, its reliance on inefficient discrete search is a major bottleneck. A crucial advance will be using deep learning to guide this search, utilizing learned intuition about program structure to navigate vast, combinatorial spaces of programs efficiently, much like human developers use experience and intuition to narrow down their choices.
  • Modular recombination and lifelong learning — We’ll move away from monolithic, end-to-end models trained from scratch. Instead, future AI systems will use massive libraries of reusable, modular components that can be repurposed across many problems, acquired from experience. These libraries will feature both “geometric” (deep learning based) and “algorithmic” modules. When faced with a new problem, such AI systems will fetch relevant modules and dynamically recombine them into a new model adapted to the situation at hand. Whenever the system ends up developing a reusable component as a by-product of this problem-solving loop, the new component would get added to the library, becoming available for every future task the system might encounter.

最终,要开发出能够反映人类流体智能的人工智能,就需要将连续模式识别与离散的符号程序结合起来,并完全接受即时适应的范式。

在快速发展的领域保持与时俱进

Staying up to date in a fast-moving field

最后,我想就如何继续学习和更新知识技能提出一些建议,即使你读完了这本书。我们今天所知的现代深度学习领域,尽管有着长达数十年的缓慢发展历程,但实际上它只有短短几年的历史。自2013年以来,随着资金投入和研究人员数量的指数级增长,整个领域正以惊人的速度发展。你在本书中学到的知识不会永远适用,也并非你未来职业生涯所需的全部知识。

幸运的是,有很多免费的在线资源可以帮助你了解最新资讯并拓展视野。以下是一些例子。

使用 Kaggle 练习解决实际问题

Practice on real-world problems using Kaggle

获得实际经验的有效途径之一是尝试参加 Kaggle(https://kaggle.com)上的机器学习竞赛。学习的唯一真正途径是实践和实际编码——这正是本书的理念,而 Kaggle 竞赛正是这一理念的自然延伸。在 Kaggle 上,您可以找到一系列不断更新的数据科学竞赛,其中许多都涉及深度学习,这些竞赛由一些公司发起,旨在为他们最具挑战性的机器学习问题找到创新解决方案。优胜者将获得相当丰厚的奖金。

通过参加一些比赛,或许可以作为团队的一部分,你将更加熟悉本书中描述的一些高级最佳实践的实际应用,特别是超参数调优、避免验证集过拟合和模型集成。

请阅读arXiv上的最新进展

Read about the latest developments on arXiv

与其他一些科学领域不同,深度学习研究完全公开透明。论文一旦定稿,便会立即公开免费获取,许多相关软件也是开源的。arXiv(https://arxiv.org)——发音为“archive”(X 代表希腊字母chi)——是一个开放获取的预印本服务器,专门收录物理、数学和计算机科学领域的研究论文。它已成为了解机器学习和深度学习前沿进展的首选途径。绝大多数深度学习研究人员会在论文完成后不久将其上传到 arXiv。这使他们能够迅速发表研究成果,无需等待会议接收(通常需要数月时间),这对于快速发展且竞争激烈的深度学习领域至关重要。这也使得该领域能够飞速发展:所有新发现都能立即供所有人查看和借鉴。

一个重要的缺点是,arXiv 上每天发布的论文数量庞大,根本无法一一浏览。而且,由于这些论文未经同行评审,因此很难从中识别出既重要又高质量的论文。从海量信息中找到有价值的内容,难度越来越大。不过,一些工具可以提供帮助:例如,你可以使用 Google Scholar(https://scholar.google.com)来追踪你关注的作者发表的论文。

探索 Keras 生态系统

Explore the Keras ecosystem

截至 2025 年初,Keras 的用户已超过 250 万,并且还在不断增长,它拥有庞大的教程、指南和相关开源项目生态系统:

结语

Python深度学习课程到此结束!希望您能从中学到一些关于机器学习、深度学习、Keras,甚至认知方面的知识。学习是一生的旅程,尤其是在人工智能领域,我们面临的未知远多于确定。所以请继续学习、提问和研究,永不停歇。因为即便取得了目前的进展,人工智能领域的大多数基本问题仍然没有答案。许多问题甚至还没有被真正提出。

脚注

  1. 理查德·费曼访谈,《从另一个角度看世界》,约克郡电视台,1972年。

书籍各章的机翻md文件:
《DEEP LEARNING with Python》第一章 什么是深度学习?
《DEEP LEARNING with Python》第二章 神经网络的数学基础
《DEEP LEARNING with Python》第三章 TensorFlow、PyTorch、JAX 和 Keras 简介
《DEEP LEARNING with Python》第四章 分类与回归
《DEEP LEARNING with Python》第五章 机器学习基础
《DEEP LEARNING with Python》第六章 机器学习的通用工作流程
《DEEP LEARNING with Python》第七章 深入了解 Keras
《DEEP LEARNING with Python》第八章 图像分类
《DEEP LEARNING with Python》第九章 卷积神经网络架构模式
《DEEP LEARNING with Python》第十章 解读卷积神经网络的学习成果
《DEEP LEARNING with Python》第十一章 图像分割
《DEEP LEARNING with Python》第十二章 目标检测
《DEEP LEARNING with Python》第十三章 时间序列预测
《DEEP LEARNING with Python》第十四章 文本分类
《DEEP LEARNING with Python》第十五章 语言模型和Transformer
《DEEP LEARNING with Python》第十六章 文本生成
《DEEP LEARNING with Python》第十七章 图像生成
《DEEP LEARNING with Python》第十八章 现实世界的最佳实践
《DEEP LEARNING with Python》第十九章 人工智能的未来
《DEEP LEARNING with Python》第二十章 结论