深度学习基础知识(六):神经网络基础之损失函数

这个专栏主要是想和大家分享一下深度学习的基础知识,主要是以吴恩达老师深度学习课程内容作为基础,并补充了很多其他内容希望让整体内容更加容易理解和系统化。如果想要了解具体专栏里面有什么内容的话,可以看一看我们专栏的目录,在目录里面还说明了小伙伴的分工,这些内容都是所有小伙伴们一起努力完成的,有希望和我们一起学习的的小伙伴也可以加入我们啊。另外我们还将内容以书籍的形式放到了github上,之后还会陆续上传源码实现等其他内容。我们还会分享深度学习-论文阅读专栏强化学习-基础知识专栏强化学习-任务阅读专栏,也欢迎大家关注。可能会有很多错漏,希望大家批评指正!还是那句话,不要高估一年的努力,也不要低估十年的积累,与君共勉!

3. 损失函数

3.1 定义

​ 对当前输出y和训练样本的预期值之间的误差的计算,进而用于修正函数的各种参数(如前面线性回归中的w和z)。
​ 损失函数也常被称为误差函数。

​ 损失函数的计算结果越小说明参数越准确。

3.2 常见的损失函数

L1 Loss:

  • 基本形式:计算预测值与目标值的绝对差值
    L = ∑ i = 1 n ∣ y i − y ^ i ∣ L=\sum_{i=1}^{n}\left|y_{i}-\hat{y}_{i}\right| L=i=1nyiy^i

  • pytorch实现:

    torch.nn.L1Loss(reduction='mean')
    

    关于参数

    reduction: none(不使用约简)、mean(返回loss和的平均值)、sum(返回loss的总和)。默认mean。

  • 适用场景:

    L1 Loss能处理数据中的异常值。这或许在那些异常值可能被安全地和有效地忽略的研究中很有用。如果需要考虑任一或全部的异常值,那么最小绝对值偏差是更好的选择(对比L2 Loss)。

  • 优缺点:

    优点:鲁棒

    缺点:不稳定解、可能多个解

MSE Loss:

  • 基本形式:计算预测值和目标值的差值的平方
    L = 1 N ∑ i = 1 N ( y i − y ^ i ) 2 L=\frac{1}{N} \sum_{i=1}^{N}\left(y_{i}-\hat{y}_{i}\right)^{2} L=N1i=1N(yiy^i)2

  • pytorch实现:

    torch.nn.MSELoss(reduction='mean')
    

    关于参数

    reduction: none(不使用约简)、mean(返回loss和的平均值)、sum(返回loss的总和)。默认mean。

  • 适用场景:

    适合作为回归问题的损失函数,比如房价预测,销量预测,流量预测等。

  • 优缺点:

    优点:各点都连续光滑,方便求导,具有较为稳定的解

    缺点:不是特别稳健,当差值过大时梯度会非常大,可能导致梯度爆炸

Cross Entropy Loss:

  • 基本形式:二分类问题与多分类问题的形式略有区别,但是本质是一样的(二分类是多分类的一个特例)
    L = − [ y log ⁡ y ^ + ( 1 − y ) log ⁡ ( 1 − y ^ ) ] L=-[y \log \hat{y}+(1-y) \log (1-\hat{y})] L=[ylogy^+(1y)log(1y^)]

    L = − ∑ i = 1 N y i log ⁡ y ^ L=-\sum_{i=1}^N y_i \log \hat{y} L=i=1Nyilogy^

    首先理解二分类时如何工作:标签 y ∈ { 0 , 1 } y\in\{0,1\} y{0,1},因此 y = 1  or  ( 1 − y ) = 1 y=1 \space\text{or}\space (1-y)=1 y=1 or (1y)=1。当y=1时,该损失函数变为:
    在这里插入图片描述
    当y=0时,该损失函数变为:
    在这里插入图片描述
    因为 y ^ ∈ [ 0 , 1 ] \hat y \in[0,1] y^[0,1],因此 − log ⁡ y ^ ∈ [ 0 , + ∞ ] -\log \hat y \in[0,+\infty] logy^[0,+],所以最终结果是 y ^ \hat y y^ y y y误差越大,损失函数越大。

    多分类同样分析。

  • pytorch实现:

    torch.nn.CrossEntropyLoss(weight=None,ignore_index=-100, reduction='mean')
    

    关于参数

    weight: weight(Tensor, optional),自定义的每个类别的权重。必须是长为C的Tensor。

    ignore_index(int, optional),设置一个目标值, 该目标值会被忽略, 从而不会影响到输入的梯度。

    reduction: none(不使用约简)、mean(返回loss和的平均值)、sum(返回loss的总和)。默认mean。

  • 适用场景:

    适合分类任务,无论是二分类还是多分类。比如逻辑回归和神经网络。常与softmax激活函数一起使用。

  • 优缺点:

    优点:求导简单,导数之与输出值和真实值的差距有关,收敛更快

    缺点:在类别过多时计算量过大(比如语言模型中,一个词典包含成千上万个类别)

