03Gradient_Descent

梯度下降算法,此处给出刘建平博客关于梯段下降的小结,非常的清楚明白。https://www.cnblogs.com/pinard/p/5970503.html

深度学习使用梯度下降的原因

  • 在开始例子之前,刘建平老师扩展了两个概念。局部最优和全局最优,说经过实践发现,原本梯度下降应该是很容易陷入局部最优的,但实际上,局部最优的点很少。因此在深度学习项目中,广泛使用梯度下降算法。
  • 但容易遇上鞍点,当陷入鞍点后,有可能训练就无法进行了。但因为有噪声的存在,就增大了跳出鞍点的可能性,所以综合来说,梯度下降算法非常适合深度学习权重寻优。

梯度的含义

  • 在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数 f ( x , y ) f(x,y) f(x,y), 分别对 x , y x,y x,y求偏导数,求得的梯度向量就是 ( ∂ f / ∂ x , ∂ f / ∂ y ) T (∂f/∂x, ∂f/∂y)^T (f/x,f/y)T,简称 g r a d f ( x , y ) grad f(x,y) gradf(x,y)或者 ▽ f ( x , y ) ▽f(x,y) f(x,y)。对于在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)的具体梯度向量就是 ( ∂ f / ∂ x 0 , ∂ f / ∂ y 0 ) T (∂f/∂x_0, ∂f/∂y_0)^T (f/x0,f/y0)T.或者 ▽ f ( x 0 , y 0 ) ▽f(x_0,y_0) f(x0,y0),如果是3个参数的向量梯度,就是 ( ∂ f / ∂ x , ∂ f / ∂ y , ∂ f / ∂ z ) T (∂f/∂x, ∂f/∂y,∂f/∂z)^T (f/x,f/yf/z)T,以此类推。
  • 那么这个梯度向量求出来有什么意义呢?他的意义从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数 f ( x , y ) f(x,y) f(x,y),在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),沿着梯度向量的方向就是 ( ∂ f / ∂ x 0 , ∂ f / ∂ y 0 ) T (∂f/∂x_0, ∂f/∂y_0)^T (f/x0,f/y0)T的方向是 f ( x , y ) f(x,y) f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是 − ( ∂ f / ∂ x 0 , ∂ f / ∂ y 0 ) T -(∂f/∂x_0, ∂f/∂y_0)^T (f/x0,f/y0)T的方向,梯度减少最快,也就是更加容易找到函数的最小值。

本小节案例

Alt

  • 第四讲的这个简单的例子,只有一个权重参数,也就是说维度只有一维。所以我们求梯度,可以很容易的通过硬编码的方式进行,也就是手推求导公式,然后根据公式编写代码。此处先留一个疑问?如果模型很复杂,无法通过硬编码的方式求梯度?无法求出导数公式。那该怎么用梯度下降?这个问题就是下一讲的反向传播解决的问题。

本例导数公式推导

Alt

import numpy as np
import matplotlib.pyplot as plt
w = 1.0
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
def forward(x):
    '求预测值:y_hat = x * w'
    return x * w
def cost(xs, ys):
    '输入:x_data,y_data;输出:损失cost = (y_hat - y)的平方累加再求均值'
    cost_val=0
    for x,y in zip(xs,ys):
        y_pred = forward(x)
        cost_val += (y_pred - y) ** 2
    return cost_val/len(xs)
def gradient(xs, ys):
    '求梯度:cost对w求导 '
    grad = 0
    for x,y in zip(xs,ys):
        grad += x * 2 * (forward(x) - y)
    return grad/len(xs)
print('predict(before training)', 4 , forward(4))
epochList = []
costList = []
learning = 0.01
for epoch in range(100):
    epochList.append(epoch)
    cost_val = cost(x_data, y_data)
    costList.append(cost_val)
    w -= learning * gradient(x_data, y_data) #梯度更新
    print('epoch:', epoch, 'w:', w, 'cost:', cost_val)
print('predict(after training)', 4, forward(4))
plt.plot(epochList, costList)
plt.xlabel('epoch')
plt.ylabel('cost')
plt.show()

实验结果

Alt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值