程序員入門人工智能算法,大牛們從建模問題開始

程序員入門人工智能算法,大牛們從建模問題開始

來源 | 異步 | 文末有福利


程序員入門人工智能算法,大牛們從建模問題開始

說起人工智能,大家總把它和科幻電影中的機器人聯繫起來,而實際上這些科幻場景與現如今的人工智能沒什麼太大關係。


人工智能確實跟人類大腦很相似,但它們的顯著差異在於人工智能是人造的——人工智能不必具備生物特性。

程序員入門人工智能算法,大牛們從建模問題開始

人工智能的目標是使計算機可以如人腦一樣工作,但這並不意味著人工智能需要在方方面面都向人腦看齊。某個人工智能算法與人腦真實功能的匹配程度稱為“生物似真性”。


艾倫腦科學研究所(Allen Institute of Brain Science)的首席科學官Christof Koch曾斷言大腦“是已知宇宙中最複雜的東西”。而在人工智能的學科背景下,大腦本質上就是一種深奧、繁複的技術,我們有必要對它進行研究,通過逆向工程來解析它的工作原理和機制,從而模仿它的功能。

程序員入門人工智能算法,大牛們從建模問題開始

在進一步深入學習之前,還要介紹一些與人工智能算法交互的通用概念。人工智能算法也稱為“模型”, 本質上是一種用以解決問題的技術。現在已經有很多特性各異的人工智能算法了,最常用的有神經網絡、支持向量機、貝葉斯網絡和隱馬爾科夫模型等。


對於人工智能從業者來說,如何將問題建模為人工智能程序可處理的形式是至關重要的,因為這是與人工智能算法交互的主要方式。接下來我們將以人類大腦與現實世界的交互方式為引,展開關於問題建模基本知識的講解。

對輸入/輸出建模


機器學習算法實際上就是給定輸入,產生輸出,而輸出又受到算法本身的長短期記憶影響。下圖展示了長短期記憶如何參與產生輸出的過程。


程序員入門人工智能算法,大牛們從建模問題開始

機器學習算法抽象圖示


如圖所示,算法接受輸入,產生輸出。大多數機器學習算法的輸入和輸出是完全同步的,只有給定輸入,才會產生輸出,而不像人腦,既可以對輸出做出響應,偶爾也能夠在沒有輸入的情況下自行產生輸出。


到目前為止,我們一直在抽象地談論輸入/輸出模式,你一定很好奇輸入/輸出到底長什麼樣兒。實際上,輸入和輸出都是向量形式,而向量本質上就是一個如下所示的浮點數組:

<code>Input:[-0.245,.283,0.0]Output:[0.782,0.543]/<code>

絕大多數機器學習算法的輸入和輸出數目是固定的,就像計算機程序中的函數一樣。輸入數據可以被視作函數參數,而輸出則是函數的返回值。就上例而言,算法會接受3個輸入值,返回兩個輸出值,並且這些數目一般不會有什麼變化,這也就導致對特定的算法而言,輸入和輸出模式的元素數量也不會改變。


要使用這種算法,就必須將特定問題的輸入轉化為浮點數數組,同樣,問題的解也會是浮點數數組。說真的,這已經是大多數算法所能做的極限了,機器學習算法說穿了也就是把一個數組轉換為另一個數組罷了。


在傳統編程實踐中,許多模式識別算法有點兒像用來映射鍵值對的哈希表,而哈希表在很大程度上與字典又有些相似之處,因為它們都是一個條目對應一個含義。哈希表一般長下面這樣兒:


● “hear” ->“to perceive or apprehend by the ear”;

● “run” ->“to go faster than a walk”;

●“write” ->“to form (as characters or symbols) on a surface with an instrument(as a pen)”。


上例這個哈希表是一些單詞到定義的映射,其中將字符串形式的鍵映射為同樣是字符串形式的值。你給出一個鍵(單詞),哈希表就會返回一個值(對應單詞的定義),這也是大多數機器學習算法的工作原理。


在所有程序中,哈希表都由鍵值對組成,機器學習算法輸入層的輸入模式可以類比為哈希表中的“鍵”,而輸出層的返回模式也可以類比為哈希表中的“值”——唯一的不同在於機器學習算法比一個簡單的哈希表更為複雜。


還有一個問題是,如果我們給上面這個哈希表傳入一個不在映射中的鍵會怎麼樣呢?比如說傳入一個名為“wrote”的鍵。其結果是哈希表會返回一個空值,或者會嘗試指出找不到指定的鍵。而機器學習算法則不同,算法並不會返回空值,而是會返回最接近的匹配項或者匹配的概率。比如你要是給上面這個算法傳入一個“wrote”,很可能就會得到你想要的“write”的值。


機器學習算法不僅會找最接近的匹配項,還會微調輸出以適應缺失值。當然,上面這個例子中沒有足夠的數據給算法來調整輸出,畢竟其中只有3個實例。在數據有限的情況下,“最接近的匹配項”沒有什麼實際意義。


