python softmax 导数
时间: 2023-06-05 15:47:28 浏览: 183
Softmax函数是一种基于指数函数归一化的数学函数,它将实数向量映射到概率分布上。
给定一个N维的向量$x$,softmax函数的定义如下:
$\text{softmax}(x)_i = \frac{e^{x_i}}{\sum_{j=1}^{N}e^{x_j}}$,其中$i\in \{1,2,...,N\}$。
在深度学习中,softmax函数常用于将多分类问题中的输出层输出映射为概率分布上,以便用于损失函数的计算、梯度计算等。
关于softmax函数的导数,可以使用链式法则求解。
首先,我们可以根据softmax函数的定义,表示$\text{softmax}(x)_i$来求其导数:
$\text{softmax}(x)_i = \frac{e^{x_i}}{\sum_{j=1}^{N}e^{x_j}}$
$\frac{\partial{\text{softmax}(x)_i}}{\partial x_j} = \frac{\partial}{\partial x_j} \frac{e^{x_i}}{\sum_{k=1}^{N}e^{x_k}}$
由于$j \neq i$,为了使得分子中不含$x_j$,我们需要对分子和分母分别进行变形:
$\frac{e^{x_i}}{\sum_{k=1}^{N}e^{x_k}} = \frac{e^{x_i}}{e^{x_j} \cdot \sum_{k \neq j}e^{x_k} + e^{x_j} \cdot e^{x_j} + e^{x_j} \cdot \sum_{k>j}e^{x_k}} = \frac{e^{x_i-x_j}}{\sum_{k \neq j}e^{x_k-x_j} + 1 + \sum_{k>j}e^{x_k-x_j}}$
然后,我们重新表示一下$\frac{\partial{\text{softmax}(x)_i}}{\partial x_j}$:
$\frac{\partial}{\partial x_j} \frac{e^{x_i}}{\sum_{k=1}^{N}e^{x_k}} = \frac{\partial}{\partial x_j} \frac{e^{x_i-x_j}}{\sum_{k \neq j}e^{x_k-x_j} + 1 + \sum_{k>j}e^{x_k-x_j}}$
$= \frac{-e^{x_i-x_j}}{(\sum_{k \neq j}e^{x_k-x_j} + 1 + \sum_{k>j}e^{x_k-x_j})^2} \cdot (\frac{\partial}{\partial x_j}(\sum_{k \neq j}e^{x_k-x_j}) + \frac{\partial}{\partial x_j}(e^{x_j}) + \frac{\partial}{\partial x_j}(\sum_{k>j}e^{x_k-x_j}))$
$= \frac{-e^{x_i-x_j}}{(\sum_{k \neq j}e^{x_k-x_j} + 1 + \sum_{k>j}e^{x_k-x_j})^2} \cdot (-e^{x_j} + \sum_{k>j}e^{x_k-x_j})$
$= \frac{e^{x_i-x_j}}{\sum_{k=1}^{N}e^{x_k}} \cdot \frac{e^{x_j}}{\sum_{k=1}^{N}e^{x_k}}(\delta_{ij}-\frac{e^{x_i}}{\sum_{k=1}^{N}e^{x_k}})$
其中,$\delta_{ij}$表示Kronecker delta,当$i=j$时取值为1,否则为0。
综上所述,我们可以得到:
$\frac{\partial{\text{softmax}(x)_i}}{\partial x_j} = \frac{e^{x_i-x_j}}{\sum_{k=1}^{N}e^{x_k}} \cdot \frac{e^{x_j}}{\sum_{k=1}^{N}e^{x_k}}(\delta_{ij}-\frac{e^{x_i}}{\sum_{k=1}^{N}e^{x_k}})$
这就是softmax函数的导数公式。