主頁 >  其他 > ?機器學習?中的優化器(Optimizers)方法

?機器學習?中的優化器(Optimizers)方法

2021-09-13 07:50:55 其他

?終于!!!
?終于又有時間學習Deep Learning了?!
30ML計劃,一起加油!!!
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訓練出來的,
請添加圖片描述

目前比較常用的是下面三個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,也就是最普通的方法,如下圖所示
在這里插入圖片描述
SGD就像圖中的更新方式一樣,隨機找到一個起始點,對其求梯度,然后在其梯度的反方向按照 η \eta η步長進行更新,找到下一個點,然后在不斷的重復操作,直到找到Minima,

關于SGDM的更新方式如下圖,可以看出,更新方式在SGD的基礎上,增加了Momentum,而這個Momentum則是在一次梯度下降后,按照其算的梯度方向的反方向(圖中 g 1 g^1 g1)和上一個更新方向的延長(圖中 m 1 m^1 m1)的合成方向(圖中 m 2 m^2 m2)的方向進行更新操作的,不斷的進行更新,直到找到最優的解則停止,

在這里插入圖片描述

Adagrad

Adagrad(自適應梯度演算法),其基本思想是,對每個引數theta自適應的調節它的學習率,自適應的方法就是對每個引數乘以不同的系數,并且這個系數是通過之前累積的梯度大小的平方和決定的,也就是說,對于之前更新很多的,相對就可以慢一點,而對那些沒怎么更新過的,就可以給一個大一些的學習率,

Adagrad演算法:


  • 引數設定: ? \epsilon ? 為全域學習率;初始引數 θ \theta θ;較小的常數(超引數,自己設定) δ \delta δ,為了數值穩定大約設定為 1 0 ? 7 10^{-7} 10?7
  • 初始化梯度累積變數 r = 0 r=0 r=0

接下來是回圈迭代更新

while 沒有達到停止準則 do

  • 從訓練集中采包含 m m m個樣本 { x ( 1 ) , . . . , x ( m ) } \{x^{(1)},...,x^{(m)}\} {x(1),...,x(m)}的小批量,對應目標為 y ( i ) y^{(i)} y(i)
  • 計算梯度: g ← 1 m ▽ θ Σ i L ( x ( 1 ) ; θ , y ( i ) ) g \leftarrow \frac{1}{m} \bigtriangledown _\theta\Sigma_i L(x^{(1)};\theta,y^{(i)}) gm1?θ?Σi?L(x(1);θ,y(i))
  • 累積平方梯度: r ← r + g ⊙ g r\leftarrow r+g \odot g rr+gg
  • 計算更新: △ θ ← ? ? δ + r ⊙ g \bigtriangleup \theta\leftarrow - \frac{\epsilon}{\delta+\sqrt{r}}\odot g θ?δ+r ???g(逐步元素地應用除和求平方根)
  • 應用更新: θ ← θ + △ θ \theta\leftarrow \theta+\bigtriangleup \theta θθ+θ

end
(結束優化更新)


以上就為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的學習率逐漸消失的問題,

在這里插入圖片描述
(圖片源自網路)

有位大佬的解釋更加清晰,可跳轉此處,

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訓練出來的,
請添加圖片描述
看一下Adam和SGDM的準確率對比(源自論文)
請添加圖片描述
由于Adam的提出的地方有一些突兀,并非在論文或會議,能找到的最原始的出處也只有下面了,看一下他的更新方式吧,相當于一個優化引數的更新模塊,
在這里插入圖片描述
簡單翻譯一下上面的更新步驟:

首先,引數設定: g t 2 = g t ⊙ g t g_t^2=g_t \odot g_t gt2?=gt?gt?,默認測驗的學習率(LR) α = 0.001 \alpha=0.001 α=0.001,各種超引數 β 1 = 0.9 、 β 2 = 0.999 、 ? = 1 0 ? 8 \beta _1=0.9、\beta_2=0.999、\epsilon =10^{-8} β1?=0.9β2?=0.999?=10?8

  1. α \alpha α: 步長(Stepsize)亦或學習率
  2. β 1 , β 2 ∈ [ 0 , 1 ] \beta _1,\beta _2\in[0,1] β1?,β2?[0,1]:矩估計的指數衰減率
  3. f ( θ ) f(\theta) f(θ):引數 θ \theta θ 的隨機目標函式值
  4. θ 0 \theta_0 θ0?: 初始引數向量{ m 0 ← 0 m_0 \leftarrow0 m0?0:(初始化第一權值向量)、 v 0 ← 0 v_0\leftarrow0 v0?0:(初始化第二權值向量)、 t ← 0 t\leftarrow0 t0:(初始化時變步長)}

下面為約束,當且僅當 θ t \theta_t θt? 不收斂的時候執行以下操作:

  • t ← t + 1 t\leftarrow t+1 tt+1
  • g t ← ▽ θ f t ( θ t ? 1 ) g_t \leftarrow \bigtriangledown _{\theta}f_{t}(\theta_{t}-1) gt?θ?ft?(θt??1) :(獲得新一輪更新的梯度值(引數 t t t 是上次剛更新的步長))
  • m t ← β 1 ? m t ? 1 + ( 1 ? β 1 ) ? g t m_t \leftarrow \beta_1\cdot m_{t-1}+(1-\beta_1)\cdot g_t mt?β1??mt?1?+(1?β1?)?gt?:(更新帶偏差的第一權重估計值)
  • v t ← β 2 ? v t ? 1 + ( 1 ? β 1 t ) ? g t 2 v_t\leftarrow\beta_2 \cdot v_{t-1}+(1-\beta_1^t)\cdot{g_t^2} vt?β2??vt?1?+(1?β1t?)?gt2?:(更新帶偏差的第二原始權重估計值)
  • m t ^ ← m t / ( 1 ? β 2 t ) \hat {m_t}\leftarrow m_t / (1-\beta_2^t) mt?^?mt?/(1?β2t?):(計算偏差校正后的第一權重估計值)
  • v t ^ ← v t / ( 1 ? β 2 t ) \hat {v_t}\leftarrow v_t/(1-\beta_2^t) vt?^?vt?/(1?β2t?):(計算偏差校正后的第二原始權重估計值)
  • θ t ← θ t ? 1 ? α ? m t ^ / ( v t ^ + ? ) \theta_t\leftarrow \theta_{t-1}-\alpha \cdot \hat{m_t}/(\sqrt{\hat{v_t}}+\epsilon) θt?θt?1??α?mt?^?/(vt?^? ?+?):(更新 θ \theta θ 引數值)

到此引數優化結束,

回傳 θ t \theta_t θt? 的值,

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

總而言之,這個優化器目前是處于機器學習中最強的優化地位,

其實,對于不同的資料集或許會有所偏差,在不同的優化時間段,前中后期,各個優化器的準確率會有所波動,如下(源自論文)準確率測驗圖:
請添加圖片描述
所以,不經感嘆道,搞優化求解,真的是一門玄學啊,老的方法不一定在現在沒有用,新的方法不一定適用于所以場景,找到最適合的方法才是真的有效的,相信在科技如此發達的現在及以后,會有更多的優化求解演算法,推進人類進步,而不僅僅是從硬體上提升運算速度,

Recommend

推薦一本書,對于沒學過最優控制或者最優化方法的小伙伴,會是一個很好地入門書籍,

最優化計算方法

真不是打廣告,真誠推薦!!!

References

  • https://github.com/Fafa-DL/Lhy_Machine_Learning

?堅持讀Paper,堅持做筆記,堅持學習?!!!
?To Be No.1

??

學習DeepLearning堅持!30天計劃!!!

打卡4 /30 Day!!!


?創作不易?,過路能?關注收藏點個贊?三連就最好不過了

?( ′・?・` )

?


Make the choice to be happy. The biggest part of being happy is to simply make up your mind to be a happy person.

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299600.html

標籤:AI

上一篇:核磁共振重建演算法綜述

下一篇:Python OpenCV實戰畫圖——這次一定能行!爆肝萬字,建議點贊收藏~??????

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more