⚡机器学习⚡中的优化器(Optimizers)方法

简介: ⚡机器学习⚡中的优化器(Optimizers)方法

⚡终于!!!

⚡终于又有时间学习Deep Learning了⚡!

30天ML计划,一起加油!!!

https://blog.csdn.net/weixin_44333889/category_11271153.html《专栏》


在训练NN的时候,有哪些Optimizers可以优化更快的找到global Minima?


下面我们来看下有哪些方法可以优化求解。


Background

在训练神经网路的时候,最开始我们是用的Gradient Descent(梯度下降法,GD)来求解,但是会出现很多问题,面临大量的数据的时候,GD会出现local Minima,而且求解速度会下降。


关于GD+Momentum,可以看这个介绍简单易懂。


整个技术的发展路线如下:


SGD 【Cauchy,1847】

SGD with momentum 【Rumelhart,et al.,Nature’1986】

上面两个是远古时期的优化求解方法,其实放到现在来看,依旧还是很有效果。


如下面这些就是SGDM训练出来的,


image.png

image.png

目前比较常用的是下面三个Optimizers:


Adagrad 【Duchi,et al. JMLR’11 2011】

RMSProp 【Hinton,et al. Lecture slides, 2013】

Adam 【kingma,et al. ICLR’15 2014】

借用一下李老师(台大,李宏毅)的PPT。


SGD,stochastic gradient descent。也就是最普通的方法,如下图所示

image.png

image.png

image.png

Adagrad

Adagrad(自适应梯度算法)。其基本思想是,对每个参数theta自适应的调节它的学习率,自适应的方法就是对每个参数乘以不同的系数,并且这个系数是通过之前累积的梯度大小的平方和决定的,也就是说,对于之前更新很多的,相对就可以慢一点,而对那些没怎么更新过的,就可以给一个大一些的学习率。


Adagrad算法:

image.png

以上就为Adagrad算法的内容。

Python实现代码:

import numpy as np
class Adagrad:
    def __init__(self, learning_rate=0.01):
        self.learning_rate = learning_rate    # 学习率设置为0.01
        self.fg = None  
        self.delta = 1e-07                   # 设置1e-07微小值避免分母为0
    def update(self, params, grads):     # 更新操作
        if self.fg is None:
            self.fg = {}               # 设为空列表
            for key, value in params.items():
                self.fg[key] = np.zeros_like(value)   # 构造一个矩阵
        for key in params.keys():        # 循环迭代
            self.fg[key] += grads[key] * grads[key]     
            params[key] -= self.learning_rate * grads[key] / (np.sqrt(self.fg[key]) + self.delta) 

RMSProp

RMSProp算法实则为对Adagrad的一个改进,也就是把Adagrad对历史梯度加和变成了对历史梯度求均值,再利用这个均值代替Adagrad累加的梯度和对当前梯度进行加权,并用来update更新。


用均值代替求和是为了解决Adagrad的学习率逐渐消失的问题。


image.png

image.png

图片源自网络)

有位大佬的解释更加清晰,可跳转此处

def RMSprop(x, y, step=0.01, iter_count=500, batch_size=4, alpha=0.9, beta=0.9):
    length, features = x.shape
    data = np.column_stack((x, np.ones((length, 1))))
    w = np.zeros((features + 1, 1))
    Sdw, v, eta = 0, 0, 10e-7
    start, end = 0, batch_size
    # 开始迭代
    for i in range(iter_count):
        # 计算临时更新参数
        w_temp = w - step * v
        # 计算梯度
        dw = np.sum((np.dot(data[start:end], w_temp) - y[start:end]) * data[start:end], axis=0).reshape((features + 1, 1)) / length        
        # 计算累积梯度平方
        Sdw = beta * Sdw + (1 - beta) * np.dot(dw.T, dw)
        # 计算速度更新量、
        v = alpha * v + (1 - alpha) * dw
        # 更新参数
        w = w - (step / np.sqrt(eta + Sdw)) * v
        start = (start + batch_size) % length
        if start > length:
            start -= length
        end = (end + batch_size) % length
        if end > length:
            end -= length
    return w

Adam

最后讲讲Adam(自适应矩估计 Adaptive moment estimation),因为目前是比较强的,下面这些都是由Adam训练出来的,

image.png

看一下Adam和SGDM的准确率对比(源自论文)

image.png

由于Adam的提出的地方有一些突兀,并非在论文或会议,能找到的最原始的出处也只有下面了,看一下他的更新方式吧,相当于一个优化参数的更新模块。

image.png

image.png

Adam 的Python代码有大佬已经开源了:


https://github.com/yzy1996/Python-Code/blob/master/Algorithm/Optimization-Algorithm/Adam.py

https://github.com/sagarvegad/Adam-optimizer/blob/master/Adam.py

如果不想转链接,这里直接附上了:

import math
alpha = 0.01
beta_1 = 0.9
beta_2 = 0.999            # 初始化参数的值
epsilon = 1e-8
def func(x):
  return x*x -4*x + 4
def grad_func(x):         # 计算梯度
  return 2*x - 4
theta_0 = 0           # 初始化向量
m_t = 0 
v_t = 0 
t = 0
while (1):          # 循环直到它收敛
  t+=1
  g_t = grad_func(theta_0)    # 计算随机函数的梯度
  m_t = beta_1*m_t + (1-beta_1)*g_t # 更新梯度的移动平均线
  v_t = beta_2*v_t + (1-beta_2)*(g_t*g_t) # 更新平方梯度的移动平均线
  m_cap = m_t/(1-(beta_1**t))   # 计算偏差校正后的估计
  v_cap = v_t/(1-(beta_2**t))   # 计算偏差校正后的估计
  theta_0_prev = theta_0                
  theta_0 = theta_0 - (alpha*m_cap)/(math.sqrt(v_cap)+epsilon)  # 更新参数
  if(theta_0 == theta_0_prev):    # 检查是否收敛
    break

总而言之,这个优化器目前是处于机器学习中最强的优化地位。

其实,对于不同的数据集或许会有所偏差,在不同的优化时间段,前中后期,各个优化器的准确率会有所波动,如下(源自论文)准确率测试图:

image.png

所以,不经感叹道,搞优化求解,真的是一门玄学啊,老的方法不一定在现在没有用,新的方法不一定适用于所以场景,找到最适合的方法才是真的有效的。相信在科技如此发达的现在及以后,会有更多的优化求解算法,推进人类进步,而不仅仅是从硬件上提升运算速度。

相关文章
|
2月前
|
数据采集 机器学习/深度学习 存储
【机器学习】数据清洗——基于Numpy库的方法删除重复点
【机器学习】数据清洗——基于Numpy库的方法删除重复点
80 1
|
2月前
|
数据采集 机器学习/深度学习 Python
【机器学习】数据清洗——基于Pandas库的方法删除重复点
【机器学习】数据清洗——基于Pandas库的方法删除重复点
55 1
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
大数据分析的技术和方法:从深度学习到机器学习
大数据时代的到来,让数据分析成为了企业和组织中不可或缺的一环。如何高效地处理庞大的数据集并且从中发现潜在的价值是每个数据分析师都需要掌握的技能。本文将介绍大数据分析的技术和方法,包括深度学习、机器学习、数据挖掘等方面的应用,以及如何通过这些技术和方法来解决实际问题。
62 2
|
2月前
|
机器学习/深度学习 算法 数据可视化
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
30 1
|
2天前
|
数据可视化
R语言机器学习方法分析二手车价格影响因素
R语言机器学习方法分析二手车价格影响因素
|
7天前
|
机器学习/深度学习 数据可视化 前端开发
【Python机器学习专栏】机器学习模型评估的实用方法
【4月更文挑战第30天】本文介绍了机器学习模型评估的关键方法,包括评估指标(如准确率、精确率、召回率、F1分数、MSE、RMSE、MAE及ROC曲线)和交叉验证技术(如K折交叉验证、留一交叉验证、自助法)。混淆矩阵提供了一种可视化分类模型性能的方式,而Python的scikit-learn库则方便实现这些评估。选择适合的指标和验证方法能有效优化模型性能。
|
7天前
|
机器学习/深度学习 算法 Python
【Python机器学习专栏】Python中的特征选择方法
【4月更文挑战第30天】本文介绍了机器学习中特征选择的重要性,包括提高模型性能、减少计算成本和增强可解释性。特征选择方法主要包括过滤法(如相关系数、卡方检验和互信息)、包装法(如递归特征消除和顺序特征选择)和嵌入法(如L1正则化和决策树)。在Python中,可利用`sklearn`库的`feature_selection`模块实现这些方法。通过有效的特征选择,能构建更优的模型并深入理解数据。
|
7天前
|
机器学习/深度学习 数据采集 数据可视化
【Python 机器学习专栏】数据缺失值处理与插补方法
【4月更文挑战第30天】本文探讨了Python中处理数据缺失值的方法。缺失值影响数据分析和模型训练,可能导致模型偏差、准确性降低和干扰分析。检测缺失值可使用Pandas的`isnull()`和`notnull()`,或通过可视化。处理方法包括删除含缺失值的行/列及填充:固定值、均值/中位数、众数或最近邻。Scikit-learn提供了SimpleImputer和IterativeImputer类进行插补。选择方法要考虑数据特点、缺失值比例和模型需求。注意过度插补和验证评估。处理缺失值是提升数据质量和模型准确性关键步骤。
|
9天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能平台PAI产品使用合集之在使用DSSM负采样时,不知道label_fields的配置方法如何解决
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
21天前
|
机器学习/深度学习 大数据
如何通过评估方法评估机器学习模型的性能
如何通过评估方法评估机器学习模型的性能
9 0