学习神作《从零构建大模型》精读 第二章2.3~2.7

发布于:2025-07-03 ⋅ 阅读:(20) ⋅ 点赞:(0)

2025-7-2 07:19:52

接下来,我们将把这些词元从Python字符串转换为整数表示,以生成词元ID(token ID)。这一过程是将词元ID转换为嵌入向量前的必经步骤。

构建词汇表的过程:

首先将训练集中的全部文本分词成独立的词元;然后将这些词元按字母顺序进行排列,并删除重复的词元;接下来将唯一的词元聚合到一张词汇表中,该词汇表定义了每个唯一的词元到唯一的整数值的映射。

逆向词汇表

2.4 引入特殊上下文词元

为了处理未知的单词,需要对分词器进行必要的修改。接下来,我们将探讨如何通过引入特殊上下文词元,来增强模型对上下文和其他相关信息的理解。这些特殊词元可能包括用于标识未知词汇和文档边界的词元。

2.5 BPE

本节将介绍一种基于BPE概念的更复杂的分词方案。BPE分词器用于训练大语言模型,比如GPT-2、GPT-3和ChatGPT的原始模型。

BPE算法的原理是将不在预定义词汇表中的单词分解为更小的子词单元甚至单个字符,从而能够处理词汇表之外的单词。因此,得益于BPE算法,如果分词器在分词过程中遇到不熟悉的单词,它可以将其表示为子词词元或字符序列

BPE分词器会将未知单词分解为子词和单个字符。如此一来,BPE分词器便可以解析任何单词,而无须使用特殊词元来替换未知单词

将未知单词分解为单个字符的能力确保了分词器以及用其训练的大语言模型能够处理任何文本,即使文本中包含训练数据中不存在的单词。

简单来说,BPE通过将频繁出现的字符合并为子词,再将频繁出现的子词合并为单词,来迭代地构建词汇表。具体来说,BPE首先将所有单个字符(如“a”“b”等)添加到词汇表中。然后,它会将频繁同时出现的字符组合合并为子词。例如,“d”和“e”可以合并为子词“de”,这是“define”“depend”“made”“hidden”等许多英语单词中的常见组合。字符和子词的合并由一个频率阈值来决定。

2.6 使用滑动窗口进行数据采样
图2-12 给定一个文本样本,我们从中提取子样本,作为输入块提供给大语言模型。在训练过程中,模型的任务是预测输入块之后的下一个词,我们会屏蔽目标词之后的所有单词。必须说明的是,在大语言模型处理文本之前,文本会经过分词处理,但为了更清晰地说明,这里省略了分词步骤
2025-7-2 07:45:28

2025-7-2 08:01:39start
2.7 创建词元嵌入 本次阅读到这节,理解出了问题,该去阅读参阅部分以及编码加深理解了。
有关安装PyTorch的更多信息和详细指导,请参阅A.1.3节。

注意 如果你不熟悉PyTorch的Dataset类(参见代码清单2-5)的结构,请阅读A.6节,该节解释了PyTorch的Dataset类和DataLoader类的一般结构和用法。
注意 如果你对神经网络通过反向传播进行训练的过程不熟悉,请参阅A.4节。

附录A PyTorch简介
首先,我们将指导你搭建一个支持PyTorch和GPU的深度学习工作台。然后,我们将介绍张量的基本概念及其在PyTorch中的用法。接下来,我们将深入探讨PyTorch的自动微分引擎,这一特性使我们能够方便且高效地使用反向传播,这也是神经网络训练的重要环节。
本附录的目标是为那些刚接触PyTorch深度学习的读者提供入门资料。虽然我们会从零开始讲解PyTorch,但不会覆盖其所有功能,而是聚焦于实现大语言模型所需的PyTorch的基本概念。

A.1 什么是PyTorch
PyTorch是一个开源的基于Python的深度学习库。根据Papers With Code这个跟踪和分析研究论文平台的数据,自2019年以来,PyTorch已成为研究领域使用最广泛的深度学习库,并且领先优势显著。此外,根据2022年Kaggle数据科学与机器学习调查,大约40%的受访者正在使用PyTorch,并且这一比例每年都在增长。
PyTorch之所以如此受欢迎,原因之一在于其用户友好的界面和高效性。它不仅易于使用,还保留了高度的灵活性,允许专业用户深入修改模型的底层组件,以实现个性化和优化。总之,对许多从业者和研究人员而言,PyTorch在可用性和特性之间提供了恰到好处的平衡。

A.1.1 PyTorch的三大核心组件
PyTorch是一个相对全面的库,我们可以通过关注其三大核心组件来理解它,如图A-1所示。
首先,PyTorch是一个张量库,它扩展了NumPy基于数组的编程功能,增加了GPU加速特性,从而实现了CPU和GPU之间的无缝计算切换。其次,PyTorch是一个自动微分引擎,也称为autograd,它能够自动计算张量操作的梯度,从而简化反向传播和模型优化。最后,PyTorch是一个深度学习库,它提供了模块化、灵活且高效的构建块(包括预训练模型、损失函数和优化器),能够帮助研究人员和开发人员轻松设计和训练各种深度学习模型。

PyTorch的三大核心组件包括作为计算基础构建块的张量库、用于模型优化的自动微分引擎以及深度学习工具函数,这使得实现和训练深度神经网络模型更加容易

A.1.2 定义深度学习
深度学习是机器学习的一个子类别,专注于实现深度神经网络。
机器学习是人工智能的一个子类别,涉及从数据中学习的算法。
人工智能是一个更广泛的概念,指的是机器能够执行通常需要人类智能水平的任务

