深度學習簡易入門
2017-07-06 17:06:49 n作者 : jennyxia , 騰訊 MelonTeam 團隊
深度學習是機器學習中的一個重要的方向,深度學習其實就是神經網絡學習,這里“深度”就是說神經網絡中眾多的層。
那么深度學習是用來干嘛的呢?簡單說,那就是...
關于什么是機器學習的解釋,Quora上有一個買菜大媽都能看的懂的回答。翻譯一下就是,吃遍南山區所有芒果的大媽,自己總結出個大顏色黃的比較好吃,所以買芒果的時候,直接挑選了這種。那什么是機器學習呢,就是你告訴機器每一個芒果的特征(顏色,大小,軟硬等),并且告訴機器其輸出(好不好吃),剩下的就等機器去學習出一套規則,這些芒果就是你的訓練集。而當你再丟芒果進去的時候,已然熟悉基本法的機器就會直接告訴你這個芒果好不好吃,這種能自動對輸入的東西進行分類的機器,就叫做分類器。
分類器的目標就是讓正確分類的比例盡可能高。一般我們需要首先收集一些樣本,人為標記上正確分類結果,然后用這些標記好的數據訓練分類器,訓練好的分類器就可以在新來的特征向量上工作了。
我們再來看看神經網絡是怎么工作的。
最簡單地把這兩組特征向量分開的方法是什么呢?當然是在兩組數據中間畫一條豎直線,直線左邊是-,右邊是+,分類器就完成了。以后來了新的向量只要代入公式,h = ax + b ,凡是落在直線左邊的都是-,落在右邊的都是+。這是二維空間的分類,而當特征有很多種時,我們就要在n維空間做分類,大家可以想象一下,就是用一個n-1維超平面把n維空間一分為二,兩邊分屬不同的兩類,,這種分類器就叫做神經元,a是權值,a0是偏移。
這么一畫是不是就很像人腦的神經元呀,我們就用這些神經元組成網絡去學習訓練集的數據,求出最優的權值(weights)和偏置(biases)以便最終正確地分類。
上圖就是一個簡單神經網絡的架構,網絡中最左邊的一層被稱作輸入層,其中的神經元被稱為輸入神經元(input neurons)。最右邊的一層是輸出層(output layer),包含的神經元被稱為輸出神經元(output neurons)。網絡中間的一層被稱作隱層(hidden layer),在一些網絡中往往有多個隱層。我們可以看到,輸入向量連到許多神經元上,這些神經元的輸出又連到一堆神經元上,這一過程可以重復很多次。數值向量在不同神經元之間傳導。
但是,我們剛剛分析了神經元,神經元的變換是完全的線形的,如果神經網絡的每層都只是做線性變換,多層輸入疊加后也還是線性變換。因為線性模型的表達能力不夠,所以需要激活函數來引入非線性因素。舉個栗子,常用的激活函數sigmoid函數,可以將實數壓縮到[0,1]之間。激活函數是神經網絡強大的基礎,好的激活函數(根據任務來選擇)還可以加速訓練。
接下來,確定了神經網絡的連接方式、網絡的層數、每層的節點數,建好網絡模型之后,我們要開始學習這個神經網絡的每個連接上的權值了。
訓練過程就是用訓練數據的input經過網絡計算出output,再和label計算出loss,再計算出gradients來更新weights的過程。label就是訓練集里預先加上的分類標記,loss就是你算出的結果與正確結果(正確為1,錯誤為0)的誤差,或者叫損失。
那么training其實就是通過梯度下降法盡可能縮小loss的過程。如下圖所示,我們希望loss值可以降低到右側深藍色的最低點。
具體步驟如下:
正向傳遞:算當前網絡的預測值 (Relu是一種激活函數,Wh1、Wh2、W0是權重,b是偏移量)
計算loss:
計算梯度:從loss開始反向傳播計算每個參數(parameters)對應的梯度(gradients)。這里用Stochastic Gradient Descent (SGD) 來計算梯度,即每次更新所計算的梯度都是從一個樣本計算出來的。
更新權重:這里用最簡單的方法來更新,即所有參數都
預測新值:訓練過所有樣本后,打亂樣本順序再次訓練若干次。訓練完畢后,當再來新的數據input,就可以利用訓練的網絡來預測了。這時的output就是效果很好的預測值了。
PS 以上理論知識和公式來自斯坦福大學計算機視覺實驗室推出的課程CS231n: Convolutional Neural Networks for Visual Recognition
接下來,摩拳擦掌想要試一試深度學習的朋友們可以試著調戲一下TensorFlow Playground。TensorFlow游樂場是一個通過網頁瀏覽器就可以訓練的簡單神經網絡,并實現了可視化訓練過程的工具。下圖就是TensorFlow游樂場默認設置的截圖。
左邊的每組數據,都是不同形態分布的一群點。每一個點,都與生俱來了2個特征:x1和x2,表示點的位置。數據中的點有2類:橙色和藍色。我們這個神經網絡的目標,就是通過訓練,知道哪些位置的點是橙色、哪些位置的點是藍色。如何確定網絡結構呢?到底用不用隱層呢?還是一個隱層?兩個隱層或更多?每個層的尺寸該多大?這些都可以在TP上調整,而且立刻就能看到直觀的結果。快去試試吧~