梯度下降
梯度下降法(Gradient descent)是一个一阶最优化算法,就是让参数沿着损失函数负梯度的方向更新。迭代的步长,也就是学习率是事先给定的,如果负梯度的绝对值越大,这次更新的幅度也会越大,越接近极值点时,负梯度会越小,这时更新就会较慢。
牛顿法
牛顿法是一个二阶最优化算法,它将损失函数进行二阶展开,因此会涉及到二阶导对应的海森矩阵。它的更新速度很快,但计算复杂度较高,主要是要求解海森矩阵的逆。
另外,牛顿法不仅可以用来求解函数的极值问题,还可以用来求解方程的根,二者在本质上是一个问题,因为求解函数极值的思路是寻找导数为0的点,如果要求f(x)的极值,也就是求f’(x)=0的根了。
题
给定一个正数,不用开根符号求解这个数的开方根。
分析:换一个思路,题目就是给定y,要求解y-x^2=0的根,可以通过学习的方法来实现,那以x^2为预测值,y为实际值,最小化损失函数
L=(y-x^2)^2
对损失函数求导就可以得到每一步更新的量了,然后逐步更新即可。
下面是梯度下降和牛顿法对应的python代码:
def gradient_descent(y):
x = 1
alpha = 0.001 # 注意学习率不能太大,否则会震荡甚至发散,啥,不信 ?!陷入死循环之后你会改回来的
deta = 1
count = 1
while abs(deta)>0.00001:
deta = 4*x*(x**2-y)
x -= alpha * deta
count += 1
return x,count
def newton(y):
x=1
deta = 1 # 牛顿法,求解方程的根不需要学习率,它会自动确定每一步的更新步长,细节可出门谷歌
count = 1
while abs(deta)>0.00001:
fx = (y-x**2)**2
deta = 4*x*(x**2-y)
if not deta:
break
x -= fx/(deta)
count += 1
return x,count
res1, count1 = gradient_descent(16)
res2, count2 = newton(16)
print(res1, res2, count1,count2)