首页
学习
活动
专区
工具
TVP
发布

反向传播

终于要说反向传播(BP),化繁为简正是我们工程师在设计一个系统时的无上追求。

还是先来一段承上启下,softmax这个函数很重要,在NN中大量被用在最后一层做归一化。我们日常工作中会有很多需要归一化的场景都能用到,比如电商的排序中销量是一个重要因子,如果用长期销量,无法反应出季节和流行趋势,用短期销量则波动性太大容易被刷单作弊。可以这么做:3个月销量排名【1000,900,850...】,然后再1个月销量排序【200,180,90...】,对这2个序列分别做归一化【0.33,0.26,0.11..】和【0.41,0.32,0.14..】然后在乘以各自的权重因子。此时归一化方法就可以用softmax..

为什么叫反向传播?既然有反向,就还有正向。就像搜索里面的反向索引一样,很多人被搞懵了。正向传播是指输入x,经过deep learning的层层计算,每层都会产生一个误差,误差被逐层传递下去,最后输出y。反向传播则相反,我们已经输出了y,正确的标注值是y‘,需要用这2者之间的差异来修正整个模型的参数,使得下一轮迭代计算的时候误差变小(也有可能某一次会变大,但N次迭代后会变小)。

为什么要引入反向传播?复习一下前面的逻辑回归的例子:

最后的损失函数l(θ) 是一个复合函数,我们需要分别对θ0~θi 求偏导数,用导数公式和链式法则 能求出来吗?当然是可以的,只是过程太复杂了,脑细胞死一大片。 逻辑回归还只是最简单的情况,网络还只有一层,想想对于几十层的网络,各种激活函数再叠加上来,用求导公式去反推几乎是不可能的事情。

反向传播是怎么做的?

看个最简单的例子(来源于网络):

f=(x+y)*z ,求f关于x,y,z的偏导数

#设置输入值

x=-2;y=5;z=-4

# 进行前向传播

q=x+y# q becomes 3

f=q*z# f becomes -12

#进行反向传播:

#首先回传到f = q * z

dfdz=q# df/dz = q,所以关于z的梯度是3

dfdq=z# df/dq = z,所以关于q的梯度是-4

#现在回传到q = x + y

dfdx=1.0*dfdq# dq/dx = 1.这里的乘法是因为链式法则

dfdy=1.0*dfdq# dq/dy = 1

BP原理用的也是链式法则,只看局部。

我们再回过头来看看上面的逻辑回归,用反向传播怎么做(上面绿色数字表示的是输入值,正向传播。红色数字是偏导数,做反向传播):

sigmoid:

反算几步看看(用导数公式)

step1: x=1.37,s1= (1/x)'=-(1/(1.37*1.37))= - 0.53

step2:x=0.37,s2=s1*(x+1)'=(-0.53)*1=-0.53

step3:x=-1.00, s3=s2*(exp(x))'=s2*exp(-1)=(-0.53)*exp(-1)=-0.2

step4:...

经过一轮反向传播后,就可以更新因子了(假设步长为1):

w0=w0+(-0.2)*1*x0=2.2

w1=w1+(-0.39)*1*x1=-2.22

w2=-2.8

是不是很简单?实际工程应用中还有一些小窍门进一步简化运算,原理就是这样。

BP看完之后,是不是对机器学习的原理基本了解清楚了?我们把整个流程串一下:

x1是一个像素点的值,一副图片28X28个像素点,输入值[x1…x728] ,如下图

2. 目标是求Wij,bi 的值,初始值可以随便设置一个,无所谓

3.输出值十维向量y=[y1,y2…y10],对应了该图片是0~9数字的概率

4. 跟该图片的标注值y'=[0,1,..0],计算交叉熵:

交叉熵的写法跟上一章的描述稍稍有点不同,公式输入不方便,表达的意思是一样的.

5. 利用BP更新Wij,bi 的值

6. 继续输入下一张图片,重复1~5,直到交叉熵小于某个设定的阈值,或者循环到固定的次数

下一章讲一下激活函数

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180603G0L8SC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券