KL散度Loss:

KL散度又叫相对熵,与交叉熵的关系有 K L D ( p ∥ q ) = C E ( p , q ) − H ( p ) KLD(p\|q)=CE(p,q)-H(p) KLD(pq)=CE(p,q)H(p),其中 p p p是真实分布, C E CE CE是交叉熵,信息熵 H ( p ) = p log ⁡ ( p ) H(p)=p\log(p) H(p)=plog(p)

  • 基本形式:
    L = − ∑ y log ⁡ ( y ^ ) − ( − ∑ y log ⁡ ( y ) ) L=-\sum y \log (\hat y)-\left(-\sum y \log (y)\right) L=ylog(y^)(ylog(y))

  • pytorch实现:

    torch.nn.KLDivLoss(reduction='mean')
    

    关于参数

    reduction: none(不使用约简)、mean(返回loss和的平均值)、sum(返回loss的总和)。默认mean。

  • 适用场景:

    KL 散度可用于衡量不同的连续分布之间的距离,在连续的输出分布的空间上(离散采样)上进行直接回归时很有效。

  • 优缺点:

Huber Loss:

又叫平滑L1损失(Smooth L1 Loss)。

  • 基本形式:
    L = 1 n ∑ i z i L=\frac{1}{n} \sum_{i} z_{i} L=n1izi
    其中
    z i = { 0.5 ( y i − y ^ i ) 2 ,  if  ∣ y i − y ^ i ∣ < 1 ∣ y i − y ^ i ∣ − 0.5 ,  otherwise  z_{i}=\left\{\begin{array}{ll} 0.5\left(y_{i}-\hat y_{i}\right)^{2}, & \text { if }\left|y_{i}-\hat y_{i}\right|<1 \\ \left|y_{i}-\hat y_{i}\right|-0.5, & \text { otherwise } \end{array}\right. zi={0.5(yiy^i)2,yiy^i0.5, if yiy^i<1 otherwise 
    如下图,看了就能明白为什么叫平滑L1了:

  • pytorch实现:

    torch.nn.SmoothL1Loss(reduction='mean')
    

    关于参数

    reduction: none(不使用约简)、mean(返回loss和的平均值)、sum(返回loss的总和)。默认mean。

  • 适用场景:

    适合处理回归问题。

  • 优缺点:

    优点:在零点也可微,并且在误差很小时梯度也会减小,方便收敛

    缺点:对于数据中异常值的敏感性要差一些

3.3 成本函数

​ a.定义:即一个训练集中所有样本的损失函数输出值 σ σ σ的平均值,用于衡量当前模型的参数的准确性。平均值越小,参数越准确。

​ b.公式:
J ( ω , b ) = 1 m ∑ i = 1 m σ ( y ^ ( i ) , y ( i ) ) = − 1 m ∑ i = 1 n [ y ( j ) log ⁡ y ^ ( i ) + ( 1 − y ) log ⁡ ( 1 − y ^ ( j ) ) ] J(\omega, b)=\frac{1}{m} \sum_{i=1}^{m} σ\left(\hat{y}^{(i)}, y^{(i)}\right)=-\frac{1}{m} \sum_{i=1}^{n}\left[y^{(j)} \log \hat{y}^{(i)}+\left(1-y\right) \log \left(1-\hat{y}^{(j)}\right) \right] J(ω,b)=m1i=1mσ(y^(i),y(i))=m1i=1n[y(j)logy^(i)+(1y)log(1y^(j))]

损失函数与成本函数的区别:

损失函数(Loss function)是定义在单个训练样本上的,也就是就算一个样本的误差,比如我们想要分类,就是预测的类别和实际类别的区别,是一个样本的哦,用L表示

代价函数(Cost function)是定义在整个训练集上面的,也就是所有样本的误差的总和的平均,也就是损失函数的总和的平均,有没有这个平均其实不会影响最后的参数的求解结果。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值