1. 项目概述:为什么时间序列预测的损失函数如此重要?
在时间序列预测项目中,我们常常把大量精力花在模型架构、特征工程和超参数调优上,却容易忽略一个同样关键,甚至在某些场景下决定项目成败的基石——损失函数。损失函数,简单说就是模型预测值与真实值之间“差距”的数学度量,它直接告诉模型“什么是对的,什么是错的”,并引导模型朝着“对”的方向去学习。选错了损失函数,就像用错误的指南针导航,模型再复杂、数据再优质,也可能南辕北辙。
我见过不少项目,团队在LSTM、Transformer上投入巨大,但预测结果始终不尽人意,最后发现症结竟在于对异常值敏感的MSE(均方误差)损失函数。也遇到过需求波动剧烈的销量预测场景,一个简单的切换,从MSE换成Huber损失,模型的稳健性就得到了质的提升。这14种损失函数,每一种都对应着不同的数据特性、业务假设和优化目标。理解它们,就是理解如何为你的预测模型“量身定制”一套最合适的评价和优化准则。本文将带你深入剖析这14种损失函数,从最基础的原理到最实战的选择策略,让你在面对下一个时间序列预测任务时,能胸有成竹地做出最明智的选择。
2. 损失函数的核心逻辑与分类框架
在深入每个函数之前,我们必须建立一个清晰的认知框架。时间序列预测的损失函数并非随意堆砌的数学公式,其设计背后遵循着深刻的统计思想和业务逻辑。我们可以从几个维度对它们进行分类和理解。
2.1 误差敏感性:如何处理“异常点”?
这是选择损失函数时首要考虑的问题。时间序列数据中常常包含异常值(Outliers),可能是数据采集错误,也可能是真实的极端事件(如促销、断货、黑天鹅事件)。不同的损失函数对异常值的“容忍度”天差地别。
- 高敏感性损失函数:如均方误差(MSE),它对大误差项施加了平方惩罚。这意味着一个巨大的异常值所产生的损失,会淹没大量正常样本的贡献,迫使模型为了拟合少数异常点而扭曲整体趋势。这在业务上可能意味着,为了预测一次百年一遇的销量高峰,模型牺牲了日常95%场景的预测精度。
- 稳健性损失函数:如平均绝对误差(MAE)、Huber损失、分位数损失。MAE对误差取绝对值,对大误差的惩罚是线性的,因此受异常值影响较小。Huber损失则更聪明,它在误差较小时采用平方项以保证可导性和收敛效率,在误差较大时切换为线性项以抵抗异常值干扰。
选择的关键在于业务目标:你更关心预测的整体偏差,还是必须捕捉每一个极端事件?对于金融风险预测,漏掉一次极端波动可能是灾难性的;而对于日常能耗预测,整体趋势的准确性更为重要。
2.2 误差方向性:是否需要区分“高估”与“低估”?
在许多业务场景中,预测偏高和预测偏低的代价是不同的。这引出了损失函数的另一个关键属性:对称性。
- 对称损失函数:如MSE、MAE。预测值比真实值高10个单位,或低10个单位,产生的损失是相同的。这适用于预测误差代价双向对称的场景,如气温预测。
- 非对称损失函数:如分位数损失(Quantile Loss)、Tilted Loss。这是时间序列预测中的“大杀器”。例如,在库存管理中,高估需求(导致库存积压、资金占用)和低估需求(导致缺货、销售损失)的成本截然不同。分位数损失允许我们指定一个分位数τ(如τ=0.9),让模型倾向于做出一个“有90%把握真实值不会超过”的预测值,即一个偏保守的高估预测,这对于设置安全库存水平极其有用。
2.3 概率性预测:从“一个值”到“一个分布”
传统预测输出一个具体的点估计值。但更高级的预测需要衡量不确定性。概率性预测损失函数评估的是预测分布与真实数据分布之间的差异。
- 连续概率分布:如连续分级概率评分(CRPS)。它不仅衡量预测值的准确性,还衡量预测分布(如高斯分布)的锐度(Sharpness)和校准度(Calibration)。一个好的概率预测应该既准确(分布中心接近真实值)又自信(分布不能太宽)。CRPS是评估概率预测综合性能的金标准之一。
- 分位数预测:通过优化分位数损失,可以同时输出多个分位点的预测值(如P10, P50, P90),从而天然地形成一个非参数的概率预测区间。这种方法更灵活,不依赖于对数据分布形式的强假设。
2.4 其他特殊考量
- 可导性与优化效率:MAE在零点不可导,这可能影响某些基于梯度下降的优化器的稳定性(尽管深度学习框架通常能处理)。MSE处处可导,优化起来更平滑高效。
- 尺度相关性:MSE是尺度相关的,其数值大小与数据本身量纲的平方有关,不利于不同量纲数据集之间的比较。平均绝对百分比误差(MAPE)是尺度无关的,以百分比形式表示误差,更直观,但它对零值或接近零的真实值有严重缺陷。
- 多步预测与累积误差:在多步滚动预测中,每一步的误差会累积影响下一步。有些复杂的损失函数会尝试直接优化多步预测的整体轨迹相似度,如考虑预测序列与真实序列动态时间规整(DTW)距离的损失,但这通常计算成本较高。
理解了这个分类框架,我们就能像在工具箱中挑选合适工具一样,根据具体任务的数据特性和业务需求,快速锁定候选的损失函数集合。
3. 14种损失函数深度解析与实战指南
接下来,我们将这14种损失函数分为四大类,逐一进行深度解析,并提供清晰的计算公式、直观的代码示例(以PyTorch为例)和关键的选择指南。
3.1 基础对称损失函数
这类函数是预测任务的基石,对称且易于理解。
3.1.1 均方误差 (MSE, L2 Loss)
- 公式:( MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 )
- 核心特性:对异常值高度敏感(平方放大效应),处处可导,优化效率高。其最优解对应于真实值的条件期望(均值)。
- 适用场景:数据噪声服从高斯分布、异常值较少、且大误差需要被严重惩罚的场景。例如,物理传感器数据预测。
- PyTorch实现与注意:
import torch.nn as nn mse_loss = nn.MSELoss() loss = mse_loss(prediction, target)注意:MSE损失的值可能非常大,特别是在数据量纲大的时候。在训练初期,巨大的损失值可能导致梯度爆炸。一个实用的技巧是对目标值进行标准化(如Z-Score),或者使用梯度裁剪(
torch.nn.utils.clip_grad_norm_)。
3.1.2 平均绝对误差 (MAE, L1 Loss)
- 公式:( MAE = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i| )
- 核心特性:对异常值鲁棒(线性惩罚),在零点不可导,但其次梯度可用于优化。其最优解对应于真实值的中位数。
- 适用场景:数据中包含显著异常值,且业务上更关心整体平均偏差而非个别极端错误的场景。例如,含有偶发噪声的交通流量预测。
- PyTorch实现:
mae_loss = nn.L1Loss() loss = mae_loss(prediction, target)
3.1.3 均方根误差 (RMSE)
- 公式:( RMSE = \sqrt{MSE} )
- 核心特性:本质上是MSE的平方根,因此继承了MSE对异常值敏感的特性。但其量纲与原始数据一致,解释性比MSE更强。
- 重要区别:RMSE通常不作为训练时的损失函数,而是作为模型评估指标。因为平方根运算在零点不可导,且会改变损失函数的梯度景观,可能使优化过程复杂化。我们通常用MSE训练,用RMSE汇报结果。
- 适用场景:模型性能的最终评估,需要与目标值同一量纲的误差度量时。
3.1.4 平均绝对百分比误差 (MAPE)
- 公式:( MAPE = \frac{100%}{n}\sum_{i=1}^{n}\left|\frac{y_i - \hat{y}_i}{y_i}\right| )
- 核心特性:尺度无关,结果以百分比表示,非常直观,便于跨项目比较。但存在致命缺陷:当真实值 (y_i) 为零或接近零时,公式分母趋近于零,MAPE会趋于无穷大或变得极不稳定。同时,它对负误差和正误差的惩罚不对称(基于真实值归一化)。
- 适用场景:真实值严格大于零,且远离零值的场景,如销量、营收预测。必须提前进行数据清洗,过滤掉零值或极小的值。
- PyTorch实现与改进:
def mape_loss(pred, target, epsilon=1e-8): # 添加一个极小值epsilon防止除零 percentage_error = torch.abs((target - pred) / torch.clamp(target, min=epsilon)) return torch.mean(percentage_error) * 100.0实操心得:MAPE的变体对称MAPE(sMAPE)在一定程度上缓解了除零问题,公式为 ( \frac{200%}{n}\sum \frac{|y-\hat{y}|}{|y|+|\hat{y}|} ),但它引入了新的问题(当预测和真实值都接近零时,误差会被放大)。在实际工业级系统中,我倾向于使用加权绝对百分比误差(WAPE)或MASE(见后文)作为更稳健的百分比类指标。
3.2 稳健性与混合损失函数
为了在MSE的优化效率和MAE的鲁棒性之间取得平衡,衍生出了这类函数。
3.2.1 Huber Loss
- 公式: [ L_{\delta}(y, \hat{y}) = \begin{cases} \frac{1}{2}(y - \hat{y})^2 & \text{for } |y - \hat{y}| \le \delta, \ \delta |y - \hat{y}| - \frac{1}{2}\delta^2 & \text{otherwise.} \end{cases} ]
- 核心特性:超参数δ是阈值。当误差绝对值小于δ时,表现为MSE(二次函数,可导平滑);大于δ时,表现为MAE(线性函数,抑制异常值)。它是MSE和MAE的平滑结合。
- 适用场景:数据中可能存在异常值,但你又不希望完全像MAE那样忽略它们的影响,同时希望保持较好的优化性能。δ需要调优,通常可设为数据标准差的倍数或通过交叉验证确定。
- PyTorch实现:
huber_loss = nn.SmoothL1Loss() # PyTorch中的SmoothL1Loss就是Huber Loss在delta=1时的特例 loss = huber_loss(prediction, target) # 自定义delta def huber_loss_custom(pred, target, delta=1.0): diff = torch.abs(pred - target) condition = diff < delta loss = torch.where(condition, 0.5 * diff ** 2, delta * diff - 0.5 * delta ** 2) return loss.mean()
3.2.2 Log-Cosh Loss
- 公式:( L(y, \hat{y}) = \sum_{i=1}^{n} \log(\cosh(y_i - \hat{y}_i)) )
- 核心特性:它是Huber Loss的一个平滑近似,处处二阶可导,计算比Huber Loss略贵。对于小误差,其行为类似于MSE((\log(\cosh(x)) \approx \frac{x^2}{2}));对于大误差,类似于MAE((\log(\cosh(x)) \approx |x| - \log(2)))。
- 适用场景:需要比Huber Loss更光滑的损失函数,且计算成本不是首要考虑因素的场景。在一些梯度优化算法中,其光滑性可能带来优势。
- PyTorch实现:
def log_cosh_loss(pred, target): diff = pred - target return torch.mean(torch.log(torch.cosh(diff + 1e-12))) # 加小值增加稳定性
3.3 分位数与非对称损失函数
这是处理业务中不对称成本的核心工具。
3.3.1 Quantile Loss (Pinball Loss)
- 公式:( L_{\tau}(y, \hat{y}) = \sum_{i=1}^{n} \max(\tau(y_i - \hat{y}_i), (\tau - 1)(y_i - \hat{y}_i)) )
- 当 (y_i \ge \hat{y}_i) (低估)时,损失 = (\tau |y_i - \hat{y}_i|)
- 当 (y_i < \hat{y}_i) (高估)时,损失 = ((1-\tau) |y_i - \hat{y}_i|)
- 核心特性:参数τ是目标分位数,范围(0,1)。τ=0.5时,退化为MAE(中位数回归)。通过设置不同的τ,可以让模型学习到条件分布的不同分位点。τ>0.5时,模型对低估惩罚更重,倾向于输出一个较高的估值(如τ=0.9用于库存安全水位);τ<0.5时则相反。
- 适用场景:任何需要风险感知、非对称成本或构建预测区间的场景。例如:
- 零售库存:τ=0.95预测,确保95%的情况下不会缺货。
- 金融风险:τ=0.05预测,评估下行风险(VaR)。
- 能源需求:同时预测P10, P50, P90,形成概率预测区间。
- PyTorch实现:
def quantile_loss(pred, target, tau=0.5): diff = target - pred loss = torch.where(diff >= 0, tau * diff, (tau - 1) * diff) return torch.mean(loss) # 多分位数输出:模型最后一层输出多个值,分别计算损失并求和
3.3.2 Tilted Loss
- 说明:Tilted Loss 与 Quantile Loss 在数学上是等价的,只是表述方式不同。它直接体现了“倾斜”或不对称惩罚的思想。因此,其实现和应用场景与Quantile Loss完全一致。
3.4 高级与复合损失函数
这类函数用于解决更复杂或更专业的预测问题。
3.4.1 平均绝对标度误差 (MASE)
- 公式:( MASE = \frac{MAE_{model}}{MAE_{naive}} )
- 其中,(MAE_{naive}) 是“朴素预测”(如季节性朴素预测:用上一周期的同期值作为本期预测)在样本外测试集上的MAE。
- 核心特性:这是一个评估指标,而非直接用于训练的损失函数。它是尺度无关的,且具有解释性:MASE < 1 表示你的模型比朴素预测基准要好;MASE > 1 则表示比基准还差。它对数据的缩放不敏感,且能处理零值。
- 适用场景:作为时间序列预测模型的最终评估指标,尤其适用于比较不同数据集上的模型性能,或判断一个模型是否具有实际预测价值(是否击败了简单基准)。
- 计算示例:
def calculate_mase(y_true, y_pred, y_train, seasonality=1): # y_train: 用于计算朴素预测的训练数据 naive_forecast = y_train[-len(y_true)-seasonality:-seasonality] # 季节性朴素预测 mae_model = np.mean(np.abs(y_true - y_pred)) mae_naive = np.mean(np.abs(y_true - naive_forecast)) return mae_model / mae_naive
3.4.2 连续分级概率评分 (CRPS)
- 概念:用于评估概率预测(输出一个累积分布函数F)与真实观测值y之间差异的积分评分规则。可以理解为概率预测界的“MAE”。
- 公式:( CRPS(F, y) = \int_{-\infty}^{\infty} (F(x) - \mathbb{1}_{x \ge y})^2 dx )
- 核心特性:同时评估预测的校准度(预测分布是否与观测分布一致)和锐度(预测分布是否集中)。完美的预测是预测分布锐化为真实值处的脉冲函数。对于高斯分布预测(均值μ,标准差σ),有解析解:( CRPS(N(\mu, \sigma^2), y) = \sigma [ \frac{y-\mu}{\sigma} (2\Phi(\frac{y-\mu}{\sigma}) - 1) + 2\phi(\frac{y-\mu}{\sigma}) - \frac{1}{\sqrt{\pi}} ] ),其中Φ和φ是标准正态的CDF和PDF。
- 适用场景:评估并优化输出概率分布(如高斯分布参数)的模型,例如DeepAR、概率性Transformer等。
- PyTorch实现(高斯分布):
import torch.distributions as dist def crps_gaussian(mu, sigma, target): dist = dist.Normal(mu, sigma) std_normal = dist.Normal(0, 1) z = (target - mu) / sigma crps = sigma * (z * (2 * std_normal.cdf(z) - 1) + 2 * std_normal.log_prob(z).exp() - 1/torch.sqrt(torch.tensor(torch.pi))) return crps.mean()
3.4.3 动态时间规整 (DTW) Loss
- 概念:DTW是一种衡量两个长度可能不同的时间序列之间相似性的算法,通过非线性对齐来找到最小距离路径。DTW Loss 直接最小化预测序列与真实序列的DTW距离。
- 核心特性:对时间轴的扭曲(如相位偏移、速度变化)不敏感,更关注序列形状的相似性。但DTW本身不可导,需要使用软化版本(如Soft-DTW)或基于DTW距离的次梯度方法才能融入深度学习训练框架。计算复杂度高(O(n²))。
- 适用场景:预测序列与真实序列可能存在非线性的时间错位,且形状相似性比逐点对齐更重要的任务。例如,语音识别中同一单词的不同发音,或某些具有弹性时间模式的运动传感器数据预测。
- 注意事项:除非必要,否则慎用。计算开销大,且可能学出“懒惰”的预测(例如,将序列预测为一条水平线,因为它与任何形状的DTW距离都可能不大)。
3.4.4 基于分位数的区间损失 (如 Interval Score)
- 概念:这不是一个单一的损失函数,而是一类旨在直接优化预测区间质量的损失。例如,给定一个目标置信水平(如90%),我们希望预测区间(由低分位数 ( \hat{y}{low} ) 和高分位数 ( \hat{y}{high} ) 界定)既窄(锐利)又能覆盖指定比例的真实值(校准)。
- 一种常见形式(分位数加权求和):同时优化多个分位数损失,例如同时优化τ=0.05和τ=0.95的Quantile Loss,以形成90%的预测区间。损失函数为两者的加权和:( L = w_1 * L_{0.05} + w_2 * L_{0.95} )。通过调整权重,可以权衡区间宽度和覆盖率。
- 更复杂的评分规则:如区间评分(Interval Score),它直接惩罚区间宽度,并对未覆盖的真实值施加额外惩罚。可用于模型评估或作为损失函数。
- 适用场景:当业务明确要求特定置信水平的预测区间,并且希望模型直接学习生成高质量的区间时。
3.4.5 平滑平均绝对百分比误差 (sMAPE)
- 公式:( sMAPE = \frac{200%}{n} \sum_{i=1}^{n} \frac{|y_i - \hat{y}_i|}{|y_i| + |\hat{y}_i|} )
- 核心特性:试图解决MAPE除零问题,且结果在0%到200%之间。但它引入了新的不对称性:当预测值和真实值都接近零时,即使绝对误差很小,sMAPE也会接近100%,这可能会扭曲模型优化方向。
- 评价:学术界和业界对其争议较大。虽然在一些比赛中被使用,但许多专家建议避免将其作为主要评估指标或损失函数。MASE或WAPE通常是更好的选择。
3.4.6 均方对数误差 (MSLE)
- 公式:( MSLE = \frac{1}{n}\sum_{i=1}^{n}(\log(y_i+1) - \log(\hat{y}_i+1))^2 )
- 核心特性:本质上是对目标值取对数后计算MSE。它对低估的惩罚比对高估的惩罚更重(因为对数函数在小于1时变化更陡峭)。同时,它对数值的相对误差更敏感,而非绝对误差。
- 适用场景:目标值具有指数增长趋势或范围很大(多个数量级)的时间序列,例如病毒传播数量、网站流量预测。取对数后,数据尺度被压缩,模型更容易学习。
- PyTorch实现:
def msle_loss(pred, target): return nn.MSELoss()(torch.log1p(pred), torch.log1p(target)) # log1p = log(x+1)注意:使用MSLE要求预测值和真实值都必须是非负的。
torch.log1p比torch.log(x+1)在数值上更稳定。
4. 实战选择策略与组合应用指南
了解了所有“武器”后,如何在实战中做出选择?以下是一套系统的决策流程和高级技巧。
4.1 分步决策流程图
面对一个时间序列预测任务,你可以遵循以下路径进行损失函数选型:
第一步:明确业务需求与误差代价
- 问题:预测误差的代价是否对称?高估和低估哪个更严重?
- 是(非对称)-> 转向分位数损失(Quantile Loss),根据代价方向选择τ(τ>0.5防低估,τ<0.5防高估)。考虑是否需要输出预测区间(多τ组合)。
- 否(对称)-> 进入第二步。
第二步:诊断数据中的异常值
- 通过箱线图、3σ原则等检查数据。
- 异常值多且影响需抑制-> 优先考虑MAE、Huber Loss。
- 异常值少或需被重点捕捉-> 优先考虑MSE。
- 不确定或想折中-> 尝试Huber Loss或Log-Cosh Loss,并通过验证集调参(如Huber的δ)。
第三步:审视数据分布与尺度
- 数据跨度大(多个数量级)-> 考虑使用MSLE(需确保数据非负),或先对数据做对数变换,再用MSE/MAE。
- 数据包含零或接近零的值->避免使用MAPE。考虑使用MASE(作为评估指标)或对数据做适当的平移变换。
- 需要概率性预测-> 考虑使用CRPS作为损失函数(如果模型输出分布参数),或使用分位数损失生成分位数预测。
第四步:考虑序列对齐问题
- 预测序列与真实序列是否存在固定的相位差或弹性形变?
- 是,且形状匹配比逐点匹配更重要-> 可探索DTW Loss(注意计算成本)。
- 否-> 使用基于逐点误差的损失函数即可。
4.2 损失函数组合与加权策略
单一损失函数有时无法满足复杂目标,组合使用是高级玩法。
- 多目标组合:
总损失 = α * Loss1 + β * Loss2 + ...- 案例1:点预测+区间预测:
Loss = MSE + γ * QuantileLoss_0.05 + γ * QuantileLoss_0.95。MSE保证中心趋势准确,分位数损失塑造90%预测区间。γ用于控制区间宽度的惩罚强度。 - 案例2:精度+平滑性:
Loss = MAE + λ * SmoothnessLoss。其中平滑性损失可以是预测序列二阶差分的L2范数,用于抑制预测结果的剧烈抖动,这在产能或资源规划中很有用。
- 案例1:点预测+区间预测:
- 自适应加权:根据样本特性动态调整权重。例如,在时间序列中,对近期样本赋予更高的损失权重,让模型更关注最新趋势。
- 课程学习(Curriculum Learning):训练初期使用更平滑、更容易优化的损失(如MSE),后期切换为更贴近业务目标的损失(如分位数损失),帮助模型稳定收敛。
4.3 模型评估指标的选择
训练损失函数 ≠ 模型评估指标。评估指标应最终反映业务价值。
- 核心指标:建议始终计算MASE。它是一个稳健、可解释的基准对比指标。
- 辅助指标:
- 对称需求:报告RMSE(量纲一致)和MAE(鲁棒)。
- 非对称需求:报告针对特定方向的平均误差(如平均高估误差、平均低估误差)。
- 概率预测:报告CRPS和区间覆盖率(预测区间覆盖真实值的比例)。
- 建立基准:务必计算一个简单模型(如朴素季节性预测、线性回归)的相同评估指标。只有当你的复杂模型显著(例如,MASE降低10%以上)优于简单基准时,你的模型才具有实际部署价值。
5. 常见陷阱、调试技巧与高级考量
5.1 实战中踩过的“坑”
- 盲目使用MSE:这是最常见的错误。尤其是在金融、供应链等领域,数据中的“尖峰”会彻底破坏MSE模型的性能。第一件事永远是可视化你的数据,检查异常值。
- 在包含零值的数据上使用MAPE:这会导致损失计算崩溃或产生极大值。如果业务方坚持要看百分比误差,使用WAPE(加权绝对百分比误差):
sum(|y-\hat{y}|) / sum(|y|),或解释MASE的含义。 - 分位数损失τ设置不当:τ=0.5就是中位数回归,不是“平均”预测。如果你想要一个“平均”水平的预测,应该使用MSE(近似均值)或MAE(中位数)。τ的选择必须基于业务代价函数。例如,缺货成本是积压成本的三倍,那么τ应该设置为 3/(1+3) = 0.75。
- 忽略损失函数的尺度:MSE和MAE的数值大小依赖于数据本身。在训练时,如果损失值初始非常大,可能导致梯度爆炸。对输入特征和目标值进行标准化(如归一化到[0,1]或Z-Score标准化)是标准预处理步骤,这能稳定训练过程。
- 评估指标与损失函数不一致:如果你用分位数损失训练模型(为了得到区间),却只用RMSE评估中心点的精度,这是不匹配的。评估指标应与你最终的业务目标对齐。
5.2 调试技巧:当模型不收敛或效果差时
- 检查损失曲线:观察训练集和验证集损失。如果训练损失下降但验证损失上升,可能是过拟合。如果两者都震荡不降,可能是学习率太高、损失函数选择不当(如不可导点问题)或数据预处理有问题。
- 可视化预测结果:将验证集上的预测值和真实值画出来。看错误模式:是系统性偏高/偏低?还是对峰值反应不足?这能直接指导你调整损失函数(如切换到非对称损失)或模型结构。
- 进行消融实验:固定其他所有超参数和模型结构,只更换损失函数,在验证集上比较性能。这是最直接的验证方法。
- 梯度检查:对于自定义的复杂损失函数(如DTW Loss的软化版本),使用
torch.autograd.gradcheck验证梯度计算的正确性。错误的梯度会导致模型无法学习。
5.3 超越损失函数:与之相关的其他要素
损失函数不是孤立的,它与模型架构、优化器紧密相关。
- 优化器选择:对于基于梯度的优化器(如Adam),损失函数最好处处可导或具有次梯度。MAE在零点有次梯度,实践中Adam等优化器能处理。但对于更复杂的损失,可能需要选择更稳健的优化器。
- 模型最后一层:损失函数的选择可能影响输出层的设计。
- MSE/MSLE:通常接一个线性层(无激活函数),输出任意实数。
- MAE/Quantile Loss:同样接线性层。
- 需要输出正数(如使用MSLE或预测计数):可以在线性层后加
Softplus或ReLU激活函数。 - 概率预测(如高斯分布):模型需要输出两个参数(均值μ和标准差σ)。μ通常用线性层,σ为了保证为正,需通过
Softplus或exp变换。
- 损失函数与不确定性量化:分位数损失和CRPS损失是直接进行不确定性量化的工具。在现代时间序列预测中,提供点预测+不确定性区间已成为标准做法。