共计 4032 个字符,预计需要花费 11 分钟才能阅读完成。
tranformer架构的提出是2017年google做机器翻译的团队提出来了,文章一出来产生的影响很大,毕竟实验效果都能达到sota水平且算法架构创新很多,解决了一些关键性的问题。到现在为止,这个架构在nlp和图像领域都有着很不错的发展。博主在做的项目里很多都会用bert这样的基座模型去做一些下游的任务,在推荐系统也会用到MHA去捕捉一些序列信息。
现在HF 对transformer库的持续更新,大大降低了开发小伙伴们应用这个架构的门槛,几十行代码就可以实现一个demo需求,有了gpt你也可以问问gpt帮你生成代码帮你完成需求。
说到底用也都是会用,很多时候对其思考还是不太够,这个为什么能用,其实也没有深入的学习,为了赶工进度,哗啦啦堆上去先,后面也没有再来看了。
接下来讨论的一些点相对也是比较零碎,如果需要完整的关于架构的说明网上有很多教程可以去看。
1. bert encode 与 gpt-2 decode 的区别(下面的回答来自gpt哈)
简单来说:
- BERT encode: 主要用于理解文本,将输入的文本转换成一种具有上下文信息的表示(编码)。它能同时看到输入文本的全部内容。
- GPT-2 decode: 主要用于生成文本,根据已有的文本来预测并输出下一个词(或 token)。它只能看到输入文本的前面部分。
下面是更详细的解释:
- 核心功能与目的
- BERT (Encode): 旨在为输入的每个 token 生成一个深度、双向、有上下文的表示。它的目的是深入理解文本的含义、词语之间的关系、句子的结构等。常用于文本分类、命名实体识别、问答等理解类任务。
- GPT-2 (Decode): 旨在根据给定的上下文生成后续的文本序列。它的目的是预测并输出下一个最有可能的 token,从而实现文本生成、续写、翻译(通过 prompt)等生成类任务。
- Transformer 架构的使用
- BERT: 使用 Transformer 架构的Encoder(编码器)部分。Encoder 的特点是可以处理整个输入序列,并且其 Self-Attention(自注意力)机制是双向的,即在计算一个 token 的表示时,可以同时看到它前面和后面的所有 token。
- GPT-2: 使用 Transformer 架构的Decoder(解码器)部分(但没有 Encoder-Decoder 交叉注意力)。Decoder 的特点是用于序列生成,其 Self-Attention 机制是带掩码的(masked),即在计算当前 token 的表示时,只能看到它以及它之前的 token,而看不到它之后的 token。这是为了模拟文本生成的顺序性:你不能在生成当前词时就“看到”后面的词。
- 预训练任务
- BERT:
- Masked Language Model (MLM): 随机遮盖输入中一部分 token,然后训练模型去预测这些被遮盖的 token。这迫使模型学习词语在上下文中的含义。
- Next Sentence Prediction (NSP): 判断两个句子是否是原文中相邻的句子。这帮助模型理解句子之间的关系。
- 这些任务都是为了理解文本的内在结构和关系。
- GPT-2:
- Causal Language Modeling (CLM): 根据前面的 token 预测下一个 token。这是一个纯粹的自回归(auto-regressive)任务,即生成依赖于之前的输出。
- 这个任务直接训练模型进行文本生成。
- BERT:
- 信息流向
- BERT (Encode): 信息流是双向的。每个 token 的表示都融合了来自其左侧和右侧上下文的信息。
- GPT-2 (Decode): 信息流是单向的(从左到右)。在生成过程中,模型只能依赖于其左侧(即已经生成的)的文本。
- 输出
- BERT (Encode): 输出是一系列向量(称为上下文嵌入或编码),每个向量对应输入中的一个 token,包含了该 token 在特定上下文中的丰富信息。这些向量本身不是生成的文本。
- GPT-2 (Decode): 输出是预测的下一个 token。通过重复这个过程(将新生成的 token 添加到输入序列中作为新的上下文),GPT-2 可以逐步生成完整的文本序列。
总结对比表格:
特性 | BERT (Encode) | GPT-2 (Decode) |
---|---|---|
核心功能 | 文本理解、编码上下文信息 | 文本生成、预测下一个 token |
Transformer 部分 | 仅 Encoder | 仅 Decoder (带 Masked Self-Attention) |
注意力机制 | 双向 (Bidirectional) | 单向/带掩码 (Unidirectional/Masked) |
信息流 | 双向 | 单向 (从左到右) |
预训练任务 | MLM, NSP | CLM (预测下一个 token) |
典型应用 | 文本分类、NER、问答 (理解型) | 文本生成、续写、摘要 (生成型) |
输出 | 上下文相关的 token 向量表示 | 预测的下一个文本 token |
所以,“BERT encode” 指的是 BERT 模型将输入文本转化为双向、上下文感知向量表示的过程,用于文本理解;而“GPT-2 decode” 指的是 GPT-2 模型根据之前的文本生成后续文本序列的过程,利用的是带掩码的单向注意力机制。
- bert cls 为什么可以表征句子含义
- 预训练任务:下一句预测 (Next Sentence Prediction, NSP)
这是最直接的原因。在 BERT 的预训练过程中,除了 Masked Language Model (MLM) 之外,还有一个任务叫做“下一句预测”(NSP)。
NSP 任务的目标是判断输入的两个句子(用 [SEP] 分隔)在原始文本中是否是连续的。例如,输入可能是 [CLS] 句子A [SEP] 句子B [SEP]。
为了执行 NSP 任务,BERT 的设计者选择了 [CLS] token 的最终隐藏状态 作为整个输入序列(即句子A和句子B)的聚合表示。然后,这个表示会被送入一个简单的分类器(比如一个线性层)来预测“是下一句”或“不是下一句”。
因此,在预训练过程中,模型被强制训练去让 [CLS] token 的表示学习到如何编码 关于整个输入序列(包括句子 A 和句子 B 之间的关系)的信息。如果 [CLS] 的表示无法有效地概括输入序列的整体含义和关系,模型就无法做好 NSP 任务。 - Transformer 架构:自注意力机制 (Self-Attention)
- 这是实现上述学习的基础。BERT 使用的是 Transformer 的 Encoder 部分。
- Transformer Encoder 的核心是多头自注意力机制。这意味着,在计算序列中每一个 token 的表示时,模型都会去关注输入序列中的所有其他 token。
- 对于 [CLS] token 来说,由于自注意力机制的存在,它在每一层都可以“看到”并融入输入序列中所有其他 token(包括句子 A 和句子 B 中的所有词)的信息。
- 随着层数的加深,[CLS] token 的表示层层叠加地聚合了来自整个输入序列的上下文信息。到最后一层时,[CLS] 的隐藏状态已经吸收并融合了整个句子的复杂语义和结构信息
在自注意力机制里面说到经过多层encode之后cls 捕捉到了整体句子的含义,那么其他的token是不是也可以达到这个要求,为什么其他token不行。这里需要强调的一点是,虽然其他token也会计算除此token之外的关联性,但是自身的含义还是存在的,并且占据着主导的地位,但是cls却不同,本身并没有实际的含义,要说也是bert架构限定的在nsp任务上的,但是看bert 的发展历程,后续在bert-www 等模型都取消了nsp任务,单独的MLM任务也其实都能够完成CLS本身关于整体句子语义的表征。
- transoformer的并行是在哪
一张图描述并行,上图是以encode block来举例说明的 - 像gpt-2 这样的decode模型,输入一段query,到底是怎么做解码生成的?
这个过程其实非生成阶段是可以并行处理,重点是在mask self attention 处理。其实我在看例子的时候也在想一个问题:
cat sit on
比如上面的例子,在输入cat 之后真的是经过模型之后会预测出 sit ?假设现在输入的是 cat ,其实如果是模型没学好,或者上下文存在一定的语义不明,实际上decode之后经过mlp 之后预估的最大概率值并不是一定sit这个token,其实也没有什么关系,这个也不影响后续生成阶段。
这些输入字段过一遍模型,是为了得到各个层对应 token 的 K V 数据,后续在生成next token 的时候每经过一个decode block 都需要计算mask self attention 。
5. bert 或者 gpt-2 的 pos embedding 与transformer 不一样
bert 和 gpt 都是可学习的pos embeding ,比如bert 最大 512 输入,那么直接顶一个 512 大小的embdding 矩阵就可以表示位置向量信息了,gpt 同理。
但是原生transformer 是采用正余弦方式来表征奇偶位置信息,是个固定值,无法学习。
– 原始 Transformer (Attention Is All You Need 论文):
使用了固定(Fixed)的、基于正弦和余弦函数(Sinusoidal)的位置编码。
这些编码是预先计算好的,不可学习(Non-learnable)。
它们通过加法与词嵌入(Token Embeddings)结合,为模型提供位置信息。
优点:能够处理比训练时见过的更长的序列,因为函数可以计算任意位置的编码。
- BERT 和 GPT-2:
使用了可学习(Learnable)的位置嵌入(Positional Embeddings)。
它们是模型参数的一部分,在训练过程中与词嵌入一起学习。
实际上就是一个查询表(look-up table),为每个可能的位置( up to max sequence length)存储一个唯一的向量。
这些可学习的位置嵌入也通过加法与词嵌入(以及 BERT 中的 Segment Embeddings)结合。
优点:理论上可以通过学习捕获更复杂的位置依赖关系。
缺点:最大可处理的序列长度受限于训练时设定的位置嵌入表的尺寸。
