1. 程式人生 > >【翻譯】給初學者的 Neural Networks / 神經網路 介紹

【翻譯】給初學者的 Neural Networks / 神經網路 介紹

在這篇文章中,我會向大家簡要的介紹下 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 大小:

  1. Non-Square aspect ratio / 非正方形縱橫比調整:如果輸入影象不是正方形,你可以重新調整影象大小到256,然後從影象中間裁剪出 256*256 的畫素大小;
  2. 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

# 轉載請註明出處