损失函数(Loss Function)是一个用来衡量模型“当前预测结果”与“真实标准答案”之间差异大小的数学函数。简单来说就是评估 AI 预测得“好不好”的打分标准,或者说是一个“惩罚机制”。在机器学习和深度学习中,它的核心作用是:衡量模型当前的预测输出(Prediction)与真实的标准答案(Ground Truth)之间的差距。输出的数值被称为 Loss(损失值/误差值)。损失值越小,代表模型的预测越准确;损失值越大,代表模型的误差越大。
在不同类型的任务中,使用的损失函数也不同:
1. 分类任务 / 大语言模型(SFT 阶段即监督学习):
常用算法:Cross-Entropy(交叉熵)
作用:让模型在猜下一个词(例如判断“苹果”是水果还是手机)时,给正确选项打出最高的分数/概率。
目标:衡量预测的类别概率分布与真实标签的差异,让正确选项的概率接近 1。
2. 强化学习(RL 阶段):
常用算法:PPO、Importance Sampling、CISPO
作用:根据人类或环境给出的好/坏反馈(Rewards/Advantages),调整模型说出某句话的概率,同时防止模型“改得太猛而训练崩塌”。
目标:根据环境给出的奖励/惩罚(Advantage),调整模型生成某段回答的概率,直到接近最佳答案。
3. 数值预测 / 回归任务:
常用算法:MSE(均方误差)
作用:计算预测数值(如预测房价 500 万)与真实数值(如实际售价 520 万)之间的距离平方差。
目标:计算预测数值(如预测房价)与真实数值之间的物理距离或平方差。
TCRL 提供用于监督学习和强化学习的内置损失函数。您可以通过向
forward_backward 传入一个字符串来选择损失函数:future = await training_client.forward_backward_async(data, loss_fn="cross_entropy")result = await future.result_async()
总览
损失函数 | loss_fn | 类型 | 说明 |
cross_entropy | SFT | 最大化目标 Token 的对数概率 | |
importance_sampling | RL(policy gradient) | 带重要性加权的离策略策略梯度 | |
ppo | RL(clipped) | 用于稳定策略更新的裁剪式替代目标函数 | |
dro | RL(off-policy) | 面向离策略 / 离线 RL 的二次惩罚项 | |
cispo | RL(clipped grad) | 用于策略梯度的分离式裁剪重要性比 | |
— | 任意 | 通过 forward_backward_custom 定义的用户自定义损失 |
工作原理
每个训练样本都是一个
Datum——一条包含计算损失所需全部信息的序列。一个 Datum 包含:model_input :token 序列(形状:(N,),其中 N 为序列长度)loss_fn_inputs :损失函数所需的张量字典(targets、weights、advantages 等)核心设计原则:损失所需的一切都在 Datum 中。这意味着每个 Datum 都是自包含的,没有批次层面的状态,也不需要外部查找。
SFT 示例
import tinkerfrom tinker import typesdatum = types.Datum(model_input=types.ModelInput.from_ints(input_tokens), # shape: (N,)loss_fn_inputs={"target_tokens": target_tokens, # shape: (N,) — what to predict at each position"weights": weights, # shape: (N,) — 0 for prompt, 1 for completion})future = await training_client.forward_backward_async([datum], loss_fn="cross_entropy")result = await future.result_async()print(f"Loss: {result.loss}")
RL 示例
对于 RL 损失,Datum 还需要包含采样对数概率和优势:
rl_datum = types.Datum(model_input=types.ModelInput.from_ints(tokens), # shape: (N,)loss_fn_inputs={"target_tokens": target_tokens, # shape: (N,)"weights": weights, # shape: (N,)"logprobs": sampling_logprobs, # shape: (N,) — from the rollout policy"advantages": advantages, # shape: (N,) — reward signal per token})future = await training_client.forward_backward_async([rl_datum], loss_fn="importance_sampling")