(28)损失度Loss的计算方法

本文详细介绍了神经网络中损失度(Loss)的四种计算方法,包括最简单的损失度计算、绝对值损失、平方损失及样本方差计算。通过实例解析各种方法的优缺点,强调了在AI项目中损失度计算的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本节将进行数据可视化,例如将Epoch训练的过程运行10000次, 每100个Epoch看一下损失度调整的程度。在Tensorflow可视化图中运行一下,Tensorflow给出了动态的损失度的曲线图,根据损失度曲线看运行的效果,这也是以后做项目的核心工作。Forward  Propagation与Back Propagation是阴阳互动的过程,在计算过程中有了损失,有损失要看到这个损失,如果看见损失而不减少损失,磨损就会非常大,所有的奋斗都是为了一个目的,要达到零磨损的状态。在计算过程中,激活函数和梯度下降的计算不一样,处理的业务不一样,导致我们计算的误差函数也不一样。例如,最原始的误差计算函数是预测值减去真实值,将预测值和真实值进行比较,第1条记录将预测值 0.4385711425310979减去真实值0;第2条记录将预测值0.4129240972484869减去真实值1;第3条记录将预测值0.4651651378938895 减去真实值1;第4条记录将预测值0.43581722934765915 减去真实值0;

Prediction: 0.4385711425310979 while real value is0Prediction: 0.4129240972484869 while real value is1Prediction: 0.4651651378938895 while real value is1Prediction: 0.43581722934765915 while real value is0 



本章节人工智能神经网络损失度Loss的计算方法:

(1) Loss的计算方法一:最简单的损失度Loss的计算方式是把每个实例Instance计算的预测Predicted的结果减去真实值Real Value(在AI盘古案例中,根据instances的第1列,第2列在神经网络计算出的预测结果,然后减去真实值0 或者减去真实值1),然后进行累加,累加完毕后除以所有的Instances的个数。

方法一的优点:方便理解;

方法一的缺点:假设instances第1个实例[0,0]的计算的误差结果是0.3,第2个实例[0,1]的计算的误差结果是-0.5,第3个实例[1,0]的计算的误差结果是0.2,第4个实例[1,1]的计算的误差结果是0,整体的误差0.3+(-0.5)+0.2+0=0,将误差累加起来然后除以它的个数,这里instances有4个实例,因此除以4,这样计算出的误差结果为0,而0表示没误差,但实际上肯定有误差。因此,方法一不具有实用价值,没有真实的AI框架采用这种算法;


(2) Loss的计算的方法二: 方法一问题的痛点是不同的误差计算结果可能相互影响,0.3+(-0.5)+0.2+0相加将结果变成0了。但是,计算的预测值和真实值之间的误差没有所谓的正、负之分,误差就是误差,误差是指从一个地方到另一个地方的距离。为了避免方法一产生的弊端,距离最简单的方法是计算绝对值。因此,方法二的计算方法:把每个Instance计算的Predicted的结果减去Real Value后进行绝对值求值,然后累加,完毕后除以所有的Instances的个数。

方法二的优点:真实反馈出预测值和真实值的差异。

方法二的缺点:可能获得很慢的收敛Converge的过程。


(3) Loss的计算的方法三: 把每个Instance计算的Predicted的结果减去Real Value后进行平方的求值,然后累加,完毕后除以所有的Instances的个数。

方法二和方法三的区别在于:方法二进行绝对值计算就能真实反馈出预测值和真实值的误差,为什么还要进行平方计算? 是因为平方计算将误差放大了。例如,TensorFlow的可视化图中,Regression的计算有一个收敛的过程,如果不能夸大化反馈误差,那系统每次的计算的误差很小,进行梯度计算的时候,每次的改变量很小,调整的速度就很慢。Back Propagation算法是根据误差的差值进行前面神经元责任的计算,然后进行梯度的计算。误差放大的好处在于较快的收敛速度。不过夸大误差的过程,理论上也可能过犹不及,步子跨的太大了,也可能犯错,这也是以后延伸出其他误差算法的原因。

方法三的缺点: 当数据量很大的时候,会导致很大的计算量;并且有些计算是不必要的,这和梯度下降相关,因为有些预测的值和实际值的误差在0.0001之内了,就不需要再进行计算,而有些误差很大,就很有必要计算。

 

(4) 方法四:采用样本方差的计算,该方法适合数据量比较大的时候。


