七、反向传播算法
内容参考来自https://github.com/dragen1860/Deep-Learning-with-TensorFlow-book开源书籍《TensorFlow2深度学习》,这只是我做的简单的学习笔记,方便以后复习。
1.激活函数导数
1.1Sigmoid 函数导数
import numpy as np # 导入 numpy 库
def sigmoid(x): # 实现 sigmoid 函数
return 1 / (1 + np.exp(-x))
def derivative(x): # sigmoid 导数的计算
# sigmoid 函数的表达式由手动推导而得
return sigmoid(x)*(1-sigmoid(x))
1.2ReLU函数导数
def derivative(x): # ReLU 函数的导数
d = np.array(x, copy=True) # 用于保存梯度的张量
d[x < 0] = 0 # 元素为负的导数为 0
d[x >= 0] = 1 # 元素为正的导数为 1
return d
1.3LeakyReLU 函数导数
# 其中 p 为 LeakyReLU 的负半段斜率,为超参数
def derivative(x, p):
dx = np.ones_like(x) # 创建梯度张量,全部初始化为 1
dx[x < 0] = p # 元素为负的导数为 p
return dx
1.4Tanh 函数梯度
def sigmoid(x): # sigmoid 函数实现
return 1 / (1 + np.exp(-x))
def tanh(x): # tanh 函数实现
return 2*sigmoid(2*x) - 1
def derivative(x): # tanh 导数实现
return 1-tanh(x)**2
2.链式法则
import tensorflow as tf
# 构建待优化变量
x = tf.constant(1.)
w1 = tf.constant(2.)
b1 = tf.constant(1.)
w2 = tf.constant(2.)
b2 = tf.constant(1.)
with tf.GradientTape(persistent=True) as tape:
# 非tf.Variable类型的张量需要人为设置记录梯度信息
tape.watch([w1, b1, w2, b2])
# 构建2层网络
y1 = x * w1 + b1
y2 = y1 * w2 + b2
# 独立求解出各个导数
dy2_dy1 = tape.gradient(y2, [y1])[0]
dy1_dw1 = tape.gradient(y1, [w1])[0]
dy2_dw1 = tape.gradient(y2, [w1])[0]
# 验证链式法则
print(dy2_dy1 * dy1_dw1)
print(dy2_dw1)
3.Himmelblau 函数优化实战
Himmelblau 函数是用来测试优化算法的常用样例函数之一,它包含了两个自变量𝑦和𝑧,数学表达式是
f ( x , y ) = ( x 2 + y − 11 ) 2 + ( x + y 2 − 7 ) 2 f(x,y)=(x^2+y-11)^2+(x+y^2-7)^2 f(x,y)=(x2+y