AI大模型系列之七:Transformer架构讲解

目录

Transformer是什么?

         输入模块结构:

编码器模块结构:

解码器模块:

输出模块结构:

Transformer核心思想是什么?

Transformer的代码架构

自注意力机制是什么?

多头注意力有什么用?

前馈神经网络

编码器(Encoder)

解码器(Decoder):

基于卷积神经网络(CNN)的编码器-解码器结构


Transformer是什么?

是一种基于注意力机制(attention mechanism)的神经网络架构,最初由Vaswani等人在论文《Attention Is All You Need》中提出。它在自然语言处理(NLP)领域取得了巨大成功,特别是在机器翻译任务中。

传统的循环神经网络(RNNs)和长短时记忆网络(LSTM)在处理长距离依赖关系时存在一些问题,而Transformer引入了自注意力机制来解决这些问题。自注意力机制允许模型在处理序列数据时关注输入序列中的不同位置,而不仅仅是当前位置。这使得Transformer能够并行处理输入序列,加速训练。

Transformer模型设计之初,用于解决机器翻译问题,是完全基于注意力机制构建的编码器-解码器架构,编码器和解码器均由若干个具有相同结构的层叠加而成,每一层的参数不同。编码器主要负责将输入序列转化为一个定长的向量表示,解码器则将这个向量解码为输出序列。Transformer总体架构可分为四个部分:输入部分、编码器、解码器、输出部分。

         输入模块结构:
  1. 源文本嵌入层及其位置编码器
  2. 目标文本嵌入层及其位置编码器
编码器模块结构:
  1. N个编码器层堆叠而成
  2. 每个编码器层由两个子层连接结构组成
  3. 第一个子层连接结构包括一个多头自注意力子层、规范化层和一个残差连接
  4. 第二个子层连接结构包括一个前馈全连接子层、规范化层和一个残差连接

编码器encoder,包含两层,一个self-attention层和一个前馈神经网络,self-attention能帮助当前节点不仅仅只关注当前的词,从而能获取到上下文的语义。

解码器模块:
  1. N个解码器层堆叠而成
  2. 每个解码器层由三个子层连接结构组成
  3. 第一个子层连接结构包括一个多头自注意力子层、规范化层和一个残差连接
  4. 第二个子层连接结构包括一个多头注意力子层、规范化层和一个残差连接
  5. 第三个子层连接结构包括一个前馈全连接子层、规范化层和一个残差连接
  6. 解码器decoder也包含encoder提到的两层网络,但是在这两层中间还有一层attention层,帮助当前节点获取到当前需要关注的重点内容。
输出模块结构:
  1. 线性层
  2. softmax

Transformer核心思想是什么?

自注意力机制(Self-Attention): 模型能够同时考虑输入序列中的所有位置,而不是像传统的固定窗口大小的卷积或循环神经网络一样逐步处理。 传统的神经网络在处理序列数据时,对每个位置的信息处理是固定的,而自注意力机制允许模型在处理每个位置时关注输入序列的其他部分,从而更好地捕捉全局信息。

位置编码(Positional Encoding): 由于Transformer没有显式的顺序信息,为了保留输入序列中元素的位置信息,需要添加位置编码。

多头注意力(Multi-Head Attention): 将自注意力机制应用多次,通过多个注意力头来捕捉不同的关系。

前馈神经网络(Feedforward Neural Network): 每个注意力子层后接一个前馈神经网络,用于学习非线性关系。

Transformer的成功不仅限于NLP领域,还在计算机视觉等领域取得了重要进展。由于其并行计算的优势,Transformer已成为深度学习中的经典模型之一,被广泛用于各种任务。

Transformer的代码架构

因为它涉及到自注意力机制、位置编码、多头注意力等多个关键概念

