猫史档案馆


【梯度下降(原创教程)】横看成岭侧成峰,解决多变量梯度下降

用户:四九圣尊四九圣尊查看:154 回复:9 评论:2 创建时间:2018-11-03T13:07:16


之前讲了单变量的梯度下降,但是事实上很多问题并不是单变量的,而是多个变量的,这个时候如何进行梯度下降呢?

现在我们将损失函数定义成这样:center_image这个函数拥有两个变量,它的函数图像是这样的:

center_image

代码:(感谢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最小,但是如何让机器自己去学习它呢?

按照之前的思路,我们要让损失函数的值沿着梯度的流动方向下降到最小值,如图:

center_image

这个函数有两个变量,我们要对它们分别求导,分别求出x和y的梯度方向,才能确定要向哪里下降。center_image就象是这样。

思路其实很简单,我们只要对x和y分别求导就可以了,在求x的导数时,将y看作常量。在求y的导数时,将x看作常量。

求y为常量时,求x的导数过程(跟之前几乎一样):

center_image

当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]))
损失函数下降曲线如下:
center_image
同理,这样还可解决更多变量的问题,然后大家就可以利用梯度下降解决实际问题了!
下次我将会讲一个实际问题给大家解决!


回复

上一页第 1 页 / 共 1 页下一页
四九圣尊四九圣尊

喵

点赞0


评论


Rougemare初染聊高数Rougemare初染聊高数

喵

点赞0


评论


ftxqgfudiftxqgfudi

啊
完全看不懂

点赞0


评论


东百打手东百打手

点赞0


评论

。。。。


四九圣尊四九圣尊

代码有个地方写错了,就定义函数那里。不是2xy,是3xy

点赞0


评论

不影响,实践时改正就好


四九圣尊四九圣尊

 

点赞0


评论


嗯哼君 渠源嗯哼君 渠源

王dalao的图形可视化教程不懂,不懂······

点赞0


评论


无情的AC自动鸡无情的AC自动鸡

wok 三维函数 怎么绘制

点赞0


评论


机器人包老师机器人包老师

大

 

神

点赞0


评论