接下來開始討論怎麼樣應用時下最流行的框架之一: Tensorflow,來編寫人工智慧程式,
並且通過烘煮咖啡來舉例。
情境是我們有兩個變因來控制咖啡豆,分別是溫度與時間,X 是滋味好的,O是滋味不好的,
其實從分類的圖上,我們能大略辨識出中間的區塊,也就是溫度與時間都剛剛好的條件,會有滋味好的咖啡,
而要怎麼寫人工智慧程式讓AI學會這件事呢?
在使用 tensorflow 寫 neural network 時,不需要自己定義 sigmoid 的公式,
我們要做的就是先思考自己需要什麼樣的架構、有哪一些input與output,
首先把 input 定義成溫度與時間,這就是input layer,
然後再定義隱藏層的神經元個數 (unit) 還有 activation function 形式 (activation='sigmoid'),
然後再把 input layer 輸入到隱藏層中執行完,並把輸出值定義為a1,
最後定義 output layer ,由於只有一個output,所以是1個神經元並以sigmoid function 為activation function,
輸出值 a2 當然就是 a1 輸入到 output layer 執行完後的結果。
最後在用 if/else 來按照 decision boundary 來決定是好咖啡 or 壞咖啡。
即便是字元辨識這種題目,寫法也是完全一樣的,
只不過因為 input 是像素值,所以數目多出很多,
而且資料比較複雜,所以需要使用的隱藏層和神經元也比較多。
由於Tensorflow 開發出來的時間比 NumPy 還要晚很多,
所以在一些寫法上會有點不同,接下來就來介紹進一步的細節。
由於 tensorflow 也設計之初是為了配合大量的資料,
比起用一個向量 (1D vector) 來表現,用矩陣 (2D array) 來表現數列會更省記憶體,
所以使用 tensorflow 時我們傾向於使用矩陣,
如果是有兩列 (橫的,即投影片中的row)、三行 (直的,即投影片中的column) 的矩陣,稱之為 2x3 matrix。
我們可以注意到在呈現一個數列向量 (1D vector) 時,tensorflow 的寫法會是一個中括弧,
不過如果要呈現的是矩陣的話,則會有兩個中括弧,首先用一個中括弧去表示一個數列,
最後再用一個中括弧把每一列都包含進去。
繼續以煮咖啡為例子,feature 一樣是溫度和時間,Y則是1/0 代表是否為好咖啡,
所以 feature 的寫法就是 np.array([[200.0, 17.0]]) 也就是以矩陣的型式表現,
類神經網路的寫法則如下所示,
先定義第一層hidden layer (layer_1) 有3個神經元 (units=3)、使用S形函數 (activation='sigmoid'),
如果把hidden layer 輸出的 a1 叫出來檢查,可以發現它是一個1x3的矩陣,
接下來就是 output layer (layer 2),由於只有一種output 所以就只會有一個神經元,
定義為 unit=1 且同是使用S形函數,輸出的 a2 透過檢查可以發現是個1X1的矩陣。
相信大家可以注意到,如果一直重覆這樣的寫法來寫每一層 hidden layer,會相當廢工,
所以就引入了一個 sequential 函數,它的目的是要告訴處理器說要用連續的方式來處理每一層layer,
第一層就是 unit = 3的hidden layer,第2層則是 unit = 1 的output layer,
以手寫辨識的案例來說,只要先定義好每一層 hidden layer 各要幾個神經元、用什麼activation function,
就能用一個 sequential 函數輕鬆地把他們串在一起,不用還寫一大堆 a1 a2 之類的方程式。
最後把以上的內容都集合起來,展示給大家看 forward propagation 要怎麼寫成code ,
首先針對第一層hidden layer,已知它有3個神經元所以會有3個 weighting 和 bias,
權重都是 2X1的矩陣,所以我們要把他們給集合起來形成 2x3的矩陣,
同樣地,bias 本身是一個數字,我們同樣集合起來形成 1x3的矩陣: b = np.array([-1,1,2])。
接下來就定義 dense layer 的內容了,
神經元的數目就等於 weighting 的數目,也就是 column 的數量,所以 units = W.shape [1],
因為我們需要outpupt 3個 activation function的數值,所以a 一樣是 1X3的矩陣並設定成從0出發,即[0,0,0],
接下來就設定一個 for loop,目的是要把 weighting 給一排接著一排output 出來之後,
再丟去跟神經元的輸入值做相乘、加上 bias之後,算完的 z值再丟到 activation function中,最後輸出 a_out。
最後,再定義一個 sequential 函數,把hidden layer 根據你設定的神經網路架構來組合,
如此就完成了一個 forward propagation。
本週的最後,吳恩達教授就開始討論,AI是不是真的正在取代人類。
事實上,我們在課堂上介紹的人工智慧,都還在 artificial narrow intelligence (ANI)的領域,
而ANI 的確已經開始在很多生活上的場域做出貢獻,
不過人們更常幻想到的是所謂的 artificial general intelligence,像是科幻電影中的機器人,
吳恩達教授自己也認為目為的技術離實現AGI還有很長一段距離。
事實上,現在最夯的類神經網路架構,只不過是在試圖模仿神經元的運作方式而已,
但是大腦的功能是如此的複雜,是不可能用一個單純的數學模型就能解釋的,
而且我們對於大腦的運作方式其實也還不是非常地了解,
因此在人類真的能全面理解大腦的運作方式之前,AGI 大概都還沒有辦法實現。
不過吳恩達教授提到一個叫 One Learning Algorithm 的概念,
現在科學家已經發現,腦細胞事實上有非常好的訓練彈性,
像一些我們既定認為是用來專門處理特定感知的區域 (例如,聽覺、觸覺、視覺),只要專門去訓練它,
該區域事實上是有辦法學到本來不該屬於它學習的技能的,也就是觸覺區搞不好學會處理視覺的資訊。
既然大腦擁有這麼強的適應性,我們會期待總有一天,我們也能創造一種雖簡單但能處理各種問題的人工智慧,
這就是所謂的 One Learning Algorithm hypothesis了。
留言列表