Artificial Neural Network?
在我的
上一篇文章中,我們提到了人工智慧 & 機器學習 & 深度學習跟神經網路的關係,我們也了解到了所謂的深度學習是一種基於神經網路上的機器學習方法。那麼神經網路到底是什麼呢? 我們上一篇文章裡面提到的神經網路的層Layer究竟是什麼呢? 到底為什麼神經網路需要這麼多的神經元(Neurons)跟層數呢? 到底又怎麼利用這些神經元跟多層的架構來達到邏輯推理的能力呢? 我們這篇文章會盡量用最簡單的方式來解釋給各位聽。
我們主要是參考了
這篇國外的影片,本篇的內容是從這篇影片簡化而來的,也要感謝這位Youtuber無私地分享這些知識。要了解神經網路,首先我們要知道的就是神經網路就是從我們人類的大腦的設計得到靈感的,大腦真的是無比強大的一個器官,舉例一個辨識數字的例子來說,底下這些圖案,大家應該都可以很輕鬆地知道都是數字"3"對吧?
正因為辨識數字這件事情對我們大腦來說太簡單了,以致於大家很難理解這對人腦這麼簡單的事情,對於電腦來說可是非常挑戰的。對電腦來說,數字"3"就是一個圖案,而圖案就是由一個一個像素點像樂高一樣推積而成的。如果拆解成一個點一個點來看,那麼這幾個"3"各自佔據的像素點根本完全不同,如果要寫一個判斷式讓電腦判斷那些像素點(格子)依照那些規則被占滿,就是"3"的話,一定超級複雜對吧?
Different 3, Different pixels
那麼神經網路究竟是怎麼做到,讓電腦可以判別這些"3"雖然長相還有像素都不同,但是都是"3"呢? 我們先來看看神經網路的長相,在我的上一篇文章中也有提到,所謂的Input layer就是把資料輸入的層,而output layer就會是要輸出我們需要知道的資訊。至於中間的hidden layer很神秘,我們暫且把他理解為,幫助我們從輸入的資料變成我們得到結果的過程所需要的程序,而這些程序可以看做是把輸入的資料的特徵拆解出來 (舉例來說,把輸入的3這個圖片的特徵拆解出來,然後判別有哪些特徵屬於哪個數字,把資料往下傳遞處理直到得到正確解答) 這樣子講還是不容易理解,我們先往下看。
Basic structure of neural network
那麼以今天我們要辨識數字這樣的需求來說好了,我們來假設這個神經網路可以達成我們的目的 "把輸入的數字辨識出到底是0~9之間哪一個數字"。
那麼第一步我們要怎麼樣把數字變成一個input layer輸入這個網路呢? 最簡單的方法就是要把數字變成圖片,然後圖片拆成一個一個小像素(點)囉。為了簡化問題,假設我們把每個數字拆解成28x28 pixel的像素來看,然後依據顏色的深淺,給予這些數字0~1之間的數值,假設全黑就是0, 全白就是1的話,我們得到以下的圖片
Number 9 being turned into vectors
可以看到數字"9"先被變成圖片,然後又被拆解成了28x28=784個小點,而這每一個小點依據亮暗程度高低,被賦予了一個數字,做到這邊,我們終於可以把這個數字的圖片變成輸入層input layer了,也就是784個介於0~1之間的數值。
而我們的輸出層呢,很簡單因為我們的目標是要判斷是哪一個數字,所以輸出一定就是0~9這10個數字的其中之一,所以我們的神經網路應該要長這樣子。
Neural Network for distinguish numbers
輸出層只有10個神經元Neurons,神經元(圖上的小圓點)也就是拿來乘載一個0~1 間的數字的單元,這個神經網路目的就是希望當你輸入一個9個數字的(圖案)時,最後得到輸出層那10個神經元中的數字,屬於"9"這個神經元裡面的數字最大,那麼這個神經網路就會輸出9這樣的答案,這樣這個神經網路就算是設計成功了。看到這邊,我們知道了輸入,也明白了輸出,可是神經網路這一層又一層到底相互的關係是什麼呢? 中間的隱藏層Hidden Layer究竟是做什麼的呢?
要理解神經網路真的不容易,最容易的方法就是從解答倒著推理回去,假設最後一層輸出層能夠判別出是哪一個數字,那麼往回推一層也就是倒數第二層應該要判別那些東西呢? 我們可以理解為,每個數字的形狀,都可以拆解成一些特徵,那麼舉例來說"9"這個數字好像就可以拆解為一個圓圈形狀+一個長條形狀,而"8"這個數字好像就可以拆解為兩個圓圈的形狀,而4的話就好像是由一個長線條跟兩個短線條組合而成的。 如下圖
如果我們的倒數第二層能夠幫我們分辨出圖片有哪些這些特徵的話,舉例來說,如果這倒數第二層的資訊告訴我們,有很高的機會這個圖案裡面有兩個圓圈圈連在一起的話,那麼應該我們就有很高的機率可以再輸出層判定,這是一個數字"8"。
好的問題來了,那麼假設倒數第二層可以幫我們分辨出這些特徵的話,那麼倒數第三層怎麼告訴我們圖片裡有這些特徵呢? 其實就是我們把這些特徵繼續往下拆分,舉例來說一個圓圈圈就是可以拆分為好幾個轉角,然後一個長條形就可以拆分為好幾個短的線條,以此類推...如下圖
那麼倒數第三層就是拆解成有這些小小的特徵,並且幫我們判斷圖片裡面是否有這樣的特徵。那麼總結前面幾個段落的結論,我們就得到了以下這樣的神經網路各層的用處還有示意圖:
Neural network for number recognition
假設把整個網路簡化到只有4層好了,那麼輸入層幫忙把資料輸入,第二層幫忙判別是否有這些小小的直線/轉折在整張圖之內,第三層幫忙判別是否有較大的較為複雜的特徵如圓圈,長直線短直線等,最後的輸出層就能夠分析出來最高的機率是哪個數字了。
看到這邊可能大家已經基礎的知道神經網路的結構了,可是還是謎團滿滿,那麼究竟神經元之間的連結線是什麼? 然後一層跟一層之間的關係是什麼? 為什麼可以從輸入之中判斷出是否有這些特徵呢? 的確,這是必須要說明的,但是這部分也跟數學有比較大的關係,如果不想深究的朋友可以先理解到這邊,知道神經網路是一個從輸入資料中拆解出特徵來判斷的過程,下一篇我們會繼續說明,更重要的是我們後面必須要理解神經網路究竟是怎麼學習? 畢竟這才是神經網路神奇之處。 我們下次見囉