当前位置:   article > 正文

NLP学习总结|ChatGLM模型架构_chatglm 架构

chatglm 架构

1. 预训练框架

GLM预训练的目标->结合自编码(encoder-only)和自回归(decoder-only)模型预训练的优点

  • 自回归(e.g. GPT):使用了单向注意力机制,是left-to-right的语言模型,适合进行生成任务,但在NLU任务中,与双向注意力机制相比,无法完全捕捉上下文的依赖关系(?不过现在随着参数量的提高,基于decoder-only的大模型也outperform了采用双向注意力的模型了吧,还没具体查过这一方面。TODO: 查一下自回归语言模型在NLU的表现)
  • 自编码(e.g. BERT):  通过某个降噪目标(比如MLM)训练的双向文本编码器。编码器会产出适用于NLU任务的上下文表示,但无法直接用于文本生成。
  • Seq2seq(i.e. encoder-decoder; e.g. T5): 采用双向注意力机制,通常用于条件生成任务,比如文本摘要、机器翻译等。

1.1. 训练任务:自回归空格填充 


​​​​​​​

具体做法:

1. 给定Input=[x1,x2,x3,x3,x5,x6],然后采样m个 spans。
2. 把被采样的部分mask掉,得到Part A。
3. shuffle 被采样的 spans,得到 PartB。
4. 把PartA与PartB拼接成一个sequence,Part A部分采用双向注意力,PartB部分采样自回归预测。为了能够自回归生成,padded 【start】和【end】。

5. 采样方式:文本片段的采样遵循泊松分布,重复采样,直到原始tokens中有15%被mask

Part B里的token可以看见Part A里的token -> 实现对上下文依赖关系的捕捉

Part B里的token看不见后来的token -> 实现生成任务(Q: 但是为什么要对Part B的token进行shuffle?这样x3的生成不是会依赖于x5, x6吗?)

2D位置编码

自回归空白填充任务的挑战之一是如何编码位置信息。Transformer 依赖于位置编码来注入标记的绝对和相对位置。我们提出了二维位置编码来解决这个挑战。具体来说,每个标记都用两个位置 id 编码。第一个位置 id 表示在损坏的文本 Part A 中的位置。对于被掩盖的跨度,它是相应 [MASK] 标记的位置。第二个位置 id 表示跨度内的位置。对于部分 A 中的标记,它们的第二个位置 id 为 0。对于部分 B 中的标记,它们的范围从 1 到跨度的长度。通过可学习的嵌入表将两个位置 id 投影到两个向量上,这两个向量都添加到输入标记嵌入中。

为什么需要这个Part A和Part B?

GLM将NLU任务制定为包含任务描述的cloze问题,这些问题可以通过自回归生成来回答。

Part A就可以看作是cloze的问题描述,masked掉的是需要回答的问题。

TODO: 我目前还没有弄清楚的一点是为什么Part A需要注意力分数,如果我们训练目标是通过生成对mask位置的词的预测,难道不是只需要生成部分有注意力分数就行了吗?还是说它这样和encoder-decoder架构的自注意力机制一样?

还有就是part A里的mask怎么处理?为什么Part B要打乱顺序?

1.2 多目标预训练

针对三类下游任务设计了三种基于自回归填空的预训练目标,交替进行

token-level objective 单词级

从一个均值为3的泊松分布中采样片段的长度,直到原始文本中15%的字符被掩盖,然后在文本中随机排布填空片段的位置。这一目标针对的是NLU

sentence-level objective 句子级

从文档中随机掩码若干文本片段,每个文本片段必须为完整的句子,被掩码的词数量为整个文档长度的15%。这一目标是能针对seq2seq任务,其预测往往是完整的整个句子或者段落。

document-level objective 文档级

采样一个长度从原始文本长度的50%到100%的均匀分布中采样的片段。这预训练目标针对的是无条件的长文本生成

三类预训练目标的区别只是跨度(片段)的数量和长度的区别。

1.3 对于transformer架构的修改

1. 重组了LN和残差连接的顺序

DeepNorm(x) = LayerNorm(\alpha \cdot x + Network(x)) where \alpha = (2N)^\frac{1}{2}

2. 使用单个线性层对输出token进行预测
3. 激活函数: GLU with GeLU

GeLU补课

​​​​​​​参考:BERT中的激活函数GELU:高斯误差线性单元 - 知乎

关于gelu - 知乎

GeLU可以看作是ReLU(加入非线性性)和dropout思想(正则化,提高泛化能力)的结合:

ReLU会确定性的将输入乘上一个0或者1,Dropout则是随机乘上0。而GELU则是通过随机地将输入乘上0或1来实现这个功能--输入是乘以0还是1,是在同时取决于输入自身分布的情况下随机选择的。换句话说,是0还是1取决于当前的输入有多大的概率大于其余的输入。输入越小,越有可能取0(这一点接近ReLU, 输入小于0的部分都取0)。

假定神经元输入X \sim N(0, 1), 当前输入大于其余输入的概率\Phi (x) = P(X \leq x) = \int_{-\infty}^{x} \frac{e^{-t^2/2}}{\sqrt{2\pi}} dt = \frac{1}{2}[1+erf(\frac{x}{\sqrt{2}})], 所以当前取0还是取1符合概率为\Phi (x)的伯努利分布

公式:GELU = x \Phi(x) = x \frac{1}{2}[1+erf(\frac{x}{\sqrt{2}})]

因为GELU计算比较麻烦,所以有sigmoid近似和tanh近似,用的比较多的是tanh近似:

\approx \frac{1}{2} x [1+tanh(\sqrt{\frac{2}{\pi}} (x + 0.044715x^3))]

(BERT, GPT里用的都是GELU,好像也是用的近似的算法,还没查不太确定)

GLU(Gated Linear Unit)线性门控单元

使用GLU(Gated Linear Unit)线性门控单元的FFN(Feed-Forward Network)块是Transformer模型中常用的结构之一。

GLU线性门控单元的特点是能够对输入向量进行选择性地激活,从而增强模型的表达能力。它在Transformer模型的编码器和解码器中广泛应用,用于对输入向量进行非线性变换和特征提取

需要注意的是,GLU线性门控单元的计算复杂度较高,可能会增加模型的计算开销。

GLU = x * GELU(W_1 x)W_1是可学习的矩阵

首先将输入向量 x 通过一个全连接层(线性变换)得到一个与 x 维度相同的向量,然后将该向量作为输入传递给GeLU激活函数进行非线性变换。最后,将GeLU激活函数的输出与输入向量 x 逐元素相乘,得到最终的输出向量。

TODO: 旋转位置编码

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

闽ICP备14008679号