梯度下降法,主要通过梯度方向与学习率两个值,一步一步迭代求出最优值的过程。
1. 随机产生开始迭代的初始值,包括x值,学习率;
2. 计算函数的导数,通过学习率与导数的乘积更新x,即
其中是学习率,
是函数的导数。
3. 用更新的x,更新y,重复2与3,直到相邻两个y值相同,或者相邻两个y的差值小于某个值终止。
假设以为例,那么
等于2x,假设学习率为0.3,则相关python代码实现如下:
# 第一步:随机生成一个数,区间在[-10,10]
x_begin = np.random.uniform(-10,10)
iter_time = 1
learning_rate = 0.3
x = x_begin
y_tmp = 0
# 第二步:根据梯度乘以时间做迭代,通过前后两次的值的差小于某个值作为迭代终止条件
while(True):
y = x**2
# 添加终止条件,当前后两个y值一样时终止
if np.abs(y-y_tmp)>1e-8:
# 更新x值
print('iter time: ',iter_time)
print('gradient*learning_rate: ',2*x*learning_rate,',the x is %f' % x,'and the y is %f' % y)
iter_time = iter_time + 1
x = x - 2*x*learning_rate
y_tmp = y
else:
break
运行的结果如下所示:
由于的最小值为(0,0),通过迭代得到最小值的近似值为(0.000077,0)。
梯度下降法的特点:
不能保证被优化的函数达到全局最优解。
初始化值很大程度上影响求解最优解。
当函数为凸函数时,梯度下降法能够保证达到全局最优解。