梯度下降法
一、简介:
梯度下降法是一个最优化算法,通常也称为最速下降法。常用于机器学习和人工智能当中用来递归性地逼近最小偏差模型
二、梯度下降算法
2.1 具体问题:
有一个人在山上,想要下山,目的地是山谷(也就是最低点)而如何到达最低点则是我们需要解决的问题。下山的路有很多种,想要快速的到达,就需要选择最陡的地方下山。
2.2 基本思想:
将人看作f(θ),即目标函数。在当前位置求偏导就是我们所讨论的梯度,正常的梯度方向是类似于上山的方向,是使值增大的,下山最快需使f(θ)最小,从负梯度求最小值,就是梯度下降。
由于不知道怎么下山,于是需要走一步算一步,继续求解当前位置的偏导数。一步步走下去,当走到了最低点,此时我们能得到一个近似最优解。如果损失函数是凸函数,梯度下降法得到的解就是全局最优解
2.3 具体分析:
①如果函数为一元函数,梯度就是该函数的导数:
②如果是二元函数,梯度定义为:
2.3步骤:
1、假设函数Y = f(x1,x2,x3…,xn)只有一个极小点
2、初始给定参数为X0 = (x10,x20,…,xn0).
从这个点如何搜索才能找到原函数的极小值点
方法:
- 首先设定要给比较小的正数ŋ,ε;
- 求当前位置处的各个偏导数
- 修改当前函数的参数值,公式如下
- 如果参数变化量小于ε,退出;否则返回2.
2.4 举例
任给一个初始出发点,设x0=-4,利用梯度下降法求函数y = x²/2-2x的极小值
- 首先给定两个参数:ŋ=0.9,ε=0.01
- 计算函数导数:dy/dx = x - 2
- 代入x0=-4,计算当前导数值:y’ = -6
- 修改当前参数:x’=x-ŋy’=1.4;Δx=-ŋy’=5.4
- 比较Δx’与ε的大小;需满足需满足∆x<ε,但当前5.4>0.01
- 代入x’=1.4,计算当前导数值:y’=-0.6
- 循环计算,直到参数变化量小于ε
代码如下:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return np.power(x,2)
def d_f_1(x):
return 2.0 * x
def d_f_2(f , x,delta=1e-4):
return (f(x+delta) - f(x-delta)) / (2 * delta)
xs = np.arange(-10,11)
plt.plot(xs,f(xs))
plt.show()
learning_rate = 0.1
max_loop = 30
x_init = 10.0
x = x_init
lr = 0.1
for i in range(max_loop):
#d_f_x = d_f_1(x)
d_f_x = d_f_2(f,x)
x = x - learning_rate * d_f_x
print(x)
print('initial x =',x_init)
print('arg min f(x) of x =',x)
print('f(x) = ',f(x))