How many layers and why? An analysis of the model depth in transformers-----transformer问什么叠很多层?

How many layers and why? An analysis of the model depth in transformers

在论文中,经常会看到作者提及使用多少层Transformer,但是,通过学习,我发现Transformer就是输入一张图像经过它之后,其维度大小并不改变?只是,在原数据上添加了这个token能看到其它token的attention,也就是常说的强大的自注意力机制,由此带来的是建立了远距离的依赖。

那么经过一层transformer就有这个效果了?将从前者transformer输出的结果,再一次作为输入,再次经过transformer,是为了得到注意里效果更高的数据?加强attention map?

带着这个问题,进行检索与思考、求助.......

得到了这篇文章作为答复,一起来看看吧,看能不能解答这个问题?

Transformer作Encoder是在正常不过的事了哈,这里就不再做解释。

摘要:

  • 对于输入对象,每一层的Transformer所处理的作用是一样的,换句话说,不管输入是什么,Transformer都是一模一样的,那么,这个过程自然就可以看作是一个有限次迭代过程。
  • 当token重复进入Transformer进行处理时,主要是让tokens上下文表示逐步细化!(答案?)
  • 不同的token所需要的迭代次数其实并不一样,对于复杂的token需要迭代的次数更多一些。

介绍:

  • Transformers的过度参数化(over-parametrized )总所周知。这个结果的可能原因还较为模糊,但是Transformers是由固定的层堆叠而成的,这说不定就是高度冗余和过拟合的原因。好啦,这篇文章就来研究,传统使用的多层会带来什么影响?扮演了什么角色?
  • NLP:底层编码表面信息,中间层编码语法信息,上层编码语义信息。
  • 在每次迭代后,Transformer逐步优化特征,能够得到更加细粒的特征。
  • 实验强调,权重是可以跨层联系的,同时同一函数是可以重复,进而猜想一定数量的transformer的应用是为了将表面信息逐渐抽象为语义信息。
  • ALBERT:模型,用来研究token经过layers后的特征表示的变化。模型实现了跨层绑定权重的关键特性,但也动态地调整应用于每个token的层数(每个token应用的层数不一样)。因为所有层都应用相同的权重,因此将层对隐藏状态的应用称为迭代。

到这问题就解决了,不过为什么可以更细粒呢?留疑???其实感觉和之前所设想的,理所当然!

当然,想看全片解读的可以继续看~

原来这是一篇NLP的文章,涉及NLP的理解还较为浅显,欢迎大家指正哈!


相关工作:

  • 调整transformer的深度是一个活跃的课题,特别是,deep transformer模型被怀疑难以适应不同的难度水平。虽然大型模型正确地预测了困难的案例,但它们过度计算了更简单的输入。这个问题可以通过提前停止来解决,比如:
    • 一些样本可能足够简单,可以使用中间特征进行分类;
    • 有些模型将每一层耦合一个分类器;在每一层之后,给定分类器输出,模型要么立即返回输出,要么将样本传递给下一层。退出甚至可能会“过度考虑”输入,对网络产生负面影响。
  • 现也有调整token级的研究,比如:
    • 通过组合来自不同层的token表示来构建句子嵌入。
    • 在全transformer、token级别上,动态使用层深度。

方法:

1 模型架构

  • multi-layer transformer encoder——利用L个堆叠的transformer encoder处理token的上下文向量。每次迭代中,使用跨层绑定的权重和同样的transformation function。
  • 使用halting mechanism(停止机制-Graves)来增强模型,它允许动态地调整每个token经过的层数。直接使用了Graves的停止机制,其中主要区别是使用了transformer模型,而不是循环状态转换模型。作用就是,控制token需不需要再次迭代。(看下图去体会)

 2 预训练目标

  • 在预训练阶段,用The sentence order prediction (sop)(句子顺序)预测来训练模型——灵感源于Lan等人在分辨输入的序列是遵循原始顺序还是交换,以及掩码语言模型任务(mlm)。
  • 鼓励网络通过直接在ALBERT预训练目标中添加衡量成本来最小化迭代次数。
  • 损失函数:sop的损失、mlm的损失、时间相对成本损失

3 基准和基础设施

  • 实验遵循ALBERT协议和预训练的BOOKCORPUS、English Wikipedia。
  • 最大输入长度调整至128,训练周期减少到112500.
  • 使用30000的小写词汇进行标记(这是NLP??!)
  • 在谷歌ColabPro2的一个TPUv2-8上训练所有的模型,并积累梯度以保持4096批大小。
  • 使用LAMB优化参数,学习速率为1.76e-3。

4 实验

4.1 预训练分析

分析在预训练和微调期间的迭代模型属性。总共进行3个子任务:

  • mlm task
  • sop task
  • Ponder cost

 结果分析:

  • [CLS] token比其他token进行了更多次的迭代。这一观察结果与Clark等人一致,他们分析了BERT的关注,并报告了对特殊token的系统和广泛的关注。可以理解为[CLS]token被用作sop任务的输入,并为整个输入聚合一个表示。
  • 相反,[SEP] token迭代次数很少。这再次支持了从注意力分析中出现的观察结果,该分析将[SEP] 理解为注意力头部的禁止操作。
  • [MASK] 也受益于比平均token更多次的迭代。至于 [CLS] 令牌,理解为这些token对mlm任务是至关重要的。进一步观察,发现MASK和随机的迭代次数都大于MASK和原始的迭代次数。在这种情况下,尽管所有token都针对mlm任务,但 [MASK/RAndod] 和 [MASK/MASK] 显然更难识别。
  • 模型似乎有一个只管的机制并为对训练前任务至关重要或呈现一定难度的token分发迭代。这也与第2节中引用的早期退出机制相一致,该机制调整了整个例子的层数,以更好地适应每个样本的难度级别。

