softmax的loss和gradient推导过程

本文详细介绍了softmax的损失(loss)计算和梯度(grad)推导过程,包括naive loop和vectorization的实现方式。博主分享了在cs231n课程作业中的学习体验,探讨了对正确分类和错误分类的得分如何影响梯度,并提供了相应的Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

softmax的loss和gradient推导过程

  相信搞deeplearning的各位大牛都很熟悉softmax了,用来对得分矩阵做归一化得到概率的一种分类手段,我这两天在做cs231n的作业,新手上路,只作为自己的学习足迹记录,还望各位大佬多多包涵。

  • 简单介绍
  • Softmax的loss计算
  • Softmax的grad计算
  • naive loop
  • vectorization

简单介绍

每个样本的loss

  这个公式是大家非常熟悉的,其实就是对于神经网络最后一层的结果进行指数概率的归一化,其中Li求得的是对于每个样本而言,它在所有类别中,被分类位正确的概率,syi代表样本被正确分类的评分,sj代表样本被分类为j的评分。 其实对于loss的求解很简单,主要的难度就在于对于梯度的求解。

loss的计算

  根据上面的定义其实很容易计算loss,把所有样本i的Li加起来就是最终的结果,需要注意的是L的维度,和分数矩阵相同,最后再计算的时候用numpy.sum函数求矩阵的所有元素之和即可。另外需要考虑的就是归一化和正则化,归一化除以训练样本数就行。做作业的时候说的是用L2正则化,也就是把regularization_rate*W*W加在loss后面即可。

这里写图片描述

梯度grad的计算

### Softmax 函数及其梯度计算 Softmax 函数是一种常用的激活函数,在多分类问题中用于将模型的输出转换为概率分布形式。其数学表达式如下: 对于输入向量 \( z \),第 \( i \) 个类别的 softmax 输出可以表示为: \[ S(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} \] 其中,\( K \) 是类别总数。 #### 梯度计算公式 在机器学习优化过程中,通常需要计算损失函数相对于参数的梯度。假设交叉熵作为损失函数,则其关于 \( z_k \) 的偏导数可以通过链式法则推导得出。具体而言,当目标标签为独热编码时,softmax 函数的梯度公式为: \[ \frac{\partial L}{\partial z_k} = S(z_k) - y_k \] 这里,\( y_k \) 表示真实标签中的第 \( k \) 类(通常是 0 或 1),而 \( S(z_k) \) 则是预测的概率[^1]。 上述公式的推导依赖于两个主要部分:一是 softmax 自身的性质;二是交叉熵损失函数的形式。完整的推导过程涉及对 softmax log-likehood loss 进行逐项求导,并最终得到简化后的结果。 以下是实现 softmax 及其梯度计算的一个 Python 示例代码片段: ```python import numpy as np def softmax(x): """Compute the softmax of vector x.""" exp_x = np.exp(x - np.max(x)) # Subtract max for numerical stability return exp_x / exp_x.sum(axis=0) def cross_entropy_loss_gradient(logits, labels): """ Compute the gradient of the cross-entropy loss with respect to logits. Args: logits (numpy.ndarray): The raw output scores from a model (logits). labels (numpy.ndarray): One-hot encoded true class labels. Returns: numpy.ndarray: Gradient of the loss w.r.t. each logit. """ probs = softmax(logits) grad = probs - labels return grad # Example usage logits_example = np.array([2.0, 1.0, 0.1]) labels_example = np.array([1.0, 0.0, 0.0]) # True label is first class gradient = cross_entropy_loss_gradient(logits_example, labels_example) print(gradient) ``` 此代码展示了如何通过简单的矩阵运算完成 softmax 以及对应梯度的计算。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值