一文彻底搞懂 Transformer(图解+手撕)

Transformers 亮相以来彻底改变了深度学习模型。

今天,我们来揭示 Transformers 背后的核心概念:注意力机制、编码器-解码器架构、多头注意力等等。通过 Python 代码片段,让你深入了解其原理。

一、理解注意力机制

注意力机制是神经网络中一个迷人的概念,特别是在涉及到像 NLP 这样的任务时。它就像给模型一个聚光灯,让它能够集中注意力在输入序列的某些部分,同时忽略其他部分,就像我们人类在理解句子时关注特定的单词或短语一样。

现在,让我们深入了解一种特定类型的注意力机制,称为自注意力,也称为内部注意力。想象一下,当你阅读一句话时,你的大脑会自动突出显示重要的单词或短语来理解意思。这就是神经网络中自注意力的基本原理。它使序列中的每个单词都能“关注”其他单词,包括自己在内,以更好地理解上下文。

二、自注意力是如何工作的?

以下是自注意力在一个简单示例中的工作原理:

考虑一句话:“The cat sat on the mat.”

嵌入

首先,模型将输入序列中的每个单词嵌入到一个高维向量表示中。这个嵌入过程允许模型捕捉单词之间的语义相似性。

查询、键和值向量

接下来,模型为序列中的每个单词计算三个向量:查询向量、键向量和值向量。在训练过程中,模型学习这些向量,每个向量都有不同的作用。查询向量表示单词的查询,即模型在序列中寻找的内容。键向量表示单词的键,即序列中其他单词应该注意的内容。值向量表示单词的值,即单词对输出所贡献的信息。

注意力分数

一旦模型计算了每个单词的查询、键和值向量,它就会为序列中的每一对单词计算注意力分数。这通常通过取查询向量和键向量的点积来实现,以评估单词之间的相似性。

SoftMax 归一化

然后,使用 softmax 函数对注意力分数进行归一化,以获得注意力权重。这些权重表示每个单词应该关注序列中其他单词的程度。注意力权重较高的单词被认为对正在执行的任务更为关键。

加权求和

最后,使用注意力权重计算值向量的加权和。这产生了每个序列中单词的自注意力机制输出,捕获了来自其他单词的上下文信息。

下面是一个计算注意力分数的简单解释:

# 安装 PyTorch   !pip install torch==2.2.1+cu121      # 导入库   import torch   import torch.nn.functional as F      # 示例输入序列   input_sequence = torch.tensor([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]])      # 生成 Key、Query 和 Value 矩阵的随机权重   random_weights_key = torch.randn(input_sequence.size(-1), input_sequence.size(-1))   random_weights_query = torch.randn(input_sequence.size(-1), input_sequence.size(-1))   random_weights_value = torch.randn(input_sequence.size(-1), input_sequence.size(-1))      # 计算 Key、Query 和 Value 矩阵   key = torch.matmul(input_sequence, random_weights_key)   query = torch.matmul(input_sequence, random_weights_query)   value = torch.matmul(input_sequence, random_weights_value)      # 计算注意力分数   attention_scores = torch.matmul(query, key.T) / torch.sqrt(torch.tensor(query.size(-1), dtype=torch.float32))      # 使用 softmax 函数获得注意力权重   attention_weights = F.softmax(attention_scores, dim=-1)      # 计算 Value 向量的加权和   output = torch.matmul(attention_weights, value)      print("自注意力机制后的输出:")   print(output)   

三、Transformer 模型的基础

在我们深入探讨Transformer模型的复杂工作原理之前,让我们花点时间欣赏其开创性的架构。正如我们之前讨论的,Transformer模型通过引入围绕自注意力机制的新颖方法,重塑了自然语言处理(NLP)的格局。在接下来的章节中,我们将揭开Transformer模型的核心组件,阐明其编码器-解码器架构、位置编码、多头注意力和前馈网络。

编码器-解码器架构

在Transformer的核心是其编码器-解码器架构——两个关键组件之间的共生关系,分别负责处理输入序列和生成输出序列。编码器和解码器中的每一层都包含相同的子层,包括自注意力机制和前馈网络。这种架构不仅有助于全面理解输入序列,而且能够生成上下文丰富的输出序列。

位置编码

尽管Transformer模型具有强大的功能,但它缺乏对元素顺序的内在理解——这是位置编码所解决的一个缺点。通过将输入嵌入与位置信息结合起来,位置编码使模型能够区分序列中元素的相对位置。这种细致的理解对于捕捉语言的时间动态和促进准确理解至关重要。

多头注意力

Transformer模型的一个显著特征是它能够同时关注输入序列的不同部分——这是多头注意力实现的。通过将查询、键和值向量分成多个头,并进行独立的自注意力计算,模型获得了对输入序列的细致透视,丰富了其表示,带有多样化的上下文信息。

前馈网络

与人类大脑能够并行处理信息的能力类似,Transformer模型中的每一层都包含一个前馈网络——一种能够捕捉序列中元素之间复杂关系的多功能组件。通过使用线性变换和非线性激活函数,前馈网络使模型能够在语言的复杂语义景观中航行,促进文本的稳健理解和生成。

四、Transformer 组件的详细说明

要实现,首先运行位置编码、多头注意力机制和前馈网络的代码,然后是编码器、解码器和Transformer架构。

#import libraries   import math   import torch   import torch.nn as nn   import torch.optim as optim   import torch.nn.functional as F   

1、位置编码

在Transformer模型中,位置编码是一个关键组件,它将关于标记位置的信息注入到输入嵌入中。

与循环神经网络(RNNs)或卷积神经网络(CNNs)不同,由于其置换不变性,Transformers 缺乏对标记位置的内在知识。位置编码通过为模型提供位置信息来解决这一限制,使其能够按照正确的顺序处理序列。

位置编码的概念

通常在将输入嵌入传入Transformer模型之前,会将位置编码添加到嵌入中。它由一组具有不同频率和相位的正弦函数组成,允许模型根据它们在序列中的位置区分标记。

位置编码的公式如下

假设您有一个长度为L的输入序列,并且需要在该序列中找到第k个对象的位置。位置编码由不同频率的正弦和余弦函数给出:

其中:

  • k:输入序列中对象的位置,0≤k<L/2

  • d:输出嵌入空间的维度

  • P(k,j):位置函数,用于将输入序列中的位置k映射到位置矩阵的索引(k,j)

  • n:用户定义的标量,由《Attention Is All You Need》的作者设置为10,000。

  • i:用于将列索引映射到0≤i<d/2的值,单个i值同时映射到正弦和余弦函数。

不同的位置编码方案

在Transformer中使用了各种位置编码方案,每种方案都有其优点和缺点:

  • 固定位置编码:在这种方案中,位置编码是预定义的,并对所有序列固定不变。虽然简单高效,但固定位置编码可能无法捕捉序列中的复杂模式。

  • 学习位置编码:另一种选择是在训练过程中学习位置编码,使模型能够自适应地从数据中捕捉位置信息。学习位置编码提供了更大的灵活性,但需要更多的参数和计算资源。

位置编码的实现

让我们用Python实现位置编码:

# 位置编码的实现   class PositionalEncoding(nn.Module):       def __init__(self, d_model, max_len=5000):           super(PositionalEncoding, self).__init__()                      # 计算位置编码           pe = torch.zeros(max_len, d_model)           position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)           div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-torch.log(           torch.tensor(10000.0)) / d_model))           pe[:, 0::2] = torch.sin(position * div_term)           pe[:, 1::2] = torch.cos(position * div_term)           pe = pe.unsqueeze(0)           self.register_buffer('pe', pe)          def forward(self, x):           x = x + x + self.pe[:, :x.size(1)]           return x      # 示例用法   d_model = 512   max_len = 100   num_heads = 8      # 位置编码   pos_encoder = PositionalEncoding(d_model, max_len)      # 示例输入序列   input_sequence = torch.randn(5, max_len, d_model)      # 应用位置编码   input_sequence = pos_encoder(input_sequence)   print("输入序列的位置编码:")   print(input_sequence.shape)   

2、多头注意力机制

在Transformer架构中,多头注意力机制是一个关键组件,它使模型能够同时关注输入序列的不同部分。它允许模型捕捉序列内的复杂依赖关系和关联,从而提高了语言翻译、文本生成和情感分析等任务的性能。

多头注意力的重要性

多头注意力机制具有几个优点:

  • 并行化:通过同时关注输入序列的不同部分,多头注意力显著加快了计算速度,使其比传统的注意力机制更加高效。

  • 增强表示:每个注意力头都关注输入序列的不同方面,使模型能够捕捉各种模式和关系。这导致输入的表示更丰富、更强大,增强了模型理解和生成文本的能力。

  • 改进泛化性:多头注意力使模型能够关注序列内的局部和全局依赖关系,从而提高了跨不同任务和领域的泛化性。

多头注意力的计算:

让我们分解计算多头注意力所涉及的步骤:

  • 线性变换:输入序列经历可学习的线性变换,将其投影到多个较低维度的表示,称为“头”。每个头关注输入的不同方面,使模型能够捕捉各种模式。

  • 缩放点积注意力:每个头独立地计算输入序列的查询、键和值表示之间的注意力分数。这一步涉及计算令牌及其上下文之间的相似度,乘以模型深度的平方根进行缩放。得到的注意力权重突出了每个令牌相对于其他令牌的重要性。

  • 连接和线性投影:来自所有头的注意力输出被连接并线性投影回原始维度。这个过程将来自多个头的见解结合起来,增强了模型理解序列内复杂关系的能力。

用代码实现

让我们将理论转化为代码:

# 多头注意力的代码实现   class MultiHeadAttention(nn.Module):       def __init__(self, d_model, num_heads):           super(MultiHeadAttention, self).__init__()           self.num_heads = num_heads           self.d_model = d_model           assert d_model % num_heads == 0           self.depth = d_model // num_heads                      # 查询、键和值的线性投影           self.query_linear = nn.Linear(d_model, d_model)           self.key_linear = nn.Linear(d_model, d_model)           self.value_linear = nn.Linear(d_model, d_model)                      # 输出线性投影           self.output_linear = nn.Linear(d_model, d_model)              def split_heads(self, x):         batch_size, seq_length, d_model = x.size()         return x.view(batch_size, seq_length, self.num_heads, self.depth).transpose(1, 2)              def forward(self, query, key, value, mask=None):                      # 线性投影           query = self.query_linear(query)           key = self.key_linear(key)           value = self.value_linear(value)                      # 分割头部           query = self.split_heads(query)           key = self.split_heads(key)           value = self.split_heads(value)                      # 缩放点积注意力           scores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(self.depth)                      # 如果提供了掩码,则应用掩码           if mask is not None:               scores += scores.masked_fill(mask == 0, -1e9)                      # 计算注意力权重并应用softmax           attention_weights = torch.softmax(scores, dim=-1)                      # 应用注意力到值           attention_output = torch.matmul(attention_weights, value)                      # 合并头部           batch_size, _, seq_length, d_k = attention_output.size()           attention_output = attention_output.transpose(1, 2).contiguous().view(batch_size,           seq_length, self.d_model)                      # 线性投影           attention_output = self.output_linear(attention_output)                      return attention_output      # 示例用法   d_model = 512   max_len = 100   num_heads = 8   d_ff = 2048      # 多头注意力   multihead_attn = MultiHeadAttention(d_model, num_heads)      # 示例输入序列   input_sequence = torch.randn(5, max_len, d_model)      # 多头注意力   attention_output= multihead_attn(input_sequence, input_sequence, input_sequence)   print("attention_output shape:", attention_output.shape)   

3、前馈网络

在Transformer的背景下,前馈网络在处理信息和从输入序列中提取特征方面发挥着关键作用。它们是模型的支柱,促进了不同层之间表示的转换。

前馈网络的作用

每个Transformer层内的前馈网络负责对输入表示应用非线性变换。它使模型能够捕捉数据中的复杂模式和关系,促进了高级特征的学习。

前馈层的结构和功能

前馈层由两个线性变换组成,两者之间通过一个非线性激活函数(通常是ReLU)分隔。让我们来解析一下结构和功能:

  • 线性变换1:使用可学习的权重矩阵将输入表示投影到更高维度的空间中。

  • 非线性激活:第一个线性变换的输出通过非线性激活函数(例如ReLU)传递。这引入了模型的非线性,使其能够捕捉数据中的复杂模式和关系。

  • 线性变换2:激活函数的输出然后通过另一个可学习的权重矩阵投影回原始的维度空间中。

用代码实现

让我们在Python中实现前馈网络:

# 前馈网络的代码实现   class FeedForward(nn.Module):       def __init__(self, d_model, d_ff):           super(FeedForward, self).__init__()           self.linear1 = nn.Linear(d_model, d_ff)           self.linear2 = nn.Linear(d_ff, d_model)           self.relu = nn.ReLU()          def forward(self, x):           # 线性变换1           x = self.relu(self.linear1(x))                      # 线性变换2           x = self.linear2(x)                      return x      # 示例用法   d_model = 512   max_len = 100   num_heads = 8   d_ff = 2048      # 多头注意力   multihead_attn = MultiHeadAttention(d_model, num_heads)      # 前馈网络   ff_network = FeedForward(d_model, d_ff)      # 示例输入序列   input_sequence = torch.randn(5, max_len, d_model)      # 多头注意力   attention_output= multihead_attn(input_sequence, input_sequence, input_sequence)      # 前馈网络   output_ff = ff_network(attention_output)   print('input_sequence',input_sequence.shape)   print("output_ff", output_ff.shape)   

4、编码器

在Transformer模型中起着至关重要的作用,其主要任务是将输入序列转换为有意义的表示,捕捉输入的重要信息。

每个编码器层的结构和功能

编码器由多个层组成,每个层依次包含以下组件:输入嵌入、位置编码、多头自注意力机制和位置逐点前馈网络。

  1. 输入嵌入:我们首先将输入序列转换为密集向量表示,称为输入嵌入。我们使用预训练的词嵌入或在训练过程中学习的嵌入,将输入序列中的每个单词映射到高维向量空间中。

  2. 位置编码:我们将位置编码添加到输入嵌入中,以将输入序列的顺序信息合并到其中。这使得模型能够区分序列中单词的位置,克服了传统神经网络中缺乏顺序信息的问题。

  3. 多头自注意力机制:在位置编码之后,输入嵌入通过一个多头自注意力机制。这个机制使编码器能够根据单词之间的关系权衡输入序列中不同单词的重要性。通过关注输入序列的相关部分,编码器可以捕捉长距离的依赖关系和语义关系。

  4. 位置逐点前馈网络:在自注意力机制之后,编码器对每个位置独立地应用位置逐点前馈网络。这个网络由两个线性变换组成,两者之间通过一个非线性激活函数(通常是ReLU)分隔。它有助于捕捉输入序列中的复杂模式和关系。

代码实现

让我们来看一下用Python实现带有输入嵌入和位置编码的编码器层的代码:

# 编码器的代码实现   class EncoderLayer(nn.Module):       def __init__(self, d_model, num_heads, d_ff, dropout):           super(EncoderLayer, self).__init__()           self.self_attention = MultiHeadAttention(d_model, num_heads)           self.feed_forward = FeedForward(d_model, d_ff)           self.norm1 = nn.LayerNorm(d_model)           self.norm2 = nn.LayerNorm(d_model)           self.dropout = nn.Dropout(dropout)              def forward(self, x, mask):                      # 自注意力层           attention_output= self.self_attention(x, x,           x, mask)           attention_output = self.dropout(attention_output)           x = x + attention_output           x = self.norm1(x)                      # 前馈层           feed_forward_output = self.feed_forward(x)           feed_forward_output = self.dropout(feed_forward_output)           x = x + feed_forward_output           x = self.norm2(x)                      return x      d_model = 512   max_len = 100   num_heads = 8   d_ff = 2048         # 多头注意力   encoder_layer = EncoderLayer(d_model, num_heads, d_ff, 0.1)      # 示例输入序列   input_sequence = torch.randn(1, max_len, d_model)      # 多头注意力   encoder_output= encoder_layer(input_sequence, None)   print("encoder output shape:", encoder_output.shape)   

5、解码器

在Transformer模型中,解码器在基于输入序列的编码表示生成输出序列方面起着至关重要的作用。它接收来自编码器的编码输入序列,并将其用于生成最终的输出序列。

解码器的功能

解码器的主要功能是生成输出序列,同时注意到输入序列的相关部分和先前生成的标记。它利用输入序列的编码表示来理解上下文,并对生成下一个标记做出明智的决策。

解码器层及其组件

解码器层包括以下组件:

  1. 输出嵌入右移:在处理输入序列之前,模型将输出嵌入向右移动一个位置。这确保解码器中的每个标记在训练期间都能从先前生成的标记接收到正确的上下文。

  2. 位置编码:与编码器类似,模型将位置编码添加到输出嵌入中,以合并标记的顺序信息。这种编码帮助解码器根据标记在序列中的位置进行区分。

  3. 掩码的多头自注意力机制:解码器采用掩码的多头自注意力机制,以便注意输入序列的相关部分和先前生成的标记。在训练期间,模型应用掩码以防止注意到未来的标记,确保每个标记只能注意到前面的标记。

  4. 编码器-解码器注意力机制:除了掩码的自注意力机制外,解码器还包括编码器-解码器注意力机制。这种机制使解码器能够注意到输入序列的相关部分,有助于生成受输入上下文影响的输出标记。

  5. 位置逐点前馈网络:在注意力机制之后,解码器对每个标记独立地应用位置逐点前馈网络。这个网络捕捉输入和先前生成的标记中的复杂模式和关系,有助于生成准确的输出序列。

使用代码实现

# 解码器的代码实现   class DecoderLayer(nn.Module):       def __init__(self, d_model, num_heads, d_ff, dropout):           super(DecoderLayer, self).__init__()           self.masked_self_attention = MultiHeadAttention(d_model, num_heads)           self.enc_dec_attention = MultiHeadAttention(d_model, num_heads)           self.feed_forward = FeedForward(d_model, d_ff)           self.norm1 = nn.LayerNorm(d_model)           self.norm2 = nn.LayerNorm(d_model)           self.norm3 = nn.LayerNorm(d_model)           self.dropout = nn.Dropout(dropout)          def forward(self, x, encoder_output, src_mask, tgt_mask):                      # 掩码的自注意力层           self_attention_output= self.masked_self_attention(x, x, x, tgt_mask)           self_attention_output = self.dropout(self_attention_output)           x = x + self_attention_output           x = self.norm1(x)                      # 编码器-解码器注意力层           enc_dec_attention_output= self.enc_dec_attention(x, encoder_output,            encoder_output, src_mask)           enc_dec_attention_output = self.dropout(enc_dec_attention_output)           x = x + enc_dec_attention_output           x = self.norm2(x)                      # 前馈层           feed_forward_output = self.feed_forward(x)           feed_forward_output = self.dropout(feed_forward_output)           x = x + feed_forward_output           x = self.norm3(x)                      return x      # 定义DecoderLayer的参数   d_model = 512  # 模型的维度   num_heads = 8  # 注意力头的数量   d_ff = 2048    # 前馈网络的维度   dropout = 0.1  # 丢弃概率   batch_size = 1 # 批量大小   max_len = 100  # 序列的最大长度      # 定义DecoderLayer实例   decoder_layer = DecoderLayer(d_model, num_heads, d_ff, dropout)         src_mask = torch.rand(batch_size, max_len, max_len) > 0.5   tgt_mask = torch.tril(torch.ones(max_len, max_len)).unsqueeze(0) == 0      # 将输入张量传递到DecoderLayer   output = decoder_layer(input_sequence, encoder_output, src_mask, tgt_mask)      # 输出形状   print("Output shape:", output.shape)   

五、Transformer 模型架构

前几节讨论的各种组件的综合体。让我们将编码器、解码器、注意力机制、位置编码和前馈网络的知识汇集起来,以了解完整的 Transformer 模型是如何构建和运作的。

Transformer模型概述

在其核心,Transformer模型由编码器和解码器模块堆叠在一起,用于处理输入序列并生成输出序列。以下是架构的高级概述:

编码器

  • 编码器模块处理输入序列,提取特征并创建输入的丰富表示。

  • 它由多个编码器层组成,每个层包含自注意力机制和前馈网络。

  • 自注意力机制允许模型同时关注输入序列的不同部分,捕捉依赖关系和关联。

  • 我们将位置编码添加到输入嵌入中,以提供有关序列中标记位置的信息。

解码器

  • 解码器模块以编码器的输出作为输入,并生成输出序列。

  • 与编码器类似,它由多个解码器层组成,每个层包含自注意力、编码器-解码器注意力和前馈网络。

  • 除了自注意力外,解码器还包含编码器-解码器注意力,以在生成输出时关注输入序列。

  • 与编码器类似,我们将位置编码添加到输入嵌入中,以提供位置信息。

连接和标准化

  • 在编码器和解码器模块的每一层之间,都有残差连接后跟层标准化。

  • 这些机制有助于在网络中流动梯度,并有助于稳定训练。

完整的Transformer模型通过将多个编码器和解码器层堆叠在一起来构建。每个层独立处理输入序列,使模型能够学习分层表示并捕获数据中的复杂模式。编码器将其输出传递给解码器,后者根据输入生成最终的输出序列。

Transformer模型的实现

让我们在Python中实现完整的Transformer模型:

# TRANSFORMER的实现   class Transformer(nn.Module):       def __init__(self, src_vocab_size, tgt_vocab_size, d_model, num_heads, num_layers, d_ff,       max_len, dropout):           super(Transformer, self).__init__()              # 定义编码器和解码器的词嵌入层           self.encoder_embedding = nn.Embedding(src_vocab_size, d_model)           self.decoder_embedding = nn.Embedding(tgt_vocab_size, d_model)              # 定义位置编码层           self.positional_encoding = PositionalEncoding(d_model, max_len)              # 定义编码器和解码器的多层堆叠           self.encoder_layers = nn.ModuleList([EncoderLayer(d_model, num_heads, d_ff, dropout)           for _ in range(num_layers)])           self.decoder_layers = nn.ModuleList([DecoderLayer(d_model, num_heads, d_ff, dropout)           for _ in range(num_layers)])              # 定义线性层           self.linear = nn.Linear(d_model, tgt_vocab_size)           self.dropout = nn.Dropout(dropout)          # 生成掩码       def generate_mask(self, src, tgt):           src_mask = (src != 0).unsqueeze(1).unsqueeze(2)           tgt_mask = (tgt != 0).unsqueeze(1).unsqueeze(3)           seq_length = tgt.size(1)           nopeak_mask = (1 - torch.triu(torch.ones(1, seq_length, seq_length), diagonal=1)).bool()           tgt_mask = tgt_mask & nopeak_mask           return src_mask, tgt_mask          # 前向传播       def forward(self, src, tgt):           src_mask, tgt_mask = self.generate_mask(src, tgt)              # 编码器输入的词嵌入和位置编码           encoder_embedding = self.encoder_embedding(src)           en_positional_encoding = self.positional_encoding(encoder_embedding)           src_embedded = self.dropout(en_positional_encoding)              # 解码器输入的词嵌入和位置编码           decoder_embedding = self.decoder_embedding(tgt)           de_positional_encoding = self.positional_encoding(decoder_embedding)           tgt_embedded = self.dropout(de_positional_encoding)              enc_output = src_embedded           for enc_layer in self.encoder_layers:               enc_output = enc_layer(enc_output, src_mask)              dec_output = tgt_embedded           for dec_layer in self.decoder_layers:               dec_output = dec_layer(dec_output, enc_output, src_mask, tgt_mask)              output = self.linear(dec_output)           return output      # 示例用法   src_vocab_size = 5000   tgt_vocab_size = 5000   d_model = 512   num_heads = 8   num_layers = 6   d_ff = 2048   max_len = 100   dropout = 0.1      transformer = Transformer(src_vocab_size, tgt_vocab_size, d_model, num_heads, num_layers,    d_ff, max_len, dropout)      # 生成随机示例数据   src_data = torch.randint(1, src_vocab_size, (5, max_len))  # (batch_size, seq_length)   tgt_data = torch.randint(1, tgt_vocab_size, (5, max_len))  # (batch_size, seq_length)   transformer(src_data, tgt_data[:, :-1]).shape   

六、模型的训练与评估

训练Transformer模型涉及优化其参数以最小化损失函数,通常使用梯度下降和反向传播。一旦训练完成,就会使用各种指标评估模型的性能,以评估其解决目标任务的有效性。

训练过程

梯度下降和反向传播:

  • 在训练期间,将输入序列输入模型,并生成输出序列。

  • 将模型的预测与地面真相进行比较,涉及使用损失函数(例如交叉熵损失)来衡量预测值与实际值之间的差异。

  • 梯度下降用于更新模型的参数,使损失最小化的方向。

  • 优化器根据这些梯度调整参数,迭代更新它们以提高模型性能。

学习率调度:

  • 可以应用学习率调度技术来动态调整训练期间的学习率。

  • 常见策略包括热身计划,其中学习率从低开始逐渐增加,以及衰减计划,其中学习率随时间降低。

