【机器学习】numpy实现Adam优化器

💥 项目专栏:【Python实现经典机器学习算法】附代码+原理介绍

文章目录

前言

  • 👑 最近粉丝群中很多朋友私信咨询一些决策树、逻辑回归等机器学习相关的编程问题,为了能更清晰的说明,所以建立了本专栏 专门记录基于原生Python实现一些入门必学的机器学习算法,帮助广大零基础用户达到轻松入门,为了更深刻算法的基本原理,本专栏没有采用第三方库来实现(sklearn),而是采用原生Python自己复现相关算法,从而帮助新手理解算法的内部细节。
  • 👑 本专栏适用人群:🚨🚨🚨 机器学习初学者刚刚接触sklearn的用户群体,专栏将具体讲解如何基于原生Python来实现一些经典机器学习算法, 快速让新手小白能够对机器学习算法有更深刻的理解
  • 👑 本专栏内包含基于原生Python从零实现经典机器学习算法,通过自复现帮助新手小白对算法有更深刻的认识,理论与实践相结合,每一篇文章都附带有 完整的代码+原理讲解

🚨 我的项目环境:

  • 平台:Windows11
  • 语言环境:Python 3.7
  • 编译器:Jupyter Lab
  • Pandas:1.3.5
  • Numpy:1.19.3
  • Scipy:1.7.3
  • Matplotlib:3.1.3

💥 项目专栏:【Python实现经典机器学习算法】附代码+原理介绍

一、Adam优化原理

自适应矩估计(Adam)是计算每个参数的自适应学习率的另一种方法。除了存储过去平方梯度(如Adadelta和RMSprop)的指数衰减平均值外,Adam还保持过去梯度的指数衰减平均值,类似于动量:
m t = β 1 m t − 1 + ( 1 − β 1 ) g t v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 m_t=\beta_1m_{t-1}+(1-\beta_1)g_t\ v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2 m t ​=β1 ​m t −1 ​+(1 −β1 ​)g t ​v t ​=β2 ​v t −1 ​+(1 −β2 ​)g t 2 ​
它们通过计算偏差修正的第一和第二矩估计值来抵消这些偏差:
m t ^ = m t 1 − β 1 t v t ^ = v t 1 − β 2 t \hat {m_t}=\frac{m_t}{1-\beta_1^t}\ \hat {v_t}=\frac{v_t}{1-\beta_2^t}m t ​^​=1 −β1 t ​m t ​​v t ​^​=1 −β2 t ​v t ​​
然后,他们使用这些来更新参数,正如我们在Adadelta和RMSprop中看到的那样,这产生了Adam更新规则:
θ t + 1 = θ t − η v t ^ + ϵ m t ^ \theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{\hat {v_t}}+\epsilon}\hat {m_t}θt +1 ​=θt ​−v t ​^​​+ϵη​m t ​^​
作者建议的默认值是 β 1 = 0.9 \beta_1=0.9 β1 ​=0.9, β 2 = 0.999 \beta_2=0.999 β2 ​=0.999,他们的经验表明,Adam在实践中运行良好,并优于其他自适应学习方法算法。

二、更新规则

Adam (Adaptive Moment Estimation) 是一种自适应学习率的优化算法,结合了 Momentum 和 RMSprop 的优点,能够更快地收敛并且具有较好的泛化性能。

Adam 的更新规则如下:

m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1-\beta_1) g_t m t ​=β1 ​m t −1 ​+(1 −β1 ​)g t ​
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2 v t ​=β2 ​v t −1 ​+(1 −β2 ​)g t 2 ​
m ^ t = m t 1 − β 1 t \hat{m}_t = \frac{m_t}{1-\beta_1^t}m ^t ​=1 −β1 t ​m t ​​
v ^ t = v t 1 − β 2 t \hat{v}t = \frac{v_t}{1-\beta_2^t}v ^t =1 −β2 t ​v t ​​
θ t + 1 = θ t − η v ^ t + ϵ m ^ t \theta{t+1} = \theta_t – \frac{\eta}{\sqrt{\hat{v}_t}+\epsilon} \hat{m}_t θt +1 =θt ​−v ^t ​​+ϵη​m ^t ​

