作为一名工作接近5年的PNC算法攻城狮,由于一致在做传统算法,对模型训练一直没有深入了解,随着最近大模型的兴起,各大头部公司都在布局自动驾驶大模型的开发,深感前途渺茫,是时候学习一下大模型的基本原理了,就从这篇transformer开始吧。
以下是原文,强推大家去看原文,英文水平有限,翻译不对的地方请大佬指出!
https://jalammar.github.io/illustrated-transformer/jalammar.github.io/illustrated-transformer/
概览
把transformer看成一个黑盒,以翻译文本为例,一个输入经过黑盒转换成特定的期望。
打开黑盒,里面是一个encoders 和 decoders
encoders是由多个encoder组成,decoders由多个decode组成,论文中是6个,如下图
encoder由两部分组成,self_attention 和 feed forward neural network
编码器的输入首先流经自注意力层——该层可帮助编码器在编码特定单词时查看输入句子中的其他单词。我们将在后面的文章中更详细地介绍自注意力。
自注意力层的输出被馈送到前馈神经网络。完全相同的前馈网络独立应用于每个位置。
解码器也具有这两个层,但它们之间加了一个注意力层,可帮助解码器关注输入句子的相关部分(类似于注意力在 seq2seq 模型中的作用)。
引入张量
张量是通用的多维数组,它可以包含标量、向量、矩阵甚至更高维度的数据 。
1. 张量的定义
张量是多维数组的泛化,具体来说:
- 标量(Scalar) 是零维张量,如一个数值 5。
- 向量(Vector) 是一维张量,如 [1, 2, 3]。
- 矩阵(Matrix) 是二维张量,如 [[1, 2], [3, 4]]。
- 高维张量 是三维及以上的张量,如 [[[1], [2]], [[3], [4]]]。
2. 张量的属性
每个张量都有以下几个主要属性:
- 维度(Rank):张量的维度数,即轴的数量。
- 形状(Shape):张量在每个维度上的大小。例如,一个形状为 (3, 4) 的张量是一个 3x4 的矩阵。
- 数据类型(Data Type):张量中元素的数据类型,如 float32, int32 等。
3. 张量的操作
张量支持多种操作,包括但不限于:
- 数学运算:加法、减法、乘法、除法等。
- 线性代数操作:矩阵乘法、矩阵转置等。
- 张量变形:重塑(reshape)、展平(flatten)等。
- 切片和索引:提取子张量。
4. 深度学习中的张量
在深度学习中,张量是用于表示和处理数据的主要数据结构。以下是一些常见的应用:
- 输入数据:图像、文本、音频等输入数据通常表示为张量。例如,彩色图像可以表示为一个形状为 (height, width, channels) 的三维张量。
- 权重和偏置:神经网络的权重和偏置通常也是张量。
- 中间计算结果:前向传播和反向传播过程中,各层之间的中间结果也是张量。
5. 张量库
有许多深度学习库和框架提供了对张量的支持和操作,包括:
- TensorFlow:一个用于大规模机器学习的开源框架,由谷歌开发。它的名字就来源于“张量流”。
- PyTorch:一个流行的深度学习框架,由 Facebook 开发,广泛用于研究和生产中。
- NumPy:尽管主要是一个科学计算库,但它也提供了多维数组(即张量)支持,是许多深度学习库的基础。
现在我们已经了解了模型的主要组成部分,让我们开始研究各种向量/张量,以及它们如何在这些组件之间流动,从而将经过训练的模型的输入转化为输出。
与一般 NLP 应用中的情况一样,我们首先使用嵌入算法将每个输入词转化为向量。
嵌入仅发生在最底层的编码器中。所有编码器的共同抽象是它们接收一个向量列表,每个向量的大小为 512 – 在底层编码器中,这将是单词嵌入,但在其他编码器中,它将是直接位于下方的编码器的输出。此列表的大小是我们可以设置的超参数 – 基本上它将是我们训练数据集中最长句子的长度。
将单词嵌入到我们的输入序列中后,每个单词都会流经编码器的两层中的每一层。
在这里,我们开始看到 Transformer 的一个关键属性,即每个位置上的单词在编码器中都流经自己的路径。在自注意力层中,这些路径之间存在依赖关系。然而,前馈层没有这些依赖关系,因此在流经前馈层时,各种路径可以并行执行。
接下来,我们将示例切换为较短的句子,并查看编码器的每个子层中发生的情况。
Encodeing
正如我们已经提到的,编码器接收一个向量作为输入。它通过将这些向量传递到“自我注意”层,然后传递到前馈神经网络,然后将输出向上发送到下一个编码器。
Self -Attention 直观理解
不要被我随意使用“自注意力”这个词所欺骗,好像这是一个每个人都应该熟悉的概念。我个人在阅读《注意力就是你所需要的一切》这篇论文之前从未接触过这个概念。让我们提炼一下它的工作原理。
假设以下句子是我们要翻译的输入句子:
“动物没有过马路,因为它太累了”
class="hljs-button signin active add_def" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">
评论记录:
回复评论: