Pytorch深度学习实践(2)梯度下降

梯度下降

梯度下降是求解参数的一个优化方法,即求解使目标函数最小的参数组合, ω ∗ = a r g m i n   c o s t ( ω ) \omega ^*=argmin \ cost(\omega) ω=argmin cost(ω)

基本原理

梯度下降过程中,每一步通过目标函数在某点对权重求导,即 ∂ c o s t ∂ ω \frac{\partial cost}{\partial \omega} ωcost,得到这个点的梯度,即目标函数在这个点上升最快的方向,并且要对其取相反数(正方向是上升的,负方向是下降的),从而得到梯度下降每一步的迭代方向

核心公式:
ω = ω − α ∂ c o s t ∂ ω \omega = \omega - \alpha \frac{\partial cost}{\partial \omega} ω=ωαωcost
其中, α \alpha α 为学习率

梯度下降的算法核心是贪心算法

**注:**梯度下降只能保证最终得到的结果为局部最优解,而不能保证全局最优。但在实际的神经网络中,经过大量的实验发现,我们的目标函数很少存在局部最优的情况,大部分是全局最优。

但是在深度学习中使用梯度下降时,常见的问题是解决鞍点,即在目标函数的某点处其梯度为0,导致我们的梯度下降算法无法对参数进行更新
在这里插入图片描述

使用梯度下降求解线性模型

首先通过求导公式及链式求导法则,得到梯度:
在这里插入图片描述

然后得到线性模型中参数的更新公式:
ω = ω − α 1 N ∑ n = 1 N 2 x n ( x n ω − y n ) \omega = \omega - \alpha \frac{1}{N}\sum_{n=1}^{N}2x_n(x_n\omega - y_n) ω=ωαN1n=1N2xn(xnωyn)

代码实现

import numpy as np
import matplotlib.pyplot as plt

## 数据准备
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
cost_history = []

## 梯度下降参数初始化
w = np.random.rand()  # 设定为一个随机数
alpha = 0.01  # 学习率

## 定义线性模型
def forward(x):
    return x*w
## 损失函数
def cost(xs, ys):
    cost = 0
    for x, y in zip(xs, ys):
        y_pred = forward(x)
        cost += (y_pred - y) ** 2
    return cost / len(xs)  # 返回平均误差
## 计算梯度
def gradient(xs, ys):
    grad = 0;
    for x, y in zip(xs, ys):
        grad += 2*x*(x*w - y)
    return grad / len(xs)  # 返回平均梯度

## 模型训练
for epoch in range(100):
    cost_val = cost(x_data, y_data)
    grad_val = gradient(x_data, y_data)
    w -= alpha*grad_val  # 梯度下降更新参数
    cost_history.append(cost_val)

print("最优参数", w)
plt.plot(np.arange(100), cost_history)
plt.xlabel("epoch")
plt.ylabel("cost")
plt.show()

在这里插入图片描述

随机梯度下降

每次更新参数时,从所有样本中随机选取一个,进行计算梯度,更新参数。在实际惭怍中,要计算每一个样本的梯度,并且对参数进行更新

由于样本存在随机噪声,并且在计算梯度时也存在随机性,因此使用随机梯度下降可以解决陷入鞍点的问题

随机梯度下降公式
∂ l o s s n ∂ ω = 2 x n ( x n ω − y n ) \frac{\partial loss_n}{\partial \omega} = 2x_n(x_n\omega - y_n) ωlossn=2xn(xnωyn)
随机梯度下降代码

def forward(x):
    return x*w;
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2
def gradient(x, y):
    return 2*x*(x*w - y);
for epoch in range(100):
    for x, y in zip(x_data, y_data):
        grad = gradient(x, y)
        w = w - 0.01 * grad;
        l = loss(x, y)

随机梯度下降由于可以解决鞍点问题,在寻找最优值时具有不错的效果,但因为在每一次迭代中,所有的样本不能同时计算梯度进行更新,即不能并行,因此其时间效率比较低

随机小批量梯度下降

随机小批量梯度下降是批量梯度下降和随机梯度下降的折中

即每次更新梯度时,选取一个批量 b a t c h batch batch进行梯度求解,更新参数。且在深度学习中默认的SGD方法就是随机小批量深度下降

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值