梯度下降法是求解无约束最优化问题的一种常用的方法,方法实现简单。
梯度下降背后的思想是:开始时我们随机选择一个参数的组合(θ0,θ1,...,θn),计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到一个局部最小值(local minimum)。
例如
1.目标函数
2.代价函数
问题:如何选取
使得代价函数
最小
思路如下:
(1)先确定向下一步的步伐大小α,我们称为Learning rate;
(2)任意给定一个初始值θ0,θ1,...θi;
(3)确定一个向下的方向,并向下走预先规定的步伐,并更新初始值;
(4)当下降的高度小于某个定义的值,则停止下降;此时的θ0,θ1,...θi即为我们学习后得到的目标函数的θ0,θ1,...θi。
学习速率的影响
在使用梯度下降的时候,α的选取会影响算法的使用,α的值应该选取合适的值,不能过小,过小,学习效率比较慢,过大可能无法得到目标函数。
α的选取有如下几种方法
1.Adagrad
其中,α为初始的学习速率,α^t为t次迭代后的学习速率。
2.或者给一固定值
α一般取0到1之间
代码如下:
x = [(1, 0., 3), (1, 1., 3), (1, 2., 3), (1, 3., 2), (1, 4., 4)]
# y[i] 样本点对应的输出
y = [95.364, 97.217205, 75.195834, 60.105519, 49.342380]
# 迭代阀值,当两次迭代损失函数之差小于该阀值时停止迭代
epsilon = 0.0001
# 学习率
alpha = 0.01
diff = [0, 0]
max_itor = 1000
error1 = 0
error0 = 0
cnt = 0
m = len(x)
# 初始化参数
theta0 = 0
theta1 = 0
theta2 = 0
while True:
cnt += 1
# 参数迭代计算
for i in range(m):
# 拟合函数为 y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]
# 计算残差
diff[0] = (theta0 + theta1 * x[i][1] + theta2 * x[i][2]) - y[i]
# 梯度 = diff[0] * x[i][j]
theta0 -= alpha * diff[0] * x[i][0]
theta1 -= alpha * diff[0] * x[i][1]
theta2 -= alpha * diff[0] * x[i][2]
# 计算损失函数
error1 = 0
for lp in range(len(x)):
error1 += (y[lp]-(theta0 + theta1 * x[lp][1] + theta2 * x[lp][2]))**2/2
if abs(error1-error0) < epsilon:
break
else:
error0 = error1
print (theta0, theta1, theta2, error1)
print (theta0, theta1, theta2)
print (cnt)