当前位置:   article > 正文

Transformer 模型详解_transformer模型,记一次字节跳动Linux运维社招面试_其由两个线性变换组成,即两个全连接层组成,第一个全连接层的激活函数为 relu 激活

其由两个线性变换组成,即两个全连接层组成,第一个全连接层的激活函数为 relu 激活

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

k

1

\boldsymbol{k_1}

k1​ 的点积,第二个分数是

q

1

\boldsymbol{q_1}

q1​ 和

k

2

\boldsymbol{k_2}

k2​ 的点积。

图 1.13

第 3 步:将每个分数除以

d

k

\sqrt{d_{k}}

dk​

​(

d

k

d_{k}

dk​ 是 Key 向量的维度)。目的是在反向传播时,求梯度更加稳定。实际上,你也可以除以其他数。

第 4 步:将这些分数进行 Softmax 操作。Softmax 将分数进行归一化处理,使得它们都为正数并且和为 1。

图 1.14

这些 Softmax 分数决定了在编码当前位置的词时,对所有位置的词分别有多少的注意力。很明显,当前位置的词汇有最高的分数,但有时注意一下与当前位置的词相关的词是很有用的。

第 5 步:将每个 Softmax 分数分别与每个 Value 向量相乘。这种做法背后的直觉理解是:对于分数高的位置,相乘后的值就越大,我们把更多的注意力放在它们身上;对于分数低的位置,相乘后的值就越小,这些位置的词可能是相关性不大,我们就可以忽略这些位置的词。

第 6 步:将加权 Value 向量(即上一步求得的向量)求和。这样就得到了自注意力层在这个位置的输出。

图 1.15

这样就完成了自注意力的计算。生成的向量会输入到前馈网络中。但是在实际实现中,此计算是以矩阵形式进行,以便实现更快的处理速度。下面我们来看看如何使用矩阵计算。

1.3.4 使用矩阵计算 Self-Attention

第 1 步:计算 Query,Key 和 Value 矩阵。首先,将所有词向量放到一个矩阵

X

\boldsymbol{X}

X 中,然后分别和 3 个我们训练过的权重矩阵(

W

Q

\boldsymbol{W^Q}

WQ,

W

k

\boldsymbol{W^k}

Wk 和

W

V

\boldsymbol{W^V}

WV) 相乘,得到

Q

\mathbf{Q}

Q,

K

\boldsymbol{K}

K 和

V

\boldsymbol{V}

V 矩阵。

图 1.16 矩阵 X 中的每一行,表示输入句子中的每一个词的词向量(长度为 512,在图中为 4 个方框)。矩阵 Q,K 和 V 中的每一行,分别表示 Query 向量,Key 向量和 Value 向量(它们的长度都为 64,在图中为 3 个方框)。

第 2 步:计算自注意力。由于这里使用了矩阵进行计算,可以将前面的第 2 步到第 6 步压缩为一步。

图 1.17 矩阵形式的自注意力计算

1.4 多头注意力机制(Multi-head Attention)

在 Transformer 论文中,通过添加一种多头注意力机制,进一步完善了自注意力层。具体做法:首先,通过

h

h

h 个不同的线性变换对 Query、Key 和 Value 进行映射;然后,将不同的 Attention 拼接起来;最后,再进行一次线性变换。基本结构如图 1.18 所示:

图 1.18

每一组注意力用于将输入映射到不同的子表示空间,这使得模型可以在不同子表示空间中关注不同的位置。整个计算过程可表示为:

M

u

l

t

i

H

e

a

d

(

Q

,

K

,

V

)

=

C

o

n

c

a

t

(

h

e

a

d

1

,

,

h

e

a

d

h

)

W

O

h

e

a

d

i

=

A

t

t

e

n

t

i

o

n

(

Q

W

i

Q

,

K

W

i

K

,

V

W

i

V

)

MultiHead(Q,K,V) = Concat(head_1,\cdots,head_h)\boldsymbol{W}^O \ head_i = Attention(Q\boldsymbol{W}_iQ,K\boldsymbol{W}_iK,V\boldsymbol{W}_i^V)

MultiHead(Q,K,V)=Concat(head1​,⋯,headh​)WOheadi​=Attention(QWiQ​,KWiK​,VWiV​)
其中,

W

i

Q

R

d

m

o

d

e

l

×

d

k

\boldsymbol{W}_i^Q \in \mathbb{R}^{d_{model} \times d_k}

WiQ​∈Rdmodel​×dk​,

W

i

K

R

d

m

o

d

e

l

×

d

k

\boldsymbol{W}_i^K \in \mathbb{R}^{d_{model} \times d_k}

WiK​∈Rdmodel​×dk​,

W

i

V

R

d

m

o

d

e

l

×

d

v

\boldsymbol{W}_i^V \in \mathbb{R}^{d_{model} \times d_v}

WiV​∈Rdmodel​×dv​ 和

W

O

R

h

d

v

×

d

m

o

d

e

l

\boldsymbol{W}^O \in \mathbb{R}^{hd_v \times d_{model}}

WO∈Rhdv​×dmodel​。在论文中,指定

h

=

8

h=8

h=8(即使用 8 个注意力头)和

d

k

=

d

v

=

d

m

o

d

e

l

/

h

=

64

d_k = d_v = d_{model}/h = 64

dk​=dv​=dmodel​/h=64。

在多头注意力下,我们为每组注意力单独维护不同的 Query、Key 和 Value 权重矩阵,从而得到不同的 Query、Key 和 Value 矩阵。如前所述,我们将

X

\boldsymbol{X}

X 乘以

W

Q

\boldsymbol{W}^Q

