赞
踩
最近在学习Bert,从Transformer开始补基础,写点笔记做记录。因为是初涉及,内容未必准确,仅供参考学习,欢迎一起讨论。(图来源为论文或其他文章,都放在参考资料里了)
Transformer模型以其革命性的设计和优越的性能,彻底改变了序列到序列(Sequence-to-Sequence)任务的处理方式,成为自然语言处理领域的经典之作。
Transformer模型的最大特点之一是其完全基于注意力机制,摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN)结构。通过多头自注意力机制和前馈神经网络层的组合,Transformer实现了更加高效、灵活和并行化的序列处理能力。这种结构的设计使得Transformer在翻译、语言建模等任务中取得了优异的性能表现,同时大大缩短了训练时间,提高了模型的可解释性和泛化能力。
即将一个文本序列作为输入,并产生另一个文本序列作为输出。例如机器翻译,将一个输入的英语句子翻译成西班牙语。
论文:《Attention Is All You Need》
https://arxiv.org/abs/1706.03762https://arxiv.org/abs/1706.03762
按照模型顺序来梳理可能更好理解一点,数据在输入Encoder之前要经过词嵌入层和位置编码层。
词嵌入(Word Embeddings)是将输入的每个单词转换为一个固定维度的向量。在Transformer中,通常使用的是预训练的词嵌入方法,如Word2Vec、GloVe或通过训练数据生成的嵌入矩阵。
转换单词为向量:每个输入单词会被映射到一个维度为 的向量,这个向量表示了该单词在语义空间中的位置。对于Transformer模型,通常选择
。
共享嵌入矩阵:在Transformer模型中,编码器和解码器会共享相同的嵌入矩阵,这不仅减少了参数的数量,还使得模型能够在编码器和解码器之间共享表示。
由于Transformer模型不使用循环神经网络或卷积神经网络,所以缺乏对序列中单词位置的固有了解。为了弥补这一点,Transformer引入了位置编码(Positional Encoding),它提供了关于输入序列中每个单词相对或绝对位置的信息。
固定位置编码:Transformer使用了一种基于正弦和余弦函数的固定位置编码。具体公式如下:
其中,pos是位置,i 是维度的索引。这样每个位置的编码都是一个 维的向量,且每个维度的编码值都是一个正弦或余弦函数。
意义:位置编码的设计使得模型能够在不学习新的参数的情况下捕捉到序列的位置信息。通过这种方式,不同位置的单词能够获得不同的编码,从而使得模型能够区分相同单词在不同位置的不同语义。
位置编码被直接加到词嵌入上,形成了带有位置信息的词向量。这种方法简单而有效,能够帮助模型在不引入复杂计算的情况下捕捉序列的位置信息。
通过词嵌入和位置编码的结合,Transformer模型能够有效地表示输入序列中单词的语义和位置信息,从而在后续的自注意力机制中进行更加准确和有意义的计算。
注意力机制是核心组件,用于在序列中捕捉单词之间的依赖关系。通过这种机制,模型可以关注序列中不同位置的单词,并根据其相关性进行加权计算。注意力机制主要包括生成查询(Query)、键(Key)和值(Value)矩阵,并通过这些矩阵进行计算。
查询(Query, Q):
键(Key, K):
值(Value, V):
Query, Key, Value 实际上是三个独立的线性层。每个线性层都有自己独立的权重。输入数据与三个线性层分别相乘,产生 Q、K、V。
过程分为这几个步骤:
具体公式:
贴个论文原图:
先通过向量视角来看矩阵:
再看 Q 和 K转置 之间的矩阵乘法(即点积),产生的矩阵叫 “因子矩阵”:
当然图里没画出除 根号d 和 Softmax 的过程,不过不影响理解,再看乘V:
因子矩阵是该特定单词的 Q值 与所有单词的 K值 的点积,V矩阵是每个词的编码值,两者相乘就相当于把相似相进行了二次验证和放大。
个人感觉像:该单词的 相似性得分 × 编码值得分 = 注意力得分。
多头注意力机制是对上述注意力机制的扩展,通过引入多个头部来捕捉不同子空间的信息,同时也更便于进行并行计算。
1. 将查询、键和值矩阵通过不同的线性变换投影到低维空间,生成 h个头部的 。
每个的长度为
。
即直接进行切割,但是有文章中提到:切分 只是逻辑上的切分,所有注意力头共用线性层,只是分别在其逻辑部分上进行操作。
2. 对于每个头 i,计算注意力输出:
其中,生成一个形状为
的注意力得分矩阵,通过 softmax 进行归一化,然后与
相乘。
3. 将所有头的输出拼接起来:
其中,,拼接后形状为
,然后通过一个线性变换矩阵
(形状为
) 进行变换,得到最终的多头注意力输出。
贴个论文原图:
在每个Transformer编码器层中,前馈神经网络(FFN)是一个关键组成部分。它是一个逐点(point-wise)的全连接网络,即它独立地作用于每个位置的表示向量。
FFN通常包含两层全连接网络,并使用激活函数进行非线性变换。具体来说,对于输入向量 x,前馈神经网络的计算步骤:
1. 线性变换和激活函数:
其中, 是第一个线性变换的权重矩阵,
是偏置,ReLU 是激活函数。
这里注意,中间的内部层维度 ,即
的维度是
。这种设计的目的是增加模型的非线性能力,使得模型可以在高维空间中进行复杂的变换和学习,从而更好地捕捉输入数据中的复杂模式。
2. 第二次线性变换:
其中, 是第二个线性变换的权重矩阵,
是偏置。
的维度是
残差连接(Residual Connection)是一种技巧,用于防止深层神经网络训练过程中出现梯度消失的问题。其基本思想是将输入直接与某一层的输出相加,从而形成一个“捷径”路径。这可以帮助模型更容易地学习到恒等映射,从而缓解深层网络中的梯度消失问题。
其中:
这个公式表示将输入 和子层的输出
相加,然后对结果进行层规范化处理。
经过前面的铺垫,这里对编码器部分的结构进行介绍。
先贴论文原图:
在Transformer架构中,编码器中的层是串行连接的。也就是说,每一层的输出作为下一层的输入。这种层次结构使得信息在层与层之间逐步传递和处理。
每个编码器层中的两个子层的详细步骤如下:
单个编码器层(第 i 层)
子层1:多头自注意力机制:
子层2:前馈神经网络:
多个层之间的连接
编码器层的结构如上所述,每一层的输出作为下一层的输入,从而形成串行连接,论文中这里的。
这种层与层之间的串行连接确保了输入序列中的信息在多个层次上被处理和整合,从而获得更丰富和抽象的表示。通过残差连接和层规范化,模型在训练过程中能够更有效地传递梯度,避免梯度消失问题。
解码器的结构和编码器类似,但具有一些关键区别,特别是在处理顺序信息和生成输出方面。
解码器的输入结构和处理过程确实是稍微复杂一些。解码器的输入分为两个部分:编码器的输出和已经生成的部分输出。
Shifted Right Outputs (偏移输出):
<start>
)。Output Embedding (输出嵌入):
为什么不直接使用编码器的输出来输入?
编码器-解码器架构的设计目的是将输入序列编码成一个固定长度的表示(通过编码器),然后解码器根据这个表示和已经生成的部分输出,逐步生成目标序列。因此,解码器需要同时利用编码器的输出(即输入序列的编码表示)和已经生成的部分输出。
Masked Multi-Head Attention 是解码器中的第一个子层,它的设计目的是在自回归生成过程中,确保当前位置的预测只依赖于之前的位置,而不能看到未来的位置。这种设计在训练和推理过程中都非常重要。
在解码器中,我们需要确保在位置 生成的输出只能依赖于位置小于
的信息,而不能看到位置
之后的词。这是通过在计算注意力权重时引入一个掩码 (mask) 来实现的。
贴个论文原图:
总结来说,解码器的特殊之处在于它的结构设计和掩码机制,确保在生成序列时只能基于已知信息进行预测,从而保证输出的正确性和连贯性。
BERT是一个新型的语言表示模型,全称是 双向编码器表示的转换器(Bidirectional Encoder Representations from Transformers)。
与之前的单向或浅层表示模型相比,BERT的 双向性和深度 使其能够更好地捕捉语言的复杂性。预训练完成后,BERT可以通过添加一个额外的输出层并进行微调,适应多种NLP任务,如问答和语言推理,而无需进行大量特定任务的架构修改。
论文是《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
https://arxiv.org/abs/1810.04805https://arxiv.org/abs/1810.04805
BERT的输入表示由三个部分的嵌入向量相加而成:标记嵌入(Token Embeddings)、段落嵌入(Segment Embeddings)和位置嵌入(Position Embeddings)。
标记嵌入和位置嵌入部分和 Transformer相同,不过据说:BERT使用 WordPiece 嵌入,这是一种子词级别的嵌入方法,可以有效处理未登录词(OOV,Out-of-Vocabulary)和减少词汇表大小。
段落嵌入:
段落嵌入用于区分输入文本中的不同句子,BERT能够处理单句和句对输入。
[CLS]
和 [SEP]
标记[CLS]
:这是一个特殊的分类标记,放在输入序列的最前面。对于分类任务,模型会使用这个标记对应的输出表示来进行分类。[SEP]
:这是一个分隔标记,用于区分两个句子。对于单句输入,在句子末尾添加一个[SEP]
标记。对于句对输入,在两个句子之间和第二个句子末尾分别添加一个[SEP]
标记。这里为了方便理解,举一个句对输入的例子(如问答任务)的例子:
假设输入的句对为:"问题:这本书的作者是谁?" 和 "这本书是由张三写的。"
输入序列为:[CLS] 这 本 书 的 作者 是 谁 [SEP] 这 本 书 是 由 张三 写 的 [SEP]
最终输入表示为这三者的逐元素相加。
这里贴一下论文原图:
BERT通过MLM预训练任务实现双向性,即在所有层中同时考虑了左侧和右侧的上下文。这样的双向编码使得BERT能够在理解句子时拥有更丰富的语义信息。
标准Transformer(如GPT)是单向的,模型在预测一个标记时只能利用左侧的上下文。这种单向性适用于生成任务,但在需要全面理解上下文的任务中不如双向模型有效。
BERT模型的输出层设计允许它适应各种下游任务。通过在预训练的BERT模型之上添加不同的输出层,BERT能够适应不同类型的自然语言处理任务。
1. 句子分类任务
例如情感分析、文档分类等任务,需要对整个句子或文本进行分类。
在这种任务中,使用特殊标记 [CLS]
对应的最终隐藏状态作为整个输入序列的表示。该表示被输入到一个全连接层,随后通过Softmax或其他适当的激活函数得到分类结果
2. 句子对分类任务
例如自然语言推断(NLI)、句子对相似性判断等任务,需要判断两个句子之间的关系。
类似于句子分类任务,使用 [CLS]
标记对应的最终隐藏状态作为输入,经过全连接层和激活函数进行分类。
3. 序列标注任务
例如命名实体识别(NER)、词性标注(POS tagging)等任务,需要对序列中的每个标记进行分类。
对BERT模型的每个标记的最终隐藏状态进行分类。即对于每个标记,都使用对应位置的隐藏状态作为输入,经过全连接层和激活函数得到分类结果。
4. 问答任务
例如SQuAD问答任务,需要从段落中找到答案的起始位置和结束位置。
在这种任务中,模型输出两个标记位置的概率分布,一个用于预测答案的起始位置,另一个用于预测答案的结束位置。具体来说,对每个标记的最终隐藏状态使用两个独立的全连接层,分别对应起始位置和结束位置的分类。
5. 生成任务
例如文本生成、机器翻译等任务,需要生成一个新的序列。
BERT原始设计中不直接用于生成任务,但可以通过结合解码器架构(如GPT)来实现生成任务。输出层通常是一个基于当前隐藏状态的标记概率分布,通过softmax得到每个位置可能的下一个标记。
除了上面提到过的差异(结构差异下面具体讲,WordPiece嵌入,训练方式等),Bert还有其一些特殊,这里进行补充:
尽管BERT基本结构是基于标准的Transformer编码器,但它的一些变种引入了不同的Transformer变种,比如:
BERT的架构设计使其可以方便地扩展到更大规模的模型(如),以及可以并行化处理大规模数据,这对于大规模预训练至关重要。
BERT的预训练模型可以通过微调(Fine-Tuning)快速适应不同的下游任务,这种适应性使其在各种自然语言处理任务中表现优异。
由于BERT的开创性成功,它得到了广泛的社区支持,产生了大量的改进和变种模型,并且在各种应用中得到了验证。大量开源工具和库(如Hugging Face's Transformers库)使得使用BERT变得更加方便。
Transformer 的优势与适用任务
BERT 的优势与适用任务
这里对两者具体结构的参数进行比对,先说明一下参数:
1.Layer | 6 | 12 | 24 |
2.Units | 512 | 768 | 1024 |
3.Heads | 8 | 12 | 16 |
4.Diff | 2048 | 3072 | 4096 |
5.Total | 34.6 M | 110 M | 340 M |
https://www.zhihu.com/question/445556653/answer/2882383919https://www.zhihu.com/question/445556653/answer/2882383919https://zhuanlan.zhihu.com/p/604450283
https://zhuanlan.zhihu.com/p/604450283Transformer 之多头注意力_transformer的多头注意力机制-CSDN博客文章浏览阅读1.9k次。写在前边:学习 Transformer 的过程中,找到了博客中关于Transformer系统的介绍文章,感觉非常棒,于是进行了翻译。原文链接在文末。翻译主要采用 “DeepL+人工”的方式进行,并加入了一些自己的理解。_transformer的多头注意力机制
https://blog.csdn.net/hellozhxy/article/details/131173868变形金刚——Transformer入门刨析详解-CSDN博客文章浏览阅读8.6w次,点赞112次,收藏435次。Transformer详解_transformer
https://blog.csdn.net/m0_67505927/article/details/123209347
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。