梯度下降
导数代表函数沿着某一方向变动的范围,是更高层更通用的概念。
偏微分是函数沿着某一具体的轴进行变动的范围,是一个标量(含有方向)
梯度是指把函数所有轴上的偏微分合在一起得到一个向量
梯度的意义:梯度的方向代表函数增大的方向,梯度的模大小代表增大的速率
梯度的利用
寻找函数的最小值
求函数的全局最小值点
利用TensorFlow自动求解梯度,自动更新参数
With Tf.GradientTape() as tape: 计算过程在此环境里面进行,包在tape里面
[ w_grad ] = tape.gradient( loss, [w]) 传参数计算,传什么参数计算什么,得到的是一个关于从参数的梯度列表,
代码:
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']= '2'
W = tf.constant(1.)
X = tf.constant(2.)
y = X * W
with tf.GradientTape() as tape: #包含里面,会跟踪计算过程
tape.watch([W])
y2 = X * W
grad1 = tape.gradient(y,[W])
print(grad1)
#[None] 结果是None,y从y->y2,
# 而只把y2包含里面,则梯度计算没有被跟踪,故为None
with tf.GradientTape() as tape:
tape.watch([W]) #使得W是Variable类型的,如是Variable则可省略此步
y3 = X * W
grad2 = tape.gradient(y3, [W])
print(grad2)
#[<tf.Tensor: id=7, shape=(), dtype=float32, numpy=2.0>]
此代码中的tape求解一次后,就会自定释放掉一些资源
多次调用
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']= '2'
W = tf.constant(2.)
X = tf.constant(3.)
y = X * W
with tf.GradientTape() as tape:
tape.watch([X,W])
y2 = X * W
grad1 = tape.gradient(y2,[X])
print(grad1)
#[<tf.Tensor: id=5, shape=(), dtype=float32, numpy=2.0>]
grad2 = tape.gradient(y2,[W]) #只能调用一次
#RuntimeError: GradientTape.gradient can only be called once on non-persistent tapes.
print(grad2)
with tf.GradientTape(persistent = True) as tape: #可多次调用
tape.watch([X,W])
y3 = X * W
grad_X = tape.gradient(y3,[X])
grad_W = tape.gradient(y3,[W])
print(grad_X)
#[<tf.Tensor: id=9, shape=(), dtype=float32, numpy=2.0>]
print(grad_W)
#[<tf.Tensor: id=13, shape=(), dtype=float32, numpy=3.0>]
二阶梯度
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']= '2'
w =tf.Variable(1.0)
b =tf.Variable(2.0)
x =tf.Variable(3.0)
with tf.GradientTape() as t1:
with tf.GradientTape() as t2:
y = x * w + b
dy_dw,dy_db=t2.gradient(y,[w,b]) #第一次求导
d2y_dw2 = t1.gradient(dy_dw,[w]) #第二次求导
print(dy_dw)
#tf.Tensor(3.0, shape=(), dtype=float32)
print(dy_db)
#tf.Tensor(1.0, shape=(), dtype=float32)
print(d2y_dw2)
#[None]
常见梯度函数
1.线性函数 y = xw + b
应用:感知机偏微分求导
2.y=xw^2 + b^2
二次模型的求解方式
3.指数求解方式
y=xe^w + e^b
4.f = [ y - (xw + b)]^2
线性感知机的输出和真实的label的均方差
5.f = ylog(xw + b)