問題:越深越好?
層數越多,參數越多,model比較復雜,數據又多的話,本來誤差就越小,這為什么歸因於”深“呢?
矮胖結構 v.s. 高瘦結構
真正要比較”深“和”淺“的model的時候,要讓它們的參數一樣多。
“淺”的model就會是一個矮胖的model,“深”的model就會是一個瘦高的model
選擇兩個參數個數接近的model
- 5層,每層2000個神經元的誤差是17.2
- 1層,每層3772個神經元的誤差是22.5
從上圖看,一層的網絡就算參數個數有16k個,誤差也有22.1,比那個兩層的還要差。這說明單純的增加參數個數,不添加層數的話,效果也不會特別好。
模組化
為什么要添加層數呢?
當我們在做深度學習的時候,相當於在做模組化。
什么是模組化?
比如寫程序,不會把所有功能都寫在main function里。會寫sub1,sub2...,然后main function里調用這些函數,可能sub1,sub2...里還會調用subsub1,subsub2...,做這樣一層層結構化的架構。結構化的好處是可以共用function,例如subsubsub2就被sub1和subsub2共用,減少程序的復雜度。
結構化的思想用在分類上
假設有個task是圖片分類,分成長發女、長發男、短發女、短發男4類,4類都有訓練數據可以訓練一個分類器。
問題就是長發男的訓練數據比較少,那么訓練出來的分類器就很弱。
數據少的分類器效果差怎么辦?
使用模組化的思想,把原問題分解成幾個小問題。先學習一個用來檢測某一種屬性的分類器,例如不是學習長發男、長發女分類器,而是分成是否是男生、是否是長發兩個基本分類器。雖然長發男的數據很少,但是男生、女生、短發和長發的數據足夠,那這兩個基本分類器就不會太差。
訓練最終分類器的時候,就先參考基本分類器的output,基本分類器是共用的。最終分類器只要使用很少的訓練數據,就可以訓練得很好,比如基本分類器輸出是長發、是女生、那么最終輸出是長發女,因為它做的事情是很簡單的,復雜的被基本分類器做了。
深度學習和模組化
把每個神經元看成是一個基本分類器,第一層的神經元是最基本的分類器,第二層的神經元是比較復雜的分類器,把第一層的output作為Input,即把第一層的分類器當做模組,第三層的神經元又把第二層的神經元當做模組,以此類推。
在做深度學習的時候,怎么做模組化是機器自動學習的。
做模組化讓我們的模型變簡單了,把復雜的問題分解成了幾個簡單的問題,因此就算訓練數據沒有很多,簡單的任務也會做得比較好。如果深度學習是模組化的,那么訓練數據就可以比較少的,這個和一般認知是相反的。新聞常常報道AI=big data+deep learning ,於是很多人覺得深度學習有效果是因為大數據。仔細想想並不是這個樣子,假設我們真的有大數據做圖像分類,有全世界的圖片數據庫,那何必做機器學習,直接查找照片給出label就可以了,於是某種程度上機器學習和大數據是相反的,真正有大數據,就不用學習了。就是因為我們沒有足夠的數據,才會去做深度學習。
語音識別舉例
一句話右一連串的音素(人類發音的基本單位)組成
what、think由4個音素組成,do、you由兩個音素組成
同樣的音素可能有不同的發音,當發d uw 和y uw 的時候,心里想要發的是同一個音素uw。但是由於人類口腔器官的限制,每次發的uw可能都不一樣,因為uw前面和后面都接了其他的音素,受到前后音素的影響。為了表達這件事情,給同樣的音素不同的model,這個東西叫做tri-phone。
tri-phone表達方式:第一個uw 加上前面音素d和后面音素y,第二個uw加上前面音素y和后面音素th
tri-phone的意思是一個音素用不同的model來表示,如果一個音素(例如上圖兩個uw)的表達不一樣,我們就用不同的model來模擬這種音素。
一個音素可以拆成幾個狀態,到底幾個是自己決定的,通常定為3個狀態。
怎么做語音識別?
語音識別很復雜,現在只講第一步,第一步要做的事情是把聲學特征轉成state。這是一個單純分類的問題,就跟把一張圖片分成10類一樣,現在input一個聲學特征,然后把它分為哪一個state。
聲學特征是什么?
簡單講input的聲音訊號是一串聲波,在聲波上面取一個窗口(不會太大,例如250微秒),用一組特征來描述窗口里的聲波特性,這個就是聲學特征。
在聲音訊號上,每隔一小段時間取一個窗口,那么聲音訊號就會變成一串向量序列,這個叫做聲學特征序列。語音識別的第一階段就是決定每一個聲學特征屬於哪一個state,需要擬合一個分類器,告訴我們聲學特征屬於state a,state b,state c。光state是沒有用的,要把state轉成音素,再把音素轉成文字,接下來還要考慮同音異字問題。
比較深度學習模型和傳統模型有什么不同,為什么深度學習在語音上會有顯著成果
語音識別第一階段要擬合一個分類器,用來辨別聲學特征屬於哪一個state。
傳統方法例如HMM-GMM,假設每一個state的特征向量的分布是固定的,那就可以用model來描述。
比如上圖d當做中心的tri-phone的第一個state可以用一個GMM來描述
另外一個state可以用另一個GMM來描述。這時候給一個聲學特征,可以算從每個state產生出來的概率。這個東西叫高斯混合模型GMM。
仔細想想這個方法不太work,因為tri-phone的數目太多了,一般中文英文都有將近40個音素。在tri-phone里面,每個音素隨着表達的不同,需要用不同的model,有\(40^3\)個tri-phone,每個tri-phone又有3個state,總共有數萬個state,每個state都用一個GMM描述,那參數太多了,訓練數據完全不夠。
傳統方法里怎么處理參數太多的問題?
有一些state共用同樣的model分布,這個事情叫做Tied-state,到底哪些共用要憑經驗和語言學的知識。
什么叫做共用同樣的分布?
假如寫程序的時候,不同的state的名稱,就像是指針一樣,不同的指針有可能指向同樣的分布。
但是只是了解state是否共用是不夠的,有人提出部分共用等等。
比較創新火的方法叫做subspace GMM,里面有模組化的影子。原來每一個state有一個分布,在subspace GMM里,先把很多的高斯分布找出來組成一個高斯池,那每一個state的信息就是一個鍵,鍵值對應state要用到的部分高斯分布。那有些時候state就會共享部分的高斯分布,有些時候又可以完全不共享高斯分布。具體共享多少個高斯分布是從訓練數據中學習出來的。
仔細想想HMM-GMM方法,所有的音素或者state是基於獨立模型的,這件事情是低效率的。想想看人類的聲音,不同的音素,雖然被分成不同的類,但這些音素之間不是完全無關的,都是由發音器官生成的,根據人類發音方式音素之間是有關系的。
例如上圖畫出了人類語言里所有的母音,母音發音只受到三件事情的影響。一個是舌頭前后的位置,一個是舌頭上下的位置,還有一個是嘴型。上圖常見的5個英文母音a,e,i,o,u,當從a發音到e到i的時候,舌頭由下往上,i和u是舌頭前后的差別。發音a,e,i,o,u,就會像上圖一樣。
上圖同一個位置不同母音代表舌頭的位置是一樣的,但是嘴型不一樣。比如左上角i和y(yi和yu),i的嘴型比較扁,y的嘴型比較圓。所以說不同的音素之間是有關系的,那每個音素都有自己的一個model,這件事情是沒有效率的。
那深度學習是怎么做的?
學習一個DNN,input是聲學特征,output是每個特征屬於哪個state的概率,是一個單純的分類器。
這里最關鍵的是所有的state共用一個DNN。很多人覺得從GMM變到深度學習厲害的地方就是本來GMM通常最多做64個高斯混合模型,DNN有10層,每層1000個神經元,參數變多了,效果變好了,是一個暴力碾壓的方法。
但其實DNN不是暴力碾壓的方法,在做HMM-GMM的時候,說GMM只有64個混合,好像很簡單,但是每個state都有一個高斯混合模型,真正合起來參數也很多,其實GMM和DNN的參數是差不多的。DNN是一個很大的model,GMM有很多小的model,DNN用同一個model給state分類是更有效率的做法。
為什么DNN是比較有效率的做法?
如果把DNN某個隱藏層拿出來,有1000個神經元這樣沒法分析,但是可以把1000個神經元的output降維到2維。
上圖左下方,每個點代表一個聲學特征,是把通過DNN后的output降維到二維的分布。圖上的顏色是a,e,i,o,u 5個母音,用和右上圖同樣顏色框起來。神奇的是左下圖5個母音的分布和右上圖5個母音的分布幾乎是一樣。所以DNN比較靠前的隱藏層做的事情,不是馬上去對input(發音)做分類判斷是屬於哪一個音素或是哪一個state,而是先去觀察,當你聽到這個發音的時候,人是用什么樣的方式在發這個音,舌頭的位置在哪里,舌頭是高還是低、是前還是后等等。比較靠后的隱藏層知道了發音的方式之后,再去判斷發音是屬於哪一個音素或者哪一個state。
那么比較靠前的隱藏層用來檢測發音方式,且所有的音素共用參數,利用到了模組化的特性,用比較少的參數來做有效率的事情。
普遍性定理
任何連續的函數都可以用一層的神經網絡來擬合,只要這層夠寬。這也是以前很多人放棄使用“深度”的原因,做一層就可以擬合所有函數,那“深度”意義何在。不過這個理論只告訴我們有這個可能性,沒告訴我們有多效率。的確只要參數足夠多,就可以擬合任何的函數,但只做一層然后去找很多參數這個事情是低效率的。當你有多層時,則更有效率。
用電路來解釋“深度”更有效率
邏輯電路跟神經網絡類比。邏輯電路是由一堆邏輯閘(AND gate,NOR gate 與門和非門)組成,神經網絡由一堆神經元組成。只要兩層邏輯閘,就可以表示任何的布爾函數。那一個隱藏層的神經網絡,也是兩層,有一個輸入層,一個隱藏層,一個輸出層,那么這個神經網絡可以表示任何函數也不會特別讓人驚訝。
雖然只用兩層邏輯閘就可以描述任何的布爾函數,但是實際做電路設計的時候,不可能只用兩層。因為做層級架構時,使用多層結構更有效率。類比到神經網絡,多層(“深度”)網絡更有效率,達到同樣效果時,多層可以使用較少的神經元,意味着較少的參數,不容易過擬合,需要的數據量也更少。
許多人覺得深度學習就是很多數據訓練很多參數碾壓過去,其實不是,我們做深度學習的時候,使用多層結構可以用較少的數據量完成同樣效果的任務。
邏輯電路這再舉一個例子
假設要設計一個電路做奇偶校驗,即input一串二元數字,如果1的次數是偶數的話,output為1,否則為0。
如果input的序列長度有1bit,理論上用兩層的話,需要\(2^d\)個門才可以描述這個電路。
如果使用多層架構,例如上圖把好幾個XBOR接在一起,input1和0后,輸出方式如右上圖。input1和0,output就是0;input 0 和0,output就是1。這時只需要O(d)個門就可以完成之前的任務了。
使用多層架構,使用比較少的邏輯閘,可以做到同樣的事情。這對神經網絡來說也是一樣的,多層可以使用更少的神經元。
用剪窗花來解釋“深度”更有效率
剪一個窗花,先折起來,再剪。
這個和深度學習有什么關系?
假設input的點有4個,紅色的一類,藍色的一類。如果沒有隱藏層的話,就是一個線性的model,怎么做都無法完全分開紅色和藍色。加上隱藏層之后,就做了一個特征的轉換,把原來的\(x_1,x_2\)轉換到另外一個平面變成\(x_1',x_2'\)。變化到上圖右下所示, 兩個藍色的點都跑到(0.27,0.27),重合了,就好像把原來的平面對折了。就像剪窗花,先把色紙對折,對折后戳一個洞,打開后就會有好多個洞。
把剪窗花看成train,把剪色紙看成根據訓練數據訓練分離線,例如上圖右上,有斜線的地方是positive 樣本,沒有斜線的地方是negative 樣本,假設平面像色紙一樣折起來了,那么根據訓練數據訓練一個簡單的分離線,展開后就會變成一個復雜的分離超平面。本來訓練數據集只是說有一個簡單的分離線,但是經過空間對折后,展開后就是一個非常復雜的分離超平面。或者戳一個洞,展開后就有5個洞,一筆數據可以發揮5筆數據的效用。
所以深度學習是比較有效率的方式來使用訓練數據。
一個toy example
有一個地毯形狀的函數,輸入是為二維的(坐標),輸出是0和1,紅色菱形范圍內輸出是1,藍色菱形范圍內輸出是0。現在考慮使用不同的訓練數據集,用一個隱藏層和三個隱藏層是怎樣的情境,一個隱藏層的參數個數調整為接近於三個隱藏層的,那一個隱藏層的神經網絡很胖,三個隱藏層的神經網絡就比較瘦。
現在給出100000個樣本,兩個神經網絡都可以學出地毯的形狀。
現在減少到20000個樣本,兩個神經網絡的結構都崩壞了,但是三個隱藏層是有次序的崩壞,最后得到的結果還算可以。
端到端學習
深度學習可以做端到端學習
什么是端到端學習?
我們知道解一個機器學習問題時,先要找一個假定的函數集合(model)。有時候要處理的問題非常復雜時,這個model里就是一個生產線,就是說一個復雜的函數是由幾個簡單的函數串接在一起的。例如語音識別時,要先把聲音訊號input進去,通過很多層函數,一層層轉換,最后輸出文字。
端到端學習就是你只給model輸入和輸出,不規定中間每一個函數怎么分工,而讓model自己去學習生產線里的每一個函數應該做什么事情。在深度學習里做這件事情就是疊一個很深的神經網絡,每一層都是生產線上一個簡單的函數,每一層會自己學習應該做什么。
在沒有深度學習的時代,只有淺層學習時,要怎么把聲音訊號轉化成文字?
要先做DFT(生產線上某個函數),然后變成頻譜圖,再通過濾波器組(生產線上另外一個函數)得到output,再取log,再做DCT,最后得到MFCC丟進GMM里,得到語音識別的結果。GMM換成DNN也會有很顯著的提升。
整個生產線上,只有GMM(藍色部分)是訓練數據學出來的,前面綠色部分都是手工制定的。專家研究了各種人類的生理知識,制定出了綠色部分的函數,效果非常好,改一點都會使效果變差。
進入深度學習時代
有了深度學習后,可以把綠色部分用神經網絡取代掉,給神經網絡多加幾層,就可以把DCT拿掉。之后比較多的是從log 輸出開始做,神經網絡深一點,就可以得到比較好的結果。現在甚至可以從頻譜圖那里開始做,把后面的部分都用深度神經網絡取代掉。如果分析深度神經網絡的權重,會發現可以自動學到要做濾波器組這件事情(模擬人類聽覺器官所指定的filter)。
能不能疊一個很深很深的神經網絡,輸入直接就是聲音訊號,輸出就是文字,然后中間就不用做特征變換之類的?
最好的神經網絡效果也就跟做了特征變換的model持平。
圖像識別也是類似,傳統也是有很多手工定制的特征函數,最后使用一個分類器。現在直接上一個很深的神經網絡,輸入就是像素點,輸出就是圖片類別,不需要再手工抽取特征了。
更復雜的任務
實際任務是很復雜的。
有時候非常類似的輸入,輸出是相差很大的。例如圖片識別里白色的狗和北極熊看起來很像。
有時候看起來相差很大的輸入,輸出是一樣的。例如上圖里兩個火車。
假設神經網絡只有一層,就沒有辦法把一樣的東西變得不一樣,把不一樣的東西變得很像。要做輸入類似,輸出相異,需要做很多層次的轉換。
舉例:語音的例子
上圖做的事是把MFCC投影到二維的平面上,不同的顏色代表不同的人說的句子。發現同樣的句子,不同的人說,聲音訊號看起來非常不一樣。如果只有一個隱藏層的神經網絡,會發現不同的人講的同一個句子,看起來很不一樣。但是用有8個隱藏層的神經網絡,發現不同的人說的同一個句子被自動的align在一起。
看手寫識別的例子:
input是28*28的像素點,轉換到2維平面,看起來是上圖左上的樣子,4和9幾乎是重疊在一起,很像都是一個圈圈加上一條線。 看一個隱藏層的神經網絡,發現4和9還是很像,但是分開了一點,看2個隱藏層的,會發現4和9分得更開了,三個隱藏層又更開了。