AlphaGo到底是如何下棋?兼談幾個對AlphaGo的誤解

AlphaGo到底是如何下棋?兼談幾個對AlphaGo的誤解
Photo Credit: Ahn Young-joon / AP Photo / 達志影像

我們想讓你知道的是

本文簡單介紹AlphaGo所使用的「深度學習技術」以及其下棋策略,順帶澄清幾個坊間對AlphaGo的誤解。

文︰尹相志

點部落格改版一段時間,我也荒廢了沒寫部落格好久,一直在想一個機會再重新拾筆,在人類連輸AlphaGo三局後的今天(編按,原始文章寫於3月12日,李世乭於13日拿下首勝),我想正好是一個好時機,也讓大家對於AlphaGo所涉及的深度學習技術能夠有更多的理解(而不是想像復仇者聯盟中奧創將到來的恐慌)。在說明Alpha Go的深度學習技術之前,我先用幾個簡單的事實總結來釐清大家最常誤解的問題:

  • AlphaGo這次使用的技術本質上與深藍截然不同,不再是使用暴力解題法來贏過人類。
  • 沒錯,AlphaGo是透過深度學習能夠掌握更抽象的概念,但是電腦還是沒有自我意識與思考。
  • AlphaGo並沒有理解圍棋的美學與策略,他只不過是找出了2個美麗且強大的函數來決定他的落子。
  • 就算是AlphaGo,在定義上,仍舊是屬於弱人工智慧。

類神經網路的起源及寒冬

其實類神經網路是很古老的技術了,在1943年,Warren McCulloch以及Walter Pitts首次提出神經元的數學模型,之後到了1958年,心理學家Rosenblatt提出了感知器(Perceptron)的概念,在前者神經元的結構中加入了訓練修正參數的機制(也是我們俗稱的學習),這時類神經網路的基本學理架構算是完成。類神經網路的神經元其實是從前端收集到各種訊號(類似神經的樹突),然後將各個訊號根據權重加權後加總,然後透過活化函數轉換成新訊號傳送出去(類似神經元的軸突)。

至於類神經網路則是將神經元串接起來,我們可以區分為輸入層(表示輸入變數),輸出層(表示要預測的變數),而中間的隱藏層是用來增加神經元的複雜度,以便讓它能夠模擬更複雜的函數轉換結構。每個神經元之間都有連結,其中都各自擁有權重,來處理訊號的加權。

傳統的類神經網路技術,就是透過隨機指派權重,然後透過遞迴計算的方式,根據輸入的訓練資料,逐一修正權重,來讓整體的錯誤率可以降到最低。隨著倒傳導網路、無監督式學習等技術的發展,那時一度類神經網路蔚為顯學,不過人類很快就遇到了困難,那就是計算能力的不足。因為當隱藏層只有一層的時候,其實大多數的狀況,類神經網路的分類預測效果其實並不會比傳統統計的羅吉斯迴歸差太多,卻要耗費更龐大的計算能力。

但是隨著隱藏層神經元的增加,或者是隱藏層的增加,那麼所需要計算權重數量就會嚴重暴增。所以到了80年代後期,整個類神經網路的研究就進入了寒冬,各位可能只能在洗衣機裡體會到它小小威力(現在洗衣機裡根據倒入衣物評估水量與執行時間很多都是用類神經網路作的)。說真的,類神經網路一點都沒有被認為強大。

類神經網路的復興

這個寒冬一直持續到2006年,在Hinton以及Lecun小組提出了「A fast learning algorithm for deep belief nets」論文之後,終於有了復甦的希望,他們提出如果類神經網路神經元權重不是以隨機方式指派,那麼應該可以大幅縮短神經網路的計算時間。他們的方法是,用類神經網路的非監督式學習來做為神經網路初始權重的指派。那時由於各家的論文期刊只要看到類神經網路字眼基本上就視為垃圾不刊登,所以他們才提出「深度學習」這個新的字眼突圍。

