用Numpy搭建神經網絡第二期:梯度下降法的實現

人工智能 算法 大數據 機器學習 大數據文摘 2019-06-05


用Numpy搭建神經網絡第二期:梯度下降法的實現


大數據文摘出品

作者:蔣寶尚

小夥伴們大家好呀~~用Numpy搭建神經網絡,我們已經來到第二期了。第一期文摘菌教大家如何用Numpy搭建一個簡單的神經網絡,完成了前饋部分。

這一期,為大家帶來梯度下降相關的知識點,和上一期一樣,依然用Numpy實現梯度下降。在代碼開始之前,先來普及一下梯度下降的知識點吧。

梯度下降:迭代求解模型參數值

第一期文章中提到過,最簡單的神經網絡包含三個要素,輸入層,隱藏層以及輸出層。關於其工作機理其完全可以類比成一個元函數:Y=W*X+b。即輸入數據X,得到輸出Y。

如何評估一個函數的好壞,專業一點就是擬合度怎麼樣?最簡單的方法是衡量真實值和輸出值之間的差距,兩者的差距約小代表函數的表達能力越強。

這個差距的衡量也叫損失函數。顯然,損失函數取值越小,原函數表達能力越強。

那麼參數取何值時函數有最小值?一般求導能夠得到局部最小值(在極值點處取)。而梯度下降就是求函數有最小值的參數的一種方法。

梯度下降數學表達式

比如對於線性迴歸,假設函數表示為hθ(x1,x2…xn)=θ01x1+..+θnxn,其中wi(i=0,1,2...n)為模型參數,xi(i=0,1,2...n)為每個樣本的n個特徵值。這個表示可以簡化,我們增加一個特徵x0=1,這樣h(xo,x1,.…xn)=θ0x01x1+..+θnxn。同樣是線性迴歸,對應於上面的假設函數,損失函數為(此處在損失函數之前加上1/2m,主要是為了修正SSE讓計算公式結果更加美觀,實際上損失函數取MSE或SSE均可,二者對於一個給定樣本而言只相差一個固定數值):


用Numpy搭建神經網絡第二期:梯度下降法的實現


算法相關參數初始化:主要是初始化θ0,θ1..,θn,我們比較傾向於將所有的初始化為0,將步長初始化為1。在調優的時候再進行優化。

對θi的梯度表達公式如下:


用Numpy搭建神經網絡第二期:梯度下降法的實現

用步長(學習率)乘以損失函數的梯度,得到當前位置下降的距離,即:


用Numpy搭建神經網絡第二期:梯度下降法的實現


梯度下降法的矩陣方式描述

對應上面的線性函數,其矩陣表達式為:


用Numpy搭建神經網絡第二期:梯度下降法的實現


損失函數表達式為:


用Numpy搭建神經網絡第二期:梯度下降法的實現

其中Y為樣本的輸出向量。

梯度表達公式為:


用Numpy搭建神經網絡第二期:梯度下降法的實現


還是用線性迴歸的例子來描述具體的算法過程。損失函數對於向量的偏導數計算如下:


用Numpy搭建神經網絡第二期:梯度下降法的實現


迭代:


用Numpy搭建神經網絡第二期:梯度下降法的實現


兩個矩陣求導公式為:


用Numpy搭建神經網絡第二期:梯度下降法的實現


用Python實現梯度下降

import pandas as pdimport numpy as np

導入兩個必要的包。

def regularize(xMat): inMat=xMat. copy() inMeans=np. mean(inMat, axis=0) invar=np. std(inMat, axis=0) inMat=(inMat-inMeans)/invar return inMat

定義標準化函數,不讓過大或者過小的數值影響求解。

定義梯度下降函數:

def BGD_LR(data alpha=0.001, maxcycles=500): xMat=np. mat(dataset) yMat=np. mat(dataset).T xMat=regularize(xMat) m,n=xMat.shape weights=np. zeros((n,1)) for i in range(maxcycles): grad=xMat.T*(xMat * weights-yMat)/m weights=weights -alpha* grad return weights

其中,dataset代表輸入的數據,alpha是學習率,maxcycles是最大的迭代次數。

即返回的權重就是說求值。np.zeros 是初始化函數。grad的求取是根據梯度下降的矩陣求解公式。

本文參考B站博主菊安醬的機器學習。感興趣的同學可以打開鏈接觀看視頻喲~

https://www.bilibili.com/video/av35390140

好了,梯度下降這個小知識點就講解完了,下一期,我們將第一期與第二期的知識點結合,用手寫數字的數據完成一次神經網絡的訓練。

相關推薦

推薦中...