其中,m t m_t m t ​ 和 v t v_t v t ​ 分别表示梯度和梯度平方的指数加权移动平均,β 1 \beta_1 β1 ​ 和 β 2 \beta_2 β2 ​ 是衰减率,用于控制移动平均的权重,一般取值为 0.9 和 0.999,m ^ t \hat{m}_t m ^t ​ 和 v ^ t \hat{v}_t v ^t ​ 分别表示偏差校正后的一阶和二阶矩估计,η \eta η 表示学习率,ϵ \epsilon ϵ 是一个非常小的常数,用于保证数值稳定性。

Adam 通过计算梯度的一阶和二阶矩估计来调整每个参数的学习率。一阶矩估计 m t m_t m t ​ 表示梯度的指数加权移动平均,可以看做是对梯度的历史信息的一种估计。二阶矩估计 v t v_t v t ​ 表示梯度平方的指数加权移动平均,可以看做是对梯度平方的历史信息的一种估计。通过对梯度的一阶和二阶矩估计进行归一化,Adam 能够自适应调整每个参数的学习率,从而更快地收敛并且具有较好的泛化性能。

Adam 的优点是可以自适应调整学习率,并且相比于其他优化算法,具有较快的收敛速度和较好的泛化性能。此外,Adam 也易于实现和调整,是一种非常有效的优化算法。

三、迭代过程

【机器学习】numpy实现Adam优化器

; 四、代码实践

import numpy as np
import matplotlib.pyplot as plt

class Optimizer:
    def __init__(self,
                 epsilon = 1e-10,
                 iters = 100000,
                 lamb = 0.01,
                 gamma = 0.9,
                 theta = 1e-8,
                 beta1 = 0.9,
                 beta2 = 0.999):
        self.epsilon = epsilon
        self.iters = iters
        self.lamb = lamb
        self.gamma = gamma
        self.theta = theta
        self.beta1 = beta1
        self.beta2 = beta2

    def adam(self, x_0 = 0.5, y_0 = 0.5):
        f1, f2 = self.fn(x_0, y_0), 0
        w = np.array([x_0, y_0])
        k = 0
        m_t = 0.0
        v_t = 0.0

        while True:
            if abs(f1 - f2)  self.epsilon or k > self.iters:
                break

            f1 = self.fn(x_0, y_0)

            g = np.array([self.dx(x_0, y_0), self.dy(x_0, y_0)])

            m_t = self.beta1 * m_t + (1 - self.beta1) * g
            v_t = self.beta2 * v_t + (1 - self.beta2) * np.dot(g, g)

            m_hat = m_t / (1 - self.beta1)
            v_hat = v_t / (1 - self.beta2)

            x_0, y_0 = np.array([x_0, y_0]) - self.lamb / (self.theta + np.sqrt(v_hat)) * m_hat

            f2 = self.fn(x_0, y_0)

            w = np.vstack((w, (x_0, y_0)))
            k += 1

        self.print_info(k, x_0, y_0, f2)
        self.draw_process(w)

    def print_info(self, k, x_0, y_0, f2):
        print('迭代次数:{}'.format(k))
        print('极值点:【x_0】:{} 【y_0】:{}'.format(x_0, y_0))
        print('函数的极值:{}'.format(f2))

    def draw_process(self, w):
        X = np.arange(0, 1.5, 0.01)
        Y = np.arange(-1, 1, 0.01)
        [x, y] = np.meshgrid(X, Y)
        f = x**3 - y**3 + 3 * x**2 + 3 * y**2 - 9 * x
        plt.contour(x, y, f, 20)
        plt.plot(w[:, 0],w[:, 1], 'g*', w[:, 0], w[:, 1])
        plt.show()

    def fn(self, x, y):
        return x**3 - y**3 + 3 * x**2 + 3 * y**2 - 9 * x

    def dx(self, x, y):
        return 3 * x**2 + 6 * x - 9

    def dy(self, x, y):
        return - 3 * y**2 + 6 * y

"""
    函数: f(x) = x**3 - y**3 + 3 * x**2 + 3 * y**2 - 9 * x
    最优解: x = 1, y = 0
    极小值: f(x,y) = -5
"""
optimizer = Optimizer()
optimizer.adam()

