终于要说反向传播(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,直到交叉熵小于某个设定的阈值,或者循环到固定的次数
下一章讲一下激活函数
领取专属 10元无门槛券
私享最新 技术干货