RealFormer

28 篇文章 0 订阅
4 篇文章 0 订阅

1)本文参考自@苏剑林 RealFormer:把残差转移到Attention矩阵上面去,主要是做一些个人的注解
2)以下阴影背景部分为引用上述文章,“注:”部分为本文添加

背景

Layer Normalization 是 Transformer 模型的重要组成之一,它的用法有 PostLN 和 PreLN 两种,论文 On Layer Normalization in the Transformer Architecture [1] 中有对两者比较详细的分析。简单来说,就是 PreLN 对梯度下降更加友好,收敛更快,对训练时的超参数如学习率等更加鲁棒等,反正一切都好但就有一点硬伤:PreLN 的性能似乎总略差于 PostLN。

  • 问题:讨论preLN和postLN

    • preLN
      • 优点:容易训练,收敛比postLN快,对学习率等超参数鲁棒;
      • 缺点:性能比postLN差一点
    • postLN
      • 优点:性能比preLN好一点
      • 缺点:不容易训练
  • 方法:google RealFormer=>兼容preLN、postLN的优点在这里插入图片描述

模型
  • RealFormer 全称为“Residual Attention Layer Transformer”,即“残差式 Attention 层的 Transformer 模型”,顾名思义就是把残差放到了 Attentionk 里边了,如下在这里插入图片描述
  • 具体的改动其实挺简单:
    A t t e n t i o n ( Q n , K n , V n ) = s o f t m a x ( A n ) V n , 其 中 A n = Q n K n T d k 变 成 A t t e n t i o n ( Q n , K n , V n ) = s o f t m a x ( A ˉ n ) V n , 其 中 A ˉ n = Q n K n T d k + A ˉ n − 1 \begin{aligned} & Attention(Q_n,K_n,V_n)=softmax(A_n)V_n, 其中A_n=\frac {Q_nK^T_n} {\sqrt d_k} \\ & 变成 \\ & Attention(Q_n,K_n,V_n)=softmax(\bar A_n)V_n, 其中\bar A_n=\frac {Q_nK^T_n} {\sqrt d_k} + \bar A_{n-1} \\ \end{aligned} Attention(Qn,Kn,Vn)=softmax(An)Vn,An=d kQnKnTAttention(Qn,Kn,Vn)=softmax(Aˉn)Vn,Aˉn=d kQnKnT+Aˉn1
实验
  • MLM准确率对比
    在这里插入图片描述

  • GLUE评测对比在这里插入图片描述

  • 不同训练步数效果对比在这里插入图片描述

值得特别指出的是第一张图和第四张图(注:上图3)。从第一张图我们可以看到,对于 RealFormer 结构,加大模型规模(large 到 xlarge)可以带来性能的明显提升,而 ALBERT 论文曾经提到加大 BERT 的模型规模(注:应该是指large->xlarge)并不能带来明显受益,结合两者说明这可能是 PostLN 的毛病而不是 BERT 的固有毛病,换成 RealFormer 可以改善这一点。

从第四张图我们可以看到,RealFormer 结构训练 50 万步,效果就相当于 PostLN 训练 100 万步,这表明 RealFormer 有着很高的训练效率。