import torch
import torch.nn as nnclass PositionalEncoding(nn.Module):def __init__(self, d_model, max_len=512):super(PositionalEncoding, self).__init__()self.encoding = torch.zeros(max_len, d_model)position = torch.arange(0, max_len).unsqueeze(1).float()div_term = torch.exp(torch.arange(0, d_model, 2).float() * -(torch.log(torch.tensor(10000.0)) / d_model))self.encoding[:, 0::2] = torch.sin(position * div_term)self.encoding[:, 1::2] = torch.cos(position * div_term)self.encoding = self.encoding.unsqueeze(0)def forward(self, x):return x + self.encoding[:, :x.size(1)].detach()class TransformerModel(nn.Module):def __init__(self, vocab_size, d_model, nhead, num_encoder_layers, num_decoder_layers):super(TransformerModel, self).__init__()self.embedding = nn.Embedding(vocab_size, d_model)self.positional_encoding = PositionalEncoding(d_model)self.transformer = nn.Transformer(d_model, nhead, num_encoder_layers, num_decoder_layers)self.fc = nn.Linear(d_model, vocab_size)def forward(self, src, tgt):src = self.embedding(src)src = self.positional_encoding(src)tgt = self.embedding(tgt)tgt = self.positional_encoding(tgt)output = self.transformer(src, tgt)output = self.fc(output)return output# 定义模型
vocab_size = 10000  # 词汇表大小
d_model = 512  # 模型维度
nhead = 8  # 多头注意力的头数
num_encoder_layers = 6  # 编码器层数
num_decoder_layers = 6  # 解码器层数model = TransformerModel(vocab_size, d_model, nhead, num_encoder_layers, num_decoder_layers)# 定义输入
src = torch.randint(0, vocab_size, (10, 32))  # 10个序列,每个序列长度为32
tgt = torch.randint(0, vocab_size, (20, 32))  # 20个序列,每个序列长度为32# 前向传播
output = model(src, tgt)
自注意力机制是什么?

Self Attention
先看例子,下列句子是我们想要翻译的输入句子:
The animal didn’t cross the street because it was too tired
这个“it”在这个句子是指什么呢?它指的是street还是这个animal呢?这对于人类来说是一个简单的问题,但是对于算法则不是。
当模型处理这个单词“it”的时候,自注意力机制会允许“it”与“animal”建立联系。
随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。
如果你熟悉RNN(循环神经网络),回忆一下它是如何维持隐藏层的。RNN会将它已经处理过的前面的所有单词/向量的表示与它正在处理的当前单词/向量结合起来。而自注意力机制会将所有相关单词的理解融入到我们正在处理的单词中
当我们在编码器#5(栈中最上层编码器)中编码“it”这个单词的时,注意力机制的部分会去关注“The Animal”,将它的表示的一部分编入“it”的编码中。


自注意力机制(Self-Attention Mechanism)是Transformer模型的核心组成部分之一,用于处理输入序列中各个位置之间的依赖关系。以下是对自注意力机制的详细解读:

注意力的概念:
注意力机制模拟了人类视觉系统的工作原理,即在处理某个任务时,我们不是对所有信息一视同仁,而是在某个时刻关注一部分信息,而另一时刻可能关注其他信息。在自注意力机制中,模型通过学习到的权重分配给输入序列中的不同位置,以便在生成输出时更加关注相关的部分。

自注意力机制的基本原理:

Query(查询): 通过将输入序列与权重矩阵相乘,得到每个位置的查询向量。查询向量用于衡量每个位置与其他位置的相关性。
Key(键): 通过将输入序列与权重矩阵相乘,得到每个位置的键向量。键向量用于被查询向量衡量,从而计算注意力分布。
Value(值): 通过将输入序列与权重矩阵相乘,得到每个位置的值向量。值向量将根据注意力分布加权求和,形成最终的输出。
注意力分布计算:

计算相似度: 通过查询向量和键向量的点积,计算每个位置的相似度得分。
缩放: 为了避免相似度过大导致的梯度消失或梯度爆炸问题,一般会对相似度进行缩放,常用的缩放因子是输入维度的平方根。
Softmax: 对缩放后的相似度应用Softmax函数,得到注意力权重分布。Softmax确保所有权重的总和为1,使其成为有效的概率分布。
注意力加权求和: 将值向量按照得到的注意力权重进行加权求和,得到最终的自注意力输出。
多头注意力(Multi-Head Attention):
为了增强模型的表达能力,自注意力机制通常会使用多个独立的注意力头。每个头学习不同的查询、键、值权重矩阵,最后将多个头的输出拼接在一起并通过线性映射进行融合。

位置编码(Positional Encoding):
自注意力机制没有直接考虑序列中元素的顺序,为了捕捉序列的位置信息,常常会在输入序列中添加位置编码。位置编码是一个与位置有关的可学习参数,使得模型能够更好地处理序列的顺序信息。

多头注意力有什么用?


多头注意力机制的引入具有以下几个优势:

多头并行计算: 不同注意力头可以并行计算,提高了计算效率。
学习不同表示: 不同头关注输入序列的不同部分,有助于模型学习更丰富、更复杂的特征表示。
提高模型泛化能力: 多头注意力可以使模型在处理不同类型的信息时更加灵活,提高了模型的泛化能力。
通过这种方式,多头注意力机制在Transformer模型中起到了至关重要的作用,使得模型能够更好地捕捉输入序列中的关系,提高了模型的表达能力。

