Python-DQN-L1、L2和Huber损失

1.L1损失

L1损失,也称为平均绝对误差(Mean Absolute Error,MAE),是一种在回归问题中使用的损失函数,用于衡量预测值与实际值之间的绝对差异。

L1损失的数学定义如下: L1损失 = |预测值 – 实际值|

与均方误差(MSE)不同,L1损失在计算误差时不使用平方,而是直接使用绝对值。这意味着L1损失对于预测值与实际值之间的较大误差更加敏感,因此对于存在离群值或异常值的数据集,L1损失可以更加鲁棒。

L1损失在某些情况下可能比MSE更适用,例如在需要对误差较大的样本更加关注的场景下,或者在希望使用更加鲁棒的损失函数来处理离群值的情况下。然而,与MSE相比,L1损失在数学上可能更难处理,因为它在零点处不可微分,因此在优化算法中的使用可能需要额外的处理。

2.L2损失

L2损失,也称为平方误差损失,是一种常用的回归问题中的损失函数,用于度量预测值与实际值之间的差异。

L2损失定义为预测值与实际值之间差值的平方,计算公式如下:

L2损失 = 0.5 * (预测值 – 实际值)^2

其中,0.5是为了方便计算梯度时的消除系数。L2损失对预测值与实际值之间的差异敏感,并且会放大较大的误差,使得模型对异常值更加敏感。

在训练回归模型时,通常使用梯度下降等优化算法来最小化L2损失,使得模型能够从训练数据中学到合适的参数,从而实现对未知数据的预测。

3.如何选择L1损失和L2损失

选择使用L1损失还是L2损失通常取决于问题的性质和数据集的特点。以下是一些一般性的指导原则,可以帮助您在选择损失函数时做出决策:

①数据集特点:如果您的数据集中存在离群值或异常值,并且您希望模型对这些值更加鲁棒,那么L1损失可能是一个更好的选择,因为它对于较大误差更加敏感。

②优化目标:如果您的优化目标是寻找一个稀疏的解,即让模型的某些权重为零,那么L1损失可能更加适用,因为它倾向于产生稀疏的解。这可以用于特征选择或模型压缩等应用。如果目标是最小化预测值与实际值之间的平方误差,那么使用L2损失可能更合适。如果目标是最小化预测值与实际值之间的绝对误差,那么使用L1损失可能更合适。

③具体问题:对于某些问题类型,如稀疏性要求较高的问题(如特征选择、稀疏建模等),L1损失可能更合适,因为它倾向于生成具有稀疏性的解。而L2损失可能会生成更平滑的解。某些问题可能对L1损失或L2损失更加敏感。例如,在图像处理中,L2损失通常用于图像生成任务,而L1损失通常用于图像修复任务。

④模型复杂度:如果您的模型较复杂,并且您希望在训练过程中对权重进行较小的惩罚,以避免过拟合,那么L2损失可能更加合适,因为它对权重的平方进行惩罚,可以限制权重的增长。

⑤模型性能:在训练过程中,L1损失可能会导致模型更容易收敛到稀疏解,但这并不一定总是好事,因为过于稀疏的模型可能会过度拟合。L2损失则对于生成更平滑的解,可能对抗过度拟合有一定的作用。

总的来说,选择使用L1损失还是L2损失应该根据具体的问题和数据集特点进行权衡。在实际应用中,可以尝试不同的损失函数,并通过交叉验证或其他评估方法来选择最合适的损失函数。另外,也可以考虑使用L1和L2损失的组合,如L1 + L2损失(称为L1/L2损失或Elastic Net损失),以综合考虑L1和L2损失的优点。

4.Huber损失

Huber损失是一种在回归问题中使用的损失函数,用于平衡均方误差(MSE)和平均绝对误差(MAE)之间的权衡。

Huber损失通过在预测值与实际值之间引入一个截断点,从而在误差较小的情况下使用平方误差,而在误差较大的情况下使用绝对误差,从而减少对异常值的敏感性。

Huber损失的数学定义如下:

当|预测值 – 实际值| <= δ时: Huber损失 = 0.5 * (预测值 – 实际值)^2

当|预测值 – 实际值| > δ时: Huber损失 = δ * |预测值 – 实际值| – 0.5 * δ^2

其中,δ是截断点,是一个超参数,用于控制Huber损失从平方误差转变为绝对误差的阈值。

Huber损失在一定程度上可以平衡MSE和MAE的优点,同时对于异常值不会像MSE那样产生较大的误差,因此在一些具有噪声或异常值的数据集上,Huber损失可以更加鲁棒地进行模型训练。

5.其他

# 输入占位符;输入是4帧大小为84x84的图像
self.tf_X = tf.placeholder(shape=[None, 84, 84, 4], dtype=tf.uint8, name="X")

这一行代码创建了一个TensorFlow的placeholder(占位符)对象,用于表示输入帧的数据。

具体解释如下:

  • tf.placeholder: 创建一个占位符,用于在后续的计算中接收输入数据。

  • shape=[None, 84, 84, 4]: 指定了占位符的形状,其中None表示在这个维度上可以接受任意数量的输入数据,8484分别表示帧的高度和宽度,4表示每个帧包含的通道数(例如,RGB图像通常有3个通道)。

  • dtype=tf.uint8: 指定了占位符的数据类型为uint8,即无符号8位整数,用于表示像素值的范围在0到255之间。

  • name="X": 指定了占位符的名称为”X”,在后续的计算中可以通过这个名称来引用这个占位符。

这里的占位符tf_X用于接收输入的帧数据,后续在模型的计算中可以通过self.tf_X来引用这个占位符,并传入实际的帧数据进行计算。

6.帧堆叠

在强化学习中,有一种常用的技术叫做 “帧堆叠”(Frame Stacking),用于将多个连续的游戏帧作为输入传递给智能体。这样做有助于智能体捕捉到游戏环境中的动态信息和运动轨迹。

在这里,输入的图像有 4 个通道,是因为使用了帧堆叠技术,将连续的 4 帧游戏帧堆叠在一起作为输入。这种做法可以帮助智能体感知到游戏环境中的运动、速度和加速度等信息,从而更好地学习到游戏的动态特征。

通常情况下,游戏帧是 RGB 彩色图像,包含了红、绿、蓝三个通道。但在这里使用了 4 个通道,可能是因为在堆叠帧时,使用了一些预处理或者特征工程的技术,将多个通道的信息合并到了一个输入中,以便于智能体更好地学习游戏环境中的状态表示。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年11月10日
下一篇 2023年11月10日

相关推荐