LLM训练的大致介绍

部署运行你感兴趣的模型镜像

基于现有模型,继续pretrain大模型

PyTorch + Huggingface transformers的AutoModelForCausalLM和AutoTokenizer

预训练样本打成batch:

1. 假设有2个样本:

2. 拼接起来

3. 按照sequence length来切分

4. 丢弃掉末尾长度不够的那个:

------------------------------------------

<EOS>、<BOS>那种标签,是可以把前后2个doc隔离开的,各自的self-attention不会受到corss-doc的影响。例如,LLama3:

原文:https://ai.meta.com/blog/meta-llama-3/

------------------------------------------

不考虑doc边界那种,更popular。

考虑doc边界的,效果更好。

有人写了论文做了实验来对比:2402.13991

MIXChunk: 同一个chunk里的doc是随机选取的,可以跨来源。

UNIChunk: 同一个chunk里的doc是从同一个来源获取的(比如都从Wiki里)。

BM25Chunk: 同一个chunk里的doc是有相关性的doc组成的。

INTRADoc: 考虑了doc边界。即每个token只和本doc内,前面的tokens有关。(前面3种,是每个token和本chunk内所有前面的tokens有关)

Huggingface的Trainer类:

各种配置选项:

Huggingface accelerate来做并行训练:

大模型的能力,是在预训练阶段做好的。

如果直接使用预训练后的大模型,仍然是续写

解决:使用SFT微调,教会大模型做各种任务。

Chat Template:

每种大模型,有自己的ChatTemplate。使用自己的特殊token和格式,来填充input sequence。

在tokenizer_config.json里:

填充模板:

这个参数,控制填不填assistant标签:

为True,则填上:

loss mask

只对Answer计算loss, 对input不计算loss:

loss mask为0的,是将0加入到整个句子的总loss里,反向传播到不了他们那里。

删掉最后1个token的logits:

inputs左移1个位置,得到labels:

最后logits和labels,计算交叉熵corss_entropy,乘以loss_mask,加和,得到总loss。

使用Huggingface自带的trl库的SFTTrainer

SFTTrainer会自动使用tokenizer配置自带的template来对dataset样本进行填充。

collator是控制只对completion(即answer)部分的tokens计算loss的。传入completion开始的字符串即可。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

训练大语言模型(LLM)的过程中,交叉熵损失函数卡在2左右无法下降是一个常见的问题,通常反映了模型在训练初期或中期遇到了瓶颈。以下是对该现象的详细分析及解决方法。 ### 交叉熵损失停滞在2的原因 1. **初始阶段模型预测接近均匀分布** 在训练初期,模型的输出通常接近均匀分布,即每个词的概率大致相等。对于一个词汇量为 $ V $ 的模型,其初始预测的概率为 $ 1/V $。交叉熵损失的计算公式为: $$ L = -\frac{1}{N} \sum_{i=1}^{N} \sum_{j=1}^{V} y_{ij} \log(p_{ij}) $$ 如果模型的预测接近均匀分布,则 $ \log(p_{ij}) $ 接近 $ \log(1/V) $,损失值为 $ \log(V) $。对于常见的词汇量 $ V=10000 $,$ \log(V) \approx 9.21 $,但由于实际标签分布稀疏(即只有少数词是正确标签),损失值会显著降低。如果损失卡在2左右,说明模型未能有效学习标签分布,可能是因为初始化不当或学习率设置不合理。 2. **梯度消失或爆炸** 在深层模型中,梯度消失或爆炸可能导致参数更新缓慢甚至停滞。这种情况下,模型无法有效调整权重以降低损失。 3. **数据分布不匹配或数据质量问题** 如果训练数据中存在大量噪声或分布不均衡问题,模型可能无法有效学习到正确的语言模式,导致损失无法下降。 4. **学习率设置不当** 学习率过高可能导致模型在最优解附近震荡,而学习率过低则会导致模型收敛缓慢甚至停滞。 5. **模型容量不足** 如果模型的层数或参数量不足,模型可能无法捕捉到数据中的复杂模式,导致损失无法进一步下降。 6. **正则化过强** 过强的正则化(如L2正则化或Dropout比例过高)可能会限制模型的学习能力,导致损失停滞。 ### 解决方法 1. **调整学习率策略** 使用学习率衰减策略(如线性预热+余弦退火)可以有效缓解学习率设置不当的问题。例如,在PyTorch中可以使用以下代码: ```python from torch.optim.lr_scheduler import CosineAnnealingLR optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4) scheduler = CosineAnnealingLR(optimizer, T_max=num_epochs) ``` 2. **优化初始化方法** 使用更稳定的初始化方法(如Xavier初始化或Kaiming初始化)可以避免模型初始预测过于随机。例如,在PyTorch中可以使用以下代码: ```python import torch.nn as nn def init_weights(m): if isinstance(m, nn.Linear): nn.init.kaiming_uniform_(m.weight) model.apply(init_weights) ``` 3. **引入梯度裁剪** 梯度裁剪可以防止梯度爆炸,同时缓解梯度消失问题。例如,在PyTorch中可以使用以下代码: ```python torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) ``` 4. **改进模型结构** 增加模型的层数或参数量,或引入更高效的结构(如Transformer中的多头注意力机制),可以提升模型容量。 5. **优化数据质量与分布** 对训练数据进行清洗,去除噪声,并确保数据分布均衡。此外,可以使用数据增强技术(如回译或随机掩码)来提升数据多样性。 6. **调整正则化强度** 降低Dropout比例或L2正则化系数,以避免模型学习能力受限。 7. **引入更高效的优化器** 使用AdamW或LAMB等优化器可以更好地平衡参数更新的稳定性和效率。 ### 示例代码 以下是一个简单的交叉熵损失计算示例: ```python import torch import torch.nn as nn # 假设词汇量为10000,批次大小为32,序列长度为512 logits = torch.randn(32, 512, 10000) targets = torch.randint(0, 10000, (32, 512)) # 计算交叉熵损失 criterion = nn.CrossEntropyLoss() loss = criterion(logits.view(-1, 10000), targets.view(-1)) print(f"Loss: {loss.item()}") ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值