目录

基本概念

常见的损失函数:

回归神经网络误差平方和sse:

二分类交叉熵损失函数(log loss )

log loss损失的由来

推导过程:

多分类的交叉熵损失:


基本概念

基于上次已经跑通的神经网络,加上一个让神经网络进行学习的过程。

模型训练的目标(线性回归为例):求解一组最适合的权重向量w,使得神经网络的输出和真实结果尽量接近

损失函数:衡量真实值与预测结果的差异,评价模型学习过程中产生的损失的函数,在数学上,表示为以需要求解的权重向量w为自变量的函数L(W)。我们希望函数L越小越好,也就是找到一个让L最小的w值,也就是求极值问题(求导)。

求解过程:1 拉 格朗日变换转成凸函数 2 确定合适的优化算法

常见的损失函数:

回归神经网络误差平方和sse:

真实值 减 预测值的 平方 再求和

上式除以样本个数(或者是2倍的样本个数)就是均方误差MSE。

MSE简单使用

import torch 
from torch.nn import MSELoss

ychat = torch.randn(size=(50,),dtype=torch.float32)
y = torch.randn(size=(50,),dtype=torch.float32)

cirterion = MSELoss() # 类调用前要先实例化 如果想要sse,将reduction=“sum”

cirterion(yhat,y).print

二分类交叉熵损失函数(log loss )

- [真实值(y)乘以In(经过激活函数的概率值) + (1-y)In(1-经过激活函数的概率值)]/M

这里y = 1或者0. 

In是以e为底的对数函数   

函数总体自变量为w,在 “经过激活函数的概率值” 里面。(如经过sigmoid,1/(1+E**-Z)  而 Z=WX)

log loss损失的由来

极大似然估计(简单理解一下)

寻找相应的权重w(事情发生需要满足条件,找到让事情最有可能发生的条件,完成这个条件,使得目标事件的发生概率最大)

极大似然:最大概率

估计:权重w

步骤:

1 构建似然函数P(w),用于评估目标事件发生的概率,该函数被设计成,目标事件发生时,概率最大

2 对整体似然函数取对数,构成对数似然函数InP(w)

3 在对数似然函数上对权重w求导,并使导数为0,对权重进行求解

推导过程:

设:样本为1的概率P1 = P1,为零的概率P0 = 1-P1,用@来表示P1

两个概率整合P(y|x,w) = P1**y * P0**(1-y),这个叫逻辑回归的假设函数。然后要得到所有样本的概率,对所有样本的概率进行累乘,得到的函数就是逻辑回归的似然函数,完成第一步,

然后,整体取对数,累乘变累加,InP = In@^y + In(1-@)^(1-y) ----> y*In(@) + (1-y)*In(1-@),得到二分类交叉熵函数。

然后在这个过程中,是寻找P最大的过程,我们在前面加负号,变成损失函数,求极小值的问题

代码实现:

import numpy as np
import torch
import time
import torch.nn as nn

m = 3*pow(10,3)
x = torch.randn(size=(m,4),dtype=torch.float32)
torch.random.manual_seed(22)
y = torch.randint(low=0,high=2,size=(m,1),dtype=torch.float32)
w = torch.randn(size=(4,1),dtype=torch.float32)

zhat = torch.mm(x,w)
# print(zhat)

sigma = torch.sigmoid(zhat)

# total loss

loss = -(torch.sum(y*np.log(sigma) + (1-y)*np.log(1-sigma)))/m

print(loss)

criterion = nn.BCELoss() # only have log loss
print(criterion(sigma, y))

criterion1 = nn.BCEWithLogitsLoss() # have sigmoid  更准

print(criterion1(zhat,y))

多分类的交叉熵损失:

多分类下的激活函数为softmax,会得到特征属于每个标签的概率,我们用为了得到和上述一样的结果,我们对其进行one-hot编码(在概率最大的类别上为一,剩下的都为0)

最后公式简写成P = Pj^(y的第i个样本在类别属于j的条件下的one-hot编码)

重复上述操作,L(w)= -(求和符号) yi(k=j)In第i个样本经过函数的最大的概率

yi(k=j):第i个样本在类别等于j的条件下对应的one-hot编码

注:

为了计算的方便,In前面的部分叫NLLLoss,剩下的部分叫logsoftmax,要分别调用这两个函数来实现。

实现;

import  torch
import torch.nn as nn

m = 3*pow(10,3)
x = torch.randn(size=(m,4),dtype=torch.float32)
torch.random.manual_seed(22)
y = torch.randint(low=0,high=3,size=(m,),dtype=torch.float32)
w = torch.randn(size=(4,3),dtype=torch.float32)

zhat = torch.mm(x,w)

logsm = nn.LogSoftmax(dim=1)
log_sigma = logsm(zhat)

# print(log_sigma)
criterion = nn.NLLLoss() # one-hot need long
print(criterion(log_sigma, y.long()))

也可以直接 CrossEntropyLoss()