小白也能看懂的BP反向传播算法之Towards-Backpropagation

本文相关代码可以从Backpropagation下载

想要理解backpropagation反向传播算法,就必须先理解微分!本文会以一个简单的神经元的例子来讲解backpropagation反向传播算法中的微分的概念。

image.png

这是一个非常简单的神经元,如图所示,接收两个输入a, b,然后在神经元内部对两个神经元进行相乘操作,得到a*b的输出!

然后,我们可以想象这样一个情景,现在对于某个特定的输入a,b,输出结果与预期结果相比较小,为了提高准确率,那我们就要将输出结果增加,以更符合预期的结果!

所以,我们现在的目标就是通过改变a,b的值来增加神经元的输出!

Method 1

第一个方法是很直观的,我们就随机的给输入a,b的两个值添加一个随机值,然后用一个步长step来控制增加的程度,用python代码实现:

import random


def product(a, b):
    return a * b


def methodOne():
    a = 5
    b = 6
    step = 0.01
    a = a + step * (random.random())
    b = b + step * (random.random())
    print(product(a, b))

methodOne()

运行程序,我们可以得到输出30.04698146865633(由于涉及到随机数,所以读者的运行结果会和此处有区别,但一定会是比30大的数),是比原本的输出30增加了相应值的,说明我们的目标实现了!但是如果我们继续测试,就会发现程序是存在问题的:

  • 不可靠!如果我们改变输入值,会发现有时候值会增加,有时候又会减少!,比如以下这个例子:
def testTwo():
    a = -5
    b = -6
    step = 0.01
    a = a + step * (random.random())
    b = b + step * (random.random())
    print(product(a, b))

testTwo()

运行程序,我们会得到结果29.970177554213326,是比原本的输出30小的。只因为我们将输入值a,b变为了负数,这个算法就失效了!究其原因,因为我们对于不同的输入值,变化的都是random()函数,也就是一个在(0,1)之间的正数。而对于负数的输入,增加一个正数,最后反而导致绝对值减小,也就导致输出的结果变小了!

所以,通过以上这个例子,我们可以得出结论:
对于 a = a + step * (random.random())中step后面所乘的系数,我们不能一概而论,而是应该更多的控制它的值,也就是根据不同的输入值来控制,也就是说,step所乘的系数,也就是输入值的变化应该是一个关于输入值的函数

Method 2

Method 1中的结论是,我们应该有一个step乘以的应该是一个关于输入值的函数。也就是我们需要知道在输入值那个点上,输出结果关于输入值的一个变化率,如果在这个点上,输出结果是随着输入值增加而增加,那么step乘以一个正数即可,反之,则需要乘以一个负数才能使输出结果增加!显然这就是函数在某点上的微分的定义!

首先我们将神经元内部的函数写出来


image.png

神经元输出是一个关于输入的函数!然后我们将输入值a增加一个h

image.png

此时新的输出值就变成 (a+h)*b,展开就是a*b+h*b,所以我们可以看到此时输出值相对于原有的输出值的变化就是h*b,只要我们保证h*b是正值,就是说可以保证是输出结果增加,而保证正值的方法自然就是h和b同号!更深入的理解,我们将a的值增加h,最后导致输出结果,也就是 函数f的值增加h*b,这时候就可以理解b为函数f在点(a,b)处关于a的变化率!这就是微分的概念了,如果读者有微积分基础,会发现这里实际上f就是一个二元函数的微分,b就是函数f在点(a,b)的微分!微分的实质就是函数在某点的变化率,如果是多元函数就是函数在某点关于某个变量的变化率!多元函数对某一个变量微分时候,通常会将其他变量看作常量!

image.png

以上公式就是微分的计算方法!

但实际上,学过微积分,都应该掌握了一套微分的基本法则,我们往往可以根据这套法则,直接写出函数的微分!可以参考Derivative-rules
对于我们这里的函数f,我们可以直接写出关于a的微分

image.png

自然,关于b的微分就是

image.png

求出了微分,就相当于知道了变量在某点的变化率,那么很自然,a,b的更新规则就是

image.png
def methodTwo(a, b):
    step = 0.01
    a = a + step * b
    b = b + step * a
    print(product(a, b))

methodTwo(5, 6)
methodTwo(-5, -6)

我们发现输出结果30.616035999999998和30.616035999999998,不管输入的值是正是负,都成功将输出结果增加了!而正是利用了微分的概念才能做到,微分实际上就是梯度,梯度就指明了函数上升最快的方向!读者可以参考笔者相关梯度下降的文章梯度下降

最后我们来详细分析一下,为什么利用微分更新输入可以做到?

我们深入分析微分几何意义!一个函数对某个变量的微分实际上就是函数在关于这个变量的变化率,变化率的方向是正的,也就是说的变化率,指的是增加的变化率!我们看看我们输入的更新方程

image.png

多元函数的微分关于某个变量的微分的意义就是,就是将其他变量全部看成常量,函数关于此变量的变化率,变化率的方向是正的,也就是说上升的方向,如果想要知道下降的变化率,即是负微分

我们再举一个单变量函数的例子来分析一下如何利用微分更新变量值

image.png

我们看到上面这个函数关于x先上升,再下降!我们假设两个场景

场景1:

首先,想象我们现在处于A点,我们想要改变变量x的值,从而使函数y的值增加。从图中我们可以清晰的看出,我们只要直接增加x的值,就可以增加函数值。然后结合微分,我们的更新方法就是

image.png

场景2:

现在想象我们在C点,也要改变x的值让函数值y增加,这时候我们从图像中可以看到,我们减少x的值,就可以增加函数值!而这正是由函数的微分决定的。我们求取函数关于x在此点的微分,会发现微分是负值,所以我们依然利用场景1中的更新公式,也可以达到增加函数值的目的。

微分会反映函数的变化趋势,如果我们想要让函数值增加,微分会告诉我们一个正确的更新变量的方向

场景3:

想象我们此时处于B的左侧,但是非常接近B点!从图像中,我们也会知道此时微分的是正的,也就是我们增加x的值就能使函数值y的值增加!但要注意的一点是,如果我们的step也就是步长如果过大,会导致跑到右边去了,可能还会导致函数值的下降!所以我们就要调整步长!这其实就是一个梯度上升的问题,与梯度下降类似,读者有兴趣可以参考笔者相关文章梯度下降

我会在这里结束本文的介绍!希望通过本文读者能对微分有一个理解,同时知道如何将微分利用到更新变量值中,从而改变函数值!

下一篇文章小白也能看懂的BP反向传播算法之Into-Backpropagation我会将这个利用微分更新变量的方法,应用到多个神经元的场景中,慢慢读者就会接触到真正的backpropagation反向传播算法

本文相关代码可以从Backpropagation下载

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

推荐阅读更多精彩内容