softmax
Softmax函数定义如下,其中ak是分类器前级输出单元的输出。i表示类别索引,总的类别个数为n。yk表示的是当前元素的指数与所有元素指数和的比值(函数的输出结果)。通过Softmax函数就可以将多分类的输出数值转化为相对概率,而这些值的累和为1,常用于神经网络输出层。表达式:
y
k
=
exp
(
a
k
)
∑
1
n
exp
(
a
i
)
{{\rm{y}}_{\rm{k}}} = \frac{{\exp ({a_k})}}{{\sum\limits_1^n {\exp ({a_i})} }}
yk=1∑nexp(ai)exp(ak)
示例:
使用numpy实现softmax函数:
# softmax函数
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
但是如上这种softmax函数非常容易出现溢出的问题,因为指数函数很容易发生指数爆炸现象。故做如下修改:
y
k
=
exp
(
a
k
)
∑
1
n
exp
(
a
i
)
=
C
exp
(
a
k
)
C
∑
1
n
exp
(
a
i
)
=
exp
(
a
k
+
log
C
)
∑
1
n
exp
(
a
i
+
log
C
)
=
exp
(
a
k
+
C
‘
)
∑
1
n
exp
(
a
i
+
C
‘
)
{y_k} = \frac{{\exp ({a_k})}}{{\sum\limits_1^n {\exp ({a_i})} }}\\ = \frac{{C\exp ({a_k})}}{{C\sum\limits_1^n {\exp ({a_i})} }}\\ = \frac{{\exp ({a_k} + \log C)}}{{\sum\limits_1^n {\exp ({a_i} + \log C)} }}\\ = \frac{{\exp ({a_k}+C^` )}}{{\sum\limits_1^n {\exp ({a_i} +C^`)} }}
yk=1∑nexp(ai)exp(ak)=C1∑nexp(ai)Cexp(ak)=1∑nexp(ai+logC)exp(ak+logC)=1∑nexp(ai+C‘)exp(ak+C‘)
同样也使用numpy实现:
# 升级版softmax函数
def softmax_plus(a):
c = np.max(a)
exp_a = np.exp(a - c)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
其实这个就是解决了上限的softmax的移除问题的softmax函数,这两个函数是完全相等的。