2016年11月25日 星期五

[深度學習練習] [Deep Learning Practice] 神經網路入門(二)- 深度學習介紹

這邊先大概紀錄一下,深度學習在我認知中是什麼樣子。

然後,用tensorflow做一個簡單的小練習,

大概是這樣子。

------------------------------------------------------------------------------------------------------------

一、深度學習基本架構

上一篇其實已經稍微講到深度學習是什麼東西,

好多個神經元們,彼此之間互相輸出輸入彼此的訊號,

那這樣的概念用圖像來表示會如下,


























這整張圖就是一個神經網路,最左邊開始分別為

 input、input layer(輸入層)、hidden layer(隱藏層)、output layer(輸出層)、output

光看圖就覺得很像神經網路,所以這命名應該是沒問題的。

由左到右的流程是,

1. 我們給一個輸入訊號,進入輸入層中

2. 輸入層的每個輸出訊號都會再輸入隱藏層中的每個輸入點

3. 隱藏層的每個輸出訊號都會再輸入輸出層中的每個輸入點

4. 輸出層把接收到的訊後做最後一次轉換,變成一個結果


那這種,每個層中綠色小點都可以跟下一層的綠色小點互動的構想要怎麼實現呢?

矩陣。


想一下,以上面那一張圖為例,就是輸入一個 1*7 的一維矩陣,

經過 7*9 矩陣(輸入層),輸出 1*9 的一維矩陣,

經過 9*5 矩陣(隱藏層),輸出 1*5 的一維矩陣,

經過 5*1 矩陣(輸出層),輸出一個值。

大概就是如下圖:











所以,我們可以把每一個神經層都想成是一個矩陣

而一個輸入值(向量)經過一個神經層得到一個輸出值(向量),

就是最簡單的神經網路模型,

那如果有好多個矩陣,就變成深度了。


*輸入不一定是一維矩陣,神經層不一定是二維矩陣,輸出也不一定是一個值


我們現在知道,如果要來實現深度神經網路,

必須要寫出很多個矩陣,對輸入值做運算然後得到輸出值。

現在我們已經有最最基本的深度神經網路雛形了!

------------------------------------------------------------------------------------------------------------

二、激活函數

接下來,我們要讓我們的神經層更像是我們生物的神經訊號

所以要在每一層神經層中間加上 activation function

這是什麼意思呢?



生理學裡大概有講到,神經元傳遞訊號是經由鈉、鉀離子流動控制細胞膜內外電位差,

當電位差到達閥值(Threshold voltage),就會去極化並開始動作 [6],

但當電位低於閥值時,神經元什麼事情都不會做

感覺就像是一個 Diode,將訊號作非線性的傳遞,圖解如下


















低於 Threshold voltage 的輸入,輸出都會變成 0,

而大於 Threshold voltage 的輸入,輸出都會變成 1,

所以我們只要在層與層中加上一個非線性轉換的方法,

就可以讓我們神經網路更像生物的神經網路。



在矩陣運算中的意思就是,輸入一個 [  0.1  0.5  0.7  0.2  1  0.6  ] 的訊號,

而閥值是 0.4,那我們會得到 [  0  1  1  0  1  1  ] 。

這個協助我們非線性轉換的方法,我們就把它通稱為 activation function [7]。



到這邊,我們知道,在數學的世界裡面,神經元被表達成這樣,

矩陣 + activation function = 神經元


*activation function 有很多種,有時甚至不需要每一層都要加,端看我們要解決什麼問題。


那現在有了神經元要幹嘛?

要學習!

------------------------------------------------------------------------------------------------------------

三、如何使用一堆矩陣來學習

我們人類有記憶能力,細胞會學習,知道遇到什麼事情要怎麼反應,

這其實可以看作是腦神經細胞最佳化的結果,我猜的。

所以,終於回到我們機器學習的主軸!

我們要藉由矩陣最佳化,讓機器學到最好的反應方式。

但是要怎麼最佳化呢?



最佳化之前,神經當然必須知道什麼是最佳值

像是,學習考試,我們也得知道考試的最佳是一百分這樣。

而當把每一次輸出值與最佳相比,會得到一個差值,我們把它叫做 Cost,

而計算這個 Cost 的方法,我們把它叫做 Cost function(一樣有很多種),

藉由這個 Cost,我們回頭去一層一層修改每一個矩陣中的每一個值。

數學有一點複雜,講一下概念就好。(這邊是 Andrew Ng 的講解



我們去做一張 Cost 是 y 軸,輸出層的值是 x 軸的圖,

對 x 作微分,我們就會得到 y 的極值點,而將發生極值的 x 當作下一次的輸出層。

拿 y 除以 x 我們會得到輸出層的輸入值 x',

再把這個 x' 當作最佳值對隱藏層做圖,找到使 x' 與原本隱藏層輸出差距最小的隱藏層值,

並把它當作下一次的隱藏層,

依序類推到輸入層,然後獲得一個全新的神經網路的權值(weight)。



我知道很複雜,我們舉一個生活化的例子好了。

今天每個人都是一串程式碼完成的機器,

目標是學習在大學畢業後成為自己期許的樣子。

你就是 input signal,大一你執行的每個決定都是 input layer,

在大一結束的那一刻的你,就是 input signal * input layer * activation function

大二的每一個決定都是 hidden layer,大二結束的那一刻,

你就是 input signal * input layer * activation function * hidden layer * activation function

由此類推,大四畢業後的你會是,

 input signal * input layer * activation function * hidden layer1 * activation function

 * hidden layer2 * activation function * output layer * activation function



我的 input signal 是物理系,然後每一個 layer 都是選擇不念書、開心玩,

那我的 output value 就是 GPA 不堪入目。

所以我藉由這件事情知道,我大四這一年 (output layer) 應該怎麼樣,

才能有好的 output value,然後一年一年修正回去,

規劃好大三、大二、大一分別要做出什麼樣的事,成為什麼樣的人,

再用時光倒流讓大學生活重來。

這一次,我可能得到 GPA 4,但卻發現我學的東西根本不是我喜歡的,

而且都沒享受到大學,我就一年一年再修正回去,重新擬定每一年的計畫,

再時光倒流一次,直到滿意為止,這就是深度學習裡面最佳化的概念。

以 Cost function 為標準,找出使 Cost 最小的大學生涯規劃。

而這種一年一年修正回去的過程我們也把它叫做 back propagation。

每次時光倒流(微分求極值)這個過程我們把它叫做

梯度下降法(Gradient descent method)



那對微積分有一點了解的話,大概會知道,運用微分等於 0 找極值,

是有機會找到局部最小值而非絕對最小值的

所以,我們現在主流的方法是 隨機梯度下降法(Stochastic gradient descent method),

好處就寫 code 時再說好了,不然這邊太長感覺很累。


------------------------------------------------------------------------------------------------------------

四、小結

這篇講了很基本的深度神經網路的架構以及架構中每一個環節的主要功能,

總結如下:

深度學習 = 最佳化 ( Cost )

Cost = Best - ( input * neural * neural *  neural )

neural = array * activation function



當然其中還有很多小東西和每個環節之間的關聯與影響,

就一邊寫程式一邊講!

------------------------------------------------------------------------------------------------------------

Reference

[1] Practical Machine Learning Problem

[2] 圖解機器學習

[3] Coursera - Machine Leanring 

[4] A tour of machine learning algorithms

沒有留言:

張貼留言