自 2012 年 AlexNet 在 ILSVRC 贏得冠軍後,深度學習 (Deep Learning) 的概念逐漸成為顯學,人工神經網路 (Artificial Neural Network) 開始應用在傳統演算法無法解決的問題上,包含電腦視覺 (Computer Vision) 與自然語言處理 (Natural Language Processing)。
在開始探索深度學習的核心觀念之前,我們先從神經網路的始祖「感知器」(Perceptron) 開始學起,理解感知器的概念,能夠幫助我們奠定深度學習的理論基礎。
感知器 (Perceptron) 是 Frank Rosenblatt 基於生物中神經細胞的概念,於 1957 年發明的「人造神經元」(Artificial Neuron),是一種簡單的「二元線性分類器」。需要特別注意的是,在現代 (近幾年) 發表的神經網路 (Neural Network) 模型中,所使用的神經元並不是 Perceptron,而是另外一種神經元,稱為「Sigmoid Neuron」。關於 Sigmoid Neuron 的觀念,我們將會在下一篇文章介紹。了為了完全解 Sigmoid Neuron 的原理,我們必須先掌握 Perceptron 的精髓!
如上圖所示,Perceptron 能夠接收多個數值,並且輸出一個數值。其中 x1、x2、x3 與 output 皆為「二元數值」,也就是他們的數值不是 0 就是 1。
Rosenblatt 也提出一個簡單的方法來計算 Perceptron 的 output:將每一個輸入 x 與不同的參數 w 相乘,並計算他們的總和。如果總和大於某一個門檻 (threshold) 即輸出 1,否則輸出 0。w 與 threshold 都是這一個 Perceptron 的參數。
我們也可以利用數學算式理解 Perceptron 的原理:
我們可以用生活中的例子,更直觀的理解 Perceptron 的運作方式。如上圖所示,我們可以將 x1、x2、x3 想成不同的「因素」,output 則視為最終的「決定」。舉例來說,假設這個週末你的朋友約你一起出去玩,你很猶豫要不要去,因為你還在考慮以下三件事情:
我們可以將這三個考慮的「因素」當作上面 Perceptron 的 x1、x2、x3 ,將最後「決定」要不要去當作 output。舉例來說,如果週末晴天,則 x1 為 1;如果是雨天,則 x1 為 0。如果出去玩的成員中有異性,則 x2 為 1;如都是一群肥宅,則 x2 為 0。x3 也是相同的概念。
因為你對這三個因素有不同的「重視程度」,因此在 Perceptron 中 x1、x2、x3 也會有相對應的參數 w。舉例來說,假設你真的非常在意「出去玩的成員中有沒有異性」,只要出去玩的成員中有異性,即是週末註定下大雨,注定不能搭別人的車子,你仍會決定要去,則 w2 的數值會大於 w1 與 w3。
綜合上述的描述,你將三項因素的重視程度做了排序:「出去玩的成員中有沒有異性」>「週末會不會下雨」=「能不能搭別人的汽車過去」,則 Perceptron 的 w 數值可能為 w1 = 3、w2 = 6、w3 = 3。
Perceptron 中的參數除了 w 外還有 threshold,在此例子中我們將 threshold 設為 5。如此一來,如果「出去玩的成員中『有』異性」(x2 為 1);「週末『會』下雨」(x1 為 0);「『不能』搭別人的汽車過去」(x3 為 0),最後的決定 (output) 仍然會是 1。如果我們將 threshold 設為一個很大的數字 (例如:100),那麼即使三個因素都符合你的預期,你最終也會決定不和朋友出去玩。
由這個例子,我們可以發現透過調整 Perceptron 中的 w,可以給予因素不同的重視程度,也就是給予輸入不同的權重;調整 Perceptron 中的 threshold,則象徵你有多想做出正向的決定,也就是輸出多有可能為 1。
在上面的例子中,我們可以發現到一個 Perceptron 能夠處理的問題的複雜度其實有限,為了解決現實生活中更複雜的問題,我們可以使用更多的 Perceptron,形成一個神經網路 (Neural Network)。
如上圖所示,我們將 8 個 Perceptron 組織成一個 Neural Network。在 Neural Network 的第 1 層有 3 個 Neuron,每一個 Neuron 都會將每一個輸入乘以一個權重 (w) 並將其總和在一起,根據最終的總和是否大於門檻 (threshold) 輸出 1 或 0。因此,這一層神經網路 (有三個 Neuron) 相當於做了三種不同的決定。下一層的 Neuron 又會根據前一層的輸出 (決定) 進行決策。如此一來,愈後層的神經元所做的決定,會比前面層的更複雜、更抽象。因此,為了有效處理現實生活中困難的問題,我們經常會搭建出超級多層的神經網路。
你可能會覺得奇怪,因為在一開始介紹 Perceptron 時,明明只會有一個 output,但是為什麼在上圖的 Neural Network 中 Perceptron 卻有多個 output 呢?其實,Perceptron 仍然只有一個 output,只是我們將 output 用於多個 Neuron 的 input,因此才畫出多個箭頭。
在一開始,我們介紹到 Perceptron 的數學算式如上圖所示。然而,這個算式看起來又臭又長,因此我們要將其簡化,主要是做 2 個小改變。
首先,∑wx 是將每一個輸入與權重相乘後的總和,可以單純用「內積」表示:w ⋅ x,兩者皆為向量。此外,我們也可以將 threshold 由不等式的右邊移到左邊,形成:−threshold,−threshold 看起來相當冗長,因此以 b 表示。
在深度學習的世界中,我們經常會將 w 稱作 weight,b 稱作 bias。weight 與 bias 都是神經網路模型的參數。在接下來的文章中,我們也會使用 weight 與 bias 來描述神經網路中的參數。
bias 的概念經常讓人覺得有些抽象。如同上文所述的,bias 的前身為 threshold,象徵這一個 Neuron 的輸出有多麽大的機會為 1;以生物學的角度來想,我們也可以將 bias 想成這一個 Neuron 被「激活」的難易度。如果某一個 Neuron 的 bias 是一個很大的數字 (例如 : 100),則無論輸入 x 是什麼,最後的輸出都很可能會是 1 (Neuron 被激活);反之,當 bias 是一個很小的負數 (例如 : -1),則最後的輸出都很可能會是 0。
在上文中,我們介紹了 Perceptron 如何將每一個輸入給予不同的權重,並計算相乘後的總和。實際上,Perceptron 也可以作為一個「Logical Function」。最簡單的 Logical Function 相當於我們在數位電路設計的課程中學到的「邏輯閘」,也就是 AND、OR、NOT Gate。
舉例來說,如上圖所示,我們有一個 Perceptron 接受兩個輸入 (x1 與 x2),兩個輸入的權重 (w1 與 w2) 都是 -2,bias 為 3。我們輸入 00 (x1=0 與 x2=0) 到 Perceptron 中,得到的輸出為 1,因為 (0 × -2) + (0 × -2) + 3 = 3。同樣的,我們輸入 01 與 10 到 Perceptron 中,最後得到的輸入也是 1。然而,如果我們輸入 11,因為 (1 × -2) + (1 × -2) + 3 = -1,所以得到的輸出為 0。由此可知,這一個 Perceptron 的運作,和 NAND Gate 完全相同。
「NAND Gate」!如果你曾經學過數位電路相關的課程,你一定會想到 NAND Gate 是一個「Universal Gate」。也就是說,我們可以透過 NAND Gate 搭建出任何我們想要的 Logical Function。
舉例來說,在上圖中我們僅透過 NAND Gate 搭建一個加法器 (Half Adder)。又因為 Perceptron 其實可以當作 NAND Gate 來使用,因此我們可以將上圖中所有的 NAND Gate 替換成 Perceptron。
將所有的 NAND Gate 都替換成 Perceptron 後,電路圖瞬間變成了 Neural Network。仔細觀察這一個 Neural Network 可以發現,最左邊的 Neuron 有兩個輸出同時輸入到同一個 Neuron。這對我們來說比較奇怪,因為在前面的 Perceptron 介紹中,我們沒有畫出這樣的輸入與輸出的模式。為了化解疑慮,實際上我們也可以將兩個輸入合成為一個輸入,並將權重由 -2 變為 -4,整個 Neural Network 的運作結果仍然不變。
除此之外,我們通常會將 Neural Network 最左邊的輸入也用「Perceptron 的符號」表示:
如上圖所示,當我們將 Neural Network 的輸入 (x1 與 x2) 用 Perceptron 來表示時,最左邊看起來就像是多了一層 (Layer),我們通常稱這一層為「輸入層」(Input Layer)。
然而,你可能會覺得奇怪:為什麼 Input Layer 的 Perceptron 沒有輸入?為了避免這樣的疑慮產生,我們不要將 Input Layer 中的 Neuron 視為真的 Perceptron,而是將他們當作一種特別的 Neuron,表示整個 Neural Network 的輸入。
由於 Perceptron 相當於 NAND Gate,NAND Gate 又是一種 Universal Gate 可以用來表達任何的運算。因此,我們以可以用 Perceptron 來組成 Neural Network,表達任何的運算。
「Perceptron 可以表達任何的運算」聽起來非常厲害,表示我們可以利用 Perceptron 組合出非常強大的運算裝置;然而,卻也令人失望,畢竟 Perceptron 就是 NAND Gate 化身啊!
但是,也別對 Perceptron、Neural Network 或是 Deep Learning 失去了希望,因為後來許多學者的努力研究,為 Perceptron 加入了其他元素,讓它不僅僅只是 NAND Gate 的化身。其中,最重要的即是「學習演算法」(Learning Algorithm)。透過 Learning Algorithm 我們可以讓 Perceptron「自己」調整參數 (weight 與 bias)!
這讓 Perceptron 與 NAND Gate 產生了很大的不同,我們不需要自己用一個個 Perceptron 組合出一個 Neural Network,然後手動設定 Neural Network 中的參數,而是讓整個 Neural Network 自動去調整自己的參數。
在本篇文章中,我們介紹了 Perceptron 的基本概念,了解 Perceptron 的運作與數學算式。透過 Perceptron 與 NAND Gate 的關係,說明可以利用多個 Perceptron 組成 Neural Network 表達任意的運算。最後我們也提到 Learning Algorithm 讓 Perceptron 不僅僅只是 NAND Gate,而是一個可以自己學習的人工智慧。
在下一篇文章中,我們將會介紹更接近現代 Neural Network 中所使用的 Neuron —— Sigmoid Neuron。