文章目录
- 1. 神经网络与最优化
- 2. 损失和损失函数
- 3. 最大似然与最大似然估计(MLE)
- 4. 最大似然和交叉熵
- 5. 损失函数的经验选择
- 5.1 回归问题
- 5.2 分类问题
- 6. 损失函数实现
- 6.1 MSE
- 6.2 cross entropy
- 7. TensorFlow.Keras 配置
- 7.1 回归问题
- 7.1.1 MSE
- 7.1.2 MSLE
- 7.1.3 MAE
- 7.2 二分类问题
- 7.2.1 Binary Crossentropy
- 7.2.2 Hinge Loss
- 7.2.3 Squared Hinge Loss
- 7.3 多分类问题
- 7.3.1 Multi-Class Cross-Entropy Loss
- 7.3.2 Sparse Multiclass Cross-Entropy Loss
- 7.3.3 Kullback Leibler Divergence Loss
神经网络是使用随机梯度下降训练的,这就要求在设计和配置模型时选择合适的损失函数。损失函数的选择正确与否关乎模型性能表现的好坏,下面讨论如何为模型选择合适的损失函数。
1. 神经网络与最优化
深度学习神经网络学习将训练数据中的一组输入映射到一组输出。
因为有未知数太多,所以无法计算出神经网络的理想权重,即没有解析解。取而代之的是将学习问题转换为搜索或优化问题(optimization problem),并使用一种算法引导(navigate)模型选择可能使用的权重集(解空间),以做出良好的预测。
通常,使用随机梯度下降优化算法训练神经网络模型,并使用误差算法的反向传播更新权重。梯度下降中的“梯度”是指误差梯度(error gradient)。使用具有给定权重集的模型进行预测,并计算这些预测的误差。梯度下降算法试图改变权重,以使下一次评估可以减少误差,这意味着优化算法正在引导误差的梯度(或斜率(slope))。
由此可知,训练神经网络的过程就是求解最优化的过程,接下来讨论如何计算给定权重的误差。
2. 损失和损失函数
在优化算法中,用于评估候选解(即一组权重)的函数称为目标函数(objective function)。
针对不同的问题,可能需要最大化或最小化目标函数,即找出具有最高或最低得分的候选解决方案。通常,使用神经网络将误差最小化。目标函数通常称为成本函数(cost function)或损失函数(loss function),由损失函数计算出的值简称为损失(loss)。
损失函数有重要作用,因为它必须将模型的表现精简为一个标量值,以使该数字的改善作为表征模型变好的标志。因此,重要的是损失函数应该强有力地表征我们的设计目标。如果选择不合适的误差函数并获得不符合预期的结果,则表示错误地指定了损失函数。
接下来看看常用的损失函数有哪些。
3. 最大似然与最大似然估计(MLE)
有许多函数可用于估计神经网络中一组权重的误差。不变的是更期望这样一种函数:候选解空间(权重集)的空间映射到高维平滑的空间中,优化算法可以通过对模型权重的迭代更新来合理地引导。
最大似然估计(Maximum likelihood estimation,MLE)是用于从历史训练数据中找到参数的最佳统计估计的推理框架:这正是正在尝试使用神经网络进行的工作。最大似然试图通过最大化从训练数据得出的似然函数来找到参数的最优值。
有一个带有一个或多个输入变量的训练数据集,并且需要一个模型来估计模型权重参数,以最佳地将输入示例映射到输出或目标变量。给定输入,模型将尝试做出与目标变量的数据分布相匹配的预测。在最大可能性下,损失函数估计模型做出的预测分布与训练数据中目标变量的分布有多接近。
一种解释最大似然估计的方法是,将其视为将训练集定义的经验分布(empirical distribution)[…]与模型分布之间的差异最小化,而两者之间的差异程度则由KL散度(KL divergence)衡量。[…]最小化KL散度恰好对应于最小化分布之间的交叉熵(cross-entropy)。
将最大似然性用作估计神经网络和机器学习的模型参数(权重)的框架的好处通常是,随着训练数据集中样例数量的增加,模型参数的估计值会提高。这种属性称为一致性(consistency)。在适当的条件下,最大似然估计器具有一致性[…]的属性,这意味着随着训练样本的数量接近无穷大,参数的最大似然估计会收敛到该参数的真实值。
4. 最大似然和交叉熵
在框架最大似然下,使用交叉熵测量两个概率分布之间的误差。
在对将输入变量映射到类标签的分类问题建模时,可以将问题建模为预测样本属于每个类的概率。在二元分类问题中,有两个类别,因此可以预测该样本属于第一类的概率。在多类别分类的情况下,可以预测样本属于每个类别的概率。在训练数据集中,属于给定类别的示例的概率为1或0(one-hot编码过之后)。
因此,在最大似然估计下,将寻求一组模型权重,以最小化给定数据集的模型的预测概率分布与训练数据集中的概率分布之间的差异。这称为交叉熵(cross-entropy)。在大多数情况下,参数模型定义了分布[…],仅使用最大似然原理。这意味着将训练数据与模型预测之间的交叉熵用作成本函数。
从技术上讲,交叉熵来自信息理论领域,其单位为bits。它用于估计估计的概率分布和预测的概率分布之间的差异。在预测数量的回归问题中,通常使用均方误差(MSE)损失函数代替。(最近在做时间序列预测时,发现MSE的效果很差,反而MAE的效果更好,如果有做相似任务的同学可以试试。)
在最大似然估计的框架下,并假设目标变量为高斯分布,均方误差可以认为是模型预测的分布与目标变量的分布之间的交叉熵。许多作者使用“交叉熵”一词来具体识别伯努利分布或softmax分布的负对数似然,但这是用词不当。由负对数可能性组成的任何损失都是训练集定义的经验分布与模型定义的概率分布之间的交叉熵。例如,均方误差是经验分布和高斯模型之间的交叉熵。
因此,当使用最大似然估计框架时,使用交叉熵损失函数,这在实践中通常意味着分类问题中常用交叉熵损失函数(binary or categorical cross-entropy)和回归问题中常用均方误差损失函数(mse)。几乎普遍地,深度学习神经网络是在最大似然框架下使用交叉熵作为损失函数进行训练的。
这些算法更改之一是用损失函数的交叉熵族代替均方误差。均方误差在1980年代和1990年代很流行,但是随着思想在统计界和机器学习界之间的传播,逐渐被交叉熵损失和最大似然原理所取代。
最大似然法几乎被普遍采用,这不仅是因为其理论框架,而且主要是因为它产生的结果。具体来说,用于分类的神经网络在输出层中使用S形或softmax激活函数,可以使用交叉熵损失函数更快,更可靠地学习。交叉熵损失的使用极大地改善了具有S型和softmax输出的模型的性能,Sigmoid输出和softmax输出以前在使用均方误差损失时饱受饱和,并且学习缓慢。
5. 损失函数的经验选择
损失函数的选择与神经网络输出层中使用的激活函数直接相关。
5.1 回归问题
1.数量预测:MSE
2.时间序列预测:可以尝试MAE
输出层激活函数选择均使用线性激活函数,在Keras中的设置为 activation='linear'
。
5.2 分类问题
1.二分类:binary cross entropy
2.多分类:categorical cross entropy
二分类输出层的激活函数使用sigmoid;多分类使用softmax。
6. 损失函数实现
6.1 MSE
均方误差损失(简称MSE)是根据预测值与实际值之间的平方差的平均值计算得出的。无论预测值和实际值的符号如何,结果始终为正,理想值为0.0。
# calculate mean squared error
def mean_squared_error(actual, predicted):
sum_square_error = 0.0
for i in range(len(actual)):
sum_square_error += (actual[i] - predicted[i])**2.0
mean_square_error = 1.0 / len(actual) * sum_square_error
return mean_square_error
sklearn 实现:sklearn.metrics.mean_squared_error
6.2 cross entropy
交叉熵损失经常简称为交叉熵(cross-entropy),对数损失(logarithmic loss),log loss。
交叉熵损失最小化,较小的值代表比较大的值更好的模型。预测完美概率的模型的交叉熵或对数损失为0.0。
from math import log
# calculate categorical cross entropy
def categorical_cross_entropy(actual, predicted):
sum_score = 0.0
for i in range(len(actual)):
for j in range(len(actual[i])):
sum_score += actual[i][j] * log(1e-15 + predicted[i][j])
mean_sum_score = 1.0 / len(actual) * sum_score
return -mean_sum_score
sklearn实现:sklearn.metrics.log_loss
7. TensorFlow.Keras 配置
7.1 回归问题
7.1.1 MSE
MSE损失是用于回归问题的默认损失函数。在数学上,如果目标变量的分布是高斯分布,则是在最大似然推理框架下的首选损失函数。该损失函数是首先进行评估的函数,如果表现不好再更改。
计算均方误差作为预测值与实际值之间平方差的平均值。无论预测值和实际值的符号如何,结果始终为正,理想值为0.0。平方表示较大的错误比较小的错误导致更多的错误,这意味着该模型将因犯较大的错误而受到惩罚。
在Keras中,可以使用 'mse'
或 'mean_squared_error'
指定均方误差损失函数(MSE)。
...
model.add(Dense(1, activation='linear'))
model.compile(loss='mean_squared_error')
7.1.2 MSLE
在回归问题中,目标值可能有分散的值,并且在预测较大的值时,不希望像均方误差那样对模型进行比较大的惩罚。可以先计算每个预测值的自然对数,然后计算均方误差。这称为均方对数误差损失(Mean Squared Logarithmic Error Loss),或简称为MSLE。它具有放松较大预测值中较大差异的惩罚效果的作用。作为一种损失度量,当模型直接预测未缩放的数量时,它可能更合适。
在Keras中,可以使用 'mean_squared_logarithmic_error'
指定该损失函数。
...
model.add(Dense(1, activation='linear'))
model.compile(loss='mean_squared_logarithmic_error', optimizer=opt, metrics=['mse'])
7.1.3 MAE
在某些回归问题上,目标变量的分布可能大部分为高斯分布,但也可能有离群值,例如,远离平均值的大或小值。在这种情况下,平均绝对误差或MAE损失是一种适当的损失函数,因为它对异常值更为稳健。计算为实际值和预测值之间的绝对差的平均值。
在Keras中,可以使用 'mean_absolute_error'
来指定该损失函数。
...
model.add(Dense(1, activation='linear')
model.compile(loss='mean_absolute_error', optimizer=opt, metrics=['mse'])
7.2 二分类问题
7.2.1 Binary Crossentropy
交叉熵是用于二分类问题的默认损失函数。它适用于二分类,其中目标值在集合
交叉熵将计算一个分数,该分数总结了预测类1的实际概率分布与预测概率分布之间的平均差。该分数被最小化,并且理想的交叉熵值为0。
...
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
7.2.2 Hinge Loss
二分类问题的交叉熵的替代方法是折页损失函数(Hinge Loss),主要是为与支持向量机(SVM)模型一起使用而开发的。它适用于目标值位于集合
必须将网络的输出层配置为具有带双曲正切激活函数的单个节点,该函数能够输出范围为 。
...
model.add(Dense(1, activation='tanh'))
model.compile(loss='hinge', optimizer=opt, metrics=['accuracy'])
7.2.3 Squared Hinge Loss
折页损失功能具有许多扩展,通常是使用SVM模型进行研究的主题。流行的扩展称为平方折页损失,它仅计算分数折页损失的平方。它具有使误差函数的表面变平滑并使它在数值上更易于使用的效果。如果使用折页损失确实可以在给定的二元分类问题上实现更好的性能,则平方折页损失可能很合适。与使用折页损失函数一样,必须将目标变量修改为具有
...
model.add(Dense(1, activation='tanh'))
model.compile(loss='squared_hinge', optimizer=opt, metrics=['accuracy'])
7.3 多分类问题
7.3.1 Multi-Class Cross-Entropy Loss
交叉熵是用于多类分类问题的默认损失函数。在这种情况下,可用于目标值位于
在Keras中,可以通过设置 'categorical_crossentropy'
来指定该损失函数。该函数要求输出层配置有n个节点(每个类别一个),在这种情况下配置softmax激活函数,以便预测每个类别的概率。
...
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
7.3.2 Sparse Multiclass Cross-Entropy Loss
将交叉熵与带有大量标签的分类问题一起使用时,造成性能下降的原因可能是one-hot编码。例如,预测词汇表中的单词可能具有数以万计的类别,每个标签一个。这可能意味着每个训练样本的目标元素可能需要一个带有成千上万个零值的one-hot向量,这需要大量内存。稀疏交叉熵(Sparse cross-entropy)通过执行相同的误差交叉熵计算来解决此问题,而无需在训练之前将目标变量进行one-hot编码。
...
model.add(Dense(3, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
7.3.3 Kullback Leibler Divergence Loss
Kullback Leibler散度或简称KL散度,是一种概率分布与基准分布之间的差异的度量。KL散度损失为0表明分布是相同的。在实践中,KL发散的行为与交叉熵非常相似。如果使用预测的概率分布来近似所需的目标概率分布,它将计算丢失多少信息(以bits为单位)。
这样,在使用学习比简单的多类分类逼近更复杂函数的模型时,例如在使用自动编码器来学习必须在模型下的密集特征表示的情况下,更常用KL散度损失函数。重建原始输入。在这种情况下,KL散度损失将是首选。但是,它可以用于多类分类,在这种情况下,它在功能上等效于多类交叉熵。
model.add(Dense(3, activation='softmax'))
model.compile(loss='kullback_leibler_divergence', optimizer=opt, metrics=['accuracy'])