Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【AI 进阶笔记】Transformer 中英翻译实现

【AI 进阶笔记】Transformer 中英翻译实现

原创
作者头像
繁依Fanyi
发布于 2025-03-27 12:17:16
发布于 2025-03-27 12:17:16
20800
代码可运行
举报
运行总次数:0
代码可运行

在本篇博客中,我们将深入讲解 Transformer 模型在中英翻译任务中的应用。我们将从最基础的概念开始讲解,一步步带领你理解 Transformer 的各个知识点,并通过实际代码展示如何实现一个简单的中英翻译系统。

一、什么是 Transformer?

Transformer 是一种广泛应用于自然语言处理(NLP)任务的深度学习模型,它由 Vaswani 等人于 2017 年提出。Transformer 模型不依赖传统的循环神经网络(RNN)或长短时记忆网络(LSTM),而是通过“注意力机制”对输入数据进行建模。

注意力机制

注意力机制的核心思想是让模型“关注”输入的某些部分,而非平等对待所有部分。Transformer 中的自注意力机制(Self-Attention)使得每个输入元素都可以参考其他元素的信息,从而能够捕捉到更丰富的上下文信息。

二、Transformer 模型结构

Transformer 模型由编码器(Encoder)和解码器(Decoder)两部分组成,分别用于处理输入序列和生成输出序列。我们首先了解模型的关键组成部分。

1. 自注意力机制(Self-Attention)

自注意力机制帮助模型通过计算输入序列的权重来决定每个词在当前上下文中的重要性。每个词都会生成三个向量:查询(Query)、键(Key)和值(Value)。通过这些向量计算相似度,模型决定哪些词对当前词更重要。

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

为了增强模型的学习能力,Transformer 使用了多头注意力机制。通过并行计算多个“注意力头”,模型可以从不同的角度去“理解”输入数据。

3. 前馈神经网络(Feed-Forward Neural Network)

每一层的输出会通过一个全连接的前馈神经网络进行非线性变换。

4. 位置编码(Positional Encoding)

由于 Transformer 没有递归结构,它无法像 RNN 一样自动捕捉序列的位置信息,因此我们需要使用位置编码来显式地告诉模型每个词在序列中的位置。

5. 残差连接与层归一化(Residual Connection & Layer Normalization)

为了防止深层网络训练困难,Transformer 在每一层的输入和输出之间加入了残差连接。每一层的输出还会进行层归一化,以保证训练的稳定性。

三、使用 PyTorch 实现 Transformer

现在,我们使用 PyTorch 来实现一个简化版的 Transformer 模型,完成中英翻译的任务。首先,我们需要准备数据集。

3.1 数据预处理

我们使用 PyTorch 和 torchtext 库来加载和处理机器翻译数据集,这里我们选择 WMT 数据集(中英翻译)。在这个例子中,我们使用一个小规模的子集进行演示。

代码语言:bash
AI代码解释
复制
pip install torchtext
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import torch
import torchtext
from torchtext.datasets import IWSLT
from torchtext.data import Field, BucketIterator

# 1. 定义字段
SRC = Field(tokenize='spacy', tokenizer_language='zh', init_token='<sos>', eos_token='<eos>', lower=True)
TRG = Field(tokenize='spacy', tokenizer_language='en', init_token='<sos>', eos_token='<eos>', lower=True)

# 2. 加载数据
train_data, valid_data, test_data = IWSLT.splits(exts=('.zh', '.en'), fields=(SRC, TRG))

# 3. 构建词汇表
SRC.build_vocab(train_data, min_freq=2)
TRG.build_vocab(train_data, min_freq=2)

# 4. 创建数据迭代器
BATCH_SIZE = 32
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

train_iterator, valid_iterator, test_iterator = BucketIterator.splits(
    (train_data, valid_data, test_data), 
    batch_size=BATCH_SIZE, 
    device=device)

3.2 Transformer 模型实现

接下来,我们构建 Transformer 模型。模型结构包括:嵌入层、编码器、解码器和最终的线性层。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import torch.nn as nn
import torch.optim as optim

class Transformer(nn.Module):
    def __init__(self, input_dim, output_dim, hid_dim, n_layers, n_heads, pf_dim, dropout):
        super().__init__()

        self.encoder = nn.Embedding(input_dim, hid_dim)
        self.decoder = nn.Embedding(output_dim, hid_dim)
        
        self.attn = nn.MultiheadAttention(hid_dim, n_heads, dropout=dropout)
        
        self.fc = nn.Linear(hid_dim, output_dim)
        self.dropout = nn.Dropout(dropout)

        # 位置编码
        self.positional_encoding = nn.Embedding(5000, hid_dim)  # 位置编码的最大长度为5000

    def forward(self, src, trg):
        src = self.encoder(src) + self.positional_encoding(torch.arange(src.size(0), device=src.device))
        trg = self.decoder(trg) + self.positional_encoding(torch.arange(trg.size(0), device=trg.device))

        # 编码器部分
        src = src.transpose(0, 1)
        output, _ = self.attn(src, src, src)

        # 解码器部分
        trg = trg.transpose(0, 1)
        output, _ = self.attn(trg, output, output)

        output = output.transpose(0, 1)
        output = self.fc(output)
        return output

