【深度学习】softmax和交叉熵的配合求导

        在分类问题中,尤其是在神经网络中,交叉熵函数非常常见。因为经常涉及到分类问题,需要计算各类别的概率,所以交叉熵损失函数与sigmoid函数或者softmax函数成对出现。

1.softmax                

        softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内的概率,进行多分类。

        假设一个数组V,一共有j个元素Vi表示V中的第i个元素,第i个元素的softmax值公式如下。     

        softmax和交叉熵结合,因为交叉熵的输入是概率,而softmax就可以把网络的输出变成对应等比例的概率。

2.交叉熵损失函数(Cross Entropy Error Function)

        1. 二分类的交叉熵损失函数形式

         2.多分类的交叉熵损失函数形式

3.softmax 求导

3-1 求s1对x1的导数 

 3-2 求s1对x2的导数 

        特别注意:因为在计算softmax时候,分母中用到了所有的X,分母包括了e^{x1}e^{x2},……,e^{xj}​​​​​​​,所以任何一个输出节点 S_{i}都要对所有x 进行求导。以求 s1 对 x2 的导数为例,过程如下

 3-3 softmax 的导数

        所以可以得到,i=j 时 和 i 不等于 j 时的 softmax导数。

        注意区分:i是softmax之后得到s的下标,j是进入softmax之前x的下标,注意区分,可以看3-1和3-2的实例进行理解。 

4.softmax和交叉熵损失

4-1 计算过程

        分类任务中搭建神经网络时,交叉熵损失函数经常与softmax配合使用,假设有以下三个向量。

        向量𝑦(为one-hot编码,只有一个值为1,其他的值为0)真实类别标签(维度为𝑚,表示有𝑚类别):

         向量𝑧为softmax函数的输入,和标签向量𝑦的维度一样,为𝑚:

           向量𝑠为softmax函数的输出,和标签向量𝑦的维度一样,为𝑚:

        交叉熵损失函数具体计算公式如下

           损失函数对向量𝑧z中的每个𝑧𝑖求偏导: ​​​​​​​ 

          需计算i等于j和i不等于j的加和,最后的计算结果如下:


 4-2 实例

        通过计算最后得到的某个训练样本的向量的分数是[1,2,3], 经过softmax函数作用后

         假设正确的分类结果是那么计算出来的偏导就是(保留三位有效数字)[0.090-0,0.245-1,0.665-0]=[0.090,-0.755,0.665]。

        由计算结果可见,softmax和交叉熵结合之后求导,就是softmax之后的结果减去对应的y值,由此进行反向传播。 

Reference

        1.https://www.cnblogs.com/smallredness/p/11047718.html

        2.安全验证 - 知乎

### Softmax 交叉熵损失的应用 在机器学习领域,尤其是神经网络中,Softmax 函数通常与交叉熵损失一起使用来处理多分类问题。下面是一个简单的 Python 实现示例,展示了如何计算 softmax 输出以及应用交叉熵损失。 #### 计算 Softmax 的输出 给定一组未归一化的预测分数(logits),可以利用以下公式将其转换成概率分布: \[ \text{softmax}(z_i) = \frac{\exp(z_i)}{\sum_j \exp(z_j)} \] ```python import numpy as np def softmax(logits): exp_logits = np.exp(logits - np.max(logits)) # 数值稳定性考虑 return exp_logits / np.sum(exp_logits) logits_example = [2.0, 1.0, 0.1] print(f"Logits: {logits_example}") probabilities = softmax(logits_example) print(f"Probabilities after applying softmax: {probabilities.tolist()}") ``` 此代码片段定义了一个 `softmax` 函数并对其进行了测试[^1]。 #### 定义交叉熵损失函数 对于单个样本而言,如果已知真实的类别标签 y (one-hot 编码形式),那么可以通过下述方式定义交叉熵损失: \[ H(y,p)=-\sum_{i}y_ilog(p_i)\] 其中 \(p\) 表示由 softmax 得到的概率向量;\(y\) 是实际的目标分布,在这里是 one-hot 向量表示的真实标签。 ```python def cross_entropy_loss(true_labels, predicted_probs): true_class_indices = np.argmax(true_labels, axis=1) log_likelihoods = [] for i in range(len(predicted_probs)): prob_for_true_label = predicted_probs[i][true_class_indices[i]] log_likelihoods.append(-np.log(prob_for_true_label)) average_loss = sum(log_likelihoods)/len(log_likelihoods) return average_loss # 假设我们有三个类别的数据集 num_classes = 3 batch_size = 4 # 创建一些随机的 logits 数据作为输入 random_logits = np.random.rand(batch_size, num_classes) # 应用 softmax 获得预测概率 predicted_probabilities = softmax(random_logits).reshape((batch_size, num_classes)) # 构造一批假的一热编码真实标签 fake_ground_truth = [[1., 0., 0.], [0., 1., 0.], [0., 0., 1.], [1., 0., 0.]][:batch_size] loss_value = cross_entropy_loss(fake_ground_truth, predicted_probabilities) print(f"The computed Cross Entropy Loss is approximately: {loss_value:.4f}") ``` 这段代码实现了手动计算交叉熵损失的过程,并打印出了最终的结果[^2]。 通过上述两个部分可以看出,当面对一个多分类的任务时,先采用 softmax 将原始得分映射至合法的概率空间内,再借助于交叉熵度量模型给出的答案同实际情况间的差距大小,从而指导参数调整过程以优化性能表现[^3]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值