常见架构:处理可变长序列的艺术
在机器翻译、对话系统等许多任务中,输入的序列长度和输出的序列长度往往不相等。为了解决这个问题,研究人员提出了经典的“序列到序列 (Seq2Seq)”架构,并在此基础上发展出了革命性的“注意力机制”。
序列到序列 (Seq2Seq) 模型
核心思想:Seq2Seq 模型由两个 RNN(通常是 LSTM 或 GRU)组成:一个编码器 (Encoder) 和一个解码器 (Decoder)。
- 编码器:负责“阅读”整个输入序列(例如,一句中文),并将其压缩成一个固定长度的向量,称为上下文向量 (Context Vector)。这个向量可以被看作是整个输入序列的“思想总结”。
- 解码器:接收这个“思想总结”,然后一个词一个词地生成输出序列(例如,对应的英文翻译)。
我
爱
你
编码器 (Encoder)
→
思想
向量
向量
→
I
love
you
解码器 (Decoder)
from tensorflow import keras
from keras import layers
# 简化版的 Seq2Seq 模型
encoder_inputs = keras.Input(shape=(None,))
# ... Encoder LSTM ...
encoder_states = ...
decoder_inputs = keras.Input(shape=(None,))
# ... Decoder LSTM, 使用 encoder_states 初始化 ...
decoder_outputs = ...
model = keras.Model([encoder_inputs, decoder_inputs], decoder_outputs)
注意力机制 (Attention Mechanism)
核心思想:基础的 Seq2Seq 模型将整个输入压缩成一个固定长度的向量,这在处理长序列时会成为瓶颈(就像强迫一个人用一句话总结一整本书)。注意力机制允许解码器在生成每个输出词时,能够“回看”输入序列的各个部分,并给予不同的“注意力权重”。
这就像一个专业的翻译,在翻译长句时,会重点关注当前最相关的几个源语言词语,而不是试图记住所有内容。这使得模型能够更好地处理长距离依赖关系。
解码器正在生成 "love"...
love
↓
它会给予输入序列不同的“注意力”
我
爱
你
# 在 Keras 中使用 Attention 层
# ... Encoder 部分 ...
encoder_outputs, state_h, state_c = layers.LSTM(..., return_sequences=True, return_state=True)(encoder_inputs)
# ... Decoder 部分 ...
decoder_lstm_output = layers.LSTM(..., return_sequences=True)(decoder_inputs, initial_state=[state_h, state_c])
# 注意力层
attention_output = layers.Attention()([decoder_lstm_output, encoder_outputs])
# ... 后续层 ...