3.3 训练模型

训练过程中,我们使用交叉熵损失函数,并选择 Adam 优化器。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 参数设置
input_dim = len(SRC.vocab)
output_dim = len(TRG.vocab)
hid_dim = 256
n_layers = 3
n_heads = 8
pf_dim = 512
dropout = 0.1

# 创建模型
model = Transformer(input_dim, output_dim, hid_dim, n_layers, n_heads, pf_dim, dropout).to(device)

# 优化器与损失函数
optimizer = optim.Adam(model.parameters(), lr=0.0005)
criterion = nn.CrossEntropyLoss(ignore_index=TRG.vocab.stoi['<pad>'])

# 训练函数
def train(model, iterator, optimizer, criterion):
    model.train()
    epoch_loss = 0

    for batch in iterator:
        src, trg = batch.src, batch.trg

        optimizer.zero_grad()

        output = model(src, trg[:-1,:])

        # 计算损失
        output_dim = output.shape[-1]
        output = output.view(-1, output_dim)
        trg = trg[1:,:].view(-1)
        
        loss = criterion(output, trg)
        loss.backward()

        optimizer.step()
        epoch_loss += loss.item()

    return epoch_loss / len(iterator)

# 训练模型
for epoch in range(10):
    train_loss = train(model, train_iterator, optimizer, criterion)
    print(f'Epoch {epoch+1}, Train Loss: {train_loss:.3f}')

3.4 使用 GPU 加速训练

在 PyTorch 中,训练模型时可以很容易地使用 GPU 进行加速。只需要确保模型和数据都被转移到 GPU。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 转移到 GPU(如果有的话)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)

# 批量数据转移到 GPU
src = src.to(device)
trg = trg.to(device)

3.5 使用 NPU 推理

如果你有 NPU 设备(例如华为昇腾 AI 处理器),你可以使用 MindSporeTensorFlow Lite 来部署 NPU 推理。以下是使用 PyTorch 转化模型到 TensorFlow Lite 的方法:

代码语言:bash
AI代码解释
复制
pip install tf-nightly

将 PyTorch 模型转化为 TensorFlow 格式并进行推理:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import torch
import tensorflow as tf

# 转换 PyTorch 模型为 TensorFlow
import tf2onnx
onnx_model = tf2onnx.convert.from_pytorch(model)

# 将模型保存为 TFLite 格式
converter = tf.lite.TFLiteConverter.from_onnx_model(onnx_model)
tflite_model = converter.convert()

# 保存模型
with open("transformer_model.tflite", "wb") as f:
    f.write(tflite_model)

希望这些内容对你有所帮助(*^_^*)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
指针生成网络(PGN)详细指南(引入)
我们首先要了解的是seq2seq(Sequence-to-Sequence)模型。它最早由Google在2014年的一篇论文中提出,是第一个真正意义上的端到端的编码器-解码器(Encoder-Decoder)框架。
@小森
2025/01/24
960
训练基于Transformer的翻译任务模型
🤗机器翻译是自然语言处理领域中的一个重要任务,其中Transformer模型其强大的表征能力和并行计算能力,成为机器翻译的主流模型。
@小森
2024/12/31
1980
训练基于Transformer的翻译任务模型
从规则到神经网络:机器翻译技术的演化之路
机器翻译(Machine Translation, MT)是人工智能领域的一项关键技术,旨在实现不同语言之间的自动翻译。自从20世纪中叶首次提出以来,机器翻译已从简单的字面翻译演变为今天高度复杂和精准的语义翻译。这项技术的发展不仅彻底改变了全球信息交流的方式,而且对于经济、政治和文化交流产生了深远影响。
TechLead
2023/12/05
1.9K0
从规则到神经网络:机器翻译技术的演化之路
熬了一晚上,我从零实现了Transformer模型,把代码讲给你听
来源丨https://zhuanlan.zhihu.com/p/411311520
Python数据科学
2021/10/19
2.5K0
百闻不如一码!手把手教你用Python搭一个Transformer
与基于RNN的方法相比,Transformer 不需要循环,主要是由Attention 机制组成,因而可以充分利用python的高效线性代数函数库,大量节省训练时间。
大数据文摘
2019/05/07
1.1K0
百闻不如一码!手把手教你用Python搭一个Transformer
百闻不如一码!手把手教你用Python搭一个Transformer
与基于RNN的方法相比,Transformer 不需要循环,主要是由Attention 机制组成,因而可以充分利用python的高效线性代数函数库,大量节省训练时间。
一墨编程学习
2019/05/08
7690
百闻不如一码!手把手教你用Python搭一个Transformer
【入门】PyTorch文本分类
文本分类是NLP领域的较为容易的入门问题,本文记录文本分类任务的基本流程,大部分操作使用了torch和torchtext两个库。
zenRRan
2020/02/18
1.9K0
使用pytorch进行文本分类——ADGCNN
在文本分类任务中常用的网络是RNN系列或Transformer的Encoder,很久没有看到CNN网络的身影(很久之前有TextCNN网络)。本文尝试使用CNN网络搭建一个文本分类器,命名为:ADGCNN。
Dendi
2019/12/12
1.9K0
循环神经网络:从基础到应用的深度解析
今日推荐:前端小白使用Docsify+Markdown+‌Vercel,无服务器部署个人知识库原创
小馒头学Python
2024/11/30
2130
循环神经网络:从基础到应用的深度解析
使用PyTorch建立你的第一个文本分类模型
我总是使用最先进的架构来在一些比赛提交模型结果。得益于PyTorch、Keras和TensorFlow等深度学习框架,实现最先进的体系结构变得非常容易。这些框架提供了一种简单的方法来实现复杂的模型体系结构和算法,而只需要很少的概念知识和代码技能。简而言之,它们是数据科学社区的一座金矿!
磐创AI
2020/03/04
2.2K0
一文看懂Transformer内部原理(含PyTorch实现)
  "Attention is All You Need" 一文中提出的Transformer网络结构最近引起了很多人的关注。Transformer不仅能够明显地提升翻译质量,还为许多NLP任务提供了新的结构。虽然原文写得很清楚,但实际上大家普遍反映很难正确地实现。
