用反向传导思想求导

Contents

[hide]

  • 1简介
  • 2示例
    • 2.1示例1:稀疏编码中权重矩阵的目标函数
    • 2.2示例2:稀疏编码中的平滑地形L1稀疏罚函数
    • 2.3示例3:ICA重建代价
  • 3中英文对照
  • 4中文译者

简介

在 反向传导算法一节中,我们介绍了在稀疏自编码器中用反向传导算法来求梯度的方法。事实证明,反向传导算法与矩阵运算相结合的方法,对于计算复杂矩阵函数(从矩阵到实数的函数,或用符号表示为:从 )的梯度是十分强大和直观的。

首先,我们回顾一下反向传导的思想,为了更适合我们的目的,将其稍作修改呈现于下:

  1. 对第 nl 层(最后一层)中的每一个输出单元i ,令

    其中 J(z) 是我们的“目标函数”(稍后解释)。

  2. ,
    对第 l 层中的每个节点 i , 令

  3. 计算我们要的偏导数

符号扼要重述:

  • l 是神经网络的层数
  • nl 第l层神经元的个数
  • l 层第 i 个节点到第(l + 1) 层第 j 个节点的权重
  • 是第l 层第 i 个单元的输入
  • 是第l 层第 i 个节点的激励
  • 是矩阵的Hadamard积或逐个元素乘积,对 矩阵AB ,它们的乘积是 矩阵 ,即
  • f(l) 是第 l 层中各单元的激励函数

假设我们有一个函数 FF 以矩阵X 为参数生成一个实数。我们希望用反向传导思想计算 F 关于 X 的梯度,即 。大致思路是将函数F 看成一个多层神经网络,并使用反向传导思想求梯度。

为了实现这个想法,我们取目标函数为 J(z) ,当计算最后一层神经元的输出时,会产生值F(X) 。对于中间层,我们将选择激励函数 f(l)

稍后我们会看到,使用这种方法,我们可以很容易计算出对于输入 X 以及网络中任意一个权重的导数。

示例

为了阐述如何使用反向传导思想计算关于输入的导数,我们要在示例1,示例2中用 稀疏编码 章节中的两个函数。在示例3中,我们使用 独立成分分析一节中的一个函数来说明使用此思想计算关于权重的偏导的方法,以及在这种特殊情况下,如何处理相互捆绑或重复的权重。

示例1:稀疏编码中权重矩阵的目标函数

回顾一下 稀疏编码,当给定特征矩阵 s 时,权重矩阵 A 的目标函数为:

我们希望求 F 对于 A 的梯度,即 。因为目标函数是两个含A 的式子之和,所以它的梯度是每个式子的梯度之和。第二项的梯度很容易求,因此我们只考虑第一项的梯度。

第一项, ,可以看成一个用s 做输入的神经网络的实例,通过四步进行计算,文字以及图形描述如下:

  1. A 作为第一层到第二层的权重。
  2. 将第二层的激励减 x ,第二层使用了单位激励函数。
  3. 通过单位权重将结果不变地传到第三层。在第三层使用平方函数作为激励函数。
  4. 将第三层的所有激励相加。

该网络的权重和激励函数如下表所示:

权重 激励函数 f
1 A f(zi) = zi (单位函数)
2 I (单位向量) f(zi) = zixi
3 N/A

为了使 J(z(3)) = F(x) ,我们可令

一旦我们将 F 看成神经网络,梯度 就很容易求了——使用反向传导得到:

激励函数的导数f' Delta 该层输入z
3 f'(zi) = 2zi f'(zi) = 2zi Asx
2 f'(zi) = 1 As
1 f'(zi) = 1 s

因此

示例2:稀疏编码中的平滑地形L1稀疏罚函数

回顾 稀疏编码一节中对 s 的平滑地形L1稀疏罚函数:

其中 V 是分组矩阵, s 是特征矩阵,ε 是一个常数。

我们希望求得 。像上面那样,我们把这一项看做一个神经网络的实例:

该网络的权重和激励函数如下表所示:

权重 激励函数 f
1 I
2 V f(zi) = zi
3 I f(zi) = zi + ε
4 N/A

为使 J(z(4)) = F(x) ,我们可令

一旦我们把 F 看做一个神经网络,梯度 变得很容易计算——使用反向传导得到:

激励函数的导数 f' Delta 该层输入z
4 (VssT + ε)
3 f'(zi) = 1 VssT
2 f'(zi) = 1 ssT
1 f'(zi) = 2zi s

因此

示例3:ICA重建代价

回顾 独立成分分析(ICA) 一节重建代价一项: ,其中W 是权重矩阵, x 是输入。

我们希望计算 ——对于权重矩阵的导数,而不是像前两例中对于输入的导数。不过我们仍然用类似的方法处理,把该项看做一个神经网络的实例:

该网络的权重和激励函数如下表所示:

权重 激励函数 f
1 W f(zi) = zi
2 WT f(zi) = zi
3 I f(zi) = zixi
4 N/A

为使 J(z(4)) = F(x) ,我们可令

既然我们可将 F 看做神经网络,我们就能计算出梯度 。然而,我们现在面临的难题是W 在网络中出现了两次。幸运的是,可以证明如果 W 在网络中出现多次,那么对于 W 的梯度是对网络中每个W 实例的梯度的简单相加(你需要自己给出对这一事实的严格证明来说服自己)。知道这一点后,我们将首先计算delta:

激励函数的导数 f' Delta 该层输入z
4 f'(zi) = 2zi f'(zi) = 2zi (WTWxx)
3 f'(zi) = 1 WTWx
2 f'(zi) = 1 Wx
1 f'(zi) = 1 x

