softmax 函数
在神经网络的最后一层,通常使用 softmax
函数来将各神经元的输出压缩到 [0, 1]
之间,可以当成概率来理解。
softmax 函数的形式如下
Softmax 函数
其中,C
为输出层神经元的个数,z
是一个C
维的向量,表示的是未经softmax
之前的输出(softmax
层的输入)。P(i)
表示是第i
类的概率,是一个标量。
可以将 softmax
函数写成向量形式
这时的 P
是一个 C
维向量。
举一个例子,softmax
层的输入 z
为
我们用 Python 编写一个 softmax
函数(Python 中默认使用行向量)
def softmax(input):
return np.exp(input) / np.sum(np.exp(input))
该函数的输出为
可以看到, z
的值被压缩到了 [0, 1]
之间。
交叉熵
通常,对使用了 softmax
层的多分类神经网络,我们在最后一层使用的损失函数为交叉熵,它的形式如下
交叉熵函数
这里的 y^
指的是预测值(softmax
层的输出)。y
指的是真实值,是一个 One-Hot
编码后的 C
维向量,如果样例 x
是类别 i
,则 y
的第 i
维的值为 1,其余维的值为 0(例如,x
是类别 2, 共 4 类,则 y
的 值为 [0, 1, 0, 0]
)。
也可以将其写成向量形式
对应的 cost function
如下
向量形式如下
我们在使用梯度下降法求解的过程中,需要计算
cost
对输入 z
的导数,在 softmax + 交叉熵
组合的情况下,导数的形式非常简洁:
下面给出具体推导