损失函数的原理与梯度

损失函数的原理与梯度

Jackknifer
Jackknifer 博主

损失函数的定义通常与概率假设或预测目标有关。本文讨论常见定义的来源,以及损失产生的梯度如何用于更新模型参数。

一、损失函数与训练目标

给定输入 xx、真实标签 yy 和模型参数 θ\theta,模型产生预测:

y^=fθ(x)\hat y=f_\theta(x)

单个样本的损失记为 ℓ(y^,y)\ell(\hat y,y),训练集共有 NN 个样本时,平均经验损失为:

L(θ)=1N∑i=1Nℓ(fθ(xi),yi)L(\theta)=\frac{1}{N}\sum_{i=1}^{N}\ell\bigl(f_\theta(x_i),y_i\bigr)

训练希望找到使损失较小的参数:

θ∗=arg⁡min⁡θL(θ)\theta^*=\arg\min_\theta L(\theta)

讨论平方误差、交叉熵和成对排序损失时,可以关注三个问题:损失值如何反映预测质量,定义依据什么假设,以及梯度如何影响参数。

损失函数决定训练目标。梯度告诉模型如何更新参数。验证集指标负责评价模型在未见数据上的表现。即使训练损失下降,模型的实际业务指标也仍需独立检查。

二、回归损失:怎样预测连续数值

2.1 MSE:正态误差与条件均值

均方误差(Mean Squared Error,MSE)定义为:

LMSE=1N∑i=1N(y^i−yi)2L_{\mathrm{MSE}}=\frac{1}{N}\sum_{i=1}^{N}(\hat y_i-y_i)^2

例如,真实值为 10,20,3010,20,30,预测值为 12,19,2512,19,25,则平方误差分别为 4,1,254,1,25,平均损失为 1010。平方惩罚使较大的预测误差获得更大的损失。

概率来源。 假设误差独立且服从相同方差的正态分布:

yi=fθ(xi)+ϵi,ϵi∼N(0,σ2)y_i=f_\theta(x_i)+\epsilon_i,\qquad \epsilon_i\sim\mathcal N(0,\sigma^2)

于是单个样本的条件密度为:

p(yi∣xi,θ)=12πσ2exp⁡[−(yi−fθ(xi))22σ2]p(y_i\mid x_i,\theta)=\frac{1}{\sqrt{2\pi\sigma^2}}\exp\left[-\frac{(y_i-f_\theta(x_i))^2}{2\sigma^2}\right]

对所有样本的联合似然取负对数,得到:

−log⁡p(y∣X,θ)=N2log⁡(2πσ2)+12σ2∑i(yi−y^i)2-\log p(\boldsymbol y\mid X,\theta)=\frac N2\log(2\pi\sigma^2)+\frac{1}{2\sigma^2}\sum_i(y_i-\hat y_i)^2

当 σ2\sigma^2 固定时,最小化负对数似然等价于最小化平方误差。这就是 MSE 的统计来源。

为什么预测均值? 如果只能预测一个常数 aa,考虑总体风险:

R(a)=E[(Y−a)2∣X=x]R(a)=\mathbb E[(Y-a)^2\mid X=x]

求导:

R′(a)=2(a−E[Y∣X=x])R'(a)=2\left(a-\mathbb E[Y\mid X=x]\right)

所以最优预测为:

a∗=E[Y∣X=x]a^*=\mathbb E[Y\mid X=x]

如何优化? 对单个样本 ℓ=(y^−y)2/2\ell=(\hat y-y)^2/2 有:

∂ℓ∂y^=y^−y\frac{\partial\ell}{\partial\hat y}=\hat y-y

若 y^=wx+b\hat y=wx+b,根据链式法则:

∂ℓ∂w=(y^−y)x,∂ℓ∂b=y^−y\frac{\partial\ell}{\partial w}=(\hat y-y)x,\qquad \frac{\partial\ell}{\partial b}=\hat y-y

梯度下降据此修改 ww 和 bb,使预测结果朝真实值移动。

2.2 MAE:拉普拉斯误差与条件中位数

