深度学习中常用的优化方法

简介: 附python代码如下:#!/usr/bin/env python3# encoding: utf-8"""@version: 0.1@author: lyrichu@license: Apache Licence @contact: 919987476@qq.

img_c84aaf78969d05498de58580bce9ee5d.png

img_6cd59ed7083a5609dafb6cc39d8da5c5.png

img_f9b62f91ccda86ddb87ef710486d5f6a.png

img_a8caa715b04e492c0afb336d3e42f4a0.png

img_983d9bf3a84e0547f6667b9f570b5d3b.png

img_1d26102d025d2d9f394cc9e75aa2e5c0.png

附python代码如下:

#!/usr/bin/env python3
# encoding: utf-8
"""
@version: 0.1
@author: lyrichu
@license: Apache Licence 
@contact: 919987476@qq.com
@site: http://www.github.com/Lyrichu
@file: lyrichu_20180424_01.py
@time: 2018/04/24 16:02
@description:
Q1:使用python实现GD,SGD,Momentum,AdaGrad,RMSProp以及Adam优化算法
假设这里优化的目标函数是一个二元函数:y = w1x1 + w2x2 + b,数据点为
[(1,1),2],[(2,3),5],[(3,4),7],[(5,6),11],real w1 = w2 = 1,b = 0
"""
import random
from math import sqrt

data = [[(1,1),2],[(2,3),5],[(3,4),7],[(5,6),11]]
def GD(data,lr = 0.001,epoches = 10):
    random.seed(66) # 产生相同的随机数
    w1,w2,b = [random.random() for _ in range(3)]
    print("Using method GD,lr = %f,epoches = %d" % (lr,epoches))
    for i in range(epoches):
        w1_grads = sum([2*(w1*x1+w2*x2+b-y)*x1 for (x1,x2),y in data])
        w2_grads = sum([2*(w1*x1+w2*x2+b-y)*x2 for (x1,x2),y in data])
        b_grads = sum([2*(w1*x1+w2*x2+b-y) for (x1,x2),y in data])
        w1 -= lr*w1_grads
        w2 -= lr*w2_grads
        b -= lr*b_grads
        loss = sum([(w1*x1+w2*x2+b-y)**2 for (x1,x2),y in data])
        print("epoch %d,(w1,w2,b) = (%f,%f,%f),loss = %f" %(i+1,w1,w2,b,loss))


def SGD(data,lr = 0.001,epoches = 10):
    random.seed(66)  # 产生相同的随机数
    w1, w2, b = [random.random() for _ in range(3)]
    print("Using method SGD,lr = %f,epoches = %d" % (lr, epoches))
    for i in range(epoches):
        (x1,x2),y = random.choice(data) # 随机选择一个数据点
        w1_grads = 2*(w1 * x1 + w2 * x2 + b - y)*x1
        w2_grads = 2 * (w1 * x1 + w2 * x2 + b - y) * x2
        b_grads = 2 * (w1 * x1 + w2 * x2 + b - y)
        w1 -= lr * w1_grads
        w2 -= lr * w2_grads
        b -= lr * b_grads
        loss = sum([(w1 * x1 + w2 * x2 + b - y) ** 2 for (x1, x2), y in data])
        print("epoch %d,(w1,w2,b) = (%f,%f,%f),loss = %f" % (i + 1, w1, w2, b, loss))

def Momentum(data,beta = 0.9,lr = 0.001,epoches = 10):
    random.seed(66)  # 产生相同的随机数
    w1, w2, b = [random.random() for _ in range(3)]
    m = [0,0,0] # 初始动量
    print("Using method Momentum,lr = %f,beta = %f,epoches = %d" % (lr,beta,epoches))
    for i in range(epoches):
        (x1, x2), y = random.choice(data)  # 随机选择一个数据点
        w1_grads = 2 * (w1 * x1 + w2 * x2 + b - y) * x1
        w2_grads = 2 * (w1 * x1 + w2 * x2 + b - y) * x2
        b_grads = 2 * (w1 * x1 + w2 * x2 + b - y)
        m[0] = beta*m[0] + lr*w1_grads
        m[1] = beta*m[1] + lr*w2_grads
        m[2] = beta*m[2] + lr*b_grads
        w1 -= m[0]
        w2 -= m[1]
        b -= m[2]
        loss = sum([(w1 * x1 + w2 * x2 + b - y) ** 2 for (x1, x2), y in data])
        print("epoch %d,(w1,w2,b) = (%f,%f,%f),loss = %f" % (i + 1, w1, w2, b, loss))


