標籤:機器學習 machine learning stanford
前言說到機器學習,很多人推薦的學習資料就是斯坦福Andrew Ng的cs229,有相關的視頻和講義。不過好的資料 != 好入門的資料,Andrew Ng在coursera有另外一個機器學習課程,更適合入門。課程有video,review questions和programing exercises,視頻雖然沒有中文字幕,不過看示範的講義還是很好理解的(如果當初大學裡的課有這麼好,我也不至於畢業後成為文盲。。)。最重要的就是裡面的programing exercises,得理解透才完成得來的,畢竟不是簡單點點滑鼠的選擇題。不過coursera的課程屏蔽很一些比較難的內容,如果覺得課程不夠過癮,可以再看看cs229的。這篇筆記主要是參照cs229的課程,但也會穿插coursera的一些內容。接觸完機器學習,會發現有兩門課很重要,一個是機率統計,另外一個是線性代數。因為機器學習使用的資料,可以看成機率統計裡的樣本,而機器學習建模之後,你會發現剩下的就是線性代數求解問題。至於學習資料,我推薦一本《機器學習實戰》,能解決你對機器學習怎麼落地的困惑。李航的《統計學習方法》可以當提綱參考,中國人寫的書,適合填鴨式教學,我不是太喜歡這本。cs229除了lecture notes,還有session notes(簡直是雪中送炭,夏天送風扇,lecture notes裡那些讓你覺得有必要再深入瞭解的點這裡可以找到),和problem sets,資料也夠多了。
線性迴歸 linear regression 通過現實生活中的例子,可以協助理解和體會線性迴歸。比如某日,某屌絲同事說買了房子,那一般大家關心的就是房子在哪,哪個小區,多少錢一平方這些資訊,因為我們知道,這些資訊是"關鍵資訊”(機器學習裡的黑話叫“feature”)。那假設現在要你來評估一套二手房的價格(或者更直接點,你就是一個賣房子的黑中介,嘿嘿),如果你對樓價一無所知(比如說房子是在非洲),那你肯定估算不準,最好就能提供同小區其他房子的報價;沒有的話,旁邊小區也行;再沒有的話,所在區的房子均價也行;還是沒有的話,所在城市房子均價也行(在北京有套房和在餘杭有套房能一樣麼),因為你知道,這些資訊是有“參考價值”的。其次,估算的時候我們肯定希望提供的資訊能盡量詳細,因為我們知道房子的朝向,裝修好壞,位置(靠近馬路還是小區中心)是會影響房子價格的。 其實我們人腦在估算的過程,就類似一個“機器學習”的過程。a)首先我們需要“訓練資料”,也就是相關的樓價資料,當然,資料太少肯定不行,要盡量豐富。有了這些資料,人腦可以“學習”出樓價的一個大體情況。因為我們知道同一小區的同一戶型,一般價格是差不多的(特徵相近,目標值-樓價也是相近的,不然就沒法預測了);樓價我們一般按平方算,平方數和樓價有“近似”線性關係。b)而“訓練資料”裡面要有啥資訊?只給你房子照片肯定不行,肯定是要小區地點,房子大小等等這些關鍵“特徵”c)一般我們人肉估算的時候,比較隨意,也就估個大概,不會算到小數點後幾位;而估算的時候,我們會參照現有資料,不會讓估算跟“訓練資料”差得離譜(也就是下面要講的讓損失函數盡量小),不然還要“訓練資料”幹嘛。 電腦擅長處理數值計算,把樓價估算問題完全可以用數學方法來做。把這裡的“人肉估算”數學形式化,也就是“線性迴歸”。
1.我們定義線性迴歸函數(linear regression)為:
然後用h(x) 來預測y
最簡單的例子,一個特徵size,y是Price,把訓練資料畫在圖上,如。(舉最簡單的例子只是協助理解,當特徵只有一維的時候,畫出來是一條直線,多維的時候就是超平面了)
這裡有一個問題,如果真實模型不是線性怎麼辦?所以套用線性迴歸的時候是需要預判的,不然訓練出來的效果肯定不行。這裡不必過於深究,後面也會介紹怎麼通過預先處理資料處理非線性情況。
2.目標就是畫一條直線盡量靠近這些點,用數學語言來描述就是cost function盡量小。為什麼是平方和? 直接相減取一下絕對值不行麼, | h(x)-y | ? (後面的Probabilistic interpretation會解釋,這樣求出來的是likelihood最大。另外一個問題, | h(x)-y |大的時候 ( h(x)-y )^2 不也是一樣增大,看上去好像也一樣?! 除了後者是凸函數,好求解,所以就用平方和? 不是的,單獨一個樣本縱向比較確實一樣,但別漏了式子前面還有一個求和符號,這兩者的差異體現在樣本橫向比較的時候,比如現在有兩組差值,每組兩個樣本,第一組絕對值差是1,3,第二組是2,2,絕對值差求和是一樣,4=4, 算平方差就不一樣了,10 > 8。其實,x^2求導是2x,這裡的意思就是懲罰隨偏差值線性增大,最終的效果從圖上看就是儘可能讓直線靠近所有點)
3 然後就是怎麼求解了。如果h(x)=y那就是初中時候的多元一次方程組了,現在不是,所以要用高端一點的方法。以前初中、高中課本也有提到怎麼求解迴歸方程,都是按計算機,難怪我一點印象都沒有,囧。。notes 1裡面介紹3種方法
1.gradient descent (梯度下降)
a.batch gradient descentb.stochastic gradient descent (上面的變形)
2.the normal equations3.Newton method(Fisher scoring)
1.gradient descent algorithmα is called the learning rate.
只有一個訓練資料的例子:
這個式子直觀上也很好理解,假設xj是正數,y比預測值h(x)大的話,我們要加大θ,所以α前面是+號(當xj是負數同理)
舉一個資料的例子只是協助我們理解,實際中是會有多個資料的,你會體會到矩陣的便利性的。
上面的式子在具體更新的時候有小的不同方法 a.batch gradient descent注意,要同時進行更新。因為更新θ(j+1)的時候要用hθ(x),這裡的hθ(x)用的還是老的θ1 到 θj。
直觀上看,等高線代表cost function的值,橫縱座標是θ1 θ2兩個參數,梯度下降就是每次一小步沿著垂直等高線的方嚮往等高線低(圖的中心)的地方走。顯然步子不能太大,不然容易扯著蛋(跨一大步之後反而到了更高的點)方法 b.stochastic gradient descent (also incremental gradient descent)
這兩種方法看公式可能不好理解,看後面的代碼實現就容易區分。
2.the normal equations。初學者可以先跳過推導過程(不是鼓勵不看。),直接先記住結論。(線上性代數的複習課件cs229-linalg會說明,這個式子其實是把y投影到X)
3.牛頓法Another algorithm for maximizing ?(θ)Returning to logistic regression with g(z) being the sigmoid function, lets now talk about a different algorithm for minimizing -?(θ)。(感覺notes1裡面少了個負號)牛頓法求函數0點,即 f (Θ) = 0
這樣迭代就行,f′(θ)是斜率,從圖上看,就是“用三角形去擬合曲線,找0點”
因為我們是要求導數等於0,把上面的式子替換一下f(θ) = ?′(θ)θ是多維的,有where When Newton’s method is applied to maximize the logistic regression log likelihood function ?(θ), the resulting method is also called
Fisher scoring.
coursera的課件提到其他方法,估計初學者沒空深究,瞭解一下有這些東西就好。
羅吉斯迴歸logistic regression現在如果有一個0和1的2分類問題的,套進去線性迴歸去解,如
離群點會對結果影響很大,比如(我們以h(x)>0.5時預測y=1,一個離群點讓直線大旋轉,一下子把不少點誤分類了)(coursera的課程只提到這個原因,但貌似不止),而且還有一個問題,Intuitively, it also doesn’t make sense for h(x) to take values larger than 1 or smaller than 0 when we know that y ∈ {0, 1}. (那h(x)在[0,1]又代表什麼呢?呵呵)換成這個曲線就好多了,這個函數是sigmoid functiong(z) 值域 (0,1)
把線性迴歸套進去g(z)就是
為什麼是sigmoid函數?換個形狀類似的函數不行嗎?這個後面一樣有機率解釋的。注意,這個函數輸出值代表“y為1的機率”,再回過頭看看,前面y用1和0來表示正反也是有講究的(講svn的時候又換成+1,-1),直觀上看sigmoid越接近1表示1的機率大,接近0表示0的機率大,還有一個好處就是下面算likelihood的時候用式子好表示。
建模好,還缺一個cost function,是不是跟linear regression一樣求平方差就行? 呵呵,不是,coursera課程給出的原因是套入sigmoid後,這個函數不是凸函數,不好求解了。但其實h(x) -y 算出來是一個機率,多個訓練資料的機率相加是沒意義的,得相乘。p(x,y) = p(x)* p(y)。
先講一個useful property推導公式時可以用,習題也會用到的
把兩個機率公式合到一起=> likelihood of the parameters:log likelihood: 一個訓練資料的時候(代入前面的結論)
注意,前面linear regression,我們求cost function的最小值,所以是減號對於logistic regression,我們要求的是likelihood最大(附錄提到,是等價的),所以要換成加號。這樣θ最終的迭代式子才跟前面linear regression一樣,這是巧合嗎?隱隱約約感覺這其中有一腿。
machine learning in practice我總覺得電腦科學動手實踐很重要,紙上談兵不接地氣。coursera有programing exercise,必須完成下。octave用起來挺爽的。這裡記錄一下關鍵點。1.coursera的cost function多除了一個m其實起到一個歸一化的作用,讓迭代步長α與訓練樣本數無關(你可以當作α=α‘/m)2.batch gradient descent和stochastic gradient descent的差別batch gradient descent
for iter = 1:num_iters A = ( X * theta - y )'; theta = theta - 1/m * alpha * ( A * X )';end
stochastic gradient descent
for iter = 1:num_iters A = ( X * theta - y )'; for j = 1:m theta = theta - alpha * ( A(1, j) * X(j, :) )'; endend
用ex1_multi.m改改,產生兩個cost下降圖,可以發現stochastic gradient descent挺犀利的。。
3.feature scaling的作用是啥?(具體模型具體分析,這裡只針對LR模型,不要把結論隨意推廣)coursera提到的作用是加速收斂,那會影響結果嗎?直覺上,把一個feature擴大10倍,那算cost function的時候豈不是很佔便宜,算出來的權重會偏向這個feature嗎?對這種問題,數學家會理論證明,工程師做實驗驗證,我習慣粗略證明,然後實驗驗證自己對不對。(下面都是粗略的想法,不是嚴謹證明!!)假設每個樣本的feature j 乘以10,那算出來的θj除以10不就結果跟原來一樣了?我猜不會影響。看一下我們迭代時候的式子xj變大,h(x) 也變大,粗略迭代步長要擴大10倍(那就起到抑制θ的作用)但最終的θ要變為1/10,想想略蛋疼,比如現在100每次減少1,減99次後變為1,現在每次要減少10,卻要讓最終的結果到0.1,得改α才行啊,看來feature scaling能起到歸一化α的作用。把ex1.m改一下,做做實驗。會發現縮放一個feature後,收斂很困難啊,我只乘以2,原來的代碼就輸出NaN了。。我把alpha平方一下 alpha^2。可以發現等高線變密集了,橢圓形變得很扁,所以步長不能很大,收斂很困難,一直在一個類似直線的橢圓跳來跳去慢慢挪。至於結果會不會變,用normal equation來驗證,因為梯度下降有困難。改下ex1_muliti.m
X2 = X;X2(:,2) = X2(:, 2)* 2;theta2 = pinv(X2' * X2) * X2' * y;theta2theta
theta2(2)就是神奇地變1/2了。。
theta2 = 8.9598e+004 6.9605e+001 -8.7380e+003theta = 8.9598e+004 1.3921e+002 -8.7380e+003
前面是linear regression,對logistic regression可以改ex2.m也驗證下
X2(:,2)= X2(:,2)*2;[theta2, cost] = fminunc(@(t)(costFunction(t, X2, y)), initial_theta, options);theta2
theta: -25.161272 0.206233 0.201470theta2 = -25.16127 0.10312 0.20147
附錄cost function的機率解釋我們知道h(x)和真實的y是有偏差的,設偏差是ε
假設ε是iid(獨立同分布)的,符合高斯分布(通常高斯分布是合理的,具體不解釋),聯想到高斯分布的式子,有平方就不奇怪了。
得到likelihood function:
求解技巧,轉成 log likelihood ?(θ)(這個是個非常基礎的技巧,後面會大量用到):
To summarize: Under the previous probabilistic assumptions on the data,
least-squares regression corresponds to finding the
maximum likelihood estimate of θ.