当前位置: 首页 > ds >正文

NLP:Transformer各子模块作用(特别分享1)

本文目录:

  • 一、Transformer 整体架构图
  • 二、 输入层各子模块
    • **(一)输入嵌入(Input Embedding)**
    • **(二)位置编码(Positional Encoding)**
  • 三、编码器各子模块
    • **(一)多头自注意力机制(Multi-Head Self-Attention)**
    • **(二)前馈神经网络(Feed Forward Network)**
  • 四、 解码器各子模块
    • **(一)掩码多头注意力(Masked Multi-Head Attention)**
    • **(二)编码器-解码器注意力(Encoder-Decoder Attention)**
  • 五、Transformer 各模块协同工作流程
  • 六、各模块的核心作用总结
  • 七、 实际应用中的变体
    • **(一)BERT(仅编码器)**
    • **(二)GPT(仅解码器)**
    • **(三)原始Transformer(编码器-解码器)**
  • 八、总结

前言:Transformer 是深度学习领域的革命性架构,彻底改变了NLP的发展方向。前面分享了Transformer的大概构建思路,本文特别分享Transformer的各子模块作用。

一、Transformer 整体架构图

首先,我们来看Transformer的整体结构,它主要由输入层、编码器、解码器和输出层 四部分组成:

Input → Input Embedding → Positional Encoding → Encoder Stack → Decoder Stack → Output

二、 输入层各子模块

(一)输入嵌入(Input Embedding)

def input_embedding(input_tokens):"""将离散的token转换为连续的向量表示"""# 作用:将词汇映射到高维空间,捕获语义信息# 实现:查找表(lookup table)或神经网络return embedding_matrix[input_tokens]# 示例:将"apple"映射为[0.2, -0.5, 0.8, ...]的256维向量

(二)位置编码(Positional Encoding)

def positional_encoding(embedding):"""为序列添加位置信息(因为Transformer没有RNN的循环结构)"""# 使用正弦和余弦函数生成位置信息# 公式:PE(pos, 2i) = sin(pos/10000^(2i/d_model))#       PE(pos, 2i+1) = cos(pos/10000^(2i/d_model))return embedding + position_matrix# 为什么需要:自注意力机制本身没有位置概念,需要额外添加

三、编码器各子模块

经典的Transformer架构中的Encoder模块包含6个Encoder Block. * 每个Encoder Block包含两个子模块, 分别是多头自注意力层, 和前馈全连接层。

(一)多头自注意力机制(Multi-Head Self-Attention)

class MultiHeadAttention(nn.Module):def __init__(self, d_model, num_heads):"""d_model: 模型维度(如512)num_heads: 注意力头数(如8)"""# 核心公式:Attention(Q, K, V) = softmax(QK^T/√d_k)V# 多头:将Q、K、V投影到多个子空间,捕获不同方面的信息def forward(self, x):# 1. 线性投影得到Q、K、Vq = self.wq(x)  # Query:当前要关注的词k = self.wk(x)  # Key:被关注的词  v = self.wv(x)  # Value:实际的信息内容# 2. 计算注意力权重scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(d_k)attention_weights = F.softmax(scores, dim=-1)# 3. 加权求和output = torch.matmul(attention_weights, v)return output

注意力机制的作用

  • 捕获长距离依赖:直接计算任意两个位置的关系
  • 并行计算:比RNN更高效
  • 可解释性:注意力权重显示模型关注点

(二)前馈神经网络(Feed Forward Network)

