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)