机器学习基础之反向传播

机器学习基础二-反向传播

神经网络之所以可以训练,得益于与Hinton在1986年提出的反向传播算法。反向传播背后的数学原理就是链式法则。本文会具体的实例来演示反向传播具体的计算过程,让大家有一个实际的印象。文中公式都是一个字符一个字符敲出来的,转载请注明出处。文中参考了其他作者的一些例子和数据,均在参考文献中列出。

image.png

一个简单的两层神经网络如上图所示。其中

i_1, i_2 : 训练时候实际的输入

o_1, o_2 : 训练时候实际的输出(ground truth)

out_{o1}, out_{o2}: 模型预测的结果

我们的目的就是通过反向传播,更新模型的参数w_i,b_i, 使得out_{o1}, out_{o2}尽可能的逼近o_1, o_2

本例中激活函数用sigmod(x)=\frac{1}{1+e^{-x}};

损失函数用L_2=\frac{1}{2}*(target-output)^2

前向传播

  1. 隐藏层计算

net_{h1}=w_1*i_1+w_2*i_2+b_1\\=0.15*0.05+0.2*0.1+0.35=0.3775

out_{h1}=sigmod(net_{h1})=\frac{1}{1+e^{-0.3775}}=0.593269992

同理
out_{h2}=0.596884378

  1. 输出层计算

net_{o1}=w_5*out_{h1}+w_6*out_{h2}+b_2\\=0.4*0.593269992+0.45*0.596884378=1.105905967

out_{o1}=sigmod(net_{o1})=0.75136507

同理
out_{o2}=0.772928465

最终我们看到前向传播的结果为(0.75136507,0.772928465)与我们的目标(0.01,0.99)差的比较多,所以接下来用反向传播算法学习

反向传播

要想反向传播,还需要两步(1)计算损失,(2)计算梯度。过程如下图所示


image.png

总的损失E_{total}=E_{o1}+E_{o2},其中

E_{o1}=\frac{1}{2}(target_{o1}-out_{o1})^2=\frac{1}{2}(0.01-0.75136507)^2=0.274811083\\ E_{o2}=\frac{1}{2}(target_{o2}-out_{o2})^2=0.023560026\\ E_{total}=E_{o1}+E_{o2}=0.274811083+0.023560026=0.298371109

  1. 计算参数w_5的梯度
    根据链式法则,公式如下:

\frac{\partial E_{total}}{\partial w_5}=\frac{\partial E_{total}}{\partial out_{o1}}*\frac{\partial out_{o1}}{\partial net_{o1}}*\frac{\partial net_{o1}}{\partial w_5}

\frac{\partial E_{total}}{\partial out_{o1}}=(target_{o1}-out_{o1})*-1=-(0.01-0.75136507)=0.74136507

\frac{\partial out_{o1}}{\partial net_{o1}}=out_{o1}*(1-out_{o1})=0.75136507(1-0.75136507)=0.186815602

\frac{\partial net_{o1}}{\partial out_{w_5}}=out_{h1}=0.593269992

所以\frac{\partial E_{total}}{\partial w_5}=0.74136507*0.186815602*0.593269992=0.082167041

在计算后面参数的梯度时,都会需要用到\frac{\partial E_{total}}{\partial net_{o1}}, \frac{\partial E_{total}}{\partial net_{o2}}的值。我们把这个称为输出层的误差, 符号记为:

\delta_{o1}=\frac{\partial E_{total}}{\partial net_{o1}}=0.74136507*0.186815602=0.138498562

\delta_{o2}=\frac{\partial E_{total}}{\partial net_{o2}}=-0.038098236

  1. 计算参数w_1的梯度
    要计算w_1的梯度,就要计算\frac{\partial E_{total}}{\partial out_{h1}}, 如上图所示,有两条路线(图中蓝色箭头)会向\frac{\partial E_{total}}{\partial out_{h1}}传播梯度。

\frac{\partial E_{total}}{\partial out_{h1}}=\frac{\partial E_{o1}}{\partial out_{h1}}+\frac{\partial E_{o2}}{\partial out_{h1}}

\frac{\partial E_{o1}}{\partial out_{h1}}=\frac{\partial E_{o1}}{\partial net_{o1}}*\frac{\partial net_{o1}}{\partial out_{h1}}

\frac{\partial E_{o2}}{\partial out_{h1}}=\frac{\partial E_{o2}}{\partial net_{o2}}*\frac{\partial net_{o2}}{\partial out_{h1}}

上式中 \frac{\partial E_{o1}}{\partial net_{o1}}, \frac{\partial E_{o2}}{\partial net_{o2}}在计算w_5的梯度时已经计算好了。

\frac{\partial net_{o1}}{\partial out_{h1}}=w_5=0.4\\ \frac{\partial net_{o2}}{\partial out_{h1}}=w_7=0.5

所以

\frac{\partial E_{o1}}{\partial out_{h1}}=0.138498562*0.4=0.055399425

\frac{\partial E_{o2}}{\partial out_{h1}}=−0.038098236*0.5=-0.019049119

\frac{\partial E_{total}}{\partial out_{h1}}=\frac{\partial E_{o1}}{\partial out_{h1}}+\frac{\partial E_{o2}}{\partial out_{h1}}=0.055399425+(-0.019049119)=0.036350306

