機器學習:隨機梯度降低法

1.梯度降低html

   1)什麼是梯度降低?算法

         由於梯度降低是一種思想,沒有嚴格的定義,因此用一個比喻來解釋什麼是梯度降低。dom

        

        簡單來講,梯度降低就是從山頂找一條最短的路走到山腳最低的地方。可是由於選擇方向的緣由,咱們找到的的最低點可能不是真正的最低點。如圖所示,黑線標註的路線所指的方向並非真正的地方。機器學習

        既然是選擇一個方向下山,那麼這個方向怎麼選?每次該怎麼走?ide

       先說選方向,在算法中是以隨機方式給出的,這也是形成有時候走不到真正最低點的緣由。函數

       若是選定了方向,之後每走一步,都是選擇最陡的方向,直到最低點。性能

       總結起來就一句話:隨機選擇一個方向,而後每次邁步都選擇最陡的方向,直到這個方向上能達到的最低點。學習

      2)梯度降低是用來作什麼的?優化

       在機器學習算法中,有時候須要對原始的模型構建損失函數,而後經過優化算法對損失函數進行優化,以便尋找到最優的參數,使得損失函數的值最小。而在求解機器學習參數的優化算法中,使用較多的就是基於梯度降低的優化算法(Gradient Descent, GD)。spa

     3)優缺點

          優勢:效率。在梯度降低法的求解過程當中,只需求解損失函數的一階導數,計算的代價比較小,能夠在不少大規模數據集上應用

          缺點:求解的是局部最優值,即因爲方向選擇的問題,獲得的結果不必定是全局最優

                     步長選擇,太小使得函數收斂速度慢,過大又容易找不到最優解。

 

2.梯度降低的變形形式

         根據處理的訓練數據的不一樣,主要有如下三種形式:

       1)批量梯度降低法BGD(Batch Gradient Descent):

             針對的是整個數據集,經過對全部的樣本的計算來求解梯度的方向。

             優勢:全局最優解;易於並行實現;

             缺點:當樣本數據不少時,計算量開銷大,計算速度慢

        2)小批量梯度降低法MBGD(mini-batch Gradient Descent)

            把數據分爲若干個批,按批來更新參數,這樣,一個批中的一組數據共同決定了本次梯度的方向,降低起來就不容易跑偏,減小了隨機性

            優勢:減小了計算的開銷量,下降了隨機性

         3)隨機梯度降低法SGD(stochastic gradient descent)

            每一個數據都計算算一下損失函數,而後求梯度更新參數。

            優勢:計算速度快

            缺點:收斂性能很差

        總結:SGD能夠看做是MBGD的一個特例,及batch_size=1的狀況。在深度學習及機器學習中,基本上都是使用的MBGD算法。

 

3.隨機梯度降低

       隨機梯度降低(SGD)是一種簡單但很是有效的方法,多用用於支持向量機、邏輯迴歸等凸損失函數下的線性分類器的學習。而且SGD已成功應用於文本分類和天然語言處理中常常遇到的大規模和稀疏機器學習問題。

       SGD既能夠用於分類計算,也能夠用於迴歸計算。

    1)分類

        a)核心函數

            sklearn.linear_model.SGDClassifier

       b)主要參數(詳細參數

            loss :指定損失函數。可選值:‘hinge’(默認), ‘log’, ‘modified_huber’, ‘squared_hinge’, ‘perceptron’,

                       "hinge":線性SVM
                       "log":邏輯迴歸
                       "modified_huber":平滑損失,基於異常值容忍和機率估計
                       "squared_hinge": 帶有二次懲罰的線性SVM
                       "perceptron":帶有線性損失的感知器

             alpha:懲罰係數

        c)示例代碼及詳細解釋

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDClassifier
from sklearn.datasets.samples_generator import make_blobs

##生產數據
X, Y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.60)

##訓練數據
clf = SGDClassifier(loss="hinge", alpha=0.01)
clf.fit(X, Y)

## 繪圖
xx = np.linspace(-1, 5, 10)
yy = np.linspace(-1, 5, 10)

##生成二維矩陣
X1, X2 = np.meshgrid(xx, yy)
##生產一個與X1相同形狀的矩陣
Z = np.empty(X1.shape)
##np.ndenumerate 返回矩陣中每一個數的值及其索引
for (i, j), val in np.ndenumerate(X1):
    x1 = val
    x2 = X2[i, j]
    p = clf.decision_function([[x1, x2]]) ##樣本到超平面的距離
    Z[i, j] = p[0]
levels = [-1.0, 0.0, 1.0]
linestyles = ['dashed', 'solid', 'dashed']
colors = 'k'
##繪製等高線:Z分別等於levels
plt.contour(X1, X2, Z, levels, colors=colors, linestyles=linestyles)
##畫數據點
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired,
            edgecolor='black', s=20)
plt.axis('tight')
plt.show()
View Code

         d)結果圖

        

 

   2)迴歸

         SGDRegressor很是適合迴歸問題具備大量訓練樣本(> 10000),對於其餘的問題,建議使用的Ridge, Lasso或ElasticNet。

        a)核心函數

             sklearn.linear_model.SGDRegressor

        b)主要參數(詳細參數

             loss:指定損失函數。可選值‘squared_loss’(默認), ‘huber’, ‘epsilon_insensitive’,  ‘squared_epsilon_insensitive’

                     說明:此參數的翻譯不是特別準確,請參考官方文檔。

                    "squared_loss":採用普通最小二乘法
                    "huber": 使用改進的普通最小二乘法,修正異常值
                    "epsilon_insensitive": 忽略小於epsilon的錯誤
                    "squared_epsilon_insensitive":

             alpha:懲罰係數

         c)示例代碼

              由於使用方式與其餘線性迴歸方式相似,因此這裏只舉個簡單的例子:              

import numpy as np
from sklearn import linear_model
n_samples, n_features = 10, 5
np.random.seed(0)
y = np.random.randn(n_samples)
X = np.random.randn(n_samples, n_features)
clf = linear_model.SGDRegressor()
clf.fit(X, y)
View Code
相關文章
相關標籤/搜索