目录
基本概念
常见的损失函数:
回归神经网络误差平方和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()