猫史档案馆


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

用户:四九圣尊四九圣尊查看:2 回复: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


评论