[深度学习]transformer是什么(介绍)

关键词

NLP领域的绝对领导者, 序列数据, 上下文依赖, 例如机器翻译, 文本摘要, 大型语言模型.

并行计算, 没有循环, 没有卷积, 自注意力机制.

对算力要求很大, 如果你有很厉害的算力gpu, tpu等资源作为支持.

1. Transformer 是什么?

Transformer 是一种基于自注意力机制(Self-Attention) 的神经网络架构,由 Google 团队在 2017 年的论文《Attention is All You Need》中首次提出。它彻底改变了序列建模(尤其是自然语言处理)的传统方法,取代了 RNN 和 LSTM 等循环神经网络。


2. Transformer 的架构特点

  • 完全基于注意力机制:无需循环或卷积操作。
  • 并行化计算:显著提升训练速度。
  • 核心组件
    • 编码器(Encoder):处理输入序列
    • 解码器(Decoder):生成输出序列
    • 多头注意力(Multi-Head Attention):捕捉序列中不同位置的依赖关系
    • 位置编码(Positional Encoding):注入序列顺序信息

3. 主要解决的问题

  1. 长距离依赖问题:传统 RNN 难以处理长序列中的依赖关系,Transformer 的自注意力机制能直接关联任意距离的元素。
  2. 训练效率问题:RNN 的序列化计算无法并行,Transformer 的并行计算大幅提升训练速度。
  3. 核心应用领域
    • 机器翻译(如 Google Translate)
    • 文本生成(如 GPT 系列)
    • 文本分类/情感分析
    • 语音识别
    • 图像生成(如 Vision Transformer)

完整代码示例:文本分类 Transformer

以下是一个使用 PyTorch 实现的简化版 Transformer 用于文本分类的完整示例:

python 复制代码
import torch
import torch.nn as nn
import torch.optim as optim
from torchtext.data import Field, BucketIterator, TabularDataset

# 1. 定义 Transformer 模型
class TextClassificationTransformer(nn.Module):
    def __init__(self, vocab_size, embed_dim, num_heads, num_layers, hidden_dim, num_classes):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embed_dim)
        self.pos_encoder = PositionalEncoding(embed_dim)
        encoder_layer = nn.TransformerEncoderLayer(
            d_model=embed_dim, nhead=num_heads, dim_feedforward=hidden_dim
        )
        self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers)
        self.fc = nn.Linear(embed_dim, num_classes)
    
    def forward(self, x):
        # x: [seq_len, batch_size]
        x = self.embedding(x)  # [seq_len, batch_size, embed_dim]
        x = self.pos_encoder(x)
        x = self.transformer_encoder(x)  # [seq_len, batch_size, embed_dim]
        x = x.mean(dim=0)  # 全局平均池化 [batch_size, embed_dim]
        return self.fc(x)  # [batch_size, num_classes]

# 2. 位置编码层
class PositionalEncoding(nn.Module):
    def __init__(self, d_model, max_len=5000):
        super().__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(1)  # [max_len, 1, d_model]
        self.register_buffer('pe', pe)
    
    def forward(self, x):
        x = x + self.pe[:x.size(0), :]
        return x

# 3. 数据预处理
TEXT = Field(tokenize='spacy', lower=True, include_lengths=True)
LABEL = Field(sequential=False, use_vocab=False)

train_data, test_data = TabularDataset.splits(
    path='./data',
    train='train.csv',
    test='test.csv',
    format='csv',
    fields=[('text', TEXT), ('label', LABEL)]
)

TEXT.build_vocab(train_data, max_size=10000)
train_loader, test_loader = BucketIterator.splits(
    (train_data, test_data),
    batch_size=32,
    sort_key=lambda x: len(x.text),
    sort_within_batch=True
)

# 4. 训练配置
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = TextClassificationTransformer(
    vocab_size=len(TEXT.vocab),
    embed_dim=128,
    num_heads=4,
    num_layers=2,
    hidden_dim=256,
    num_classes=2
).to(device)

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 5. 训练循环
for epoch in range(10):
    for batch in train_loader:
        text, lengths = batch.text
        labels = batch.label.to(device)
        
        optimizer.zero_grad()
        outputs = model(text.to(device))
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
    
    print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}')

# 6. 测试评估
correct = 0
total = 0
with torch.no_grad():
    for batch in test_loader:
        text, lengths = batch.text
        labels = batch.label.to(device)
        outputs = model(text.to(device))
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Test Accuracy: {100 * correct / total:.2f}%')

关键组件说明:

  1. 多头注意力(Multi-Head Attention)

    python 复制代码
    nn.MultiheadAttention(embed_dim=128, num_heads=4)
    • 允许模型同时关注不同表示子空间的信息
  2. 位置编码(PositionalEncoding)

    • 使用正弦/余弦函数编码位置信息
    • 解决 Transformer 缺乏顺序感知的问题
  3. 前馈网络(Feed Forward)

    python 复制代码
    nn.Sequential(
        nn.Linear(embed_dim, hidden_dim),
        nn.ReLU(),
        nn.Linear(hidden_dim, embed_dim)
    )

实际应用建议:

  1. 预训练模型 :实际应用中推荐使用 HuggingFace 的 Transformers 库:

    python 复制代码
    from transformers import BertForSequenceClassification
    model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
  2. 超参数调整

    • 增加层数(num_layers)提升模型容量
    • 增大隐藏维度(hidden_dim)增强表示能力
    • 调整注意力头数(num_heads)优化特征提取

Transformer 已成为 NLP 的基石架构,后续的 BERT、GPT 等里程碑模型均基于此架构构建。

相关推荐
Tadas-Gao2 小时前
视觉Transformer金字塔架构演进:从PVT到CoaT的技术脉络与创新解析
人工智能·深度学习·机器学习·大模型·llm·transformer
神经星星3 小时前
【TVM 教程】在 TVM 中使用 Bring Your Own Datatypes
人工智能·深度学习·机器学习
她说人狗殊途3 小时前
神经网络基础讲解 一
人工智能·深度学习·神经网络
小张在编程4 小时前
Python 深度学习基础:TensorFlow 入门——从张量到神经网络的实战指南
python·深度学习·tensorflow
学术 学术 Fun4 小时前
Vui:轻量级语音对话模型整合包,让交互更自然
人工智能·深度学习·ai
神经星星5 小时前
入选ICML 2025!哈佛医学院等推出全球首个HIE领域临床思维图谱模型,神经认知结果预测任务上性能提升15%
人工智能·深度学习·机器学习
陈壮实的搬砖生活6 小时前
激活函数为何能增强神经网络的非线性表达能力?
人工智能·深度学习·神经网络·激活函数
一点.点7 小时前
李沐动手深度学习(pycharm中运行笔记)——12.权重衰退
pytorch·笔记·深度学习·pycharm
抱抱宝7 小时前
Transformer:现代自然语言处理的革命性架构
深度学习·自然语言处理·transformer