语言模型训练技巧学习

(TRAINING A LANGUAGE MODEL ON A SINGLE GPU IN ONE DAY)[https://arxiv.org/pdf/2212.14034.pdf]

基础设置

  1. 字典大小为2^15最佳,字典设置为2^16性能并没有明显提高,更小的字典(2^12,2^13,2^14)会带来性能下降。
  2. 训练时删除<sep>会对性能造成微小的影响,<cls>删除不会对性能造成影响。
  3. 较短的序列,如128,对于大部分下游任务已经足够且可以降低注意力的计算量。
  4. 由于在gtx2080内存限制,batch_size将只能使用64-96的小批次,为了更好的效果,可以通过累计梯度的方式进行计算。

模型结构

  1. 模型每个token的学习效率强烈依赖于模型大小,而和transformer类型关系不大。在限定计算资源的实验中,模型大的学习效率高,模型小的学习效率低,但是可以计算更多的批次,最终全部模型的损失都在1.9附近。
    Attention
    使用Pre-Normalization
  2. rotary embeddings (Su et al., 2021; Black et al., 2022),可以带来性能的小提高,但是会损失模型训练速度。
  3. FLashattention在序列长度为128时无明显增益。
    FFN
    移除QKV偏差项,设置head为12
  4. 移除QKV的偏差项,可以略微提高计算速度。
  5. 减少head数目可以提高模型的计算性能,但会略微降低模型微调性能。

embedding
使用正弦位置嵌入,并在embedding block中的最后进行layer normalization操作。

  1. sinusoidal positional embeddings比可学习位置嵌入和未缩放的正弦位置嵌入可带来更多增益。

layer structure
使用pre-normalization的layer norm代替post-normalization.

作者认为pre-norm的关键在于稳定训练过程,增大学习率和减小wanm-up步数,单独使用收益有限。

  1. 除pre-norm外,其他改进的变种均没有额外提高。
  2. 使用 RMS Normalization代替layer Normalization也没有带来增益。

head block
使用线性头,使用稀疏令牌预测,在block最后添加layer norm。

  1. 移除非线性head并不会产生不好的效果。
  2. 稀疏令牌预测可以节省内存使用。
  3. 在block的最后添加layer norm可以稳定训练
  4. 下列方法可以降低解码器偏差?来自Language Models are Unsupervised Multitask Learners

Layer normalization (Ba et al., 2016)was moved to the input of each sub-block, similar to a
pre-activation residual network (He et al., 2016) and an
additional layer normalization was added after the final selfattention block. A modified initialization which accounts
for the accumulation on the residual path with model depth
is used. We scale the weights of residual layers at initialization by a factor of \frac{1}{\sqrt{N}} where N is the number of residual layers.

超参数设置

Objective
只使用MLM任务,遮蔽率为15%,其中10%替换为随机字符,10%保持原有字符

  1. 设置更高的遮蔽率没有带来性能提高。
  2. 对损失使用其他方法进行评估,如mean-squared error (Hui & Belkin, 2021)或L1 loss,没有发现任何益处。

Optimizer
使用adam作为优化器,设置权重衰减为0.01,β1 = 0.9, β2 = 0.98,ε =10^{-12}.设置梯度裁剪,裁剪值为0.5.

  1. 在合理的范围内调整参数值不会产生显著变化。
  2. 实验了一阶和高阶优化器,并没有发现显著优势,另外需要注意高阶优化器在实施中存在较大的可变性。

Learning
使用单周期损失,最大损失值为0.001,学习率关联计算预算,随着预算资源减少而下降。

  1. 从全局看各种学习率方案会有相似下降曲线,但仍然可以通过选择不同的学习率方案获得收益,其中在限定计算量的情况下,单周期学习率,峰值为0.001的学习率方案取得效果最优。

Steps
在2080ti时设置微批次大小为96,批次大小设置在1536附近时预训练任务损失最小,但是批次大小设置为4032时下游任务性能最佳.对于显存更大的设备,如A4000和A6000,则设置微批次大小为128/256,批次大小为4032.

正常模型训练会每个批次执行一次模型参数更新,因为bert需要的批次大小较大,此处使用梯度累计更新的方式,每个批次后会把梯度保留,达到n个批次后才会执行反向更新。

1.使用线性增长的微批量大小,可以在训练初期产生更大的进步,并对最终结果产生较小的好处。

#cramming/cramming/backend/torch_default.py
#class TorchEngine
   def backward(self, loss):
        self.accumulated_samples += self.cfg_impl.microbatch_size
        return self.scaler.scale(loss / self.accumulation_steps_expected).backward()

    @torch.no_grad()
    def forward_inference(self, *inputs, **kwargs):
        with torch.autocast(**self.amp_settings):
            outputs = self.model(*inputs, **kwargs)["logits"]
        if outputs.shape[-1] == 1:
            predictions = outputs.squeeze(dim=-1)
        else:
            predictions = outputs.argmax(dim=-1)
        return outputs, predictions

    def optimizer_step(self):
        """Requires a scheduler that is based on iterations instead of epochs."""
        self.steps += 1
        if self.accumulated_samples >= self.current_batch_size:
            self.accumulated_samples = 0

            if self.cfg_train.gradient_clipping is not None:
                self.scaler.unscale_(self.optimizer)
                torch.nn.utils.clip_grad_norm_(self.model.parameters(), self.cfg_train.gradient_clipping, norm_type=2.0)
            self.scaler.step(self.optimizer)
            self.scaler.update()
            self.optimizer.zero_grad()
            self.schedule_batch_size()
            self.schedule_curriculum()
            self.moving_average_computation()
        self.scheduler.step()  # Trigger in every step, otherwise things get annoying with grad accumulation 

Dropout
在预训练时移除Dropout,在下游任务中设置dropout比例为0.1.

  1. 在训练数据相对计算资源较少时,使用dropout可以防止过拟合。
  2. 在计算资源受限的情况下,dropout会导致每个参数每秒的更新量,降低参数更新效率。

数据集设置

通过两种方法来更好的缩小数据规模。第一步对数据进行过滤、预处理和排序,第二步交换数据源。
为此,作者实验了一些数据集包括Pile的子集Gutenberg,Books3,Wikipedia (en)和Common Crawl进行训练,其中选取Pile的前4\times 10^6,选取Common Crawl的前20 \times 10^6.
在未处理情况下Pile在下游任务MNLI中性能最好,C4在进行一些额外处理后可以获得额外提高。实验了数据去重,没有发现效果提升,对数据根据压缩率移除条目,实现了性能提高。
另外为了提高效果还使用序列排序和加大训练最后的batch size。

  1. 按照Deduplicating Training Data Makes Language Models Better对数据集中的内容去重后对下游性能没有影响。
  2. 移除难以压缩的数据后对性能有所提高。压缩方法为使用数据集自带的tokenizer对数据集进行tokenizer,将tokens数大于原始字符(characters)数0.3倍的条目移除。

    We use the tokenizer itself to remove all training sequences from C4 set that cannot be compressed well; we simply set a threshold t, e.g. t = 0.3, and drop all entries from the dataset where the number of tokens in the entry is larger than t times the number of raw characters.This removes, for example, sequences consisting of hard-to-compress HTML or markdown code.

  3. 对数据按照平均token流行性(average (unigram) token prevalence)来对数据进行排序。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容