如何簡單形象又有趣地講解神經網路是什麼?
有網友在 Quora 上提問:對於那些非計算機科學行業的人,你會如何向他們解釋機器學習和數據挖掘?
斯坦福大學的印度學生、機器學習愛好者 PararthShah 在2012年12月22日的使用買芒果的例子,非常經典易懂。
如何用類似的方法來解釋神經網路?
神經網路很萌的!
0. 分類神經網路最重要的用途是分類,為了讓大家對分類有個直觀的認識,咱們先看幾個例子:
- 垃圾郵件識別:現在有一封電子郵件,把出現在裡面的所有辭彙提取出來,送進一個機器里,機器需要判斷這封郵件是否是垃圾郵件。
- 疾病判斷:病人到醫院去做了一大堆肝功、尿檢測驗,把測驗結果送進一個機器里,機器需要判斷這個病人是否得病,得的什麼病。
- 貓狗分類:有一大堆貓、狗照片,把每一張照片送進一個機器里,機器需要判斷這幅照片里的東西是貓還是狗。
這種能自動對輸入的東西進行分類的機器,就叫做分類器。
分類器的輸入是一個數值向量,叫做特徵(向量)。在第一個例子里,分類器的輸入是一堆0、1值,表示字典里的每一個詞是否在郵件中出現,比如向量(1,1,0,0,0......)就表示這封郵件里只出現了兩個詞abandon和abnormal;第二個例子里,分類器的輸入是一堆化驗指標;第三個例子里,分類器的輸入是照片,假如每一張照片都是320*240像素的紅綠藍三通道彩色照片,那麼分類器的輸入就是一個長度為320*240*3=230400的向量。
分類器的輸出也是數值。第一個例子中,輸出1表示郵件是垃圾郵件,輸出0則說明郵件是正常郵件;第二個例子中,輸出0表示健康,輸出1表示有甲肝,輸出2表示有乙肝,輸出3表示有餅乾等等;第三個例子中,輸出0表示圖片中是狗,輸出1表示是貓。
分類器的目標就是讓正確分類的比例儘可能高。一般我們需要首先收集一些樣本,人為標記上正確分類結果,然後用這些標記好的數據訓練分類器,訓練好的分類器就可以在新來的特徵向量上工作了。
1. 神經元
咱們假設分類器的輸入是通過某種途徑獲得的兩個值,輸出是0和1,比如分別代表貓和狗。現在有一些樣本:
大家想想,最簡單地把這兩組特徵向量分開的方法是啥?當然是在兩組數據中間畫一條豎直線,直線左邊是狗,右邊是貓,分類器就完成了。以後來了新的向量,凡是落在直線左邊的都是狗,落在右邊的都是貓。
大家想想,最簡單地把這兩組特徵向量分開的方法是啥?當然是在兩組數據中間畫一條豎直線,直線左邊是狗,右邊是貓,分類器就完成了。以後來了新的向量,凡是落在直線左邊的都是狗,落在右邊的都是貓。
一條直線把平面一分為二,一個平面把三維空間一分為二,一個n-1維超平面把n維空間一分為二,兩邊分屬不同的兩類,這種分類器就叫做神經元。
大家都知道平面上的直線方程是,等式左邊大於零和小於零分別表示點在直線的一側還是另一側,把這個式子推廣到n維空間里,直線的高維形式稱為超平面,它的方程是:
神經元就是當h大於0時輸出1,h小於0時輸出0這麼一個模型,它的實質就是把特徵空間一切兩半,認為兩瓣分別屬兩個類。你恐怕再也想不到比這更簡單的分類器了,它是McCulloch和Pitts在1943年想出來了。
這個模型有點像人腦中的神經元:從多個感受器接受電信號,進行處理(加權相加再偏移一點,即判斷輸入是否在某條直線的一側),發出電信號(在正確的那側發出1,否則不發信號,可以認為是發出0),這就是它叫神經元的原因。
當然,上面那幅圖我們是開了上帝視角才知道「一條豎直線能分開兩類」,在實際訓練神經元時,我們並不知道特徵是怎麼抱團的。神經元模型的一種學習方法稱為Hebb演算法:
先隨機選一條直線/平面/超平面,然後把樣本一個個拿過來,如果這條直線分錯了,說明這個點分錯邊了,就稍微把直線移動一點,讓它靠近這個樣本,爭取跨過這個樣本,讓它跑到直線正確的一側;如果直線分對了,它就暫時停下不動。因此訓練神經元的過程就是這條直線不斷在跳舞,最終跳到兩個類之間的豎直線位置。
2. 神經網路
MP神經元有幾個顯著缺點。首先它把直線一側變為0,另一側變為1,這東西不可微,不利於數學分析。人們用一個和0-1階躍函數類似但是更平滑的函數Sigmoid函數來代替它(Sigmoid函數自帶一個尺度參數,可以控制神經元對離超平面距離不同的點的響應,這裡忽略它),從此神經網路的訓練就可以用梯度下降法來構造了,這就是有名的反向傳播演算法。
解決辦法是多層神經網路,底層神經元的輸出是高層神經元的輸入。我們可以在中間橫著砍一刀,豎著砍一刀,然後把左上和右下的部分合在一起,與右上的左下部分分開;也可以圍著左上角的邊沿砍10刀把這一部分先挖出來,然後和右下角合併。
解決辦法是多層神經網路,底層神經元的輸出是高層神經元的輸入。我們可以在中間橫著砍一刀,豎著砍一刀,然後把左上和右下的部分合在一起,與右上的左下部分分開;也可以圍著左上角的邊沿砍10刀把這一部分先挖出來,然後和右下角合併。
每砍一刀,其實就是使用了一個神經元,把不同砍下的半平面做交、並等運算,就是把這些神經元的輸出當作輸入,後面再連接一個神經元。這個例子中特徵的形狀稱為異或,這種情況一個神經元搞不定,但是兩層神經元就能正確對其進行分類。
只要你能砍足夠多刀,把結果拼在一起,什麼奇怪形狀的邊界神經網路都能夠表示,所以說神經網路在理論上可以表示很複雜的函數/空間分布。但是真實的神經網路是否能擺動到正確的位置還要看網路初始值設置、樣本容量和分布。
神經網路神奇的地方在於它的每一個組件非常簡單——把空間切一刀+某種激活函數(0-1階躍、sigmoid、max-pooling),但是可以一層一層級聯。輸入向量連到許多神經元上,這些神經元的輸出又連到一堆神經元上,這一過程可以重複很多次。這和人腦中的神經元很相似:每一個神經元都有一些神經元作為其輸入,又是另一些神經元的輸入,數值向量就像是電信號,在不同神經元之間傳導,每一個神經元只有滿足了某種條件才會發射信號到下一層神經元。當然,人腦比神經網路模型複雜很多:人工神經網路一般不存在環狀結構;人腦神經元的電信號不僅有強弱,還有時間緩急之分,就像莫爾斯電碼,在人工神經網路里沒有這種複雜的信號模式。
神經網路的訓練依靠反向傳播演算法:最開始輸入層輸入特徵向量,網路層層計算獲得輸出,輸出層發現輸出和正確的類號不一樣,這時它就讓最後一層神經元進行參數調整,最後一層神經元不僅自己調整參數,還會勒令連接它的倒數第二層神經元調整,層層往回退著調整。經過調整的網路會在樣本上繼續測試,如果輸出還是老分錯,繼續來一輪迴退調整,直到網路輸出滿意為止。這很像中國的文藝體制,武媚娘傳奇劇組就是網路中的一個神經元,最近剛剛調整了參數。
3. 大型神經網路
我們不禁要想了,假如我們的這個網路有10層神經元,第8層第2015個神經元,它有什麼含義呢?我們知道它把第七層的一大堆神經元的輸出作為輸入,第七層的神經元又是以第六層的一大堆神經元做為輸入,那麼這個特殊第八層的神經元,它會不會代表了某種抽象的概念?
就好比你的大腦里有一大堆負責處理聲音、視覺、觸覺信號的神經元,它們對於不同的信息會發出不同的信號,那麼會不會有這麼一個神經元(或者神經元小集團),它收集這些信號,分析其是否符合某個抽象的概念,和其他負責更具體和更抽象概念的神經元進行交互。
2012年多倫多大學的Krizhevsky等人構造了一個超大型卷積神經網路[1],有9層,共65萬個神經元,6千萬個參數。網路的輸入是圖片,輸出是1000個類,比如小蟲、美洲豹、救生船等等。這個模型的訓練需要海量圖片,它的分類準確率也完爆先前所有分類器。紐約大學的Zeiler和Fergusi[2]把這個網路中某些神經元挑出來,把在其上響應特別大的那些輸入圖像放在一起,看它們有什麼共同點。他們發現中間層的神經元響應了某些十分抽象的特徵。
第一層神經元主要負責識別顏色和簡單紋理第二層的一些神經元可以識別更加細化的紋理,比如布紋、刻度、葉紋。
第三層的一些神經元負責感受黑夜裡的黃色燭光、雞蛋黃、高光。
第四層的一些神經元負責識別萌狗的臉、七星瓢蟲和一堆圓形物體的存在。
第五層的一些神經元可以識別出花、圓形屋頂、鍵盤、鳥、黑眼圈動物。
這裡面的概念並不是整個網路的輸出,是網路中間層神經元的偏好,它們為後面的神經元服務。雖然每一個神經元都傻不拉幾的(只會切一刀),但是65萬個神經元能學到的東西還真是深邃呢。
[1] Krizhevsky, A., Sutskever, I., Hinton, G. E. (2012). Imagenet classification with deep convolutional neural networks. In Advances in neural information processing systems (pp. 1097-1105).[2] Zeiler, M. D., Fergus, R. (2013). Visualizing and understanding convolutional neural networks. arXiv preprint arXiv:1311.2901.
深度學習通俗易懂教程專欄超智能體 - 知乎專欄
閱讀列表:
- 深層神經網路:深層學習為何要「Deep」(上)(由於下篇寫的並不通俗,不推薦閱讀,用公開課代替)
- 反向傳播演算法實例:未編寫
- 深度學習總覽:公開課:深層神經網路設計理念
- 深度學習入門誤區:知乎Live(公開課涵蓋了Live的內容,若覺得作者辛苦也可參加)
- Tensorflow :TensorFlow整體把握
- 前饋神經網路(1):前饋神經網路--代碼LV1
- 前饋神經網路(2):前饋神經網路--代碼LV2
- 前饋神經網路(3):前饋神經網路--代碼LV3
- 循環神經網路(1):循環神經網路--介紹
- 循環神經網路(2):循環神經網路--實現LSTM
- 循環神經網路(3):循環神經網路--scan實現LSTM
- 循環神經網路(4):循環神經網路--雙向GRU
- 卷積神經網路(1):卷積神經網路--介紹
以下是正文
一、基本變換:層
神經網路是由一層一層構建的,那麼每層究竟在做什麼?
- 數學式子:,其中是輸入向量,是輸出向量,是偏移向量,是權重矩陣,是激活函數。每一層僅僅是把輸入經過如此簡單的操作得到。
- 數學理解:通過如下5種對輸入空間(輸入向量的集合)的操作,完成 輸入空間 ——&> 輸出空間 的變換 (矩陣的行空間到列空間)。
註:用「空間」二字的原因是被分類的並不是單個事物,而是一類事物。空間是指這類事物所有個體的集合。 - 1. 升維/降維
- 2. 放大/縮小
- 3. 旋轉
- 4. 平移
- 5. 「彎曲」
這5種操作中,1,2,3的操作由完成,4的操作是由完成,5的操作則是由來實現。 (此處有動態圖5種空間操作,幫助理解)
每層神經網路的數學理解:用線性變換跟隨著非線性變化,將輸入空間投向另一個空間。
- 物理理解:對 的理解就是通過組合形成新物質。又符合了我們所處的世界都是非線性的特點。
- 情景:是二維向量,維度是碳原子和氧原子的數量,數值且定為,若確定是三維向量,就會形成如下網路的形狀 (神經網路的每個節點表示一個維度)。通過改變權重的值,可以獲得若干個不同物質。右側的節點數決定了想要獲得多少種不同的新物質。(矩陣的行數)
- 1.如果權重W的數值如(1),那麼網路的輸出y? 就會是三個新物質,[二氧化碳,臭氧,一氧化碳]。 (1)
- 2.也可以減少右側的一個節點,並改變權重W至(2),那麼輸出 就會是兩個新物質,。 (2)
- 3.如果希望通過層網路能夠從[C, O]空間轉變到空間的話,那麼網路的學習過程就是將W的數值變成儘可能接近(1)的過程 。如果再加一層,就是通過組合這三種基礎物質,形成若干更高層的物質。 4.重要的是這種組合思想,組合成的東西在神經網路中並不需要有物理意義。
每層神經網路的物理理解:通過現有的不同物質的組合形成新物質。
二、理解視角:
現在我們知道了每一層的行為,但這種行為又是如何完成識別任務的呢?
數學視角:「線性可分」
- 一維情景:以分類為例,當要分類正數、負數、零,三類的時候,一維空間的直線可以找到兩個超平面(比當前空間低一維的子空間。當前空間是直線的話,超平面就是點)分割這三類。但面對像分類奇數和偶數無法找到可以區分它們的點的時候,我們藉助 x % 2(取余)的轉變,把x變換到另一個空間下來比較,從而分割。
- 二維情景:平面的四個象限也是線性可分。但下圖的紅藍兩條線就無法找到一超平面去分割。
神經網路的解決方法依舊是轉換到另外一個空間下,用的是所說的5種空間變換操作。比如下圖就是經過放大、平移、旋轉、扭曲原二維空間後,在三維空間下就可以成功找到一個超平面分割紅藍兩線 (同SVM的思路一樣)。
上面是一層神經網路可以做到的,如果把 當做新的輸入再次用這5種操作進行第二遍空間變換的話,網路也就變為了二層。最終輸出是。
設想網路擁有很多層時,對原始輸入空間的「扭曲力」會大幅增加,如下圖,最終我們可以輕鬆找到一個超平面分割空間。
當然也有如下圖失敗的時候,關鍵在於「如何扭曲空間」。所謂監督學習就是給予神經網路網路大量的訓練例子,讓網路從訓練例子中學會如何變換空間。每一層的權重W就控制著如何變換空間,我們最終需要的也就是訓練好的神經網路的所有層的權重矩陣。
這裡有非常棒的可視化空間變換demo,一定要打開嘗試並感受這種扭曲過程。更多內容請看Neural Networks, Manifolds, and Topology。
線性可分視角:神經網路的學習就是學習如何利用矩陣的線性變換加激活函數的非線性變換,將原始輸入空間投向線性可分/稀疏的空間去分類/回歸。 增加節點數:增加維度,即增加線性轉換能力。 增加層數:增加激活函數的次數,即增加非線性轉換次數。
物理視角:「物質組成」
- 類比:回想上文由碳氧原子通過不同組合形成若干分子的例子。從分子層面繼續迭代這種組合思想,可以形成DNA,細胞,組織,器官,最終可以形成一個完整的人。繼續迭代還會有家庭,公司,國家等。這種現象在身邊隨處可見。並且原子的內部結構與太陽系又驚人的相似。不同層級之間都是以類似的幾種規則再不斷形成新物質。你也可能聽過分形學這三個字。可通過觀看從1米到150億光年來感受自然界這種層級現象的普遍性。
- 人臉識別情景:我們可以模擬這種思想並應用在畫面識別上。由像素組成菱角再組成五官最後到不同的人臉。每一層代表不同的不同的物質層面 (如分子層)。而每層的W存儲著如何組合上一層的物質從而形成新物質。
如果我們完全掌握一架飛機是如何從分子開始一層一層形成的,拿到一堆分子後,我們就可以判斷他們是否可以以此形成方式,形成一架飛機。
附:Tensorflow playground展示了數據是如何「流動」的。
物質組成視角:神經網路的學習過程就是學習物質組成方式的過程。 增加節點數:增加同一層物質的種類,比如118個元素的原子層就有118個節點。 增加層數:增加更多層級,比如分子層,原子層,器官層,並通過判斷更抽象的概念來識別物體。
三、神經網路的訓練
知道了神經網路的學習過程就是學習控制著空間變換方式(物質組成方式)的權重矩陣後,接下來的問題就是如何學習每一層的權重矩陣W。
如何訓練:
既然我們希望網路的輸出儘可能的接近真正想要預測的值。那麼就可以通過比較當前網路的預測值和我們真正想要的目標值,再根據兩者的差異情況來更新每一層的權重矩陣(比如,如果網路的預測值高了,就調整權重讓它預測低一些,不斷調整,直到能夠預測出目標值)。因此就需要先定義「如何比較預測值和目標值的差異」,這便是損失函數或目標函數(loss function or objective function),用于衡量預測值和目標值的差異的方程。loss function的輸出值(loss)越高表示差異性越大。那神經網路的訓練就變成了儘可能的縮小loss的過程。
所用的方法是梯度下降(Gradient descent):通過使loss值向當前點對應梯度的反方向不斷移動,來降低loss。一次移動多少是由學習速率(learning rate)來控制的。
梯度下降的問題:
然而使用梯度下降訓練神經網路擁有兩個主要難題。
1、局部極小值
梯度下降尋找的是loss function的局部極小值,而我們想要全局最小值。如下圖所示,我們希望loss值可以降低到右側深藍色的最低點,但loss有可能「卡」在左側的局部極小值中。
試圖解決「卡在局部極小值」問題的方法分兩大類:
- 調節步伐:調節學習速率,使每一次的更新「步伐」不同。常用方法有:
- 隨機梯度下降(Stochastic Gradient Descent (SGD):每次只更新一個樣本所計算的梯度
- 小批量梯度下降(Mini-batch gradient descent):每次更新若干樣本所計算的梯度的平均值
- 動量(Momentum):不僅僅考慮當前樣本所計算的梯度;Nesterov動量(Nesterov Momentum):Momentum的改進
- Adagrad、RMSProp、Adadelta、Adam:這些方法都是訓練過程中依照規則降低學習速率,部分也綜合動量
- 優化起點:合理初始化權重(weights initialization)、預訓練網路(pre-train),使網路獲得一個較好的「起始點」,如最右側的起始點就比最左側的起始點要好。常用方法有:高斯分布初始權重(Gaussian distribution)、均勻分布初始權重(Uniform distribution)、Glorot 初始權重、He初始權、稀疏矩陣初始權重(sparse matrix)
2、梯度的計算
機器學習所處理的數據都是高維數據,該如何快速計算梯度、而不是以年來計算。
其次如何更新隱藏層的權重?
解決方法是:計算圖:反向傳播演算法
這裡的解釋留給非常棒的Computational Graphs: Backpropagation
需要知道的是,反向傳播演算法是求梯度的一種方法。如同快速傅里葉變換(FFT)的貢獻。
而計算圖的概念又使梯度的計算更加合理方便。
基本流程圖:
下面就結合圖簡單瀏覽一下訓練和識別過程,並描述各個部分的作用。要結合圖解閱讀以下內容。但手機顯示的圖過小,最好用電腦打開。
- 收集訓練集(train data):也就是同時有input以及對應label的數據。每個數據叫做訓練樣本(sample)。label也叫target,也是機器學習中最貴的部分。上圖表示的是我的資料庫。假設input本別是x的維度是39,label的維度是48。
- 設計網路結構(architecture):確定層數、每一隱藏層的節點數和激活函數,以及輸出層的激活函數和損失函數。上圖用的是兩層隱藏層(最後一層是輸出層)。隱藏層所用激活函數a( )是ReLu,輸出層的激活函數是線性linear(也可看成是沒有激活函數)。隱藏層都是1000節點。損失函數L( )是用於比較距離MSE:mean((output - target)^2)。MSE越小表示預測效果越好。訓練過程就是不斷減小MSE的過程。到此所有數據的維度都已確定:
- 訓練數據:
- 權重矩陣:
- 偏移向量:
- 網路輸出:
- 數據預處理(preprocessing):將所有樣本的input和label處理成能夠使用神經網路的數據,label的值域符合激活函數的值域。並簡單優化數據以便讓訓練易於收斂。比如中心化(mean subtraction)、歸一化(normlization)、主成分分析(PCA)、白化(whitening)。假設上圖的input和output全都經過了中心化和歸一化。
- 權重初始化(weights initialization):在訓練前不能為空,要初始化才能夠計算loss從而來降低。初始化決定了loss在loss function中從哪個點開始作為起點訓練網路。上圖用均勻分布初始權重(Uniform distribution)。
- 訓練網路(training):訓練過程就是用訓練數據的input經過網路計算出output,再和label計算出loss,再計算出gradients來更新weights的過程。
- 正向傳遞:,算當前網路的預測值
- 計算loss:
- 計算梯度:從loss開始反向傳播計算每個參數(parameters)對應的梯度(gradients)。這裡用Stochastic Gradient Descent (SGD) 來計算梯度,即每次更新所計算的梯度都是從一個樣本計算出來的。傳統的方法Gradient Descent是正向傳遞所有樣本來計算梯度。SGD的方法來計算梯度的話,loss function的形狀如下圖所示會有變化,這樣在更新中就有可能「跳出」局部最小值。
- 更新權重:這裡用最簡單的方法來更新,即所有參數都
- 預測新值:訓練過所有樣本後,打亂樣本順序再次訓練若干次。訓練完畢後,當再來新的數據input,就可以利用訓練的網路來預測了。這時的output就是效果很好的預測值了。下圖是一張實際值和預測值的三組對比圖。輸出數據是48維,這裡只取1個維度來畫圖。藍色的是實際值,綠色的是實際值。最上方的是訓練數據的對比圖,而下方的兩行是神經網路模型從未見過的數據預測對比圖。(不過這裡用的是RNN,主要是為了讓大家感受一下效果)
註:此部分內容不是這篇文章的重點,但為了理解深層神經網路,需要明白最基本的訓練過程。
若能理解訓練過程是通過梯度下降儘可能縮小loss的過程即可。
若有理解障礙,可以用python實踐一下從零開始訓練一個神經網路,體會整個訓練過程。若有時間則可以再體會一下計算圖自動求梯度的方便利用TensorFlow。
結合Tensorflow playground理解5種空間操作和物質組成視角
打開網頁後,總體來說,藍色代表正值,黃色代表負值。拿分類任務來分析。
- 數據:在二維平面內,若干點被標記成了兩種顏色。黃色,藍色,表示想要區分的兩類。你可以把平面內的任意點標記成任意顏色。網頁給你提供了4種規律。神經網路會根據你給的數據訓練,再分類相同規律的點。
- 輸入:在二維平面內,你想給網路多少關於「點」的信息。從顏色就可以看出來,左邊是負,右邊是正,表示此點的橫坐標值。同理,表示此點的縱坐標值。是關於橫坐標值的「拋物線」信息。你也可以給更多關於這個點的信息。給的越多,越容易被分開。
- 連接線:表示權重,藍色表示用神經元的原始輸出,黃色表示用負輸出。深淺表示權重的絕對值大小。滑鼠放在線上可以看到具體值。也可以更改。在(1)中,當把輸出的一個權重改為-1時,的形狀直接倒置了。不過還需要考慮激活函數。(1)中用的是linear。在(2)中,當換成sigmoid時,你會發現沒有黃色區域了。因為sigmoid的值域是(0,1)
(1)
(2)
- 輸出:黃色背景顏色都被歸為黃點類,藍色背景顏色都被歸為藍點類。深淺表示可能性的強弱。
上圖中所有在黃色背景顏色的點都會被分類為「黃點「,同理,藍色區域被分成藍點。在上面的分類分布圖中你可以看到每一層通過上一層信息的組合所形成的。權重(那些連接線)控制了「如何組合」。神經網路的學習也就是從數據中學習那些權重。Tensorflow playground所表現出來的現象就是「在我文章里所寫的「物質組成思想」,這也是為什麼我把Tensorflow playground放在了那一部分。
不過你要是把Tensorflow的個名字拆開來看的話,是tensor(張量)的flow(流動)。Tensorflow playground的作者想要闡述的側重點是「張量如何流動」的。
5種空間變換的理解:Tensorflow playground下沒有體現5種空間變換的理解。需要打開這個網站嘗試:ConvNetJS demo: Classify toy 2D data
左側是原始輸入空間下的分類圖,右側是轉換後的高維空間下的扭曲圖。
最終的扭曲效果是所有綠點都被扭曲到了一側,而所有紅點都被扭曲到了另一側。這樣就可以線性分割(用超平面(這裡是一個平面)在中間分開兩類)
四、「深層」的思考:真的只有這些原因嗎?
文章的最後稍微提一下深層神經網路。深層神經網路就是擁有更多層數的神經網路。
按照上文在理解視角中所述的觀點,可以想出下面兩條理由關於為什麼更深的網路會更加容易識別,增加容納變異體(variation)(紅蘋果、綠蘋果)的能力、魯棒性(robust)。
數學視角:變異體(variation)很多的分類的任務需要高度非線性的分割曲線。不斷的利用那5種空間變換操作將原始輸入空間像「捏橡皮泥一樣」在高維空間下捏成更為線性可分/稀疏的形狀。 物理視角:通過對「抽象概念」的判斷來識別物體,而非細節。比如對「飛機」的判斷,即便人類自己也無法用語言或者若干條規則來解釋自己如何判斷一個飛機。因為人腦中真正判斷的不是是否「有機翼」、「能飛行」等細節現象,而是一個抽象概念。層數越深,這種概念就越抽象,所能涵蓋的變異體就越多,就可以容納戰鬥機,客機等很多種不同種類的飛機。
先來認識下真正的神經元。
圖1:典型神經元的結構(來自維基百科「樹突」詞條)
神經元大致可以分為樹突、突觸、細胞體和軸突。樹突為神經元的輸入通道,其功能是將其他神經元的動作電位傳遞至細胞體。其他神經元的動作電位藉由位於樹突分支上的多個突觸傳遞至樹突上。神經細胞可以視為有兩種狀態的機器,激活時為「是」,不激活時為「否」。神經細胞的狀態取決於從其他神經細胞接收到的信號量,以及突觸的性質(抑制或加強)。當信號量超過某個閾值時,細胞體就會被激活,產生電脈衝。電脈衝沿著軸突並通過突觸傳遞到其它神經元。(內容來自維基百科「感知機」詞條,稍作整理)
我們的視覺系統非常複雜。大致來講,當光線投射到視網膜後,視覺膜上的光感受細胞的突觸直接與雙極細胞相連,雙極細胞突觸則與最外層的節細胞相連,節細胞將動作電位傳遞到大腦。我們的視網膜有大約1億3千萬個光感受細胞接收光信號,然後通過大約120萬個節細胞軸突將信息從視網膜傳遞到大腦。(內容來自維基百科「視覺系統」詞條)
視覺系統使我們有了視知覺能力,將外部世界的二維投射重構為三維世界。
人類的視覺系統可以毫不費力的識別出下面圖片中的數字(當然還有文字)。但如果讓計算機來識別,就會明顯感覺到視覺識別的困難。
圖2:街道地址(來源於維基百科「Handwriting recognition」詞條)
我們不能簡單地把「數字2像一隻水面上的天鵝,數字7像一把鋤頭」這樣的規則教給計算機。因此,我們需要把手寫識別的問題表述成計算機可以理解的方式。
圖3:水面上的天鵝像極了數字2
假設我們有5x5像素的圖片來顯示每個數字,例如數字2表示如下:
@@@@@
. . . . @
@@@@@
@. . . .
@@@@@
由於我們的神經網路是以數字組成向量作為輸入的,所以我們將每個圖片轉換成長度為25的向量,其元素的值是1(「這個像素位於該圖像中」)或0(「這個像素不在該圖像中」)
例如,數字2可以表示為:
two_digit=[1,1,1,1,1
0,0,0,0,1
1,1,1,1,1
1,0,0,0,0
1,1,1,1,1]
我們希望神經網路最終的輸出是一個具體的數字,因此我們需要10個不同的輸出結果。例如,對於數字2,正確的輸出結果將是:
[0,0,1,0,0,0,0,0,0,0]
圖4:使用python列表解析式建立一個代表0-9不同數字的列表
其中targets[2]就是輸出結果數字2。
那麼,神經網路是如何把信息的輸入轉換成我們想要的輸出的呢?
感知器(Perceptron)
感知器是一種二元分類器,它是神經網路的基石。感知器是對神經細胞的模擬,如權量(突觸)、偏置(閾值)及激活函數(細胞體)。
輸入以向量的形式表示x=(x_0, x_1, x_2),你可以把它們理解為不同的特徵維度,其中的x_0是偏置單元(bias unit),相當於線性回歸中的常數項。在經過「神經元」(激活函數)的計算後,感知器會輸出一個大於0或小於0的數。箭頭上的數字代表每個特徵的權量(weights),相當於線性回歸模型的參數,是收集信息的神經突觸。
例如,上圖列出了每個特徵的權量,於是我們有這樣的模型:
hθ(x)=-3+2*x_1+2*x_2
當x_1和x_2同時為1時,輸出為1,而不同時都將得到負數。這實際上就是邏輯與或稱為與門。
我們的感知器將根據輸出大於或小於0來對輸入進行分類:
這是一個單層的感知器。通過修改權量,我們也可以建立或門(weights=[2,2], bias=-1)、非門(weights=[-2],bias=1,只有一個輸入端)。但是,無論如何,你都無法通過一個單層的感知器來建立「異或門」(XOR),即兩個輸入相同時輸出1,否則輸出0。這種情況下,我們就需要更複雜的神經網路了,即多層神經網路,也被稱為前饋神經網路(feedforward neural network)。
前饋神經網路
前饋神經網路是多個感知器的組合,這些感知器以不同的方式產生連接,並由不同的激活函數控制激活。
圖6:前饋神經網路示意圖
我們來認識下前饋神經網路:
- 它包括輸入層(input layer)、輸出層(output layer)和一個或多個隱藏層(hidden layers)。上圖的神經網路由3個單元的輸入層,4個單元的隱藏層和2個單元的輸出層組成。單元等於感知器。
- 輸入層的單元是隱藏層單元的輸入,隱藏層單元的輸出是輸出層單元的輸入。
- 兩個感知器之間的連接有一個權量。
- 第t層的每個感知器與第t-1層的每個感知器相互關聯。當然,你也可以設置權量為0,從而在實質上取消連接。
- 在加工輸入數據時,你將輸入數據賦予輸入層的每個單元,而隱藏層的每個單元是輸入層每個單元的加權求和。也就是說,輸入層的數據會被前向傳播到隱藏層的每個單元。同理,隱藏層的輸出作為輸入會前向傳播到輸入層,計算得到最後的輸出,即神經網路的輸出。
- 多個隱藏層的神經網路同理。
超越線性
在「感知器」中我們談到,單層感知器雖然可以建立與門、或門、非門等,但無法建立更為複雜的異或門(XOR),即兩個輸入相同時輸出1,否則輸出0。
為了更為直觀地理解這個問題,我們可以看下圖:
圖7:雙輸入感知器的決策空間
模型有兩個輸入(input1和input2),我們可以線性地區分或門的兩類情況:即同時為0時在左下角,其它情況在右上角;與門的情況也可以線性地區分,即輸出同時為1時在右上角,其它情況在左下角。但異或門呢?這種情況是無法作出線性區分的,也就是說,單層感知器無法實現異或門。
多層感知器嗎?
先來分析輸入和輸出的情況。最左邊兩列列出了輸入的4種情況。異或門的輸出是最右邊一列的情況,即兩個輸入相同時輸出1,否則為0。我們在輸入層和輸出層之間加入兩個單元的隱藏層,那麼,它給輸出層的輸入應該是什麼呢?答案如下圖。你可以發現,對於隱藏層的a_1單元(上標2代表這是第2層)來說,它實際上是且門(都為1時才輸出1);對a_2單元來說,它的邏輯是(not x_1) and (not x_2),即同時為0時才輸出1。而從隱藏層到輸出層,是邏輯或。前饋神經網路可以實現異或門!
圖8:異或門輸入輸出下推導隱藏層
於是我們建立如下的神經網路,但是其輸出並非我們想要。為什麼?
圖9:線性激活函數下的前饋神經網路
這是因為上面感知器的激活函數是線性函數。這種情況下,神經網路的輸出也只是輸入的某種線性函數,只不過是通過網路的形式來進行加權。線性函數的線性組合仍然是線性函數。也就是說,即便是多層的感知器,激活函數為線性時也無法實現輸入00和輸入11時的輸出比輸入01和10時大,即非線性。
如果激活函數是線性函數,前饋神經網路將不會比單層感知器強大多少,不管它有多少層。
我們需要logistic函數的幫助。大部分神經網路會使用非線性激活函數,比如logistic函數(也被稱為Sigmoid函數,這是就其形狀而言的)。此外,由於訓練神經網路要使用微積分,而要使用微積分,就得使用光滑函數(在反向傳播時我們會詳細講解)。logistic函數也滿足這一要求。
在logistic函數的作用下,線性函數的輸出值將被轉化到0到1之間。從下圖右上角的logistc曲線可以看到,輸入值越大,輸出越接近1,輸入為4時輸出為0.99;輸入值越小,輸出越接近0,輸入值為-4時,輸出為0.01。
下圖是單層感知器的激活函數為logitic函數時與門的示例。
圖10:激活函數為logitic函數時的與門單層感知器
綜上,我們可以通過前饋神經網路和logistic函數解決異或門的問題:
圖11:非線性神經網路實現異或門
反向傳播(backpropagation):訓練神經網路
反向傳播是使用數據來訓練神經網路的演算法,它是神經網路的梯度下降演算法。
假設我們有一個訓練集,其中含有輸入向量和相應的目標輸出向量。同時,假定我們的網路已經擁有一組權量(相當於我們知道每個神經元的激活函數),那麼接下來,我們就需要使用以下演算法來調整這些權量。
1、利用初始權量,在輸入向量上運行前向傳播,從而得到所有網路所有神經元的輸出。
2、這樣,每個輸出層神經元都會得到一個誤差,即輸出值與實際值之差。
3、計算作為神經元權量的函數的誤差的梯度,然後根據誤差降低最快的方向調整權量。
4、將這些輸出誤差反向傳播給隱藏層以便計算相應誤差。
5、計算這些誤差的梯度,並利用同樣的方式調整隱藏層的權量。
不斷迭代,直到網路收斂。
要理解上述過程,梯度下降演算法是關鍵。
圖12:單個參數的損失函數示例
在梯度下降演算法中,我們需要損失函數(即上面提到的作為神經元權量的函數的誤差)。損失函數衡量了模型的誤差,即神經網路的輸出值與實際值之間的差異,它的參數是模型的參數,即連接的權量。當損失函數達到全局最低時,得到最優的權權量。在訓練階段,權量不斷被更新,慢慢接近全局最低值。例如,權量是0.6時,它就需要向0.4變化,這樣才能接近全局最低值。
上圖描述的是只有一個參數的情況,即模型的誤差取決於一個參數。然而,神經網路的誤差取決於每一個權量,它的損失函數也會複雜得多。
其中,i代表第幾層,k代表第i層的第幾個單元。可見,損失函數把整個神經網路的誤差都加和了。後面的第二部分是正則化項,暫時不用理睬,不影響後面的理解。
有人可能會問,為什麼神經網路的損失函數是上面的形式?這個問題等價於為什麼logistic函數採用上面的形式?
在回歸模型中,損失函數是平方誤差函數(最小二乘法):
損失函數衡量了模型的輸出與實際值之間的誤差:
但對logistic函數而言,平方誤差函數是一個非凸函數,利用梯度下降演算法,它將無法保證找到損失函數的全局最優解。
圖13:非凸函數
對logistic函數,我們需要其他的損失函數:
圖14:
圖15:
如果y=1,而h(x)=1的話,則cost=0,即圖14曲線上(1,0)的位置;如果h(x)=0,則cost函數輸出值趨向於無窮大,這意味著當我們認為某種情況不會發生,例如用戶不會成為付費用戶,而事實上是可能的時,這種損失是不可估量的。同理,如果y=0,而h(x)=0的話,則cost=0,即圖15曲線上(0,0)的位置;如果h(x)=1,則cost趨向於無窮大。
可以把兩種情況寫在一個表達式中:
也即:
神經網路衡量整個網路的誤差,所以在形式上看起來會複雜些,但實質是一樣的。
那麼,接下來我們要如何更新權量才能使得損失函數接近全局最低值呢?
在神經網路中,我們使用反向傳播演算法來更新神經元之間連接的權量。反向傳播的意思是指,我們從輸出層開始計算,計算輸出層與實際值的誤差,然後返回到前面的隱藏層計算其誤差,以此類推,不斷迭代,直到網路收斂。
在完成第一步的前向傳播後,我們會得到神經網路的輸出值,利用損失函數可以計算出輸出值與實際值之間的誤差。損失函數的偏導數可以告訴我們參數往哪個方向更新可以得到更小的損失函數值。導數的幾何意義為曲線的斜率,例如,對於圖12簡單的損失函數而言,參數在0.5時斜率為正,參數值需要減少才能得到更小的損失函數值;而如果參數值為0.1,斜率為負,參數值需要增加才能得到更小的損失函數值。導數可以告訴我們全局最低的方向!
為了得到最小的J(θ),我們需要不斷更新參數θ,即神經網路連接的權量。每次更新的變化值由下面的公式決定:
其中, 為損失函數的偏導數,前面為負是因為斜率為正時,我們需要減少參數的值才能「下山」,而斜率為負時,我們需要增加參數的值才能「下山」, 代表學習速率,代表下山的步子有多大,如果步子太小,要走很遠才能走到山底,如果步子太大,容易越過谷底,導致無法收斂;J(θ)為神經元輸出的誤差。
從隱藏層到輸出層的兩個神經元之間的權量一旦更新,就可以更新隱藏層神經元的輸出,從而得到隱藏層神經元新的誤差值(更新後的輸出值和之前前向傳播時得到的輸出值),進而根據上述公式更新隱藏層和上一層兩個神經元之間的權量。依此類推,直到更新完整個神經網路的權量。
利用損失函數繼續更新整個網路的權量,直到神經網路輸出值的誤差達到最小。
所有神經元之間的權量確定後,神經網路就完成訓練了。
綜上,讓機器人看到2絕非易事。
參考資料:
Machine Learning from Coursera by Andrew Ng
Data Science from Scratch by Joel Grus
A Deep Learning Tutorial: From Perceptrons to Deep Networks BY IVAN VASILEV
維基百科
最近 Google Tensorflow 做了一個非常直觀的神經網路 playground。不誇張地說,現在每個人都可以在自己的瀏覽器裡面直接「玩深度神經網路」了。什麼都不用說,自己玩玩就明白。
地址是: A Neural Network Playground (可能要翻牆)
如果不明白裡面的 ReLU,L1 等等是什麼,沒關係,在搜索引擎查一下都可以查到答案。代碼在 Github 上,有興趣的朋友可以去給它加 Dropout,Convolution,Pooling 之類。
【UPDATE:對 AlphaGo 和圍棋人工智慧有興趣的朋友,我最近在寫一個系列,介紹如何自制你的"AlphaGo",請點擊:知乎專欄】Andrey Kurenkov曾經寫過一篇文章,敘述了神經網路和深度學習的簡史,內容雖說算不上有趣,但從歷史發展中看神經網路,對於它是什麼,應該會有很大的幫助。
文章由機器之心編譯,一共四部分:
神經網路和深度學習簡史(第一部分):從感知機到BP演算法
神經網路和深度學習簡史(第二部分):BP演算法之後的又一突破——信念網路
神經網路和深度學習簡史(第三部分):90年代的興衰——強化學習與遞歸神經網路
神經網路和深度學習簡史(第四部分):深度學習終迎偉大復興
以上。
首先把題主給的鏈接看了一下,大致內容如下:
你需要挑選芒果,你不知道什麼樣的芒果最好吃,所以你就嘗遍了所有的芒果,然後自己總結出個大深黃色的比較好吃,以後再去買的時候,就可以直接挑選這種。
那什麼是機器學習呢,就是你讓機器「嘗」一遍所有芒果,當然,也假設它知道哪些好吃,讓機器去總結一套規律(個大深黃色),這就是機器學習。具體操作,就是你描述給機器每一個芒果的特徵(顏色,大小,軟硬……),描述給機器其輸出(味道如何,是否好吃),剩下的就等機器去學習出一套規則。
等等,那機器是怎麼學習到這個規則(個大深黃色的好吃)的?沒錯,是通過機器學習演算法。而題主所問的神經網路,恰好就是一種機器學習演算法!近些年來,由於深度學習概念的興起,神經網路又成為了機器學習領域最熱門的研究方法。
我相信當明確神經網路是一種機器學習演算法之後,就可以很輕易的給一個外行講清楚神經網路到底是用來做什麼的。可是神經網路為什麼可以完成這個功能呢?
神經網路就像一個剛開始學習東西的小孩子,開始認東西,作為一個大人(監督者),第一天,他看見一隻京巴狗,你告訴他這是狗;第二天他看見一隻波斯貓,他開心地說,這是狗,糾正他,這是貓;第三天,他看見一隻蝴蝶犬,他又迷惑了,你告訴他這是狗……直到有一天,他可以分清任何一隻貓或者狗。
其實神經網路最初得名,就是其在模擬人的大腦,把每一個節點當作一個神經元,這些「神經元」組成的網路就是神經網路。而由於計算機出色的計算能力和細節把握能力,在大數據的基礎上,神經網路往往有比人更出色的表現。
當然了,也可以把神經網路當作一個黑箱子,只要告訴它輸入,輸出,他可以學到輸入與輸出的函數關係。神經網路的理論基礎之一是三層的神經網路可以逼近任意的函數,所以理論上,只要數據量夠大,「箱子容量」夠大(神經元數量),神經網路就可以學到你要的東西。
本文作者:Udacity深度學習機器學習導師 Walker
題記:「簡單」 「形象」 兩個要求我爭取下。「有趣」的話,我覺得數學挺有趣的,你覺得呢?
神經網路是什麼?神經網路就是一系列簡單的節點,在簡單的組合下,表達一個複雜的函數。下面我們來一個個解釋
線性節點
節點是一個簡單的函數模型,有輸入,有輸出。我們
1. 最簡單的線性節點:
我能想到的最簡單的線性節點當然就是 了。
2. 參數化線形節點:
是一個特殊的線形組合,我們可以一般化所有 的線性組合, 即 。這裡 就是這個節點的參數。不同的參數可以讓節點表示不同的函數,但節點的結構是一樣的。
3. 多輸入線性節點:
我們進一步把 2 個輸入一般化成任意多個輸入。這裡 是這個節點的參數。同樣,不同的參數可以讓節點表示不同的函數,但節點的結構是一樣的。注意 並不是這個節點的參數,輸入個數不同的節點結構式不一樣的。
4. 線性節點的向量表達:
上面的式子太過冗長,我們用向量 表示輸入向量 ,用向量 表示參數向量 , 不難證明 . 這裡向量 就是這個節點的參數,這個參數的唯度與輸入向量的唯度相同。
6. 帶常量的線性節點:
有時, 我們希望即使輸入全部為 的時候,線形節點依然可以有輸出,因此引入一個新的參數 作為偏差項,以此來增加模型的表達性。有時,為了簡化,我們以為會把表達式寫作 。此時
7. 帶激活函數的線性節點:
對於二項分類問題,函數的輸出只是真或假,即 0 或 1。函數 將真命題映射到 1, 將假命題映射到 0。
線性節點實例
1. 用線性節點表達 (或函數)
或函數的真值表如下:
定義節點 , 不難驗證,它與 是等價的。
2. 用線性節點表達 (與函數)
與函數的真值表如下:
定義節點 , 不難驗證,它與 是等價的。
線性節點的表達力
單個線性節點可以表達所有線性函數(函數值域為實數集)以及所有線性可分的分類器(函數值域為 )。概念定義和命題的證明我們這裡不在闡述。雖然單個線性節點已經很強大,但依然有他的局限性。對於線性不可分的函數,它無能為力,例如異或函數
線性節點的組合
1. 多個線性節點同層組合:
上述的線性節點輸入是多維的,但輸出只是一維,即一個實數。如果我們想要多維的輸出,那麼就可以並列放置多個節點。設 分別是 個節點的參數,那麼輸出則分別為 . 最終的輸出結果為
其中 是一個 的參數矩陣。
2. 多層線性節點:
多層線性節點中,某一層帶激活函數的線性節點,輸出作為下一層的輸入。通常中間層(或者隱藏層,圖中的藍色節點)會帶有一個激活函數,來增加模型的表達力。(思考: 如果隱藏層沒有激活函數,為什麼兩層線性節點和一層等價?)
多層多層線性節點實例
1. 用多層表達異或函數
這是一個不可線性分隔的函數,不可以用一個線性節點表達。但我們可以使用多層的線性節點來完成這個任務。
或
或
或
多層線性節點的表達力
可以證明,多層神經元可以表達所有連續函數。證明比較複雜,有興趣的人可以去看一下: A visual proof that neural nets can compute any function
寫到這裡差不多基本講清楚了神經網路的計算方式,但其實我們還有很多常見的節點沒有講到,例如 Relu, Sigmoid, Dropout 等。神經網路不止有正向計算,還有反向傳導,這些節點的出現和反向傳導息息相關,有機會的話,再來寫一篇文章回答 如何簡單形象又有趣地講解神經網路的反向傳導?
如果大家想深入學習更多關於神經網路的知識,也可以參考來自矽谷前沿技術學習平台 優達學城 (Udacity)的機器學習工程師課程,裡面非常詳細的講解了你所想要的一切~
Youtube上的
But what is a Neural Network? | Deep learning, Part 1
這個在Reddit的MachineLearning上得到了400多票。作者3Blue1Brown是Youtube上最知名的數學教學視頻作者之一。
中文版可以在作者的Bilibili頻道找到
【官方雙語】深度學習之神經網路的結構 Part 1 ver 2.0
還好問題只是怎樣盡量簡單的解釋什麼是神經網路,否則還真不敢回答。學術圈比較喜歡用一些名詞術語,很容易對理解造成更多困惑。我只說一下個人的粗淺理解,希望對初入門的同學有幫助。可能存在疏漏和誤導,只能請大家充分利用自己的判斷力。
----
先放輕鬆態度,應該更便於理解神經網路。
神經網路+深度學習中的很多理論方法已經存在很多年(大於10),並不是突然之間像魔術那樣出現而不可思議。最近開始吸引焦點,主要是因為可用的計算能力(CPU、GPU)的快速發展,讓海量矩陣乘法運算更容易被實驗、測試和驗證。例如,TensorFlow的出現,最大的意義,就是AI for everybody,讓「舊時王謝堂前燕,飛入尋常百姓家」。
----
如果嘗試強行一句話解釋深度學習神經網路,我會這麼總結:
「通過堆積大量且多樣計算方法的函數計算式的計算單元(有關名詞:node/activation function/ReLU/...),並嘗試為這些計算單元建立大量的相互連接,同時為了有序有效我們通過分層使連接有次序並避免需要嘗試的連接數成冪指數上升,之後制定一個策略幫助整個神經網路的計算評價嘗試的結果更好更可用或更壞更不可用(有關名詞:lose/cost/objective funtion/softmax/cross entropy), 在提供大量數據訓練神經網路之後,神經網路通過計算結果的評價策略,決定以什麼樣的次序連接哪些計算單元的計算結果更值得被使用(有關名詞:強化連接),通過大量循環不同的連接方式找到評價最好的一些的連接計算單元的次序和權值,就此建立模型(計算式組合)可用於解決更多同類問題。」
堆積大量計算單元(神經元)的最大的好處是什麼呢。就是減輕設計(或者說supervise)的壓力。可以更少考慮應該怎樣去針對一個個很具體的feature細節(carefully engineered function)去解決,而是通過訓練來強化或弱化它們直接的連接,以一種自然選擇的方式淘汰和篩選,留下可用的解題模型。
那麼上面說的大量是多大呢。一個昨天看的一個論文,是用了65萬個。不過雖然訓練時需要很大的計算量,但是訓練的結果在使用時,就只需要很小的運算量了。就像迷宮有力地圖,再走一次時,就不會走那麼多彎路了。
----
其實通過嘗試組合大量不同的演算法,找到最適合解決問題的演算法組合,訓練+強化理論,是機器學習一直都在做的。
1、分層。這個最大的好處,是將計算單元之間需要嘗試的連接(組合)數量,控制可控的範圍。
2、一些被發現很適合用來作為深度學習組件的計算單元函數,例如ReLU(When in doubt, ReLU)
----
最後推薦一個我覺得很好的入門資源:https://github.com/jtoy/awesome-tensorflow
早年讀電信系在職碩士時,選修了一門《人工神經網路》課程,老師講得雲山霧罩,我們聽得如夢似幻。雖然最後也考了80多分,但同學們相互間吐槽,都覺得這門課把人給學神經了!別人怎麼樣我不知道,我反正是稀里糊塗的,沒弄清楚概念。
今年,審讀吳軍老師的《數學之美》第二版,讀到這兩段話時,我笑了,原來我並不孤獨——
【 有不少專業術語乍一聽很唬人,「人工神經網路」就屬於這一類,至少我第一次聽到這個詞就被唬住了。你想啊,在大家的印象當中,人們對人腦的結構都還根本沒有搞清楚,這就冒出來一個「人工的」神經網路,似乎是在用計算機來模擬人腦。想到人腦的結構那麼複雜,大家的第一反應一定是人工神經網路肯定非常高深。如果我們有幸遇到一個好心同時又善於表達的科學家或教授,他願意花一兩個小時的時間,深入淺出地把人工神經網路的底細告訴你,你便會發現,「哦,原來是這麼回事」。如果我們不幸遇到一個愛賣弄的人,他會很鄭重地告訴你「我在使用人工神經網路」或者「我研究的課題是人工神經網路」,然後就沒有下文了,如此,你除了對他肅然起敬外,不由得可能還會感到自卑。當然還有好心卻不善於表達的人試圖將這個概念給你講清楚,但是他用了一些更難懂的名詞,講得雲山霧罩,最後你發現聽他講了好幾個小時,結果是更加糊塗了,你除了浪費時間外一無所獲,於是你得出一個結論:反正我這輩子不需要搞懂它了。
大家可別以為我是在說笑話,這些都是我的親身經歷。首先,我沒有遇到過一兩小時給我講懂的好心人,其次我遇到了一批在我前面賣弄的人,作為年輕人,總是希望把自己不明白的東西搞懂,於是我決定去旁聽一門課。不過,我聽了大約兩三次便不再去了,因為除了浪費時間,似乎我並沒得到什麼收穫。好在我自己做研究暫時用不到它,也就不再關心了。後來在美國讀博士期間,我喜歡在睡覺前躺著看書,沒事兒就捧著幾本關於人工神經網路的教科書在床上看,居然也看懂了。然後再用它做了兩三個項目,算是學會了。到這時回過頭來再看「人工神經網路」,其實並不複雜,入門也不難,只是我走了彎路。——吳軍】
君子報仇,三十年不晚。大學畢業三十年後,吳老師在數學之美 (第二版) 里,單獨用一章講Google大腦和人工神經網路,一抒當年的鬱悶,也順便幫我解了氣:)
我把這一章的內容貼一部分在這裡,希望對大家理解神經網路的概念有幫助:
作者:許鐵-巡洋艦科技
鏈接:知乎專欄
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
人工神經網路的第一個里程碑是感知機perceptron, 這個名字其實有點誤導, 因為它根本上是做決策的。 一個感知機其實是對神經元最基本概念的模擬 ,都未必有多少網路概念,他就是一個自動做決策的機器。
比如說你要決定今天出不出去看電影, 你要考慮3個因素, 一個是女朋友在不在, 一個是電影好不好看, 另一個是今天有沒有工作, 這三個因素每個人的權重都不同,有的人看重女朋友, 有的人看重工作,所以權重就不等, 最後每個人根據自己的權重做出0或1,去或不去, to be or not to be的決策。那麼你怎麼做呢? 你把三個要素按照它們需要的權重加和在一起, 在把這個分數送到一個叫sigmoid的門面前得到去或不去的決定, 工作原理如上圖。
比單層感知機更複雜的多層感知機-或者我們常說的深度網路, 是進行數據處理和模式識別的利器。 深度神經網路之所以能夠處理這些數據類型,主要是因為這些數據本身具有的複雜結構很適合被NN識別, 而人類不需要預先設計識別這些結構的函數而是任由網路學習, D-CNN 深度卷積網路能夠同時看到一個圖像從細節到抽象的結構,所以能夠抓住一些我們人類都說不出的細節。
DCNN 深度卷積網路,信號在多級網路里一級級傳遞, 從而使得從微觀到宏觀的特徵都得到分辨 。 每一層神經元之間沒有相互連接。
而RNN- 反饋式神經網路(每一層神經元之間有相互連接)則適合處理sequnce序列類的數據, 發現序列內部的時間結構。
RNN 之所以具有這個能力,就是因為網路內部通過自反饋, 具有之前各個時間點的輸入信息, 因此它可以從無限久遠的歷史裡推測系統的未來,RNN與之前的卷積網路相比最大的特點是它包含了動力學特性,如果說卷積網路是任意函數逼近器,那麼RNN就是任意程序逼近器。 猶如包含某種工作記憶。用一個比喻來說, 就是RNN猶如一個寬闊的池塘寧靜的水面, 當你投入一個石子, 激起的漣漪會在水池裡不停反射傳播, 這是對石頭進入那一時刻信息的保存, 如果之後在落入一個石頭, 那麼它再度激起的漣漪會和之前的水波疊加作用, 形成更複雜的相互作用和紋樣。
RNN示意圖, 同層神經元之間有相互連接,從而使得歷史信息在網路里向回聲一般交替傳遞
RNN 具有相互連接的反饋式神經網路也是最接近生物組織神經網路的人工神經網路, 具有更多的未來潛力,只是它的訓練比feed forward network更複雜。
人工神經網路的訓練就如同生物神經網路的學習, 都是一個不停試錯並減少錯誤的原理, 不過人工神經網路的方法更加簡單化, 比如gradient descent,就是說在參數空間里尋找使得錯誤減少最快的方法改進。
人工神經網路對於生物神經網路的奇妙之處在於, 它反過來啟迪了生物神經網路是在幹什麼的, 就好像費曼的那句話「 你要想真正理解一個東西, 就造出一台」。
當然可以
是「泡沫」1+1是多少?10!傻逼,是2
1+2是多少?37!傻逼,是3
1+3是多少?-5!傻逼,是4
……
1+1是多少?5!傻逼,是2
1+2是多少?14!傻逼,是3
1+3是多少?25!傻逼,是4
……
1+1是多少?2!傻逼,是2
1+2是多少?5!傻逼,是3
1+3是多少?8!傻逼,是4
……
1+1是多少?2!傻逼,是2
1+2是多少?3!傻逼,是3
1+3是多少?4!傻逼,是4
……
1+1是多少?2!傻逼,是2
1+2是多少?3!傻逼,是3
1+3是多少?4!傻逼,是4
……
========3年後========
100+200是多少?300!
補充一下@賈偉的答案
訓練過程的那段,寫得比較像強化學習,神經網路用到的方法大部分是有監督學習。
我覺得故事應該是這樣。。。。
你想讓神經網路(簡稱神經)辨認貓和狗(演算法類型為分類)。於是給它看一百萬隻狗,和一百萬隻貓,每隻狗的腦門上都貼著「我是狗」的字條,貓則貼「我是貓」(使用標註數據)。神經同時看五十萬隻禽獸,分四批看,並作出判斷(實現時用並行處理,使用mini-batch)。每個看到的貓或狗,如果判斷錯了,就修正自己的判斷標準(優化)。每看完這二百萬隻禽獸算一輪,每學十輪就看一些之前完全沒見過的貓貓狗狗做出判斷(推廣性測試)。當神經刻苦學習貓狗知識的時候,你正在睡覺,一覺睡醒,發現神經一小時前判斷貓和狗比較准(次最優解),現在學太多反而判斷不準了(過擬合),於是你讓神經使用一小時前的標準(防止過擬合技巧之early-stopping)。這樣訓練過程就結束了。今天給人講神經網路,剛說到y=w*x+b,直接被打斷:別講數學,聽著頭疼!一個高考數學幾乎滿分的有為青年居然墮落到如此地步。。。
沒辦法啊,只好想個生活中的場景,例如發年終獎!
年終,PM要評價大家一年的工作成果,決定是否向經理邀功。假如PM認為某個妹子很漂亮,上班又穿得少,同事們的工作效率都提高了,就添油加醋的把她的工作量擴大,彙報給經理;經理根據PM的彙報,要從新權衡,是不是應該向老闆邀功,若經理覺得PM值得信任,就在老闆面前幫PM誇大工作成果;老闆聽了經理的彙報後,進行權衡是不是要發獎金,假如發,是發十萬,還是發二十萬。
以上就是一個最簡單的三層神經網路,單輸入單輸出:
輸入層,輸入的是妹子的工作成果,權重是PM對妹子的評價,激活函數是根據妹子工作成果和評價決定是否向經理邀功。
隱藏層,輸入的是PM的彙報,權重是經理對PM的信任程度,激活函數就是根據PM的彙報和對PM的信任程序決定是否向老闆邀功
輸出層,輸入的是經理的彙報,權重是老闆對經理的信任程度,激活函數就是根據經理的彙報和對經理的信任程序決定是否發獎金
損失函數呢,當然是妹子因為拿不到獎金而流下的眼淚,獎金越高,流的淚越少。為了讓損失函數最小,萌妹子不流眼淚,怎麼辦,調節權重啊!即:妹子胸要大,PM多給經理拍馬屁,經理常給老闆唱讚歌。
應試教育
最近學習不確定優化攢了一些筆記,連著說一說也算總結一下。
零基礎慎讀。
結論:神經網路是一個參數數量突破天際的回歸分析。
%突然發現在做演算法的眼睛裡神經網路就是模式識別。。
----------------
Part1 這些名字很帥的統計和優化方法是「粗暴的」
通常來說,現在解決不確定優化問題。都會使用隨機模擬、神經元網路和遺傳演算法聯立的混合智能演算法來求解。比如使目標變數的數學期望達到最優值的期望值模型,概率最優的可靠度模型(機會約束),還有我校Liu老師常提的隨即相關機會,就是你前幾個優化組合一下。
其中隨機模擬是一個不確定問題不可少的輸入,遺傳演算法用來調神經網路的參數,神經網路用來逼近現實。互相配合,解決問題。在我看來是及其簡單粗暴,不得已而為之的。只是用它們最乾脆的思路,優化了最粗暴的方法。
比方說,你能寫出一個事物期望值的顯示錶達,那麼對參變數求導就可以找到極大值點。當然有的時候不是很方便求出全局導數,那麼梯度遞降、可行方向等規劃學方法和數值方法也大有可為。離散的最優值問題在凸區域上的解也是很方便就可以求出的,此所謂整數優化。
這樣一看這個混合演算法真是毫無必要呀,那我們為什麼還要用它們呢?原因是因為這是通用方法。
我來舉一個例子。整數優化,我們選取適當的函數把兩種變數聚為兩類。
圖中有圈圈的是我們想區分的訓練集。這個時候我們需要找一個合適的評價使得他們分開。最方便的是取機器學習里常用的gauss核函數(數值隨距離中心點距離單調遞減的光滑函數RBF),那麼有九個參數。(均值協方差)
圖中有圈圈的是我們想區分的訓練集。這個時候我們需要找一個合適的評價使得他們分開。最方便的是取機器學習里常用的gauss核函數(數值隨距離中心點距離單調遞減的光滑函數RBF),那麼有九個參數。(均值協方差)優化目標是對幾千個數聚類之後聚類結果中訓練集被識別的個數的兩倍與分出的非訓練集的元素的個數的差值。我們知道這個值兼顧一二類錯誤的重要性,又是一個明確的目標,當然它越大越好。這個時候常規的優化演算法就很難找出這九個參數的最優值了。
結果:
畢竟經過一次聚類演算法之後,中心點的位置是迭代的結果而完全不確定的。如果能在聚類之前就知道中心點的位置,那麼還聚類幹嘛呢?這個時候聚類這個操作就像黑盒子,是傳統優化問題極度依賴,卻表達不出的優化過程。輸入是幾千個點,輸出只是我之前說的評價函數,參數有九個,這時候不太好把他們看做神經元,因為我並沒有顯式的給出其激活函數,或者這裡的激活函數實際上是相互耦合的,或者我沒有將每一個輸入都看做是均等的,所以不太好做一個典型的例子。
我選取6個染色體(開始是對訓練集主成分分析的參數加上白雜訊),迭代一萬次之後,其9個參數依舊沒有收斂。而且對於參數極度敏感,gauss核的均值稍做變化,聚類結果可能就會均分整個樣本集,從而導致失敗。
在這種情況下,我覺得,可能沒有比遺傳演算法更好的調參數方法了。雖然其毫無道理,但由於其根基是遍歷,只是加了稍許隨機性,合理的選擇解,來使得收斂變快。所以不失為一個好方法。也許有人分析其收斂速度,但我覺得並不太必要。因為它並不好看。當我們開始考慮用遍歷求解一個問題的時候,我猜我們對其難度,對其解的形式,對其收斂性也不會有太好的判斷。這樣我們評估遺傳演算法的複雜度時,肯定也是要因地制宜的。有些絕大部分信息我們都知道的問題,也許遺傳演算法也不慢;有些從頭到尾都在拍腦袋的問題,遺傳演算法也能用。
Part2 神經網路就是一個「超多參數的回歸分析」
那麼神經網路到底是什麼呢?【扯了那麼多遺傳演算法還沒有說正題】正如遺傳演算法是遍歷所有參數選最優的過程,神經網路大致也就是遍歷全部函數選最優的過程。
盜圖:
我們知道一些輸入和輸出的數據,想找出其中的數量關係。但又不是那麼容易看出來,比如我們不像開普勒那樣一眼就能看出行星運動時半徑的立方和時間平方成反比。有時我們也不太在意具體的顯式表達,這個時候我們就說:你們看好了,這是一張已經訓練好的神經網,你想要知道你想求的函數值,那麼你把輸入丟進去,然後把輸出抱走就好。雖然有的時候【絕大部分時候】,單論神經網路,我們是可以把我們想求得函數展開成為顯式表達的,但是太難看了我們就不這麼做。
當然也許你會說這不就是擬合嗎? Indeed . 一般來說我們用來評價神經網路的函數也就是用和擬合一樣的最小二乘和。神經網路的參數(權重)也就可以看做一般回歸分析的參數。好,我們來看一下一般的線性回歸。,一共兩個參數。我們把他們調到最優,可惜還是只有0.3,不work。這個時候我們就想,會不會是呢?一共三個參數,到了0.5,然後你心裡想,那我把原函數泰勒展開:-D,假設原函數足夠光滑,我們還是可以得到一個足夠好的解的。
那麼假設我們有一張神經網路,有6個輸入神經元,15個隱層神經元,3個輸出神經元,我們大概有多少個參數呢?【這裡跳過了神經網路中權重和下一層的關係描述,包括激活函數,因為我覺得這畢竟不是神經網路的教材】
每個隱層都有一個linear的偏差,還有對應六個輸入的權重,這一層有105個參數,然後三個輸出神經元每個對16個權重參數,共有48個參數,加起來一共153個參數,( ⊙ o ⊙ ),你用153階泰勒展開逼近函數!老師,他作弊QAQ!【當然未必全都要變化
道理就是這個道理,簡單粗暴。接下來就是些技巧了,借著計算機的東風,這些本來沒什麼內涵的方法都放出了其絢麗的光芒。把樸素的枚舉法發揮到了極致。至於之後的選取光滑激活函數,比如常用的sigmoid,好做梯度遞降,或者直接簡單粗暴的按照下圖方法進行訓練網路,都是可以的。
Step1 隨機初始產生權重向量w
Step2 通過交叉變異更新w
Step3 算誤差函數
Step4 算適應度,然後輪盤賭,
Step5 重複2到5
Step6 給出最優權重向量
媽媽再也不用擔心我不會訓練神經網路了,【手動再見】,激活函數怎麼選貌似不是很要緊呀。【你再想想是這樣嗎?】
為了滿足某些強迫症,這裡給出一個定理:具有一個或多個隱層的前向神經元網路可以以任意精度畢竟任意連續函數。[手動不規範引用 2016]再看看我之前和泰勒展開的比較,想想魏爾施特拉斯定理,是不是也覺得可以接受了呢?
我知道知乎這樣的長文,最後一般要貼個例子。
借寶定老師書上的例子:
至於神經網路被一些人鼓吹的神奇特效,比如這裡說的可以減小白雜訊。我只能表示我還需要學習一個。畢竟我沒有試過用153個參數去進行回歸分析,能不能消除白雜訊呀~
對了,這裡還要提一句,一般用153個參數回歸分析,總要用154個輸入對吧~
但你看神經網路,其實只要隨機生成一個權重,然後調幾圈就可以了【現實中確實可以不讓這些參數都變化,但我不是做演算法或者計算機的,所以不太清楚計算機業界怎麼做。我只是做優化的時候碰到了一些這樣的問題,自學了一下來吹牛而已】,感覺帥帥的呢~
【不過這倒並不是黑點,只是說有些人亂用這些現代學習方法,拿來批判統計學;現代的這些學習方法,都是在大數據科學的要求下應運而生,也不是說其粗暴就是壞事,畢竟解決了很多新的以往無法解決的問題】不過搞機器學習的一天到晚過擬合過擬合。。我覺得這參數取多點還是有道理的。。不知道有沒有暴力增加神經元防止過擬合的方法。
前面的高贊有一點我不是很能理解,我覺得神經網路的多層隱層的含義可能確實有。。但是想分析其具體含義只能是看到啥說啥了。所以這樣將神經網路說的和玄學一樣感覺不太好。
------
Appendix:
聚類原理
citation:
citation:Liu B, Theory and Practice of Uncertain Programming,
3rd ed., http://orsc.edu.cn/
-----
pretty good...
有個答主舉了個例子拿20個樣本進去跑:-D
所以數學背景還是很重要
人工神經網路演算法的作用機理還是比較難理解,現在以一個例子來說明其原理。這個例子是關於人的識別技術的,在門禁系統,逃犯識別,各種驗證碼破譯,銀行預留印鑒簽名比對,機器人設計等領域都有比較好的應用前景,當然也可以用來做客戶數據的挖掘工作,比如建立一個能篩選滿足某種要求的客戶群的模型。
機器識別人和我們人類識別人的機理大體相似,看到一個人也就是識別對象以後,我們首先提取其關鍵的外部特徵比如身高,體形,面部特徵,聲音等等。根據這些信息大腦迅速在內部尋找相關的記憶區間,有這個人的信息的話,這個人就是熟人,否則就是陌生人。
人工神經網路就是這種機理。假設上圖中X(1)代表我們為電腦輸入的人的面部特徵,X(2)代表人的身高特徵X(3)代表人的體形特徵X(4)代表人的聲音特徵W(1)W(2)W(3)W(4)分別代表四種特徵的鏈接權重,這個權重非常重要,也是人工神經網路起作用的核心變數。
現在我們隨便找一個人阿貓站在電腦面前,電腦根據預設變數提取這個人的信息,阿貓面部怎麼樣,身高多少,體形胖瘦,聲音有什麼特徵,鏈接權重初始值是隨機的,假設每一個W均是0.25,這時候電腦按這個公式自動計算,Y=X(1)*W(1)+X(2)*W(2)+X(3)*W(3)+X(4)*W(4)得出一個結果Y,這個Y要和一個門檻值(設為Q)進行比較,如果Y&>Q,那麼電腦就判定這個人是阿貓,否則判定不是阿貓.由於第一次計算電腦沒有經驗,所以結果是隨機的.一般我們設定是正確的,因為我們輸入的就是阿貓的身體數據啊.
現在還是阿貓站在電腦面前,不過阿貓怕被電腦認出來,所以換了一件衣服,這個行為會影響阿貓的體形,也就是X(3)變了,那麼最後計算的Y值也就變了,它和Q比較的結果隨即發生變化,這時候電腦的判斷失誤,它的結論是這個人不是阿貓.但是我們告訴它這個人就是阿貓,電腦就會追溯自己的判斷過程,到底是哪一步出錯了,結果發現原來阿貓體形X(3)這個體征的變化導致了其判斷失誤,很顯然,體形X(3)欺騙了它,這個屬性在人的識別中不是那麼重要,電腦自動修改其權重W(3),第一次我對你是0.25的相信,現在我降低信任值,我0.10的相信你.修改了這個權重就意味著電腦通過學習認為體形在判斷一個人是否是自己認識的人的時候並不是那麼重要.這就是機器學習的一個循環.我們可以要求阿貓再穿一雙高跟皮鞋改變一下身高這個屬性,讓電腦再一次進行學習,通過變換所有可能變換的外部特徵,輪換讓電腦學習記憶,它就會記住阿貓這個人比較關鍵的特徵,也就是沒有經過修改的特徵.也就是電腦通過學習會總結出識別阿貓甚至任何一個人所依賴的關鍵特徵.經過阿貓的訓練電腦,電腦已經非常聰明了,這時你在讓阿貓換身衣服或者換雙鞋站在電腦前面,電腦都可以迅速的判斷這個人就是阿貓.因為電腦已經不主要依據這些特徵識別人了,通過改變衣服,身高騙不了它.當然,有時候如果電腦賴以判斷的阿貓關鍵特徵發生變化,它也會判斷失誤.我們就不要要求這麼高了,不要說電腦,就是人類也無能為力,你的一個好朋友你經過多次的識記肯定認識吧,但是他整了容你們在大街上邂逅.你可能覺得這個人聲音好熟悉,體形好熟悉,----都像自己一個朋友,就是臉長的不像.你不敢貿然上去搭訕吧(否定的判斷).因為我們判定一個人是否是自己的朋友的時候依靠的關鍵的特徵就是面部特徵,而他恰恰就是改變了這一特徵.當然也存在我們把一個擁有和我們朋友足夠多相似特徵的人判定為我們的朋友,這就是認錯人的現象了.這些問題電腦也會出現.
不過這個演算法還是有比較積極的意義的,實現了一定程度上的智能化.
簡單:
神經網路就是通過模擬神經元的運動,獲得一個可以變形為任意形狀的任意維函數
函數的形狀取決於你告訴他哪些點應該是這個函數應該盡量經過的
關於形象和有趣。。實在是不擅長。。
剛好涉足此行,姑且一答,拋磚引玉。
就舉一個簡單的例子:區分蘋果和橘子。
1.問題:人為什麼能判斷正確?
1.人的大腦就是一個牛逼的神經網路,通過從小的訓練,見識,並且記住了蘋果和橘子,我們分分鐘能作出判斷哪一個是蘋果,哪一個是橘子(可能就是百分之百),即使我們蒙住了人的眼睛,我們還是可以通過氣味,重量,手感做出較為準確的判斷(但是可能不能完全判斷正確).說到底就是人從小開始第一次見到蘋果,橘子時,就不斷的強化,記憶他們的特點,並且做出判斷!有這麼個大腦以後,通過直觀的比方說顏色,我們就可以區分,顏色塗成一樣,好,那我們依靠重量,重量等重,那我們依靠氣味,氣味也掩蓋,那我們依靠密度。。。。。。。。。
2.計算機是死的,不是人,怎樣達到人的水平或者模擬人的水平?
神經網路粉墨登場,初始的神經網路啥用都沒有,智商為零。我們想讓他區分蘋果和橘子,對不起,你還不如去問問木頭!由此我們想到人類區分的過程是不斷強化,記憶(也就是訓練大腦),然後就能區分(做出判斷).好嘛!對一個神經網路(大腦),我們做同樣的處理.先拿一堆的橘子和蘋果,告訴它哪些是橘子,哪些是蘋果(媽媽教你),這稱之為訓練.然後,再哪一個東東出來,讓它判斷是橘子還是蘋果(做出判斷),大事不好,神經網路判斷錯誤了?別急,媽媽不會打你,不會罵你,錯了就記住,再訓練,強化!
3.問題還有,一大堆橘子,蘋果,計算機怎麼強化,記憶,計算機只認識數字,誰知道你這是什麼怪物?
.好,為了讓計算機知道啥是橘子,啥是蘋果,我們必須將橘子和蘋果的特點變成數字(特徵提取),送入到計算機裡面去,讓他記憶(訓練).再把未知是什麼東西的東東的特點變成數字送入計算機中讓計算機做出判斷(效應).顏色,我們用0~255來表示從黑到白,重量,我們用秤來秤嘛,氣味,我們測算芳香因子的數量,密度,好吧,質量除以體積。。。。。。蘋果我們用1表示,橘子我們用-1表示,為什麼呢?前面我們說了,訓練的時候,我們要告訴計算機什麼是蘋果,什麼是橘子,用嘴和計算機說嘛?當然是數字啊,少年,沒錯就是國際慣例1和-1,接下來,我們將這些知道類別的數據送入計算機讓他記住,再來一個不知道類別的東東,提取出上面的特點,我們就能判斷出是橘子還是蘋果了!
4.問題又來了,計算機怎麼記住?(非常淺顯,專業人士一看就是不對的,還有很多別的條件沒有提到)
數據送進來,好嘛,神經網路來了,以蘋果為例(用1標記),蘋果的特點一串數字,我們用x表示,蘋果的類別1,也就是這個網路最後要得到的效果就是x通過網路後就變成了1,數學上就是x*w = 1,好嘛解個方程就完了!(如果是多層呢?x*w1*w2*....wn=1,當然還會有更多的已知量給你哈!)解出方程得到w,後面再送入一個未知是啥的東東的特徵數字,乘以w,就知道類別!橘子和蘋果就區分出來!
每一個步驟都有很多方法,很多內容可以挖掘,甚至很多步驟已經成為了一門專門的領域了!
推薦閱讀: