从代码层面理解Transformer

跑通

代码使用的是 https://github.com/jadore801120/attention-is-all-you-need-pytorch,

commit-id 为: 132907d

各模块粗览

Transformer

主要包括一堆参数,
以及encoder和decoder

在这里插入图片描述

forward的时候主要做了如下操作.

  1. 先 pad_mask
  2. 过encoder
  3. 过decoder
  4. 输出logit

在这里插入图片描述

从train.py 我们可以看出, 模型的输出直接去做了loss

在这里插入图片描述
这里的Loss就是cross_entropy.

然后每个encoder其实是一堆EncoderLayer的,每个decoder其实也是一堆DecoderLayer的, 所以先大致看一下.

Encoder

在这里插入图片描述
整体流程如下

  1. 输入 原始的src_seq, 得到word embeding, 叫做 enc_output
  2. 做position_encoder, 即位置编码.
  3. 做LayerNorm
  4. 过各个堆叠的encoder-layer, 每一个encoder-layer的输入都是上一层的输出.
  5. 返回最后一个encoder-layer的输出

什么是PositionEncoding

这个模块其实没有可以学习的参数. 这里的这个buffer的用法可以学习一下.
在这里插入图片描述
在这里插入图片描述
这里的这个实现还是挺简洁的. 一行就解决了.
在这里插入图片描述

Decocer

Decoder的结构和encoder的结构几乎一样,
在这里插入图片描述

但是要注意的是, Decnoder的输入.
在这里插入图片描述
在这里插入图片描述
也就是说, Decoder中的positionEncoding是对groundtruth做的.

这里我有一个疑问, 推理的时候, 没有trg_seq 的时候具体是怎么做的呢?

推理时细节

在这里插入图片描述
在这里插入图片描述

  1. 输入一个句子, 会先用encoder得到encoder_output.
  2. 同时会有 init_seq 传进decoder里面
    这里的init_seq 是

在这里插入图片描述

在这里插入图片描述
而 trg_box_idx 是一个常数. 即
在这里插入图片描述

  1. 然后从第2个词开始, 循环作为decoder模块的输入传进去.

在这里插入图片描述

各模块细节

EncoderLayer


如图每个EncoderLayer包括了, self-attention, 以及 positionFFN.

这里的self-attention是MultiHeadAttention.

MultiHeadAttention

看MultiHeadAttention的操作的话,主要是经历了以下主要的几个操作

在这里插入图片描述
把这个图画成下面这个样子来理解:

在这里插入图片描述

Attention

这里的Attention其实就是这个公式

在这里插入图片描述
代码里面叫做 ScaledDotProductionAttention

在这里插入图片描述

这里的temperature 是MultiHeadAttention的一个参数,
在这里插入图片描述

这里面需要注意的是, n_head这个参数,
在看知乎(https://zhuanlan.zhihu.com/p/48508221)上面的讲解时, 是这样的流程图
在这里插入图片描述
我理解其实是一样的, 一个是流程图解释,而一个是具体的实现方式.

PositionwiseFeedForward

在这里插入图片描述
也就是经过了两个全连接层, 然后过一个droupout, 过残差, 然后再过layer_norm

至此,整个encoder 其实就是两个模块, 一个是self-attention, 一个是FFN.
在这里插入图片描述
然后这里的self-attention,其实是Multi-Head-Attention.

DecoderLayer

decoder layer的模块其实和encoder的模块差不多,但是多了一个MultiHeadAttention, 这个叫encoder-decoder-attention.

在这里插入图片描述

forward的时候, 会把dec_input 分三份输入 self_attion模块中,

在这里插入图片描述

然后 encoder的output和上面的dec_output 作为encoder-decoder-attention的输入

在这里插入图片描述
最终返回 三个东西. 分别是

dec_output, dec_slf_attn, dec_enc_attn.

其它补充

mask在encoder里如何起作用的

我们先追溯被用在了哪里
首先是这样传入encoder的
在这里插入图片描述
又是这样被传入每个encoder-layer的
在这里插入图片描述
又是这样在每个encoder-layer被使用的.

即在MultiHeadAttention中是
在这里插入图片描述
最终确定是在这里被使用的

在这里插入图片描述
先来看一下 masked_fill如何使用, 它输入两个参数, 一个是mask, 一个是value,
也即是说, 在mask为1的那些地方, 把值改成value, 而mask为0的地方的值不改变.

即么上面的意思就是说在(mask0)的这些地方让attention的值变得非常地小, 而又经过了softmax之后, 也就是说这些mask0的地方的响应值为0. 或者说接近于0.
总结一句话就是, 传入的mask的作用. 会让其在值为mask=1的地方几乎不响应.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Transformer模型是一种用于机器翻译等任务的神经网络架构。它由encoders和decoders两部分组成,其中encoders和decoders都是由多个encoder/decoder堆叠而成。每个encoder包含self-attention和feed forward两个层,而每个decoder包含mask self-attention、encoder-decoder attention和feed forward三个层。这些层的组合形成了Transformer模型的总体结构。 在Transformer模型中,self-attention是一个重要的机制。它允许模型在处理输入序列时同时考虑序列中的所有位置。通过计算每个位置与其他位置的相关性,self-attention可以为每个位置生成一个权重向量,用来表示该位置对其他位置的重要性。这样,模型就可以根据不同位置的重要性来调整输入序列的表示。通过多层的self-attention操作,Transformer模型能够捕捉到序列中的长期依赖关系,从而提高翻译等任务的性能。 关于容易理解Transformer代码,你可以参考一些开源的实现。一个常用的开源项目是"transformers"库,它提供了多种预训练的Transformer模型以及相应的代码示例。你可以通过查阅该库的文档和示例代码来深入理解Transformer模型的实现细节。此外,还可以参考一些教程和博客文章,它们通常会提供更加详细和易于理解代码示例,帮助你更好地理解Transformer模型的工作原理。 请注意,为了更好地理解代码,建议你边阅读边实践,并结合注释来加深理解。同时,也可以参考一些论坛和社区,与其他开发者交流和讨论,以便更好地理解和应用Transformer模型。 参考文献: [引用1] [引用2] [引用3<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Transformer 代码+原理](https://blog.csdn.net/init__/article/details/121585137)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python Transformer模型笔记.md](https://download.csdn.net/download/weixin_52057528/88226096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值