除了Hinton的努力之外,得力於摩爾定律的效應,我們可以用有更快的計算能力。Hinton後來在2010年使用了這套方法搭配GPU的計算,讓語音識別的計算速度提升了70倍以上。

深度學習的新一波高潮來自於2012年,那年的ImageNet大賽(有120萬張照片作為訓練組,5萬張當測試組,要進行1000個類別分組)深度學習首次參賽,把過去好幾年只有微幅變動的錯誤率,一下由26%降低到15%。而同年微軟團隊發布的論文中顯示,他們透過深度學習將ImageNet 2012資料集的錯誤率降到了4.94%,比人類的錯誤率5.1%還低。而去年(2015年)微軟再度拿下ImageNet 2015冠軍,此時錯誤率已經降到了3.57%的超低水準,而微軟用的是152層深度學習網路(我當初看到這個數字,嚇都嚇死了)….

用最簡單的定義談深度學習,應該就是大量的訓練樣本+龐大的計算能力+靈巧的神經網路結構設計,我們這邊針對AlphaGo所使用的卷積神經網路來做比較詳盡的說明。

卷積神經網路(Convolutional Neural Network)

在圖像識別的問題上,我們處理的是一個二維的神經網路結構,以100×100像素的圖片來說,其實輸入資料就是這10000像素的向量(這還是指灰階圖片,如果是彩色則是30000),那如果隱藏層的神經元與輸入層相當,我們等於要計算108(10的8次方)的權重,這個數量想到就頭疼,即使是透過平行計算或者是分布式計算都恐怕很難達成。因此卷積神經網路提出了兩個很重要的觀點:

  1. 局部感知域:從人類的角度來看,當我們視覺聚焦在圖片的某個角落時,距離較遠的像素應該是不會影響到我們視覺的,因此局部感知域的概念就是,像素指需要與鄰近的像素產生連結,如此一來,我們要計算的神經連結數量就能夠大幅降低。舉例來說,一個神經元指需要與鄰近的10×10的像素發生連結,那麼我們的計算就可以從108降低至100×100×(10×10)=106了。
  2. 權重共享:但是106還是很多,所以這時要引入第二個觀念就是權重共享。因為人類的視覺並不會去認像素在圖片上的絕對位置,當圖片發生了平移或者是位置的變化,我們都還是可以理解這個圖片,這表示我從一個局部所訓練出來的權重(例如10×10的卷積核)應該是可以適用於照片的各個位置的。也就是說在這個10×10範圍所學習到的特徵可以變成一個篩選器,套用到整個圖片的範圍。而權重共享造成這10×10的卷積核內就共用了相同的權重。一個卷積核可以理解為一個特徵,所以神經網路中可以設計多個卷積核來提取更多的特徵。下圖是一個3×3的卷積核在5×5的照片中提取特徵的示意圖。
Image Credit: Unsupervised Feature Learning and Deep Learning Tutorial

Image Credit: Unsupervised Feature Learning and Deep Learning Tutorial

卷積層找出了特徵後,就可以做為輸入變量到一般的類神經網路進行分類模型的訓練。不過當網路結構越來越複雜,樣本數如果不是極為龐大,很容易會發生過度學習的問題(over-fitting,神經網路記憶的建模數據的結構,而非找到規則)。因此我們後來引入池化(pooling)或是局部取樣(subsampling)的概念,就是在卷積核中再透過n×n的小區域進行彙總,來凸顯這個區域的最顯著特徵,以避免過度學習的問題。

所以常見的圖像識別技術(例如ImageNet)就是透過多階段的卷積層+池化層的組合,最後在接入一般的類神經網路架構來進行分類預測。下圖是一個圖像識別的範例。其中的C2、C4、C6都是卷積層,而S3與S5則是池化層。卷積神經網路建構了一個透過二維矩陣來解決抽象問題的神經網路技術。而圖像識別不再需要像過去一樣透過人工先找出圖像特徵給神經網路學習,而是透過卷積網路結構,它們可以自己從數據中找出特徵,而且卷積層越多,能夠辨識的特徵就越高階越抽象。


猜你喜歡

Tags: