Caffe Softmax 层的实现原理【细节补充】

简介: Caffe Softmax 层的实现原理【细节补充】

本文是看了知乎的这篇文章以后觉得作者写的很好,但是有些细节讲解得不够详细,回复里面大家也多有疑问,特加以补充:


为了对原作者表示尊重和感谢,先注明原作出处:


作者:John Wang


链接:https://www.zhihu.com/question/28927103/answer/78810153



作者原文和我的补充


====================================


设 z 是 softmax loss 层的输入,f(z)是 softmax 的输出,即


image.png

y 是输入样本 z 对应的类别,y=0,1,...,N

对于 z ,其损失函数定义为

image.png

展开上式:

image.png

对上式求导,有

image.png

梯度下降方向即为

image.png

====================================

增加关于 softmax 层的反向传播说明

设 softmax 的输出为 a ,输入为 z ,损失函数为 l

image.png

image.png

其中

image.png在 caffe 中是 top_diff,a 为 caffe 中得 top_data,需要计算的是image.png

image.png  if i!=k

image.pngif i==k

【我的补充】

----------------------------------------------------------------

image.png

image.png

----------------------------------------------------------------

于是

image.png

【我的补充】

----------------------------------------------------------------

image.png

image.png

image.png

image.png

把负号提出去,改为点乘,即得到上式。注意,这里的 n 表示 channels,这里的 k 和 caffe 源码中的 k 含义不同。

----------------------------------------------------------------

整理一下得到

image.png

其中image.png表示将标量扩展为 n 维向量,表示向量按元素相乘


【我的补充】


----------------------------------------------------------------


这边作者讲解得有误,因为对照代码可以发现,点乘后其实得到的是 1*inner_num  大小的向量,所以为了对应通道相减,需要将其扩展为 channels*inner_num 的矩阵,而不是 n 维向量。


最后矩阵再按元素进行相乘。



 对照 caffe 源码

  // top_diff : l 对 a 向量求偏导
  // top_data :a 向量
  // 将 top_diff 拷贝到 bottom_diff
  // dim = channels * inner_num_
  // inner_num_ = height * width
  caffe_copy(top[0]->count(), top_diff, bottom_diff);
  // 遍历一个 batch 中的样本
  for (int i = 0; i < outer_num_; ++i) {
    // compute dot(top_diff, top_data) and subtract them from the bottom diff
    // 此处计算两个向量的点积,注意 top_diff 已经拷贝到 bottom_diff 当中
    // 步长为 inner_num_(跨通道)构造一个长度为 channels (类别个数)的向量,进行点乘
    for (int k = 0; k < inner_num_; ++k) {
      scale_data[k] = caffe_cpu_strided_dot<Dtype>(channels,
          bottom_diff + i * dim + k, inner_num_,
          top_data + i * dim + k, inner_num_);
    }
    // subtraction
    // 此处计算大括号内的减法(即负号)
    // 将 scale_data 扩展为 channels 个通道(多少个类别),再和 bottom_diff 对应的通道相减
    caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, channels, inner_num_, 1,
        -1., sum_multiplier_.cpu_data(), scale_data, 1., bottom_diff + i * dim);
  }
  // elementwise multiplication
  // 元素级的乘法
  // 此处计算大括号外和 a 向量的乘法
  caffe_mul(top[0]->count(), bottom_diff, top_data, bottom_diff)
目录
相关文章
|
25天前
|
机器学习/深度学习 关系型数据库 MySQL
大模型中常用的注意力机制GQA详解以及Pytorch代码实现
GQA是一种结合MQA和MHA优点的注意力机制,旨在保持MQA的速度并提供MHA的精度。它将查询头分成组,每组共享键和值。通过Pytorch和einops库,可以简洁实现这一概念。GQA在保持高效性的同时接近MHA的性能,是高负载系统优化的有力工具。相关论文和非官方Pytorch实现可进一步探究。
73 4
|
1月前
|
PyTorch 算法框架/工具
Pytorch中最大池化层Maxpool的作用说明及实例使用(附代码)
Pytorch中最大池化层Maxpool的作用说明及实例使用(附代码)
52 0
|
2月前
|
机器学习/深度学习 Java 网络架构
YOLOv5改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)
YOLOv5改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)
95 0
|
3月前
|
PyTorch 算法框架/工具
Bert PyTorch 源码分析:一、嵌入层
Bert PyTorch 源码分析:一、嵌入层
32 0
|
机器学习/深度学习 计算机视觉
用实验数据验证面试题:VGG使用3x3卷积核的优势
用实验数据验证面试题:VGG使用3x3卷积核的优势
396 0
用实验数据验证面试题:VGG使用3x3卷积核的优势
|
1月前
|
机器学习/深度学习 存储 人工智能
一文搞懂 Transformer 工作原理 !!
一文搞懂 Transformer 工作原理 !!
30 0
|
1月前
|
机器学习/深度学习 自然语言处理 PyTorch
Vision Transformers的注意力层概念解释和代码实现
2017年推出《Attention is All You Need》以来,transformers 已经成为自然语言处理(NLP)的最新技术。2021年,《An Image is Worth 16x16 Words》,成功地将transformers 用于计算机视觉任务。从那时起,许多基于transformers的计算机视觉体系结构被提出。
20 0
|
2月前
|
机器学习/深度学习 Java 网络架构
YOLOv8改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)
YOLOv8改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)
99 0
|
5月前
|
机器学习/深度学习 PyTorch 算法框架/工具
SE 注意力模块 原理分析与代码实现
本文介绍SE注意力模块,它是在SENet中提出的,SENet是ImageNet 2017的冠军模型;SE模块常常被用于CV模型中,能较有效提取模型精度,所以给大家介绍一下它的原理,设计思路,代码实现,如何应用在模型中。
248 0
|
10月前
|
PyTorch 算法框架/工具
【PyTorch】两种不同分类层的设计方法
【PyTorch】两种不同分类层的设计方法
49 0