链式法则及反向传播算法

链式法则及反向传播算法

1. 链式法则

  • 链式法则即链式求导

2. 反向传播推导(多层多输出感知机)

在这里插入图片描述

  • 简要推导(求和范围为 k ∈ K k\in K kK) ∂ E ∂ w i j = ∂ ∂ w i j ( O k − t k ) 2 2 \frac{\partial E}{\partial w_{ij}}=\frac{\partial}{\partial w_{ij}}\frac{(O_k-t_k)^2}{2} wijE=wij2(Oktk)2 ∂ E ∂ w i j = ∑ ( O k − t k ) ∂ ∂ w i j σ ( x k ) \frac{\partial E}{\partial w_{ij}}=\sum (O_k-t_k)\frac{\partial}{\partial w_{ij}}\sigma (x_k) wijE=(Oktk)wijσ(xk) ∂ E ∂ w i j = ∑ ( O k − t k ) σ ( x k ) ( 1 − σ ( x k ) ) ∂ x k ∂ w i j \frac{\partial E}{\partial w_{ij}}=\sum (O_k-t_k)\sigma (x_k)(1-\sigma(x_k))\frac{\partial x_k}{\partial w_{ij}} wijE=(Oktk)σ(xk)(1σ(xk))wijxk ∂ E ∂ w i j = ∑ ( O k − t k ) O k ( 1 − O k ) ∂ x k ∂ O j ∂ O j ∂ w i j \frac{\partial E}{\partial w_{ij}}=\sum (O_k-t_k)O_k(1-O_k)\frac{\partial x_k}{\partial O_j}\frac{\partial O_j}{\partial w_{ij}} wijE=(Oktk)Ok(1Ok)OjxkwijOj ∂ E ∂ w i j = ∑ ( O k − t k ) O k ( 1 − O k ) W j k ∂ O j ∂ w i j \frac{\partial E}{\partial w_{ij}}=\sum (O_k-t_k)O_k(1-O_k)W_{jk}\frac{\partial O_j}{\partial w_{ij}} wijE=(Oktk)Ok(1Ok)WjkwijOj ∂ E ∂ w i j = O j ( 1 − O j ) ∂ x j ∂ w i j ∑ ( O k − t k ) O k ( 1 − O k ) W j k \frac{\partial E}{\partial w_{ij}}= O_j(1-O_j)\frac{\partial x_j}{\partial w_{ij}}\sum(O_k-t_k)O_k(1-O_k)W_{jk} wijE=Oj(1Oj)wijxj(Oktk)Ok(1Ok)Wjk ∂ E ∂ w i j = O j ( 1 − O j ) O i ∑ ( O k − t k ) O k ( 1 − O k ) W j k \frac{\partial E}{\partial w_{ij}}= O_j(1-O_j)O_i\sum(O_k-t_k)O_k(1-O_k)W_{jk} wijE=Oj(1Oj)Oi(Oktk)Ok(1Ok)Wjk ( O k − t k ) O k ( 1 − O k ) = σ k (O_k-t_k)O_k(1-O_k)=\sigma_k (Oktk)Ok(1Ok)=σk,上式可化为 ∂ E ∂ w i j = O j ( 1 − O j ) O i ∑ σ k W j k \frac{\partial E}{\partial w_{ij}}= O_j(1-O_j)O_i\sum \sigma_kW_{jk} wijE=Oj(1Oj)OiσkWjk

3. 2D函数优化(反向传播算法)实现

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot as plt
import tensorflow as tf

def DBG(x):
    return (x[0] ** 2 +x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2


x = np.arange(-6, 6, 0.1)
y = np.arange(-6, 6, 0.1)
X, Y = np.meshgrid(x, y)
Z = DBG([X, Y])
fig = plt.figure('DBG')
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z)
ax.view_init(60, -30)
ax.set_xlabel('x')
ax.set_xlabel('y')
plt.show()

# 设置初始点
x = tf.constant([3., 0.])
for step in range(150):
    with tf.GradientTape() as tape:
        tape.watch([x])
        y = DBG(x)
    # 加[0]避免出现“无法将序列与“float”类型的非int相乘”问题
    grads = tape.gradient(y, [x])[0]
    x -= 0.01*grads
    if step % 20 == 0:
        print('step{}:   x={}   f(x)={}'.format(step, x.numpy(), y.numpy()))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值