1. 程式人生 > >機器學習中優化演算法總結以及Python實現

機器學習中優化演算法總結以及Python實現

機器學習演算法最終總是能轉化為最優化問題,習慣上會轉化為最小化問題。
個人總結迭代優化演算法關鍵就兩點:
(1) 找到下降方向
(2) 確定下降步長

最速梯度下降演算法

梯度下降演算法是以最優化函式的梯度為下降方向,學習率η\eta乘以梯度的模即為下降步長。更新公式如下:xk+1=xkηgkx_{k+1}=x_k-\eta g_k其中gkg_k為梯度。

批量梯度下降(BGD)

一次迭代過程,所有訓練資料均參與訓練。誤差的計算是所有樣本誤差的均值,並以該誤差的均值參與梯度的計算。

隨機梯度下降(SGD)

一次迭代過程,僅僅一個樣本參與訓練,且該樣本是隨機挑選的。

小批量梯度下降

BGD與SGD的結合。一次迭代,隨機挑選出K個樣本組成小樣本集合參與訓練,後續訓練過程與BGD相同。小批量實際應用最為廣泛,原因有:

  1. 雖然批量梯度下降演算法計算梯度更精確,但回報是小於線性的。
  2. 小批量適合多核運算。
  3. 小批量有正則化的效果。
    一般來講,僅僅基於梯度的優化演算法可以設定較小的K,但需要計算海塞矩陣的優化演算法需要較大的K,因為矩陣可能是病態的。

牛頓法

牛頓法迭代更新公式如下:xk+1=xkHk1gkx_{k+1}=x_k-H_k^{-1}g_k其中,Hk1H_k^{-1}為海塞矩陣的逆矩陣,gkg_k

為梯度。可以理解為沿Hk1gkH_k^{-1}g_k的方向下降,牛頓法的學習率恆為1,其模長即為步長。
牛頓法本質是使用海塞矩陣調節梯度,使目標函式更快地下降。牛頓法只適用於海塞矩陣是正定的情況,在鞍點時就需要正則化,保證超正確的方向下降。

擬牛頓法

牛頓法雖然收斂速度很快,但海塞矩陣的計算量大。故採用一個正定矩陣GkG_k近似Hk1H_k^{-1}BkB_k近似HkH_k,稱之為擬牛頓演算法。BFGS是應用最為廣泛的擬牛頓演算法,該演算法用BkB_k近似HkH_kBkB_k更新公式如下:Bk+1=Bk+ykykTykTδk

BkδkδkTBkδkTBkδkB_{k+1}=B_k+\frac{y_ky_k^T}{y_k^T\delta_k}-\frac{B_k\delta_k\delta_k^TB_k}{\delta_k^TB_k\delta_k}其中,δk\delta_k為當前自變數增量。
BFGS演算法通常需要一維搜尋合適的步長。

一維搜尋準則

搜尋合適的步長可以有效加快演算法收斂速度。一維搜尋可分為一維精確搜尋和不精確搜尋,精確搜尋就是選取特定步長使目標函式一定能沿著指定方向達到最小。若選取的步長僅使得目標函式下降程度達到使用者要求即可,就是不精確搜尋。實際中很難獲取準確的步長,所以不精確搜尋更為實用。一維搜尋準則通常要保證兩點:1. 目標函式值有足夠下降 2.自變數有足夠變動幅度
有如下幾種一維搜尋步長的準則:

  1. Armijo 準則:就是保證目標函式值有足夠下降。f(Xk+αdk)f(Xk)ραgkTdkα=βγmβ>0,γ(0,1),ρ(0,12),mf(X_k + \alpha d_k) - f(X_k) \leqslant \rho \alpha g_k^Td_k\\\alpha=\beta\gamma^m\\\beta>0, \gamma \in (0,1), \rho\in(0,\frac{1}{2}),m為非負整數
  2. Goldstein準則:通常與Armijo聯合使用稱為Armijo-Goldstein準則。就是在Armijo準則的基礎上,再新增一條準則保證自變數有足夠變動幅度。f(Xk+αdk)f(Xk)(1ρ)αgkTdkρ(0,12)f(X_k + \alpha d_k) - f(X_k) \geqslant (1-\rho) \alpha g_k^T d_k\\\rho\in(0,\frac{1}{2})
  3. Wolfe-Powell準則:與Armijo準則聯用,採用更簡單的式子替換Goldstein準則。gk+1TdkσgkTdkσ(ρ,1)g_{k+1}^Td_k\geqslant \sigma g_k^Td_k\\\sigma \in(\rho, 1)

