回歸問題淺析


由於tensorflow2.0版本的更新,很多以前版本上提到的圖等概念都不再適用。為了跟上時代的步伐,順便扎實一下深度學習的基礎,從今天開始記錄一下學習過程。

要想開始深度學習,首先必不可少的就是數學基礎了,雖然tensorflow提供了一系列不需要太深的數學基礎就可以使用的現成的函數,但是總吃表面的東西確實沒法深入理解,本來是打算開篇做mnist的,為了更深入更全面的了解深度學習,今天就從最簡單的回歸問題開始。

我們知道,機器學習的目標無非就是從大量數據中學到一些深層次的抽象的概念,即給定一個新情況下的輸入x,也能得到一個符合實際情況的輸出y。

我們先從最簡單的Continuous Prediction(連續值預測)開始,Continuous Prediction的主要目標就是,對於輸入數據x,通過給定模型條件 f 和模型參數 θ,能得到相應的fθ(x),我們希望fθ(x)能逼近甚至完全等同於y(其中,y為真實結果,fθ(x)為預測結果)

現在我們假設給定f :f(x)=w*x+b,為了使(w*x+b-Y)2→0,令損失函數 loss=∑i(w*xi+b-yi)2,令minimize loss,即可得到w'*x+b'→y

那么如何minimize loss呢?我們首先從一個最基本的優化方法“梯度下降”開始。由高等數學導數的特點結合函數圖像我們不難得出,導數的方向總是指向函數值變大的方向,我們可以令參數沿着導數相反的方向滑動,從而到達最小loss值。現在假定有這樣一個函數

 

可以看到,要想讓參數向loss最優方向滑動,我們給出下面的梯度下降公式

w'=w-lr * dy/dw (其中lr稱為衰減因子或衰減學習率,用於控制步長不讓它過大,因為滑動步長過大很可能錯過最優解區間)

對於f(x)=w*x+b,我們可以通過w'=w-lr * ∂loss/∂w,b'=b-lr * ∂loss/∂b 來調整w和b參數的變化,從而使w'*x+b'→y

下面我們通過使用numpy庫來看看線性回歸問題的處理效果

首先我們給定100組如下數據,存入Excel,其對應的散點結構如下

    

 

我們通過代碼讀入數據,梯度下降調整w和b的值,主要代碼如下:

# 求損失loss
def compute_error_for_line_given_points(w,b,points):
    totalError=0
    for i in range(len(points)):
        x=points[i,0]
        y=points[i,1]
        totalError+=(w*x+b-y)**2
    return totalError/float(len(points))


# 求下降梯度並更新參數
def step_gradient(w_current,b_current,points,learningRate):
    w_gradient=0
    b_gradient=0
    N=float(len(points))
    for i in range(len(points)):
        x=points[i,0]
        y=points[i,1]
        w_gradient+=(2/N)*((w_current*x+b_current)-y)*x
        b_gradient+=(2/N)*((w_current*x+b_current)-y)

    w_new=w_current-learningRate*w_gradient
    b_new=b_current-learningRate*b_gradient
    return [w_new,b_new]


# 迭代iteration輪后的參數
def gradient_descent_runner(points,starting_w,starting_b,learning_rate,iteration):
    w=starting_w
    b=starting_b
    for i in range(iteration):
        w,b=step_gradient(w,b,np.array(points),learning_rate)
    return [w,b]

經過1000輪迭代后,參數結果如下:

 

 可以看到,error 從5565下降到112,大概降到初始的1/50,繪制函數圖像,和散點大致符合

雖然線性模型在線性回歸問題上具有不錯的表現,但是它也只能比較好的解決線性可分問題。我們都知道在一定條件下,多層網絡模型是由於少層的,但是對於線性模型,多個線性的計算過程完全可以用一個線性計算來表示,比如

對於兩層模型輸出 y=(xw(1)+b(1))w(2)+b(2) ,根據矩陣乘法的結合性,這個公式可以變換如下:y=xw(1)w(2)+b(1)w(2)+b(2) ,而w(1)w(2)其實可以被表示為新的參數w',這樣的話,輸出關系就可以表示為y=xw'+ b(1))w(2)+b(2),也完全符合線性模型的輸入輸出線性的相關定義

由此可見,只通過線性變換,任意多層的全連神經網絡模型和單層全連神經網絡模型的表達能力沒有任何區別。但是應用於解決實際問題的模型需要對更復雜的問題具有解決的能力,比如線性不可分或者更高維空間中的分布情況。

下一篇將使用激活函數使模型去線性化,使其不再僅僅是用於解決線性回歸問題,並保留線性模型中的參數調整方式,對深度學習中helloworld級別的mnist數據集進行分類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM