损失函数运行出nan和inf,原因是学习率过大引起的

损失函数也是有可能导致输出nan,inf(由于梯度爆炸造成Loss爆炸引起)

原因很简单,学习率较高的情况下,直接影响到每次更新值的程度比较大,走的步伐因此也会大起来。过大的学习率会导致无法顺利地到达最低点,稍有不慎就会跳出可控制区域,此时我们将要面对的就是损失成倍增大(跨量级)。

### 关于Lora微调时现的`RuntimeError` 在使用LoRA进行微调的过程中,如果遇到`RuntimeError: probability tensor contains either inf, nan or element < 0`这样的错误,通常是因为概率张量中的某些值超了正常范围。这种问题可能是由多种原因引起的,包括数值不稳定性模型配置不当。 #### 数值不稳定性分析 1. **混合精度训练的影响** 如果正在使用混合精度训练(例如FP16),可能会因为浮点数精度不足而导致数值溢或下溢。这种情况可能导致生成的概率分布中现无穷(`inf`)、非数字(`nan`)或者负数(<0)的情况[^2]。为了缓解这一问题,可以尝试以下措施: - 使用更稳定的规范化技术,如RMSNorm替代LayerNorm。 - 增加梯度裁剪以防止梯度过引发数值问题。 - 验证是否所有的权重都在合理的范围内运行,尤其是最后的线性层(lm_head),其输可能需要更高的精度处理。 2. **采样过程中的潜在风险** 当执行如下操作时: ```python next_tokens = torch.multinomial(probs, num_samples=1).squeeze(1) ``` 若`probs`中含有非法值(如`inf`, `nan` 或 `<0`),则会触发上述错误。因此,在调用`torch.multinomial`之前,应确保输入张量的有效性。可以通过添加检查逻辑来验证这一点: ```python assert not torch.isnan(probs).any(), "Probability tensor contains NaN values" assert (probs >= 0).all(), "Probability tensor contains negative values" probs = torch.clamp(probs, min=1e-9) # 防止零概率导致log运算失败 ``` 3. **调整采样策略** 若要完全规避此类问题,可以在`model.generate`函数中禁用随机采样功能,通过设置`do_sample=False`强制采用贪心解码(greedy decoding)[^1]。尽管这种方法牺牲了一定程度上的多样性,但在调试阶段非常有用。 #### LoRA配置优化建议 除了关注数值稳定性的改进外,还需要仔细审视LoRA本身的配置参数。以下是几个关键点: 1. **适当调节rank小(r)** rank过会增加计算复杂度;而太小又无法捕捉足够的特征信息。一般推荐初始值设定为8~16之间,并依据具体应用场景灵活调整[^3]。 2. **合理选择alpha因子(lora_alpha)** alpha控制着低秩近似的效果强度,默认情况下可取较一些的值以便更好地逼近原始全连接层的行为模式。 3. **引入dropout机制(lora_dropout)** 添加适量噪声有助于增强泛化能力,但过高容易造成学习困难。常规做法是从较小的比例开始试验,逐步找到最佳平衡点。 4. **任务类型的指定(task_type)** 明确告知系统当前正在进行的是哪种类型的任务(如因果语言建模CAUSAL_LM)。这样能够帮助框架内部做针对性更强的选择安排。 #### ASPEN框架下的多任务管理方案 对于希望在同一硬件设备上同时开展多项LoRA微调工作的用户来说,ASPEN提供了一个高效的解决方案。该框架不仅显著降低了GPU显存占用率(-53%),还提升了整体训练效率(+17%)以及缩短了平均等待时间(-24%/-12%)[^4]。借助其内置的任务调度器(Task Scheduler),即使面对复杂的并发请求也能保持良好的运作状态。 --- ### 示例代码片段 下面给一段经过改良后的生成流程实现方式作为参考: ```python import torch from peft import LoraConfig, get_peft_model from transformers import AutoModelForCausalLM, AutoTokenizer # 加载基础模型与分词工具 base_model_name_or_path = "your_base_model_here" tokenizer = AutoTokenizer.from_pretrained(base_model_name_or_path) model = AutoModelForCausalLM.from_pretrained(base_model_name_or_path) # 定义并应用LoRA适配结构 config = LoraConfig( task_type="CAUSAL_LM", inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1 ) peft_model = get_peft_model(model, config) def safe_generate(prompt_text, max_length=50): inputs = tokenizer.encode_plus(prompt_text, return_tensors='pt') with torch.no_grad(): outputs = peft_model.generate(**inputs, max_new_tokens=max_length, do_sample=True, # 开启多样本抽取 top_k=50, # 控制候选词汇数量 temperature=0.7, # 平滑温度系数 pad_token_id=tokenizer.pad_token_id) generated_sequence = tokenizer.decode(outputs[0], skip_special_tokens=True) print(f"Generated Text:\n{generated_sequence}") try: prompt = "Once upon a time," safe_generate(prompt) except RuntimeError as e: print(e) finally: del model, peft_model torch.cuda.empty_cache() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值