序列到序列 (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]) # ... 后续层 ...