A. 深度學習系列(四):什麼是稀疏編碼
現在深度學習在機器學習領域是一個很熱的概念,不過經過各種媒體的轉載播報,這個概念也逐漸變得有些神話的感覺:例如,人們可能認為,深度學習是一種能夠模擬出人腦的神經結構的機器學習方式,從而能夠讓計算機具有人一樣的智慧;而這樣一種技術在將來無疑是前景無限的。那麼深度學習本質上又是一種什麼樣的技術呢? 深度學習是什麼 深度學習是機器學習領域中對模式(聲音、圖像等等)進行建模的一種方法,它也是一種基於統計的概率模型。在對各種模式進行建模之後,便可以對各種模式進行識別了,例如待建模的模式是聲音的話,那麼這種識別便可以理解為語音識別。而類比來理解,如果說將機器學習演算法類比為排序演算法,那麼深度學習演算法便是眾多排序演算法當中的一種(例如冒泡排序),這種演算法在某些應用場景中,會具有一定的優勢。 深度學習的「深度」體現在哪裡 論及深度學習中的「深度」一詞,人們從感性上可能會認為,深度學習相對於傳統的機器學習演算法,能夠做更多的事情,是一種更為「高深」的演算法。而事實可能並非我們想像的那樣,因為從演算法輸入輸出的角度考慮,深度學習演算法與傳統的有監督機器學習演算法的輸入輸出都是類似的,無論是最簡單的Logistic Regression,還是到後來的SVM、boosting等演算法,它們能夠做的事情都是類似的。正如無論使用什麼樣的排序演算法,它們的輸入和預期的輸出都是類似的,區別在於各種演算法在不同環境下的性能不同。 那麼深度學習的「深度」本質上又指的是什麼呢?深度學習的學名又叫深層神經中國絡(Deep Neural Networks ),是從很久以前的人工神經中國絡(Artificial Neural Networks)模型發展而來。這種模型一般採用計算機科學中的圖模型來直觀的表達,而深度學習的「深度」便指的是圖模型的層數以及每一層的節點數量,相對於之前的神經中國絡而言,有了很大程度的提升。 深度學習也有許多種不同的實現形式,根據解決問題、應用領域甚至論文作者取名創意的不同,它也有不同的名字:例如卷積神經中國絡(Convolutional Neural Networks)、深度置信中國絡(Deep Belief Networks)、受限玻爾茲曼機(Restricted Boltzmann Machines)、深度玻爾茲曼機(Deep Boltzmann Machines)、遞歸自動編碼器(Recursive Autoencoders)、深度表達(Deep Representation)等等。不過究其本質來講,都是類似的深度神經中國絡模型。 既然深度學習這樣一種神經中國絡模型在以前就出現過了,為什麼在經歷過一次沒落之後,到現在又重新進入人們的視線當中了呢?這是因為在十幾年前的硬體條件下,對高層次多節點神經中國絡的建模,時間復雜度(可能以年為單位)幾乎是無法接受的。在很多應用當中,實際用到的是一些深度較淺的中國絡,雖然這種模型在這些應用當中,取得了非常好的效果(甚至是the state of art),但由於這種時間上的不可接受性,限制了其在實際應用的推廣。而到了現在,計算機硬體的水平與之前已經不能同日而語,因此神經中國絡這樣一種模型便又進入了人們的視線當中。 「 2012年6月,《紐約時報》披露了Google Brain項目,吸引了公眾的廣泛關注。這個項目是由著名的斯坦福大學機器學習教授Andrew Ng和在大規模計算機系統方面的世界頂尖專家Jeff Dean共同主導,用16000個CPU Core的並行計算平台訓練一種稱為「深層神經中國絡」(DNN,Deep Neural Networks) 」 從Google Brain這個項目中我們可以看到,神經中國絡這種模型對於計算量的要求是極其巨大的,為了保證演算法實時性,需要使用大量的CPU來進行並行計算。 當然,深度學習現在備受關注的另外一個原因,當然是因為在某些場景下,這種演算法模式識別的精度,超過了絕大多數目前已有的演算法。而在最近,深度學習的提出者修改了其實現代碼的Bug之後,這種模型識別精度又有了很大的提升。這些因素共同引起了深層神經中國絡模型,或者說深度學習這樣一個概念的新的熱潮。 深度學習的優點 為了進行某種模式的識別,通常的做法首先是以某種方式,提取這個模式中的特徵。這個特徵的提取方式有時候是人工設計或指定的,有時候是在給定相對較多數據的前提下,由計算機自己總結出來的。深度學習提出了一種讓計算機自動學習出模式特徵的方法,並將特徵學習融入到了建立模型的過程中,從而減少了人為設計特徵造成的不完備性。而目前以深度學習為核心的某些機器學習應用,在滿足特定條件的應用場景下,已經達到了超越現有演算法的識別或分類性能。 深度學習的缺點 深度學習雖然能夠自動的學習模式的特徵,並可以達到很好的識別精度,但這種演算法工作的前提是,使用者能夠提供「相當大」量級的數據。也就是說在只能提供有限數據量的應用場景下,深度學習演算法便不能夠對數據的規律進行無偏差的估計了,因此在識別效果上可能不如一些已有的簡單演算法。另外,由於深度學習中,圖模型的復雜化導致了這個演算法的時間復雜度中國劇提升,為了保證演算法的實時性,需要更高的並行編程技巧以及更好更多的硬體支持。所以,目前也只有一些經濟實力比較強大的科研機構或企業,才能夠用深度學習演算法,來做一些比較前沿而又實用的應用。 本回答由科學教育分類達人 張雪推薦
B. 如何在Boosting演算法中使用SVM
其實現在能夠找到的,關於SVM的中文資料已經不少了,不過個人覺得,每個人的理解都不太一樣,所以還是決定寫一寫,一些雷同的地方肯定是不可避免的,不過還是希望能夠寫出一點與別人不一樣的地方吧。另外本文准備不談太多的數學(因為很多文章都談過了),盡量簡單地給出結論,就像題目一樣-機器學習中的演算法(之前叫做機器學習中的數學),所以本系列的內容將更偏重應用一些。如果想看更詳細的數學解釋,可以看看參考文獻中的資料。
一、線性分類器:
首先給出一個非常非常簡單的分類問題(線性可分),我們要用一條直線,將下圖中黑色的點和白色的點分開,很顯然,圖上的這條直線就是我們要求的直線之一(可以有無數條這樣的直線)
假如說,我們令黑色的點 = -1, 白色的點 = +1,直線f(x) = w.x + b,這兒的x、w是向量,其實寫成這種形式也是等價的f(x) = w1x1 + w2x2 … + wnxn + b, 當向量x的維度=2的時候,f(x) 表示二維空間中的一條直線, 當x的維度=3的時候,f(x) 表示3維空間中的一個平面,當x的維度=n > 3的時候,表示n維空間中的n-1維超平面。這些都是比較基礎的內容,如果不太清楚,可能需要復習一下微積分、線性代數的內容。
剛剛說了,我們令黑色白色兩類的點分別為+1, -1,所以當有一個新的點x需要預測屬於哪個分類的時候,我們用sgn(f(x)),就可以預測了,sgn表示符號函數,當f(x) > 0的時候,sgn(f(x)) = +1, 當f(x) < 0的時候sgn(f(x)) = –1。
但是,我們怎樣才能取得一個最優的劃分直線f(x)呢?下圖的直線表示幾條可能的f(x)
一個很直觀的感受是,讓這條直線到給定樣本中最近的點最遠,這句話讀起來比較拗口,下面給出幾個圖,來說明一下:
第一種分法:
第二種分法:
這兩種分法哪種更好呢?從直觀上來說,就是分割的間隙越大越好,把兩個類別的點分得越開越好。就像我們平時判斷一個人是男還是女,就是很難出現分錯的情況,這就是男、女兩個類別之間的間隙非常的大導致的,讓我們可以更准確的進行分類。在SVM中,稱為Maximum Marginal,是SVM的一個理論基礎之一。選擇使得間隙最大的函數作為分割平面是由很多道理的,比如說從概率的角度上來說,就是使得置信度最小的點置信度最大(聽起來很拗口),從實踐的角度來說,這樣的效果非常好,等等。這里就不展開講,作為一個結論就ok了,:)
上圖被紅色和藍色的線圈出來的點就是所謂的支持向量(support vector)。
上圖就是一個對之前說的類別中的間隙的一個描述。Classifier Boundary就是f(x),紅色和藍色的線(plus plane與minus plane)就是support vector所在的面,紅色、藍色線之間的間隙就是我們要最大化的分類間的間隙。
這里直接給出M的式子:(從高中的解析幾何就可以很容易的得到了,也可以參考後面Moore的ppt)
另外支持向量位於wx + b = 1與wx + b = -1的直線上,我們在前面乘上一個該點所屬的類別y(還記得嗎?y不是+1就是-1),就可以得到支持向量的表達式為:y(wx + b) = 1,這樣就可以更簡單的將支持向量表示出來了。
當支持向量確定下來的時候,分割函數就確定下來了,兩個問題是等價的。得到支持向量,還有一個作用是,讓支持向量後方那些點就不用參與計算了。這點在後面將會更詳細的講講。
在這個小節的最後,給出我們要優化求解的表達式:
||w||的意思是w的二范數,跟上面的M表達式的分母是一個意思,之前得到,M = 2 / ||w||,最大化這個式子等價於最小化||w||, 另外由於||w||是一個單調函數,我們可以對其加入平方,和前面的系數,熟悉的同學應該很容易就看出來了,這個式子是為了方便求導。
這個式子有還有一些限制條件,完整的寫下來,應該是這樣的:(原問題)
s.t的意思是subject to,也就是在後面這個限制條件下的意思,這個詞在svm的論文裡面非常容易見到。這個其實是一個帶約束的二次規劃(quadratic programming, QP)問題,是一個凸問題,凸問題就是指的不會有局部最優解,可以想像一個漏斗,不管我們開始的時候將一個小球放在漏斗的什麼位置,這個小球最終一定可以掉出漏斗,也就是得到全局最優解。s.t.後面的限制條件可以看做是一個凸多面體,我們要做的就是在這個凸多面體中找到最優解。這些問題這里不展開,因為展開的話,一本書也寫不完。如果有疑問請看看wikipedia。
C. 試說明boosting的核心思想是什麼,boosting中什麼操作使得基分類器具備多樣性
詳細解釋下,boosting中最基本的是adaboost,你要是弄清楚這個演算法其他主要原理都差不多,只是實現手段或者說採用的數學公式不同。它是這樣的:先對所有樣本輔以一個抽樣權重(一般開始的時候權重都一樣即認為均勻分布),在此樣本上訓練一個分類器對樣本分類,這樣可以得到這個分類器的誤差率,我們根據它的誤差率賦以一個權重,大體是誤差越大權重就越小,針對這次分錯的樣本我們增大它的抽樣權重,這樣訓練的下一個分類器就會側重這些分錯的樣本,然後有根據它的誤差率又計算權重,就這樣依次迭代,最後我們得到的強分類器就是多個弱分類器的加權和。我們可以看出性能好的分類器權重大一些,這就體現了boosting的精髓。
D. boosting演算法到底是什麼演算法請詳解
詳細解釋下,boosting中最基本的是adaboost,你要是弄清楚這個演算法其他主要原理都差不多,只是實現手段或者說採用的數學公式不同。它是這樣的:先對所有樣本輔以一個抽樣權重(一般開始的時候權重都一樣即認為均勻分布),在此樣本上訓練一個分類器對樣本分類,這樣可以得到這個分類器的誤差率,我們根據它的誤差率賦以一個權重,大體是誤差越大權重就越小,針對這次分錯的樣本我們增大它的抽樣權重,這樣訓練的下一個分類器就會側重這些分錯的樣本,然後有根據它的誤差率又計算權重,就這樣依次迭代,最後我們得到的強分類器就是多個弱分類器的加權和。我們可以看出性能好的分類器權重大一些,這就體現了boosting的精髓。
E. 為什麼說bagging是減少variance,而boosting是減少bias
【機器學習】Boosting和Bagging的差別
boosting和bagging的差別:
bagging中的模型是強模型,偏差低,方差高。目標是降低方差。在bagging中,每個模型的bias和variance近似相同,但是互相相關性不太高,因此一般不能降低Bias,而一定程度上能降低variance。典型的bagging是random forest。
boosting中每個模型是弱模型,偏差高,方差低。目標是通過平均降低偏差。boosting的基本思想就是用貪心法最小化損失函數,顯然能降低偏差,但是通常模型的相關性很強,因此不能顯著降低variance。典型的Boosting是adaboost,另外一個常用的並行Boosting演算法是GBDT(gradient boosting decision tree)。這一類演算法通常不容易出現過擬合。
過擬合的模型,通常variance比較大,這時應該用bagging對其進行修正。
欠擬合的模型,通常Bias比較大,這時應該可以用boosting進行修正。使用boosting時, 每一個模型可以簡單一些。
金融常見的問題,是只用linear regression,這樣一般來講是欠擬合的,因此需要引入一些非線性的特徵,欠擬合的模型可以先使用boosting嘗試一下,如果效果不好,再使用其他的方法。過擬合的方法,通常使用bagging是會有一定的作用的。
F. boosting演算法到底是什麼演算法
詳細解釋下,boosting中最基本的是adaboost,你要是弄清楚這個演算法其他主要原理都差不多,只是實現手段或者說採用的數學公式不同.它是這樣的:先對所有樣本輔以一個抽樣權重(一般開始的時候權重都一樣即認為均勻分布),在此樣本上訓練一個分類器對樣本分類,這樣可以得到這個分類器的誤差率,我們根據它的誤差率賦以一個權重,大體是誤差越大權重就越小,針對這次分錯的樣本我們增大它的抽樣權重,這樣訓練的下一個分類器就會側重這些分錯的樣本,然後有根據它的誤差率又計算權重,就這樣依次迭代,最後我們得到的強分類器就是多個弱分類器的加權和.我們可以看出性能好的分類器權重大一些,這就體現了boosting的精髓.
G. matlab中Boosting演算法的代碼是什麼
先看這個結構裡面的這些函數都是干什麼用的,prob,概率。[1:keep],這里應該能大概看出來keep是整數,1:keep等價於1:1:keep,比如1:10,就是1,2,3,4,5,6,7,8,9,10。步長為1,從1到keep.右上角的',這個符號,表示轉置,比如1:10,是一個1行10列的矩陣,通過轉置變成10行一列。其中,sum([1:keep]),表示對這個矩陣(從1到keep求和),但是這個語句prob=flipud([1:keep]'/sum([1:keep]));裡面總覺得缺少了一個.。prob=flipud([1:keep]'./sum([1:keep]));這樣看來應該才能運行,我沒嘗試,在commandwindow裡面直接做是可以的,但是在腳本文件裡面做,可能會報錯。這個和矩陣運算有關,暫且放在這里。然後到外部,這樣我們知道了在第一行flipud()函數體裡面,實際上是在用1到keep的每一個數,除以1到keep的和值,得到一個長度為keep的矩陣。值得注意的是,這個矩陣的和值為1,在下面會用到這一點。然後flipud()函數的作用,是把矩陣倒置,比如[1,3,4,5],使用flipud()之後變成[5,4,3,1]。注意,這個操作和sort()函數不同,這個只是把以前的順序倒置,並不排序。從這里大概可以看出來,其實這個keep的值,等於chromosomes,染色體數量。這樣,對於不同的染色體,配對概率就不一樣了。從這里可以看出來,染色體配對概率應該是第一條最高,然後依次遞減。然後計算或然率,cumsum(),進行累加求和,比如matlab中給出的例子,我們用[1,2,3]也可以寫作1:3,來說,cumsum之後的結果是[1,3,6],也就是從第一個開始加和,一直加到這一項。這一點,非常類似高斯函數積分的感覺。用來計算概率cumulativedistribution。然後odd變數,把0加在了cumsum結果的前面,比如剛剛的例子[0cumsum([1,2,3])],就變成了[0,1,3,6]。注意這個地方他又轉置了一次,因為在第一行計算prob的時候,他把一個行向量,轉換成了列向量,然後現在要把0加在頭上,所以在進行cumsun()運算的時候,又把結果從列向量轉換成了行向量。僅從這兩行代碼裡面,就大概只能看出這個意思了。不過簡單一說,現在看不出來這個遺傳演算法的核心是什麼樣的,一般的神經網路裡面只有連鎖交換定律的應用,一般沒有基因分離定律的應用。看這個樣子,這是分離出來然後自由配對的做法,應該是比較高端的東西吧。
H. Bagging與Boosting最大的不同在哪裡它們對模型性能最大的貢獻在哪裡
兩種不同的集成演算法,Bagging採用重復取樣:boostrap 每個個體分類器所採用的訓練樣本都是從訓練集中按等概率抽取的,因此Bagging的各子網能夠很好的覆蓋訓練樣本空間,從而有著良好的穩定性。
而Boosting注重分類錯誤的樣本,將個體子網分類錯誤的訓練樣本的權重提高,降低分類錯誤的樣本權重,並依據修改後的樣本權重來生成新的訓練樣本空間並用來訓練下一個個體分類器。然而,由於Boosting演算法可能會將雜訊樣本或分類邊界樣本的權重過分累積,因此Boosting很不穩定,但其在通常情況下,其泛化能力是最理想的集成演算法之一。
你得自己去查文獻,別來這問,這沒人做學術的,我也是偶爾看到你的提問。
I. 什麼是boosting方法
Boosting 作為一種通用的學習演算法,可以提高任一給定演算法的性能。Kearns and Valiant最先指出,在PAC學習模型中,若存在一個多項式級的學習演算法來識別一組概念,並且識別率很高,那麼這組概念是強可學習的;而如果學習演算法識別一組概念的正確率僅比隨機猜測的略好,那麼這組概念是弱可學習的。如果能將一個弱學習演算法提升為強學習演算法,那麼在學習概念時,只要找到一個比隨機猜測略好的弱學習演算法,就可以將其提升為強學習演算法,而不必直接去找通常情況下很難獲得的強學習演算法 。
再給你個官方網站:http://www.boosting.org/