1.数学表示
这是传统的softmax:
q
i
=
e
x
p
(
z
i
)
∑
j
e
x
p
(
z
j
)
q_i = \frac{exp(z_i)}{\sum_jexp(z_j)}
qi=∑jexp(zj)exp(zi)
或者写:
q
i
=
e
x
p
(
z
i
)
/
1.0
∑
j
e
x
p
(
z
j
/
1.0
)
q_i = \frac{exp(z_i)/1.0}{\sum_jexp(z_j/1.0)}
qi=∑jexp(zj/1.0)exp(zi)/1.0
这是考虑温度系数的softmax:
q
i
=
e
x
p
(
z
i
)
/
T
∑
j
e
x
p
(
z
j
/
T
)
q_i = \frac{exp(z_i)/T}{\sum_jexp(z_j/T)}
qi=∑jexp(zj/T)exp(zi)/T
其中 T 是 softmax 函数的温度超参数。
2.对温度系数理解
我们知道模型在训练收敛后,往往通过 softmax 的输出不会是完全符合 one-hot 向量那种极端分布的,而是在各个类别上均有概率,推断时通过 argmax 取得概率最大的类别。Hinton 的文章就指出,教师模型中在这些负类别(非正确类别)上输出的概率分布包含了一定的隐藏信息。
比如 MNIST 手写数字识别,标签为 7 的样本在输出时,类别 7 的概率虽然最大,但和类别 1 的概率更加接近,这就说明 1 和 7 很像,这是模型已经学到的隐藏的知识。
我们在使用 softmax 的时候往往会将一个差别不大的输出变成很极端的分布,用一个三分类模型的输出举例:
可以看到原本的分布很接近均匀分布,但经过 softmax,不同类别的概率相差很大。这就导致类别间的隐藏的相关性信息不再那么明显,有谁知道 0.09 和 0.24 对应的类别很像呢?为了解决这个问题,我们就引入了温度系数。
3.温度系数
我们看看对于随机生成的相同的模型输出,经过不同的函数处理,分布会如何变化:
最左边是我们随机生成的分布来模拟模型的输出:
z
∈
R
10
∼
N
(
10
,
2
)
z \in R^{10 }\sim N(10,2)
z∈R10∼N(10,2)。中间五幅图是使用 softmax 得到的结果;其中温度系数
T
=
1
T=1
T=1 时相当于原始的 softmax;右侧对比了 argmax 得到的结果。可以看出,从左到右,这些输出结果逐渐从均匀分布向尖锐分布过渡,其中保留的除正确类别以外的信息越来越少。下图更加直观地展示了不同的温度系数
T
T
T 对输出分布的影响。
不同的曲线代表不同类别上的概率输出,同样
T
=
1
T=1
T=1 时代表传统的 softmax,在 时,分布逐渐极端化,最终等价于 argmax,在
T
>
2
T>2
T>2 时,分布逐渐趋于均匀分布,10 个类别的概率都趋近于1/10。
这两幅画很好的说明了 softmax 的本质。【相对于 argmax 这种直接取最大的「hardmax」,softmax 采用更温和的方式,将正确类别的概率一定程度地突显出来。而引入温度系数的本质目的,就是让 softmax 的 soft 程度变成可以调节的超参数】。
而至于这个系数为啥叫 Temperature,其实很有深意。我们知道这个场景最早用于模型蒸馏,一般来说蒸馏需要加热,而加热会导致熵增。我们发现,提高温度系数会导致输出分布的信息熵增大!
我们可以轻松地推导出 趋于无穷大时,分布将趋于均匀分布,此时信息熵趋于最大
而当
T
T
T 趋于 0 时,正确类别的概率接近 1,softmax 的效果逼近 argmax
[1].深度学习高温蒸馏:Softmax With Temperature