前馈神经网络


前馈神经网络(Feedforward Neural Network)是一种最基本的神经网络结构,也被称为多层感知机(Multilayer Perceptron,MLP)。在深度学习中,前馈神经网络被广泛应用于各种任务,包括图像分类、语音识别、自然语言处理等。下面是对前馈神经网络的详细解读:

1. 基本结构
前馈神经网络由输入层、隐藏层和输出层组成。每一层都包含多个神经元(或称为节点),每个神经元与上一层的所有神经元都有连接,连接上带有权重。每个连接上都有一个权重,表示连接的强度。

输入层(Input Layer): 接受输入特征的层,每个输入特征对应一个输入层神经元。

隐藏层(Hidden Layer): 在输入层和输出层之间的一层或多层神经元,负责学习输入数据中的复杂模式。

输出层(Output Layer): 提供网络的输出,输出的维度通常与任务的要求相匹配,例如,对于二分类任务,可以有一个输出神经元表示两个类别的概率。

2. 激活函数
每个神经元在接收到输入后,会通过激活函数进行非线性变换。常用的激活函数包括:

Sigmoid 函数: 将输入映射到范围 ((0, 1)),适用于二分类问题。

Hyperbolic Tangent(tanh)函数: 将输入映射到范围 ((-1, 1)),具有零中心性,有助于减少梯度消失问题。

Rectified Linear Unit(ReLU)函数: 对于正数输入,输出等于输入;对于负数输入,输出为零。ReLU 是目前最常用的激活函数之一。

Softmax 函数: 用于多分类问题的输出层,将输出转化为概率分布。

3. 前向传播
前馈神经网络的训练过程中,信息从输入层传播到输出层的过程称为前向传播。具体步骤如下:

输入层接收输入特征。

每个神经元接收来自上一层神经元的输入,计算加权和。

加权和经过激活函数进行非线性变换,得到每个神经元的输出。

输出传递到下一层作为输入,重复以上步骤。

最终,网络的输出被用于任务的预测。

编码器+解码器
编码器-解码器结构是深度学习中常用的一种网络架构,特别在图像分割和生成任务中得到广泛应用。以下是对编码器-解码器结构的详细解读:

编码器(Encoder)


特征提取: 编码器的主要作用是从输入数据中提取关键特征。对于图像任务,输入通常是图像,编码器通过一系列卷积层(Convolutional Layers)进行特征提取。这些卷积层可以捕捉图像中的低级别和高级别特征,例如边缘、纹理和对象形状。

降维: 随着网络深度的增加,编码器通常会进行降维操作,通过池化层(Pooling Layers)或步幅较大的卷积层减小特征图的尺寸。这有助于减少计算复杂性和内存需求,并提高网络对输入的抽象表示能力。

语义信息提取: 在编码器的高层级特征表示中,网络通常能够捕捉到更抽象的语义信息,例如图像中的物体类别、结构等。这些特征通常被称为“语义特征”。

解码器(Decoder):


上采样: 解码器负责将编码器提取的特征映射还原为输入数据的尺寸。这通常涉及到上采样操作,其中通过插值或反卷积操作将特征图的尺寸放大。

特征融合: 解码器通常需要与编码器的相应层进行特征融合,以保留从输入到编码器的层次结构中学到的语义信息。这可以通过连接编码器和解码器的相应层来实现,形成所谓的“跳跃连接”(Skip Connections)。

重建输出: 解码器的最终目标是生成与输入数据相匹配的输出。对于图像分割任务,输出通常是一个与输入图像尺寸相同的特征图,其中每个像素或区域对应一个类别的概率或标签。

基于卷积神经网络(CNN)的编码器-解码器结构
import torch
import torch.nn as nnclass EncoderDecoder(nn.Module):def __init__(self):super(EncoderDecoder, self).__init__()# 编码器部分self.encoder = nn.Sequential(nn.Conv2d(3, 64, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),nn.Conv2d(64, 128, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2)# 添加更多卷积层和池化层...)# 解码器部分self.decoder = nn.Sequential(# 添加上采样层和特征融合...nn.Conv2d(128, 64, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False),nn.Conv2d(64, 32, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False),nn.Conv2d(32, 1, kernel_size=3, padding=1),nn.Sigmoid()  # 用于二分类任务时添加Sigmoid激活函数)def forward(self, x):# 编码器前向传播x = self.encoder(x)# 解码器前向传播x = self.decoder(x)return x# 创建模型实例
model = EncoderDecoder()# 打印模型结构
print(model)

