深度學習淺層理解

CopperDong發表於2017-09-10
   1958 年,DavidHubel 和Torsten Wiesel 在 JohnHopkins University,研究瞳孔區域與大腦皮層神經元的對應關係。他們在貓的後腦頭骨上,開了一個3 毫米的小洞,向洞裡插入電極,測量神經元的活躍程度。目的是去證明一個猜測。位於後腦皮層的不同視覺神經元,與瞳孔所受刺激之間,存在某種對應關係。這個發現激發了人們對於神經系統的進一步思考。神經-中樞-大腦的工作過程,或許是一個不斷迭代、不斷抽象的過程。

       這裡的關鍵詞有兩個,一個是抽象,一個是迭代。從原始訊號,做低階抽象,逐漸向高階抽象迭代。人類的邏輯思維,經常使用高度抽象的概念。例如,從原始訊號攝入開始(瞳孔攝入畫素 Pixels),接著做初步處理(大腦皮層某些細胞發現邊緣和方向),然後抽象(大腦判定,眼前的物體的形狀,是圓形的),然後進一步抽象(大腦進一步判定該物體是隻氣球)。

       1995 年前後,Bruno Olshausen和 David Field 兩位學者任職 Cornell University,他們試圖同時用生理學和計算機的手段,雙管齊下,研究視覺問題。

       Bruno Olshausen和 David Field 的演算法結果,與 David Hubel 和Torsten Wiesel 的生理髮現,不謀而合!

      也就是說,複雜圖形,往往由一些基本結構組成。比如下圖:一個圖可以通過用64種正交的edges(可以理解成正交的基本結構)來線性表示。比如樣例的x可以用1-64個edges中的三個按照0.8,0.3,0.5的權重調和而成。而其他基本edge沒有貢獻,因此均為0 。

     小塊的圖形可以由基本edge構成,更結構化,更復雜的,具有概念性的圖形如何表示呢?這就需要更高層次的特徵表示,比如V2,V4。因此V1看畫素級是畫素級。V2看V1是畫素級,這個是層次遞進的,高層表達由底層表達的組合而成。專業點說就是基basis。V1取提出的basis是邊緣,然後V2層是V1層這些basis的組合,這時候V2區得到的又是高一層的basis。即上一層的basis組合的結果,上上層又是上一層的組合basis……(所以有大牛說Deep learning就是“搞基”,因為難聽,所以美其名曰Deep learning或者Unsupervised Feature Learning)。

直觀上說,就是找到make sense的小patch再將其進行combine,就得到了上一層的feature,遞迴地向上learning feature。

        在不同object上做training是,所得的edge basis 是非常相似的,但object parts和models 就會completely different了(那我們們分辨car或者face是不是容易多了)。

從文字來說,一個doc表示什麼意思?我們描述一件事情,用什麼來表示比較合適?用一個一個字嘛,我看不是,字就是畫素級別了,起碼應該是term,換句話說每個doc都由term構成,但這樣表示概念的能力就夠了嘛,可能也不夠,需要再上一步,達到topic級,有了topic,再到doc就合理。但每個層次的數量差距很大,比如doc表示的概念->topic(千-萬量級)->term(10萬量級)->word(百萬量級)。

        一個人在看一個doc的時候,眼睛看到的是word,由這些word在大腦裡自動切詞形成term,在按照概念組織的方式,先驗的學習,得到topic,然後再進行高層次的learning。