深度学习是机器学习的一个子类别,专注于深度神经网络的训练和应用。这些深度神经网络最初受到人脑工作原理(特别是许多神经元之间的相互连接)的启发。深度学习中的“深度”指的是人工神经元或节点的多个隐藏层,这些层使它们能够对数据中的复杂非线性关系进行建模。与传统机器学习技术擅长简单模式识别不同,深度学习擅长处理诸如图像、音频、文本之类的非结构化数据,因此特别适合用于大语言模型。

机器学习和深度学习中典型的预测建模工作流程(也称为监督学习)
在这里插入图片描述
图A-3 监督学习的预测建模工作流程包括一个训练阶段,在该阶段中,模型在训练数据集中带标签的示例上进行训练。训练好的模型随后可用于预测新观测数据的标签

A.1.3 安装PyTorch

练习A.2
运行https://mng.bz/o05v上的补充代码,检查你的环境是否正确设置(访问不到网址,网络问题)

A.2 理解张量

张量

**张量表示一个数学概念,它可以将向量和矩阵推广到潜在的更高维度。换句话说,张量是可以通过其阶数(或秩)来表征的数学对象,其中阶数提供了维度的数量。**例如,标量(仅是一个数值)是秩为0的张量,向量是秩为1的张量,矩阵是秩为2的张量,如图A-6所示。
[插图]
图A-6 不同秩的张量。这里零维对应于秩0,一维对应于秩1,二维对应于秩2。一个由3个元素组成的三维向量仍然是秩为1的张量

从计算的角度来看,张量是一种数据容器。举例来说,它们存储多维数据,其中每个维度表示一个不同的特征。

PyTorch张量

PyTorch张量类似于NumPy数组,但具有几个对深度学习至关重要的附加功能。例如,PyTorch添加了一个自动微分引擎,简化了梯度计算(参见A.4节)。PyTorch张量还支持GPU计算,以加速深度神经网络的训练(参见A.8节)。
具有与NumPy类似API的PyTorch
PyTorch采用了大部分NumPy数组API和语法来进行张量操作。如果你对NumPy不熟悉,可以通过我的文章“Scientific Computing in Python: Introduction to NumPy and Matplotlib”简要了解最相关的概念。
2025-7-2 08:27:38 end

2025-7-2 08:37:20 start
A.2.1 标量、向量、矩阵和张量
如前所述,PyTorch张量是用于与数组类似结构的数据容器。
标量是零维张量(例如,仅一个数值),
向量是一维张量
矩阵是二维张量
对于更高维的张量没有特定的术语
因此通常将三维张量称为“3D张量”,以此类推。可以使用torch.tensor()函数创建PyTorch的Tensor类对象,如代码清单A-1所示。
代码清单A-1 创建PyTorch张量代码清单A-1 创建PyTorch张量

类似于.reshape和.view,在某些情况下,PyTorch提供了多种语法选项来执行相同的计算。PyTorch最初遵循了原始Lua版本Torch的语法约定,但后来应用户的要求,添加了与NumPy类似的语法。(.view()和.reshape()的微妙区别在于它们对内存布局的处理方式:.view()要求原始数据是连续的,如果不是,它将无法工作,而.reshape()会工作,如有必要,它会复制数据以确保所需的形状。)

可以使用.T来转置张量,这意味着将其沿对角线翻转。

PyTorch中常用的矩阵相乘方法是.matmul方法:
也可以使用@运算符,它能够更简洁地实现相同的功能:

A.3 将模型视为计算图
对于我来说遇到的概念问题:
PyTorch的自动微分引擎,也称为autograd。PyTorch的autograd系统能够在动态计算图中自动计算梯度。
梯度是什么? 下面是我AI出来的内容,学习一下。

梯度是一个数学概念,它在机器学习领域尤其是深度学习中扮演着至关重要的角色。简单来说,梯度是一个向量,包含了某个函数在某一点上的所有偏导数。对于一个多变量的函数,梯度指向的是函数值增加最快的方向,其方向是函数在该点处增长最快的方向,而它的模则代表了这个增长速率。
在机器学习和深度学习的背景下,我们通常使用梯度来优化模型参数。例如,在训练神经网络时,我们定义一个损失函数,该函数衡量模型预测结果与实际目标之间的差异。我们的目标是最小化这个损失函数。通过计算损失函数相对于模型参数的梯度,我们可以了解如何调整这些参数以减少损失。这个过程通常是通过梯度下降法(或其变种)实现的,其中参数按照梯度的反方向更新,以期望找到使损失函数最小化的参数值。
PyTorch的autograd系统自动跟踪张量上的操作,构建一个动态计算图,使得能够自动计算涉及的梯度。这意味着用户不需要手动计算梯度,这大大简化了模型的训练过程,尤其是在处理复杂的神经网络结构时。当需要计算梯度时,只需调用.backward()方法,autograd就能自动计算之前定义的计算图中各参数的梯度。

计算图是一种有向图,主要用于表达和可视化数学表达式。在深度学习的背景下,计算图列出了计算神经网络输出所需的计算顺序——我们需要用它来计算反向传播所需的梯度,这是神经网络的主要训练算法。
计算图是什么?,我很困惑加深加深下理解
我理解的上面的一系列表示的内容就是计算图吧
2025-7-2 9:45:00 end

学习小结

目前附录A学到A.3。暂时回顾总结一下A.1~3。
目前正文学习到2.7. 2.7没理解。

下一步的学习计划:

1、把2.7到2.9的小结,先学完;
2、就此以前两章的内容开始编程练习,加深理解;

不能总是贪多,要注意消化吸收,不然积食难受!
2025-7-2 10:03:06 end