本文翻譯自
Neural Networks : A 30,000 Feet View for Beginners
翻譯:coneypo
在這篇文章中,我會向大家簡要的介紹下 Neural Networks / 神經網絡;
可以作為 Machine Learning / 機器學習 和 Deep Learning / 深度學習 的入門愛好者參考;
我們文章中會盡量用簡短的,零基礎的方式來向大家介紹。
作為 Black Box / 黑盒 的 Neural Networks / 神經網絡
我們可以把神經網絡當作一個神奇的黑盒子,你不必知道黑盒子里面是什么;
你現在只知道黑盒有 一個輸入 和 三個輸出;
輸入可以是圖像的尺寸,顏色或者種類等等;
輸出分別為 "貓","狗",和 "其他" 三種標簽,標簽的輸出值都是介於 0~1,而且三種標簽的數值之和為 1。
理解神經網絡的輸出
黑盒的神奇之處其實很簡單,如果你向它輸入一張圖像,它會輸出三個數值;
一個理想化的完美神經網絡,對於 "貓" 輸出(1,0,0),對於 "狗" 輸出(0,1,0),對於 "其他" 輸出(0,0,1);
事實上即使一個訓練的非常好的神經網絡也可能達不到上述的完美輸出;
比如,如果你輸出一張貓的圖像,”貓” 標簽輸出的數值為 0.97,“狗” 標簽下的輸出數值為 0.01,“其他” 標簽下的輸出數值為 0.02。
輸出數值 可以理解為 可能性概率;
比如說黑盒 "認為" 這張圖像是 "貓" 的概率是 97%,很小的概率是 "狗" 或者是 "其他" 物種;
請注意輸出數值之和一定為 1;
具體的這種問題歸類於 image classification / 圖像分類 問題:給定一張圖像,你用最有可能的標簽去給圖像進行分類(貓,狗,或者其他);
理解神經網絡的輸入
現在你作為一名程序員,你可以使用數值來表示神經網絡的輸出;
但是你如何輸入一張圖像呢?
圖像其實就是一個存放數值的數組。一個 256*256 三通道的圖像其實就是 256*256*3=196608 個數值;
你使用圖片瀏覽器來瀏覽 256*256 大小的圖片,其實在內存里就是 196608 個數值構成的 continuous block / 連續塊;
經過上述描述,我們知道輸入有一點復雜,輸入實際上有 196608 個數值,我們由此更新一下我們的黑盒模型。
我知道你在想什么,如果圖像不是 256*256 的呢?
其實你可以通過以下步驟來把任何一張圖像轉換為 256*256 大小:
- Non-Square aspect ratio / 非正方形縱橫比調整:如果輸入圖像不是正方形,你可以重新調整圖像大小到 256,然后從圖像中間裁剪出 256*256 的像素大小;
- Grayscale image / 灰度圖:如果輸入圖像不是一個彩色圖像,你可以通過拷貝灰度圖到三個通道來獲得三通道彩色圖像;
大家使用很多不同種類的方法來轉換圖像到一個適合的尺寸( 比如 256*256 ),但是正如我之前所說,我會讓我們的流程變得簡單,我不會使用這些各種各樣的方法。需要注意的事情是任何一張圖像可以被轉換成你想要的尺寸,即使我們在裁剪或者調整大小的時候丟掉一些信息。
訓練神經網絡需要注意什么
黑盒模型有一些 knobs / 旋鈕 來調整模型參數;
從技術角度來說,這些旋鈕稱之為 weights / 權重;
當這些旋鈕處於正確的位置,神經網絡就可以達到更好更正確的輸出結果;
訓練神經網絡就是要找到正確的 旋鈕設置 / 權重;
如何訓練神經網絡
如果你有一個黑盒,但是不知道正確的旋鈕設置,那么這個黑盒其實相當於沒用的;
好消息是你可以通過訓練神經網絡來找到正確的旋鈕設置。
訓練神經網絡和訓練小孩特別像。你拿一個球給小孩看,然后告訴他這是一個球;
當你給他看了很多種球之后,小孩就會弄明白,球和球的形狀有關,與它的顏色或者尺寸無關;
然后你給小孩一個雞蛋,問他這是什么,他回答是球。你糾正他這不是球,這是雞蛋;
當這個過程重復幾次之后,這個小孩就可以辨別球和雞蛋了。
為了訓練一個神經網絡,你給它幾千個想讓它學習的分類例子(比如貓,狗或者其他);
這種訓練稱之為 Supervised Learning / 監督學習,因為你提供給這個神經網絡來自某個分類的圖像,然后確切的告訴它,這張圖像來自這個分類;
為了訓練神經網絡,我們需要三件事情:
1. Training data / 訓練數據:
各種分類的數千張圖像和它們期待的輸出;
比如所有貓的圖像,被期待輸出為(1,0,0);
2. Cost function / 損失函數:
我們需要知道當前的權值設置是否比之前的設置要更好;
損失函數會統計訓練集中所有圖像經過神經網絡處理的錯誤信息;
常用的損失函數被稱為 sum of squared errors (SSE) / 平方誤差和;
對於一張圖像,你期待的輸出是一只貓或者(1,0,0),神經網絡的實際輸出是(0.37,0.5,0.13),
平方損失會計算出所有圖像的損失,都會被簡化為平方誤差之和;
訓練的目的就是找到合適按鈕設置(權重)達到最小化損失函數的目的。
3. How to update the knob setting / 如何調整權重:
最后我們需要根據觀察訓練圖像的錯誤數據,來更新神經網絡的權重;
用一個單獨的 knob / 旋鈕 來訓練神經網絡
我們現在有一千張貓的圖像,一千張狗的圖像,和一千張隨機的物體不是貓也不是狗,這三千張圖像就是我們的訓練集;
如果神經網絡還沒有被訓練,內部的權值是隨機的,當你將三千張圖像輸入神經網絡,得到輸出的准確率為 1/3 ;
為了簡化流程,我們的神經網絡只有一個旋鈕權值。由於我們已經僅僅有一個權值,我們可以測試一千種不同的權值測試,來找到可以最小化損失函數最好的權值設置。這樣就完成了我們的訓練;
然而,事實上神經網絡不僅僅有一個旋鈕權值,以流行的神經網絡 VGG-Net 為例,它有 1.38 億 個旋鈕權值。
利用多個旋鈕權值來訓練神經網絡
剛才我們用一個旋鈕來訓練神經網絡,在測試完所有可能性(可能數量很大)之后,我們可以找到最好的參數設置;
這有點不切實際,因為如果三個旋鈕權值,我們就要測試十億次;
很明顯這種暴力搜索方式是不切實際的;
幸運的是,有一種解決方法,當損失函數是 convex function / 凸函數 時(看起來像一個碗);
我們可以用 Gradient Descent / 梯度下降 的方式來迭代找到最好的權重;
Gradient Descent / 梯度下降
讓我們回到只有一個權值的神經網絡,並且假設我們現在的旋鈕設置(或者權值)是 ;
如果我們的損失函數像一個碗,我們可以找到損失函數的斜率,然后一步步移到最佳的旋鈕設置 , 這個過程稱為 梯度下降;
因為我們根據斜率(或者 Gradient / 梯度)逐漸向下移動( Descending / 下降 ),當我們到達損失函數碗的底部,梯度或者斜率會變成零,然后完成你的訓練;
這些碗形狀的函數被稱之為 convex functions / 凸函數。
但是第一次是如何估計?你可以選擇一個隨機數;
Note:當你使用一些流行的神經網絡架構,比如 GoogleNet 或者 VGG-Net,你可以使用基於 ImageNet 訓練的權重,而不是選擇隨機的初始權值,這樣可以收斂的更快。
當有多個旋鈕時,梯度下降也是相似的工作原理;
比如當有兩個旋鈕時,損失函數在 3D 坐標中看起來像一個碗一樣;
如果你把一個球放到這個碗的任何位置,球會沿着 the maximum downward slope / 最大下降斜率 滾到碗的底部,這也是梯度下降工作的原理;
如果你讓球以全速滾下去,它會到達底部,但是由於慣性和動能,還會繼續向上滾動,最終停在底部;
但是如果給這個球下落的時候增加約束條件,讓它更慢的下降,到達底部之后就不會再上升了,其實會花費更少的時間來達到底部;
實際上當我們訓練一個神經網絡的時候,我們使用一個參數 learning rate / 學習率 來控制收斂速度;
當我們有很多個紐扣(權重)時,損失函數的形狀在更高維的空間,依然是一個碗形。雖然這時候這個碗很難去可視化觀測,但是斜率和梯度下降依然可以工作;
因此梯度下降提供了一個很好的找到最小損失函數解決方案。
Backpropagation / 逆傳播
有一個問題,知道了當前的權值設置,我們怎么知道損失函數的斜率?
損失函數的梯度取決於訓練集中,真實輸出和當前輸出的差別;
換句話說,訓練集的每張圖像,如果神經網絡在這些圖像上表現的差,都會最終的梯度計算都有貢獻。
用來估計損失函數的梯度的算法,被稱為 Backpropagation / 逆傳播。
我們會在將來的文章中介紹逆傳播。
# 英文版權 @
# 翻譯中文版權 @ coneypo
# 轉載請注明出處