2. Transformer基础学习--encoder模块

本文详细介绍了Transformer模型中的encoder模块,包括多头自注意力、残差连接、层归一化和位置-wisefeed-forwardnetworks的作用,展示了如何通过这些组件提取句子特征并理解语义和句法。
摘要由CSDN通过智能技术生成

encoder模块

          本篇主要介绍transformer中的encoder模块。简单来说,encoder是将输入的句子的特征提取出来,让我们来看看,它具体是如何实现的。

        下图左边的模块,就是encoder模块,可以直观的看到,先是multi-head attention,然后经过一个add&norm, 再通过feed forward和add&norm,得到这个decoder的输出。下面将对各个模块进行讲解。

1. 多头自注意力 multi-head Attention

        我们首先回顾一下 自注意力 ,在上篇我们讲过自注意力的基本思路,就是给定一个句子 x,通过学习每个单词,跟这个句子中其他单词的关系,得到对这个单词新的理解 z。上篇讲的是自注意力,在decoder部分,我们还会讲 交叉注意力

        简单来说,通过 attention 模块,使得 X --> Z。Z是包括了语义和句法信息的X。

        那么,多头自注意力是在做什么呢?“一千个人读哈姆雷特,就有一千个哈姆雷特”。一个attention模块,学习到一种对x的理解。那么多个attention就能从不同的角度,去理解x。最后再将他们所有人学习到的理解,都合起来,成为最终对x的理解z。

        那么具体的流程是怎样的呢?

        (1)首先,单词经过embeding层得到x,它的维度是512, 即 d_{model}=512。(这个维度跟具体embeding的方法有关,先知道得到的维度是512就行)

        (2)一般来说,多头自注意力的数量,h=8。(你想用其他的也可以)先将得到的x,拆分成8份,x^{'},分别送给每个attention去学习。于是,每个attention里 q, k, v 的维度变成:

d_{k} = d_{v} = d_{model} / h = 512 / 8 = 64

        (3)拆分后的x^{' },经过8个attention进行学习后,得到8个结果z^{'}

        (4)但是我们最终需要的还是z,维度上应该跟x,保持一致。所以需要先将8个z^{'}拼接concat起来,再矩阵变换W^{o},使得z维度跟原来的x一样。就得到了最终的结果z

        值得注意的是,拆分维度计算8个attention的计算量 跟 不拆维度计算一个attention的计算量 很接近。但是拆分8个head去计算肯定比只总体算一个学到的东西更细节啊,而且还不消耗更多的资源,所以采用多头的方法是很合理的。

2. 残差连接和层归一化

残差连接(a residual connection)

        残差连接是用于缓解 梯度消失问题。比如,对于y=wx+b。在训练过程中,w的值变得越来越小,在计算梯度的时候,就会发现梯度也变得很小,到最后可能就没有什么变化,就没有在学习到东西。所以,为了避免这个问题,在经过一系列layer后,我们把原来的x再拿过来。这样即便w变得很小,我们还有原来的x的梯度存在,就不容易导致梯度消失。 

        做法也很简单,就是F(x) + x。直接把x加过来就行。     

层归一化(layer normalization)

        层归一化主要是用于缓解 梯度爆炸问题。在计算过程中,得到的数值,可能是极大的如1000000,而其他值是1,0.1,这种乱七八糟的情况,这种很不方便计算,而且对train的负面影响也很大。那么我们通过归一化的手段,把数据都分布在一个合理的区间范围内,比如,都在0附近。这样就会好计算的多。

        参考下面的例子,在x经过一层计算后得到x^{'}。将得到的x^{'},通过归一化操作,将数值规范到合理的范围内,再进入到下一层y去计算。

        具体计算如下,H 表示层的隐藏单元数,a_i^l 代表第 l 层中的第 i 个神经元。归一化的方式就是减去均值,除以方差。可以看上图的 y= 公式中的方括号。

3. Position-wise Feed-Forward Networks 

        它其实就是两个线性层,中间加个激活函数。

        那为什么要有它呢?是因为ffn和attention承担着不同的任务。

        attention:通过q,k,v机制,可以学习到全局的上下文信息。自注意力机制主要用于捕捉全局上下文信息,更加关注于总体

        FFN: 两层全连接神经网络,中间加入激活函数如ReLU,增加模型的表达能力。在自注意力提供的上下文基础上,对局部特征进行进一步学习

        通过attention和ffn,模型将能学习到句子的全局局部特征,进一步增强表达特征的能力。

4. encoder

        最终,将上述的几个模块结合起来,得到一个完整的encoder模块。将输入的只是代表单词的x,通过attention和ffn,进行学习,得到能够理解语义、句法等信息的 z。

        结语:这一篇,主要介绍encoder和其基础模块,以及各个模块的作用。下一篇,将会介绍decoder的基本模块。有任何问题,欢迎随时交流~

  • 38
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值