線性回歸方程推導


https://blog.csdn.net/joob000/article/details/81295144

理論推導

  機器學習所針對的問題有兩種:一種是回歸,一種是分類。回歸是解決連續數據的預測問題,而分類是解決離散數據的預測問題。線性回歸是一個典型的回歸問題。其實我們在中學時期就接觸過,叫最小二乘法。

  線性回歸試圖學得一個線性模型以盡可能准確地預測輸出結果。 
  先從簡單的模型看起: 
  首先,我們只考慮單組變量的情況,有: 
這里寫圖片描述 使得 這里寫圖片描述 
  假設有m個數據,我們希望通過x預測的結果f(x)來估計y。其中w和b都是線性回歸模型的參數。 
  為了能更好地預測出結果,我們希望自己預測的結果f(x)與y的差值盡可能地小,所以我們可以寫出代價函數(cost function)如下: 
這里寫圖片描述 
  接着代入f(x)的公式可以得到: 
這里寫圖片描述 
  不難看出,這里的代價函數表示的是預測值f(x)與實際值y之間的誤差的平方。它對應了常用的歐幾里得距離簡稱“歐氏距離”。基於均方誤差最小化來求解模型的方法我們叫做“最小二乘法”。在線性回歸中,最小二乘法實質上就是找到一條直線,使所有樣本數據到該直線的歐式距離之和最小,即誤差最小。 
  我們希望這個代價函數能有最小值,那么就分別對其求w和b的偏導,使其等於0,求解方程。 
  先求偏導,得到下面兩個式子: 
這里寫圖片描述

這里寫圖片描述 
  很明顯,公式中的參數m,b,w都與i無關,簡化時可以直接提出來。 
  另這兩個偏導等於0: 
  求解方程組,解得: 
這里寫圖片描述

這里寫圖片描述 
  這樣根據數據集中給出的x和y,我們可以求出w和b來構建簡單的線性模型來預測結果。

  接下來,推廣到更一般的情況: 
  我們假設數據集中共有m個樣本,每個樣本有n個特征,用X矩陣表示樣本和特征,是一個m×n的矩陣: 
這里寫圖片描述

  用Y矩陣表示標簽,是一個m×1的矩陣: 
這里寫圖片描述

  為了構建線性模型,我們還需要假設一些參數: 
這里寫圖片描述 
(有時還要加一個偏差(bias)也就是這里寫圖片描述, 為了推導方便沒加,實際上結果是一樣的)

  好了,我們可以表示出線性模型了: 
這里寫圖片描述 
  h(x)表示假設,即hypothesis。通過矩陣乘法,我們知道結果是一個n×1的矩陣。 
  跟前面推導單變量的線性回歸模型時一樣,列出代價函數: 
這里寫圖片描述 
  這里的1/2並無太大意義,只是為了求導時能將參數正好消掉而加上。 
  代價函數代表了誤差,我們希望它盡可能地小,所以要對它求偏導並令偏導數為0,求解方程。 
  在求偏導之前先展開一下: 
這里寫圖片描述 
這里寫圖片描述

  接下來對這里寫圖片描述 求導,先給出幾個矩陣求導的公式: 
這里寫圖片描述

這里寫圖片描述

這里寫圖片描述

  對代價函數這里寫圖片描述 求關於這里寫圖片描述 的偏導,並令其等於0。

  求偏導。 
這里寫圖片描述

  套用前面給出的矩陣求導公式。 
這里寫圖片描述

  最后化簡得到: 
這里寫圖片描述

  好了,另這個偏導數等於0: 
這里寫圖片描述

  解得: 
這里寫圖片描述

這是在可逆的前提下得到的,事實上存在不可逆的情況,我們在之后的ridge和lasso回歸會針對這樣的情況進行討論,在此我們默認其是可逆的。

可以根據公式直接求得的值,但是當X維度很高時矩陣求逆計算量非常大,所以我們在實際應用中往往采用梯度下降的算法更新,方法如下

 

概述           梯度下降算法(Gradient Descent Optimization)

 

梯度下降算法(Gradient Descent Optimization)是神經網絡模型訓練最常用的優化算法。對於深度學習模型,基本都是采用梯度下降算法來進行優化訓練的。梯度下降算法背后的原理:目標函數640?wx_fmt=png&wxfrom=5&wx_lazy=1關於參數640?wx_fmt=png&wxfrom=5&wx_lazy=1的梯度將是目標函數上升最快的方向。對於最小化優化問題,只需要將參數沿着梯度相反的方向前進一個步長,就可以實現目標函數的下降。這個步長又稱為學習速率640?wx_fmt=png&wxfrom=5&wx_lazy=1。參數更新公式如下:

 

640?wx_fmt=png&wxfrom=5&wx_lazy=1

其中640?wx_fmt=png&wxfrom=5&wx_lazy=1是參數的梯度,根據計算目標函數640?wx_fmt=png&wxfrom=5&wx_lazy=1采用數據量的不同,梯度下降算法又可以分為批量梯度下降算法(Batch Gradient Descent),隨機梯度下降算法(Stochastic GradientDescent)和小批量梯度下降算法(Mini-batch Gradient Descent)。對於批量梯度下降算法,其640?wx_fmt=png&wxfrom=5&wx_lazy=1是在整個訓練集上計算的,如果數據集比較大,可能會面臨內存不足問題,而且其收斂速度一般比較慢。隨機梯度下降算法是另外一個極端,640?wx_fmt=png&wxfrom=5&wx_lazy=1是針對訓練集中的一個訓練樣本計算的,又稱為在線學習,即得到了一個樣本,就可以執行一次參數更新。所以其收斂速度會快一些,但是有可能出現目標函數值震盪現象,因為高頻率的參數更新導致了高方差。小批量梯度下降算法是折中方案,選取訓練集中一個小批量樣本計算640?wx_fmt=png&wxfrom=5&wx_lazy=1,這樣可以保證訓練過程更穩定,而且采用批量訓練方法也可以利用矩陣計算的優勢。這是目前最常用的梯度下降算法。

 

對於神經網絡模型,借助於BP算法可以高效地計算梯度,從而實施梯度下降算法。但梯度下降算法一個老大難的問題是:不能保證全局收斂。如果這個問題解決了,深度學習的世界會和諧很多。梯度下降算法針對凸優化問題原則上是可以收斂到全局最優的,因為此時只有唯一的局部最優點。而實際上深度學習模型是一個復雜的非線性結構,一般屬於非凸問題,這意味着存在很多局部最優點(鞍點),采用梯度下降算法可能會陷入局部最優,這應該是最頭疼的問題。這點和進化算法如遺傳算法很類似,都無法保證收斂到全局最優。因此,我們注定在這個問題上成為“高級調參師”。可以看到,梯度下降算法中一個重要的參數是學習速率,適當的學習速率很重要:學習速率過小時收斂速度慢,而過大時導致訓練震盪,而且可能會發散。理想的梯度下降算法要滿足兩點:收斂速度要快;能全局收斂。為了這個理想,出現了很多經典梯度下降算法的變種,下面將分別介紹它們。

 

01

Momentum optimization

沖量梯度下降算法是BorisPolyak在1964年提出的,其基於這樣一個物理事實:將一個小球從山頂滾下,其初始速率很慢,但在加速度作用下速率很快增加,並最終由於阻力的存在達到一個穩定速率。對於沖量梯度下降算法,其更新方程如下:

0?wx_fmt=png

可以看到,參數更新時不僅考慮當前梯度值,而且加上了一個積累項(沖量),但多了一個超參0?wx_fmt=png,一般取接近1的值如0.9。相比原始梯度下降算法,沖量梯度下降算法有助於加速收斂。當梯度與沖量方向一致時,沖量項會增加,而相反時,沖量項減少,因此沖量梯度下降算法可以減少訓練的震盪過程。TensorFlow中提供了這一優化器:tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9)。

 

02 

NAG

NAG算法全稱Nesterov Accelerated Gradient,是YuriiNesterov在1983年提出的對沖量梯度下降算法的改進版本,其速度更快。其變化之處在於計算“超前梯度”更新沖量項,具體公式如下:

0?wx_fmt=png

既然參數要沿着0?wx_fmt=png更新,不妨計算未來位置0?wx_fmt=png的梯度,然后合並兩項作為最終的更新項,其具體效果如圖1所示,可以看到一定的加速效果。在TensorFlow中,NAG優化器為:tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9, use_nesterov=True)

 

0?wx_fmt=png

圖1 NAG效果圖

 

03

AdaGrad

AdaGrad是Duchi在2011年提出的一種學習速率自適應的梯度下降算法。在訓練迭代過程,其學習速率是逐漸衰減的,經常更新的參數其學習速率衰減更快,這是一種自適應算法。其更新過程如下:

 

0?wx_fmt=png

其中是梯度平方的積累量,在進行參數更新時,學習速率要除以這個積累量的平方根,其中加上一個很小值是為了防止除0的出現。由於是該項逐漸增加的,那么學習速率是衰減的。考慮如圖2所示的情況,目標函數在兩個方向的坡度不一樣,如果是原始的梯度下降算法,在接近坡底時收斂速度比較慢。而當采用AdaGrad,這種情況可以被改觀。由於比較陡的方向梯度比較大,其學習速率將衰減得更快,這有利於參數沿着更接近坡底的方向移動,從而加速收斂。

 

 

0?wx_fmt=png

圖2 AdaGrad效果圖

 

前面說到AdaGrad其學習速率實際上是不斷衰減的,這會導致一個很大的問題,就是訓練后期學習速率很小,導致訓練過早停止,因此在實際中AdaGrad一般不會被采用,下面的算法將改進這一致命缺陷。不過TensorFlow也提供了這一優化器:tf.train.AdagradOptimizer。

 

 

04

RMSprop

RMSprop是Hinton在他的課程上講到的,其算是對Adagrad算法的改進,主要是解決學習速率過快衰減的問題。其實思路很簡單,類似Momentum思想,引入一個超參數,在積累梯度平方項進行衰減:

 

0?wx_fmt=png

可以認為僅僅對距離時間較近的梯度進行積累,其中一般取值0.9,其實這樣就是一個指數衰減的均值項,減少了出現的爆炸情況,因此有助於避免學習速率很快下降的問題。同時Hinton也建議學習速率設置為0.001。RMSprop是屬於一種比較好的優化算法了,在TensorFlow中當然有其身影:tf.train.RMSPropOptimizer(learning_rate=learning_rate,momentum=0.9, decay=0.9, epsilon=1e-10)。

不得不說點題外話,同時期還有一個Adadelta算法,其也是Adagrad算法的改進,而且改進思路和RMSprop很像,但是其背后是基於一次梯度近似代替二次梯度的思想,感興趣的可以看看相應的論文,這里不再贅述。

 

05

Adam

Adam全稱Adaptive moment estimation,是Kingma等在2015年提出的一種新的優化算法,其結合了Momentum和RMSprop算法的思想。相比Momentum算法,其學習速率是自適應的,而相比RMSprop,其增加了沖量項。所以,Adam是兩者的結合體:

 

0?wx_fmt=png

可以看到前兩項和Momentum和RMSprop是非常一致的,由於和的初始值一般設置為0,在訓練初期其可能較小,第三和第四項主要是為了放大它們。最后一項是參數更新。其中超參數的建議值是0?wx_fmt=png。Adm是性能非常好的算法,在TensorFlow其實現如下: tf.train.AdamOptimizer(learning_rate=0.001,beta1=0.9, beta2=0.999, epsilon=1e-08)。

 

 


 

學習速率

 

前面也說過學習速率的問題,對於梯度下降算法,這應該是一個最重要的超參數。如果學習速率設置得非常大,那么訓練可能不會收斂,就直接發散了;如果設置的比較小,雖然可以收斂,但是訓練時間可能無法接受;如果設置的稍微高一些,訓練速度會很快,但是當接近最優點會發生震盪,甚至無法穩定。不同學習速率的選擇影響可能非常大,如圖3所示。

0?wx_fmt=png

圖3 不同學習速率的訓練效果

 

 

 

 

理想的學習速率是:剛開始設置較大,有很快的收斂速度,然后慢慢衰減,保證穩定到達最優點。所以,前面的很多算法都是學習速率自適應的。除此之外,還可以手動實現這樣一個自適應過程,如實現學習速率指數式衰減:

0?wx_fmt=png

 

 

 在TensorFlow中,你可以這樣實現:

initial_learning_rate = 0.1
decay_steps = 10000
decay_rate = 1/10
global_step = tf.Variable(0, trainable=False)
learning_rate = tf.train.exponential_decay(initial_learning_rate,                           
                            global_step, decay_steps, decay_rate)
# decayed_learning_rate = learning_rate *
#                decay_rate ^ (global_step / decay_steps)
optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=0.9)
training_op = optimizer.minimize(loss, global_step=global_step)

 

三、總結:

  本文簡單介紹了梯度下降算法的分類以及常用的改進算法,總結來看,優先選擇學習速率自適應的算法如RMSprop和Adam算法,大部分情況下其效果是較好的。還有一定要特別注意學習速率的問題。其實還有很多方面會影響梯度下降算法,如梯度的消失與爆炸,這也是要額外注意的。最后不得不說,梯度下降算法目前無法保證全局收斂還將是一個持續性的數學難題。

 

 

 

四 、參考文獻:

  1. Anoverview of gradient descent optimization algorithms: http://sebastianruder.com/optimizing-gradient-descent/.

  2. Hands-OnMachine Learning with Scikit-Learn and TensorFlow, Aurélien Géron, 2017.

  3. NAG:http://proceedings.mlr.press/v28/sutskever13.pdf.

  4. Adagrad:http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf.

  5. RMSprop:http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf.

  6. Adadelta:https://arxiv.org/pdf/1212.5701v1.pdf.

  7. Adam:https://arxiv.org/pdf/1412.6980.pdf.

  8. 不同的算法的效果可視化:https://imgur.com/a/Hqolp.

其中為學習率。算法部分主要着重公式推導,梯度下降算法在對應的機器學習項目實踐中會詳細介紹。


免責聲明!

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



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