你应该懂得的反向传播(backprop)

当我们在学习或者工作中使用tensorflow,pytorch之类去复现网络的时候,一般没人去单独去写backward,因为这些优秀的框架已经给我们打好了根基,它们的一句话即可自动的帮我们去反向传播,我们负责写好forward就可。

我听到的更多的抱怨是来自实践的团队,“如果我们工作中根本不用去写反向传播,为什么要去学习如何自己写呢”,反方的观点则是诸如 “这些知识懂了的话理解神经网络会更深”,“你可能有机会去接触神经网络的更底层”等等,这些话确实很苍白无力。

但其实我们应该去写写并懂得反向传播的原因是因为它是一个有漏洞的方法

简单来说,它很容易陷入学习过程中的一些陷阱,这些陷阱就发生在你手到擒来的写了个自己觉得完美无缺的网络,前向反向都如你意的过程中。

一个反向传播的例子
  • 梯度消失(vanishing gradients)

    现实中一个常用的做法就是用sigmoid或者tanh来跟在全连接层的后边做一个非线性的激活。这个技巧太过普通以至于往往人们认识不到学习过程中loss停留在一个值拒绝下降的原因就是因为他们在权重初始化的时候太过随意,导致反向传播不再起作用。

    举个例子:一个简单的前向传播并用sigmoid激活

    z = 1 / (1 + np.exp(-np.dot(W, x)))  # 前向传播
    dx = np.dot(W.T, z * (1 - z))  # 反向传播:计算x的梯度
    dW = np.outer(z * (1 - z), x)  # 反向传播:计算W的梯度
    

    如果你将矩阵W的初始值设的过大,那么矩阵相乘wx+b之后将会得到一个很大范围的值(比如:-500 到 500),这个很大的值将使得向量z的值要么等于0要么等于1

    那么接下来做反向传播求导的时候无论对x还是对W来说,z(1-z)*将会都等于0,也就是说x和W的梯度将都是0,那么根据链式法则,之后的反向传播的也都是0,整个网络的参数将不再更新。


另外一个比较有意思的事情就是sigmoid的梯度:sigmoid x (1 - sigmoid)最大值为0.25(z=0.5)。这就意味着每次反向传播经过sigmoid一次,它的大小将至少减少为原来的1/4,那么特别是达到网络的前几层的时候,反向传播的梯度将会越来越小。如果你恰巧又用了SGD,那么整个网络的训练将会更加的漫长。

  • 神经元的死亡

    另外一个比较有意思的是ReLU,它将小于0的值都过滤为0。

举个例子:

z = np.maximum(0, np.dot(W,x)) #前向传播
dW = np.outer(z > 0, x) # 反向传播:计算W的梯度

你可以看到当如果有神经元在前向传播后(z的值中)被ReLU激活后为0值时,它的权重的梯度将也为0,这时将会导致出现神经元的死亡的现象,这些神经元将永不再更新。出现这种情况的原因有两个,1个是ReLU神经元的权重被初始化的不够好,另一个是神经元的权重在训练的过程中被大幅更新,这些神经元将永久的处于死亡状态。它就像永久死亡的大脑的细胞。如果你在用ReLU,那么有时你就会发现在训练时大约有40%左右的神经元已经是0处于死亡的状态。

那么如果你懂得了反向传播的这个问题,你就可以很小心的去对待死亡ReLU的问题,对待这些对你训练集的所有数据都输出为0,永久的死去了神经元。神经元也会在训练的中途死掉,比如你设置了比较大的学习率。

  • 梯度爆炸(exploding gradients)

    假设有一个4层深的网络(三个隐藏层),并且每一层只有一个神经元

    ,σ为sigmoid函数

那么来个反向传播的话

此时如果w的初始值比较大的话(比如100),那么

之后不断的相乘的结果就是网络的前层的梯度成指数级的增长。再拿这个超级大的梯度来更新我们的w的话,就导致网络的不稳定,在极端情况下,权重的值会变得特别大,以至于结果溢出,出现NAN值。

最后 反向传播并不是一个健壮的方法,如果你因为“Tensorflow或者Pytorch已经自动的帮我们实现了”就忽视它,那么你面对他带来的问题的时候讲无所适从,对于调试一个网络来说也会变得困难。庆幸的是反向传播理论并不是那么的不食人间烟火,只要你认真的关注并研究几篇文章,那么你很快会掌握它的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • 改进神经网络的学习方法(下) 权重初始化 创建了神经网络后,我们需要进行权重和偏差的初始化。到现在,我们一直是根据...
    nightwish夜愿阅读 1,861评论 0 0
  • 又是许久没来了。 一晃眼一周又过去了。今晚约了朋友去学校周边常去的烧烤店撸串。 “两年”对每个人来说,都是一个不短...
    钰子阅读 348评论 0 0
  • 仰视可令人看得高,俯视可使人望得远,平视让人看到的是地面。一个人能看到什么取决于他的位置和角度,也就是看事物的眼光...
    Christine_W阅读 152评论 0 1
  • 准备 崩溃日志。实时日志的抓取或者是从设备导出的崩溃日志均可。 Mac系统电脑,打开终端备用(暂时不确定dwarf...
    望山观海阅读 575评论 0 0