Transformer编码器和解码器训练和预测流程

1.训练流程

 比如我们想做一个中译英的机器翻译任务,现在我们已经准备好了数据集,例如{‘chinese’:我爱吃梨,‘english’: i love eating pears} ,那么模型的输入和输出以及标签分别是什么呢?
首先我们会先根据数据集创建中文词表和英文词表,假如数据集中只有{‘chinese’:我爱吃梨,‘english’: i love eating pears} 这一条样本,那么中文词表为{‘我’:0,‘爱’:1,‘吃’:2,‘梨’:3},英文词表为{‘PAD’:0,‘BOS’:1,‘EOS’:2,‘i’:3,‘love’:4,‘eating’:5,‘pears’:6}。为什么英文词表中还多了一些特殊字符呢?首先’PAD’字符是填充的意思,在进行输入的时候为了保持一个batch中的句子长度一样,会将句子填充到一样的长度,所以如果句子的长度过短,会在其后面增加填充符。’BOS‘字符是开始符号,解码器的输入中的第一个字符便是’BOS’字符;’EOS‘字符为结束字符。
创建好此表后,我们根据词表将中英文输入映射成数字。如下所示:

使用encoder编码“我爱吃梨”是一次性把四个字全部输入encoder的,在这里不使用掩码来屏蔽后续词,encoder一次性并行处理整个输入序列,生成一组富含上下文信息的表示(通常称为记忆上下文向量)。

这组向量(和输入句子的词数相同),后续将会用于decoder的第二个注意力中,encoder只编码一次。

可以看到,编码器的输入是一整个句子,解码器的输入和输出也是完整的一个句子,最后根据解码器输出的句子去和标签去算loss。因此transformer在训练的时候是并行的。
在decoder中,第一次输入‘BOS’作为q,整个句子作为k和v,但是为了避免使用后续文章的信息,所以使用掩码机制‘BOS’把后面的屏蔽掉,第一次输出‘i’。

第二次输入‘i’作为q,整个句子作为k和v,但是为了避免使用后续文章的信息,所以使用掩码机制把‘i’后面的词屏蔽掉,第二次输出‘love’

第三次输入‘love’作为q,整个句子作为k和v,但是为了避免使用后续文章的信息,所以使用掩码机制把‘love’后面的词屏蔽掉,第三次输出‘eatting’

后续同理。

由于一次训练只更新一次参数,所以在一轮训练的多次输出可以并行执行,提升了训练速度。

2.预测流程

预测过程的详细步骤

阶段一:Encoder处理输入(一次性完成)

  1. 输入处理:将源语言句子 "I love you" 进行Tokenize和位置编码。
  2. 前向传播:这个序列被送入Encoder。Encoder通过自注意力机制和前馈网络进行处理。
  3. 输出:Encoder输出一组高维向量(EncoderOutput),这组向量可以看作是源句子的一个深度、上下文相关的“表示”或“记忆”。这个 EncoderOutput 将在解码的每一步都被使用。

至此,Encoder的工作就结束了。


阶段二:Decoder自回归生成(循环进行)

现在,Decoder开始工作,生成目标语言(中文)的序列。初始输入通常只有一个开始符 <sos>

第1个循环:生成第一个词

  1. Decoder初始输入<sos> (一个Token)
  2. Decoder自注意力:Decoder对当前输入 <sos> 进行** masked self-attention**(掩码自注意力)。掩码确保每个位置只能关注它之前的位置(包括自己)。由于目前只有一个Token,它只能关注自己。
  3. Encoder-Decoder注意力:这是关键一步!Decoder利用上一步输出的表示作为 Query,去交叉注意力Encoder最终输出的 EncoderOutput(作为 Key 和 Value)。这可以理解为Decoder在问:“基于我当前生成的状态(<sos>),我应该从源句子(‘I love you’)的哪个部分汲取信息来生成下一个词?”
  4. 前馈网络与输出:经过交叉注意力和前馈网络后,Decoder输出一个向量,对应 <sos> 位置。
  5. 预测分布:将这个输出向量通过线性层和Softmax,得到整个中文字汇表上的概率分布。
  6. 选择Token:通过某种策略(如束搜索),从分布中选择概率最高的词。假设我们选择了 “我”
  7. 更新输入:将“我”追加到Decoder的输入中,现在输入变为:<sos> 我

第2个循环:生成第二个词

  1. Decoder新输入<sos> 我
  2. Decoder自注意力(掩码):模型处理这个序列。在计算“我”这个位置的表示时,它只能关注 <sos> 和 “我” 自己,不能看到未来的词。
  3. Encoder-Decoder注意力:再次进行!Decoder用“我”的表示作为Query,去查询 EncoderOutput,思考:“基于我已经生成了‘我’,现在应该从源句子的哪里找信息来生成下一个词?”
  4. 预测与选择:得到输出分布,选择下一个词。假设选择了 “爱”
  5. 更新输入:输入序列变为:<sos> 我 爱

第3个循环:生成第三个词

  1. Decoder新输入<sos> 我 爱
  2. 重复过程:同样经过掩码自注意力、交叉注意力和前馈网络。
  3. 预测与选择:从分布中选择下一个词。假设选择了 “你”
  4. 更新输入:输入序列变为:<sos> 我 爱 你

第4个循环:生成结束符

  1. Decoder新输入<sos> 我 爱 你
  2. 重复过程:模型可能预测到句子已经完整,于是从分布中选择结束符 <eos>
  3. 停止:生成结束符,预测过程终止。

最终输出序列为:我 爱 你


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