为计算对于 W 的梯度,首先计算对网络中每个 W 实例的梯度。

对于 WT :

对于 W :

最后进行求和,得到对于 W 的最终梯度,注意我们需要对 WT 梯度进行转置,来得到关于 W 的梯度(原谅我在这里稍稍滥用了符号):

中英文对照

反向传导 backpropagation
稀疏编码 sparse coding
权重矩阵 weight matrix
目标函数 objective
平滑地形L1稀疏罚函数 Smoothed topographic L1 sparsity penalty
重建代价 reconstruction cost
稀疏自编码器 sparse autoencoder
梯度 gradient
神经网络 neural network
神经元 neuron
激励 activation
激励函数 activation function
独立成分分析 independent component analysis
单位激励函数 identity activation function
平方函数 square function
分组矩阵 grouping matrix
特征矩阵 feature matrix

Stanford UFLDL教程 用反向传导思想求导相关推荐

  1. Stanford UFLDL教程 主成分分析(PCA)

    Stanford UFLDL教程 主成分分析 Contents [hide] 1 引言 2 实例和数学背景 3 旋转数据 4 数据降维 5 还原近似数据 6 选择主成分个数 7 对图像数据应用PCA算 ...

  2. Stanford UFLDL教程 反向传播算法(BP算法)

    反向传播算法(BP算法) 假设我们有一个固定样本集 ,它包含  个样例.我们可以用批量梯度下降法来求解神经网络.具体来讲,对于单个样例,其代价函数为: 这是一个(二分之一的)方差代价函数.给定一个包含 ...

  3. Stanford UFLDL教程 稀疏编码自编码表达

    稀疏编码自编码表达 Contents [hide] 1稀疏编码 2拓扑稀疏编码 3稀疏编码实践 3.1将样本分批为"迷你块" 3.2良好的s初始值 3.3可运行算法 4中英文对照 ...

  4. Stanford UFLDL教程 微调多层自编码算法

    微调多层自编码算法 Contents [hide] 1介绍 2一般策略 3使用反向传播法进行微调 4中英文对照 5中文译者 介绍 微调是深度学习中的常用策略,可以大幅提升一个栈式自编码神经网络的性能表 ...

  5. Stanford UFLDL教程 神经网络向量化

    神经网络向量化 在本节,我们将引入神经网络的向量化版本.在前面关于神经网络介绍的章节中,我们已经给出了一个部分向量化的实现,它在一次输入一个训练样本时是非常有效率的.下边我们看看如何实现同时处理多个训 ...

  6. Stanford UFLDL教程 梯度检验与高级优化

    梯度检验与高级优化 众所周知,反向传播算法很难调试得到正确结果,尤其是当实现程序存在很多难于发现的bug时.举例来说,索引的缺位错误(off-by-one error)会导致只有部分层的权重得到训练, ...

  7. Stanford UFLDL教程 Softmax回归

    Softmax回归 Contents [hide] 1简介 2代价函数 3Softmax回归模型参数化的特点 4权重衰减 5Softmax回归与Logistic 回归的关系 6Softmax 回归 v ...

  8. PyTorch 1.0 中文官方教程:Autograd:自动求导

    译者:bat67 最新版会在译者仓库首先同步. PyTorch中,所有神经网络的核心是autograd包.先简单介绍一下这个包,然后训练我们的第一个的神经网络. autograd包为张量上的所有操作提 ...

  9. 【深度学习数学基础之线性代数】研究使用链式法则进行反向传播的求导算法

    链式法则 简单的说链式法则就是原本y对x求偏导,但是由于过程较为复杂,我们需要将函数进行拆分,通过链式进行分别求导,这样会使整个计算更为简单. 假设f = k ( a + b c ) f = k(a ...

最新文章

  1. 前端之css引入方式/长度及颜色单位/常用样式
  2. python登录代码思路_用python登录Dr.com思路以及代码分享
  3. 【Redis】缓存的三大问题及其解决方案
  4. html元素和属性,HTML常用元素和属性(一)
  5. 四.jmeter代码学习, SampleResult【持续更新】
  6. mysql索引 聚集索引_Mysql 索引实现原理. 聚集索引, 非聚集索引
  7. php简单文件上传类
  8. Android 尺寸 神图
  9. 另5个你不知道的HTML5接口API
  10. 解决移动端 footer fixd 定位被键盘顶起来的方案
  11. 不小心rm删除文件怎么办
  12. 关于Terra和Aqua的轨道问题整理
  13. 景观专业设计师必备SketchUp插件合集,你都用过吗?
  14. userdel: user xxx is currently used by process xxx
  15. 单选题 计算机软件一般包括,2016年计算机一级考试《MSOffice》单选题练习及答案...
  16. 手机app显示服务器端异常502,修复 HTTP 502 和 HTTP 503 错误 - Azure App Service | Microsoft Docs...
  17. 强化学习王者荣耀Ai的搭建
  18. InstallShield自定义对话框浅谈(转)
  19. 2018年Java大企业面试问题
  20. 状态机在马蜂窝机票订单交易系统中的应用与优化实践

热门文章

  1. 互联网金融之量化投资深度文本挖掘——附源码文档
  2. 机器学习排序之Learning to Rank简单介绍
  3. 白话Elasticsearch37-深入聚合数据分析之案例实战Date Histogram Aggregation:统计每月电视销量
  4. 系统优化怎么做-Linux系统配置优化
  5. halcon的算子清点:Chapter 7 :Image
  6. 在python中、如果异常并未被处理或捕捉_python异常处理(一)
  7. 微信小程序的搜索和重置功能
  8. 【新星计划】 Python的txt文本操作-读、写
  9. python中重要的模块asyncio
  10. mfc中ado上传image到sql数据库