西瓜书之误差逆传播公式推导、源码解读及各种易混淆概念

2023-10-29

关键词:反向传播(BP);caffe源码;im2col;卷积;反卷积;上池化;上采样

公式推导

以前看到一长串的推导公式就想直接跳过,今天上午莫名有耐心,把书上的公式每一步推导自己算一遍,感觉豁然开朗。遂为此记。
在这里插入图片描述

sigmoid函数求导比relu复杂一点。如果采用relu,神经元输入和输出的导数就为1,计算更方便。
因为更新的原则是朝着损失降低最快的方向更新,可以把w看成是自变量,系数的计算就是反向传播的过程,系数越大,降低越快。


Caffe 源码解读

前向传播源码:

//前向传播
template <typename Dtype>
void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
      const vector<Blob<Dtype>*>& top) {
  //blobs_[0]保存权值, blobs_[1]保存偏置
  const Dtype* weight = this->blobs_[0]->cpu_data();
  //bottom.size()是bottom中blob的数量,等于top中blob的数量,一般情况下为1
  for (int i = 0; i < bottom.size(); ++i) {
    //获取输入,输出数据指针
    const Dtype* bottom_data = bottom[i]->cpu_data();
    Dtype* top_data = top[i]->mutable_cpu_data();
	//第n张图片
    for (int n = 0; n < this->num_; ++n) {
      //卷积操作,采用矩阵乘积实现
     // bottom_dim_ =3*28*28
     // kernel = 20*5*5
     // top_dim_ = 20*24*24
      this->forward_cpu_gemm(bottom_data + n * this->bottom_dim_, weight,
          top_data + n * this->top_dim_);
      if (this->bias_term_) {
        const Dtype* bias = this->blobs_[1]->cpu_data();
		//加上偏置
        this->forward_cpu_bias(top_data + n * this->top_dim_, bias);
      }
    }
  }
}

反向传播源码:

//反向传播
template <typename Dtype>
void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
      const vector<bool>& propagate_down/*是否反传*/, const vector<Blob<Dtype>*>& bottom) {
  const Dtype* weight = this->blobs_[0]->cpu_data();
  Dtype* weight_diff = this->blobs_[0]->mutable_cpu_diff();
  for (int i = 0; i < top.size(); ++i) {
	//上一层传下来的导数
    const Dtype* top_diff = top[i]->cpu_diff();
    const Dtype* bottom_data = bottom[i]->cpu_data();
	//传给下一层的导数
    Dtype* bottom_diff = bottom[i]->mutable_cpu_diff();
    // Bias gradient, if necessary.
	// 更新偏置,直接加上残差(每个偏置所对应的图内所有残差之和)
    if (this->bias_term_ && this->param_propagate_down_[1]) {
      Dtype* bias_diff = this->blobs_[1]->mutable_cpu_diff();
      for (int n = 0; n < this->num_; ++n) {
        this->backward_cpu_bias(bias_diff, top_diff + n * this->top_dim_);
      }
    }
    if (this->param_propagate_down_[0] || propagate_down[i]) {
      for (int n = 0; n < this->num_; ++n) {
        // gradient w.r.t. weight. Note that we will accumulate diffs.
		// 对weight 计算导数(用来更新weight)
        // /将下一层残差与weight进行相关计算,得到卷积层的残差
        if (this->param_propagate_down_[0]) {
          this->weight_cpu_gemm(bottom_data + n * this->bottom_dim_,
              top_diff + n * this->top_dim_, weight_diff);
        }
        // gradient w.r.t. bottom data, if necessary.
		// 对bottom数据计算导数(传给下一层)
		// bottom_data与top_diff做相关计算,得到w权值更新量
        if (propagate_down[i]) {
          this->backward_cpu_gemm(top_diff + n * this->top_dim_, weight,
              bottom_diff + n * this->bottom_dim_);
        }
      }
    }
  }
}

所以也就更好理解为什么
bottom_data * top_diff = weight_diff
top_diff * weight = bottom_diff

真实的过程应该是一个不断的循环

bottom_data * top_diff = weight_diff(用于更新当前层的权值)
top_diff * weight = bottom_diff (传递到下一层)
(上一层的bottom_diff 是下一层的top_diff )
bottom_data * top_diff = weight_diff (用于更新当前层的权值)
top_diff * weight = bottom_diff(继续传递到下一层)


关于提升卷积速度(im2col)

在这里插入图片描述

卷积核横向展开为1行

在这里插入图片描述

将多个通道应用卷积核的相同位置区域(3维数据)纵向展开为一列

案例1: 前向传播
在这里插入图片描述kernel size:20 * 5 * 5
input blob:1 * 28 * 28
output blob:20 * 24 * 24(576)

在这里插入图片描述

kernel size:50 * 5 * 5
input blob:20 * 12 * 12
output blob:50 * 8 * 8