Natural Fixed point:分析在模型迭代转换过程中token的隐藏状态是如何演变的。在每次迭代n中,自注意机制计算更新后的状态n+1作为当前状态的加权和。这引入了循环依赖关系,因为在迭代过程中每个token都相互依赖。由于不能保证在一个环状结构内的收敛,鼓励模型收敛到一个不动点。

  • 来自两个连续迭没有被屏蔽的token比[MASH] token收敛得更快。[CLS]标记在中间层之前发生振荡。

 4.2 对下游任务的应用

在训练前阶段,该模型关注于对训练前任务至关重要的token或呈现一定难度水平的token。现在我研究在下游语法或语义任务的微调过程中的模型行为。

Control test :验证模型设置的合理性,GLUE验证,结果如表,展示了测试集的结果。正如预期的那样,平均分数随着迭代次数的增加而降低。实际上,限制了由模型所执行的计算操作的数量。此外,在ALBERT的基础上建立了模型,它跨层共享参数,从而与原始的BERT架构相比,减少了参数的数量。然而,尽管有这些额外的限制,结果仍保持在一个合理的范围内。特别是,具有自适应深度的ALBERT-base与具有固定深度的版本非常接近

Probing tasks :Conneau和Kiela引入了探索任务,以评估一个模型是否编码了基本的语言属性。考虑不引入随机替换的语义和句法任务。特别是,一个预测句子节点正下方的顶部成分序列的任务(TopConst),一个任务是预测主从句动词的时态(时态),以及两个预测主语的任务,主子句中的编号。

尽管所有的任务都获得了显著的和可比较的准确性,但它们都需要一个不同的全局迭代平均值。紧张任务只能从动词中解决,只需要5.4次迭代才能完成,而TopConst任务需要推断出一些句子结构,需要在7.2次迭代中完成。这表明该模型可以适应任务的复杂性,并全局避免不必要的迭代。

查看token级,就像在预训练期间一样,迭代是不均匀地分布在token之间。该模型似乎迭代了更多对该任务至关重要的token。对于SubjNum,subj标记的迭代次数最大,而对于ObjNum任务,obj和根标记的迭代次数更多。类似地,所有的任务都在主动词(根语)上进行了大量的迭代,这对每个预测都至关重要。

结论:

文章研究了各层在深层transformer中的作用。设计了一个原始模型,它通过动态次数的迭代逐步转换每个token。分析了这些迭代在训练过程中的分布,并通过分析注意力在BERT层中的分布,特别是特殊token的特定行为。此外,观察到预测任务的关键标记从更多的迭代中获益。在微调过程中证实了这一观察结果,其中具有大量迭代的token也被怀疑是实现该任务的关键。实验为深层transformer模型中各层的作用提供了一个新的解释路径。层不是在每个阶段提取一些特定的特征,而是可以解释为从迭代和收敛过程中得到的迭代。希望这有助于更好地理解transformer模型的收敛机制,减少计算足迹或提供新的正则化方法。

涉及NLP的理解还较为浅显,欢迎大家指正哈!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Keras中,可以使用`keras.layers.LSTM`来堆多个LSTM层。以下是一个简单的例子: ```python from keras.models import Sequential from keras.layers import LSTM model = Sequential() model.add(LSTM(64, return_sequences=True, input_shape=(10, 32))) # 第一层LSTM,return_sequences=True表示返回每个时间步的输出 model.add(LSTM(32)) # 第二层LSTM,不需要返回每个时间步的输出 ``` 在这个例子中,我们使用了两个LSTM层。第一个LSTM层的输出被传递给第二个LSTM层,第二个LSTM层的输出将作为最终的输出。第一个LSTM层的参数`return_sequences=True`表示返回每个时间步的输出,而不是仅仅返回最后一个时间步的输出。 需要注意的是,如果需要在多个LSTM层之间使用Dropout或BatchNormalization等正则化方法,可以使用`keras.layers.Dropout`和`keras.layers.BatchNormalization`对LSTM层进行包装。例如: ```python from keras.models import Sequential from keras.layers import LSTM, Dropout, BatchNormalization model = Sequential() model.add(LSTM(64, return_sequences=True, input_shape=(10, 32))) model.add(Dropout(0.5)) # 对第一个LSTM层使用Dropout正则化 model.add(BatchNormalization()) # 对第一个LSTM层使用BatchNormalization正则化 model.add(LSTM(32)) model.add(Dropout(0.5)) # 对第二个LSTM层使用Dropout正则化 model.add(BatchNormalization()) # 对第二个LSTM层使用BatchNormalization正则化 ``` 这样可以提高模型的泛化能力和防止过拟合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MengYa_DreamZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值