程式碼

以最常用的平方誤差函式為例,實現各個優化演算法以及一維搜尋準則。

"""
優化演算法的核心兩點:1.尋找下降方向  2.一維搜尋下降的步長
梯度下降演算法以梯度下降的負方向為下降方向,學習率乘以梯度的模為步長
牛頓法以海塞矩陣逆矩陣與梯度乘積為下降方向(此時學習率恆為1)
擬牛頓法同牛頓法,僅僅以B代替海塞矩陣

一維不精確搜尋:Wolfe和Armijo確定搜尋步長(通常應用於擬牛頓法)
Armijo: f(Xk + alpha * Dk) - f(Xk) <= rho * alpha * Grad.T * Dk, alpha=beta*gamma**m(m為非負整數,beta>0)
Goldstein(需要聯合Armijo): f(Xk + alpha * Dk) - f(Xk) >= (1-rho) * alpha * Grad.T * Dk
Wolfe-Powell(需要聯合Armijo):  Grad(k+1).T * Dk >= sigma * Grad(k).T * Dk, rho<sigma<1

以線性迴歸為例:
平方誤差損失函式的最小化的優化問題
J(X)=1/2m(f(X)-y)**2, f(X)=wX,m為樣本總數, 最優化函式J(X)對w的梯度為X(wX-y)
"""

import numpy as np
from numpy.linalg import norm, inv


def BGD(data, epsilon=1e-2, maxstep=1000, alpha=0.1):
    # 批量梯度下降演算法
    i = 0
    X = data[:, :-1]  # n*d
    y = data[:, -1]  # n*1
    w = np.ones(X.shape[1])  # 初始化權值 1*d
    while i < maxstep:
        Grad = (w @ X.T - y.T) @ X / X.shape[0]  # 1*d 計算梯度
        if norm(Grad) < epsilon:  # 如果梯度的第二範數小於閾值,則終止訓練
            break
        w += -alpha * Grad  # 負梯度方向下降,更新自變數,即權值w
        i += 1
    return w


def SGD(data, epsilon=1e-2, maxstep=1000, alpha=0.1):
    # 隨機梯度下降
    w = np.ones(data.shape[1] - 1)  # 初始化權值 1*d
    i = 0
    over = False
    while i < maxstep and not over:
        np.random.shuffle(data)  # 打亂資料集順序
        for sample in data:
            Grad = (w * sample[:-1] - sample[-1]) * sample[-1]
            if norm(Grad) < epsilon:
                over = True
                break
            w += -alpha * Grad
    return w


def MBGD(data, epsilon=1e-2, maxstep=1000, alpha=0.1, bsize=4):
    # 小批量梯度下降
    w = np.ones(data.shape[1] - 1)  # 初始化權值 1*d
    i = 0
    over = False
    while i < maxstep and not over:
        np.random.shuffle(data)  # 打亂資料集順序
        bathes = [data[(i - 1) * bsize:i * bsize, :] for i in range(1, data.shape[0] // bsize)]  # 將原資料集切分成小塊
        for batch in bathes:
            X = batch[:, :-1]
            y = batch[:, -1]
            Grad = (w @ X.T - y.T) @ X / bsize
            if norm(Grad) < epsilon:
                over = True
                break
            w += -alpha * Grad
    return w


def NM(data, epsilon=1e-2, maxstep=1000):
    # 牛頓法
    i = 0
    X = data[:, :-1]  # n*d
    x1 = data[:, 0]  # n*1
    x2 = data[:, 1]  # n*1
    y = data[:, -1]  # n*1
    m = data.shape[0]  # 樣本總數
    w = np.ones(X.shape[1])  # 初始化權值 1*d
    while i < maxstep:
        err = w @ X.T - y.T  # 1*n
        Grad = err @ X / m  # 計算梯度
        if norm(Grad) < epsilon:  # 如果梯度的第二範數小於閾值,則終止訓練
            break
        H12 = 2 * x1.T @ x2
        H = np.array([[2 * err @ x1, H12], [H12, 2 * err @ x2]])  # 計算海塞矩陣
        alpha = inv(H)  # d*d 計算海塞矩陣的逆矩陣,以此作為學習率
        w -= Grad @ alpha  # 負梯度方向下降,更新自變數,即權值w
        i += 1
    return w


def BFGS(data, epsilon=1e-4, maxstep=1000):
    # 擬牛頓演算法
    i = 0
    X = data[:, :-1]  # n*d
    y = data[:, -1]  # n*1
    N = data.shape[0]
    w = np.ones(X.shape[1])  # 初始化權值 1*d
    B = np.eye(2)  # 初始化B
    while i < maxstep:
        err = w @ X.T - y.T
        fx = err @ err.T / 2 / N
        Grad = err @ X / N  # 1*d 計算梯度
        if norm(Grad) < epsilon:  # 如果梯度的第二範數小於閾值,則終止訓練
            break
        Dk = -Grad @ inv(B)  # 1*d, 下降方向
        alpha, w = WPSearch(w, Dk, fx, Grad, X, y, N)  # 下降步長以及更新w, 注意弱用WP規則,還可以返回新的梯度,減少重複計算
        delta = alpha * Dk  # 1*d 自變數w的增量
        yk = B @ delta.T  # d*1, 更新yk
        B = B + yk @ yk.T / (delta @ yk) - B @ delta.T @ (delta @ B) / (delta @ B @ delta.T)  # 更新B
    return w


def WPSearch(w, Dk, fx, Grad, X, y, N, sigma=0.75, gamma
            
           

相關推薦

機器學習優化演算法總結以及Python實現

機器學習演算法最終總是能轉化為最優化問題,習慣上會轉化為最小化問題。 個人總結迭代優化演算法關鍵就兩點: (1) 找到下降方向 (2) 確定下降步長 最速梯度下降演算法 梯度下降演算法是以最優化函式的梯度為下降方向,學習率η\etaη乘以梯度的模即為下降步長。更

機器學習常用演算法總結

參考:http://www.shuju.net/article/MDAwMDAyM4DM0.html 在垃圾郵件分類器專案中,隨機森林被用作最終的分類器模型。面試官可能會就此提出以下問題:為什麼選擇隨機森林而非其他模型,比如樸素貝葉斯或者支援向量機。一般來說,面試者可以從數

機器學習優化演算法學習總結

優化演算法演化歷程 機器學習和深度學習中使用到的優化演算法的演化歷程如下: SGD –> Momentum –> Nesterov –> Adagrad –> Adadelta –> Adam –> Nadam 表1優化

機器學習優化演算法的簡單總結

1 梯度下降 1.1 SGD 演算法介紹 SGD(Stochasitic Gradient Descent)很簡單,就是沿著梯度的反方向更新引數,優化目標函式。優化公式如下: di=g(θi−1)di=g(θi−1) θi=θi

機器學習Logistic損失函式以及神經網路損失函式詳解

機器學習中最重要的三個部分為網路結構、損失函式、優化策略。 而其中以損失函式最難以理解,主要原因是需要較強的數學知識,其中用的最多的就是引數估計。 所謂引數估計就是:對未知引數θ進行估計時,在引數可能的取值範圍內選取,使“樣本獲得此觀測值”的概率最大的引數作為θ的估計,這樣選定的有利於”

機器學習——常用排序演算法總結

我們通常所說的排序演算法往往指的是內部排序演算法,即資料記錄在記憶體中進行排序。排序演算法大體可分為兩種: 一種是比較排序,時間複雜度O(nlogn) ~ O(n^2),主要有:氣泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等。 另一種是非比較排序,時間複雜度可以達到O(

機器學習】Apriori演算法——原理及程式碼實現Python版)

Apriopri演算法 Apriori演算法在資料探勘中應用較為廣泛,常用來挖掘屬性與結果之間的相關程度。對於這種尋找資料內部關聯關係的做法,我們稱之為:關聯分析或者關聯規則學習。而Apriori演算法就是其中非常著名的演算法之一。關聯分析,主要是通過演算法在大規模資料集中尋找頻繁項集和關聯規則。

機器學習實戰-基本演算法總結1

機器學習基本演算法總結 ☞監督學習——分類 程式碼在這,基於python3(原書程式碼是python2) 這裡只是一個總結,原書已經講解很清楚了,不清楚的直接看程式碼,或者李航的統計學習方法也有公式推導。 目錄1 =======

深度學習優化演算法概覽

一、發展背景及基本框架 梯度下降是目前神經網路中使用最為廣泛的優化演算法之一。為了彌補樸素梯度下降的種種缺陷,研究者們發明了一系列變種演算法,從最初的 SGD (隨機梯度下降) 逐步演進到 NAdam。然而,許多學術界最為前沿的文章中,都並沒有一味使用 Adam/NAdam 等公認“

機器學習之基本演算法總結

機器學習方法越來越得到關注與學習,很多人在研讀機器學習相關文章和演算法時,對一些概念不慎明確,容易走進坑裡花費太多的時間才弄明白,有作者將一些並不是很簡單的基礎知識演算法做了一定的總結。本文在原博文的基礎上根據自己的閱讀和理解,做了一些補充,對概念和演算法的總結如下。

深度學習優化方法總結

最近在看Google的Deep Learning一書,看到優化方法那一部分,正巧之前用tensorflow也是對那些優化方法一知半解的,所以看完後就整理了下放上來,主要是一階的梯度法,包括SGD, Momentum, Nesterov Momentum, AdaGrad, RMSProp, Adam。

機器學習-mnist kNN演算法識別(python

方以類聚,物以群分                                               ---《周易·繫辭上》測試環境:python3.6、win7 32bit、x86。在上一篇文章中介紹了mnist資料的格式,以及用python如何讀取mnist資料

機器學習系列--GBDT演算法總結與原始碼分析

最近在看Kaggle2014年的一個比賽–Display Advertising Challenge。三個臺灣人得了比賽的第一名,他們使用的是FFM演算法(這個後面再做總結),在他們比賽的程式碼中,使用了GBDT演算法進行了特徵的處理。他們沒有使用scikit-

機器學習實戰——樸素貝葉斯Python實現記錄

問題:regEx= re.compile('\\W*') 屬於列印錯誤。 正確:     regEx = re.compile('\W*') regEx = re.compile('\W*') 關於'\W' 和'\w'區別,可參考部落格:https://

機器學習】Weighted LSSVM原理與Python實現:LSSVM的稀疏化改進

【機器學習】Weighted LSSVM原理與Python實現:LSSVM的稀疏化改進 一、LSSVM 1、LSSVM用於迴歸 2、LSSVM模型的缺點 二、WLSSVM的數學原理 三、WLSSVM的python實現 參

決策樹(ID3 C4,5 減枝 CART演算法以及Python實現

演算法簡述 在《統計學習方法》中,作者的if-then的描述,簡單一下子讓人理解了決策樹的基本概念。 決策樹,就是一個if-then的過程。 本文主要學習自《統計學習方法》一書,並努力通過書中數學推導來

機器學習--k-近鄰演算法(kNN)實現手寫數字識別

這裡的手寫數字以0,1的形式儲存在文字檔案中,大小是32x32.目錄trainingDigits有1934個樣本。0-9每個數字大約有200個樣本,命名規則如下: 下劃線前的數字代表是樣本0-9的

機器學習:單詞拼寫糾正器python實現

01 樸素貝葉斯分類實戰 前面介紹了貝葉斯的基本理論,樸素貝葉斯分類器,拉普拉斯修正,文章的連結如下: 機器學習:說說貝葉斯分類 樸素貝葉斯分類器:例子解釋 樸素貝葉斯分類:拉普拉斯修正 在這3篇推送中用例子詳細闡述了貝葉斯公式和樸素貝葉斯如何做分類

臺大林軒田《機器學習基石》:作業三python實現

在學習和總結的過程中參考了不少別的博文,且自己的水平有限,如果有錯,希望能指出,共同學習,共同進步 13 給定target function,我們的工作是在X=[-1,1]x[-1,1]上隨機產生1000個點,利用f(x1,x2)計算它的值,然後

(二)k-means演算法原理以及python實現

一、有監督學習和無監督學習 1. 有監督學習 監督學習(supervised learning):通過已有的訓練樣本(即已知資料以及其對應的輸出)來訓練,從而得到一個最優模型,再利用這個模型將所有新的資料樣本對映為相應的輸出結果,對輸出結果進行簡單的判斷從而