softmax函数
softmax函数也称为归一化指数函数,将每个元素的范围控制在(0,1)之间,并且所有元素的和为1。
函数公式为:
σ ( z j ) = e z j ∑ k = 1 K e z k , j = 1 , . . . , K \sigma(z_j)=\frac{e^{z_j}}{\sum_{k=1}^K{e^{z_k} }}, j=1,...,K σ(zj)=∑k=1Kezkezj,j=1,...,K
计算步骤为:
- 每个元素的值为 z j z_j zj,计算 e z j e^{z_j} ezj值
- 将所有元素的 e z j e^{z_j} ezj累加
- 用每个元素的 e z j e^{z_j} ezj值除以累加值,即为该元素的softmax值
用python代码实现为:
import math
z = [1.0,2.0,3.0,4.0,1.0,2.0,3.0]
z_exp = [math.exp(i) for i in z]
sum_z_exp = sum(z_exp)
softmax = [i/sum_z_exp for i in z_exp]
print(softmax)
# softmax=[0.02, 0.06, 0.17, 0.47, 0.02, 0.06, 0.17]
元素和softmax值对应关系为:
原值 | softmax |
---|---|
1.0 | 0.02 |
2.0 | 0.06 |
3.0 | 0.17 |
4.0 | 0.47 |
可以看到最大元素4.0
的softmax值远大于其他值,因为exp指数计算放大了值的影响。
交叉熵损失
在二分类的情况下,每个类别的预测概率为p
和1-p
,表达式为:
L = − [ y ⋅ l o g ( p ) + ( 1 − y ) ⋅ l o g ( 1 − p ) ] L=-[y \cdot log(p)+(1-y)\cdot log(1-p)] L=−[y⋅log(p)+(1−y)⋅log(1−p)]
- y表示样本label,正例为1,负例为0
- p表示样本预测为正例的概率
多分类就是对二分类的扩展,表达式为:
L = − ∑ j = 1 k y j l o g ( p j ) L=-\sum_{j=1}^k y_j log(p_j) L=−j=1∑kyjlog(pj)
- K表示类别的数量
- y j y_j yj值为0或1,若y属于第j类则值为1,否则为0
- p j p_j pj表示样本属于类别j的概率
代入softmax的损失函数为:
J ( θ ) = − 1 m [ ∑ i = 1 m ∑ j = 1 k y j l o g ( p j ) ] J(\theta)=-\frac{1}{m}[\sum_{i=1}^{m}\sum_{j=1}^{k}y_jlog(p_j)] J(θ)=−m1[i=1