矩阵求导与BP的证明的建议

前言

在有些博客推导神经网络的BP时,涉及到多次矩阵求导运算,尤其是反向传播时候,求的梯度结果被转置了,比如假设最后一层的输出为

y=σ(w⋅x+b)

那么
∂y∂w∂y∂x=σ′(w⋅x+b)⋅xT=σ′(w⋅x+b)⋅wT

这两个式子到底正确不正确,这个就涉及到矩阵求导了,转没转置这个对推导细节也是蛮重要的,接下来就看看我个人认为比较重要的矩阵求导式子,不定期更新。最后再证明这两个式子的正确性。其实先说一下结论,如果你强抠矩阵求导法则来证明这两个式子,它们是完全错误的。

【PS】我现在怀疑这个与CNN中的卷积核翻转有关系,但是一个是转置,一个是翻转,貌似运算结果也不一样,下一篇博客更新为什么CNN正传和反传的时候卷积核必须有一个翻转,另一个没翻转。

部分关键结论列举

行向量对列向量求导

设Y是n维行向量,X是p维列向量,则

∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1∂x1⋮∂y1∂xp⋯⋱⋯∂yn∂x1⋮∂yn∂xp⎤⎦⎥⎥⎥⎥⎥⎥⎥

列向量对行向量求导

设Y是m维列向量,X是q维行向量,则

∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1∂x1⋮∂ym∂x1⋯⋱⋯∂y1∂xq⋮∂ym∂xq⎤⎦⎥⎥⎥⎥⎥⎥⎥

行向量对行向量求导

设Y是m维的行向量,X是q维的行向量,则

∂Y∂X=[∂Y∂x1⋯∂Y∂xq]

列向量对列向量求导

设Y是m维的列向量,X是q维的列向量,则

∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢∂y1∂X⋮∂ym∂X⎤⎦⎥⎥⎥⎥⎥⎥

元素对矩阵的求导

设y是一个元素,X的一个p×q的矩阵,那么

∂y∂X=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y∂x11⋮∂y∂xp1⋯⋱⋯∂y∂x1q⋮∂y∂xpq⎤⎦⎥⎥⎥⎥⎥⎥⎥

矩阵对行向量求导

设Y是m×n的矩阵,X是q维行向量,那么

∂Y∂X=[∂Y∂xi∂Y∂x2⋯∂Y∂xq]

意思就是矩阵对向量中的每个元素单独求导,涉及矩阵对元素的求导

矩阵对列向量求导

设Y是m×n的矩阵,X是q维列向量,那么

∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢∂y11∂X⋮∂ym1∂X⋯⋱⋯∂y1n∂X⋮∂ymn∂X⎤⎦⎥⎥⎥⎥⎥⎥

涉及到元素对矩阵的求导

行向量对矩阵的求导

设Y是n维行向量,X是p×q的矩阵,那么

∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂Y∂x11⋮∂Y∂xp1⋯⋱⋯∂Y∂x1q⋮∂Y∂xpq⎤⎦⎥⎥⎥⎥⎥⎥⎥

列向量对矩阵求导

设Y是m维列向量,X是p×q的矩阵,那么

∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢∂y1∂X⋮∂ym∂X⎤⎦⎥⎥⎥⎥⎥⎥

矩阵对矩阵求导

设Y是m×n的矩阵,X是p×q的矩阵,那么

∂Y∂X=[∂Y∂x⋅1⋯∂Y∂x⋅q]=⎡⎣⎢⎢⎢⎢⎢⎢∂y1⋅∂X⋮∂ym⋅∂X⎤⎦⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1⋅∂x⋅1⋮∂ym⋅∂x⋅1⋯⋱⋯∂y1⋅∂x⋅q⋮∂ym⋅∂x⋅q⎤⎦⎥⎥⎥⎥⎥⎥⎥

其实就是转换成向量对矩阵或者矩阵对向量的求导。

两个例子

矩阵对矩阵求导

设Y=[adbecf] ,X=⎡⎣⎢uvwxyz⎤⎦⎥ ,根据求导法则得到

∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢∂[abc]∂⎡⎣⎢uvw⎤⎦⎥∂[def]∂⎡⎣⎢uvw⎤⎦⎥∂[abc]∂⎡⎣⎢xyz⎤⎦⎥∂[def]∂⎡⎣⎢xyz⎤⎦⎥⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢∂a∂u∂a∂v∂a∂w∂d∂u∂d∂v∂d∂w∂b∂u∂b∂v∂b∂w∂e∂u∂e∂v∂e∂w∂c∂u∂c∂v∂c∂w∂f∂u∂f∂v∂f∂w∂a∂x∂a∂y∂a∂z∂d∂x∂d∂y∂d∂z∂b∂x∂b∂y∂b∂z∂e∂x∂e∂y∂e∂z∂c∂x∂c∂y∂c∂z∂f∂x∂f∂y∂f∂z⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

表达式对矩阵求导

