分类问题
回归是估计一个连续值
分类是预测一个离散类别
与回归的图相比,多出来的输出相当于也是一个连续的值,只不过是一个概率,来确定这个当前这个样本可能是什么类别的数据
本质上,也是直观上,当得到一个预测值最大的那个类别概率那么这个样本是这个概率的可能性也肯定是最大的,我们也就可以形象的认为这个样本在当前他所属的特征下他应该是属于预测出来可能性最大的样本。
要将我们的输出视为概率,我们必须保证在任何数据上的输出都是非负的且总和为1。
softmax就是我们常用的一个函数
softmax
y ^ = s o f t m a x ( o ) 其中 y ^ j = exp ( o j ) ∑ k exp ( o k ) \hat{\mathbf{y}} = \mathrm{softmax}(\mathbf{o})\quad \text{其中}\quad \hat{y}_j = \frac{\exp(o_j)}{\sum_k \exp(o_k)} y^=softmax(o)其中y^j=∑kexp(ok)exp(oj)
k代表是每个类别,同样也可以认为一共有k个类别
同样的,定义这个模型我们也需要衡量他与真实值的差距,也就是定义损失函数
交叉熵损失
交叉熵常用来衡量两个概率的区别
H
(
p
,
q
)
=
∑
j
−
p
i
log
(
q
i
)
H(p,q) = \sum_j - p_i \log (q_i)
H(p,q)=j∑−pilog(qi)
我们把他应用到softmax里作为损失
l
(
y
,
y
^
)
=
−
∑
i
y
i
log
y
i
^
=
−
log
y
y
^
l(y, \hat{y}) = -\sum_i y_i \log \hat{y_i}=-\log \hat{y_y}
l(y,y^)=−i∑yilogyi^=−logyy^
除了y真实的类别以外,其他的
y
i
y_i
yi取值都是0,所以可得最右边的式子
简易实现
在实现softmax操作时,博客忽然引出一段代码来回顾了一下softmax的实现,让很多弹幕还有我很懵,仔细想了一下,应该是这样:
def softmax(X):
X_exp = torch.exp(X)
partition = X_exp.sum(1, keepdim=True)
return X_exp / partition # 这里应用了广播机制
回想一下,实现softmax由三个步骤组成:
- 对每个项求幂(使用
exp
);- 对每一行求和(小批量中每个样本是一行),得到每个样本的规范化常数;
- 将每一行除以其规范化常数,确保结果的和为1。
在查看代码之前,我们回顾一下这个表达式:
s o f t m a x ( X ) i j = exp ( X i j ) ∑ k exp ( X i k ) . \mathrm{softmax}(\mathbf{X})_{ij} = \frac{\exp(\mathbf{X}_{ij})}{\sum_k \exp(\mathbf{X}_{ik})}. softmax(X)ij=∑kexp(Xik)exp(Xij).
这里开始回顾的时候有点突然,没想明白这个X代表的是什么。一开始想的是代表训练数据构成的矩阵X,也就是一行为一个样本,每一列都是训练数据的特征。按照这个定义去看notebook中和ppt给出的公式感觉不是很对,因为你对每一个特征求一次softmax没有什么意义。其实这个X代指的是每一行是一个样本,每一列是根据这个样本的每个特征算出来的 o j o_j oj,也就是一开始提到的 o o o的计算方法;每一列代表这个训练问题所要求解的种类。这样就可以解释的清楚了。