logistic regression
-
其实它是一个分类算法
-
regression与classification:优化目标不同
regression:minimize(pred,y)
classification:minimize dist (Ptheat,Preal)
为何不是maximize accuracy?
- 当预测值与实际值不等,但概率从0.3上升到0.4,ACC值并未改变(这时未达到阈值,判定预测错误),但是概率趋近,但是ACC的偏微分为0,权重更新失败
- 当预测值从0.499,变为0.501,ACC瞬间增加(从0.6-0.8)得到一个较大的梯度,得到不连续的更新
-
Multi-class classofication多分类
使用softmax函数进行归一化处理,放大差值,方便操作
交叉熵
-
熵是啥?
熵用来衡量数据的混乱程度,数据越专一集中,熵就越小,比如数据中只有一种数据,则熵为0(最小);越大的熵,数据有越大的不确定性,越混乱;我们处理过的数据有越小的值越好。
- why not MSE/为何不适用均方误差和?
分类问题的输出只有对或不对,使用MSE容易屏蔽概率的趋近或者远离趋势!
# 更集中的数据有更小的熵
a1 = torch.full([4],1/4.)
a2 = torch.tensor([0.1,0.1,0.1,0.7])
b1 = torch.log2(a1)
b2 = torch.log2(a2)
-(a1*b1).sum(),-(a2*b2).sum()
# (tensor(2.), tensor(1.3568))
- 相对熵/KL散度
当两个分布P,Q越接近,相对熵趋近与0,p为确定值,q为预测值,我们期望得到较小的相对熵
计算公式:
化简易得(对数展开):
我们可以发现P(x)的概率已知,我们把等式后一部分叫做交叉熵
-
Cross Entropy/交叉熵
由相对熵推导而来
P=Q时,cross entropy = entropy
二分类问题
set i=1
我们用得到的预测值与实际值求交叉熵,得到较小的那组数据就是分类效果显著的那一组
from torch.nn import functional as F
x = torch.tensor([1,1,3,4.]).view(1,4)
w = torch.tensor([[1,1,1,4.],[1,1,3,4],[1,1,1,1]])
logits = x@w.t()
logits.size(),torch.tensor([0]).size()
F.cross_entropy(logits,torch.tensor([0]))
# 这里的target其实已经转化为onehot编码,只有指定位置为1
如果target改为torch,tensor([0,1]),会报错
想一想:一组数据的分类结果只有一个结果,不会是[1,0,1,0]有两种输出结果
当一次输入多组数据要保证输入数据的dim0与target的dim0一致