一、问题描述
考虑一元目标函数F(w)=w2-w+1 :
(1)写出目标函数F的
(2)初始值w=0, 请画出梯度下降算法在最小化目标函数F的搜索轨迹。初始值w=2 呢?
二、实验目的
1.学会运用梯度下降算法解决问题。
2.理解梯度下降算法的含义。
三、实验内容
(1)求解目标函数F的梯度
从数学的角度上看,该目标函数F的梯度是:d(w2-w+1)/dw=2w-1
(2)梯度下降的优化公式
其中w是待求的参数,是学习速率,F(w)是目标函数。
(3)算法描述
1、给定待优化连续可微分的函数F(w),学习率或步长a,以及一组初始值(真实值)。
2、计算待优化函数梯度。
3、更新迭代。
4、再次计算新的梯度。
5、计算向量的模来判断是否需要终止循环。
(4)主要代码:
import numpy as np
import matplotlib.pyplot as plt
def F(w):
return w*w-w+1
X, y = [], []
eta, epsilon = 0.1, 0.01
w = 0
while abs(2*w-1) > epsilon:
X.append(w)
y.append(F(w))
w = w - eta *( 2*w-1)
W = np.linspace(0, 2, 100).reshape(100, 1)
U = F(W)
plt.plot(W, U)
plt.scatter(X, y, s=15)
plt.show()
eta, epsilon = 0.1, 0.01
w = 2
while abs(2*w-1) > epsilon:
w = w - eta *( 2 * w - 1)
print("w的值为:",w)
四、实验结果及分析
(1)初始值w=0,梯度下降算法在最小化目标函数F的搜索轨迹如下图所示:
得到的参数值为:
(2)初始值w=2,梯度下降算法在最小化目标函数F的搜索轨迹如下图所示:
得到的参数值为:
分析:
如果要使得目标函数最小,梯度的反方向就是函数减小的速度最快方向。一开始,目标函数的数值很大,我们要优化目标函数,使其变小,而使目标函数减小就得改变需要优化的参数w,我们求出目标函数在参数w上的梯度,往函数减小的最大方向(梯度的反方向)移动一步,这一步就是学习率。
五、遇到的问题和解决方法
初始值w的值不一样时,得到的w参数的值不一样。
#(w=0)w的值为: 0.49538831398157257
#(w=2)w的值为: 0.5045334718235549
但是,容易看出,当w=0.5时,F达到其最小值,运行结果后,w的值还是十分接近最优解的。