算法|神经网络——优化器算法


文章目录

  • 前言
  • 一、机器学习的优化器是什么?
  • 二、有哪些类型
    • 1.随机梯度下降
      • 1.1 Batch Gradient Decent (BGD)
      • 1.2 Stochastic Gradient Decent(SGD) 随机
      • 1.3 Mini-Bach Gradient Decent (MBGD)
    • 2.自适应算法
  • 如何选择优化算法
    • 1.Momentum

前言 本篇文章记录机器学习的优化器相关的比较:有一篇paper 做了相关的工作 https://arxiv.org/pdf/1609.04747.pdf 一、机器学习的优化器是什么? 在机器学习中,通常情况下。我们建立了一个模型,这个模型是一些参数 Θ ( Θ 1 , Θ 2 , . . . . . . ) \Theta(\Theta_1,\Theta_2,......) Θ(Θ1?,Θ2?,......)的函数。对于每一个training 的data, 都会产生一个损失。我们会定义一个损失函数 L = 1 / N ? ∑ l i L=1/N*\sum l_i L=1/N?∑li? (就是每个样本的损失的叠加求均值)。对于不同的training data来说,最后产生的L是不同的,想要找到最小的L,就要求 ? L ? Θ = 0 \frac{\partial L}{\partial \Theta}= 0 ?Θ?L?=0。
二、有哪些类型 1.随机梯度下降 https://blog.csdn.net/u012328159/article/details/80252012
梯度下降最常见的三种变形 BGD,SGD,MBGD,对于SGD/MBGD而言,每次使用的损失函数只是通过这一个小批量的数据确定的,其函数图像与真实全集损失函数有所不同,所以其求解的梯度也含有一定的随机性,在鞍点或者局部最小值点的时候,震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。
1.1 Batch Gradient Decent (BGD)
用整个数据集来计算cost function 对参数的梯度:
算法|神经网络——优化器算法
文章图片

缺点: 梯度更新计算的很慢, GPU的缓存不够, 没有办法一次把所有的数据都加载进去。
对于凸函数可以找到全局最小值,对于非凸函数,很容易落到局部最小值中

for i in range(nb_epochs): params_grad = evaluate_gradient(loss_function, data, params) params = params - learning_rate * params_grad

1.2 Stochastic Gradient Decent(SGD) 随机
和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余.
缺点: 每次更新是震荡下降的,因为每次只用一个样本
SGD 一次只用一个样本进行更新,就没有冗余,而且比较快,并且可以新增样本。

算法|神经网络——优化器算法
文章图片

for i in range(nb_epochs): np.random.shuffle(data) for example in data: params_grad = evaluate_gradient(loss_function, example, params) params = params - learning_rate * params_grad

1.3 Mini-Bach Gradient Decent (MBGD)
mini-batch gradient descent 是batch gradient descent和stochastic gradient descent的折中方案,就是mini-batch gradient descent每次用一部分样本来更新参数,即 batch_sizebatch_size。因此,若batch_size=1batch_size=1 则变成了SGD,若batch_size=mbatch_size=m 则变成了batch gradient descent。batch_sizebatch_size通常设置为2的幂次方,通常设置2,4,8,16,32,64,128,256,5122,4,8,16,32,64,128,256,512(很少设置大于512)。
算法|神经网络——优化器算法
文章图片

for i in range(nb_epochs): np.random.shuffle(data) for batch in get_batches(data, batch_size=50): params_grad = evaluate_gradient(loss_function, batch, params) params = params - learning_rate * params_grad

缺点 1: 收敛性不能得到保障,learning rate 如果太小,收敛速度会比较慢。反之如果太大,loss function 会在极小值附近震荡。
缺点2: lr对于所有参数的都是相同的,如果我们的数据比较稀疏,我们希望对出现频率低的特征进行大一点的更新。lr会随着更新次数逐渐变小
MBGD 每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。

2.自适应算法 首先清楚指数加权平均和偏差修正的含义:
指数加权:
v t = β v t ? 1 + ( 1 ? t ) Θ t v_t=βv_{t-1}+(1-t)\Theta_t vt?=βvt?1?+(1?t)Θt?
v t v_t vt?实际上是 1 / ( 1 ? β ) 1/(1-β) 1/(1?β)个 Θ \Theta Θ的平均值
偏差修正
v t / ( 1 ? β t ) v_t/(1-β^t) vt?/(1?βt)
当 v 0 v_0 v0?是0的时候,求得的初期几个计算值会与真实的计算结果有较大的差距
如何选择优化算法 1.Momentum 【算法|神经网络——优化器算法】提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

    推荐阅读