设X=⎡⎣⎢x1x2x3⎤⎦⎥的n维列向量,W=[w11x21w12x22w13x23],假设F=(W⋅X)T,求∂F∂X

F∂F∂X=(W⋅X)T=[w11⋅x1+w12⋅x2+w13⋅x3w21⋅x1+w22⋅x2+w23⋅x3]=[f1f2]=[∂f1∂X∂f2∂X]=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢∂f1∂x1∂f1∂x2∂f1∂x3∂f2∂x1∂f2∂x2∂f2∂x3⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢w11w12w13w21w22w23⎤⎦⎥=WT

神经网络相关两个验证

前言中列了两个公式,关于结果是转置的原因,我们开证,先设置几个条件:

w是权重矩阵,x是列向量,表示输入样本。

W=[w11w21w12w22w13w23];X=⎡⎣⎢x1x2x3⎤⎦⎥

求证:
∂(W⋅X)∂X=WT;∂(W⋅X)∂W=XT;

第一个证明

设

C=W⋅X=[w11x1+w12x2+w13x3w21x1+w22x2+w23x3]=[c1c2]

利用列向量对列向量的求导法则,可以得到
∂C∂X=⎡⎣⎢⎢∂c1∂X∂c2∂X⎤⎦⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢∂c1∂x1∂c1∂x2∂c1∂x3∂c2∂x1∂c2∂x2∂c2∂x3⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢w11w12w13w21w22w23⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥

所以说,第一个式子如果直接按照矩阵求导法则证明,是完全错误的。除非是

∂((W⋅X)T)∂X=WT

第二个证明

不用证明了,如果W⋅X结果是向量的话,∂(W⋅X)∂W=XT 这个结论必定是错的,不论是依据行向量对矩阵求导还是列向量对矩阵求导,其结果矩阵不可能是X的维度大小,肯定大很多,不信你按照上面的矩阵运算法则自己推导。

然后我解释一下为什么y=σ(w⋅x+b)能推到∂y∂w=σ′(w⋅x+b)⋅xT ,以下纯属个人见解:

其实这一部分推导时候不能用矩阵求导方法,而是直接拆分。

注意,权重大小是 j×i 而非i×j ,表示的是输出到输入的连接权重,而非输入到输出的连接权重,这个从W×x+b而非x×W+b很容易理解到

随后证明流程如下:

yj∂yj∂wji=σ(∑iwji⋅xi+bj)=σ′(∑iwji⋅xi+bj)⋅xi=σ′j⋅xi

然后我们将多个输出神经元 y 对权重的更新组合成矩阵和向量乘积的形式:
∂y∂W=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1∂w11⋮∂y1∂wm1⋯⋱⋯∂yn∂w1n⋮∂yn∂wmn⎤⎦⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢σ′1⋅x1⋮σ′m⋅x1⋯⋱⋯σ′1⋅xn⋮σ′m⋅xn⎤⎦⎥⎥=⎡⎣⎢⎢σ′1⋮σ′m⎤⎦⎥⎥⋅[x1⋯xn]=σ′⋅XT

个人觉得用矩阵求导证明BP有很多漏洞不好做,所以最好的方法是拆分开,按下标证明,即证 ∂E∂Wji而非直接证明 ∂E∂W

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/246621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BP推导——续

前言 之前有证明过一次人工神经网络——【BP】反向传播算法证明 ,但是回头看的时候,有很多地方非常不严谨,特此拿出来再单独证明一次BP,并严格保证其严谨性。如果想看看粗略的证明,可以去看我之前的博客,毕…

CNN反向传播卷积核翻转

前言 前面煞费苦心地严格按照上下标证明BP,主要就是为了锻炼自己的证明时候的严谨性,那么这里也严格按照上下标的计算方法推导为何卷积的反向传播需要将卷积核旋转180 粗略证明 回顾一下BP的第l层第i个偏置的更新 ∂E∂bli∑j(δl1jWl1ji)σ′(zli)\…

matlab学习——强连通分量

前言 最近motion graph相关实验,发现实现运动过渡需要构建运动图,而为了避免运动过渡陷入死胡同,需要对图结构进行裁剪,方法就是计算图模型的极大强联通分量,但是自己懒得去实现,所以就去搜了一下matlab中…

【theano-windows】学习笔记十八——混合蒙特卡洛采样

#前言 继续之前的Theano学习,本次主要学习混合蒙特卡洛(Hybrid Monte-Carlo Sampling)采样算法。 国际惯例,参考网址 Hybrid Monte-Carlo Sampling Hybrid Monte Carlo #理论 能量模型所使用的极大似然学习需要鲁棒的算法进行反向阶段的采样。比如…

【音频处理】离散傅里叶变换

前言 最近复现音乐驱动舞蹈的文章《Dancing-to-Music Character Animation》,用到了与傅里叶变换很相似的称为常Q变换的方法去分割音乐,所以对傅里叶变换做了一个小了解,本文不深入各种乱糟糟的理论,比如什么蝶形算法啥的&#x…

