用户:四九圣尊查看:2 回复:9 评论:2 创建时间:2018-11-03T13:07:16
之前讲了单变量的梯度下降,但是事实上很多问题并不是单变量的,而是多个变量的,这个时候如何进行梯度下降呢?
现在我们将损失函数定义成这样:这个函数拥有两个变量,它的函数图像是这样的:
代码:(感谢csdn教会我如何绘制三维函数图像)
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
def F(x,y,devi=False,devi_v = "x"):
if devi:
if devi_v == "x":
return 2 * x + 3 * y
else:
return 3 * x + 2 * y
else:
return x**2 + y**2 + 2*x*y
fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-100, 100, 1)
Y = np.arange(-100, 100, 1)
X, Y = np.meshgrid(X, Y)
Z = F(X,Y)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
plt.show()
我们的目标是让z的值最小,虽然肉眼就可看出x和y均为0时z最小,但是如何让机器自己去学习它呢?
按照之前的思路,我们要让损失函数的值沿着梯度的流动方向下降到最小值,如图:
这个函数有两个变量,我们要对它们分别求导,分别求出x和y的梯度方向,才能确定要向哪里下降。就象是这样。
思路其实很简单,我们只要对x和y分别求导就可以了,在求x的导数时,将y看作常量。在求y的导数时,将x看作常量。
求y为常量时,求x的导数过程(跟之前几乎一样):
当x为常量时,求y的导数大家自己试着算。我告诉可以大家是3x+2y。
然后就可以确定两个变量函数梯度下降的权重更新公式了:
x = x - lr*(y固定时x的导数)
y = y - lr*(x固定时y的导数)
代码:
weight = [20,20]
lr = 0.01
for i in range(100):
weight[0] -= lr*F(weight[0],weight[1],True,devi_v="x")
weight[1] -= lr * F(weight[0], weight[1], True, devi_v="y")
print(weight)
print(F(weight[0],weight[1]))
损失函数下降曲线如下:
同理,这样还可解决更多变量的问题,然后大家就可以利用梯度下降解决实际问题了!
下次我将会讲一个实际问题给大家解决!