编码器和解码器的结构可能会更加复杂,具体的设计取决于任务的要求和数据集的特点。上述代码中使用的是PyTorch的简单卷积层、池化层和上采样层,实际场景中可能需要更深的网络结构和更复杂的组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/696935.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能中的概率魔法:解锁不确定性的智慧之钥

在人工智能(AI)的广阔天地中,概率论以其独特的魅力,成为了连接现实世界与智能决策的桥梁。从语音识别到图像识别,从自然语言处理到机器翻译,从智能推荐到自动驾驶,概率论知识在这些领域中发挥着…

C++ 派生类的引入与特性

一 继承与派生 从上面的例子可以看出: 继承:一旦指定了某种事物父代的本质特征,那么它的子代将会自动具有哪些性质。这就是一种朴素的可重用的概念。 派生:而且子代可以拥有父代没有的特性,这是可扩充的概念。 1 C 的…

重大升级 | OpenSCA SaaS全面接入供应链安全情报!

结合社区用户反馈及研发小伙伴的积极探索, OpenSCA 项目组再次发力,SaaS版本重大升级啦! 用户的需求是OpenSCA前进的动力,欢迎更多感兴趣的朋友们积极试用和反馈~ 更 新 内 容 1.全面接入云脉XSBOM供应链安全情报 2.强大的资产…

【kubernetes】容器编排平台的介绍

目录 前言 一、云原生知识 1、云原生要素 2、SRE(Site Reliability Engineering) 二、kubernetes 概述 1、kubernetes 概念 2、传统后端部署与k8s 的对比 2.1 传统部署 2.2 k8s的部署 3、为什么要用K8S 4、K8S解决的问题 5、K8S功能与特性 5…

CEETRON SDK 可为您的CAE应用程序提供5大优势!

开发CAE应用程序是一项资源密集型、复杂且耗时的工作。成功的开发人员会尽其所能,确保他们专注于让他们的产品、他们的新想法独一无二的东西。凭借CEETRON系列产品及其集成的工具,Tech Soft 3D提供了唯一支持预处理、求解和后处理工作流程的完整CAE组件技…

【挑战30天首通《谷粒商城》】-【第一天】【10 番外篇】 解决docker 仓库无法访问 + MobaXterm连接VirtualBox虚拟机

文章目录 课程介绍 1、解决docker 仓库无法访问 2、 MobaXterm连接VirtualBox虚拟机 Stage 1:下载MobaXterm选择适合你的版本 Stage 2:vagrant ssh 连接,开启ssh访问 Stage 2-1:su获取root账号权限,输入密码(默认vagra…

材料物理 笔记-8

原内容请参考哈尔滨工业大学何飞教授:https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》(哈尔滨工业大学出版社) ——…

网页如何集成各社区征文活动

Helllo , 我是小恒 由于我需要腾讯云社区,稀土掘金以及CSDN的征文活动RSS,找了一下没发现,所以使用GET 请求接口对网页定时进行拉取清洗,甚至无意间做了一个简单的json格式API 最终网址:hub.liheng.work API:http://hub.liheng.wo…

海洋环境保护论文阅读记录

海洋环境保护 论文1:Critical role of wave–seabed interactions in the extensive erosion of Yellow River estuarine sediments 波浪-海床相互作用在黄河河口广泛侵中的关键作用 estuatine 河口的,港湾的 erodibility侵蚀度 sediment erodibility …

C++进阶:哈希(1)

目录 1. 简介unordered_set与unordered_map2. 哈希表(散列)2.1 哈希表的引入2.2 闭散列的除留余数法2.2.1 前置知识补充与描述2.2.2 闭散列哈希表实现 2.3 开散列的哈希桶2.3.1 结构描述2.3.2 开散列哈希桶实现2.3.3 哈希桶的迭代器与key值处理仿函数 3.…

移动 App 入侵与逆向破解技术-iOS 篇

如果您有耐心看完这篇文章,您将懂得如何着手进行app的分析、追踪、注入等实用的破解技术,另外,通过“入侵”,将帮助您理解如何规避常见的安全漏洞,文章大纲: 简单介绍ios二进制文件结构与入侵的原理介绍入…

《2024网络安全报告》中文版

Check Point发布了《2024 年网络安全报告》,Check Point Research 对网络攻击数据(包括所有地区和全球的统计数据)进行了全面分析,揭示了不断变化的网络威胁形势。 ● 去年,全球 1/10 的机构遭遇勒索软件攻击尝试&a…