class FeedForward(nn.Module):def __init__(self, d_model, d_ff):super().__init__()self.linear1 = nn.Linear(d_model, d_ff)  # 扩展维度(如2048)self.linear2 = nn.Linear(d_ff, d_model)  # 恢复维度self.relu = nn.ReLU()def forward(self, x):# 作用:提供非线性变换,增强模型表达能力return self.linear2(self.relu(self.linear1(x)))
## **(二) 残差连接和层归一化(Add & Norm)**
```python
def residual_connection(x, sublayer):"""残差连接:解决深层网络梯度消失问题"""return x + sublayer(x)  # 原始输入 + 子层输出def layer_norm(x):"""层归一化:稳定训练过程,加速收敛"""return (x - x.mean()) / (x.std() + eps) * gamma + beta

四、 解码器各子模块

经典的Transformer架构中的Decoder模块包含6个Decoder Block. * 每个Decoder Block包含3个子模块, 分别是多头自注意力层, Encoder-Decoder Attention层, 和前馈全连接层。

解码器与编码器结构类似,但注意力层有一些关键区别,如下:

(一)掩码多头注意力(Masked Multi-Head Attention)

class MaskedMultiHeadAttention(nn.Module):def forward(self, x):# 在解码时,不能让当前词看到后面的词# 使用上三角掩码(upper triangular mask)mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1).bool()scores = scores.masked_fill(mask, float('-inf'))  # 将未来位置设为负无穷return super().forward(x)

(二)编码器-解码器注意力(Encoder-Decoder Attention)

class EncoderDecoderAttention(nn.Module):def forward(self, decoder_x, encoder_output):# Query来自解码器,Key和Value来自编码器输出q = self.wq(decoder_x)  # Query:当前要生成的词k = self.wk(encoder_output)  # Key:编码器的信息v = self.wv(encoder_output)  # Value:编码器的信息# 这让解码器可以关注输入序列的相关部分return attention(q, k, v)

五、Transformer 各模块协同工作流程

def transformer_forward(input_seq, target_seq):# 编码器流程enc_output = input_embedding(input_seq) + positional_encodingfor _ in range(N):  # 6个编码器层enc_output = encoder_layer(enc_output)# 解码器流程  dec_output = input_embedding(target_seq) + positional_encodingfor _ in range(N):  # 6个解码器层dec_output = decoder_layer(dec_output, enc_output)return final_output

六、各模块的核心作用总结

模块英文名主要作用为什么重要
输入嵌入Input Embedding将离散token转为连续向量提供语义表示
位置编码Positional Encoding添加序列位置信息弥补无序列结构的缺陷
自注意力Self-Attention计算词与词之间的关联度捕获长距离依赖关系
多头注意力Multi-Head Attention从多个角度计算注意力捕获不同类型的语义关系
前馈网络Feed Forward非线性变换增强模型表达能力
残差连接Residual Connection直连通道解决梯度消失问题
层归一化Layer Normalization标准化激活值稳定训练过程
掩码注意力Masked Attention防止信息泄露保证自回归生成的性质
编码器-解码器注意力Encoder-Decoder Attention连接输入和输出实现序列到序列的转换

七、 实际应用中的变体

(一)BERT(仅编码器)

# 用于理解任务:文本分类、NER、情感分析
model = TransformerEncoderOnly()
output = model(input_text)  # 得到每个token的表示

(二)GPT(仅解码器)

# 用于生成任务:文本生成、对话、创作
model = TransformerDecoderOnly()
output = model.generate(prompt)  # 自回归生成文本

(三)原始Transformer(编码器-解码器)

# 用于序列到序列任务:翻译、摘要、问答
model = TransformerEncoderDecoder()
output = model.translate(english_text)  # 英译中

八、总结

Transformer的成功在于:

  1. 自注意力机制:彻底解决长距离依赖问题
  2. 并行计算:大幅提升训练效率
  3. 模块化设计:各司其职,协同工作
  4. 可扩展性:易于堆叠更多层数

每个子模块都承担着关键角色,共同构成了这个革命性的架构,为后来的BERT、GPT等模型奠定了坚实基础!

今天的分享到此结束。

http://www.xdnf.cn/news/18848.html

相关文章:

  • 网络编程socket-Udp
  • 互联网大厂Java面试模拟:深度解析核心技术
  • 100个实用小工具1.3历年股价分析小工具新增股价批量下载
  • 使用UE5开发2.5D开放世界战略养成类游戏的硬件配置指南
  • 电子厂静电释放检测误报率↓81%!陌讯多模态融合算法在安全生产监控的落地实践
  • imx6ull-驱动开发篇38——Linux INPUT 子系统
  • MATLAB 数值计算进阶:微分方程求解与矩阵运算高效方法
  • 从 Unity UGUI 到 Unreal UMG 的交互与高效实践:UI 事件、坐标系适配与性能优化
  • WinContig:高效磁盘碎片整理工具
  • 基于蓝牙的stm32智能火灾烟雾报警系统设计
  • Golang云端编程入门指南:前沿框架与技术全景解析
  • 访问控制基础与模型综述
  • Python自学笔记11 Numpy的索引和切片
  • Sui 主网升级至 V1.54.2
  • Lucene 与 Elasticsearch:从底层引擎到分布式搜索平台的演进
  • 虚幻引擎5(UE5)Android端游戏开发全流程指南:从环境配置到项目发布
  • Spring Boot测试陷阱:失败测试为何“传染”其他用例?
  • 在PC机上使用虚幻引擎5(UE5)开发第一款游戏的完整入门指南
  • HTTP请求中的CGI请求与登录注册机制
  • Golang云端编程深度指南:架构本质与高阶实践
  • 动态规划--编译距离
  • 包裹堆叠场景漏检率↓79%!陌讯多目标追踪算法在智慧物流的实践优化
  • C/C++数据结构之循环链表
  • Redis详解--基本篇
  • 手写MyBatis第31弹-用工厂模式重构MyBatis的SqlSession创建过程
  • 数据可视化——matplotlib库
  • Rust Web开发指南 第三章(Axum 请求体解析:处理 JSON、表单与文件上传)
  • IQC、IPQC、PQC、FQC、OQC在ERP/MES/WMS中的系统协同
  • [每周一更]-(第157期):深入理解Go语言的垃圾回收机制:调优与监控
  • C++ 容器——vector