评估指标

困惑度:

  • 困惑度是用于评估语言模型性能的常见指标,包括Transformer。

  • 它衡量模型对给定标记序列的预测能力。

  • 较低的困惑度值表示更好的性能,理想值接近词汇量大小。

BLEU分数:

  • BLEU(双语评估研究)分数通常用于评估机器翻译文本的质量。

  • 它将生成的翻译与一个或多个由人类翻译人员提供的参考翻译进行比较。

  • BLEU分数范围从0到1,较高的分数表示更好的翻译质量。

七、训练和评估的实现

让我们使用PyTorch对Transformer模型进行训练和评估的基本代码实现:

# Transformer 模型的训练和评估   criterion = nn.CrossEntropyLoss(ignore_index=0)   optimizer = optim.Adam(transformer.parameters(), lr=0.0001, betas=(0.9, 0.98), eps=1e-9)      # 训练循环   transformer.train()      for epoch in range(10):       optimizer.zero_grad()       output = transformer(src_data, tgt_data[:, :-1])       loss = criterion(output.contiguous().view(-1, tgt_vocab_size), tgt_data[:, 1:]       .contiguous().view(-1))       loss.backward()       optimizer.step()       print(f"第 {epoch+1} 轮:损失= {loss.item():.4f}")         # 虚拟数据   src_data = torch.randint(1, src_vocab_size, (5, max_len))  # (batch_size, seq_length)   tgt_data = torch.randint(1, tgt_vocab_size, (5, max_len))  # (batch_size, seq_length)      # 评估循环   transformer.eval()   with torch.no_grad():       output = transformer(src_data, tgt_data[:, :-1])       loss = criterion(output.contiguous().view(-1, tgt_vocab_size), tgt_data[:, 1:]       .contiguous().view(-1))       print(f"\n虚拟数据的评估损失= {loss.item():.4f}")      

八、高级主题和应用

Transformers 在自然语言处理(NLP)领域引发了大量先进概念和应用。让我们深入探讨其中一些主题,包括不同的注意力变体、BERT(来自 Transformers 的双向编码器表示)和 GPT(生成式预训练 Transformer),以及它们的实际应用。

不同的注意力变体

注意力机制是 Transformer 模型的核心,使其能够专注于输入序列的相关部分。各种注意力变体的提议旨在增强 Transformer 的能力。

  1. 缩放点积注意力:是原始 Transformer 模型中使用的标准注意力机制。它将查询和键向量的点积作为注意力分数,同时乘以维度的平方根进行缩放。

  2. 多头注意力:注意力的强大扩展,利用多个注意力头同时捕捉输入序列的不同方面。每个头学习不同的注意力模式,使模型能够并行关注输入的各个部分。

  3. 相对位置编码:引入相对位置编码以更有效地捕捉标记之间的相对位置关系。这种变体增强了模型理解标记之间顺序关系的能力。

BERT(来自 Transformers 的双向编码器表示)

BERT 是一个具有里程碑意义的基于 Transformer 的模型,在 NLP 领域产生了深远影响。它通过掩码语言建模和下一句预测等目标,在大规模文本语料库上进行预训练。BERT 学习了单词的深层上下文表示,捕捉双向上下文,使其在广泛的下游 NLP 任务中表现良好。

代码片段 - BERT 模型:

from transformers import BertModel, BertTokenizer      tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')   model = BertModel.from_pretrained('bert-base-uncased')      inputs = tokenizer("Hello, world!", return_tensors="pt")   outputs = model(**inputs)   print(outputs)   

GPT(生成式预训练 Transformer)

GPT 是一个基于 Transformer 的模型,以其生成能力而闻名。与双向的 BERT 不同,GPT 采用仅解码器的架构和自回归训练来生成连贯且上下文相关的文本。研究人员和开发人员已经成功地将 GPT 应用于各种任务,如文本完成、摘要、对话生成等。

代码片段 - GPT 模型:

from transformers import GPT2LMHeadModel, GPT2Tokenizer      tokenizer = GPT2Tokenizer.from_pretrained('gpt2')   model = GPT2LMHeadModel.from_pretrained('gpt2')      input_text = "Once upon a time, "   inputs=tokenizer(input_text,return_tensors='pt')   output=tokenizer.decode(       model.generate(           **inputs,           max_new_tokens=100,         )[0],         skip_special_tokens=True     )   input_ids = tokenizer(input_text, return_tensors='pt')      print(output)   

八、总结

Transformer 通过其捕捉上下文和理解语言的能力,彻底改变了自然语言处理(NLP)领域。

通过注意力机制、编码器-解码器架构和多头注意力,它们使得诸如机器翻译和情感分析等任务得以在前所未有的规模上实现。随着我们继续探索诸如 BERT 和 GPT 等模型,很明显,Transformer 处于语言理解和生成的前沿。

它们对 NLP 的影响深远,而与 Transformer 一起的发现之旅将揭示出该领域更多令人瞩目的进展。

