在深度学习中Softmax交叉熵损失函数的公式求导

(以下部分基本介绍转载于点击打开链接)

在深度学习NN中的output层通常是一个分类输出,对于多分类问题我们可以采用k-二元分类器来实现,这里我们介绍softmax。softmax回归中,我们解决的是多分类问题(相对于 logistic 回归解决的二分类问题),类标 \textstyle y 可以取 \textstyle k 个不同的值(而不是 2 个)。因此,对于训练集 \{ (x^{(1)}, y^{(1)}), \ldots, (x^{(m)}, y^{(m)}) \},我们有 y^{(i)} \in \{1, 2, \ldots, k\}。(注意此处的类别下标从 1 开始,而不是 0)。例如,在 MNIST 数字识别任务中,我们有 \textstyle k=10 个不同的类别。


对于给定的测试输入 \textstyle x,我们想用假设函数针对每一个类别j估算出概率值 \textstyle p(y=j | x)。也就是说,我们想估计 \textstyle x 的每一种分类结果出现的概率。因此,我们的假设函数将要输出一个 \textstyle k 维的向量(向量元素的和为1)来表示这 \textstyle k 个估计的概率值。 具体地说,我们的假设函数 \textstyle h_{\theta}(x) 形式如下:

\begin{align}h_\theta(x^{(i)}) =\begin{bmatrix}p(y^{(i)} = 1 | x^{(i)}; \theta) \\p(y^{(i)} = 2 | x^{(i)}; \theta) \\\vdots \\p(y^{(i)} = k | x^{(i)}; \theta)\end{bmatrix}=\frac{1}{ \sum_{j=1}^{k}{e^{ \theta_j^T x^{(i)} }} }\begin{bmatrix}e^{ \theta_1^T x^{(i)} } \\e^{ \theta_2^T x^{(i)} } \\\vdots \\e^{ \theta_k^T x^{(i)} } \\\end{bmatrix}\end{align}

注:这里我们用类似机器学习里面(θ^T)x 来代替(w^T)x+b

其中 \theta_1, \theta_2, \ldots, \theta_k \in \Re^{n+1} 是模型的参数。请注意 \frac{1}{ \sum_{j=1}^{k}{e^{ \theta_j^T x^{(i)} }} }这一项对概率分布进行归一化,使得所有概率之和为 1 。


为了方便起见,我们同样使用符号 \textstyle \theta 来表示全部的模型参数。在实现Softmax回归时,将 \textstyle \theta 用一个 \textstyle k \times(n+1) 的矩阵来表示会很方便,该矩阵是将 \theta_1, \theta_2, \ldots, \theta_k 按行罗列起来得到的,如下所示:

\theta = \begin{bmatrix}\mbox{---} \theta_1^T \mbox{---} \\\mbox{---} \theta_2^T \mbox{---} \\\vdots \\\mbox{---} \theta_k^T \mbox{---} \\\end{bmatrix}

现在我们来介绍 softmax 回归算法的代价函数。在下面的公式中,\textstyle 1\{\cdot\} 是示性函数,其取值规则为:

 值为真的表达式 

, \textstyle 1\{ 值为假的表达式 \textstyle \}=0。举例来说,表达式 \textstyle 1\{2+2=4\} 的值为1 ,\textstyle 1\{1+1=5\}的值为 0。我们的代价函数为:

\begin{align}J(\theta) = - \frac{1}{m} \left[ \sum_{i=1}^{m} \sum_{j=1}^{k}  1\left\{y^{(i)} = j\right\} \log \frac{e^{\theta_j^T x^{(i)}}}{\sum_{l=1}^k e^{ \theta_l^T x^{(i)} }}\right]\end{align} 在Softmax回归中将  \textstyle x  分类为类别  \textstyle j 的概率为:
p(y^{(i)} = j | x^{(i)} ; \theta) = \frac{e^{\theta_j^T x^{(i)}}}{\sum_{l=1}^k e^{ \theta_l^T x^{(i)}} }.

下面我们来看看求导的问题

 softmax的函数公式如下:



        中,表示第L层(通常是最后一层)第j个神经元的输入,表示第L层第j个神经元的输出,表示自然常数。注意看,表示了第L层所有神经元的输入之和。

先给出aj对zi的偏导在后面要 用到



在J代价函数中取出对单一数据对(x(i), y(i))的
下面我们以L对Wj的偏导举例:
在深度学习中Softmax交叉熵损失函数的公式求导_第1张图片注:左图的Wj,bj,aj,zj,均是第L层的.Wj指的是W矩阵中的第j行
同理解得:
将loss扩充到整个数据集 \{ (x^{(1)}, y^{(1)}), \ldots, (x^{(m)}, y^{(m)}) \}

则有:(ps:以下的k是指最后一层及L层的unit数,n是L-1层的unit数,m是数据集大小)
在深度学习中Softmax交叉熵损失函数的公式求导_第2张图片
在深度学习中Softmax交叉熵损失函数的公式求导_第3张图片
db[L]的python写法:np.sum(A-Y, axis=1, keepdims=True)

最后顺便附带在python中J的实现

J = np.sum(Y * np.log(A + 1e-8)) * (-1 / m)

参考网址:

softmax回归:

http://ufldl.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92

softmax的log似然代价函数(公式求导)

http://m.blog.csdn.net/u014313009/article/details/51045303


你可能感兴趣的:(在深度学习中Softmax交叉熵损失函数的公式求导)