news 2026/5/12 7:22:35

机器翻译:从 RNN 到 Transformer 的演进

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机器翻译:从 RNN 到 Transformer 的演进

机器翻译:从 RNN 到 Transformer 的演进

1. 技术分析

1.1 机器翻译技术演进

机器翻译经历了从规则方法到深度学习的演进:

机器翻译技术路线 规则翻译: 基于语法规则 统计翻译: 基于语料统计 神经机器翻译: RNN/Transformer

1.2 神经机器翻译架构

架构特点代表模型
RNN seq2seq循环结构Seq2Seq
Attention注意力机制Bahdanau Attention
Transformer全注意力Transformer
MLP-Mixer无注意力MLP-Mixer

1.3 翻译质量评估指标

BLEU 评分计算 BLEU = BP * exp(Σ w_n * log(p_n)) 其中 p_n 是 n-gram 精度,BP 是简短惩罚

2. 核心功能实现

2.1 RNN Seq2Seq 实现

import torch import torch.nn as nn import torch.nn.functional as F class EncoderRNN(nn.Module): def __init__(self, input_size, hidden_size, num_layers=2): super().__init__() self.hidden_size = hidden_size self.embedding = nn.Embedding(input_size, hidden_size) self.lstm = nn.LSTM(hidden_size, hidden_size, num_layers=num_layers, bidirectional=True) def forward(self, x): embedded = self.embedding(x) outputs, (hidden, cell) = self.lstm(embedded) hidden = torch.cat((hidden[-2], hidden[-1]), dim=1) cell = torch.cat((cell[-2], cell[-1]), dim=1) return outputs, (hidden.unsqueeze(0), cell.unsqueeze(0)) class DecoderRNN(nn.Module): def __init__(self, hidden_size, output_size, num_layers=2): super().__init__() self.hidden_size = hidden_size self.embedding = nn.Embedding(output_size, hidden_size) self.lstm = nn.LSTM(hidden_size * 2, hidden_size, num_layers=num_layers) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x, hidden, encoder_outputs=None): embedded = self.embedding(x).unsqueeze(0) output, hidden = self.lstm(embedded, hidden) prediction = self.fc(output.squeeze(0)) return prediction, hidden class Seq2Seq(nn.Module): def __init__(self, encoder, decoder): super().__init__() self.encoder = encoder self.decoder = decoder def forward(self, src, tgt): encoder_outputs, hidden = self.encoder(src) outputs = [] x = tgt[0] for _ in range(len(tgt)): output, hidden = self.decoder(x, hidden, encoder_outputs) outputs.append(output) x = output.argmax(dim=1) return torch.stack(outputs)

2.2 Attention Seq2Seq 实现

class AttentionDecoder(nn.Module): def __init__(self, hidden_size, output_size, num_layers=2): super().__init__() self.hidden_size = hidden_size self.embedding = nn.Embedding(output_size, hidden_size) self.lstm = nn.LSTM(hidden_size * 3, hidden_size, num_layers=num_layers) self.attn = nn.Linear(hidden_size * 2, hidden_size) self.fc = nn.Linear(hidden_size * 2, output_size) def forward(self, x, hidden, encoder_outputs): embedded = self.embedding(x).unsqueeze(0) attn_weights = F.softmax( torch.bmm(encoder_outputs.transpose(0, 1), self.attn(hidden[0].transpose(0, 1)).transpose(1, 2)), dim=1 ) context = torch.bmm(attn_weights, encoder_outputs.transpose(0, 1)).transpose(0, 1) lstm_input = torch.cat((embedded, context), dim=2) output, hidden = self.lstm(lstm_input, hidden) prediction = self.fc(torch.cat((output.squeeze(0), context.squeeze(0)), dim=1)) return prediction, hidden, attn_weights

2.3 Transformer 机器翻译

class TransformerMT(nn.Module): def __init__(self, src_vocab_size, tgt_vocab_size, d_model=512, num_heads=8, d_ff=2048, num_layers=6): super().__init__() self.src_embedding = nn.Embedding(src_vocab_size, d_model) self.tgt_embedding = nn.Embedding(tgt_vocab_size, d_model) self.positional_encoding = PositionalEncoding(d_model) self.transformer = nn.Transformer( d_model=d_model, nhead=num_heads, num_encoder_layers=num_layers, num_decoder_layers=num_layers, dim_feedforward=d_ff ) self.fc = nn.Linear(d_model, tgt_vocab_size) def forward(self, src, tgt): src = self.src_embedding(src) * torch.sqrt(torch.tensor(self.src_embedding.embedding_dim, dtype=torch.float32)) src = self.positional_encoding(src) tgt = self.tgt_embedding(tgt) * torch.sqrt(torch.tensor(self.tgt_embedding.embedding_dim, dtype=torch.float32)) tgt = self.positional_encoding(tgt) output = self.transformer(src, tgt) output = self.fc(output) return output def translate(self, src, max_len=100): self.eval() src = self.src_embedding(src) * torch.sqrt(torch.tensor(self.src_embedding.embedding_dim, dtype=torch.float32)) src = self.positional_encoding(src) tgt = torch.tensor([[self.tgt_start_token]], device=src.device) for _ in range(max_len): tgt_emb = self.tgt_embedding(tgt) * torch.sqrt(torch.tensor(self.tgt_embedding.embedding_dim, dtype=torch.float32)) tgt_emb = self.positional_encoding(tgt_emb) output = self.transformer(src, tgt_emb) prediction = self.fc(output[:, -1]) next_token = prediction.argmax(dim=1).unsqueeze(0) tgt = torch.cat([tgt, next_token], dim=1) if next_token.item() == self.tgt_end_token: break return tgt

