人工智能之语言领域
第十三章 序列到序列模型
文章目录
- 人工智能之语言领域
- [前言 序列到序列模型](#前言 序列到序列模型)
- [13.1 序列到序列(Seq2Seq)模型概述](#13.1 序列到序列(Seq2Seq)模型概述)
- [13.1.1 核心应用场景:机器翻译、文本摘要、对话生成](#13.1.1 核心应用场景:机器翻译、文本摘要、对话生成)
- [13.1.2 Seq2Seq的基本架构:Encoder-Decoder](#13.1.2 Seq2Seq的基本架构:Encoder-Decoder)
- [13.2 传统Seq2Seq模型](#13.2 传统Seq2Seq模型)
- [13.3 注意力机制融入Seq2Seq](#13.3 注意力机制融入Seq2Seq)
- [13.3.1 Attention-based Seq2Seq架构](#13.3.1 Attention-based Seq2Seq架构)
- [13.3.2 性能提升与原理分析](#13.3.2 性能提升与原理分析)
- [13.4 现代Seq2Seq模型:基于Transformer的Seq2Seq](#13.4 现代Seq2Seq模型:基于Transformer的Seq2Seq)
- [Transformer Seq2Seq架构图](#Transformer Seq2Seq架构图)
- [13.5 实战案例:中文文本摘要生成](#13.5 实战案例:中文文本摘要生成)
- 资料
前言 序列到序列模型
在自然语言处理(NLP)中,序列到序列(Seq2Seq)模型是用于将一个序列映射到另一个序列的框架。它们被广泛应用于各种任务,如机器翻译、文本摘要和对话系统等。本章将深入探讨Seq2Seq模型的发展历程,从基于RNN的传统模型到引入注意力机制的改进版本,再到现代Transformer架构的演变,并通过中文文本摘要生成实战演示其构建过程。
13.1 序列到序列(Seq2Seq)模型概述
13.1.1 核心应用场景:机器翻译、文本摘要、对话生成
- 机器翻译:将一种语言的句子转换为另一种语言。
- 文本摘要:自动产生简洁的文摘,概括原始文档的主要信息。
- 对话生成:根据用户输入自动生成回应,实现人机交互。
13.1.2 Seq2Seq的基本架构:Encoder-Decoder
Seq2Seq模型通常由两部分组成:
- 编码器(Encoder):接收并理解输入序列,将其转换成固定长度的向量表示。
- 解码器(Decoder):基于该向量生成输出序列。
编码
源序列
编码器
上下文向量
解码器
目标序列
注意:传统上,编码器和解码器常采用循环神经网络(RNN)及其变种(LSTM, GRU)实现。
13.2 传统Seq2Seq模型
13.2.1 RNN-based Seq2Seq
最早的Seq2Seq模型依赖于递归神经网络(RNN),尤其是长短期记忆网络(LSTM)或门控循环单元(GRU)。这些模型能够捕捉序列中的时间依赖性,但随着序列长度增加,训练难度加大且容易出现梯度消失问题。
编码器结构
python
class EncoderRNN(nn.Module):
def __init__(self, input_size, hidden_size):
super().__init__()
self.hidden_size = hidden_size
self.embedding = nn.Embedding(input_size, hidden_size)
self.gru = nn.GRU(hidden_size, hidden_size)
def forward(self, input, hidden):
embedded = self.embedding(input).view(1, 1, -1) # [1, 1, hidden_size]
output, hidden = self.gru(embedded, hidden)
return output, hidden
def init_hidden(self):
return torch.zeros(1, 1, self.hidden_size)
解码器结构
python
class DecoderRNN(nn.Module):
def __init__(self, hidden_size, output_size):
super().__init__()
self.hidden_size = hidden_size
self.embedding = nn.Embedding(output_size, hidden_size)
self.gru = nn.GRU(hidden_size, hidden_size)
self.out = nn.Linear(hidden_size, output_size)
self.softmax = nn.LogSoftmax(dim=1)
def forward(self, input, hidden):
output = self.embedding(input).view(1, 1, -1)
output = F.relu(output)
output, hidden = self.gru(output, hidden)
output = self.softmax(self.out(output[0]))
return output, hidden
13.2.2 模型的训练与推理过程
- 训练阶段:使用交叉熵损失函数优化模型参数。
- 推理阶段:采用贪心搜索或束搜索算法选择最有可能的单词作为下一个预测。
13.3 注意力机制融入Seq2Seq
13.3.1 Attention-based Seq2Seq架构
注意力机制允许解码器在生成每个词时"关注"输入序列的不同部分,而不是仅依赖于单一的上下文向量。这大大提高了对长序列的处理能力。
解码器
编码器
输入词1
隐藏状态h1
输入词2
隐藏状态h2
输入词n
隐藏状态hn
当前解码步骤t
计算注意力权重α
加权求和得到上下文向量ct
生成输出yt
实现示例
python
def attention(encoder_outputs, decoder_hidden, encoder_lengths=None):
energy = torch.sum(decoder_hidden * encoder_outputs, dim=2)
attention_weights = F.softmax(energy, dim=1)
context_vector = torch.sum(attention_weights.unsqueeze(2) * encoder_outputs, dim=1)
return context_vector, attention_weights
13.3.2 性能提升与原理分析
注意力机制通过动态调整各输入词的重要性,有效解决了长距离依赖问题,并增强了模型的表现力。
13.4 现代Seq2Seq模型:基于Transformer的Seq2Seq
Transformer架构摒弃了RNN,完全依靠自注意力机制来处理序列数据,极大地提升了效率和效果。它不仅适用于机器翻译,还被广泛应用于文本摘要、问答系统等领域。
Transformer Seq2Seq架构图
解码器
解码器层1
...
解码器层N
编码器
编码器层1
...
编码器层N
源序列
N层编码器堆叠
N层解码器堆叠
目标序列
13.5 实战案例:中文文本摘要生成
数据准备
首先需要准备适合进行文本摘要的数据集,例如LCSTS(Large Chinese Short Text Summarization Dataset)。
模型定义
可以基于Hugging Face Transformers库快速搭建一个基于BERT的seq2seq模型来进行摘要生成。
python
from transformers import BertTokenizer, EncoderDecoderModel
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = EncoderDecoderModel.from_encoder_decoder_pretrained('bert-base-chinese', 'bert-base-chinese')
# Tokenize inputs and targets
inputs = tokenizer(["这是一个测试句子"], return_tensors="pt", padding=True, truncation=True)
targets = tokenizer(["这是摘要"], return_tensors="pt", padding=True, truncation=True)
# Forward pass
outputs = model(input_ids=inputs.input_ids, decoder_input_ids=targets.input_ids)
训练过程
利用AdamW优化器,设定合适的超参数进行训练。
python
optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5)
loss_fn = nn.CrossEntropyLoss(ignore_index=tokenizer.pad_token_id)
for epoch in range(num_epochs):
for batch in train_loader:
optimizer.zero_grad()
outputs = model(input_ids=batch['input_ids'], decoder_input_ids=batch['decoder_input_ids'])
loss = loss_fn(outputs.logits.view(-1, outputs.logits.size(-1)), batch['labels'].view(-1))
loss.backward()
optimizer.step()
推理与评估
在完成训练后,可以通过模型生成摘要,并使用ROUGE等指标评估生成质量。
python
generated = model.generate(input_ids, max_length=max_summary_length)
summary = tokenizer.decode(generated[0], skip_special_tokens=True)
print(f"Generated Summary: {summary}")
以上便是关于序列到序列模型的详细介绍,包括其基本概念、发展历程以及具体应用实例。
资料
咚咚王
《Python 编程:从入门到实践》
《利用 Python 进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第 3 版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow 机器学习实战指南》
《Sklearn 与 TensorFlow 机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python 深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习 +(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第 2 版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨 +&+ 张孜铭
《AIGC 原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战 AI 大模型》
《AI 3.0》