研究论文

  • 《Attention is All You Need》

  • 《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》

  • 《Language Models are Unsupervised Multitask Learners》

  • Attention in transformers, visually explained

  • Transformer Neural Networks, ChatGPT’s foundation

如何学习大模型 AGI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

-END-


👉AGI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉AGI大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉AGI大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

泡椒竹笋面
关注 关注
  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一文理解Transformer的工作原理
01-27
自然语言处理中的Transformer模型真正改变了我们处理文本数据的方式。Transformer是最近自然语言处理发展的幕后推,包括Google的BERT。了解Transformer的工作原理、它如何与语言建模、序列到序列建模相关,以及它如何支持Google的BERT模型。现在,我喜欢做一名数据科学家,从事自然语言处理(NaturalLanguageProcessing,NLP)方面的工作。这些突破和发展正以前所未有的速度发生。从超高效的ULMFiT框架到Google的BERT,自然语言处理真的处于一个黄金时代。这场革命的核心是Transform
【超详细】【原理篇&实战篇】一文读懂Transformer
艰难困苦,玉汝于成。
11-02 20万+
Transformer是一种用于自然语言处理(NLP)和其他序列到序列(sequence-to-sequence)任务的深度学习模型架构,它在2017年由Vaswani等人首次提出。Transformer架构引入了自注意力机制(self-attention mechanism),这是一个关键的创新,使其在处理序列数据时表现出色。
一文看懂 Transformer!超级详解,小白入门必看!
z551646的博客
07-30 4466
Transformer是一种用于自然语言处理(NLP)和其他序列到序列(sequence-to-sequence)任务的深度学习模型架构,它在2017年由Vaswani等人首次提出。Transformer架构引入了自注意力机制(self-attention mechanism),这是一个关键的创新,使其在处理序列数据时表现出色。
Transformer 模型详解
热门推荐
步入人工智能
05-29 27万+
本内容主要介绍 Transformer 模型的具体实现。
Transformer模型详解
人无远虑,必有近忧
01-19 2万+
transformer结构是google在2017年的Attention Is All You Need论文中提出,在NLP的多个任务上取得了非常好的效果,可以说目前NLP发展都离不开transformer。最大特点是抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。 由于其出色性能以及对下游任务的友好性或者说下游任务仅仅微调即可得到不错效果,在计算机视觉领域不断有人尝试将transformer引入,近期也出现了一些效果不错的尝试,典型的如目标检测领域的detr和可变形detr,分
变形金刚——Transformer入门刨析详解
m0_67505927的博客
03-02 9万+
Transformer详解
Transformer详解
qq_52302919的博客
12-29 7万+
近期Transformer MLP系列模型的出现,增加了CV领域的多样性。但是Transformer这一不同领域的模型对学习者来说需要一个细致的学习过程.下面就是本菜鸟总结学习路线。
Transformer 论文+李沐视频+李宏毅视频 代码逐行跟踪
最新发布
09-10
Transformer 论文+李沐视频+李宏毅视频 代码逐行跟踪
搞懂 Vision Transformer 原理和代码系列
01-19
描述中的两个文件名"搞懂 Vision Transformer 原理和代码.pdf"和"搞懂 Vision Transformer 原理和代码.xlsx"暗示了这个压缩包包含了一份详细的PDF文档,可能涵盖了ViT的理论基础、模型结构、训练过程等,而Excel文件...
transformer注意力机制代码pytorch版本
05-13
深度学习和自然语言处理的世界中,Transformer模型已经成为了一个革命性的里程碑。它以其独特的自注意力机制领导了一系列突破性的进展,从机器翻译到文本生成,Transformer的应用无所不包。本资源提供了一个从零...
【自然语言处理】Transformer 模型:概述及分类(综述)
书山有路,学海无涯。记录成长,追逐梦想
02-20 8221
在过去的数年里,基于 Transformer 的相关模型层出不穷。本文将对当下最流行的 Transformer 模型做一个简单全面的介绍。
自然语言处理Transformer模型最详细讲解(图解版)
CSDN 精品推荐
10-16 3万+
近几年NLP较为流行的两大模型分别为Transformer和Bert,其中Transformer由论文《Attention is All You Need》提出。该模型由谷歌团队开发,Transformer是不同与传统RNN和CNN两大主流结构,它的内部是采用自注意力机制模块。
一文彻底搞懂 Transformer图解+代码
2201_75499313的博客
04-21 3951
Transformer 通过其捕捉上下文和理解语言的能力,彻底改变了自然语言处理(NLP)领域。通过注意力机制、编码器-解码器架构和多头注意力,它们使得诸如机器翻译和情感分析等任务得以在前所未有的规模上实现。随着我们继续探索诸如 BERT 和 GPT 等模型,很明显,Transformer 处于语言理解和生成的前沿。它们对 NLP 的影响深远,而与 Transformer 一起的发现之旅将揭示出该领域更多令人瞩目的进展。研究论文。
Transformer是什么?看完这篇你就醍醐灌顶
fs1341825137的博客
09-15 6万+
前言 由谷歌团队提出的预训练语言模型BERT近年来正在各大自然语言处理任务中屠榜(话说学者们也挺有意思的,模型名都强行凑个芝麻街的人物名,哈哈哈)。 BERT算法的最重要的部分便是Transformer的概念,它本质上是Transformer的编码器部分。 而Transformer是什么呢?transformer是永远的神,自从transformer使用了抛弃rnncnn的纯attention机制之后,各种基于transformer结构的预训练模型都如雨后春笋般雄起,而transformer中最重要就是使用
transformer理解
qq_22613769的博客
08-31 6427
Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 TransformerTransformer 模型使用了 Self-Attention 机制,不采用 RNN和LSTM 的顺序结构,使得模型可以并行化训练,而且能够拥有全局信息。 1.Transformer 结构 首先介绍 Transformer 的整体结构,下图是 Transformer 用于中英文翻译的整体结构。 ...
Transformer模型
m0_70066267的博客
08-01 1989
Transformer模型是一种在自然语言处理(NLP)及其他序列到序列(Seq2Seq)任务中广泛使用的深度学习模型框架。其基本原理和核心组件,尤其是自注意力机制(Self-Attention Mechanism),对于理解该模型的工作方式至关重要。以下是对Transformer模型基本原理和自注意力机制的详细解释。
Transformer++
06-12
Transformer++是Transformer模型的一种改进版本,它是在原始Transformer架构基础上进行的一些优化和扩展。Transformer是由Google在2017年提出的,革新了自然语言处理领域中的序列建模,特别是对于机器翻译和文本生成任务。Transformer使用自注意力机制替代了传统的RNN(循环神经网络)结构,使得模型能够并行计算,训练速度加快。 Transformer++可能包含以下一些改进: 1. 更大的模型规模:它可能包含了更多的参数,以提高模型的表达能力。 2. 更深的网络结构:通过增加Transformer层的数量,提升模型的复杂度和处理长距离依赖的能力。 3. 新型注意力机制:如Adaptive Attention或Local Attention,这些机制旨在解决Transformer中全局注意力计算效率低的问题,减少计算负担。 4. 正则化和优化技巧:例如LayerDrop、GhostNet等技术,用于防止过拟合和提高模型效率。 5. 增量学习或预训练方法:可能会利用更大规模的数据或更复杂的预训练策略来提升性能。
写文章