3. 性能对比

3.1 机器翻译模型对比

模型BLEU训练时间推理速度适用场景
RNN Seq2Seq45小规模
Attention Seq2Seq55中等规模
Transformer65大规模
T570很慢大规模

3.2 不同语言对的表现

语言对TransformerT5mBART
英中556260
中英586563
英德626866

3.3 模型大小影响

参数规模BLEU训练时间内存
100M551天8GB
500M625天16GB
1B6810天32GB

4. 最佳实践

4.1 机器翻译模型选择

def select_translation_model(direction, data_size): if data_size < 10000: return Seq2Seq(EncoderRNN(10000, 256), DecoderRNN(256, 10000)) else: return TransformerMT(10000, 10000) class TranslationModelFactory: @staticmethod def create(config): if config['type'] == 'seq2seq': return Seq2Seq(**config['params']) elif config['type'] == 'transformer': return TransformerMT(**config['params']) elif config['type'] == 't5': from transformers import T5ForConditionalGeneration return T5ForConditionalGeneration.from_pretrained(config['model_name'])

4.2 机器翻译训练流程

class TranslationTrainer: def __init__(self, model, optimizer, scheduler, loss_fn): self.model = model self.optimizer = optimizer self.scheduler = scheduler self.loss_fn = loss_fn def train_step(self, src, tgt): self.optimizer.zero_grad() output = self.model(src, tgt[:, :-1]) loss = self.loss_fn(output.reshape(-1, output.size(-1)), tgt[:, 1:].reshape(-1)) loss.backward() self.optimizer.step() self.scheduler.step() return loss.item() def evaluate(self, dataloader): self.model.eval() total_loss = 0 with torch.no_grad(): for src, tgt in dataloader: output = self.model(src, tgt[:, :-1]) loss = self.loss_fn(output.reshape(-1, output.size(-1)), tgt[:, 1:].reshape(-1)) total_loss += loss.item() return total_loss / len(dataloader)

5. 总结

机器翻译已进入 Transformer 时代:

  1. Transformer:目前最优的机器翻译架构
  2. 预训练模型:T5、mBART 等效果优秀
  3. 多语言支持:mBART 支持 50+ 语言
  4. 质量评估:BLEU 是主要评估指标

对比数据如下:

  • Transformer 比 RNN Seq2Seq 提升约 20% BLEU
  • T5 在大规模数据上表现最佳
  • 双语语料越多效果越好
  • 推荐使用预训练模型进行微调
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 7:17:48

基于Refine框架的企业级后台管理系统实战开发指南

1. 项目概述与核心价值最近在梳理企业内部后台管理系统的技术栈时&#xff0c;我又一次把目光投向了refine这个框架。如果你也和我一样&#xff0c;长期被各种业务后台的重复性开发工作所困扰——比如没完没了的增删改查&#xff08;CRUD&#xff09;界面、复杂的权限控制、数据…

作者头像 李华
网站建设 2026/5/12 7:08:36

真材实料的火锅底料代工厂

火锅餐饮赛道的内卷&#xff0c;已经从前厅的装修、服务、营销&#xff0c;延伸到了后厨的供应链。对于一家火锅店而言&#xff0c;锅底是灵魂&#xff0c;底料则是这个灵魂的载体。它直接影响着顾客的复购率&#xff0c;也决定了门店的利润空间。然而&#xff0c;当餐饮老板们…

作者头像 李华
网站建设 2026/5/12 7:08:32

React自定义光标组件开发:从原理到性能优化的完整实践

1. 项目概述&#xff1a;为什么我们需要一个自定义光标&#xff1f;在Web开发的世界里&#xff0c;细节决定体验。一个精心设计的交互界面&#xff0c;往往能通过微妙的反馈让用户感到愉悦和高效。我们每天都要与鼠标光标打交道&#xff0c;它是用户与数字世界最直接的物理连接…

作者头像 李华
网站建设 2026/5/12 7:02:43

基于Spring AI + 阿里百炼 DashScope:构建 AI Agent RAG 企业级知识助手

目录前言&#xff1a;打破知识孤岛与大模型幻觉环境与准备&#x1f4e6; 专属依赖包引入与版本管控&#x1f50d; 阿里百炼模型选型指南⚙️ YAML 配置与 Nacos 整合&#x1f4a1; 为什么选择 Elasticsearch 8.x 作为向量数据库&#xff1f;实践&#xff1a;落地高精度 RAG 核心…

作者头像 李华