平均绝对误差(Mean Absolute Error,MAE)定义为:

LMAE=1N∑i∣y^i−yi∣L_{\mathrm{MAE}}=\frac1N\sum_i|\hat y_i-y_i|

如果误差服从位置参数为预测值、尺度参数为 bb 的拉普拉斯分布:

p(y∣μ,b)=12bexp⁡(−∣y−μ∣b)p(y\mid\mu,b)=\frac{1}{2b}\exp\left(-\frac{|y-\mu|}{b}\right)

其负对数似然包含:

−log⁡p(y∣X,θ)=Nlog⁡(2b)+1b∑i∣yi−y^i∣-\log p(\boldsymbol y\mid X,\theta)=N\log(2b)+\frac1b\sum_i|y_i-\hat y_i|

固定 bb 后,最大似然估计对应 MAE。

对于连续分布,最小化 E∣Y−a∣\mathbb E|Y-a| 的条件满足:

ddaE∣Y−a∣=2FY(a)−1=0\frac{d}{da}\mathbb E|Y-a|=2F_Y(a)-1=0

所以最优值为条件中位数。对数据 10,12,13,15,10010,12,13,15,100,最优平方误差常数预测是 3030,最优绝对误差常数预测是 1313。

MAE 在非零误差处的导数为 sign⁡(y^−y)\operatorname{sign}(\hat y-y)。误差恰好为零时使用次梯度,因此可以应用次梯度法和其他相应的优化方法。

2.3 Huber:小误差与大误差的处理

令 e=y^−ye=\hat y-y,Huber 损失为:

ℓδ(e)={12e2,∣e∣≤δδ(∣e∣−12δ),∣e∣>δ\ell_\delta(e)= \begin{cases} \frac12e^2,&|e|\leq\delta\\ \delta(|e|-\frac12\delta),&|e|>\delta \end{cases}

它在较小误差处采用平方惩罚,在较大误差处采用线性惩罚。梯度为:

ℓδ′(e)={e,∣e∣≤δδsign⁡(e),∣e∣>δ\ell_\delta'(e)= \begin{cases} e,&|e|\leq\delta\\ \delta\operatorname{sign}(e),&|e|>\delta \end{cases}

参数 δ\delta 控制分界位置。对于异常观测较多的回归问题,Huber 可以限制单个大误差产生的梯度。

2.4 Quantile Loss:把预测目标设置为分位数

令 u=y−y^u=y-\hat y,第 τ\tau 分位数的损失为:

ρτ(u)={τu,u≥0(τ−1)u,u<0,0<τ<1\rho_\tau(u)= \begin{cases} \tau u,&u\geq0\\ (\tau-1)u,&u<0 \end{cases} ,\qquad0<\tau<1

当 τ=0.9\tau=0.9 时,低估真实值的单位损失是高估的 9 倍。对于预测常数 aa:

ddaE[ρτ(Y−a)]=FY(a)−τ\frac{d}{da}\mathbb E[\rho_\tau(Y-a)]=F_Y(a)-\tau

因此最优解满足 FY(a)=τF_Y(a)=\tau,对应条件分位数。此方法常用于销量区间、风险程度和高分位需求预测。

2.5 Poisson 与 Gaussian NLL

如果目标是单位时间的事件次数,可以假设 Y∣x∼Poisson⁡(λ)Y\mid x\sim\operatorname{Poisson}(\lambda):

p(y∣λ)=λye−λy!p(y\mid\lambda)=\frac{\lambda^ye^{-\lambda}}{y!}

令模型输出 zz,设 λ=ez\lambda=e^z,则负对数似然为:

ℓ=ez−yz+log⁡(y!),∂ℓ∂z=ez−y\ell=e^z-yz+\log(y!),\qquad \frac{\partial\ell}{\partial z}=e^z-y

如果希望同时预测连续变量的均值和观测方差,可以采用 Gaussian NLL:

ℓ=(y−μθ(x))22σθ2(x)+12log⁡σθ2(x)+12log⁡(2π)\ell=\frac{(y-\mu_\theta(x))^2}{2\sigma_\theta^2(x)} +\frac12\log\sigma_\theta^2(x)+\frac12\log(2\pi)

方差项控制每个样本的误差权重,对数方差项使模型为给定的不确定性承担相应代价。

2.6 交互实验:回归损失的曲线与梯度

在下面的实验中选择 MSE、MAE、Huber 和 Quantile Loss,拖动预测误差。观察同一个误差对应的损失值、梯度和更新方向。

单独打开回归损失函数实验:修改误差、Huber 阈值和分位数,观察曲线与梯度。支持单独打开。

三、分类损失:从概率分布推导交叉熵

3.1 BCE:伯努利分布的负对数似然

二分类标签 y∈{0,1}y\in\{0,1\},模型预测正类概率 pp。伯努利分布的概率质量函数为:

P(Y=y∣p)=py(1−p)1−yP(Y=y\mid p)=p^y(1-p)^{1-y}

取负对数便得到二元交叉熵(Binary Cross-Entropy,BCE):

ℓBCE=−ylog⁡p−(1−y)log⁡(1−p)\ell_{\mathrm{BCE}}=-y\log p-(1-y)\log(1-p)

真实标签为 1 时,损失为 −log⁡p-\log p。预测概率从 0.90.9 降至 0.10.1,损失从约 0.1050.105 增加到约 2.3032.303。高置信度的错误预测会受到明显惩罚。

模型通常先输出 Logit zz,再通过 Sigmoid 得到概率:

p=σ(z)=11+e−zp=\sigma(z)=\frac{1}{1+e^{-z}}

利用链式法则:

∂ℓ∂p=p−yp(1−p),∂p∂z=p(1−p)\frac{\partial\ell}{\partial p} =\frac{p-y}{p(1-p)},\qquad \frac{\partial p}{\partial z}=p(1-p)

两项相乘:

∂ℓ∂z=p−y\boxed{\frac{\partial\ell}{\partial z}=p-y}

因此,当真实标签为 1、预测概率为 0.2 时,梯度为 -0.8。梯度下降会提高 Logit,从而提高正类概率。

数值计算时采用 Logit 的稳定形式:

ℓ(z,y)=max⁡(z,0)−yz+log⁡(1+e−∣z∣)\ell(z,y)=\max(z,0)-yz+\log(1+e^{-|z|})

PyTorch 的 BCEWithLogitsLoss\texttt{BCEWithLogitsLoss} 接收原始 Logit,适合常见的二分类训练。

3.2 多分类 Cross-Entropy:分类分布与 Softmax

对 KK 个互斥类别,网络输出 z1,…,zKz_1,\ldots,z_K,Softmax 定义为:

pk=ezk∑j=1Kezjp_k=\frac{e^{z_k}}{\sum_{j=1}^{K}e^{z_j}}

使用独热编码 yky_k,分类分布的似然为 ∏kpkyk\prod_kp_k^{y_k}。因此负对数似然为:

ℓCE=−∑k=1Kyklog⁡pk\ell_{\mathrm{CE}}=-\sum_{k=1}^{K}y_k\log p_k

Softmax 的雅可比矩阵元素满足:

∂pk∂zj=pk(1k=j−pj)\frac{\partial p_k}{\partial z_j} =p_k(\mathbf1_{k=j}-p_j)

代入交叉熵并整理,可得:

∂ℓ∂zk=pk−yk\boxed{\frac{\partial\ell}{\partial z_k}=p_k-y_k}

例如真实标签为 (0,1,0)(0,1,0)、预测概率为 (0.2,0.7,0.1)(0.2,0.7,0.1),则 Logit 梯度为 (0.2,−0.3,0.1)(0.2,-0.3,0.1)。这组梯度会推动第二类的分数提高,其他类别的分数降低。

3.3 Cross-Entropy 和 KL 散度的关系

给定目标概率分布 qq 和模型预测分布 pp:

H(q,p)=−∑kqklog⁡pkH(q,p)=-\sum_kq_k\log p_k DKL(q∥p)=∑kqklog⁡qkpkD_{\mathrm{KL}}(q\Vert p)=\sum_kq_k\log\frac{q_k}{p_k}

有:

H(q,p)=H(q)+DKL(q∥p)H(q,p)=H(q)+D_{\mathrm{KL}}(q\Vert p)

对于固定目标分布,H(q)H(q) 为常数,因此最小化交叉熵等价于最小化对应方向的 KL 散度。KL 散度具有方向性,在知识蒸馏和变分推断中需要明确使用哪一种方向。

3.4 Hinge Loss 与 Focal Loss

支持向量机常使用 Hinge Loss。设 y∈{−1,+1}y\in\{-1,+1\},模型分数为 ss:

ℓhinge=max⁡(0,1−ys)\ell_{\mathrm{hinge}}=\max(0,1-ys)

当正确类别的间隔 ysys 达到 1 时,该样本损失为零。在间隔较小时,损失继续推动分类分数增加。

Focal Loss 通常写为:

ℓfocal=−αt(1−pt)γlog⁡pt\ell_{\mathrm{focal}}=-\alpha_t(1-p_t)^\gamma\log p_t

其中 ptp_t 是真实类别对应的预测概率,αt\alpha_t 调整类别权重,γ≥0\gamma\geq0 控制容易分类样本的相对权重。取 γ=2\gamma=2 时,pt=0.9p_t=0.9 的调节系数为 0.01,pt=0.2p_t=0.2 的调节系数为 0.64。

3.5 交互实验:Sigmoid、Softmax 和梯度

拖动 Logit,切换二分类与三分类,观察概率分布、交叉熵和 p−yp-y 梯度。通过真实类别切换可以观察梯度方向。

单独打开交叉熵实验:调整 Logit 和真实类别,实时计算概率、损失与梯度。支持单独打开。

四、推荐系统中的排序损失

4.1 Pointwise:预测单个候选的概率

点击率预测通常把每个用户与物品的曝光记录看作一个二分类样本:

pui=P(click=1∣u,i,x)p_{ui}=P(\mathrm{click}=1\mid u,i,x)

使用 BCE 衡量预测点击概率与点击标签的差异。对于同时预测多个相互独立的二元目标,可以分别计算 BCE,并按任务权重组合。

4.2 Pairwise:BPR 直接约束相对顺序

对用户 uu,设正样本物品 ii 的分数为 suis_{ui},负样本物品 jj 的分数为 sujs_{uj}。定义:

Δ=sui−suj,P(i≻uj)=σ(Δ)\Delta=s_{ui}-s_{uj},\qquad P(i\succ_u j)=\sigma(\Delta)

对成对偏好事件取负对数似然:

ℓBPR=−log⁡σ(Δ)=log⁡(1+e−Δ)\ell_{\mathrm{BPR}}=-\log\sigma(\Delta)=\log(1+e^{-\Delta})

其梯度为:

∂ℓ∂sui=σ(Δ)−1,∂ℓ∂suj=1−σ(Δ)\frac{\partial\ell}{\partial s_{ui}}=\sigma(\Delta)-1,\qquad \frac{\partial\ell}{\partial s_{uj}}=1-\sigma(\Delta)

当正样本分数为 1、负样本分数为 2 时,损失约为 1.313;若变为 3 和 1,损失约为 0.127。训练逐渐提高正样本相对于负样本的分数。

4.3 Listwise:对候选列表计算损失

对于一个含 KK 个候选物品的列表,设正样本的编号为 i+i^+:

Llist=−log⁡exp⁡(si+)∑j=1Kexp⁡(sj)L_{\mathrm{list}}=-\log\frac{\exp(s_{i^+})}{\sum_{j=1}^{K}\exp(s_j)}

分母包含整组候选分数,因此列表内的物品相互影响。多个相关物品和分级相关性标签可以使用更完整的列表排序方法。

4.4 InfoNCE:温度控制下的对比学习

设查询向量为 qq,候选表示为 k1,…,kKk_1,\ldots,k_K,正样本表示为 k+k^+:

LInfoNCE=−log⁡exp⁡(sim⁡(q,k+)/τ)∑j=1Kexp⁡(sim⁡(q,kj)/τ)L_{\mathrm{InfoNCE}}= -\log \frac{\exp(\operatorname{sim}(q,k^+)/\tau)} {\sum_{j=1}^{K}\exp(\operatorname{sim}(q,k_j)/\tau)}

温度 τ>0\tau>0 控制 Softmax 对相似度差异的敏感程度。较小的温度通常会加强分数差异带来的概率变化。它常用于双塔召回、表示学习与自监督训练。

负样本选择会影响排序目标。未点击可能来自用户尚未看到物品,曝光记录和采样方案会影响损失的含义。

4.5 交互实验:BPR、Listwise 与 InfoNCE

固定 A 为正样本、B 和 C 为负样本。切换训练目标,改变分数与温度,观察同一组候选在不同损失下的学习信号。

单独打开排序损失实验:修改正负样本分数与温度,观察 BPR、Listwise 和 InfoNCE 的损失及梯度。支持单独打开。

五、损失函数的定义依据

5.1 根据概率分布建立负对数似然

给定条件概率模型,最大似然估计可写为:

θ^=arg⁡max⁡θ∏ipθ(yi∣xi)=arg⁡min⁡θ[−∑ilog⁡pθ(yi∣xi)]\hat\theta=\arg\max_\theta\prod_i p_\theta(y_i\mid x_i) =\arg\min_\theta\left[-\sum_i\log p_\theta(y_i\mid x_i)\right]

不同概率分布对应不同损失:正态分布对应固定方差下的 MSE,拉普拉斯分布对应 MAE,伯努利分布对应 BCE,分类分布对应多分类交叉熵,泊松分布对应计数损失。这一推导能够帮助判断损失函数是否符合数据的概率特点。

5.2 根据决策要求设置误差成本

MSE、MAE 和 Quantile Loss 分别对应条件均值、条件中位数和条件分位数。Hinge Loss 用分类间隔表达决策要求。BPR 使用正负物品之间的分数差。选择损失函数时,需要明确模型最终应当学习哪一种预测结果。

5.3 用可求导目标帮助训练

准确率是离散指标:

Accuracy⁡=1N∑i1(y^i=yi)\operatorname{Accuracy}=\frac1N\sum_i\mathbf1(\hat y_i=y_i)

当参数变化却没有改变类别时,准确率通常保持不变,因此难以向梯度优化提供足够有用的信息。交叉熵提供了连续、可求导的分类训练目标。

NDCG 涉及离散排序,通常采用 Pairwise、Listwise 或其他可求导方法作为训练目标。最后仍需使用验证集评价真实任务指标。

六、反向传播与优化算法

6.1 损失如何传递给模型参数

考虑三层神经网络:

h1=ϕ(W1x+b1),h2=ϕ(W2h1+b2),z=W3h2+b3h_1=\phi(W_1x+b_1),\quad h_2=\phi(W_2h_1+b_2),\quad z=W_3h_2+b_3

损失为 L=ℓ(z,y)L=\ell(z,y)。链式法则给出:

∂L∂W3=∂L∂z∂z∂W3\frac{\partial L}{\partial W_3} =\frac{\partial L}{\partial z}\frac{\partial z}{\partial W_3}

以及:

∂L∂W2=∂L∂z∂z∂h2∂h2∂W2\frac{\partial L}{\partial W_2} =\frac{\partial L}{\partial z} \frac{\partial z}{\partial h_2} \frac{\partial h_2}{\partial W_2}

反向传播以损失函数的输出梯度为起点,逐层计算权重和偏置的梯度。优化器使用这些梯度更新参数。

6.2 手算一次 BCE 梯度下降

考虑二分类模型:

z=wx+b,p=σ(z)z=wx+b,\qquad p=\sigma(z)

给定单个样本 x=2,y=1x=2,y=1。设初始参数 w=0,b=0w=0,b=0,学习率为 0.1。开始时 z=0,p=0.5z=0,p=0.5:

L=−log⁡(0.5)≈0.6931L=-\log(0.5)\approx0.6931

BCE 与 Sigmoid 的组合满足:

∂L∂z=p−y=−0.5\frac{\partial L}{\partial z}=p-y=-0.5

继续求参数梯度:

∂L∂w=(p−y)x=−1,∂L∂b=p−y=−0.5\frac{\partial L}{\partial w}=(p-y)x=-1,\qquad \frac{\partial L}{\partial b}=p-y=-0.5

更新后得到:

wnew=0−0.1(−1)=0.1,bnew=0−0.1(−0.5)=0.05w_{\mathrm{new}}=0-0.1(-1)=0.1,\quad b_{\mathrm{new}}=0-0.1(-0.5)=0.05

新的 Logit 是 0.25,预测概率约为 0.5622,损失约为 0.5759。模型通过梯度逐步提高真实类别的预测概率。

6.3 随机梯度下降 SGD

对当前训练批次计算:

gt=∇θLBt(θt)g_t=\nabla_\theta L_{\mathcal B_t}(\theta_t)

最基本的随机梯度下降更新为:

θt+1=θt−ηgt\theta_{t+1}=\theta_t-\eta g_t

其中学习率控制参数更新幅度。较大的学习率可能造成训练波动,较小的学习率可能使收敛过程较慢。

6.4 Momentum 动量法

Momentum 将当前梯度与历史梯度进行加权组合:

mt=βmt−1+(1−β)gtm_t=\beta m_{t-1}+(1-\beta)g_t θt+1=θt−ηmt\theta_{t+1}=\theta_t-\eta m_t

其中的参数 β\beta 控制历史梯度的影响程度。历史信息有助于平滑相邻批次的更新方向。

6.5 Adam 和 AdamW

Adam 同时维护梯度的一阶矩估计与二阶矩估计:

mt=β1mt−1+(1−β1)gtm_t=\beta_1m_{t-1}+(1-\beta_1)g_t vt=β2vt−1+(1−β2)gt2v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2

进行初始误差修正:

m^t=mt1−β1t,v^t=vt1−β2t\hat m_t=\frac{m_t}{1-\beta_1^t},\quad \hat v_t=\frac{v_t}{1-\beta_2^t}

最终更新:

θt+1=θt−ηm^tv^t+ϵ\theta_{t+1} =\theta_t-\eta\frac{\hat m_t}{\sqrt{\hat v_t}+\epsilon}

平方、开方和除法都对向量各个元素分别计算。Adam 使用历史梯度调整各参数的更新幅度。AdamW 将权重衰减独立处理,是常见的深度学习优化方法。

6.6 交互实验:观察等高线上的梯度下降路径

考虑二维目标函数:

L(w,b)=12(w2+8b2)L(w,b)=\frac12(w^2+8b^2)

因为两个参数方向上的损失变化速度不同,等高线呈椭圆形。切换 SGD、Momentum、Adam,修改学习率与更新次数,观察实际路径。

单独打开优化器路径实验:调整学习率、更新次数与优化算法,观察椭圆等高线上的移动轨迹。支持单独打开。

6.7 数学性质为什么影响训练过程

MSE 的梯度与误差成正比,大误差会产生较大的梯度。MAE 在非零误差处的梯度绝对值为 1。Huber 在大误差区域限制梯度大小,适合关注异常观测的场景。

凸函数的局部最小值也是全局最小值。线性模型配合常见凸损失通常具有较好的优化性质。深度神经网络涉及复杂的非线性变换,其整体训练目标通常属于非凸优化。

对于二分类和多分类,直接使用接收 Logit 的损失实现可以提高数值稳定性,减少极端概率导致的浮点计算问题。

七、正则化与多任务损失

7.1 L1 与 L2 参数约束

训练时经常组合数据损失与正则化项:

J(θ)=Ldata(θ)+λΩ(θ)J(\theta)=L_{\mathrm{data}}(\theta)+\lambda\Omega(\theta)

L2 约束取 Ω(θ)=∥θ∥22\Omega(\theta)=\|\theta\|_2^2,其梯度会增加 2λθ2\lambda\theta。这一形式与正态参数先验的最大后验估计具有联系。

L1 约束取 Ω(θ)=∥θ∥1\Omega(\theta)=\|\theta\|_1,能够促使部分参数取零。它与拉普拉斯参数先验有关,可以使用次梯度或近端梯度方法优化。

7.2 点击率与转化率的多任务训练

如果模型同时预测点击率和转化率,可以定义:

Ltotal=λ1LCTR+λ2LCVRL_{\mathrm{total}}=\lambda_1L_{\mathrm{CTR}}+\lambda_2L_{\mathrm{CVR}}

总梯度为:

∇Ltotal=λ1∇LCTR+λ2∇LCVR\nabla L_{\mathrm{total}} =\lambda_1\nabla L_{\mathrm{CTR}}+\lambda_2\nabla L_{\mathrm{CVR}}

权重影响不同任务对共享参数的作用。训练时还需要独立检查各任务的验证损失和评价指标。

八、PyTorch 实现与实验检查

8.1 常用损失函数接口

目标 损失函数 PyTorch 接口
连续回归 MSE nn.MSELoss
稳健回归 MAE / Huber nn.L1Loss / nn.HuberLoss
二分类 BCE nn.BCEWithLogitsLoss
互斥多分类 Cross-Entropy nn.CrossEntropyLoss
概率分布 KL 散度 nn.KLDivLoss
计数预测 Poisson NLL nn.PoissonNLLLoss
均值与方差 Gaussian NLL nn.GaussianNLLLoss

二分类中的 nn.BCEWithLogitsLoss 直接接收 Logit。多分类中的 nn.CrossEntropyLoss 也直接接收各类别的 Logit。展示预测概率时,可以再使用 Sigmoid 或 Softmax。

下面的程序复现前文的单样本 BCE 更新:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import torch
from torch import nn

feature = torch.tensor([[2.0]])
target = torch.tensor([[1.0]])
model = nn.Linear(1, 1)

with torch.no_grad():
model.weight.fill_(0.0)
model.bias.fill_(0.0)

criterion = nn.BCEWithLogitsLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

initial_logit = model(feature)
initial_loss = criterion(initial_logit, target)
print("before:", initial_loss.item())

optimizer.zero_grad()
initial_loss.backward()
print("weight gradient:", model.weight.grad.item())
print("bias gradient:", model.bias.grad.item())
optimizer.step()

updated_logit = model(feature)
updated_loss = criterion(updated_logit, target)
print("after:", updated_loss.item())

预期得到权重梯度 -1、偏置梯度 -0.5。一次更新后的损失约为 0.5759。

8.2 模型训练中应该监控什么

项目 作用
训练损失 观察当前训练目标的变化
验证损失 评价未见样本上的损失
准确率、AUC、NDCG 评价具体任务的效果
梯度和学习率 理解每次参数更新的幅度
类别比例与负样本来源 判断分类与推荐排序样本的含义
多任务损失 检查不同目标的训练表现

8.3 极端观测对最优预测值的影响

假设有 100 个样本,其中 99 个真实值为 0,另外 1 个真实值为 1,000。模型只能输出常数 aa。

对于 MSE,最优值是均值:

aMSE=99×0+1000100=10a_{\mathrm{MSE}}=\frac{99\times0+1000}{100}=10

对于 MAE,最优值是中位数:

aMAE=0a_{\mathrm{MAE}}=0

Huber 取 δ=1\delta=1。在 0<a<10<a<1 时,其平均损失的一阶条件为:

99a−1=099a-1=0

因此最优常数为:

aHuber=199≈0.0101a_{\mathrm{Huber}}=\frac1{99}\approx0.0101

数据和模型结构相同,损失函数不同,最优预测值也会不同。选择训练目标时,需要考虑这种差异。

参考资料

评论

评论由 GitHub Giscus 提供。若当前网络无法加载,可 前往 GitHub Discussions 查看或参与讨论。

目录
损失函数的原理与梯度