写点什么

实用机器学习笔记十三:随机梯度下降

作者:打工人!
  • 2021 年 12 月 14 日
  • 本文字数:1071 字

    阅读完需:约 4 分钟

实用机器学习笔记十三:随机梯度下降

前言:

本文是个人在 B 站自学李沐老师的实用机器学习课程【斯坦福 2021 秋季中文同步】的学习笔记,感觉沐神讲解的非常棒 yyds。

小批量随机梯度下降(mini-batch stochastic gradient descent(SGD)):


前面介绍了线性模型的两个实例和优化目标,本小节介绍如何求解线性模型,线性模型求解的方法有很多,甚至可以直接写出显式解。但是本文要介绍的是随机梯度下降。为什么介绍小批量随机梯度下降呢?这是因为在深度学习领域,这个方法可能是目前唯一可以求解的方法了。


  • 通过 mini-batch 的 SGD 方法训练

  • 表示模型参数(包含权重参数和偏置项),代表 batch size(也就是 mini-batch 的大小),表示在时刻的学习率。

  • 随机初始化权重

  • Repeat 直到收敛

  • 随机从训练集中(训练集的大小为 n 个样本)抽样训练数据,且样本数量为 b

  • 梯度下降并更新权重,梯度下降就是朝着使函数值最大的方向更新,因为我们是要最小化损失,因此前面加上负号。

  • 优点:除了决策树可以解决几乎所有的目标函数

  • 缺点:对超参数的大小非常敏感,比较玄学。这里的都是超参数。


总结:

  • 线性模型就是把输入进行线性加权求和去预测输出

  • 在线性回归中用均方误差(MSE)作为损失函数

  • 在 softmax 回归中,把 cross-entrapy 作为损失函数

  • mini-batch SGD 可以解决以上两个模型,在深度学习中几乎都用此方法解决


代码示例:


代码是李沐老师动手学深度学习的配套代码。地址:http://d2l.ai/chapter_linear-networks/linear-regression-scratch.html


主要代码如下:


# pytorch代码
# 读取数据集
def data_iter(batch_size, features, labels): num_examples = len(features) indices = list(range(num_examples)) # 这些样本是随机读取的,没有特定的顺序 random.shuffle(indices) for i in range(0, num_examples, batch_size): batch_indices = torch.tensor( indices[i: min(i + batch_size, num_examples)]) yield features[batch_indices], labels[batch_indices] # 定义损失函数
def squared_loss(y_hat, y): #@save """均方损失""" return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2 # 定义优化算法
def sgd(params, lr, batch_size): #@save """小批量随机梯度下降""" with torch.no_grad(): for param in params: param -= lr * param.grad / batch_size param.grad.zero_()
复制代码


发布于: 2 小时前阅读数: 8
用户头像

打工人!

关注

打工人! 2019.11.10 加入

InfoQ年度最佳内容获得者。 InfoQ签约作者 本人打工人一枚,自动化和控制专业入坑人一枚。目前在研究深度强化学习(DRL)技术。准备入坑互联网小白一枚。喜欢了解科技前沿技术,喜欢拍照。

评论

发布
暂无评论
实用机器学习笔记十三:随机梯度下降