• 从零开始的深度学习之旅(3)


    神经网络的损失函数

    1.损失函数的引入

        在之前的学习中,我们建立神经网络时总是先设定好w与b的值,或者由我们调用的PyTorch类帮助我们随机生成权重向量,接着通过加和求出z ,再在z上嵌套sigmoid或者softmax函数,最终获得神经网络的输出。
     神经网络的计算是从左侧向右侧计算的.这是神经网络的正向传播过程。但这并不是神经网络算法的全流程,这个流程虽然可以输出预测结果,但却无法保证神经网络的输出结果与真实值接近。
      此时,我们就要训练神经网络,求解一组最适合的w和b,令神经网络的输出结果与真实值接近,这就是神经网络模型训练的目标.

    2.损失函数

        比如我们做了一个预测房价的实验,预测的房价和真正的房价之间肯定存在差异.当真实值与预测值差异越大时,我们就认为神经网络学习过程中丢失了许多信息,丢失的这部分称为”损失“,因此评估真实值与预测值差异的函数被我们称为“损失函数.

      损失函数

      1.在数学上,表示为以需要求解的权重向量ω为自变量的函数L(ω)。

      2.衡量真实值与预测结果的差异,评价模型学习过程中产生的损失的函数。

      3.如果损失函数的值很小,则说明模型预测值与真实值很接近,模型训练得很好

        我们希望损失函数越小越好,以此,我们将问题转变为求解函数L(ω)的最小值所对应的自变量ω.

    3.回归:误差平方和SSE

    SSE误差平方和:
    在这里插入图片描述
        其中zi(公式的前者)是样本i的真实值,而zihat(公式的后者)是样本i的预测值。对于全部样本的平均损失,则可以写作:
    在这里插入图片描述

    3.1 MSE的使用

    # 按照MSE的公式,pytorch已经写好了函数,直接调用就行
    
    import torch
    from torch.nn import MSELoss 
    
    yhat=torch.randn(size=(50,),dtype=torch.float32)
    y=torch.randn(size=(50,),dtype=torch.float32)
    
    criterion=MSELoss() 
    loss = criterion(yhat,y)
    loss
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    输出结果:
    在这里插入图片描述

    3.2 二分类交叉熵损失函数

        在这一节中,我们将介绍二分类神经网络的损失函数:二分类交叉熵损失函数,也叫做对数损失.
     大多数时候,除非特殊声明为二分类,否则提到交叉熵损失,我们会默认算法的分类目标是多分类.
     二分类交叉熵损失函数是由极大似然估计推导出来的,对于有m个样本的数据集而言,全部样本上的平均损失写作:在这里插入图片描述
    单个样本损失:

    在这里插入图片描述

        在公式中,ln是以自然底数为底的对数函数,ω表示求解出来的一组权重(ω在σ里),m是样本的个数,yi是样本i上真实的标签,σi是样本i上基于参数计算出来的sigmoid函数的返回值,xi是样本i各个特征的取值。

    3.3 极大似然估计推导二分类交叉熵损失

        极大似然估计,如果一个事件的发生概率很大,那这个事件应该很容易发生。
     寻找相应的权重ω,使得目标事件的发生概率最大,就是极大似然估计的基本方法。


        二分类神经网络的标签是[0,1],样本i在由特征向量xi和权重向量ω组成的预测函数中,样本标签被预测为1的概率为:
    在这里插入图片描述


        样本i在由特征向量 和权重向量 组成的预测函数中,样本标签被预测为0的概率为:
    在这里插入图片描述


        当P1的值为1的时候,代表样本i的标签被预测为1,当P0的值为1的时候,代表样本i的标签被预测为0。P1与P0 相加是一定等于1的.

    将两种概率联合:
    单个的概率:
    在这里插入图片描述
    将P1和P2替换,加上符号得到所有样本的概率:
    在这里插入图片描述
    对该概率P取以e为底的对数:
    在这里插入图片描述
    我们将极大值转换为极小值,因此我们对lnP取负:
    在这里插入图片描述

    3.4 用tensor实现二分类交叉熵损失

    import torch
    import time
    
    N = 3*pow(10,3)
    torch.random.manual_seed(420)
    X = torch.rand((N,4),dtype=torch.float32)
    w = torch.rand((4,1),dtype=torch.float32,requires_grad=True)
    y = torch.randint(low=0,high=2,size=(N,1),dtype=torch.float32)
    zhat = torch.mm(X,w)
    sigma = torch.sigmoid(zhat)
    Loss = -(1/N)*torch.sum((1-y)*torch.log(1-sigma)+y*torch.log(sigma))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    4.多分类交叉熵损失函数

        对于多分类的状况而言,标签不再服从伯努利分布(0-1分布),因此我们可以定义,样本i在由特征向量和权重向量组成的预测函数中,样本标签被预测为类别k的概率为:
    在这里插入图片描述
       对于多分类算法而言,σ就是softmax函数返回的对应类别的值。

        假设样本的真实标签为1,我们就希望 P1最大,同理,如果样本的真实标签为其他值,我们就希望其他值所对应的概率最大。二分类可以使用0和1来分类,如果多分类的标签也可以使用0和1来表示就好了,这样我们就可以继续使用真实标签作为指数的方式,如下图方式进行改变

      原本的真实标签y是含有[1, 2, 3]三个分类的列向量,现在我们把它变成了标签矩阵,每个样本对应一个向量.

    在这里插入图片描述


      当我们把标签整合为标签矩阵后,我们就可以将单个样本在总共K个分类情况整合为以下的似然函数
    在这里插入图片描述


    公式简写为:
    在这里插入图片描述

    所有可能的的概率P求和为:
    在这里插入图片描述
      再对整个公式取负,就得到了多分类状况下的损失函数
    在这里插入图片描述
    在这里插入图片描述

    4.1 实现多分类交叉熵损失

    import torch
    import torch.nn as nn
    N = 3*pow(10,2)
    torch.random.manual_seed(420)
    X = torch.rand((N,4),dtype=torch.float32)
    w = torch.rand((4,3),dtype=torch.float32,requires_grad=True)
    
    y = torch.randint(low=0,high=3,size=(N,),dtype=torch.float32)
    zhat = torch.mm(X,w)
    #从这里开始调用softmax和NLLLoss
    logsm = nn.LogSoftmax(dim=1) #实例化
    logsigma = logsm(zhat)
    criterion = nn.NLLLoss() #实例化
    criterion(logsigma,y.long())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出结果:
    在这里插入图片描述

  • 相关阅读:
    2023 | 组蛋白乳酸化如何影响免疫、自噬最新发现!
    实体注解-批量生成10000条测试数据
    NetCore 使用 Swashbuckle 搭建 SwaggerHub
    CSS语法及其选择器
    如何通过C#/VB.NET从PowerPoint文档中提取图片
    [ 动词词组 ] 合集
    文件输入输出处理(二)-字节流
    base相关密码特征
    【CSS】背景样式(颜色、图片、平铺、附着和位置)
    成为超级个体:AI 时代研发人员的编程技巧与最佳实践
  • 原文地址:https://blog.csdn.net/ren9855/article/details/127974138