softmax函数详解及误差反向传播的梯度求导

本文深入解析softmax函数,包括定义、梯度求导和反向传播过程。详细介绍了在反向传播中softmax函数的梯度计算,并讨论了其在多分类问题中的收敛性质和误差传播特性。
摘要由CSDN通过智能技术生成

摘要

本文给出 softmax 函数的定义, 并求解其在反向传播中的梯度

相关

配套代码, 请参考文章 :

Python 和 PyTorch 对比实现 softmax 及其反向传播

系列文章索引 :
https://blog.csdn.net/oBrightLamp/article/details/85067981

正文

1. 定义

softmax函数常用于多分类问题的输出层.
定义如下:
s i = e x i ∑ t = 1 k e x t ∑ t = 1 k e x t = e x 1 + e x 2 + e x 3 + ⋯ + e x k i = 1 , 2 , 3 , ⋯   , k s_{i} = \frac{e^{x_{i}}}{ \sum_{t = 1}^{k}e^{x_{t}}} \\ \quad \\ \sum_{t = 1}^{k}e^{x_{t}} = e^{x_{1}} + e^{x_{2}} +e^{x_{3}} + \cdots +e^{x_{k}}\\ \quad \\ i = 1, 2, 3, \cdots, k si=t=1kextexit=1kext=ex1+ex2+ex3++exki=1,2,3,,k

编程实现softmax函数计算的时候, 因为存在指数运算 e x i e^{x_i} exi, 数值有可能非常大, 导致大数溢出.
一般在分式的分子和分母都乘以一个常数C, 变换成:

s i = C e x i C ∑ t = 1 k e x t = e x i + l o g C ∑ t = 1 k e x t + l o g C = e x i − m ∑ t = 1 k e x t − m m = − l o g C = m a x ( x i ) s_{i} = \frac{Ce^{x_{i}}}{ C\sum_{t = 1}^{k}e^{x_{t}}} = \frac{e^{x_{i} + logC }}{ \sum_{t = 1}^{k}e^{x_{t} + logC}} = \frac{e^{x_{i} - m }}{ \sum_{t = 1}^{k}e^{x_{t} - m}} \\ \quad \\ m = - logC = max(x_{i}) si=Ct=1kextCexi=t=1kext+logCexi+logC=t=1kextmeximm=logC=max(xi)

C的值可自由选择, 不会影响计算结果. 这里 m 取 x i x_i xi 的最大值, 将数据集的最大值偏移至0.

2. 梯度求导

考虑一个 softmax 变换:
x = ( x 1 , x 2 , x 3 , ⋯   , x k ) s = s o f t m a x ( x ) x = (x_1, x_2, x_3, \cdots, x_k)\\ \quad\\ s = softmax(x)\\ x=(x1,x2,x3,,xk)s=softmax(x)
求 s1 对 x1 的导数:
s 1 = e x 1 ∑ t = 1 k e x t = e x 1 s u m s u m = ∑ t = 1 k e x t = e x 1 + ∑ t = 2 k e x t ∂ s u m ∂ x 1 = ∂ ∑ t = 1 k e x t ∂ x 1 = e x 1 ∂ s 1 ∂ x 1 = e x 1 ⋅ s u m − e x 1 ⋅ ∂ s u m ∂ x 1 s u m 2 = e x 1 ⋅ s u m − e x 1 ⋅ e x 1 s u m 2 = s 1 − s 1 2 s_{1} = \frac{e^{x_{1}}}{ \sum_{t = 1}^{k}e^{x_{t}}} = \frac{e^{x_{1}}}{ sum} \\ \quad \\ sum = \sum_{t = 1}^{k}e^{x_{t}} = e^{x_{1}} + \sum_{t = 2}^{k}e^{x_{t}}\\ \quad \\ \frac{\partial sum}{\partial x_{1}} = \frac{\partial \sum_{t = 1}^{k}e^{x_{t}}}{\partial x_{1}} = e^{x_{1}}\\ \quad \\ \frac{\partial s_{1}}{\partial x_{1}} =\frac{e^{x_{1}} \cdot sum -e^{x_{1}}\cdot \frac{\partial sum}{\partial x_{1}}}{sum^{2}}\\ \quad\\ =\frac{e^{x_{1}} \cdot sum -e^{x_{1}} \cdot e^{x_{1}}}{sum^{2}}\\ \quad\\ = s_{1} - s_{1}^{2} \\ s1=t=1kextex1=sumex1sum=

softmax函数和交叉熵是深度学习中经常使用的重要概念。 首先来解释一下softmax函数softmax函数是一种常用的激活函数,它将输入的实数向量转换为一组概率分布。其定义如下: $$ softmax(\mathbf{z})_i = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} $$ 其中,$\mathbf{z}$是输入的实数向量,$K$是向量的维度。该函数通过对每个输入值应用指数函数并进行归一化,得到一组概率值。softmax函数常用于多分类问题的输出,将原始的得分或概率转化为每个类别的概率。 接下来是交叉熵,它是常用的损失函数,用于衡量模型输出的概率分布与真实标签的差异。对于二分类问题,交叉熵的定义如下: $$ H(p, q) = -\sum_{i=1}^{2} p_i \log(q_i) $$ 其中,$p$是真实标签的概率分布,$q$是模型输出的概率分布。交叉熵损失函数希望模型的预测概率分布尽可能接近真实分布,从而提供一个优化目标。 当使用softmax函数作为激活函数并使用交叉熵作为损失函数时,我们可以使用反向梯度传导算法来更新模型参数,以减小损失函数的值。具体来说,我们首先计算损失函数对输出的梯度,然后通过链式法则将梯度传递回网络的每一,并将参数按梯度方向更新。对于softmax函数,其梯度计算如下: $$ \frac{\partial softmax(\mathbf{z})_i}{\partial z_j} = \frac{\partial}{\partial z_j} \left( \frac{e^{z_i}}{\sum_{k=1}^{K} e^{z_k}} \right) = \begin{cases} softmax(\mathbf{z})_i (1 - softmax(\mathbf{z})_i) & i = j \\ - softmax(\mathbf{z})_i \cdot softmax(\mathbf{z})_j & i \neq j \end{cases} $$ 对于交叉熵损失函数,其对模型输出的梯度计算如下: $$ \frac{\partial H(p, q)}{\partial q_i} = - \frac{p_i}{q_i} $$ 通过将以上两种梯度进行链式法则的组合运算,我们可以计算出损失函数对模型输入的梯度,从而实现反向梯度传导,以调整模型参数使其逐渐趋近于最优值。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值