softmax 损失函数与梯度推导「建议收藏」

softmax 损失函数与梯度推导「建议收藏」softmax与svm很类似,经常用来做对比,svm的lossfunction对wx的输出s使用了hingefunction,即max(0,-),而softmax则是通过softmaxfunction对输出s进行了概率解释,再通过crossentropy计算lossfunction。将score映射到概率的softmaxfunction:,其中,,j指代i-thclass。…

大家好,又见面了,我是你们的朋友全栈君。

softmax与svm很类似,经常用来做对比,svm的loss function对wx的输出s使用了hinge function,即max(0,-),而softmax则是通过softmax function对输出s进行了概率解释,再通过cross entropy计算loss function。

将score映射到概率的softmax function:p_i=\frac{e^{f_{i}}}{\sum_{k}e^{f_k}} \quad (1),其中,f_i=W_ix,j指代 i-th class。

对于某一个样本如 X_i 的lost function为L_i = -\sum_{j}y_jlog(p_j) \quad (2).

(注:

1、以下所有的公式为了便于表达,设定只有一个样品,即L_i全部写做 L

2、公式中没有进行偏移,实际算法为了避免指数计算容易越界,需要另做偏移处理)

需要求loss function对W的导数(梯度),实际上是进行链式求导。

从最内层的开始,\frac{\partial p_i}{\partial f_j}=\frac{\partial \frac{e^{f_{i}}}{\sum_{k}e^{f_k}}}{\partial f_j} \quad (3),其中,令g_i=e^{f_i},\quad h_i=\sum_{k}e^{f_k}      已知\frac{\mathrm{d} \frac{g(x)}{h(x)} }{\mathrm{d} x}=\frac{​{g}'(x)h(x)-{h}'(x)g(x)}{h^2(x)} \quad (4)

且有\frac{\partial g_i}{\partial f_j}= \begin{cases} & \text{ if } i=j \quad e^{f_i} \\ & \text{ if } i\neq j \quad 0 \end{cases} \quad (5)\frac{\partial h_i}{\partial f_j}=e^{f_j},for \quad all \quad j \quad (6)

那么(3)式则可以根据(4)(5)(6)写成(注意,下面用\sum作为h的简写

\begin{cases} & \text{ if } i=j, \quad \frac{e^{f_i}\sum-e^{f_j}e^{f_i}}{\sum ^2}=\frac{e^{f_i}}{\sum} \frac{\sum-e^{f_j}}{\sum}= p_i(1-p_j)\\ & \text{ if } i\neq j, \quad \frac{0-e^{f_j}e^{f_i}}{\sum^2} = - \frac{e^{f_j}}{\sum} \frac{e^{f_i}}{\sum}=-p_jp_i \end{cases}

根据链式法则:(\sum_ky_k=1,y是一个只有一个元素为1,其余为0的向量,真正的分类时y_i=1)

\frac{\partial L}{\partial f_i}=\frac{\partial L}{\partial p_k}\frac{\partial p_k}{\partial f_i}=-\sum_k y_k \frac{1}{p_k}\frac{\partial p_k}{\partial f_i}\\ = -y_i(1-p_i) -\sum_{k\neq i}y_k \frac{1}{p_k}(-p_kp_i)\\ = -y_i(1-p_i)+\sum_{k\neq i}y_kp_i\\ =-y_i+y_ip_i+\sum_{k\neq i}y_kp_i\\ =p_i(\sum_ky_k)-y_i=p_i-y_i

最后一步,因为f_i=W_ix,这儿i代表第i个类别。

所以:\frac{\partial L}{\partial W_i}=\frac{\partial L}{\partial f_i} \frac{\partial f_i}{\partial W_i}=(p_i-y_i)x(上面设定了x只有一个,但实际x有n个,是矩阵而非向量)。

上面的公式用代码表示如下:

 for ii in range(num_train):
    current_scores = scores[ii, :]

    # Fix for numerical stability by subtracting max from score vector.
    # important! make them range between infinity to zero
    shift_scores = current_scores - np.max(current_scores)

    # Calculate loss for this example.
    loss_ii = -shift_scores[y[ii]] + np.log(np.sum(np.exp(shift_scores)))
    loss += loss_ii

    for jj in range(num_classes):
      softmax_score = np.exp(shift_scores[jj]) / np.sum(np.exp(shift_scores))

      # Gradient calculation.不懂这儿为什么要乘以x[ii]
      if jj == y[ii]:
        dW[:, jj] += (-1 + softmax_score) * X[ii]
      else:
        dW[:, jj] += softmax_score * X[ii]
        
     # Average over the batch and add our regularization term.
  loss /= num_train
  loss += reg * np.sum(W*W)

  # Average over the batch and add derivative of regularization term.
  dW /= num_train
  dW += 2*reg*W

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153123.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java实现发送邮件工具[通俗易懂]

    java实现发送邮件工具[通俗易懂]java实现发送邮件的功能:首先需要导入mail.jar;然后需要写发送方法:1、邮箱发送封装工具类:packagecom.wxjiameng.utils;importjava.util.Date;importjava.util.Properties;importjavax.activation.DataHandler;importjavax.activation.FileDa

    2022年5月14日
    33
  • Python –函数学习3 (将函数存储在模块中)

    Python –函数学习3 (将函数存储在模块中)

    2021年7月6日
    103
  • 常见http状态码有哪些(常用的http响应状态码)

    HTTP状态码(HTTPStatusCode)是一种表示网页服务器响应状态的三位数字编码。通过这些数字,可以简化状态的表达。状态码有十种,其中首位数字为1-5。根据这5个数字,状态码可以分为5类。1XX表示请求正在处理;2XX表示请求已经成功处理;3XX表示重定向;4xx表示请求错误;5xx表示服务器错误。在嗅探抓包的过程中,常见的状态吗有200和304。这两个状态码都关系到能否获取重要的…

    2022年4月10日
    107
  • 手机app抓包

    手机app抓包总是收到公司部分客户特定机型,情况下才出现的bug此类问题较为难以复现需要客户协助进行抓包处理,写一个简单教程方便与客户沟通!app下载地址链接:https://pan.baidu.com/s/1M8x8DsTy0pcgnGyKEsJ_Ow提取码:cd4i1.安装抓包软件2.进入错误页面的上一个页面如果B页面是出错的页面,点击A(页面或者按钮)进入到B页面那么我们就打开A页面就可以了3.选择需要抓包的应用4.抓取操作信息5.如果错误信息比较多点击.

    2022年5月29日
    37
  • ffmpeg opencv_ffmpeg -q:v

    ffmpeg opencv_ffmpeg -q:v最直接的区别就是av_freep()会在av_free()的基础上,把传入的指针再置为NULL。FFmpeg源代码:av_free()voidav_free(void*ptr){#if

    2022年8月6日
    10
  • redisson分布式锁实现原理_redisson连接池

    redisson分布式锁实现原理_redisson连接池redissonlock、tryLock分布式锁原理解析

    2022年10月15日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号