热门文章

  • KIMI爆了!对比文心一言和通义千问它到底有多强? 8405
  • 全民AI时代:手把手教你用Ollama & AnythingLLM搭建AI知识库,无需编程,跟着做就行! 6674
  • 值得收藏!十大中国流行的AI大模型企业及平台汇总 6448
  • 一文吃透多模态:多模态大模型的探索 五大研究方向与十大应用领域! 5456
  • 一文读懂 LLM 训练:从预训练到微调【大模型行业应用入门系列】 4853

分类专栏

  • 人工智能 1篇

最新评论

  • 超详细解读 Transformer 框架!建议收藏!

    m0_73477906: 大佬,文章中关于位置编码那块有好多地方公式不是很清晰.

  • 手把手教你轻松本地部署Llama3,个人电脑也能极速运行

    2401_86328446: web ui交互部分如果不想装docker可以直接运行下面两个命令: python -m pip install ollama_gui python -m ollama_gui 就可以有简单的图形界面了

大家在看

  • 从来图代工到云PLM的校企协同研发,浙江阀门代工厂的新球阀斩获130万订单
  • ICC2/innovus关于打pg的方法(route_pg)(二) 496
  • 计算机网络体系结构
  • 《南京师大学报(自然科学版)》 236
  • Tomcat 性能调优思路

最新文章

  • 太赞了!RAG技术入门! 当下最重要的知识!学起来
  • 干货 | 大模型LLM-微调经验分享&总结
  • 大语言模型垂直领域融合的最优解:微调or检索增强生成?
2024
10月 10篇
09月 27篇
08月 56篇
07月 41篇
06月 41篇
05月 75篇
04月 61篇
03月 13篇
2023年27篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家洛阳辽宁玻璃钢大猩猩雕塑惠州番禺玻璃钢人物雕塑玻璃钢红军雕塑公司地址玻璃钢雕塑厂家哪家专业黑龙江省玻璃钢雕塑定做厂嘉兴大型玻璃钢雕塑价格玻璃钢天猫雕塑工厂玻璃钢雕塑有裂纹怎么处理佛像玻璃钢仿铜雕塑制造玻璃钢雕塑品多少钱白城玻璃钢雕塑工程施工标准专业玻璃钢花盆厂家采购玻璃钢雕塑西洋棋商场美陈吊点安装公司镇江商场美陈公司福建通用玻璃钢花盆吉安玻璃钢牛雕塑山东玻璃钢海豚雕塑艺术摆件德州校园玻璃钢彩绘雕塑厂家小品系列玻璃钢雕塑多少钱玻璃钢寺庙雕塑施工图泌阳玻璃钢雕塑价格玻璃钢浮雕雕塑哪家有宜春玻璃钢雕塑订做价格聊城玻璃钢仿真水果雕塑厂家深圳肇庆玻璃钢动物雕塑银川广场玻璃钢雕塑公司大型雕塑玻璃钢玻璃钢雕塑喷漆视频郑州镜面玻璃钢人物雕塑定做香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化