梯度下降法
本文主要是为了讲解 梯度下降法 的原理和实践,至于什么是梯度下降法,他能做什么,相信百度一下你就都知道了,所以下面进入正题
从一元二次方程开始
梯度下降法主要是用来求解某个方程的最小值,这里我们以 凹一元二次方程为例。
准备数据
这里我们用到 matplotlib
和 numpy
,如果你对这两个库不了解也没关系,我们主要是借助它来进行讲解,不会过多涉及相关的东西
import matplotlib.pyplot as plt
import numpy as np
# 生成一个等差数列 plot_x
plot_x = np.linspace(1,5,20)
# plot_x 平方 再加2 生成一个数列 plot_y
plot_y = (plot_x-3)**2+2
# 将 plot_x plot_y 对应位置作为一个点的 x,y 坐标,那么就可以画出如下图的一条一元二次方程的曲线
plt.plot(plot_x,plot_y)
plt.show()
数据曲线.png
损失函数 和 梯度函数
这里我们首先明确两个概念:
-
损失函数:即是我们这个一元二次方程,为什么叫损失函数呢?一般来说,我们都希望将损失降低到最小,所以求最小值,就是为了将损失减到最少咯,所以。。。这里就是我自己想当然把。。。哈哈
-
梯度函数:一元二次方程来说,就是某个点的导数,可以指导我们的函数该往哪个方向走。并且梯度总是指向损失函数变大的方向,这里因为是梯度下降,所以每次迭代的值应该是梯度的负方向
编程实现梯度下降法
# 梯度函数
def dJ(x):
return (x-3)*2
# 损失函数
def J(x):
return (x-3)**2+2
x = 0.1
# 记录每次梯度下降的点
history_x=[x]
i_iter=1
# 进行梯度迭代
while i_iter < 1e4:
i_iter += 1
dj = dJ(x)
last_x = x
x =x -0.1*dj
history_x.append(x)
# 如果迭代精确的达到,则结束结算
if abs(J(x)-J(last_x))<0.0000000001 :
break
history_y = J(np.array(history_x))
plt.plot(plot_x,plot_y)
plt.plot(history_x,history_y,color='r',marker='+')
plt.show()
梯度下降法.png
后记
本文讲的并不如何易懂 和 通俗,不过因为 一元二次的 梯度应该是相对很容易的,所以这里也就不啰嗦了,梯度下降其实也不外呼这个原理,只是可能损失函数会不太一样,那么梯度函数也就跟着不太一样了,但是到最后都是通过这两个函数来进行迭代达到最后的标准求出最优解
梯度下降法容易陷入局部最优解的而达不到全局最优解,所以可能需要随机选取多个起始点进行梯度迭代,这样全量的梯度下降法也叫做 批量梯度下降法
对于多元二次方程,因为多元会使得 批量梯度下降法 的梯度函数计算的非常缓慢,所以可以采用随机梯度下降,并且随机梯度下降不容易陷入局部最优解的的陷阱,所谓的随机梯度就是随机选取多元二次方程的 某元进行一次迭代。
其实梯度函数是不容易求得,所以如何验证你的梯度函数是否正确也就显的相当重要了。。。。然后。。。这里一句两句就说不明白了。。。还是留个读者你把
嗯,当作知识点看看就好,别太较真,写的确实不咋样。。。哈哈!!!
网友评论