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)
目录
相关文章
|
4月前
|
机器学习/深度学习 关系型数据库 MySQL
大模型中常用的注意力机制GQA详解以及Pytorch代码实现
GQA是一种结合MQA和MHA优点的注意力机制,旨在保持MQA的速度并提供MHA的精度。它将查询头分成组,每组共享键和值。通过Pytorch和einops库,可以简洁实现这一概念。GQA在保持高效性的同时接近MHA的性能,是高负载系统优化的有力工具。相关论文和非官方Pytorch实现可进一步探究。
651 4
|
4月前
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】CoordAttention: 用于移动端的高效坐标注意力机制 (论文笔记+引入代码)
该专栏聚焦YOLO目标检测的创新改进与实战,介绍了一种新的移动网络注意力机制——坐标注意力。它将位置信息融入通道注意力,通过1D特征编码处理,捕获长距离依赖并保持位置精度。生成的注意力图能增强目标表示,适用于MobileNetV2、MobileNeXt和EfficientNet等网络,提高性能,且几乎不增加计算成本。在ImageNet分类和下游任务(目标检测、语义分割)中表现出色。YOLOv8中引入了CoordAtt模块,实现位置敏感的注意力。更多详情及配置见相关链接。
|
4月前
|
PyTorch 算法框架/工具
Pytorch中最大池化层Maxpool的作用说明及实例使用(附代码)
Pytorch中最大池化层Maxpool的作用说明及实例使用(附代码)
412 0
|
18天前
|
机器学习/深度学习 PyTorch 算法框架/工具
CNN中的注意力机制综合指南:从理论到Pytorch代码实现
注意力机制已成为深度学习模型的关键组件,尤其在卷积神经网络(CNN)中发挥了重要作用。通过使模型关注输入数据中最相关的部分,注意力机制显著提升了CNN在图像分类、目标检测和语义分割等任务中的表现。本文将详细介绍CNN中的注意力机制,包括其基本概念、不同类型(如通道注意力、空间注意力和混合注意力)以及实际实现方法。此外,还将探讨注意力机制在多个计算机视觉任务中的应用效果及其面临的挑战。无论是图像分类还是医学图像分析,注意力机制都能显著提升模型性能,并在不断发展的深度学习领域中扮演重要角色。
58 10
|
4月前
|
机器学习/深度学习 存储 TensorFlow
【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)
【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)
172 0
|
1月前
|
机器学习/深度学习 自然语言处理
ChatGPT 等相关大模型问题之Attention 机制的定义如何解决
ChatGPT 等相关大模型问题之Attention 机制的定义如何解决
|
2月前
|
机器学习/深度学习 计算机视觉 网络架构
【YOLOv8改进 - 注意力机制】HCF-Net 之 PPA:并行化注意力设计 | 小目标
YOLO目标检测专栏介绍了HCF-Net,一种用于红外小目标检测的深度学习模型,它通过PPA、DASI和MDCR模块提升性能。PPA利用多分支特征提取和注意力机制,DASI实现自适应特征融合,MDCR通过多层深度可分离卷积细化空间特征。HCF-Net在SIRST数据集上表现出色,超越其他方法。论文和代码分别在[arxiv.org](https://arxiv.org/pdf/2403.10778)和[github.com/zhengshuchen/HCFNet](https://github.com/zhengshuchen/HCFNet)上。YOLOv8的PPA类展示了整合注意力机制的结构
|
3月前
|
机器学习/深度学习 计算机视觉
YOLOv5改进 | 卷积模块 | 将Conv替换为轻量化的GSConv【原理 + 完整代码】
在这个教程中,作者介绍了如何将YOLOv5中的Conv模块替换为新型轻量级卷积GSConv,以实现模型瘦身并保持准确性。GSConv结合了分组卷积和空间卷积,减少了计算量。文章详细阐述了GSConv的原理,并提供了添加GSConv到YOLOv5的代码实现步骤。此外,还提到了Slim-neck by GSConv技术,它通过通道压缩和高效连接优化网络结构。读者可以获取完整代码进行实践,适用于资源受限的环境,如移动设备和实时应用。
|
4月前
|
机器学习/深度学习 自然语言处理 并行计算
一文搞懂Transformer架构的三种注意力机制
一文搞懂Transformer架构的三种注意力机制
449 1
|
3月前
|
计算机视觉 机器学习/深度学习 自然语言处理
【YOLOv8改进】CoTAttention:上下文转换器注意力(论文笔记+引入代码)
本文介绍了YOLO目标检测的创新改进,提出了一种名为Contextual Transformer (CoT)块的新型Transformer模块,用于增强视觉识别能力。CoT块通过3×3卷积编码上下文信息,并结合动态多头注意力矩阵,提高了视觉表示。此外,还提到了Large Separable Kernel Attention (LSKA)模块,它解决了大内核卷积的计算效率问题。CoTNet是基于CoT模块的Transformer风格骨干网络,可替代ResNet中的3×3卷积。CoTAttention类展示了如何在YOLOv8中集成此模块。文章还提供了源码链接和更多实战案例详情。