手撕BP神经网络之参数更新数学推导

揭开这个神秘的面纱,探索其中的数学奥秘

BP神经网络概念

  首先从名称中可以看出,BP神经网络可以分为两个部分,BP和神经网络。BP是Back Propagation的简写 ,意思是反向传播。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法也称为梯度下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。

  其主要的特点是:信号是正向传播的,而误差是反向传播的

  举一个例子,某厂商生产一种产品,投放到市场之后得到了消费者的反馈,根据消费者的反馈,厂商对产品进一步升级,优化,一直循环往复,直到实现最终目的——生产出让消费者更满意的产品。产品投放就是“信号前向传播”,消费者的反馈就是“误差反向传播”。这就是BP神经网络的核心。

🚨有几点需要注意的

  • 一般在提到有多少层时,不包括输出层,只计算隐藏层和输出层在一起的数量
  • 一般来说,越深的网络越能学到更深的特征
  • 逻辑回归(Logistic)其实是神经网络的一个特例,即不包含隐藏层的神经网络

训练一个BP神经网络的核心步骤

lu87qlwn.png

  这张图基本反应了训练一个BP神经网络的核心步骤,很容易懂,不过多解释了。下面,我们以一个最简单的BP神经网络为例,来推导其计算过程。见下图:

lu87tiwq.png

前向传播

隐含层输入节点:

h1=W11x1+W21x2+bh1h2=W12x2+W22x2+bh2h3=W13x3+W23x2+bh3

隐含层输出节点:
经过激活函数f(x)=11+ex运算得到:

ho1=f(h1)ho2=f(h2)ho3=f(h3)

这里提一点激活函数的导数,后面会用到:

f(x)=0(ex)(1+ex)2=11+ex×(111+ex)=f(x)(1f(x))

输出层输入节点:

y1=Who1ho1+Who2ho2+Who3ho3+bo

输出层输出节点:

yo=f(y1)

反向传播

需要明白微积分中的链式法则,设x是实数,fg是从实数映射到实数的函数。假设y=g(x)并且z=f(g(x))=f(y)。那么链式法则就是:

dzdx=dzdydydx

在算法中,会计算实际输出yo和期望输出do的误差,如果这个误差大于设定的阈值,那么就会进行误差的反向传播。
定义损失函数:

ferror=12(doyo)2

损失函数中的1/2是为了后面求导计算方便而添加的。

🎯目标:更新Wb使ferror更小

输出层→隐藏层的更新

先看输出层,假设更新后的bobo,即bo=bo+Δbo,只要求出Δbo,就能得到bo
根据梯度下降的原则,可以知道:

Δbo=ηferrorbo

根据上面的推导,可以知道:

ferror=12(doyo)2=12(dof(Who1ho1+Who2ho2+Who3ho3+bo))2

根据链式法则:

ferrorbo=ferroryoyobo=ferroryoyoy1y1bo

下面单独求解各个偏导:

ferroryo=(12(doyo)2)yo=(doyo)

yoy1=(11+ey1)y1=yo(1yo)

y1bo=(Who1ho1+Who2ho2+Who3ho3+bo)bo=1

所以:

ferrorbo=(doyo)yo(1yo)

所以:

Δbo=ηferrorbo=η(doyo)yo(1yo)

对于W,这里以Who1为例子,其他同理可得。
由链式法则:

ferrorWho1=ferroryoyoWho1=ferroryoyoy1y1Who1

式中的ferroryoyoy1已经计算过,无需再次计算。

y1Who1=(Who1ho1+Who2ho2+Who3ho3+bo)Who1=ho1

所以:

ΔWho1=ηferrorWho1=η(doyo)yo(1yo)ho1

这样就把输出层的Wb更新完成了,更新后的结果:

bo=bo+Δbo=boη(doyo)yo(1yo)

Woh1=Woh1+ΔWoh1=Woh1η(doyo)yo(1yo)ho1Woh2=Woh1+ΔWoh2=Woh2η(doyo)yo(1yo)ho2Woh3=Woh1+ΔWoh3=Woh3η(doyo)yo(1yo)ho3

隐藏层→输入层的更新

这里以bh1为例子。
此时:

ferror=12(doyo)2=12(dof(Who1f(x1W11+x2W21+bh1)+Who2f(x1W12+x2W22+bh2)+Who3f(x1W13+x2W23+bh3)+bo))2