Deep Learning的基本思想

      假設我們有一個系統S,它有n層(S1,…Sn),它的輸入是I,輸出是O,形象地表示為: I =>S1=>S2=>…..=>Sn => O,如果輸出O等於輸入I,即輸入I經過這個系統變化之後沒有任何的資訊損失(呵呵,大牛說,這是不可能的。資訊理論中有個“資訊逐層丟失”的說法(資訊處理不等式),設處理a資訊得到b,再對b處理得到c,那麼可以證明:a和c的互資訊不會超過a和b的互資訊。這表明資訊處理不會增加資訊,大部分處理會丟失資訊。當然了,如果丟掉的是沒用的資訊那多好啊),保持了不變,這意味著輸入I經過每一層Si都沒有任何的資訊損失,即在任何一層Si,它都是原有資訊(即輸入I)的另外一種表示。現在回到我們的主題Deep Learning,我們需要自動地學習特徵,假設我們有一堆輸入I(如一堆影象或者文字),假設我們設計了一個系統S(有n層),我們通過調整系統中引數,使得它的輸出仍然是輸入I,那麼我們就可以自動地獲取得到輸入I的一系列層次特徵,即S1,…, Sn。對於深度學習來說,其思想就是對堆疊多個層,也就是說這一層的輸出作為下一層的輸入。通過這種方式,就可以實現對輸入資訊進行分級表達了。

      深度學習的實質,是通過構建具有很多隱層的機器學習模型和海量的訓練資料,來學習更有用的特徵,從而最終提升分類或預測的準確性。因此,“深度模型”是手段,“特徵學習”是目的。區別於傳統的淺層學習,深度學習的不同在於:1)強調了模型結構的深度,通常有5層、6層,甚至10多層的隱層節點;2)明確突出了特徵學習的重要性,也就是說,通過逐層特徵變換,將樣本在原空間的特徵表示變換到一個新特徵空間,從而使分類或預測更加容易。與人工規則構造特徵的方法相比,利用大資料來學習特徵,更能夠刻畫資料的豐富內在資訊。

Deep Learning和  neural network異同

      二者的相同在於deep learning採用了神經網路相似的分層結構,系統由包括輸入層、隱層(多層)、輸出層組成的多層網路,只有相鄰層節點之間有連線,同一層以及跨層節點之間相互無連線,每一層可以看作是一個logistic regression模型;這種分層結構,是比較接近人類大腦的結構的。

      而為了克服神經網路訓練中的問題,DL採用了與神經網路很不同的訓練機制。傳統神經網路中,採用的是back propagation的方式進行,簡單來講就是採用迭代的演算法來訓練整個網路,隨機設定初值,計算當前網路的輸出,然後根據當前輸出和label之間的差去改變前面各層的引數,直到收斂(整體是一個梯度下降法)。而deep learning整體上是一個layer-wise的訓練機制。這樣做的原因是因為,如果採用back propagation的機制,對於一個deep network(7層以上),殘差傳播到最前面的層已經變得太小,出現所謂的gradient diffusion(梯度彌散)。

     BP演算法作為傳統訓練多層網路的典型演算法,實際上對僅含幾層網路,該訓練方法就已經很不理想。深度結構(涉及多個非線性處理單元層)非凸目標代價函式中普遍存在的區域性最小是訓練困難的主要來源。

BP演算法存在的問題:

(1)梯度越來越稀疏:從頂層越往下,誤差校正訊號越來越小;

(2)收斂到區域性最小值:尤其是從遠離最優區域開始的時候(隨機值初始化會導致這種情況的發生);

(3)一般,我們只能用有標籤的資料來訓練:但大部分的資料是沒標籤的,而大腦可以從沒有標籤的的資料中學習;

deep learning訓練過程具體如下:

1)使用自下上升非監督學習(就是從底層開始,一層一層的往頂層訓練):

       採用無標定資料(有標定資料也可)分層訓練各層引數,這一步可以看作是一個無監督訓練過程,是和傳統神經網路區別最大的部分(這個過程可以看作是feature learning過程):

       具體的,先用無標定資料訓練第一層,訓練時先學習第一層的引數(這一層可以看作是得到一個使得輸出和輸入差別最小的三層神經網路的隱層),由於模型capacity的限制以及稀疏性約束,使得得到的模型能夠學習到資料本身的結構,從而得到比輸入更具有表示能力的特徵;在學習得到第n-1層後,將n-1層的輸出作為第n層的輸入,訓練第n層,由此分別得到各層的引數;

2)自頂向下的監督學習(就是通過帶標籤的資料去訓練,誤差自頂向下傳輸,對網路進行微調):

       基於第一步得到的各層引數進一步fine-tune(微調)整個多層模型的引數,這一步是一個有監督訓練過程;第一步類似神經網路的隨機初始化初值過程,由於DL的第一步不是隨機初始化,而是通過學習輸入資料的結構得到的,因而這個初值更接近全域性最優,從而能夠取得更好的效果;所以deep learning效果好很大程度上歸功於第一步的feature learning過程。

如果我們把輸出必須和輸入相等的限制放鬆,同時利用線性代數中基的概念,即O = a11 + a22+….+ ann, Φi是基,ai是係數,我們可以得到這樣一個優化問題:

Min |I – O|,其中I表示輸入,O表示輸出。

      通過求解這個最優化式子,我們可以求得係數ai和基Φi,這些係數和基就是輸入的另外一種近似表達。

      因此,它們可以用來表達輸入I,這個過程也是自動學習得到的。如果我們在上述式子上加上L1的Regularity限制,得到:

Min |I – O| + u*(|a1| + |a2| + … + |an |)

      這種方法被稱為Sparse Coding。通俗的說,就是將一個訊號表示為一組基的線性組合,而且要求只需要較少的幾個基就可以將訊號表示出來。“稀疏性”定義為:只有很少的幾個非零元素或只有很少的幾個遠大於零的元素。要求係數 ai 是稀疏的意思就是說:對於一組輸入向量,我們只想有儘可能少的幾個係數遠大於零。選擇使用具有稀疏性的分量來表示我們的輸入資料是有原因的,因為絕大多數的感官資料,比如自然影象,可以被表示成少量基本元素的疊加,在影象中這些基本元素可以是面或者線。同時,比如與初級視覺皮層的類比過程也因此得到了提升(人腦有大量的神經元,但對於某些影象或者邊緣只有很少的神經元興奮,其他都處於抑制狀態)。

     稀疏編碼演算法是一種無監督學習方法,它用來尋找一組“超完備”基向量來更高效地表示樣本資料。雖然形如主成分分析技術(PCA)能使我們方便地找到一組“完備”基向量,但是這裡我們想要做的是找到一組“超完備”基向量來表示輸入向量(也就是說,基向量的個數比輸入向量的維數要大)。超完備基的好處是它們能更有效地找出隱含在輸入資料內部的結構與模式。然而,對於超完備基來說,係數ai不再由輸入向量唯一確定。因此,在稀疏編碼演算法中,我們另加了一個評判標準“稀疏性”來解決因超完備而導致的退化(degeneracy)問題。

比如在影象的Feature Extraction的最底層要做Edge Detector的生成,那麼這裡的工作就是從Natural Images中randomly選取一些小patch,通過這些patch生成能夠描述他們的“基”,也就是右邊的8*8=64個basis組成的basis,然後給定一個test patch, 我們可以按照上面的式子通過basis的線性組合得到,而sparse matrix就是a,下圖中的a中有64個維度,其中非零項只有3個,故稱“sparse”。

 

Sparse coding分為兩個部分:

1)Training階段:給定一系列的樣本圖片[x1, x 2, …],我們需要學習得到一組基[Φ1, Φ2, …],也就是字典。

       稀疏編碼是k-means演算法的變體,其訓練過程也差不多(EM演算法的思想:如果要優化的目標函式包含兩個變數,如L(W, B),那麼我們可以先固定W,調整B使得L最小,然後再固定B,調整W使L最小,這樣迭代交替,不斷將L推向最小值。

       訓練過程就是一個重複迭代的過程,按上面所說,我們交替的更改a和Φ使得下面這個目標函式最小。

       每次迭代分兩步:

a)固定字典Φ[k],然後調整a[k],使得上式,即目標函式最小(即解LASSO問題)。見下

b)然後固定住a [k],調整Φ [k],使得上式,即目標函式最小(即解凸QP問題)。見下

      不斷迭代,直至收斂。這樣就可以得到一組可以良好表示這一系列x的基,也就是字典。

2)Coding階段:給定一個新的圖片x,由上面得到的字典,通過解一個LASSO問題得到稀疏向量a。這個稀疏向量就是這個輸入向量x的一個稀疏表達了。

例如:

 

LASSO問題

     使用數理統計模型從海量資料中有效挖掘資訊越來越受到業界關注。在建立模型之初,為了儘量減小因缺少重要自變數而出現的模型偏差,通常會選擇儘可能多的自變數。然而,建模過程需要尋找對因變數最具有強解釋力的自變數集合,也就是通過自變數選擇(指標選擇、欄位選擇)來提高模型的解釋性和預測精度。指標選擇在統計建模過程中是極其重要的問題。Lasso演算法則是一種能夠實現指標集合精簡的估計方法。
     Tibshirani(1996)提出了Lasso(The Least Absolute Shrinkage and Selectionator operator)演算法。這種演算法通過構造一個懲罰函式獲得一個精煉的模型;通過最終確定一些指標的係數為零,LASSO演算法實現了指標集合精簡的目的。這是一種處理具有復共線性資料的有偏估計。Lasso的基本思想是在迴歸係數的絕對值之和小於一個常數的約束條件下,使殘差平方和最小化,從而能夠產生某些嚴格等於0的迴歸係數,得到解釋力較強的模型。R統計軟體的Lars演算法的軟體包提供了Lasso演算法。根據模型改進的需要,資料探勘工作者可以藉助於Lasso演算法,利用AIC準則和BIC準則精煉簡化統計模型的變數集合,達到降維的目的。因此,Lasso演算法是可以應用到資料探勘中的實用演算法。Lasso是一個線性模型,用於評估稀少係數下的資料型別。當引數值較少時Lasso演算法非常有用,可以有效降低資料誤差。
  原始文章在這裡,http://statweb.stanford.edu/~tibs/lasso/lasso.pdf 
 