分析
  • postLN问题

    • 采用 L a y e r N o r m ( x + f ( x ) ) 结 构 , L a y e r N o r m LayerNorm(x+f(x))结构,LayerNorm LayerNorm(x+f(x))LayerNorm增加了前面层的梯度消失风险,造成后面层梯度大,前面层梯度小;大学习率会使后面层容易崩,小学习率使前面层训练不够,因此难以训练
    • 一般要使用warmup慢慢训练
  • preLN问题

    • 采用 x + f ( x ) x+f(x) x+f(x)形式,最后一层变成 x + f 1 ( x ) + f 2 ( x ) + . . . + f n ( x ) x+f_1(x)+f_2(x)+...+f_n(x) x+f1(x)+f2(x)+...+fn(x) ,可能导致数值和方差很大,最后需要加一层 L a y e r N o r m LayerNorm LayerNorm使输出稳定下来;

    事实上,很早就有人注意到残差的这个特点会造成不稳定,笔者之前研究 GAN 的时候,就发现 Which Training Methods for GANs do actually Converge? [4] 一文中的实现就把 x + f ( x ) x+f(x) x+f(x)换成了 x + 0.1 f ( x ) x+0.1f(x) x+0.1f(x) 。受到他们实现的启发,笔者也试过将0.1换成 α \alpha α,其中 α \alpha α是初始化为 0 的可训练标量参数,也取得不错的效果。

    今年年初的论文 ReZero is All You Need: Fast Convergence at Large Depth [5] 则正式地提出了这个方法,命名为 ReZero,里边的实验表明用 ReZero 可以干脆去掉 Layer Norm。遗憾的是,ReZero 的论文没有对 Transformer 做更多的实验,而 RealFormer 也没有比较它与 ReZero 的效果差别。

  • RealFormer的优势

    • a)主要采用postLN+attention_skip,因此没有preLN的问题

    读者可能会反驳,既然 PreLN 存在问题,那 RealFormer 的 不也是存在同样的叠加问题吗?如果只看 ,那么确实会有这样的问题,但别忘了 后面还要做个 softmax 归一化后才参与运算,也就是说,模型对矩阵 是自带归一化功能的,所以它不会有数值发散的风险。

    • b)A(即Attention)的累加会造成强者恒强(同一个token前后层的A应该有类似的分布),使得A趋向于one-hot形式(即产生很多小系数);这样会造成后面层(因为A是逐渐趋向one-hot)的梯度也被削弱,一定程度减轻了postLN遇到前后层梯度不一的困扰,有利于所有层协同优化;

    而且刚刚相反,随着层数的增加, 的叠加会使得 的元素绝对值可能越来越大,Attention 逐渐趋于 one hot 形式,造成后面的层梯度消失,但是别忘了,我们刚才说 PostLN 前面的层梯度小后面的层梯度大,而现在也进一步缩小了后面层的梯度,反而使得两者更同步从而更好优化了;

    另一方面,Attention 的概率值可能会有趋同的趋势,也就是说 Attention 的模式可能越来越稳定(注:应该是指趋向于one-hot形式),带来类似 ALBERT 参数共享的正则化效应,这对模型效果来说可能是有利的(注:有种高开低走/前炸裂后收敛的感觉),直觉上来说,用 RealFormer 结构去做 FastBERT [6] 之类的自适应层数的改进,效果会更好,因为 RealFormer 的 Attention 本身会有趋同趋势,更加符合 FastBERT 设计的出发点。

    • c)可以将 RealFormer 理解为还是使用了常规的残差结构,但是残差结构只用在 Q / K Q/K Q/K而没有用在 V V V上:
      A t t e n t i o n ( Q n , K n , V n ) = s o f t m a x ( A ˉ n ) V n , 其 中 A ˉ n = Q n K n T d k + A ˉ n − 1 这 在 一 定 程 度 上 与 如 下 式 子 等 价 A ˉ n = Q ˉ n K ˉ n T d k = ( Q n + Q ˉ n − 1 ) ( K n + K ˉ n − 1 ) T d k 即 只 对 Q / K 加 偏 置 ( 残 差 ) , 不 对 V 加 \begin{aligned} & Attention(Q_n,K_n,V_n)=softmax(\bar A_n)V_n, \\ & 其中\bar A_n=\frac {Q_nK^T_n} {\sqrt d_k} + \bar A_{n-1} \\ & 这在一定程度上与如下式子等价 \\ & \bar A_n=\frac {\bar Q_n \bar K^T_n} {\sqrt d_k} \\ & =\frac {(Q_n+\bar Q_{n-1}) (K_n+\bar K_{n-1})^T} {\sqrt d_k} \\ & 即只对Q/K加偏置(残差),不对V加 \\ \end{aligned} Attention(Qn,Kn,Vn)=softmax(Aˉn)Vn,Aˉn=d kQnKnT+Aˉn1Aˉn=d kQˉnKˉnT=d k(Qn+Qˉn1)(Kn+Kˉn1)TQ/KV

    为啥 V V V “不值得”一个残差呢?从近来的一些相对位置编码的改进中,笔者发现似乎有一个共同的趋势,那就是去掉了 的偏置,比如像 NEZHA 的相对位置编码,是同时在 Attention 矩阵(即 Q / K Q/K Q/K)和 V V V上施加的,而较新的 XLNET 和 T5 的相对位置编码则只施加在 Attention 矩阵上,所以,似乎去掉 V V V的不必要的偏置是一个比较好的选择,而 RealFormer 再次体现了这一点。

总结
  • 以上分析中,b)的说法可能比较有说服力;
  • 不管怎么样效果是有的,可以学习大佬解决问题的方法:如果要对postLN动刀,那就直击痛点,既然前后层梯度不一,那就想办法提高浅层的梯度或者降低深层的梯度,google选择了后种;
  • 建议读者阅读文章RealFormer增加理解
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RealFormer 是一种基于Transformer结构的语言模型,可以用于文本生成、语言理解等任务。以下是一个简单的RealFormer代码示例: ```python import torch import torch.nn as nn import torch.nn.functional as F class RealFormer(nn.Module): def __init__(self, vocab_size, d_model, nhead, num_encoder_layers, num_decoder_layers, dim_feedforward, dropout=0.1): super(RealFormer, self).__init__() self.encoder = nn.TransformerEncoder( nn.TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout), num_encoder_layers) self.decoder = nn.TransformerDecoder( nn.TransformerDecoderLayer(d_model, nhead, dim_feedforward, dropout), num_decoder_layers) self.embedding = nn.Embedding(vocab_size, d_model) self.d_model = d_model self.fc = nn.Linear(d_model, vocab_size) def forward(self, src, tgt): # src: [seq_len, batch_size], tgt: [seq_len, batch_size] enc_src = self.embedding(src) * math.sqrt(self.d_model) enc_tgt = self.embedding(tgt) * math.sqrt(self.d_model) enc_src = self.encoder(enc_src) dec_out = self.decoder(enc_tgt, enc_src) dec_out = self.fc(dec_out) return dec_out ``` 这段代码定义了一个基本的RealFormer模型,包括了一个嵌入层、一个编码器、一个解码器和一个全连接层。在正向传播时,它将源序列和目标序列作为输入,通过编码器和解码器将源序列映射到目标序列,并通过全连接层将输出映射到词汇表上。该模型可以通过调整超参数来适应不同的任务和数据集。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值