Encoder VS Decoder
Decoder
Encoder 和 Decoder 的数学区别
1. 主要区别概览
Encoder
Decoder
2. Encoder(编码器)的数学公式
2.1 输入
编码器的输入是一个序列:
其中,每个 是输入的 token(例如单词的向量表示)。
2.2 递归计算
编码器使用递归公式计算隐藏状态:
其中:
是时间步 的隐藏状态。
是 RNN/LSTM/GRU 的转换函数。
最简单的 RNN 计算方式:
LSTM 计算方式(包含遗忘门、输入门、输出门):
最终,编码器的隐藏状态 形成上下文向量 :
其中 可能是直接取最后一个隐藏状态(简单情况)或某种加权平均(如注意力机制)。
3. Decoder(解码器)的数学公式
3.1 输入
解码器的输入是:
编码器的上下文向量 。
目标序列的前一个 token 。
3.2 递归计算
解码器使用自己的隐藏状态 进行更新:
其中:
是解码器的隐藏状态。
是解码器的转换函数(通常与编码器的 结构类似)。
RNN 版本:
LSTM 版本:
3.3 输出生成
解码器的隐藏状态 用于计算当前 token 的概率:
softmax 计算每个可能单词的概率分布,并选择最可能的单词作为当前输出。
4. Encoder 和 Decoder 之间的核心数学区别
输入
隐藏状态计算
输出
目标
压缩整个输入序列的信息
逐步生成目标序列
数学核心区别:
输入不同:
编码器的输入是整个源语言句子 。
解码器的输入是**编码器输出的上下文向量 + 目标序列的前一个 token 。
隐藏状态计算方式不同:
编码器:,仅依赖过去信息(单向)或前后信息(双向)。
解码器:,依赖于编码器输出 + 先前已生成的 token。
输出不同:
编码器输出最终隐藏状态 (或经过注意力机制的上下文向量 ),用作整个输入的表示。
解码器使用 softmax 生成目标序列中的 token,逐步预测下一个单词。
5. 总结
编码器 负责 处理整个输入序列,并生成一个固定长度的上下文向量 ,用来表示整个输入序列的信息。
解码器 逐步接收上下文向量 ,并依赖前一个时间步的输出,一步步生成目标序列。
数学层面上:
编码器是一个标准的递归网络,输入的是 源语言序列,只依赖于 过去信息(或前后信息,若是双向)。
解码器依赖编码器的输出 + 先前已生成的 token,是一个 自回归模型,用 softmax 生成下一个 token。
h, x, s, y到底是啥
在 序列到序列(seq2seq) 任务中,编码器的最终隐藏状态 被称为上下文变量或上下文向量(context vector)。它是整个输入序列的信息压缩,并传递给解码器,以生成目标输出。
例子:机器翻译
我们以 英语到法语翻译 为例:
输入句子(英文):"I love you"
目标句子(法语):"Je t'aime"
1. 词向量表示
假设:
"I"
→"love"
→"you"
→
这些 是输入单词的词向量(word embeddings)。
2. 编码器(Encoder)
编码器是一个 循环神经网络(RNN, LSTM, GRU),它逐步读取输入单词,并更新隐藏状态(hidden state) :
输入第一个单词
"I"
:其中 是初始隐藏状态(通常设为全零)。
输入第二个单词
"love"
:输入第三个单词
"you"
:
最终,编码器的最后一个隐藏状态 作为上下文向量:
它浓缩了整个输入句子的意思,并作为解码器的输入。
3. 解码器(Decoder)
解码器是另一个 RNN,它接收 上下文向量 ( h_T ) 作为初始状态,并逐步生成目标序列("Je t'aime"):
生成第一个单词
"Je"
:其中 是起始标记
<SOS>
。生成第二个单词
"t'"
:其中 是
"Je"
。生成第三个单词
"aime"
:其中 是
"t'"
。
最终,解码器输出 "Je t'aime"
,完成翻译。
4. 关键概念总结
输入单词的词向量(如 "I" → x_1
)
隐藏状态,编码器在每个时间步更新它
上下文向量,编码器的最后隐藏状态
解码器的隐藏状态
解码器的输出单词
5. 图示
Last updated