1.深度学习-反向传播算[1]( ^ v ^)~
0x0 感想
数学与计算机艺术的结合,太酷了。提示阅读本文需要一定量的深度学习基础和高等数学基础,本人小白,写的文章有一些生草请大神勿喷,有啥意见和错误发现可以留在评论,再次我想由衷的说一声谢谢。对了同志,相关文章第一时间会发到b站进行视频讲解,然后发到各大博客网站,本人b站id:方书山
0x1 前言
技术小白前来报到,第一篇正式的博客文章,话说国庆假期闲来无事继续研究研究深度学习,唉就是那么一不小心就被这个绊住了而且还是两天。
但是经过小白的一顿钻研这个简单的问题终于缝纫而解了,总之主要的问题出在书本描述有点模糊和自己的理解里上的一些偏差造成问题迟迟不能解决。期间看了不少视频,效果不咋样还是自己拿个笔,比划比划实在。看视频的时候发现了一位老师讲的不错。台湾省国立大学的老师,讲解的让我印象深刻,讲解这个反方向传播,但是讲完他没代码,这可把孩子给困住了,哈哈
0x2 为啥会有这深度学习传播法
反向传播法:设计初衷,解决大量数据进行计算梯度缓慢的问题,例如下图,是我按照书本敲出来的一段代码的运行情况(Minist手写数据集)每一个数据有728(28*28)个长度,需要进行权重计算,还有偏置的加法运算,下图是运行惨状
[ * x *] 这才跑了几个数据后面还等着5990+的数据在跑,CPU已经性能全开了(八门遁甲开~),但是运行求导慢的一批
相信大家已经看见这个恐怖如丝的内存占用率了,其中用的求偏导那一段代码可以给大家看看
# 求偏导 def numerical_gradient(f, x): delt = 1e-7 grad = np.zero_like(x) it = np.nditer(x,flag=['multi_index'],op_flags['readwrite']) # 索引, 读写开 while not it.finshed: idx = it.multi_index # temp_one = x[idx] x[idx] = temp_one+h fx1 = f(x) x[idx] = temp_one - h fx2 = f(x) grad[idx] = (fx1 - fx2)/(2*h) x[idx] = temp_one it.iternext #下标继续向下走 return grad
可以想象一下那么多数据进入这个程序 一个数据大约计算 8~10秒,但有6000个数据这得大约计算13个小时
所以呢,最初的研究人工智能的可科学家当时也是面临这个问题的,后来他们发现了BP算法也就是反向传播法 (所以现在我们是站在巨人的肩膀上的
0x3 原理
原理是基于 高等数学偏导的链式法则(也就是套娃求解, = v = 反正我是这么叫它的
也就是这个红框框里的 公式,如果不理解请去补一下高等数学的相关知识
上图翻译: 1. 有三个函数 分别是 x , y ,z
2. 其中当 ”微量“s 改变时 首先会影响 ”微量“ x 和 y 的变化 3. 如果 "微量" x 和 y 变化,最终会影响 ”微量“ z 4. 假设你想求 "微量" s 对 "微量" z 的影响 5. 你就需要计算 “微量”s 对"微量"x 对z的影响 和 “微量”s 对”微量“ y 对"微量"z 的影响 的和 (有没有感觉很像俄罗斯套娃
0x4 正向传播 和 反向传播
正向传播
-
定义:运算从左到右[例如下图]
-
个人理解: 由 数据 推算 结果[数据→结果]
图中计算 L = (A+B)*C,整体预算箭头,看一看是不是从左到右,还有运算流程!!
逆向传播
-
定义: 运算 从右 到 左
-
个人理解: 由 结果 到 数据 [结果 ← 数据 ]
0x5 正文
好的,我相信应该对 正向传播 和反向传播 有一些理解了,那让我们开始继续搞理论吧,这里的话我以误差反向传播为例子进行举例
-
我们先过一下程序求导的流程
其实上面的这张图片,带我们回顾了一下误差计算的正向传播,不信你看是不是运算流程从左向右
在此之前再举一个例子: 假设你去商场购物,买了三瓶饮料,两根香肠,饮料三块钱一瓶,香肠4块钱一根,你支付了8+9=17元,但是突然你好奇想知道 饮料的价格对最后支付价格总体的影响,你回到了家画下如下图
你利用你学的高等数学知识很快的,想到了用偏导,因为饮料的价格对支付价格的一种比率吗,很快啊你就飕飕的写出如下式子
我相信各位同志如果对高等数学懂一点,应该没太大问题看懂上式。
计算流程,如果我们把图中的常数也看作一个单元可以得到最终X的变化率为x = 3
整个流程是不是逆着走了,到最后算出 x对总体的影响率4
很快啊,你是不是明白了 如何求w的偏导权值了呢?
从头走到尾的流程叫做逆向传播法
误差反向传播
我相信你看这个图 应该 明白怎么做了吧
就和上面的一样,就是一层一层的往回返,求偏导利用链式法则原理
这里呢 每一层通过偏导计算出一套公式,然后一层一层向上返,在计算的时候直接套用公式即可,不用再去计算偏导了,是不是省去了很多步骤的计算啊,当然计算机省去了,但是咱们的笔和纸可不能闲着。
有疑问可在评论区提问,目前本人临近期中考试,考试之后再更一篇代码实现