Original: https://blog.csdn.net/m0_47256162/article/details/121577461
Author: Bi 8 Bo
Title: 【机器学习】numpy实现Adam优化器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/759626/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python+pytest+allure接口测试框架(不断完善中)

    一、环境搭建 本地安装相关依赖包,pytest、requests、allure-pytest、pytest-ordering等 二、编写脚本 1、测试文件以test_开头(以_te…

    Python 2023年9月11日
    047
  • WebSocket长连接

    WebSocket长连接 1、概述 ; 1.1 定义 1.2 原理 ; 2、Django中配置WebSocket 2.1安装第三方法包 * pip install channels…

    Python 2023年8月4日
    043
  • 【数据处理学习笔记】pandas

    import pandas as pd data = pd.read_csv(‘./docs/test.csv’) print(data) 控制台打印如下: Unnamed: 0 …

    Python 2023年8月18日
    059
  • 将几万张图片合成一张图片,制作一个超赞的马赛克图!

    需求说明:制作一个马赛克图片,将几万张图片进行合成,每个马赛克格子的尺寸为15×15。 完整的源代码解释在文章的末尾,你可以下载你需要的东西。 [En] The comp…

    Python 2023年5月24日
    073
  • python 日志框架_python pytest测试框架介绍五—日志实时输出

    同样的,在使用pytest进行自动化测试时,需要将实时日志打印出来,而不是跑完后才在报告中出结果。 不过,好在pytest在3.3版本开始,就支持这一功能了,而不用再像nose一样…

    Python 2023年9月13日
    037
  • scrapy笔记一(scrapy.Spider爬取文字并储存)

    前言 今天学习爬虫网页项目时遇到xpath解析问题,纠结了十几分钟也没成功解决。让我不安的是这个知识点不难,而且之前已经重复学习了多次,如此的记忆效果使我不得不重新审视笔记的作用。…

    Python 2023年10月5日
    034
  • 电影《海贼王:红发歌姬》观后感

    上周,北京已经开始陆续解封了,电影院也可以进入了,只要持有48小时核算就行,于是去看了这部电影《海贼王:红发歌姬》,去看之前,看了预告片,讲述路飞小时候的玩伴乌塔,长大后开办世界级…

    Python 2023年10月7日
    047
  • Win11 VS2019 C++调用matplotlib

    环境:WIN 11, Python3.9 64bit VS2019 1、先安装python中matplotlib和numpy库(没有测试没有安装会怎样,反正先安装了)。win+r …

    Python 2023年9月3日
    054
  • flask 定时任务 flask-apscheduler

    目录 基本使用 interval启动方式 cron启动方式 使用装饰器定时启动任务 flask-apscheduler将 apscheduler移植到了 flask应用中,使得在 …

    Python 2023年8月11日
    072
  • Numpy:读取本地文件及数据处理

    可以理解为方向,使用0,1,2…数字表示,对于一个一维数组,只有一个0轴,二维数组有0轴和1轴,三维数组有0,1,2轴,以此类推。(可以理解为数学中的x,y,z轴) 有…

    Python 2023年8月26日
    069
  • 多态性和虚函数

    1.多态性 向不同对象发送同一消息,不同的对象在接受时会产生不同的行为 2.虚函数 使用基类的指针,指向派生类的对象,调用虚函数的时候,最后调用的是派生类的函数 include c…

    Python 2023年6月12日
    065
  • 【数据分析11天打卡DAY3】第二章 数据重构

    导入基本库与数据 import numpy as npimport pandas as pddf = pd.read_csv(‘data/train-left-up.c…

    Python 2023年8月8日
    045
  • python安装包下载及安装(超详细)

    安装python首先我们要先下载python的安装包,这里给了大家两个下载方式,第一种是官方下载 进入选择版本界面 CTRL+F搜索,搜索版本 然后返回浏览器,选择相应版本下载即可…

    Python 2023年8月1日
    061
  • web搭建自动化环境

    一、打开cmd 二、进入:D:\python\PyCharm\python3.5.2\Scripts 三:windows7版本 点击pycharm—设置—编…

    Python 2023年5月25日
    069
  • 2022国赛C 题古代玻璃制品(附代码+详细讲解视频)

    C 题 古代玻璃制品的成分分析与鉴别 问题 1:对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析;结合玻 璃的类型,分析文物样品表面有无风化化学成分含量的统计规律,并…

    Python 2023年10月26日
    062
  • fiddle如何使用代理

    前言 Fiddle作为抓包工具深受程序员的喜爱,可能在代理方面有些会感觉到迷惑的,可以通过本文的学习来掌握一些基本的知识。 Fiddle介绍 Fiddler是位于客户端和服务器端的…

    Python 2023年6月10日
    060
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球