从零开始的深度学习之旅(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

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

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))

在这里插入图片描述

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())

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值