機器學習 —— 極大似然估計與條件概率


  今天在研究點雲分割的時候終於走完了所有的傳統路子,走到了基於機器學習的分割與傳統自底向上分割的分界點(CRF)算法。好吧,MIT的老教授說的對,其實你很難真正繞過某個問題,數學如是,人生也如是。

---記我的機器學習之路

1、機器學習

  在之前的學習過程中,機器學習對我而言實在是洪水猛獸般的存在。很多玄玄乎乎的公式,算法,各種算法的名字一看就比較高級;如黑箱一般的過程;摸不清的物理意義;繁雜的公式實在是讓人頭大。為了能更好的學習PGM,我決定放棄由從神經網絡或者深度學習一類的算法入手的打算,改由統計,概率與推斷入手,來學習Learning. 實際上如果你只看中利用機器學習來做什么,那么完全不需要頭疼它到底是怎么Learning的,Learning已經成了一個抽象類,對所有的問題都可以用:

Learn graph_learn(new learn::graph_learn);
learn.train;
learn.app;
learn.result;

的方法來完成。至於how to train,how to extract result,顯然已經被各路大神封裝的妥妥的了。但是如果真的想要從機器學習中獲得啟發或者是將其與自己的專業結合的更緊密,可能還是要對這個東西開膛破肚吧。 

 

2.極大似然估計

  估計(estimating)是一種手段,一種對模型參數進行推測的手段,說白了,就是利用訓練數據對模型進行calibration. 在標定之前,首先需要有一個模型。模型中需要有待辨識的參數。極大似然估計是 現象--->原理 的過程,這個世界上已經發生的,都必然會發生(given by Kang.YH_HUST)。遵循這個原理,求解模型參數就成了一個尋優的過程。當給定模型與結果,時間發生的概率p是參數a的函數。其原理如下:

f(x1, . . . , xn; θ) = ∏ fθ(xj ; θ).

L(θ; x1, . . . , xn) = f(x1, . . . , xn; θ).

θ = argmaxθ L(θ; x1, . . . , xn).

  由於模型是已知的,那么對給定觀測值,其對應概率p是可以表達的。根據此原理可以求解以下兩個問題:

  1.如果θ是二項分布的參數,那么在給定一組結果的情況下,似然函數L可表達為:

  對似然函數求導,可得當θ=h/n時似然函數取最大值。h是x=1的次數,n是實驗總數。

  2.如果L函數是線性的,那么可以對L函數取對數,取完對數后結果是一樣的。

3.條件似然估計

  說到條件概率,好像事情就變得有點復雜, y|x 總是給人一種先有x后有y的感覺,但其實x,y並不是先有雞后有蛋的關系,x,y應該理解為y受到x的約束,會隨着x的改變而改變y的取值。條件所表達的意義在於約束,而非順序。 如果用約束來解釋這個關系,那么接下來的事情就好理解了:

  1、如果 y 受到 x(向量)的約束,y的取值是隨着x變化的。

  2、為簡化約束,假定:x 各個分量對 y 的約束是線性組合的,不同的分量有不同的權重。

  上面是一個簡單粗暴的模型,x 的各個分量可以看作是 x的不同特征。

  比如:點雲顏色,點雲密度,點雲曲率 都可以看作是對 該是否該出現(0 1問題)有影響,那么就可以設計基於條件概率的點雲濾波器。

 

  有了上述概念以后,就需要把它量化,有兩點需要量化:

  1.x的加權和在哪個范圍。

  2.如何讓y的概率落在0~1。

  顯然 logistic regression model 能夠很好的解決量化問題:

  對 x 各個部分的權重而言,取值可以從 負無窮到正無窮;

  對 y 的概率而言,取值用於在0~1之間。

  這個系統中,需要辨識的參數就僅僅是beta(alpha可以看作是beta0,x0=1),要辨識beta並不是一件容易的事情,對所有給定x,我需要算出它對應的p,並把表達式相乘,再優化求解。顯然這是笨辦法,先對L(beta)函數做些處理才是上策。

  因為對Y而言,其為二項分布(丟硬幣要么正面要么反面,但是硬幣可以有bias,這個bias可以由很多事情決定),二項分布的極大似然估計是已知的:

  (似然函數取了對數)

  如果等式兩項同時向beta求導,則有:

  p不僅僅是p,p還是beta的函數:,那么則有:

  

  OK,好像令上式為0,則可求出beta對xij,yij的表達式。。。。。然而卻沒有那么簡單。

