损失函数¶
损失函数定义了拟合结果和真实结果之间的差异,作为优化的目标直接关系模型训练的好坏,很多研究工作的内容也集中在损失函数的设计优化上。 Paddle 中提供了面向多种任务的多种类型的损失函数,以下列出了一些 Paddle 中包含的较为常用的损失函数。
回归¶
平方误差损失(squared error loss)使用预测值和真实值之间误差的平方作为样本损失,是回归问题中最为基本的损失函数。 API Reference 请参考 cn_api_paddle_nn_functional_square_error_cost。
平滑 L1 损失(smooth_l1 loss)是一种分段的损失函数,较平方误差损失其对异常点相对不敏感,因而更为鲁棒。 API Reference 请参考 cn_api_paddle_nn_functional_smooth_l1_loss。
分类¶
交叉熵(cross entropy) 是分类问题中使用最为广泛的损失函数,Paddle 中提供了接受归一化概率值和非归一化分值输入的两种交叉熵损失函数的接口,并支持 soft label 和 hard label 两种样本类别标签。 API Reference 请参考 cn_api_paddle_nn_functional_cross_entropy。
多标签分类¶
对于多标签分类问题,如一篇文章同属于政治、科技等多个类别的情况,需要将各类别作为独立的二分类问题计算损失,Paddle 中为此提供了 binary_cross_entropy 损失函数, API Reference 请参考 cn_api_paddle_nn_functional_binary_cross_entropy。
大规模分类¶
对于大规模分类问题,通常需要特殊的方法及相应的损失函数以加速训练,常用的方法有 噪声对比估计(Noise-contrastive estimation,NCE) 和 层级 sigmoid 。
噪声对比估计通过将多分类问题转化为学习分类器来判别数据来自真实分布和噪声分布的二分类问题,基于二分类来进行极大似然估计,避免在全类别空间计算归一化因子从而降低了计算复杂度。
层级 sigmoid 通过二叉树进行层级的二分类来实现多分类,每个样本的损失对应了编码路径上各节点二分类交叉熵的和,避免了归一化因子的计算从而降低了计算复杂度。
这两种方法对应的损失函数在 Paddle 中均有提供,API Reference 请参考 cn_api_paddle_static_nn_nce 和 cn_api_paddle_nn_functional_hsigmoid_loss。
序列分类¶
序列分类可以分为以下两种:
序列分类(Sequence Classification)问题,整个序列对应一个预测标签,如文本分类。这种即是普通的分类问题,可以使用 cross entropy 作为损失函数。
时序分类(Temporal Classification)问题,需要对未分割的序列进行标注,如语音识别。对于这种时序分类问题,CTC(Connectionist Temporal Classification) 损失函数不需要对齐输入数据及标签,可以进行端到端的训练,Paddle 提供了 warpctc 的接口来计算相应的损失,API Reference 请参考 cn_api_paddle_nn_functional_ctc_loss。