def AdaGrad(data,eta = 1e-8,lr = 0.1,epoches = 10):
    # eta 是平滑系数(非常小的一个正数)
    s = 0
    random.seed(66)  # 产生相同的随机数
    w1, w2, b = [random.random() for _ in range(3)]
    print("Using method AdaGrad,lr = %f,eta = %f,epoches = %d" % (lr,eta,epoches))
    for i in range(epoches):
        (x1, x2), y = random.choice(data)  # 随机选择一个数据点
        w1_grads = 2 * (w1 * x1 + w2 * x2 + b - y) * x1
        w2_grads = 2 * (w1 * x1 + w2 * x2 + b - y) * x2
        b_grads = 2 * (w1 * x1 + w2 * x2 + b - y)
        s += sum([i**2 for i in [w1_grads,w2_grads,b_grads]])
        s1 = sqrt(s+eta)
        w1 -= lr*w1_grads/s1
        w2 -= lr*w2_grads/s1
        b -= lr*b_grads/s1
        loss = sum([(w1 * x1 + w2 * x2 + b - y) ** 2 for (x1, x2), y in data])
        print("epoch %d,(w1,w2,b) = (%f,%f,%f),loss = %f" % (i + 1, w1, w2, b, loss))



def RMSProp(data,eta = 1e-8,beta = 0.9,lr =0.1,epoches = 10):
    # eta 是平滑系数(非常小的一个正数)
    s = 0
    random.seed(66)  # 产生相同的随机数
    w1, w2, b = [random.random() for _ in range(3)]
    print("Using method RMSProp,lr = %f,beta = %f,eta = %f,epoches = %d" % (lr,beta,eta,epoches))
    for i in range(epoches):
        (x1, x2), y = random.choice(data)  # 随机选择一个数据点
        w1_grads = 2 * (w1 * x1 + w2 * x2 + b - y) * x1
        w2_grads = 2 * (w1 * x1 + w2 * x2 + b - y) * x2
        b_grads = 2 * (w1 * x1 + w2 * x2 + b - y)
        s = beta*s + (1-beta)*sum([i ** 2 for i in [w1_grads, w2_grads, b_grads]])
        s1 = sqrt(s + eta)
        w1 -= lr*w1_grads / s1
        w2 -= lr*w2_grads / s1
        b -= lr*b_grads / s1
        loss = sum([(w1 * x1 + w2 * x2 + b - y) ** 2 for (x1, x2), y in data])
        print("epoch %d,(w1,w2,b) = (%f,%f,%f),loss = %f" % (i + 1, w1, w2, b, loss))

def Adam(data,eta = 1e-8,beta1 = 0.9,beta2 = 0.99,lr = 0.1,epoches = 10):
    # eta 是平滑系数(非常小的一个正数)
    s = 0
    m = [0,0,0] # 动量
    random.seed(66)  # 产生相同的随机数
    w1, w2, b = [random.random() for _ in range(3)]
    print("Using method Adam,lr = %f,beta1 = %f,beta2 = %f,eta = %f,epoches = %d" % (lr, beta1,beta2,eta,epoches))
    for i in range(epoches):
        (x1, x2), y = random.choice(data)  # 随机选择一个数据点
        w1_grads = 2 * (w1 * x1 + w2 * x2 + b - y) * x1
        w2_grads = 2 * (w1 * x1 + w2 * x2 + b - y) * x2
        b_grads = 2 * (w1 * x1 + w2 * x2 + b - y)
        m[0] = beta1 * m[0] + (1-beta1)* w1_grads
        m[1] = beta1 * m[1] + (1-beta1)* w2_grads
        m[2] = beta1 * m[2] + (1-beta1)* b_grads
        m = [i/(1-beta1) for i in m]
        s = beta2 * s + (1 - beta2) * sum([i ** 2 for i in [w1_grads, w2_grads, b_grads]])
        s /= (1-beta2)
        s1 = sqrt(s + eta)
        w1 -= lr * m[0] / s1
        w2 -= lr * m[1] / s1
        b -= lr * m[2] / s1
        loss = sum([(w1 * x1 + w2 * x2 + b - y) ** 2 for (x1, x2), y in data])
        print("epoch %d,(w1,w2,b) = (%f,%f,%f),loss = %f" % (i + 1, w1, w2, b, loss))