凸QP問題
      在一般情況下,求解任意一個函式的全域性最優值是很困難的。但是對於一種特定型別的函式——凸函式(convex function), 我們可以很有效的求解其全域性最優值。這裡的“有效”是指在實際問題求解中,能在多項式複雜度的時間裡求解。 人們將這類函式的最值問題稱為凸優化問題(Convex Optimal Problem)

凸集的定義:一個集合C是凸集,當且僅當對任意x,yCθRR且0θ1,都有

θx+(1θ)yC.
       其幾何意義在於,在集合C中任取兩個點,連線兩點的直線段上的任一點也在集合C中。下圖是凸集和非凸集的例子:
 

      常見的凸集有:n維實數空間;一些範數約束形式的集合;仿射子空間;凸集的並集;n維半正定矩陣集;凸優化中的一個核心概念就是凸函式。

凸函式定義:一個函式f:RnR是凸函式當且僅當其定義域(設為D(f))是凸集, 且對任意的x,yD(f)和θR0≤θ≤1,都有

f(θx+(1θ)yθf(x)+(1θ)f(y))

 

f(x)為一元函式,那麼上式的幾何意義在於,曲線上任意兩點處的割線在函式曲線的上方,常見的凸函式有指數函式(f(x)=axa>1)、負對數函式(f(x)=logaxa>1x>0)、開口向上的二次函式等。
 

        有了凸集和凸函式的定義,現在我們重點討論凸優化問題的求解方法。凸優化的一般描述為:

其中f(x)為凸函式,C是一個凸集,這是不帶約束條件的情況下的凸優化問題。對於帶約束條件的問題而言,其一般描述為:
 
其中f(x)為凸函式,gi(x)對所有的ii均為凸函式,hj(x)均為仿射函式。注意gi(x)不等式中不等號的方向。

 

凸問題中的全域性優化:首先要分清楚什麼是區域性最優,什麼是全域性最優。區域性最優是指在該最優值附近的點對應的函式值 都比該最優值大,而全域性最優是指對可行域裡所有點,其函式值都比該最優值大。對於凸優化問題,它具有一個很重要的特性, 那就是所有的區域性最優值都是全域性最優的。

(1)線性規劃(Linear Programing, LP): 目標函式和約束條件函式都是線性函式的情況,一般形式如下:

 

(2)二次規劃(Quadratic Programing, QP): 目標函式為二次函式,約束條件為線性函式,一般形式為:

LP可以看做是QP的特例,QP包含LP。

(3)二次約束的二次規劃(Quadratically Constrained Quadratic Programming, QCQP): 目標函式和約束條件均為 二次函式的情況,QP可以看做是QCQP的特例,QCQP包含QP。

(4)半正定規劃(Semidefinite Programming,SDP)QCQP可以看做是SDP的特例,SDP包含QCQP。SDP在machine learning中有非常廣泛的應用。

凸優化應用舉例

下面我們來看幾個例項。
(1)支援向量機(Support Vector Machines,SVM):凸優化在machine learning中的一個典型的應用就是基於支援向量機分類器, 它可以用如下優化問題表示:

其中決策變數wRn,ξRn,bRCR,x(i),y(i),i=1,2,,m由 具體問題定義。可以看出,這是一個典型的QP問題。

(2)帶約束的least squares問題:其一般描述為

這也是一個很典型的QP問題。

(3)Maximum Likelihood for Logistic Regression:該問題的目標函式為:其中g(z)g(z)為Sigmoid函式,

對於凸優化問題,目前沒有一個通用的解析式的 解決方案,但是我們仍然可以用非解析的方法來有效的求解很多問題。內點法被證明是很好的解決方案, 特別具有實用性,在某些問題中,能夠在多項式時間複雜度下,將解精確到指定精度。 



相關文章