赞
踩
[[seq2seq模型]]由两个主要部分组成:编码器Encoder和解码器Decoder
Encoder将输入序列转换为一个固定长度的向量,而Decoder将该向量生成输出序列
核心思想:将整个序列(输入)encode为一个向量,然后使用该向量来生成(decode)另一个序列(输出)
整体上来说,seq2seq是一种先降维后升维的方法
Encoder和Decoder通常使用循环神经网络RNN或变体,例如[[LSTM以及GRU模型]]
Encoder的输入是一次性全部输入的,而Decoder的输入是按照时间序列依次输入(Decoder上一轮的输出作为本轮的输入)
主要缺点
Transformer是seq2seq的升级,所以自然也是Encoder-Decoder架构。
Transformer模型详解
Add & Norm称为残差:残差网络可以更好地拟合分类函数,以获得更高的分类精度,在后文中有介绍,不妨先往下看看。
Decoder由n层Decoder Layer组成
每层Decoder Layer由三个字层组成
众所周知,神经网络的输入和输出都是向量,为了让语言模型能够被神经网络处理,我们必须把文本序列表达为向量的形式,这样才能被神经网络处理,所以Transformer中我们第一步就是要将输入信息embedding成向量。
由于Transformer的输入是文本序列,我们需要用下面的两个步骤对输入进行向量化(基于BPE的Tokenizer)
[[BERT模型]]的Tokenizer主要分为三个部分
Original BPE
Expanding the vocabulary using BPE
实质:找句子中重复最多的type-pair,放入vocab词典
上图中be,st重复最多,所以vocab词典更新为{b,e,d,t,r,s,w,st,be}
重复这个过程直到无type-pair可差
[[BERT模型]]采用的是BPE微变体WordPiece
WordPiece与BPE主要区别就在于它会为每个子词添加一个特殊的前缀(如’##‘)以便更好处理词汇表中未出现的单词,从而提高其泛化能力
例如,在使用WordPiece对文本进行编码时
- 一个不在词汇表中的单词’openhanded‘
- 可能会被拆分为多个子词
- 如’open‘,’##hand‘和’##ed‘
这样即使’openhanded‘不在词汇表中,BERT模型仍可以通过这些子词来理解和处理它
举个例子,假设有个单词’unstoppable‘
- 在BPE编码中,可能会被分解为’un‘,’st‘,’op‘,’able‘等子词
- 而在WordPiece编码中,可能会分解为’un‘,’##st‘,’##op‘和’##able‘
- 这样可以更好地区分不同子词在原单词中的位置
BPE具体操作步骤
BPE用途
由于Word Embedding层输出的向量维度是d_model维,那么Positional Encoding层的输出向量也需要是d_model维,具备相同维度才能将两个向量拼接在一起,提供给神经网络。
对于文本序列’我爱北京天安门‘,对其进行位置编码操作
- PE(pos, 2i)中PE代表位置编码函数,用于生成位置编码向量,pos代表当前文本在序列中的位置(绝对位置),2i代表位置编码向量中的序列下标,d_model代表位置向量的总长度(总维度)
- 每个位置的序列文本的位置编码向量都由sin和cos函数表达
- 位置向量需要表达文本在序列中的绝对位置和相对位置
P
E
(
p
o
s
,
2
i
)
=
s
i
n
(
p
o
s
1000
0
2
i
d
m
o
d
e
l
)
P
E
(
p
o
s
,
2
i
+
1
)
=
c
o
s
(
p
o
s
1000
0
2
i
d
m
o
d
e
l
)
变形金刚(Transformer) - 魔法学院小学弟Transformer中的Attention可以借鉴一下Arwin老师的博客,比我写的好多了。
RNN中的Self-Attention
Self-Attention中的QKV方法跟[[Attention机制]]中self-attention相同。
以单头注意力机制为例
输入的文本通过词嵌入和位置嵌入转化为向量X1,X2
使用三个可训练矩阵 W Q 、 W K 、 W V W_Q、W_K、W_V WQ、WK、WV 分别与X1、X2进行矩阵相乘,分别得到q1,q2,k1,k2,v1,v2,这里的q1,q2是指不同的X在同一Query下的映射,而不是指多头注意力中的多个Query
这里可以理解为Query(需要查询的特征),Key(当前的关键特征),Value(蕴含的信息)。可以理解为评价标准为Query,现有n个例子(n个key),对应的具体情况为m个value,注意力机制就是找到一个函数,去评估n个key中最符合query要求的例子。
在得到Xi的三个特征向量qi,kj,vj 后,开始计算注意力权重得分
使用 s c o r e = q i ∗ k j score = q_i*k_j score=qi∗kj ,即qi和kj向量的点乘作为得分结果,我们可以回顾一下点乘的公式 a ⃗ ∗ b ⃗ = ∣ a ⃗ ∣ ∗ ∣ b ⃗ ∣ ∗ c o s θ \vec{a}*\vec{b}=|\vec{a}|*|\vec{b}|*cos\theta a ∗b =∣a ∣∗∣b ∣∗cosθ ,其意义就是比较两个向量的相关程度,越相关(方向越接近),其得分值也就越大。
权重得分需要得到的是选定位置的文本与其他位置的文本的相关性得分,因此使用唯一的Query与多个Key的方式进行
将上一步计算得到的分数除以 d m o d e l \sqrt{d_{model}} dmodel ,这里参数并不是唯一的
由于Q和K的维度可能很大,因此需要将其除以 d k \sqrt{d_k} dk 来缩放。这有助于避免在softmax计算时出现梯度消失或梯度爆炸的问题,目的是为了在训练时获得更稳定的梯度
将结果传给Softmax函数进行归一化,得到更清晰的相关性得分
将Softmax得到的分数与特征向量 V t V_t Vt 进行相乘,得到 V t ′ V_t' Vt′ ,这里 V t V_t Vt 和Softmax分数相乘也就是所有词和主体词的加权求和。这会产生自注意层的输出,例如,词“Thinking”经过self-attention处理后的输出为 0.88 * v1 + 0.12 * v2 ,即当前这句话经过self-attention处理后,词“Thinking”的含义包含了88%的自身含义和12%的下一词"Machines"的含义,这样处理就体现了文本上下文的关系。当前这句话中的其他词也要做相同的处理。
对所有
V
t
′
V_t'
Vt′ 求和,对于唯一的Query得到Self-Attention层的输出Z
Z
=
∑
i
V
i
=
∑
i
s
o
f
t
m
a
x
(
Q
∗
K
i
T
d
k
)
⋅
V
i
Z=\sum_i V_i=\sum_isoftmax(\frac{Q*K_i^T}{\sqrt{d_k}})·V_i
Z=i∑Vi=i∑softmax(dk
Q∗KiT)⋅Vi
多头的计算方式和单头完全相同
使用多头可以帮助模型增加“表示子空间” 的能力
从单头注意力转换到多头注意力:原先单头注意力机制的Q权重矩阵 W Q n \frac{W_Q} n nWQ ,头数为n,在不同头数(Query)下进行计算,即转换为多头注意力机制。
头数是一个超参,最后将不同维度的结果进行综合考虑。
每个Encoder/Decoder的子层内部都会接上两个残差链接,通过对Self-Attention的输出和输入layer Normalize生成结果
Z
t
Z_t
Zt 。残差连接可以帮助梯度的反向传播,让模型更快更好的收敛。层归一化用于稳定网络,减轻深度学习模型数值传递不稳定的问题。
resnet中的残差连接
具体操作:
1. 对输入进行一次线性变换,并加入bias1
2. 对step1的结果进行Relu激活
3. 对step2的结果进行第二次线性变化,并加入bias2
F
F
N
N
(
x
)
=
W
2
R
e
l
u
(
W
1
x
+
b
1
)
+
b
2
=
m
a
x
(
0
,
W
1
x
+
b
1
)
W
2
+
b
2
FFNN(x)=W_2Relu(W_1x+b_1)+b_2=max(0,W_1x+b_1)W_2+b_2
FFNN(x)=W2Relu(W1x+b1)+b2=max(0,W1x+b1)W2+b2
前馈网络本质上就是几层神经网络层,中间有 ReLU 激活,两层之间也有残差链接。Transformer 中的 FNN(Feed-Forward Neural Network)是一个MLP,它在自注意力机制之后对序列中的每个向量单独应用。FNN 起到两个主要作用:
引入非线性:虽然自注意力机制能捕捉序列中不同位置的向量之间的依赖关系,但它本质上是线性的。通过引入 FNN 层,Transformer 可以学习到输入序列的非线性表示,这有助于模型捕捉更复杂的模式和结构。
局部特征整合:FNN 层是一个MLP,对序列中每个位置的向量独立作用。这意味着它可以学习到局部特征并整合这些特征,以形成更丰富的特征表示。这种局部特征整合与自注意力机制中的全局依赖关系形成互补,有助于提高模型性能。换句话说,自注意力机制学习的是向量之间的关系,而FNN学习的是每个向量本身更好的特征表示。
MLP 多层感知机
神经网络1:多层感知器-MLP - 知乎 (zhihu.com)
Encoder-Decoder内部的那些结构self-attention,attention mask这些在Attention中已经具体介绍了,所以其实Encoder-Decoder Layer也介绍的差不多了。
文本序列转化为文本向量
文本向量经过Encoder提取特征生成输出向量
输出向量提供给decoder
确保decoder生成序列过程中参考输入的文本序列信息
decoder的输入总start sign开始
decoder的输出到end sign结束
过程中,decoder每一轮输出都会作为下一轮decoder的输入
编码器和解码器结构:Transformer 模型由编码器(Encoder)和解码器(Decoder)组成,它们都包含多层(通常为 6 层或 12 层)。编码器负责对输入序列进行特征提取,解码器则利用编码器的输出逐步生成输出序列。
自注意力(Self-attention)机制:自注意力机制是 Transformer 的核心组成部分。通过计算输入序列中每个元素与其他元素的关系,自注意力机制可以捕捉长距离依赖关系。自注意力计算涉及 Query(查询)、Key(键)和 Value(值)的概念。
多头注意力(Multi-head Attention):Transformer 使用多头注意力结构,允许模型同时关注输入序列中的不同位置的信息。多头注意力可以捕捉更丰富的语义信息和不同的依赖关系。
位置编码(Positional Encoding):由于自注意力机制是一种全局操作,Transformer 模型无法捕捉输入序列中的顺序信息。为解决这个问题,Transformer 引入了位置编码,将位置信息添加到输入向量中。
层归一化(Layer Normalization)和残差连接(Residual Connection):为了提高模型的训练稳定性和收敛速度,Transformer 使用了层归一化和残差连接。这些结构有助于处理梯度消失和梯度爆炸问题。
前馈神经网络(Feed-Forward Neural Network, FFNN):在自注意力机制之后,Transformer 的每层还包含一个前馈神经网络。这个小型网络包含两个线性层和一个激活函数(如 ReLU 或 GELU)。
掩码机制(Masking):Transformer 使用填充掩码(Padding Mask)忽略填充符号的影响,使用序列掩码(Sequence Mask)确保解码器在生成过程中遵循自回归原则。
最后,Transformer算法的核心是多头自注意力机制。在之后的模型研究中被广泛使用。此外,我们常说的Transformer Block其实指的是以下结构:
[
它可以被看作一个特征提取器,其主要目的是对输入信息的各个部分通过注意力机制进行相对整体的重要程度的重分配。
总之,Transformer 模型是一种具有自注意力机制、多头注意力结构和位置编码的深度学习模型,适用于处理序列数据。它的编码器-解码器结构、掩码机制、层归一化和残差连接等特点使得模型在自然语言处理任务中表现出色。自 Transformer 模型问世以来,它已经成为了许多先进模型(如 BERT、GPT、ChatCPT 等)的基础,并在各种 NLP 任务中取得了显著的成功。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。