参考链接

案例2(前向传播、计算bottom_diff、计算weight_diff):
在这里插入图片描述
核心思想:
将卷积核展开成行。
将不同图片相同位置的卷积区域提取成列。
定格位置的数目即输出特征图像的大小。

反向传播过程中pad的问题
假设输入特征图 m * m,输出特征图 n * n
卷积过程pad(p) ,stride(s) =1 ,kernel (k)
n = (m+2p-k)/ s +1
m - n = k -1-2p
若 p = (k-1)/ 2,m = n
若 p != (k-1)/ 2,要考虑补边。


卷积与反卷积

卷积过程:
在这里插入图片描述

反卷积过程:
在这里插入图片描述

卷积 | 反向传播 | 反卷积 | 导向反向传播 | 的区别

在这里插入图片描述

  • 反向传播要记录先前输入大于0的位置,反卷积只考虑梯度
  • 反卷积的参数需要学习,反向传播用的是既有参数。

上池化 | 上采样 | 反卷积 | 的区别

上池化(UnPooling)、上采样(UnSampling)、反卷积(Deconvolution)
在这里插入图片描述

图(a)表示UnPooling的过程,特点是在Maxpooling的时候保留最大值的位置信息,之后在unPooling阶段使用该信息扩充Feature Map,除最大值位置以外,其余补0。
与之相对的是图(b),两者的区别在于UnSampling阶段没有使用MaxPooling时的位置信息,而是直接将内容复制来扩充FeatureMap。从图中即可看到两者结果的不同。
图(c)为反卷积的过程,反卷积是卷积的逆过程,又称作转置卷积。最大的区别在于反卷积过程是有参数要进行学习的(类似卷积过程),理论是反卷积可以实现UnPooling和unSampling,只要卷积核的参数设置的合理。

backward propagation:记录输入大于0的位置
unpooling:记录最大值信息(如果池化采用的是平均池化,那么UnPooling和unSampling类似)

参考链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

西瓜书之误差逆传播公式推导、源码解读及各种易混淆概念 的相关文章

  • 12 papers to understand QA system with Deep Learning

    由于最近入手NLP任务 需要看一些paper 本文对最近两周看的paper做个总结 适用于有deep learning背景 希望了解NLP应用的同学 主要针对NLP方向 问答系统 QA 和翻译 Machine Translation 本文提
  • 【Machine Learning】5.特征工程和多项式回归

    特征工程和多项式回归 1 导入 2 多项式特征 3 特征选择 4 多项式特征与线性特征的关联 5 特征缩放 Scaling features 6 复杂函数的拟合 7 课后题 特征工程 使用线性回归机制来拟合非常复杂甚至非线性 存在 x n
  • 预测数值型数据:回归

    本文传送机 用线性回归找到最佳拟合直线 局部加权线性回归 通过缩减系数来 理解 数据 岭回归 lasso 前向逐步回归 用线性回归找到最佳拟合直线 线性回归 优点 结果易于理解 计算上不复杂 缺点 对非线性的数据拟合不好 适用数据类型 数值
  • 如何动态调试Python的第三方库

    注意 本文方法仅限于调试安装时附带py源码的库 如sklearn 引入 用sklearn中的sklearn feature extraction text TfidfTransformer来获取TF特征 但发现sklearn的计算结果与我手
  • 机器学习、深度学习、图像检索 的一些优秀博客

    机器学习 深度学习 图像检索 的一些优秀博客 1 http www cnblogs com ooon 2 http yongyuan name blog
  • 西瓜书之误差逆传播公式推导、源码解读及各种易混淆概念

    关键词 反向传播 BP caffe源码 im2col 卷积 反卷积 上池化 上采样 公式推导 以前看到一长串的推导公式就想直接跳过 今天上午莫名有耐心 把书上的公式每一步推导自己算一遍 感觉豁然开朗 遂为此记 sigmoid函数求导比rel
  • 朴素贝叶斯分类器(Naive Bayes Classifiers)

    原文地址 Naive Bayes Classifiers 本文讨论的是朴素贝叶斯分类器 Naive Bayes classifiers 背后的理论以及其的实现 朴素贝叶斯分类器是分类算法集合中基于贝叶斯理论的一种算法 它不是单一存在的 而是
  • kaldi中SHELL调用C++程序过程源码分析

    引入 kaldi真正的核心源码 都是C 写成的 这个结论可以从如下两点得以确认 1 在kaldi的源码kaldi src目录下 能看到很多扩展名为 cc的源程序 这是linux下C 源码 2 在源码中 比如kaldi src featbin
  • 西瓜书作业4.4(基于基尼指数划分决策树,未剪枝/预剪枝/后剪枝)

    文章目录 题目 未减枝 思想 画图 预剪枝 思想 画图 后剪枝 思想 画图 比较总结 参考 全部代码 画图代码 题目 试编程实现基于基尼指数进行划分选择的决策树算法 为表4 2中数据生成预剪枝 后剪枝决策树 并与未剪枝决策树进行比较 牢骚
  • 机器学习之梯度提升树(机器学习技法)

    梯度提升树模型 Gradient Boosted Decision Tree 与随机森林的对比 前面提到的随机森林使用Bagging的方式融合起来 也就是使用bootstrapping进行抽样得到不同的样本再加上不同的特征选择训练出不同的决
  • 朴素贝叶斯理论推导与三种常见模型

    朴素贝叶斯 Naive Bayes 是一种简单的分类算法 它的经典应用案例为人所熟知 文本分类 如垃圾邮件过滤 很多教材都从这些案例出发 本文就不重复这些内容了 而把重点放在理论推导 其实很浅显 别被 理论 吓到 三种常用模型及其编码实现
  • 从零推导一个多层感知机神经网络(附matlab源码,可直接运行)

    可以先跳到代码示例部分看看效果 算法基础 激活函数 损失函数 链式法则 向量求导 代码示例 代码文件结构说明 函数脚本 可运行脚本 效果演示 代码下载链接 算法基础 激活函数 激活函数的作用 激活函数把非线性引入了神经网络 后面的代码用到的
  • R-squared 和 Adjusted R-squared联系与区别

    原文见 https discuss analyticsvidhya com t difference between r square and adjusted r square 264 8 下面是自己理解的总结 大概意思就是说 R squ
  • pandas中的时间序列

    一 夯实基础 datetime 模块中的数据类型 date 以公历形式存储日历日期 年月日 time 将时间存储为时分秒毫秒 datetime 存储日期和时间 timedelta 表示两个datetime值之间的差 日 秒 毫秒 1 获取当
  • python 读写hive

    最近正在 做一个 项目 需要把 算法模型的结果持久化 至hive 目前 使用的 pyhive 切记 在windows上不能使用 我目前在centos6 5上使用 官方说再macos和linux上可用 from pyhive import h
  • 【机器学习详解】SVM解二分类,多分类,及后验概率输出

    转载请注明出处 http blog csdn net luoshixian099 article details 51073885 CSDN 勿在浮沙筑高台 color Blue CSDN 21247 22312 28014 27801 3
  • 【CS229 lecture19】微分动态规划

    首先声明一下 这节课基本没听懂 但是还是把课程笔记写下 lecture19 微分动态规划 继续强化学习算法的讨论 Agenda 课程中段我曾讲过调试learning algorithm 今天再来将强化学习的部分 The motivating
  • 深度学习 vs 概率图模型 vs 逻辑学

    深度学习 vs 概率图模型 vs 逻辑学 发表于 2015 04 30 21 55 1359次阅读 来源 quantombone 0 条评论 作者 Tomasz Malisiewicz 深度学习 deep learning 图模型 人工智能
  • 【nlp-with-transformers】

    今天社群中的小伙伴面试遇到了一个问题 如何保证生成式语言模型在同样的输入情况下可以保证同样的输出 这里面造成问题的因素有两个方面 一个方面是在forward过程中参数的计算出现了差异 这种情况一般发生在游戏显卡中 游戏显卡无法保证每一次底层
  • Several Machine Learning Problems

    Classification Classification algorithms are algorithms that learn topredict theclass orcategory of an instance of data

