1. 简介
softmax回归也是一个单层神经网络,常用于分类模型的最后一层,输出的是独热编码。softmax函数能够将未规范化的预测变换为非负数并且总和为1,同时让模型保持可导的性质。
为了完成这一目标,我们首先对每个未规范化的预测求幂,这样可以确保输出非负。 为了确保最终输出的概率值总和为1,我们再让每个求幂后的结果除以它们的总和。即是向量映射为概率
2. softmax公式
日常训练中往往用的是矩阵,所以我们用矩阵替换向量可以得到如下式子,
s
o
f
t
m
a
x
(
X
)
i
j
=
exp
(
X
i
j
)
∑
k
exp
(
X
i
k
)
.
其中
X
是矩阵
\mathrm{softmax}(\mathbf{X})_{ij} = \frac{\exp(\mathbf{X}_{ij})}{\sum_k \exp(\mathbf{X}_{ik})}. ~~~~~ 其中X是矩阵
softmax(X)ij=∑kexp(Xik)exp(Xij). 其中X是矩阵这里保证了每个函数值都在 0 ~ 1之间,且每行之和为1
为什么用行向量求和? 简单用下图来演示一下我们以矩阵输入的情况
处理矩阵的softmax代码如下
def softmax(X):
X_exp = torch.exp(X) #每个元素求指数
partition = X_exp.sum(1, keepdim=True) #按行累加
return X_exp / partition # 这里应用了广播机制
3. 交叉熵
作为损失函数的一种,经常与softmax一起用于分类问题评估模型的loss,它是所有标签分布的预期损失值,可以写成如下公式:
l
(
y
,
y
^
)
=
∑
i
=
0
n
−
y
i
l
o
g
y
i
^
=
−
l
o
g
y
y
^
l(y,\hat y) = \sum_{i=0}^n-y_ilog\hat {y_i} = -log \hat {y_y}
l(y,y^)=i=0∑n−yilogyi^=−logyy^
由于独热编码,我们可以只考虑
y
i
y_i
yi 为1的,即可化解为右式,在
y
y
y 样本值处对应的预测值
y
^
\hat y
y^,代码如下
def cross_entropy(y_hat, y):
return - torch.log(y_hat[range(len(y_hat)), y]) #y是给定的实例样本坐标
而对其求梯度: ∂ o j l ( y , y ^ ) = exp ( o i ) ∑ j = 1 n exp ( o j ) − y j = s o f t m a x ( o ) j − y j \partial_{o_j} ~l(y,\hat y) = \frac{\exp(o_i)}{\sum_{j=1}^n \exp(o_j)} - y_j = \mathrm{softmax}(\mathbf{o})_j - y_j ∂oj l(y,y^)=∑j=1nexp(oj)exp(oi)−yj=softmax(o)j−yj综上,交叉熵梯度即为真实值与预测值之间的误差