pytorch学习笔记-高阶篇(逻辑回归与分类与交叉熵)
本篇主要介绍Logistic Regression以及它和classfication的关系,以及交叉熵的引入
一、linear regerssion(线性回归)到Logistic Regression(逻辑回归)
在给线性函数加上sigmoid之后,它的输出值就不再是一个连续的范围,而是通过放缩为0/1,来表示是否。
对于回归问题,优化的方法可以用范数,目标是使得预测值与真实值尽量接近,但是对于分类问题,我们的目标是准确率,但是并不会直接优化准确率,因为会有一个阈值问题,对于0.5来说,从0.4提高到0.45对回归问题是有意义的,但对分类问题,它表现出来都是0.4=>0,0.45=>0,不会对下一次预测作出指导。因为这种阈值存在,会导致微小的权值变化,可能导致梯度一直是0,也可能导致准确率的骤变
二、为什么叫Logistic regression 而不叫classification
- 首先,过程中会用到sigmoid函数,因此会是logistic
- 另外其实关于此还是有争议的,可以理解为:
MSE => regression
Cross Entropy => calssfication
三、交叉熵
cross entropy(交叉熵) <----> Uncertainty
1. 熵
下面是熵的定义
# 熵越小,惊喜度越高,不确定性越高
a = torch.full([4], 1/4.)
# Out[4]: tensor([0.2500, 0.2500, 0.2500, 0.2500])
a*torch.log2(a)
# Out[11]: tensor([-0.5000, -0.5000, -0.5000, -0.5000])
-(a*torch.log2(a)).sum()
# Out[12]: tensor(2.)
a = torch.tensor([0.1, 0.1, 0.1, 0.7])
-(a*torch.log2(a)).sum()
# Out[14]: tensor(1.3568)
a = torch.tensor([0.001, 0.001, 0.001, 0.999])
-(a*torch.log2(a)).sum()
# Out[16]: tensor(0.0313)
2. 交叉熵
下面是交叉熵的定义,第二部分Dkl表示散度(不重合的部分占整体的比例),当P=Q时,值为0,自然交叉熵就等于熵。对于独热码(概率问题),比如[0. 1. 0, 0],1的位置是1的概率是1,整体公式就变成1*Log1=0,此时,交叉熵等于散度。而我们也希望P和Q越来越接近,目标是散度等于0
二分类问题,交叉熵的应用
# 一个实例
from torch.nn import functional as F
x = torch.randn(1, 784)
w = torch.randn(10, 784)
logits = x@(w.t())
# Out[26]: torch.Size([1, 10])
pred = F.softmax(logits, dim=1)
# Out[30]: torch.Size([1, 10])
pred_log = torch.log(pred)
# 注意,cross_entropy里面已经包含了 softmax+log+nll 操作
F.cross_entropy(logits, torch.tensor([3]))
# Out[32]: tensor(1.3133)
F.nll_loss(pred_log, torch.tensor([3]))
# Out[33]: tensor(1.3133)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 不听话的兔子君!