10JQKA
2018/12/28
2.7K0
用于情感分析的Transformers
本文首次介绍的Transformers模型。具体来说,将使用本文中的BERT(来自Transformers的双向编码器表示)模型。
代码医生工作室
2020/03/20
3.3K0
搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了
本文对Vision Transformer的原理和代码进行了非常全面详细的解读,一切从Self-attention开始、Transformer的实现和代码以及Transformer+Detection:引入视觉领域的首创DETR。
AI算法与图像处理
2021/01/20
8K0
搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了
Transformer - 3 - Transformer 的实现
Transformer 模型来源于 Google 发表的一篇论文 “Attention Is All You Need”,希望大家能在有一些了解的基础上,能够自己读一下这篇文章。
为为为什么
2023/05/11
6200
Transformer - 3 - Transformer 的实现
音视频开发之旅(89) - Transformer论文解读和源码解析
Transformer是续MLP RNN CNN后又一个影响深远的模型,  之前CNN RNN基本上都在各自的领域发光发热,  但是Transformer 在很多领域都有着很广泛的应用. eg: chatgpt  llama等语言大模型, sd文生图模型, 以及多模态 llava等. 我们最近探索的视频&图像画质评测以及画质增强很多算法也都是基于Transformer. 所以加强对Transformer学习理解和应用迫在眉睫.
音视频开发之旅
2024/09/07
1270
音视频开发之旅(89) - Transformer论文解读和源码解析
【组队学习】Task02:学习Attention和Transformer
datawhale8月组队学习 -基于transformers的自然语言处理(NLP)入门
诡途
2022/01/07
4320
【组队学习】Task02:学习Attention和Transformer
LSTM-based Sentiment Classification
我们初步的设想是,首先将一个句子输入到LSTM,这个句子有多少个单词,就有多少个输出,然后将所有输出通过一个Linear Layer,这个Linear Layer的out_size是1,起到Binary Classification的作用
mathor
2020/02/15
7060
基于深度学习的自然语言处理(Deep Learning-based Natural Language Processing)
自然语言处理(Natural Language Processing,NLP)是人工智能领域中一个重要的研究方向。随着深度学习技术的快速发展,基于深度学习的自然语言处理方法逐渐成为主流。本文将介绍深度学习算法在自然语言处理中的应用,并探讨其在不同任务中的优势和挑战。
大盘鸡拌面
2023/09/28
8690
Transformer代码完全解读!
本篇正文部分约10000字,分模块解读并实践了Transformer,建议收藏阅读。
zenRRan
2021/10/08
3.3K0
Transformer代码完全解读!
【深度学习】与【PyTorch实战】
深度学习是机器学习的一个分支,主要通过多层神经网络进行数据特征的自动提取和建模。本文将通过PyTorch这个深度学习框架,从理论到实战,详细介绍深度学习的基本概念、模型构建、训练和评估的过程。我会包含实例和代码,以帮助理解。
小李很执着
2024/06/15
1390
【深度学习】与【PyTorch实战】
推荐阅读
相关推荐
指针生成网络(PGN)详细指南(引入)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验