随机推荐

  • 手机主域名服务器修复,手机主域名服务器修复

    手机主域名服务器修复 内容精选 换一换 安装依赖时 使用pip3 7 5 install xxx命令安装相关软件时提示无法连接网络 且提示 Could not find a version that satisfies the requir
  • SQL Server问题记录

    问题 DataGrip连接SQL Server 连接SQL Server失败 默认使用的驱动是sqljdbc4 结果报错信息如下 08S01 驱动程序无法通过使用安全套接字层 SSL 加密与 SQL Server 建立安全连接 错误 The
  • Zero Tier Windows远程桌面 免费跨网段 不在一个局域网 免费内网穿透

    1 注册 点击连接 ZeroTier Central 2 添加网络 点击 Create A Network 获取该网络network ID 下载 软件 https www zerotier com download 运行 右击右下角 图标
  • yolov5_prune剪枝训练记录及遇见的问题

    学习参考链接 转发 深度学习模型压缩与加速理论与实战 一 模型剪枝 AHU WangXiao 博客园 cnblogs com 剪枝顾名思义 就是通过一些算法或规则删去一些不重要的部分 来使模型变得更加紧凑 减小计算或者搜索的复杂度 它包括四
  • elasticsearch初识

    初识elasticsearch 了解ES elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎 具备非常多强大功能 可以帮助我们从海量数据中快速找到需要的内容 例如 在GitHub搜索代码 在电商网站搜索
  • mysql没开启binlog恢复删除表_无全量备份、未开启binlog日志,利用percona工具恢复delete的数据...

    当我们忘记做全量备份时 并且没有开启binlog 并执行了delete from sbtest 数据全部丢失 要想恢复是很有难度的 今天 利用Percona Data Recovery Tool for InnoDB工具 仅支持InnoDB
  • Dubbo(二)详细介绍

    转自 https www cnblogs com juncaoit p 7686510 html 1 背景 随着互联网的发展 网站应用的规模不断扩大 常规的垂直应用架构已无法应对 分布式服务架构以及流动计算架构势在必行 亟需一个治理系统确保
  • Service的两种启动方式之间的比较与区别

    在Android中 有两种主要的方式可以启动Service 启动式启动和绑定式启动 1 启动式启动 Start Service 使用 startService 方法启动Service Service在后台运行 独立于启动它的组件 如Acti
  • spark读取hive

    spark读取hive是最简单的 构造一个sparksession对象 直接执行SQL就得读取 然后直接insert就能写入 因为spark客户端配置了你的hive数据库的信息 所以能够直接读取hive数据库 spark SparkSess
  • AI绘图实战(五):放大并修复老照片、马赛克照片、身份证件照

    S 你安装stable diffusion就是为了看小姐姐么 I 当然不是 当然是为了公司的发展谋出路 预先学习 安装及其问题解决参考 Windows安装Stable Diffusion WebUI及问题解决记录 运行使用时问题 Windo
  • 一根网线两台电脑传输文件

    用两个网线连接两台电脑 确保网线连接没有问题 打开网络共享中心 然后打开更改适配器设置 选择以太网 右键属性 4 双击 Internet协议版本4 TCP IPv4 然后进行如下设置 在另一台电脑上进行上述一样的操作 只是IP地址的设置不同
  • android编程中遇到的关于 java.lang.NullPointerException错误的原因及解决办法

    LogCat中的错误提示如下 04 29 09 43 23 390 E AndroidRuntime 24967 FATAL EXCEPTION main 04 29 09 43 23 390 E AndroidRuntime 24967
  • 创建型模式5之3-Singleton单例模式的八种写法比较

    单例模式的八种写法比较 单例模式是最常用到的设计模式之一 熟悉设计模式的朋友对单例模式都不会陌生 一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式 但是除了这两种方式 本文还会介绍其他几种实现单例的方式 让我们来一起看看吧
  • 打发时光的102个网站

    1 看看自己具有哪个大明星的脸型 http www play analogia com cgi bin index 2 超有意思的Flash网站 虚拟办公 http agencynet com 3 亲自动手给美女画纹身 http www c
  • nginx 详解反向代理负载均衡

    什么是反向代理负载均衡 使用代理服务器可以将请求转发给内部的Web服务器 使用这种加速模式显然可以提升静态网页的访问速度 因此也可以考虑使用这种技术 让代理服务器将请求 均匀转发给多台内部Web服务器之一上 从而达到负载均衡的目的 这种代理
  • 【blender】材质球参数及各种问题

    目录 材质设置 1 共用一种材质 但是不同颜色 2 关联材质 3 无法绘制贴图 4 材质保存为资产 5 材质描边 材质设置 1 玻璃 1 共用一种材质 但是不同颜色 物体信息节点 gt 仅需改变物体颜色即可 2 关联材质 ctrl L 3
  • 网络安全——命令执行漏洞概述

    一 命令执行漏洞概述 1 基本定义 命令执行漏洞是指攻击者可以随意执行系统命令 分为远程命令执行 远程代码执行 和系统命令执行 2 原理 程序应用有时候需要调用一些执行系统命令的函数 如PHP中的system exec shell exex
  • SpringCloud组件之断路器Hystrix(hoxton版本)

    1 Hystrix 简介 在微服务架构中 根据业务来拆分成一个个的服务 服务与服务之间可以相互调用 RPC 在Spring Cloud可以用RestTemplate Ribbon和Feign来调用 为了保证其高可用 单个服务通常会集群部署
  • WinForm中如何实现panel和SplitContainer相结合进行布局呢

    相信大家都会在winform应用程序中进行布局 通常我们也会使用一下这种布局 如图 以上布局分别采用了Panel 黑色区域 和SplitContainer控件 白色区域 这布局相信大家耳熟能详了 比如VS2010不就是典型这样布局吗 但是需
  • 西瓜书之误差逆传播公式推导、源码解读及各种易混淆概念

    关键词 反向传播 BP caffe源码 im2col 卷积 反卷积 上池化 上采样 公式推导 以前看到一长串的推导公式就想直接跳过 今天上午莫名有耐心 把书上的公式每一步推导自己算一遍 感觉豁然开朗 遂为此记 sigmoid函数求导比rel