07_1_随机梯度下降_梯度下降简介&常见函数梯度
Gradient Descent 梯度下降-简介
Outline
- What’s Gradient 什么是gradient
- What does it mean gradient代表了什么意思
- How to Search 怎么搜索最小值
- AutoGrad 怎么用TensorFlow搜索
What’s Gradient?
-
导数,derivative
高中学的导数一般来说是一维的, lim x → v a l Δ y \lim\limits_{x \rightarrow val} \Delta y x→vallimΔy,表示为x趋近于某个值后y的变动率,所接触的一般是一、二维的函数。一般来说沿着x的变动率,但实际上对于二、三维的数,它的导数可以沿着任意的方向。像下图马鞍的曲面,在x,y,z三个方向都有导数。所以导数更多是通用的概念,它代表函数按某个方向前进变动的范围。
这个范围就定义为导数,当考虑变动的方向,是一个标准的方向,比如说沿着x轴、y轴变动的时候,得到导数(偏微分), δ z δ x \frac{\delta z}{\delta x} δxδz,就是z沿着x轴方向变动范围,与y无关。 δ z δ y \frac{\delta z}{\delta y} δyδz,当它沿着y轴变动的时候,就是2y的变动率。
所有的偏微分合在一起得到向量,方向代表综合的导数方向,是由每个轴z对x1,z对x2合在一起的向量,这个向量叫做梯度。
因此,导数与梯度有区别,导数更高层通用的概念;偏微分沿着某个具体的轴变动范围,是标量;梯度是每个轴组合而成的向量。
-
偏微分,partial derivative
-
梯度,gradient
What does it mean?
这是一个漏斗形状的函数,计算每个点的梯度,是沿x偏微分和y偏微分合在一起的向量,箭头方向表示gradient的方向,长度代表模,表示强度。从函数可以看出中间是源头,向四周扩散,右边的曲面上升最快,模很大;到顶部后,变平坦了,模几乎为0。
->可知梯度的方向代表函数值增大的方向,然后梯度的模代表函数增大的速率。
右图例子类似。
How to search?
如何搜索最小值?
Gradient方向代表函数增大的方向,那我们只需要简单的把当前的参数值按照梯度值相反的方向去行进更新,得到 θ t + 1 \theta_{t+1} θt+1,很大可能会比 θ t \theta_t θt好。 α t \alpha_t αt表示lr(learning rate), η \eta η也是lr的意思。
实例:
对于 J ( θ ) = θ 1 2 + θ 2 2 J(\theta) = \theta_1^2 + \theta_2^2 J(θ)=θ12+θ22,最小值为 θ 1 \theta_1 θ1为0, θ 2 \theta_2 θ2为0的时候。第四部分已经算出偏微分,以 θ 1 \theta_1 θ1为4, θ 2 \theta_2 θ2为-4为例, Δ θ 1 \Delta \theta_1 Δθ1为8, Δ θ 2 \Delta \theta_2 Δθ2为-8,所以 θ 1 ′ = 4 − 0.01 ∗ 8 \theta_1' = 4 - 0.01*8 θ1′=4−0.01∗8, θ 2 ′ = − 4 − ( − 0.01 ∗ 8 ) \theta_2' = -4 - (-0.01*8) θ2′=−4−(−0.01∗8)。在往最小的0,0方向靠近。
1维的函数例子:
从任何点出发,向梯度反方向行进总是得到极小值点,如果是局部最小值,往往来说情况比较好。
2维的函数例子:
不同的线是不同的优化器,精髓还是 θ − l r ∗ Δ θ \theta - lr * \Delta \theta θ−lr∗Δθ的公式,只是优化线路不同。比如红色的SGD(stochastic[随机] gradient decent)往往是最慢的,Rmsprop会快一些。
AutoGrad
利用TensorFlow求解梯度,自动更新参数。
- 把计算过程包在
With tf.GradientTape() as tape:
环境里去 - 利用
[w_grad] = tape.gradient(loss,[w])
方法传入loss,要求解的参数,则会返回参数的梯度list。如果有w1,w2,w3,有几个返回几个。
GradientTape
具体的实例:
图中表示函数一定要放在tape里面,不然无法记录,第二部分表示求y2对w的偏导,x*w对w偏导为x,值为2。
Persistent GradientTape
上面的方法只能求解一次,就会自动释放相关资源,第四部分再次调用gradient
会报错。
如果需要调用两次,设置persistent=True
。
高阶知识:
2 n d − o r d e r 2^{nd} - order 2nd−order (二阶梯度)
y = xw + b
δ y δ w = x \frac{\delta y}{\delta w} = x δwδy=x
二阶梯度: δ 2 y δ w 2 = δ y ′ δ w = δ x δ w = N o n e \frac{\delta^2 y}{\delta w^2} = \frac{\delta y'}{\delta w} = \frac{\delta x}{\delta w} = None δw2δ2y=δwδy′=δwδx=None
具体实现:
首先得到 δ y δ w \frac{\delta y}{\delta w} δwδy、 δ y δ b \frac{\delta y}{\delta b} δbδy。后面相当于再次对 δ w \delta w δw求导。
实战:
import tensorflow as tf
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)
#x -> 3
print(dy_db)
#1 -> 1
print(d2y_dw2)
#None
assert dy_dw.numpy() == 3.0
assert d2y_dw2 is None
常见函数的梯度
Common Functions
在下图中梯度(Derivative)和导数混在一起,对于一维函数,梯度和导数基本上一样,只是梯度有方向,导数没有方向。
y = xw + b
对于线性函数,y = xw + b,x为输入,y为输出;w和b作为神经网络的参数。
偏微分: δ y δ w = x \frac{\delta y}{\delta w} = x δwδy=x
偏微分: δ y δ b = 1 \frac{\delta y}{\delta b} = 1 δbδy=1
梯度: Δ ( w , b ) = ( x , 1 ) \Delta_{(w,b)} = (x,1) Δ(w,b)=(x,1)
y = x w 2 + b 2 y=xw^2 + b^2 y=xw2+b2
偏微分: δ y δ w = 2 x w \frac{\delta y}{\delta w} = 2xw δwδy=2xw
偏微分: δ y δ b = 2 b \frac{\delta y}{\delta b} = 2b δbδy=2b
梯度: Δ ( w , b ) = ( 2 x w , 2 b ) \Delta_{(w,b)} = (2xw,2b) Δ(w,b)=(2xw,2b)
y = x r w + e b y=xr^w + e^b y=xrw+eb
偏微分: δ y δ w = x e w \frac{\delta y}{\delta w} = xe^w δwδy=xew
偏微分: δ y δ b = e b \frac{\delta y}{\delta b} = e^b δbδy=eb
梯度: Δ ( w , b ) = ( x e w , e b ) \Delta_{(w,b)} = (xe^w,e^b) Δ(w,b)=(xew,eb)
f = [ y − ( x w + b ) ] 2 f = [y-(xw+b)]^2 f=[y−(xw+b)]2
可以理解为线性感知机的输出和真实的label的均方差。
偏微分: δ f δ w = 2 ( y − ( x w + b ) ) x \frac{\delta f}{\delta w} = 2(y-(xw+b))x δwδf=2(y−(xw+b))x
偏微分: δ f δ b = 2 ( y − ( x w + b ) ) ∗ 1 \frac{\delta f}{\delta b} = 2(y-(xw+b))*1 δbδf=2(y−(xw+b))∗1
梯度: Δ = ( 2 ( y − ( x w + b ) ) x , 2 ( y − ( x w + b ) ) ) \Delta = (\,2(y-(xw+b))x\,,\,2(y-(xw+b))\,) Δ=(2(y−(xw+b))x,2(y−(xw+b)))
上面的式子是单层的感知机在使用均方差的loss度量的梯度。这样可以直接更新参数从 ( w 0 , b 0 ) = > ( Δ w 0 , Δ b 0 ) (w_0,b_0) => (\Delta w_0,\Delta b_0) (w0,b0)=>(Δw0,Δb0)。这个式子对我们求解单层感知机的更新是很方便的。
f = y log ( x w + b ) f = y\log(xw+b) f=ylog(xw+b)
偏微分: δ f δ w = y x w + b x \frac{\delta f}{\delta w} = \frac{y}{xw+b}x δwδf=xw+byx
偏微分: δ f δ b = y x w + b \frac{\delta f}{\delta b} = \frac{y}{xw+b} δbδf=xw+by
梯度: Δ = ( y x w + b x , y x w + b ) \Delta = (\,\frac{y}{xw+b}x\,,\,\frac{y}{xw+b}\,) Δ=(xw+byx,xw+by)