if __name__ == '__main__':
    GD(data,lr = 0.001,epoches=100)
    SGD(data,lr = 0.001,epoches=100)
    Momentum(data,lr = 0.001,beta=0.9,epoches=100)
    AdaGrad(data,eta=1e-8,lr=1,epoches=100)
    RMSProp(data,lr=1,beta=0.99,eta=1e-8,epoches=100)
    Adam(data,lr=1,beta1=0.9,beta2=0.9999,eta=1e-8,epoches=100)

原始的pdf文档如果需要可以在https://pan.baidu.com/s/1GhGu2c_RVmKj4hb_bje0Eg下载.

热爱编程,热爱机器学习! github:http://www.github.com/Lyrichu github blog:http://Lyrichu.github.io 个人博客站点:http://www.movieb2b.com(不再维护)
目录
相关文章
|
12天前
|
机器学习/深度学习 边缘计算 人工智能
探讨深度学习在图像识别中的应用及优化策略
【10月更文挑战第5天】探讨深度学习在图像识别中的应用及优化策略
30 1
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法及其应用
【10月更文挑战第8天】 本文将探讨深度学习中常用的优化算法,包括梯度下降法、Adam和RMSProp等,介绍这些算法的基本原理与应用场景。通过实例分析,帮助读者更好地理解和应用这些优化算法,提高深度学习模型的训练效率与性能。
106 63
|
16天前
|
机器学习/深度学习 数据采集 TensorFlow
智能市场营销策略优化:使用Python实现深度学习模型
【10月更文挑战第1天】 智能市场营销策略优化:使用Python实现深度学习模型
143 63
|
28天前
|
机器学习/深度学习 PyTorch 调度
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
在深度学习中,学习率作为关键超参数对模型收敛速度和性能至关重要。传统方法采用统一学习率,但研究表明为不同层设置差异化学习率能显著提升性能。本文探讨了这一策略的理论基础及PyTorch实现方法,包括模型定义、参数分组、优化器配置及训练流程。通过示例展示了如何为ResNet18设置不同层的学习率,并介绍了渐进式解冻和层适应学习率等高级技巧,帮助研究者更好地优化模型训练。
60 4
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
|
16天前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
11天前
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
13 1
|
15天前
|
机器学习/深度学习 监控 数据可视化
深度学习中实验、观察与思考的方法与技巧
在深度学习中,实验、观察与思考是理解和改进模型性能的关键环节。
19 5
|
12天前
|
机器学习/深度学习 存储 算法
探讨深度学习在图像识别中的应用及优化策略
【10月更文挑战第5天】探讨深度学习在图像识别中的应用及优化策略
31 1
|
12天前
|
机器学习/深度学习 供应链 Python
使用Python实现深度学习模型:智能供应链管理与优化
使用Python实现深度学习模型:智能供应链管理与优化 【10月更文挑战第4天】
63 0
使用Python实现深度学习模型:智能供应链管理与优化
|
17天前
|
机器学习/深度学习 算法
深度学习中的优化算法及其应用
本文探讨了深度学习中常用的优化算法,包括梯度下降、随机梯度下降、动量方法和Adam方法。通过对比这些算法的优缺点及适用场景,帮助读者更好地理解和应用这些优化方法。
21 2