论文精读与复现:大名鼎鼎的Attention is all you need(上)

前段时间在山东旅游了一圈,骑完摩托喝啤酒的,除却胖了不少之外,也对自己的学习有了些新认识,比如发现自己对于LLM的一些认识完全是空中楼阁,热衷于那些最酷炫技术的实现方法,却知其然不知其所以然。就好像我看到威海码头的船来来往往,却不知道是什么在指引着它们的方向。因此我打算把一些和专业相关的很重要的论文好好读一读,也复现一下,锻炼自己的代码水平。

本文对于论文的阅读遵从我自己的习惯,即:abstract -> conclusion-> intro(结尾段) -> system description -> result and discussion -> background(如果实在意犹未尽的话) ,实验部分边读边复现。按理说对于这种重量级高手文章顺着读就行了,我这里这么写是为了安利自己的阅读习惯,效率很高hhhhh。如果文章没用的话到了第二步就可以知道它要不要继续读了。

同时为了治疗自己的健忘症(以及凑字数,我把前置知识也放在下面。以后翻阅的时候就好看了。原文部分里面加粗的部分都会在下面进行描述。中间算法部分很多地方参考了b站李沐老师的视频https://www.bilibili.com/video/BV1pu411o7BE/?t=202&vd_source=bb3caad7b56fb0501bc76e4ae5180726,强烈推荐!

OK,let’s go!

Abstract

The dominant sequence transduction models are based on complex recurrent or convolutional neural networks that include an encoder and a decoder. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new simple network architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence and convolutions entirely. Experiments on two machine translation tasks show these models to be superior in quality while being more parallelizable and requiring significantly less time to train. Our model achieves 28.4 BLEU on the WMT 2014 Englishto-German translation task, improving over the existing best results, including ensembles, by over 2 BLEU. On the WMT 2014 English-to-French translation task, our model establishes a new single-model state-of-the-art BLEU score of 41.8 after training for 3.5 days on eight GPUs, a small fraction of the training costs of the best models from the literature. We show that the Transformer generalizes well to other tasks by applying it successfully to English constituency parsing both with large and limited training data.

简单口译

2017年之前火的序列模型,无论是RNN还是LSTM、GRU,当时的序列模型都使用着复杂的循环结构或者卷积结构。在他们之中的最优模型使用了一些注意力机制将encoder和decoder进行连接。在这篇文章中,作者采用了名为transformer的新架构。该架构仅使用注意力机制,完全放弃了任何循环和卷积结构。transformer在翻译任务中,可以使用更少的时间进行训练,同时效果还更好。不仅仅是翻译任务,transformer可以运用到更多任务中。

前置知识

  • 序列转换模型
    “序列转换模型”(Sequence Transduction Models)是一类人工智能模型,它们专门设计用来将一个序列(比如文本、时间序列数据等)转换成另一个序列。这种模型在自然语言处理(NLP)、机器翻译、语音识别等领域有着广泛的应用。模型的输入是一个序列(例如,一种语言的句子),输出是另一种序列(例如,翻译后的句子。序列转换模型可以是基于规则的,也可以是基于统计的,或者是基于深度学习的。近年来,深度学习模型,尤其是基于循环神经网络(RNNs)、长短期记忆网络(LSTMs)和Transformer架构的模型,在序列转换任务上取得了显著的成功。
    在深度学习领域,2017年提出的Transformer模型是一个里程碑,它通过自注意力机制(self-attention)有效地处理长距离依赖问题,并在许多序列转换任务上取得了最先进的结果。随后的模型,如BERT(Bidirectional Encoder Representations from Transformers)和GPT(Generative Pre-trained Transformer)系列,都是基于Transformer架构,并在NLP领域产生了深远的影响。

  • 循环结构

    递归结构(Recurrent Structure)是一种在神经网络中使用的架构,它专门设计用来处理序列数据。这种结构的核心特点是它们在处理序列的每个元素时都会使用相同的核心神经网络模块,并且这些模块的输出会被循环地用作下一时刻的输入。递归神经网络(RNN)的基本单元会接收当前时间步的输入和前一时间步的隐藏状态,然后输出当前时间步的隐藏状态和(可选的)输出。

    在这里插入图片描述

    递归结构的中心是循环单元,它通常包含以下操作:

    • 输入门(可选,如在LSTM中):决定当前输入中有哪些信息需要更新到隐藏状态。
    • 遗忘门(可选,如在LSTM中):决定哪些信息需要从当前隐藏状态中丢弃。
    • 输出门(可选,如在LSTM中):决定当前隐藏状态中有哪些信息需要输出。
    • 细胞状态(可选,如在LSTM中):一个线性单元,负责在时间步之间传递信息
  • 卷积结构

    卷积结构(Convolutional Structure)是卷积神经网络(CNNs)的核心组成部分,广泛用于图像识别、图像处理和其他类型的特征提取任务。卷积结构模拟了人类视觉系统中的感受野概念,即每个神经元只响应其感受野内的视觉刺激。在CNN中,卷积层通过一系列可学习的过滤器(或称为卷积核)来提取输入数据中的特征。卷积层是卷积神经网络的基本构建块,它执行以下操作:

    • 过滤器(卷积核):一组可学习的参数,它们在输入数据上滑动(卷积操作),以生成特征图(feature map)。
    • 卷积操作:过滤器与输入数据局部区域进行元素相乘,并将结果求和,以生成特征图中的一个元素。

    卷积操作的结果是一个特征图,它是输入数据经过过滤器提取后的表示。特征图的维度取决于过滤器的数量、步长和填充。在CNN中,通常会有多个卷积层堆叠在一起,每个层都从前一层的特征图中提取更高级别的特征。卷积层后面通常跟着一个非线性激活函数,如ReLU(Rectified Linear Unit),以引入非线性,帮助网络学习复杂的模式。卷积网络中经常包含池化层(如最大池化或平均池化),它们通过下采样减少特征图的尺寸,同时保留重要信息。在网络的最后几层,通常会有全连接层,它们将卷积层和池化层提取的特征进行整合,用于执行分类或其他任务。

  • 注意力机制

    注意力机制是一种在神经网络中用于提高序列处理任务性能的技术,特别是在处理像自然语言这样的长序列数据时。它的灵感来源于人类视觉注意力:在观察复杂场景时,人类往往会聚焦于场景的某些部分,而忽视其他部分。在神经网络中,注意力机制允许模型在处理数据时专注于与当前任务最相关的部分。

    • 基本概念:

      1. 权重分配:注意力机制的核心是它能够为输入序列的不同部分分配不同的权重,这样模型就可以更加关注对当前任务更重要的信息。

      2. 上下文相关性:在处理序列的每个元素时,注意力机制会考虑当前元素与之前处理过的元素之间的相关性,从而动态地调整关注点。

    • 组成部分:

      1. 查询(Query):当前要生成的目标元素或需要关注的部分。

      2. 键(Key):用于与查询进行比较的输入序列中的元素。

      3. 值(Value):输入序列中的元素,其信息将被用来生成输出。

    • 计算过程:

      1. 相似度计算:计算查询与每个键之间的相似度或相关性。

      2. 权重计算:将相似度通过softmax函数转换为概率分布,这些概率分布就是分配给每个值的权重。

      3. 加权求和:将权重与对应的值相乘并求和,得到最终的注意力输出,这个输出是输入序列的加权和,反映了模型当前关注的重点。

    • 注意力机制的类型:

      1. 软注意力(Soft Attention):可学习的注意力机制,可以为每个输入元素分配不同的权重,并且是可微分的,因此可以通过梯度下降进行训练。

      2. 硬注意力(Hard Attention):选择性地关注输入序列中的某个部分,但通常是不可微分的,因此需要使用如强化学习这样的技术来训练。

      3. 自注意力(Self-Attention):一种特殊的注意力机制,其中查询、键和值都来自同一个输入序列,这在Transformer模型中得到了广泛应用。

Question

  • transformer为什么有效?
  • RNN中哪些方法体现了注意力机制?

Conclusion

In this work, we presented the Transformer, the first sequence transduction model based entirely on attention, replacing the recurrent layers most commonly used in encoder-decoder architectures with multi-headed self-attention. For translation tasks, the Transformer can be trained significantly faster than architectures based on recurrent or convolutional layers. On both WMT 2014 English-to-German and WMT 2014 English-to-French translation tasks, we achieve a new state of the art. In the former task our best model outperforms even all previously reported ensembles. We are excited about the future of attention-based models and plan to apply them to other tasks. We plan to extend the Transformer to problems involving input and output modalities other than text and to investigate local, restricted attention mechanisms to efficiently handle large inputs and outputs such as images, audio and video. Making generation less sequential is another research goals of ours. The code we used to train and evaluate our models is available at https://github.com/ tensorflow/tensor2tensor.

简单口译

transformer是第一个完全基于注意力机制的序列模型。它在encoder-decoder结构中使用多头自注意力机制代替循环层。它在翻译任务中表现出色,甚至在部分任务中成为了世界最强模型(2017年)。我们计划将Transformer扩展到多模态问题,如图像、音频和视频等,并研究专门的注意力机制,以有效地处理在多模态任务中的大量的输入和输出。他们下一步计划着让生成的内容更不“序列化”

前置知识

  • sequential:序列化

    在神经网络和机器学习的上下文中,“sequential” 通常指的是数据处理或模型操作是按时间步或序列顺序进行的。对于序列生成任务(如文本生成、机器翻译等),传统的循环神经网络(RNN)和其变体(如 LSTM、GRU)是按以下顺序生成序列的:

    1. 生成第一个输出(例如,第一个单词或字符)。
    2. 使用生成的第一个输出作为下一步的输入。
    3. 生成第二个输出。
    4. 重复这个过程,直到生成整个序列。

    “Making generation less sequential” 的目标是减少这种顺序依赖性,以便能够更高效地生成序列。以下是几种实现这一目标的方法:

    1. 并行化:通过允许模型同时考虑整个输入序列来生成输出,而不是依赖于一步一步的顺序处理。例如,Transformer 模型使用自注意力机制来并行处理整个序列。
    2. 条件独立:使得序列中的每个输出在给定输入的情况下尽可能独立于其他输出。这样,即使输出之间有依赖关系,也可以通过注意力机制来显式地建模这些关系,而不是依赖于固定的顺序。
    3. 非自回归模型:与自回归模型(每个输出都依赖于之前的输出)不同,非自回归模型可以同时生成整个序列或其大部分,而不是一个接一个地生成。

    在 “Attention is All You Need” 论文中,作者提出了一种基于注意力机制的 Transformer 模型,该模型通过自注意力机制和多头注意力来捕获输入序列的全局依赖关系,从而减少了生成过程的顺序依赖性。这使得 Transformer 模型在处理长序列时比传统的 RNN 更快、更有效,因为它们可以利用现代硬件的并行计算能力。

Introduction

Recurrent neural networks, long short-term memory and gated recurrent neural networks in particular, have been firmly established as state of the art approaches in sequence modeling and transduction problems such as language modeling and machine translation. Numerous efforts have since continued to push the boundaries of recurrent language models and encoder-decoder architectures.

Recurrent models typically factor computation along the symbol positions of the input and output sequences. Aligning the positions to steps in computation time, they generate a sequence of hidden states ht, as a function of the previous hidden state ht−1 and the input for position t. This inherently sequential nature precludes parallelization within training examples, which becomes critical at longer sequence lengths, as memory constraints limit batching across examples. Recent work has achieved significant improvements in computational efficiency through factorization tricks [21] and conditional computation [32], while also improving model performance in case of the latter. The fundamental constraint of sequential computation, however, remains.

Attention mechanisms have become an integral part of compelling sequence modeling and transduction models in various tasks, allowing modeling of dependencies without regard to their distance in the input or output sequences [2, 19]. In all but a few cases [27], however, such attention mechanisms are used in conjunction with a recurrent network.

In this work we propose the Transformer, a model architecture eschewing recurrence and instead relying entirely on an attention mechanism to draw global dependencies between input and output. The Transformer allows for significantly more parallelization and can reach a new state of the art in translation quality after being trained for as little as twelve hours on eight P100 GPUs.

简单口译

(前几段可以先不看)

RNN、LSTM、GRNN是当下最先进的序列转换模型。研究者对其进行了许多工作来扩展序列结构的一切可能性。

这些循环模型基于输入输出序列的标记位置进行计算,它们将输入序列的位置与时间等因素对齐,并基于前一时刻的隐藏输出ht-1与当下的时间t输出当下的隐藏层ht

然而,循环神经网络无法的机制是把整个序列输入,导致无法并行计算,当序列长度较长时,由于显存限制会限制样本的batch size。尽管通过因子分解技巧、条件计算等trick提高了一些效率,循环结构顺序计算的原罪仍然存在。

(后两段)

注意力机制对输入之间的依赖关系进行建模,但并不考虑它们在输入、输出序列中的距离。

在大多数情况中,注意力机制都与各种循环结构结合使用。

我们的transformer:完全不使用循环结构,完全采用注意力机制来描绘输入和输出之间的全局依赖关系,允许并行,效果拔群!

前置知识

  • gated recurrent neural networks

    门控循环神经网络(Gated Recurrent Neural Network,简称GRNN)是一种在自然语言处理、语音识别、机器翻译等领域广泛应用的神经网络模型。相比于传统的循环神经网络(Recurrent Neural Network,简称RNN),GRNN引入了门控机制,以解决长期依赖问题
    两种常见的门控循环神经网络模型:

    • 长短期记忆网络(Long Short-Term Memory,简称LSTM)

    • 门控循环单元(Gated Recurrent Unit,简称GRU)

      长期依赖问题

      循环神经网络(RNN)的长期依赖问题是指网络在学习和表示序列数据中的长期依赖关系时遇到的困难。长期依赖关系是指序列中相隔较远的信息之间存在的重要联系,例如在语言模型中,一个句子中的某个词可能需要依赖于句子开头的一个词来正确解释。以下是长期依赖问题的详细说明:

      问题表现:

      1. 梯度消失:在训练过程中,当序列很长时,RNN在反向传播时计算梯度,这些梯度可能会随着时间步的增加而变得越来越小,最终趋近于零。这导致网络难以学习到与序列中较早元素相关联的信息。
      2. 梯度爆炸:与梯度消失相反,梯度也可能在反向传播过程中变得非常大,导致数值不稳定,网络参数更新过大,从而无法收敛。

      原因:

      1. 链式法则:在反向传播中,梯度是通过对时间步的链式法则进行计算的。如果网络非常深(即序列非常长),这些连乘操作可能会导致梯度消失或爆炸。
      2. 饱和非线性激活函数:传统的RNN经常使用饱和非线性激活函数(如tanh或sigmoid),这些函数在输入非常大或非常小的时候梯度接近零,进一步加剧了梯度消失问题。

      解决方案

      1. 长短期记忆网络(LSTM):LSTM通过引入门控机制和细胞状态来维持长期依赖,有效地解决了梯度消失问题。
      2. 门控循环单元(GRU):GRU是LSTM的简化版本,也通过门控机制来改善长期依赖的学习。
      3. 残差连接和层归一化:在RNN结构中加入残差连接和层归一化可以帮助梯度流动,减少梯度消失或爆炸的问题。
      4. 注意力机制:注意力机制允许模型显式地关注序列中的相关部分,从而不必依赖于固定长度的隐藏状态来传递信息。
  • batching across examples

    “Batching across examples” 是机器学习中的一种常见做法,它指的是在训练神经网络时,将多个训练样本组合在一起形成一个批次(batch),然后一次性通过网络进行处理。

    • 批次(Batch):

      • 在训练神经网络时,不是一次只处理一个训练样本,而是将多个样本组合成一个批次。

      • 每个批次包含一组训练样本,这些样本可以是完整的序列、图像、声音片段等。

    • 批量处理(Batching):

      • 批量处理是指同时处理一个批次中的所有样本。

      • 这种方法可以提高内存利用率和计算效率,因为现代计算库和硬件(如GPU)针对并行处理进行了优化。

    • “Batching across examples” 的含义:

      • 当说“batching across examples”时,意味着在训练过程中,模型不是一次只处理一个样本,而是同时处理多个样本。

      • 通过这种方式,可以显著减少每次迭代所需的计算时间,因为批处理可以利用矩阵运算的并行性。

    • 为什么在长序列中“batching across examples”会受到限制?

      • 对于长序列,每个样本可能占用大量内存。

      • 当尝试将多个长序列样本组合成一个批次时,这个批次可能会超出GPU或其他计算设备的内存限制。

      • 因此,在处理长序列时,可能需要减少每个批次中的样本数量,甚至可能只能一次处理一个样本(即批量大小为1),这会大大降低训练效率。

    “batching across examples”是在训练神经网络时,通过同时处理多个样本来提高效率的一种技术。然而,在处理长序列时,由于内存限制和序列的顺序性质,这种批处理方法可能会受到限制。

ModelArchitecture

Summary

Most competitive neural sequence transduction models have an encoder-decoder structure [5, 2, 35]. Here, the encoder maps an input sequence of symbol representations (x1, …, xn) to a sequence of continuous representations z = (z1, …, zn). Given z, the decoder then generates an output sequence (y1, …, ym) of symbols one element at a time. At each step the model is auto-regressive [10], consuming the previously generated symbols as additional input when generating the next.

在这里插入图片描述

The Transformer follows this overall architecture using stacked self-attention and point-wise, fully connected layers for both the encoder and decoder, shown in the left and right halves of Figure 1, respectively.

简单口译

大多数有竞争力的序列神经网络都采用了encoder-decoder的结构。编码器将符号表示的输入序列映射的连续序列,然后解码器将此序列一个一个重新输出为符号表示的结果,一次输出一个。

在每一步中,模型都是自回归的。所谓的自回归就是在生成下一个符号时,将之前生成的符号作为额外的输入。

Transformer遵循这个整体架构,使用堆叠的自注意力层和point-wise层,完全连接编码器和解码器层,分别如图1的左半部分和右半部分所示。

前置知识

  • point-wise层

    在深度学习中,“point-wise” 层通常指的是在处理数据时对每个数据点单独进行操作的层,而不是在数据点之间进行交互。这种层通常用于处理序列数据,例如在自然语言处理(NLP)任务中处理单词或字符。以下是关于 point-wise 层的一些详细信息:

    • 定义:

      • Point-wise Operation:指的是对单个数据点(例如,一个序列中的单个元素)独立进行操作,而不考虑该数据点与其他数据点的关系。
    • 特点:

      • 独立性:每个数据点的处理是独立的,这意味着可以并行计算每个数据点的输出,而不需要考虑序列中其他元素的影响。

      • 简单性:Point-wise 层通常比较简单,例如,它们可能只包含一个线性变换后跟一个非线性激活函数。

    • 示例:

      以下是一些常见的 point-wise 层的示例:

      • 全连接层(Dense Layer):在处理序列数据时,可以将全连接层视为 point-wise 层,其中每个时间步的输出仅依赖于该时间步的输入。
      • 逐点卷积层(Point-wise Convolution):在卷积神经网络(CNN)中,逐点卷积层通常具有1x1的卷积核,用于对每个数据点进行独立变换。这在深度可分离卷积中尤其常见,其中逐点卷积跟在深度卷积之后,用于合并深度卷积的输出。
      • 激活函数:在序列的每个元素上应用激活函数可以看作是一种 point-wise 操作。
    • 在Transformer中的应用:

      • 在Transformer模型中,point-wise 前馈网络(Feedforward Network)是一个关键组成部分,它独立地应用于自注意力层的输出上。这个前馈网络通常包含两个全连接层,中间有一个ReLU激活函数,它们都是 point-wise 操作。
    • 优点:

      • 并行计算:由于每个数据点的处理是独立的,因此可以在GPU或TPU等并行计算设备上进行高效的计算。

      • 灵活性:Point-wise 层可以很容易地插入到各种神经网络架构中,以增加模型的表示能力。

    • 缺点:

      • 忽略序列上下文:由于 point-wise 层不考虑数据点之间的交互,因此在处理需要上下文信息的任务时,可能需要与其他类型的层(如卷积层或循环层)结合使用。

Encoder and Decoder Stacks

Encoder: The encoder is composed of a stack of N = 6 identical layers. Each layer has two sub-layers. The first is a multi-head self-attention mechanism, and the second is a simple, positionwise fully connected feed-forward network. We employ a residual connection [11] around each of the two sub-layers, followed by layer normalization [1]. That is, the output of each sub-layer is LayerNorm(x + Sublayer(x)), where Sublayer(x) is the function implemented by the sub-layer itself. To facilitate these residual connections, all sub-layers in the model, as well as the embedding layers, produce outputs of dimension dmodel = 512.

Decoder: The decoder is also composed of a stack of N = 6 identical layers. In addition to the two sub-layers in each encoder layer, the decoder inserts a third sub-layer, which performs multi-head attention over the output of the encoder stack. Similar to the encoder, we employ residual connections around each of the sub-layers, followed by layer normalization. We also modify the self-attention sub-layer in the decoder stack to prevent positions from attending to subsequent positions. This masking, combined with fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.

简单口译

编码器由6个相同的组件堆叠而成,每个组件有两个子组件:多头自注意力和全连接层。在两者之间和之后组合使用残差连接和层归一化。。因此,每个子层的输出是LayerNorm(x + Sublayer(x)),其中Sublayer(x)是子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及嵌入层产生的输出维度为512。

解码器也是由6个相同组件进行堆叠。除了每个编码器层中的两个子层之外,解码器插入第三个子层,该子层对编码器的输出执行多头注意。与编码器类似,我们在每个子层周围使用残差连接,然后进行层规范化。我们还修改了解码器中的自注意子层,以防止位置关注后续位置。mask机制,再加上输出嵌入被偏移一个位置的事实,确保了位置i的预测只能依赖于位置小于i的已知输出(transformer看不到t时间之后的东西)。

前置知识

  • residual connection

    来自论文:Deep Residual Learning for Image Recognition

    残差连接(Residual Connection),也称为跳跃连接(Skip Connection),是一种在深度神经网络中常用的设计技巧,旨在解决深层网络训练过程中的梯度消失或梯度爆炸问题,并使得网络能够更深、更有效地训练。

    • 基本原理:

      在传统的深度神经网络中,每一层的输出是下一层的输入。当网络层数很多时,梯度在反向传播过程中需要通过很多层,这可能导致梯度消失(即梯度变得非常小)或梯度爆炸(即梯度变得非常大)。残差连接通过在网络的某些层之间添加直接连接来解决这个问题。

      具体来说,残差连接将网络某一层的输出直接加到后面几层(通常是两层)的输出上。这样,在网络的反向传播过程中,梯度可以直接通过这些额外的连接路径流动,而不必只通过层与层之间的权重。


      补充资料

      原文链接:https://blog.csdn.net/qq_43700729/article/details/136626602

      残差连接的核心思想是引入一个“快捷连接”(shortcut connection)或“跳跃连接”(skip connection),允许数据绕过一些层直接传播。这样,网络中的一部分可以直接学习到输入与输出之间的残差(即差异),而不是直接学习到映射本身。具体来说,如果我们希望学习的目标映射是 H(x),我们让网络学习残差映射 F(x)=H(x)−x。因此,原始的目标映射可以表示为 F(x)+x。

      在传统的深度神经网络中,每一层的输出是基于前一层的输出进行计算。当网络层次增加时,网络的训练变得困难,因为梯度在反向传播过程中容易消失或爆炸。残差连接通过添加额外的“快捷连接”(shortcut connections)来解决这个问题。这些快捷连接允许一部分输入直接跳过一个或多个层传到更深的层,从而在不增加额外参数或计算复杂度的情况下,促进梯度的直接反向传播。

      具体来说:设想一个简单的网络层,其输入为 𝑥,要通过一个非线性变换 𝐹(𝑥) 来得到输出。在没有残差连接的情况下,这个层的输出就是 𝐹(𝑥)。当引入残差连接后,这个层的输出变为𝐹(𝑥) + 𝑥。这里的𝑥是直接从输入到输出的跳过连接(Skip Connection),𝐹(𝑥) + 𝑥即是考虑了输入本身的残差输出。这样设计允许网络在需要时倾向于学习更简单的函数(例如,当 𝐹(𝑥) 接近0时,输出接近输入),这有助于提高网络的训练速度和准确性。

      原文链接:https://zhuanlan.zhihu.com/p/449792026

      定义问题统计学中的残差和误差是非常易混淆的两个概念。误差是衡量观测值和真实值之间的差距,残差是指预测值和观测值之间的差距。为什么叫残差网络呢?作者的解释是,网络的一层通常可以看做y=H(x),而残差网络的一个残差块为:H(x)=F(x)+x,则F(x) = H(x)-x,而y=x是观测值,H(x)是预测值,所以H(x)-x即为残差,也即F(x)是残差,故称残差网络

      深层网络在前向传播时,随着网络加深,网络获得的信息会逐层递减,而ResNet针对该问题的处理方式是“直接映射”,即下一层不仅包括该层的信息x,还包括该层经非线性变换后的新信息F(x)。这样的处理使得信息反而呈现逐层递增趋势。

      img
      在这里插入图片描述


    • 数学表示:

      假设有一个深层网络中的某一层,其输入为 x,输出为 F*(*x),其中 F 是该层的函数(例如,权重矩阵和激活函数的组合)。在添加了残差连接后,该层的实际输出变为 F(x) +x。这通常通过一个“残差块”(Residual Block)实现,其中包括一个或多个层,以及一个将原始输入 x 添加到块输出 F(x)的操作。

    • 残差块的结构:

      一个典型的残差块包含以下部分:

      • 权重层:通常是卷积层或全连接层,用于对输入 xx 进行变换。
      • 激活函数:如ReLU,用于引入非线性。
      • 跳跃连接:将输入 xx 直接加到权重层和激活函数的输出上。
    • 优点:

      • 缓解梯度消失/爆炸:通过提供梯度直接传播的路径,残差连接有助于训练更深的网络。

        为什么可以解决梯度消失?

        在这里插入图片描述

        在这里插入图片描述

      • 提高训练效率:网络可以更容易地学习到身份映射(即输入直接传递到输出的情况),这对于某些任务是有益的。

      • 模块化设计:残差块可以堆叠起来构建非常深的网络,同时保持训练的稳定性。

    • 应用:

      残差连接在深度学习的多个领域得到了广泛应用,尤其是在图像识别(如ResNet)、自然语言处理(如Transformer)等领域。

      残差连接是深度学习领域中一个重要的进展,它使得训练非常深的网络成为可能,极大地推动了深度学习的发展。

  • layer normalization

    层归一化(Layer Normalization)是一种用于深度学习模型的归一化技术,旨在解决在训练深度神经网络时出现的内部协变量偏移(Internal Covariate Shift)问题。它与批量归一化(Batch Normalization)类似,但有一些关键的区别。

    • 基本原理:

      层归一化的主要思想是对网络中每一层的激活进行归一化,使得每个神经元的输出都拥有相同的均值和标准差。这样做的目的是使得每一层的激活分布更加稳定,有助于更快地训练网络。

      即:经过网络后,这一层中每个神经元输出的值的均值为0,方差为1。

    • 计算步骤:

      层归一化通常包括以下步骤:

      • 计算均值:对于网络中某一层的所有激活(例如,一个隐藏层中的所有神经元输出),计算它们的平均值。
      • 计算标准差:计算这些激活的标准差。
      • 归一化:对于每个激活 xi,减去均值并除以标准差
      • 缩放和移位:引入可学习的参数 γ(缩放因子)和 β(移位因子),对归一化的激活进行变换。
    • 公式表示:
      在这里插入图片描述

    • 与batchnorm批量归一化的区别:

      • Batch Normalization:它对每个特征在小批量数据上进行归一化。也就是说,它是基于同一批数据中的不同样本在同一特征上的值来计算均值和方差的。

      • Layer Normalization:它对单个样本的所有特征进行归一化。这意味着它计算的是单个样本的所有激活值的均值和方差,而不是跨多个样本。

      • Batch Normalization:依赖于小批量的大小,因此在训练时批量大小较小或在推断时批量大小为1的情况下效果可能不佳。

      • Layer Normalization:不依赖于批量大小,因此它适用于各种批量大小,包括批量大小为1的情况。

      • Batch Normalization:主要用于加速深度网络的训练过程,减少所谓的“内部协变量偏移”。

      • Layer Normalization:通常用于循环神经网络(RNN)或Transformer模型中,尤其是在变长的序列数据上。

    • 优点:

      • 适用于小批量训练:由于不依赖于批次大小,层归一化特别适用于小批量训练,这在某些情况下(如在线学习)非常有用。
    • 适用于循环神经网络:层归一化可以用于循环神经网络(RNN)和其变体,如长短期记忆网络(LSTM)和门控循环单元(GRU),而批量归一化在循环网络中较难应用。

    • 解决的问题:

      梯度消失和梯度爆炸

      • 在深度神经网络中,梯度消失和梯度爆炸是常见问题,这些问题会阻碍网络的学习。归一化技术如BatchNorm和LayerNorm有助于稳定训练过程,使得网络能够使用更高的学习率,从而加速收敛。

      内部协变量偏移

      • 网络每层输入的分布可能会在训练过程中发生变化,这称为内部协变量偏移。归一化通过固定每层输入的均值和方差,减少了这种偏移,使得网络训练更加稳定。

      减少对初始化的依赖

      • 归一化技术可以减少网络对参数初始化的依赖,使得网络更容易训练。

      正则化效果

      • 在一定程度上,归一化还可以作为一种正则化手段,减少模型的过拟合。
    • 为什么transformer中使用layernorm而不是batchnorm?

      我画了个图来解释这个问题。

      在这里插入图片描述

      黄色是layernorm的切法,蓝色是batchnorm的切法。

      黄色把单个样本进行相同平均数+方差,蓝色是对于每种feature都相同平均数+方差

      对于某些网络,batchnorm可以增加训练速度。但是对于翻译任务,每一个sequence的长度变化比较大。对于小批量数据,效果不会很好。

    层归一化是深度学习中一个重要的技术,它有助于训练更稳定、更深的网络,并且在很多任务中都取得了很好的效果。

Attention

在这里插入图片描述

An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is computed as a weighted sum of the values, where the weight assigned to each value is computed by a compatibility function of the query with the corresponding key.

Scaled Dot-Product Attention

We call our particular attention “Scaled Dot-Product Attention” (Figure 2). The input consists of queries and keys of dimension dk, and values of dimension dv. We compute the dot products of the query with all keys, divide each by √dk, and apply a softmax function to obtain the weights on the values. In practice, we compute the attention function on a set of queries simultaneously, packed together into a matrix Q. The keys and values are also packed together into matrices K and V . We compute the matrix of outputs as:在这里插入图片描述
The two most commonly used attention functions are additive attention , and dot-product (multiplicative) attention. Dot-product attention is identical to our algorithm, except for the scaling factor of 1/√dk . Additive attention computes the compatibility function using a feed-forward network with a single hidden layer. While the two are similar in theoretical complexity, dot-product attention is much faster and more space-efficient in practice, since it can be implemented using highly optimized matrix multiplication code. While for small values of dk the two mechanisms perform similarly, additive attention outperforms dot product attention without scaling for larger values of dk . We suspect that for large values of dk, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients. To counteract this effect, we scale the dot products by 1/√dk .

Multi-Head Attention

Instead of performing a single attention function with dmodel-dimensional keys, values and queries, we found it beneficial to linearly project the queries, keys and values h times with different, learned linear projections to dk, dk and dv dimensions, respectively. On each of these projected versions of queries, keys and values we then perform the attention function in parallel, yielding dv-dimensionaloutput values. These are concatenated and once again projected, resulting in the final values, as depicted in Figure 2.

Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.

在这里插入图片描述

Application of Attention in our Model

The Transformer uses multi-head attention in three different ways:

  • In “encoder-decoder attention” layers, the queries come from the previous decoder layer, and the memory keys and values come from the output of the encoder. This allows every position in the decoder to attend over all positions in the input sequence. This mimics the typical encoder-decoder attention mechanisms in sequence-to-sequence models such as [38, 2, 9].
  • The encoder contains self-attention layers. In a self-attention layer all of the keys, values and queries come from the same place, in this case, the output of the previous layer in the encoder. Each position in the encoder can attend to all positions in the previous layer of the encoder.
  • Similarly, self-attention layers in the decoder allow each position in the decoder to attend to all positions in the decoder up to and including that position. We need to prevent leftward information flow in the decoder to preserve the auto-regressive property. We implement this inside of scaled dot-product attention by masking out (setting to −∞) all values in the input of the softmax which correspond to illegal connections. See Figure 2.

简单口译

注意函数可以描述为将查询和一组键值对映射到输出,其中查询、键、值和输出都是向量。输出是作为值的加权和计算的,其中分配给每个值的权重是由查询与相应键的兼容性函数计算的。

查询:来自用户输入

键:来自词典库

将查询与键(二者属性相同可比较),得到相似度权重,由value可数值化运算‘

查询的过程怎么理解?我又画了个图:
在这里插入图片描述
如图,key和value一一对应(可以不一样长,自注意是等长的)。输入一个query,根据其与key的距离,决定value的权重。距离近的key对应的value权重大,距离远的key对应的value权重小,最后加权求和生成输出。

缩放的点积注意力

称呼特殊的attention组件为“缩放点积注意力”。输入由维度dk的查询以及维度dv的组成。我们计算查询与所有键的点积,每个点积除以√dk,然后使用softmax函数获得每个值的权重。在实践中,同时计算一组查询的注意力函数,这些查询被打包成矩阵q。键和值也被打包成矩阵K和V。

常用的注意力机制有加法注意力和乘法注意力机制。我们的注意力机制接近乘法注意力机制,只不过缩放因子是1/√dk。因为可以使用矩阵乘法,总体上乘法注意力机制优于加法注意力机制。

当dk值较小时,两种机制的表现相似,当dk值较大时,加法的注意力机制优于乘法。我们怀疑,对于较大的dk值,点积的大小会变大,从而将softmax推入梯度极小的区域。为了抵消这个影响,我们将点积乘以1/√dk来减小梯度的值。

在这里插入图片描述

总的来说,scaled-dot selfattention和上面我画的那张图是一样的。用query和key做内积,得到的值是两个向量的相似度(这个过程很像上周讲过的FM算法中计算user和item的相似度),除以根号dk(就是向量的长度),然后用softmax得到value的权重,最后把value和权重相乘得到输出的值。

  • 为什么要除以dk?

    当dk值较小时,两种机制的表现相似,当dk值较大时,加法的注意力机制优于乘法。我们怀疑,对于较大的dk值,点积的大小会变大,从而将softmax推入梯度极小的区域。(有些值会接近1,剩下的所有值都接近0,数据整体向两端靠拢)为了抵消这个影响,我们将点积乘以1/√dk来减小梯度的值。

    具体来说,我们可以将键矩阵(K)乘以一个因子,使得其维度变为dk。但是,这样做可能会改变矩阵的原始结构。为了保持矩阵的结构不变,我们可以将其除以根号dk,这样就可以在不改变矩阵维度的情况下对其进行缩放。

多头注意力机制

我们发现,与其使用dmodel维度的键、值和查询执行单一的注意力函数,不如将查询、键和值分别以不同的、可学习的线性投影通过h次投影到dk、dk和dv维度。然后,在查询、键和值的每个投影版本上,我们并行地执行注意力函数,生成d维的输出。最后将它们连接起来并再次进行投影,得到最终的输出。

多头注意允许模型在不同位置共同注意来自不同表示子空间的信息,这一点通过使用单一注意力头和取平均来实现。

在多头注意力机制中,输入序列Q、K和V被分别投影到不同的维度上,然后与相应的键值对进行点积运算,得到一系列的输出。这些输出再通过一个线性层进行组合,得到最终的输出。

在这里插入图片描述

文章中h=8 ,就是使用8个头,将QKV投影到8个通道。原来的dk是512,那么每一个头(通道)中的维度数就是dv=64

  • 为什么要有多头注意力机制?

    在scale-dot attention中,整个算法里面没有什么可以学习的参数。所谓的投影就是类似卷积的操作,通过线性层把VKQ投影到低维度,然后再经过h个scale-dot attention。投影的过程中是有一个w可以学的。这个w可以匹配不同投影模式中需要的函数,最后把这些东西加回来,再做一次投影。

    这个过程很像卷积网络中有多个输出通道的感觉。

    在这里插入图片描述

在transformer中注意力机制的三种使用情况

在这里插入图片描述

假设batch为1,句子长度为n,词向量维度为d,那么输入的就是n个长度为d的向量。

注意力层有三个输入,分别表示QKV。在自注意力值中,三个东西其实是一个东西,一个东西既是Key也是value也是query。

在这里插入图片描述

输入了n个query,每个query获得一个输出(指的是attention层的输出,不是总输出),总共会拿到n个输出,而输出的维度就是d。

如果不考虑多头和投影,对于每一个query,计算一个输出。这个输出其实就是value的一个加权和,权重来自于本身,和各个向量之间的相似度。

如果是多头的话,这里还会学习h个度量空间出来。

在这里插入图片描述

解码器和编码器的自注意力部分一样,就是多个mask。

还有一种是decoder上面的注意力。q来自于前面的自注意力的输出,key和value来自于encoder的输出。编码器的输出和解码器自注意力的输出都是n个d维向量,也就是说对于解码器的每一个query利用编码器的key和value计算一个输出(这里太精彩了,醍醐灌顶)

在这里插入图片描述

在这里插入图片描述

总结:

注意力机制的使用过程很像“aggregation(聚合)”。所谓聚合就是指:将多个元素、数据点或信息源合并为一个整体的过程。在数据处理和信息检索领域,聚合通常涉及将分散的数据集合起来,通过某种方式(如求和、平均、最大值、最小值等)进行处理,以提取有用的信息或得出一个综合的结论。

在这里插入图片描述

输入数据之后,经过聚合,注意力头的每个输出都包含了其与所有输入的注意力信息。这个信息再经过一层MLP去做取舍。

transformer中,注意力机制的使用场景如下:

  • 第一种:enconder的自注意力。encoder和decoder中有自注意力层。在自注意力层中,qkv。在encoder中,则来自encoder前一层的输出。encoder中的每个位置都可以处理编码器前一层中的所有位置。

  • 第二种:decoder的自注意力。解码器的缩放点积注意力中加入了mask机制。这个mask的目的是让transformer看不到t时刻之后的key。具体实现方法就是在把Q和K点积的结果除以根号dk之后,对t时刻之后的内容加上一个特别大的负数。这样softmax之后t时刻之后的内容都会趋近于0。不可以先softmax再mask,这会导致结果相加不等于1

    在这里插入图片描述

  • 第三种:在编码器与解码器之间传递信息。在decoder中,q来自于前一个decoder 层,k和v来自于encoder。这允许解码器中的每个位置都参与输入序列中的所有位置。这其实模仿了传统序列模型中的注意力机制

前置知识

  • representation subspaces 表示子空间

    “representation subspaces”指的是在一个高维空间中,能够有效地表示或编码数据特征的低维子空间。简单来说,这些子空间是原始数据空间的一部分,它们包含了数据的主要信息或者结构,但维度更低,因此更易于处理和分析。

    以下是关于“representation subspaces”的几个关键点:

    1. 降维:通常,数据的维度很高,这可能导致计算上的困难(例如维度的诅咒)和性能问题(例如过拟合)。通过找到数据的表示子空间,我们可以减少数据的维度,同时尽量保留其有用的信息。
    2. 信息保留:表示子空间的目标是保留数据中的关键信息,如数据的结构、趋势、分类边界等。这通常通过特征提取或特征选择技术来实现。
    3. 特征提取特征提取技术(如主成分分析PCA、线性判别分析LDA、自编码器等)可以用来找到这些子空间。这些技术寻找一组基向量,数据在这些基向量上的投影可以有效地表示原始数据。
    4. 应用:表示子空间在许多领域中都有应用,包括机器学习、数据压缩、信号处理、图像识别等。它们帮助模型更好地理解和处理数据。
    5. 性质:表示子空间可能有不同的性质。例如,在PCA中找到的子空间是数据变化最大的方向,而在LDA中找到的子空间是使得类别可分性最大的方向
    6. 优化:找到最优的表示子空间通常是一个优化问题,需要在保留信息的能力和子空间的维度之间找到平衡。

    总的来说,表示子空间是数据科学和机器学习中的一个重要概念,它们提供了一种方法来简化数据,同时保留其最重要的特性。通过在子空间中操作,算法可以更高效地执行任务,如分类、回归、聚类等。

  • 表示与表示学习

    表示在数学中通常指的是用符号、数字、字母或其他形式来表示数量、关系、结构等概念的过程和方法。例如,用一个数轴上的点来表示一个实数,用字母A、B、C等来表示不同的元素或集合,用数学公式来表示两个量之间的关系等。表示是数学和自然科学中普遍存在的一种基本方法,它不仅可以帮助我们理解和研究对象,还可以简化计算和证明过程。

    在机器学习中,表示学习是指从数据中学习到一种能够有效表示数据的模型或结构的过程。这种模型或结构能够捕捉到数据的本质特征,从而实现对数据的分类、回归、预测等任务。

Position-wise Feed-Forward Networks

In addition to attention sub-layers, each of the layers in our encoder and decoder contains a fully connected feed-forward network, which is applied to each position separately and identically. This consists of two linear transformations with a ReLU activation in between.

在这里插入图片描述

While the linear transformations are the same across different positions, they use different parameters from layer to layer. Another way of describing this is as two convolutions with kernel size 1. The dimensionality of input and output is dmodel = 512, and the inner-layer has dimensionality dff = 2048.

简单口译

除了注意子层之外,编码器和解码器中的每一层都包含一个全连接的前馈网络。这个网络应用到每一个position(在翻译任务中,就是一个句子中的每一个词)。每个网络包括两个线性转换,中间有一个ReLU激活。本质上这个全连接前馈网络就是一个MLP

虽然线性变换在不同位置上是相同的,但它们在每一层之间使用不同的参数。另一种描述它的方式是两个核大小为1的卷积。输入和输出的维数dmodel = 512,内层的维数df = 2048。 其实就是一个全连接网络,中间的隐藏层的维度是2048

在这里插入图片描述

为什么transformer优于rnn?两者同样是使用MLP来对向量空间进行转换(exp,从英文转换成中文),RNN和trans输入同样是n个d维词向量。但rnn需要把前一时刻的输入作为下一时刻的输出,而transformer很明显是并行的,可以使用矩阵快速运算。这是两者训练效率上质的差距。而注意力机制的加入让它的效果也远远优于rnn。

前置知识

  • MLP

    MLP通常指的是多层感知机(Multilayer Perceptron),它是一种前馈人工神经网络。这种网络由至少三层节点组成:输入层、一个或多个隐藏层以及输出层。每一层由若干神经元(或节点)组成,每个神经元与下一层的每个神经元相连接。多层感知机能够学习和存储大量的模式与映射关系,因此被广泛应用于各种复杂的模式识别和预测任务中。

    以下是多层感知机的一些基本特点:

    1. 前馈网络:信息在网络中单向传播,从输入层到输出层,没有循环或回路。
    2. 隐藏层:除了输入层和输出层之外的层,它们对输入数据进行处理和转换,但不对外的网络输出直接负责。
    3. 激活函数:每个神经元通常使用非线性激活函数,如Sigmoid或ReLU,这使得网络能够学习和模拟非线性关系。
    4. 训练过程:通过诸如反向传播算法的监督学习过程来训练网络权重,以最小化输出层的误差。

Embeddings and Softmax

Similarly to other sequence transduction models, we use learned embeddings to convert the input tokens and output tokens to vectors of dimension dmodel. We also use the usual learned linear transformation and softmax function to convert the decoder output to predicted next-token probabilities. In our model, we share the same weight matrix between the two embedding layers and the pre-softmax linear transformation, similar to [30]. In the embedding layers, we multiply those weights by √dmodel.

简单口译

为所有词训练一个512维的向量,并使用这个向量来输入网络。embedding在transformer中有三处使用:输入embedding,输出embedding,以及在decoder输出那里的softmax之前的线性层(实际上也是一个embedding)。为了方便编码,这三个地方的权重是共享的。另外把embedding的值乘了√dmodel,这是因为在embedding中,当词的维度很大时,每个向量的值就会较小(比如接近1)。乘以√dmodel是用于与下文的position encoding做匹配,实际上是做了一个hat。

Position Encoding

Since our model contains no recurrence and no convolution, in order for the model to make use of the order of the sequence, we must inject some information about the relative or absolute position of the tokens in the sequence. To this end, we add “positional encodings” to the input embeddings at the bottoms of the encoder and decoder stacks. The positional encodings have the same dimension dmodel as the embeddings, so that the two can be summed. There are many choices of positional encodings, learned and fixed [9].

In this work, we use sine and cosine functions of different frequencies:

在这里插入图片描述

where pos is the position and i is the dimension. That is, each dimension of the positional encoding corresponds to a sinusoid. The wavelengths form a geometric progression from 2π to 10000 · 2π. We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k, P Epos+k can be represented as a linear function of P Epos. We also experimented with using learned positional embeddings [9] instead, and found that the two versions produced nearly identical results (see Table 3 row (E)). We chose the sinusoidal version because it may allow the model to extrapolate to sequence lengths longer than the ones encountered during training.

简单口译

transformer中没有序列信息:query所乘权重是key和q之间的距离,与序列信息无关。假如把整个语句打乱再翻译,每一个词的翻译结果都不会改变。顺序变了,结果不变,这显然是不符合要求的,正确的翻译任务应该有时序信息 (transformer处理不需要时序信息的任务时,或许就不需要了)

transformer的做法是在输入之中加入时序信息。

在这里插入图片描述

一个句子的长度可能是32,64等。根据上面的公式,transformer的位置编码把这些位置通过周期不一样的正余弦函数映射到长度为512的向量中,与词向量的维度一样。然后把这个嵌入了时序信息的值与输入的词向量相加,就会获得一个有时序信息的输入了。(???)就算之后的注意力层怎么洗牌,每一个牌上都带着时序信息,就像给麻将做了标记,所以输出的时候还是有时序信息。因为是正余算的,所以数据的值为-1~1,这就是为啥上面的embedding要乘根号dk,因为要和这个值相同。

在这里插入图片描述

位置编码的公式中包含了pos和维度,这说明在不同的维度上位置编码有不同的频率。举个例子会更容易明白:我输入了一个句子叫”我想过过过过过过的生活“,中间每一个过字都是一样的对吧?但是因为它们输入的时候是在不同的位置,**因此经过位置编码,每一个过字的向量的值都是不一样的!!!**这样是不是很好理解了,哈哈哈哈哈。我又画了个图:

在这里插入图片描述

Why SelfAttention

就是在夸,这段不翻译了。到了今天,为什么用selfattention大家心里都有数了。

在这里插入图片描述

论文中给了一张表,对比了不同算法的复杂度。

牢骚

到这里,这篇论文的精华就结束了。本科期间参加过很多的比赛,都用过transformer,甚至还靠着人家拿过奖,但是直到上周才弄懂啥是layernorm…所以说只会调库是不行的,但是不会调库是万万不行的,hhhh

至于transformer的实验部分我就不读了,关于其复现,我会从0开始使用pytorch搭建transformer,并做一些有趣的小项目,代码已经写完,数据获取中,我们下周再见。

临了有感,有道是:

自注意力,乃汝所需,论文之光璀璨生辉, 精华至此,篇章落幕,思绪仍翻涌不息。

本科赛场,竞技无数,Transformer手中舞, 奖项荣耀,曾是依托,智慧火花照亮途。

上周顿悟,LayerNorm,心中疑云终消散, 技术深浅,非一日功,悟道方知学无涯。

调库之技,虽非全能,行走江湖不可缺, 知其所以,方能驾驭,不然就是王八蛋。

噫嘘唏,学海无涯,笑谈间显真章, 知行合一,路漫漫兮,求索的脚步不停歇。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值