由链式法则:

ferrorbh1=ferroryoyobh1=ferroryoyoy1y1ho1ho1bh1

式中的ferroryoyoy1已经计算过,无需再次计算。

y1ho1=(Who1ho1+Who2ho2+Who3ho3+bo)ho1=Who1

ho1bh1=(f(W11x1+W21x2+bh1))bh1=ho1(1ho1)

所以:

Δbh1=ηferrorbh1=η(doyo)yo(1yo)Who1ho1(1ho1)

同理,可以得到:

Δbh2=ηferrorbh2=η(doyo)yo(1yo)Who2ho2(1ho2)

Δbh3=ηferrorbh3=η(doyo)yo(1yo)Who3ho2(1ho3)

对于W,这里以W11为例子,其他同理可得。
由链式法则:

ferrorW11=ferroryoyoWho1=ferroryoyoho1ho1W11=ferroryoyoy1y1ho1ho1W11

式中的ferroryoyoy1y1ho1已经计算过,无需再次计算。

ho1W11=ho1h1h1W11=h1(1h1)x1

所以:

ΔW11=ηferrorW11=η(doyo)yo(1yo)Who1h1(1h1)x1

同理,可以得到:

ΔW12=ηferrorW12=η(doyo)yo(1yo)Who2h2(1h2)x1

ΔW13=ηferrorW13=η(doyo)yo(1yo)Who3h3(1h3)x1

ΔW21=ηferrorW21=η(doyo)yo(1yo)Who1h1(1h1)x2

ΔW22=ηferrorW22=η(doyo)yo(1yo)Who2h2(1h2)x2

ΔW23=ηferrorW23=η(doyo)yo(1yo)Who3h3(1h3)x2

这样就把输入层的Wb更新完成了。

下一篇开始手撕代码!

打赏
评论区
头像
  • 高兴
  • 小怒
  • 脸红
  • 内伤
  • 装大款
  • 赞一个
  • 害羞
  • 汗
  • 吐血倒地
  • 深思
  • 不高兴
  • 无语
  • 亲亲
  • 口水
  • 尴尬
  • 中指
  • 想一想
  • 哭泣
  • 便便
  • 献花
  • 皱眉
  • 傻笑
  • 狂汗
  • 吐
  • 喷水
  • 看不见
  • 鼓掌
  • 阴暗
  • 长草
  • 献黄瓜
  • 邪恶
  • 期待
  • 得意
  • 吐舌
  • 喷血
  • 无所谓
  • 观察
  • 暗地观察
  • 肿包
  • 中枪
  • 大囧
  • 呲牙
  • 抠鼻
  • 不说话
  • 咽气
  • 欢呼
  • 锁眉
  • 蜡烛
  • 坐等
  • 击掌
  • 惊喜
  • 喜极而泣
  • 抽烟
  • 不出所料
  • 愤怒
  • 无奈
  • 黑线
  • 投降
  • 看热闹
  • 扇耳光
  • 小眼睛
  • 中刀
  • 呵呵
  • 哈哈
  • 吐舌
  • 太开心
  • 笑眼
  • 花心
  • 小乖
  • 乖
  • 捂嘴笑
  • 滑稽
  • 你懂的
  • 不高兴
  • 怒
  • 汗
  • 黑线
  • 泪
  • 真棒
  • 喷
  • 惊哭
  • 阴险
  • 鄙视
  • 酷
  • 啊
  • 狂汗
  • what
  • 疑问
  • 酸爽
  • 呀咩爹
  • 委屈
  • 惊讶
  • 睡觉
  • 笑尿
  • 挖鼻
  • 吐
  • 犀利
  • 小红脸
  • 懒得理
  • 勉强
  • 爱心
  • 心碎
  • 玫瑰
  • 礼物
  • 彩虹
  • 太阳
  • 星星月亮
  • 钱币
  • 茶杯
  • 蛋糕
  • 大拇指
  • 胜利
  • haha
  • OK
  • 沙发
  • 手纸
  • 香蕉
  • 便便
  • 药丸
  • 红领巾
  • 蜡烛
  • 音乐
  • 灯泡
  • 开心
  • 钱
  • 咦
  • 呼
  • 冷
  • 生气
  • 弱
  • 阿鲁
  • 泡泡
    头像
    swvpyimvhq
      

    不错不错,我喜欢看