本节我们使用Loss的计算方法三,即平方的计算方式,因为instances只有4条数据,没必要使用样本方差的计算。在service目录中创建LossComputation.py文件,在文件中创建一个类LossComputation。在类LossComputation中定义compute_loss方法,compute_loss方法计算损失度,传入的第一个参数是instances,将所有的数据放进去,这里没其他的数据,测试集也是训练集; 传入的第2个参数是所有的节点nodes, 传入的第3个参数是所有的权重weights。total_loss变量记录累加的误差,误差使用平方的方式。循环遍历所有的instances,计算每一个instance的误差,然后进行累加。ForwardPropagation.applyForwardPropagation静态方法没有self参数,直接调用applyForwardPropagation方法。接下来获取instance的预测值,和真实值进行比较。

predicted_value等于nodes[len(nodes) - 1].get_value(),是运算的时候获得的value,是预测值;而real_value 是instance的最后一列,是真实值。然后将预测值predicted_value 和真实值real_value相减,进行平方的计算,得到squared_error。然后将误差进行累加,计算累加的total_loss。循环所有的实例,得到最后的误差平方之和,然后除以instances的个数。循环所有的实例,得到误差平方之和,然后除以instances的个数,最后返回损失度total_losss。







### YOLOv5 中的三种损失函数 #### 1. **Classification Loss (分类损失)** 分类损失用于衡量模型预测类别与实际类别的差异。通常采用交叉熵损失(Cross-Entropy Loss),其定义如下: 对于单标签分类问题,假设共有 \( C \) 类,\( y_i \in \{0, 1\} \) 表示第 \( i \) 个样本的真实类别向量(one-hot 编码形式),而 \( p_i = [p_{i1}, ..., p_{iC}] \) 是模型对该样本属于每一类的概率分布,则交叉熵损失可以表示为: \[ L_{cls}(y, p) = -\sum_{c=1}^{C} y_c \log(p_c) \] 其中,\( y_c \) 和 \( p_c \) 分别代表真实标签和预测概率[^1]。 在多标签场景下,可能使用二元交叉熵作为替代方案。这种损失能够有效评估模型对目标物体类型的识别能力。 --- #### 2. **Localization Loss (定位损失)** 定位损失主要用来优化边界框的位置精。它反映了预测框 (\(b_x, b_y, b_w, b_h\)) 与真实框 (\(t_x, t_y, t_w, t_h\)) 的偏差程。常用的计算方式有两种:Smooth L1 Loss 或 MSE Loss。 **Smooth L1 Loss**: 这种方法结合了均方误差(MSE)和平滑绝对值误差的优点,在梯较大时表现更稳定。具体公式为: \[ L_{loc}(d, d') = \begin{cases} 0.5(d-d')^2 & |d-d'|<1 \\ |d-d'|-0.5 & otherwise \end{cases} \] 这里 \(d\) 和 \(d'\) 可能分别对应中心坐标偏移或者宽高比例缩放因子[^4]。 另一种常见做法是直接利用欧几里得距离来测量两者间的差距即 Mean Squared Error(MSE): \[ L_{loc}(pred, true)=\frac{1}{N}\sum_{n=1}^{N}[({x}_{true}-{x}_{pred})^2+({y}_{true}-{y}_{pred})^2]+[({w}_{true}- {w}_{pred})^2+ ({h}_{true}-{h}_{pred})^2]\] 上述两种策略各有优劣,需依据实际情况选取合适的形式. --- #### 3. **Confidence Loss (置信损失)** 置信损失旨在判断某个候选区域是否有对象存在以及该预测是否可靠。一般也基于 Binary Cross Entropy(BCE),但会额外引入 IoU 来增强区分正负样本的能力: 如果当前 anchor box 属于前景(object present), 则期望输出接近1;反之则趋近于零. \[ L_{conf}= BCE(\hat{o}_i,o_i)\quad where:\ o_i=\left\{\begin{matrix}1,&if\ object\\0,&otherwise\\\end{matrix}\right.\ ] 值得注意的是,在某些改进版本比如 GIoU-Loss 或 CIoU-Loss 中,还会进一步考虑几何关系从而提升回归效果[^3]. --- ### 区别与联系 - **区别** - Classification Loss 关注的是 "是什么" 的问题; - Localization Loss 解决 “在哪里” 的疑问; - Confidence Loss 则侧重验证是否存在有效的检测结果. - **联系** 所有这些组成部分共同构成了完整的 Object Detection Frameworks 如 YoloV5 的总体Loss Function 。它们相互配合使得网络不仅知道如何准确定位物体还能正确标注种类并给出合理的信任评分[^2]. ```python def compute_losses(pred_cls, pred_loc, pred_conf, target_cls, target_loc, target_conf): cls_loss = cross_entropy_loss(pred_cls, target_cls) loc_loss = smooth_l1_loss(pred_loc, target_loc) conf_loss = binary_cross_entropy_with_logits(pred_conf, target_conf) total_loss = cls_loss + loc_loss + conf_loss return total_loss, cls_loss.item(), loc_loss.item(), conf_loss.item() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

段智华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值