【音频处理】短时傅里叶变换

前言 上一篇博客讲了离散傅里叶变换,里面的实例是对整个信号进行计算,虽然理论上有N点傅里叶变换(本博客就不区分FFT和DFT了,因为它俩就是一个东东,只不过复杂度不同),但是我个人理解是这个N点是信号前面连续的N个数值…

【theano-windows】学习笔记十九——循环神经网络

前言 前面已经介绍了RBM和CNN了,就剩最后一个RNN了,抽了一天时间简单看了一下原理,但是没细推RNN的参数更新算法BPTT,全名是Backpropagation Through Time。 【注】严谨来说RNN有两个称呼:①结构上递归的recursive n…

【theano-windows】学习笔记二十——LSTM理论及实现

前言 上一篇学习了RNN,也知道了在沿着时间线对上下文权重求梯度的时候,可能会导致梯度消失或者梯度爆炸,然后我们就得学习一波比较常见的优化方法之LSTM 国际惯例,参考网址: LSTM Networks for Sentiment Analysis …

刚体运动学——欧拉角、四元数、旋转矩阵

前言 刚体运动旋转一般用:欧拉角、四元数、轴角对等表示,在对某个坐标旋转的时候,只需将欧拉角或四元数转换为旋转矩阵,并与原始坐标相乘,便可得到旋转以后的坐标。这里主要看看欧拉角、四元数和旋转矩阵。 国际惯例…

刚体运动学-四元数插值

前言 之前对写了一篇关于刚体运动学相关知识博客:刚体运动学——欧拉角、四元数、旋转矩阵,本篇博客就举例来说明,如何在运动捕捉数据中进行四元数插值。 国际惯例,参考博客: 探讨:向量(方向…

【TensorFlow-windows】学习笔记一——基础理解

前言 因为Theano已经停止更新了,所以在前面学完Theano搭建RBM,CNN,RNN相关结构以后,还是得选择一个主流框架的,由于我自身的学习最终是向强化学习靠近,可能用到的仿真环境是openai gym,所以选择了继续学习TensorFlow&…

【TensorFlow-windows】学习笔记二——低级API

前言 上一篇博客初步了解了tensorflow中建立机器学习模型的方法:可以使用eager execution和graph execution两种模式,可以使用高级API estimator中已经封装好的模型,也可以自己创建estimator,更重要的是我们也可以使用低级API自行…

【TensorFlow-windows】学习笔记三——实战准备

前言 因为学习TensorFlow的内容较多,如果只看API会很无聊,可以结合实例去学习。但是在构建基本的模型之前,需要学一些准备知识:数据读取、预处理、优化器、损失函数 国际惯例,参考网址: TensorFlow中文社…

【TensorFlow-windows】学习笔记四——模型构建、保存与使用

前言 上一章研究了一些基本的构建神经网络所需的结构:层、激活函数、损失函数、优化器之类的,这一篇就解决上一章遗留的问题:使用CNN构建手写数字识别网络、保存模型参数、单张图片的识别 国际惯例,参考博客: tenso…

【TensorFlow-windows】学习笔记五——自编码器

前言 上一篇博客介绍的是构建简单的CNN去识别手写数字,这一篇博客折腾一下自编码,理论很简单,就是实现对输入数据的重构,具体理论可以看我前面的【theano-windows】学习笔记十三——去噪自编码器 国际惯例,参考博客&…

【TensorFlow-windows】学习笔记六——变分自编码器

#前言 对理论没兴趣的直接看代码吧,理论一堆,而且还有点复杂,我自己的描述也不一定准确,但是代码就两三句话搞定了。 国际惯例,参考博文 论文:Tutorial on Variational Autoencoders 【干货】一文读懂…

【TensorFlow-windows】学习笔记七——生成对抗网络

前言 既然学习了变分自编码(VAE),那也必须来一波生成对抗网络(GAN)。 国际惯例,参考网址: 论文: Generative Adversarial Nets PPT:Generative Adversarial Networks (GANs) Generative Adversarial Nets in TensorFlow GAN原理学习笔记…

Openpose——windows编译(炒鸡简单)

前言 最近准备看看rtpose的代码,发现已经由openpose这个项目维护着了,由于经常在windows下调试代码,所以尝试了一下如何在windows下编译openpose源码,整体来说非常简单的。 国际惯例,参考博客: [OpenPos…

【TensorFlow-windows】学习笔记八——简化网络书写

前言 之前写代码的时候都要预先初始化权重,还得担心变量是否会出现被重复定义的错误,但是看网上有直接用tf.layers构建网络,很简洁的方法。 这里主要尝试了不预定义权重,是否能够实现正常训练、模型保存和调用,事实证…

强化学习——Qlearning

前言 在控制决策领域里面强化学习还是占很重比例的,最近出了几篇角色控制的论文需要研究,其中部分涉及到强化学习,都有开源,有兴趣可以点开看看: A Deep Learning Framework For Character Motion Synthesis and Edit…