微信扫一扫打赏支持

TensorFlow2_200729系列---16、链式法则求多层感知器梯度实例

TensorFlow2_200729系列---16、链式法则求多层感知器梯度实例

一、总结

一句话总结:

A、y2对y1求导:w2:dy2_dy1 = tape.gradient(y2, [y1])[0]
B、y1对w1求导:x:dy1_dw1 = tape.gradient(y1, [w1])[0]
C、直接y2对w1求导:w2*x:dy2_dw1 = tape.gradient(y2, [w1])[0]

 

 

1、数学中的链式求导法则和神经网络中的链式法则?

链式求导法则:dy/dx=(dy/du)*(du/dx)
神经网络中的链式法则:相当于y->u->x,也相当于x->u->y,其实u就是神经网络中的中间层

 

 

2、链式法则主要用于多层感知器的梯度推导?

例如w1->y1->y2,如果需要求dy2/dw1,就可以使用链式求导法则

 

3、梯度下降法的实质(比如y和w的关系,损失函数和w的关系)?

1、损失函数是关于输出y的函数,而y是关于w和b的函数
2、我们需要求的是∂(loss)/∂(w),来梯度下降,可以通过链式法则,∂(loss)/∂(w)=(∂(loss)/∂(y))*(∂(y)/∂(w))

 

 

二、链式法则求多层感知器梯度实例

博客对应课程的视频位置:

 

import tensorflow as tf 

# x可看做输入
x = tf.constant(1.)
# w1和b1看做第一层
w1 = tf.constant(2.)
b1 = tf.constant(1.)
# w2和b2看做第二层
w2 = tf.constant(2.)
b2 = tf.constant(1.)

# 自动求梯度
with tf.GradientTape(persistent=True) as tape:
    tape.watch([w1, b1, w2, b2])
    y1 = x * w1 + b1
    y2 = y1 * w2 + b2

    
# 目标:求y2对w1的梯度
# ===============================

# y2对y1求导:w2
dy2_dy1 = tape.gradient(y2, [y1])[0]
# y1对w1求导:x
dy1_dw1 = tape.gradient(y1, [w1])[0]
# 直接y2对w1求导:可以直接展开y2 = (x * w1 + b1) * w2 + b2
# 同样得到w2*x,当然这里底层肯定也是链式求导
dy2_dw1 = tape.gradient(y2, [w1])[0]

print(dy2_dy1 * dy1_dw1)
print(dy2_dw1)

 

tf.Tensor(2.0, shape=(), dtype=float32)
tf.Tensor(2.0, shape=(), dtype=float32)

 

 
posted @ 2020-08-04 15:04  范仁义  阅读(151)  评论(0编辑  收藏  举报