WQ、

W

K

\boldsymbol{W}^K

WK 和

W

V

\boldsymbol{W}^V

WV 矩阵,得到 Query、Key 和 Value 矩阵。

图 1.19

按照上面的方法,使用不同的权重矩阵进行 8 次自注意力计算,就可以得到 8 个不同的

Z

\boldsymbol{Z}

Z 矩阵。

图 1.20

接下来就有点麻烦了。因为前馈神经网络层接收的是 1 个矩阵(每个词的词向量),而不是上面的 8 个矩阵。因此,我们需要一种方法将这 8 个矩阵整合为一个矩阵。具体方法如下:

  1. 把 8 个矩阵

{

Z

0

,

Z

1

,

,

Z

7

}

{\boldsymbol{Z_0},\boldsymbol{Z_1},\cdots,\boldsymbol{Z_7}}

{Z0​,Z1​,⋯,Z7​} 拼接起来。
2. 把拼接后的矩阵和一个权重矩阵

W

O

\boldsymbol{W^O}

WO 相乘。
3. 得到最终的矩阵

Z

\boldsymbol{Z}

Z,这个矩阵包含了所有注意力头的信息。这个矩阵会输入到 FFN 层。

图 1.21

这差不多就是多头注意力的全部内容了。下面将所有内容放到一张图中,以便我们可以统一查看。

图 1.22

现在让我们重新回顾一下前面的例子,看看在对示例句中的“it”进行编码时,不同的注意力头关注的位置分别在哪:

图 1.23

当我们对“it”进行编码时,一个注意力头关注“The animal”,另一个注意力头关注“tired”。从某种意义上来说,模型对“it”的表示,融入了“animal”和“tired”的部分表达。

Multi-head Attention 的本质是,在参数总量保持不变的情况下,将同样的 Query,Key,Value 映射到原来的高维空间的不同子空间中进行 Attention 的计算,在最后一步再合并不同子空间中的 Attention 信息。这样降低了计算每个 head 的 Attention 时每个向量的维度,在某种意义上防止了过拟合;由于 Attention 在不同子空间中有不同的分布,Multi-head Attention 实际上是寻找了序列之间不同角度的关联关系,并在最后拼接这一步骤中,将不同子空间中捕获到的关联关系再综合起来。

1.5 位置前馈网络(Position-wise Feed-Forward Networks)

位置前馈网络就是一个全连接前馈网络,每个位置的词都单独经过这个完全相同的前馈神经网络。其由两个线性变换组成,即两个全连接层组成,第一个全连接层的激活函数为 ReLU 激活函数。可以表示为:

F

F

N

(

x

)

=

max

(

0

,

x

W

1

b

1

)

W

2

b

2

FFN(x) = \max(0, xW_1 + b_1)W_2 + b_2

FFN(x)=max(0,xW1​+b1​)W2​+b2​

在每个编码器和解码器中,虽然这个全连接前馈网络结构相同,但是不共享参数。整个前馈网络的输入和输出维度都是

d

m

o

d

e

l

=

512

d_{model}=512

dmodel​=512,第一个全连接层的输出和第二个全连接层的输入维度为

d

f

f

=

2048

d_{ff}=2048

dff​=2048。

1.6 残差连接和层归一化

编码器结构中有一个需要注意的细节:每个编码器的每个子层(Self-Attention 层和 FFN 层)都有一个残差连接,再执行一个层标准化操作,整个计算过程可以表示为:

s

u

b

_

l

a

y

e

r

_

o

u

t

p

u

t

=

L

a

y

e

r

N

o

r

m

(

x

S

u

b

L

a

y

e

r

(

x

)

)

sub\_layer\_output = LayerNorm(x + SubLayer(x))

sub_layer_output=LayerNorm(x+SubLayer(x))

图 1.24

将向量和自注意力层的层标准化操作可视化,如下图所示:

图 1.25

上面的操作也适用于解码器的子层。假设一个 Transformer 是由 2 层编码器和 2 层解码器组成,其如下图所示:

图 1.26

为了方便进行残差连接,编码器和解码器中的所有子层和嵌入层的输出维度需要保持一致,在 Transformer 论文中

d

m

o

d

e

l

=

512

d_{model} = 512

dmodel​=512。

1.7 位置编码

到目前为止,我们所描述的模型中缺少一个东西:表示序列中词顺序的方法。为了解决这个问题,Transformer 模型为每个输入的词嵌入向量添加一个向量。这些向量遵循模型学习的特定模式,有助于模型确定每个词的位置,或序列中不同词之间的距离。

图 1.27

如果我们假设词嵌入向量的维度是 4,那么实际的位置编码如下:

图 1.28

那么位置编码向量到底遵循什么模式?其具体的数学公式如下:

P

E

(

p

o

s

,

2

i

)

=

sin

(

p

o

s

/

1000

0

2

i

/

d

m

o

d

e

l

)

PE_{(pos, 2i)} = \sin (pos / 10000^{2i/d_{model}})

PE(pos,2i)​=sin(pos/100002i/dmodel​)

P

E

(

p

o

s

,

2

i

1

)

=

cos

(

p

o

s

/

1000

0

2

i

/

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

/

d

m

o

d

e

l

)

PE_{(pos, 2i)} = \sin (pos / 10000^{2i/d_{model}})

PE(pos,2i)​=sin(pos/100002i/dmodel​)

P

E

(

p

o

s

,

2

i

1

)

=

cos

(

p

o

s

/

1000

0

2

i

/

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
[外链图片转存中…(img-sq7geCKL-1713179494246)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/490276
推荐阅读
相关标签
  

闽ICP备14008679号