特徵縮放(Feature Scaling)
假設現在有一個特徵為房屋大小,其值範圍在0~2000平方英尺,另一個特徵為房間數量,其值範圍為1~5間。假設不考慮${ \theta }_{ 0 }$,只有${ \theta }_{ 1 }$與${ \theta }_{ 2 }$,由於這兩個特徵的值範圍差太多,最後成本函數$J(\theta )$畫出來的的輪廓圖會像一個非常瘦長的橢圓,則執行梯度下降時可能會非常緩慢並反覆來回震盪,最終才找到一條通往全局最小值的路徑。
此時一種有效的方法就是進行「特徵縮放」,也就是將特徵值除以值的範圍,值的範圍意思是「最大值減最小值」,透過消耗掉這些值的範圍,儘量讓不同的特徵其值的範圍能夠相近一點,最終我們得到的${ x }_{ 1 }$與${ x }_{ 2 }$都會介在0~1之間,這樣梯度下降可以收斂較快。
因此特徵縮放就是讓特徵值儘量壓縮在$-1\le x\le 1$,當然${ x }_{ 0 }$一開始就假設為1已經在此區間。其中,上式範圍的-1和1不是那麼重要,你取不同值也可以,只要取的值不要太大或太小,或是前後不要差太多或差太少即可。
除了特徵縮放外,我們也可以進行另一種叫做「平均正規化(mean normalization)」的方法。
以下圖為例,如果房子面積平均為1000平方英尺,則可以將房子大小減掉它再除以值的範圍(最大值減最小值),最後${ x }_{ 1 }$與${ x }_{ 2 }$可能都會介在-0.5~0.5之間。
以上兩種方法都可以使用,特徵縮放不用非常精確,因為其只是為了要將特徵值轉為相近範圍並讓梯度下降法能快一點而已。
學習速率(Learning Rate)
之前我們在梯度下降法那篇文章提過學習速率$\alpha$,這邊我們要討論:1. 如何知道梯度下降有正常執行?
2. 如何選擇學習速率$\alpha$?
梯度下降法的目的就是要找出能夠最小化成本函數$J(\theta)$的一個$\theta$值。
以下圖為例,之前x軸是$\theta$,此時我們改成「迭代次數」來看,y軸則為迭代x次後所得到的$\theta$,其所算出的成本函數$J(\theta)$值。
看圖說故事,如果梯度下降法正常執行,$J(\theta)$的值應該會愈來愈減少,最後到達400次迭代時,大概就已經收斂了,所以這條曲線可以幫助你檢查梯度下降是否正常執行。
對於不同問題,梯度下降法其迭代的次數也可能有很大不同,可能從30次到30000次都有,通常你很難從迭代次數來判斷是否已經收斂,所以想個方式畫出這張圖可能比較好判斷。
或者你可以進行一些自動的收斂測試,也就是用一種演算法來告訴你梯度下降法是否已經收斂,例如設定一個條件:如果現在$J(\theta)$下降距離小於一個很小的值$\E$(例如${ 10 }^{ -3 }$),則認定其已經收斂。但是選定這個值是很麻煩的,因此還是看圖比較方便,不要依靠自動收斂測試。
而學習速率的選定也可以從圖來看,如果圖長得像如下三張圖,則代表學習速率可能太大了,需要選小一點,但是也不能太小,否則梯度下降的速度會很慢。
如果$\alpha$太小,則收斂速度會很慢。
如果$\alpha$太大,則每次迭代時$J(\theta)$不會都是下降,有可能是上升,造成無法收斂。
挑選$\alpha$時,可以以十倍距離中的三倍為區間來挑選,例如:0.001 -> 0.003 -> 0.01 -> 0.03 -> 0.1 -> 0.3 -> 1 -> 3,直到不能再大或不能再小,就從裡面挑一個可以讓梯度下降最快者即可。
沒有留言:
張貼留言