3、學習,機器也抄近道

  這個東西不那么簡單的原因在於pi是一個非常復雜的表達式:。雖然任意一個beta都是獨立的,但是要把所有的xi全部代進去,再求最小值也沒那么簡單,雖然這個最小值肯定存在,但如果沒有beta,你也算不出來啊。。。陷入了該先拿身份證還是先開鎖的困境中。

  所謂的學習(training),本質上是一種數值求解方法。一般情況下,可以表達為梯度下降法,它是這樣的:

    

  在已經假設了beta(向量)的初始值情況下,beta(j) 的梯度是已經得知了的。那么對 整個訓練集(i)全部遍歷一遍就可以算出梯度,由梯度再刷新Beta_j。偽代碼大約如下:

while ( all_beta != coverge)
  
for j = 1:end_of_features
     for i = 1:end_of_training_set
      Partial_Beta_j += (yi-pi)xij
     end beta(j)
= beta(j) + lamda*Partial_Beta_j end
end

  顯然,這很不科學,對每個beta(j)我都需要遍歷整個訓練集,最后才改變了一點點。。。。。然后我又要遍歷整個訓練集。。。。。如果訓練集很大,那豈不是坑爹。

 

  所以我們需要一個抄近道的方法,成為隨機梯度下降法。這個方法的原理其實很簡單:訓練集包含的信息是一致的。

  不是一樣的,是一致的。假設我們能找到一個隨機變量Z,使Z滿足:

  那么,只要Z的取值次數夠多,我們就可以利用Zj來替代E[Zj](取足夠多次,那么他們最終效果的相同的)

  不妨取。由於n是一個常數(訓練集的規模)。那么Beta(j)也就變成了:

  

  終於,整個訓練過程被簡化成了:

1.for epcho = 1:3
2.    for i = 1:end_of_training_set 
3.        for j = 1:end_of_features          
            Partial_Beta_j += (yi-pi)xij
              beta(j) = beta(j) + lamda*Partial_Beta_j 
         end
      end
   train_set.rand_rank();
end     

 

  其中,epcho被用作強制收斂,一般是3~100。第二個 for 和第三個 for 是可以對調位置的。據說會導致收斂變慢,該方法叫做cordianate ascent.

  Ok,學習的問題基本上解決好了,還抄了點近道,想想就有些小開心~接下來還要解決1個掃尾的問題,搞定了的話我們也算玩過機器學習啦啦啦啦~~~

  問題:如果訓練集合處處點雲密度 為 1,且只要這個特征出現,點雲就被認為是 無效的,那么隨着訓練的增加beta就會一直上升,直到無窮大;

  當然,當訓練集非常合理,特征量化也非常合理的時候上面的那個問題不會出現,但顯然不會如此十全十美。

  所以簡單粗暴的引入一個懲罰因子,來防止beta跑飛.

   

  u是常數,當beta過大或者過小的時候懲罰因子能起到糾偏的作用,但結果會帶來誤差。

4、將簡單的機器學習用於點雲濾波

  顯然上式我們已經得到了beta 關於xij,yi的表達式,接下來要做的很簡單:

  1.量化曲率x1,顏色x2,密度x3(根據經驗,都要在-1~1之間,方差最好為1)。

  2.指定一些點,是,或者不是某點雲的點y(0/1)

  3.訓練。

  我們就得到了一個判斷某點是否屬於該點雲的一個簡單“判別器”(本質上就是個概率函數),當遇到某個點時,可以算它是有效點還是無效點的概率。

  

  其實機器學習沒有那么難~也沒有“黑”~~~~

 

  

  

  

 


免責聲明!

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



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