實現梯度下降
現在我們知道了如何更新我們的權重:
Δwij=ηδjxi,
你看到的是如何實現一次更新,那我們如何把程式碼轉化為能夠計算多次權重更新,使得我們的網路能夠真正學習呢?
作為示例,我們拿一個研究生學院錄取資料,用梯度下降訓練一個網路。資料可以在這裡找到。資料有三個輸入特徵:GRE 分數、GPA 分數和本科院校排名(從 1 到 4)。排名 1 代表最好,排名 4 代表最差。
我們的目標是基於這些特徵來預測一個學生能否被研究生院錄取。這裡,我們將使用有一個輸出層的網路。用 sigmoid 做為啟用函式。
資料清理
你也許認為有三個輸入單元,但實際上我們要先做資料轉換。rank是類別特徵,其中的數字並不表示任何相對的值。排名第 2 並不是排名第 1 的兩倍;排名第 3 也不是排名第 2 的 1.5 倍。因此,我們需要用 dummy variables 來對 rank 進行編碼。把資料分成 4 個新列,用 0 或 1 表示。排名為 1 的行對應 rank_1 列的值為 1 ,其餘三列的值為 0;排名為 2 的行對應 rank_2 列的值為 1 ,其餘三列的值為 0,以此類推。
我們還需要把 GRE 和 GPA 資料標準化,也就是說使得它們的均值為 0,標準偏差為 1。因為 sigmoid 函式會擠壓很大或者很小的輸入,所以這一步是必要的。很大或者很小輸入的梯度為 0,這意味著梯度下降的步長也會是 0。由於 GRE 和 GPA 的值都相當大,我們在初始化權重的時候需要非常小心,否則梯度下降步長將會消失,網路也沒法訓練了。相對地,如果我們對資料做了標準化處理,就能更容易地對權重進行初始化。
這只是一個簡單介紹,你之後還會學到如何預處理資料,如果你想了解我是怎麼做的,可以檢視下面程式設計練習中的 data_prep.py檔案。
經過轉換後的 10 行資料
現在資料已經準備好了,我們看到有六個輸入特徵:gre、gpa,以及四個 rank的虛擬變數 (dummy variables)。
均方差
這裡我們要對如何計算誤差做一點小改變。我們不計算 SSE,而是用誤差平方的均值(mean of the square errors,MSE)。現在我們要處理很多資料,把所有權重更新加起來會導致很大的更新,使得梯度下降無法收斂。為了避免這種情況,你需要一個很小的學習率。這裡我們還可以除以資料點的數量 m 來取平均。這樣,無論我們有多少資料,我們的學習率通常會在 0.01 to 0.001 之間。我們用 MSE(下圖)來計算梯度,結果跟之前一樣,只是取了平均而不是取和。
- 這是用梯度下降來更新權重的演算法概述:
權重步長設定為 0: Δwi=0
對訓練資料中的每一條記錄:通過網路做正向傳播,計算輸出 y^=f(∑iwixi)
計算輸出單元的誤差項(error term) δ=(y−y^)∗f′(∑iwixi)
更新權重步長 Δwi=Δwi+δxi
更新權重 wi=wi+ηΔwi/m。其中 η 是學習率, m 是資料點個數。這裡我們對權重步長做了平均,為的是降低訓練資料中大的變化。
重複 e 代(epoch)。你也可以對每條記錄更新權重,而不是把所有記錄都訓練過之後再取平均。
這裡我們還是使用 sigmoid 作為啟用函式
f(h)=1/(1+e−h)
sigmoid 的梯度是: f′(h)=f(h)(1−f(h))
其中 h 是輸出單元的輸入
h=∑iwixi
用 NumPy 來實現
這裡大部分都可以用 NumPy 很方便的實現。
首先你需要初始化權重。我們希望它們比較小,這樣輸入在 sigmoid 函式那裡可以在接近 0 的位置,而不是最高或者最低處。很重要的一點是要隨機地初始化它們,這樣它們有不同的初始值,是發散且不對稱的。所以我們用一箇中心為 0 的正態分佈來初始化權重,此正態分佈的標準差(scale 引數)最好使用 1/√n,其中 n 是輸入單元的個數。這樣就算是輸入單元的數量變多,sigmoid 的輸入還能保持比較小。
weights = np.random.normal(scale=1/n_features**.5, size=n_features)
NumPy 提供了一個可以讓兩個陣列做點乘的函式,它可以讓我們方便地計算 h。點乘就是把兩個陣列的元素對應位置相乘之後再相加。
# input to the output layer
# 輸出層的輸入output_in = np.dot(weights, inputs)
最後我們可以用 weights += ...更新 Δwi 和 wi,weights += ...是 weights = weights + ...的簡寫。
效率提示
因為這裡我們用的是 sigmoid 函式,你可以節省一些計算。對於 sigmoid 函式來說,f′(h)=f(h)(1−f(h))。也就是說一旦你有了 f(h),你就可以直接用它的值來計算誤差的梯度了。
程式設計練習
接下來,你要實現一個梯度下降,用錄取資料來訓練它。你的目標是訓練一個網路直到你達到訓練資料的最小的均方差 mean square error (MSE)。你需要實現:
網路的輸出: output
輸出誤差: error
誤差項: error_term
權重步長更新: del_w +=
權重更新: weights +=
在你寫完這幾部分之後,點選“測試答案”按鈕來進行訓練,均方差會被列印出來,同時也會列印出測試集的準確率,即錄取情況的正確預測比率。
你可以任意調節超引數 hyperparameters 來看下它對均方差 MSE 有什麼影響。
import numpy as np
from data_prep import features, targets, features_test, targets_test
def sigmoid(x):
"""
Calculate sigmoid
"""
return 1 / (1 + np.exp(-x))
# TODO: We haven't provided the sigmoid_prime function like we did in
# the previous lesson to encourage you to come up with a more
# efficient solution. If you need a hint, check out the comments
# in solution.py from the previous lecture.
# Use to same seed to make debugging easier
np.random.seed(42)
n_records, n_features = features.shape
last_loss = None
# Initialize weights
weights = np.random.normal(scale=1 / n_features**.5, size=n_features)
# Neural Network hyperparameters
epochs = 1000
learnrate = 0.5
for e in range(epochs):
del_w = np.zeros(weights.shape)
for x, y in zip(features.values, targets):
# Loop through all records, x is the input, y is the target
相關文章
- 深入淺出--梯度下降法及其實現梯度
- 從零實現DNN 探究梯度下降的原理DNN梯度
- 梯度下降梯度
- 對梯度下降演算法的理解和實現梯度演算法
- 使用梯度下降法實現多項式迴歸梯度
- 003.01 梯度下降梯度
- 大白話5分鐘帶你走進人工智慧-第十一節梯度下降之手動實現梯度下降和隨機梯度下降的程式碼(6)人工智慧梯度隨機
- 機器學習--線性迴歸--梯度下降的實現機器學習梯度
- 梯度下降法實現最簡單線性迴歸問題python實現梯度Python
- 梯度下降與excel梯度Excel
- 梯度下降演算法梯度演算法
- 1. 梯度下降法梯度
- 什麼是梯度下降法?梯度
- 【機器學習】梯度下降機器學習梯度
- 梯度下降求解最小二乘梯度
- 機器學習之梯度下降機器學習梯度
- 【機器學習】梯度下降 II機器學習梯度
- 有監督學習——梯度下降梯度
- 梯度下降演算法 Gradient Descent梯度演算法
- 梯度下降法原理及小結梯度
- 梯度下降優化演算法概述梯度優化演算法
- 機器學習之梯度下降法機器學習梯度
- 【機器學習基礎】——梯度下降機器學習梯度
- 梯度下降法中導數的求解梯度
- 機器學習方法(一)——梯度下降法機器學習梯度
- 梯度下降、過擬合和歸一化梯度
- 機器學習——梯度下降演算法機器學習梯度演算法
- Qt加Opencv實現 梯度矯正 功能QTOpenCV梯度
- 梯度下降背後的數學原理幾何?梯度
- 機器學習之隨機梯度下降法機器學習隨機梯度
- 隨機梯度下降法的數學基礎隨機梯度
- 梯度下降法原理與模擬分析||系列(1)梯度
- 11迴歸演算法-BGD、SGD、MBGD梯度下降演算法梯度
- 邏輯迴歸:損失函式與梯度下降邏輯迴歸函式梯度
- 解鎖機器學習-梯度下降:從技術到實戰的全面指南機器學習梯度
- 機器學習中梯度下降演算法的實際應用和技巧機器學習梯度演算法
- 機器學習入門筆記——如何理解梯度下降機器學習筆記梯度
- 李沐:用隨機梯度下降來最佳化人生!隨機梯度