最终
\frac{\partial E_{total}}{\partial w_1}=\frac{\partial E_{total}}{\partial out_{h1}}*\frac{\partial out_{h1}}{\partial net_{h1}}*\frac{\partial net_{h1}}{\partial net_{w_1}}=0.036350306*out_{h1}*(1-out_{h1})*i_1=0.036350306*0.593269992*(1-0.593269992)*0.05=0.000438568

补充说明

  • sigmod求导推导

f(x) = \frac{1}{1+e^-x}\\ \dot{f(x)}=-\frac{1}{(1+e^-x)^2}*e^{-x}*-1=\frac{1}{(1+e^-x)}*\frac{e^{-x}}{(1+e^-x)}=f(x)*(1-f(x))

  • 分类任务,输出层损失

以上是以sigmod激活,MSE损失的反向传播(回归问题);如果已经softmax激活,交叉熵顺序的反向传播如何呢(分类问题)?
如何计算分类问题的输出层损失,符号定义如下

  1. z_i: 网络最后未经过激活的输出
  2. p_i: 经过激活后的输出(这里激活函数为softmax)
  3. q_i: one_hot编码后target的分量
  4. N: 类别的数量,等于length(q_i)

已知:
p_i=\frac{e^{z_i}}{\sum_k^Ne^{z_k}}

\sum_i^Nq_i=1

loss=-\sum_i^Nq_ilog(p_i)

下求:损失层输出

\frac{\partial loss}{\partial z_i}=\frac{\partial loss}{\partial p_i}*\frac{\partial p_i}{\partial z_i}+\sum_{j\not =i}^N\frac{\partial loss}{\partial p_j}*\frac{\partial p_j}{\partial z_i}

其中

\frac{\partial loss}{\partial p_i}*\frac{\partial p_i}{\partial z_i}=-\frac{q_i}{p_i}*(p_i+\frac{e^{z_i}}{-({\sum_k^Ne^{z_k})^2}}*e^{z_i})=-\frac{q_i}{p_i}*(p_i+(-{p_i}^2))=-q_i(1-p_i)

\sum_{j\not =i}^N\frac{\partial loss}{\partial p_j}*\frac{\partial p_j}{\partial z_i}=-\sum_{j\not =i}^N\frac{q_j}{p_j}*\frac{e^{z_j}}{-(\sum_k^Ne^{z_k})^2}*e^{z_i}=-\sum_{j\not =i}^N\frac{q_j}{p_j}*(-p_j*p_i)=\sum_{j\not =i}^Nq_j*p_i

所以

\frac{\partial loss}{\partial z_i}=-q_i(1-p_i)+\sum_{j\not =i}^Nq_j*p_i=-q_i+q_i*p_i+p_i*\sum_{j\not =i}^Nq_j=-q_i+p_i*(q_i+\sum_{j\not =i}^Nq_j)=-q_i+p_i*1=p_i-q_i

这是一个非常简洁的形式,可直接使用

以上以多层感知机网络为例,详细说明了反向传播的计算过程

全连接神经网络反向传播的一般形式

定义全连接神经网络

z^l: 神经网络第l层的输入, 初始化输入z^0

a^lz^l激活后的输出

W^l: 神经网络第l层的参数

b^l: 神经网络第l层的参数的偏置项

那么神经网络前项传播的过程为:

z^{l}=W^la^{l-1}+b^l

a^{l-1}=\sigma(z^{l-1}), \sigma为激活函数

模型的损失函数定义为:
C=\frac{1}{2}||a^L-y||_2^2

反向传播需要计算
\frac{\partial C}{\partial W^l}, \frac{\partial C}{\partial b^l}

全连接神经网络示意图

\frac{\partial C}{\partial W^l}=\frac{\partial C}{\partial z^l}*\frac{\partial z^l}{\partial W^l}

\frac{\partial C}{\partial z^l} 定义为l层的误差,记\delta^l

\frac{\partial C}{\partial W^l}=\frac{\partial C}{\partial z^l}*\frac{\partial z^l}{\partial W^l}=\delta^l(a^{l-1})^T

\frac{\partial C}{\partial b^l}=\delta^l

这里需要好好理解一下为什么\frac{\partial z^l}{\partial W^l}a^{l-1}的转置表示,因为涉及到矩阵的运算,所以建议好好理解一下,可以借助于上图。那只要再计算\delta^l就可以了

\delta^l=\frac{\partial C}{\partial z^l}=\frac{\partial C}{\partial z^{l+1}}*\frac{\partial z^{l+1}}{\partial z^l}=\delta^{l+1}*\frac{\partial z^{l+1}}{\partial z^l}

z^{l+1}=W^{l+1}a^{l}+b^{l+1}=W^{l+1}\sigma(z^l)+b^{l+1}

\delta^l=(W^{l+1})^T\delta^{l+1}*\dot{z^l}

最后一层输出层的误差

\delta^L=\frac{\partial C}{\partial z^L}=\frac{\partial C}{\partial a^L}\frac{\partial a^L}{\partial z^L}=(a^L-y)*\dot{\sigma(z^L)}

那么通过计算L层,L-1,L-2等等这样的计算就可以计算每一层的参数的梯度。

卷积网络-反向传播

参考文献

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

推荐阅读更多精彩内容