上面這個映射關係也給我們提出了另一個關鍵問題:對於給定的接受一個浮點數組返回另一個浮點數組的算法來說,如何傳入一個字符串形式的值呢?下面介紹一種方法,雖然這種方法更適合處理數值型數據,但也不失為一種解決辦法。


詞袋算法是一種編碼字符串的常見方法。在這個算法模型中,每個輸入值都代表一個特定單詞出現的次數,整個輸入向量就由這些值構成。以下面這個字符串為例:

<code>OfMiceandMenThreeBlindMiceBlindMan'sBluffMiceandMoreMice/<code>


由上例我們可以得到下面這些不重複的單詞,這就是我們的一個“字典”:

<code>Input0:andInput1:blindInput2:bluffInput3:man'sInput4:menInput5:miceInput6:moreInput7:ofInput8:three/<code>


因此,例子中的4行字符串可以被編碼如下:

<code>OfMiceandMen[0457]ThreeBlindMice[158]BlindMan'sBluff[123]MiceandMoreMice[056]/<code>


我們還必須用0來填充字符串中不存在的單詞,最終結果會是下面這樣:

<code>OfMiceandMen[1,0,0,0,1,1,0,1,0]ThreeBlindMice[0,1,0,0,0,1,0,0,1]BlindMan'sBluff[0,1,1,1,0,0,0,0,0]MiceandMoreMice[1,0,0,0,0,2,1,0,0]/<code>


請注意,因為我們的“字典”中總共有9個單詞,所以我們得到的是長度為9的定長向量。向量中每一個元素的值都代表著字典中對應單詞出現的次數,而這些元素在向量中的編號則對應著字典中有效單詞的索引。構成每個字符串的單詞集合都僅僅是字典的一個子集,這就導致向量中大多數值是0。

如上例所示,機器學習程序最大的特徵之一是會把問題建模為定長浮點數組。下面用一個例子來演示如何進行這種建模。


向算法傳入圖像

圖像是算法的常見輸入源。本節我們將介紹一種歸一化圖像的方法,這種方法雖然不太高級,但效果很不錯卻。

以一個300像素×300像素的全綵圖像為例,90 000個像素點乘以3個RGB色彩通道數,總共有270 000個像素。要是我們把每個像素都作為輸入,就會有270 000個輸入——這對大多數算法來說都太多了。

因此,我們需要一個降採樣的過程。下圖是一幅全分辨率圖像。

程序員入門人工智能算法,大牛們從建模問題開始

一幅全分辨率圖像

我們要把它降採樣為32像素×32像素的圖像,如圖所示。

程序員入門人工智能算法,大牛們從建模問題開始

降採樣後的圖像

在圖片被壓縮為32像素×32像素之後,其網格狀模式使得我們可以按像素來生成算法的輸入。如果算法只能分辨每個像素點的亮度的話,那麼只需要1 024個輸入就夠了——只能分辨亮度意味著算法只能“看見”黑色和白色。


要是希望算法能夠辨識色彩,還需要向算法提供每個像素點的紅綠藍3色(RGB)光強的值,這就意味著每個像素點有3個輸入,一下子把輸入數據的數目提升到了3 072個。


通常RGB值的範圍在0~255,要為算法創建輸入數據,就要先把光強除以255來得到一個“光強百分數”,比如光強度10經過計算就會變成0.039(10/255)。


你可能還想知道輸出的處理辦法。在這個例子中,輸出應該表明算法認為圖片內容是什麼。通常的解決方案是為需要算法識別的每種圖片創建一個輸出通道,訓練好的算法會在置信的圖片種類對應的輸出通道返回一個值1.0。


《人工智能算法》搶先讀


程序員入門人工智能算法,大牛們從建模問題開始


購買請到“異步社區”


欲建高樓,必重基礎。算法是人工智能技術的核心。本書介紹了人工智能的基礎算法,全書共10章,涉及維度法、距離度量算 法、K均值聚類算法、誤差計算、爬山算法、模擬退火算法、Nelder-Mead算法和線性迴歸算法等。


本書使用你可以自己執行的、實際的數學計算,闡述了所有這些算法。本書的每一章都包含一個編程示例,這些示例提供了Java、C#、R、Python和C的多個語言實現版本。


這些算法對應於數據中特定模式的處理和識別,同時也是像亞馬遜 (Amazon)和網飛(Netflix)這類網站中,各種推薦系統背後的邏輯。


書中所有算法均配以具體的數值計算來進行講解,讀者可以自行嘗試。每章都配有程序示例,Github上有多種語言版 本的示例代碼可供下載。


適合作為人工智能入門讀者以及對人工智能算法感興趣的讀者閱讀參考。

程序員入門人工智能算法,大牛們從建模問題開始


分享到:


相關文章: