- 人工智能算法(卷1):基礎算法
- (美)杰弗瑞·希頓
- 10124字
- 2020-02-14 18:24:11
第1章 AI入門
本章要點:
● AI與人類大腦的聯系;
● 對輸入/輸出建模;
● 分類和回歸;
● 時間序列;
● 訓練。
外行人都以為人工智能是人造大腦,并且總把它和科幻電影中的機器人聯系起來,而實際上這些科幻場景與現如今的人工智能沒什么太大關系。人工智能確實跟人類大腦很相似,但它們的顯著差異在于人工智能是人造的——人工智能不必具備生物特性。
在進一步深入學習之前,還要介紹一些與人工智能算法交互的通用概念。人工智能算法也稱為“模型”,本質上是一種用以解決問題的技術?,F在已經有很多特性各異的人工智能算法了,最常用的有神經網絡、支持向量機、貝葉斯網絡和隱馬爾科夫模型等,本叢書將一一述及這些模型。
對于人工智能從業者來說,如何將問題建模為人工智能程序可處理的形式是至關重要的,因為這是與人工智能算法交互的主要方式。接下來我們將以人類大腦與現實世界的交互方式為引,展開本章關于基本知識的講解。
1.1 與人類大腦的聯系
人工智能的目標是使計算機可以如人腦一樣工作,但這并不意味著人工智能需要在方方面面都向人腦看齊。某個人工智能算法與人腦真實功能的匹配程度稱為“生物似真性”。
艾倫腦科學研究所(Allen Institute of Brain Science)的首席科學官Christof Koch曾斷言大腦“是已知宇宙中最復雜的東西”[1]。而在人工智能的學科背景下,大腦本質上就是一種深奧、繁復的技術,我們有必要對它進行研究,通過逆向工程來解析它的工作原理和機制,從而模仿它的功能。
當然,大腦并非我們向自然界學習的唯一一種“高深技術”,飛行也是其中一種。早期的飛機試圖模仿鳥類撲動的雙翼,然而這種被稱作“撲翼機”的飛行器效果卻不盡人意。圖1-1是“灰雁撲翼機”的專利圖。
圖1-1 灰雁撲翼機專利圖(美國專利號1730758)
在20世紀早期,活生生的鳥兒是飛行器唯一參照的模型。這好像也很合理,畢竟它們是飛行專家。然而從飛行器的試飛情況來看,人類不應該試圖去完全照搬自然界的解決方案。盡管我們想要模仿的只是“飛行”這個最終結果,但照搬鳥類的飛行姿態卻無法制造出一臺實用的飛行器。
“仿真”這個抽象概念存在于很多語境中,比如我的MacBook Pro既可以仿真一臺Windows PC,也可以仿真一臺Commodore 64。而C64的古舊并不僅僅體現在外觀上,它的驅動指令集和如今很多電腦通用的Intel x86指令集大不一樣,因此Mac在仿真一臺C64機器的時候并不會去模擬C64 6510微處理器的實際晶體管結構,而是在更高的抽象層面進行仿真。人工智能與此同理,有一部分算法會模擬神經元,而還有一些算法則是像C64仿真器一樣,在更抽象的層面進行仿真——我們只關心在PC環境中提供相應功能的最終目標,而不必模擬大腦中產生功能性的全部過程。
方向比方式更重要。人腦和大多數人工智能算法在高度抽象層面具有很多相似性,本節將就此給出實證。
1.1.1 大腦和真實世界
在開始討論之前,我們需要從外部視角來看看大腦的工作機制。畢竟,不像我們對大腦內部機理知之甚少那樣,我們對大腦的外部工作機制倒是頗有一些了解。
大腦本質上是一個由神經連接的黑箱,這些神經負責在大腦和身體之間傳遞信號。一組特定的輸入信號會產生特定的輸出,比如當感覺到手指就要碰到滾燙的火爐時,其他神經就會向你的肌肉發出指令來收回手指。
另外一個需要注意的重點是大腦還存在一種內部狀態。想想當你突然聽到一聲號角,你的反應不僅僅取決于號角聲的刺激,同時也取決于你在何時何地聽到這聲號角——在一場電影中途聽到一聲號角,和在你穿過熙熙攘攘的大街時聽到一聲號角會引起截然不同的反應。你所處的環境會為你的大腦設定一個特定的內部狀態,從而使大腦對不同情境產生不同的反應。
接受刺激的順序同樣也很重要。有一種常見的游戲就是閉上眼睛,嘗試只通過觸覺識物。你并不能在抓住物體的第一時間獲取到足夠的信息來判斷出它是什么,而需要通過不斷移動手指感受其形狀,才能得到足夠的信息勾勒出這個物體的圖景,判斷出它的類別。
你大可以把人腦視為具有一系列輸入/輸出的黑箱。我們的神經給我們提供了對世界的全部認知,它們本身也是大腦的輸入信號,并且對于正常的大腦來說是一個數量有限的輸入。
同樣,我們與真實世界交互的唯一渠道就是那些從神經到肌肉的輸出信號。人腦的輸出實際上是一個關于輸入信號和大腦內部狀態的一個函數,對應于任何輸入信號,人腦都會相應調整它的內部狀態同時產生輸出信號。并且輸入信號的順序影響或大或小,都取決于當時大腦的內部狀態。
1.1.2 缸中之腦
假如我們與真實世界的唯一交互渠道就是從感受器獲得的輸入和通過運動神經作用的輸出,那么“真實”究竟是什么?你的大腦既可以與你的身體耦合,也可以像電影《黑客帝國》中的場景一樣,跟一個仿真裝置耦合。假如大腦的輸出能夠產生預期的輸入反饋,那么你又應當如何區別真實與虛幻?
以上正是一個著名的哲學思想實驗:“缸中之腦”。圖1-2形象地闡釋了這個思想實驗。圖中的大腦認為他的身體正在遛狗,可實際上這個大腦真的有身體嗎?甚至這條狗存在嗎?“存在”這個詞本身又意味著什么呢?我們所知的一切都不過來自神經系統的信號傳遞[2]。
圖1-2 缸中之腦
這個思想實驗假想某人的大腦可以脫離身體依靠維生系統保持活性。大腦的神經連接到一臺可以用電脈沖完全仿真大腦實際接收信號的超級計算機上,之后這臺超級計算機將通過對大腦的輸出信號產生相應的響應這樣的方式,模擬真實世界。這樣一來,這個離體的大腦將依舊保持對外部“真實世界”完全正常的認知體驗。甚至確實就有哲學理論認為我們生活在一個仿真的世界里[3]。
一種嘗試對人腦直接建模的算法就是“神經網絡”。神經網絡是人工智能研究的一個小分支,而它又與你將在本叢書中學到的很多算法驚人地一致。
基于計算機的神經網絡不同于人腦,因為它們畢竟不具有通用性?,F有的神經網絡都只能解決特定的問題,應用范圍有限。人工智能算法會基于算法內部狀態和當前接收到的輸入產生輸出信號,并以此來認知現實。因此,算法所謂的“現實”常常會隨著研究人員實驗的進行而變化。
無論你是在為一個機器人還是為一個股民編寫人工智能的程序,輸入數據、輸出數據和內部狀態構成的模型適用于大多數人工智能算法——之所以說“大多數”,是因為當然也存在更加復雜的算法。
1.2 對問題建模
掌握將真實世界建模為機器學習算法的方法至關重要。針對不同的問題有不同的算法,在最抽象的層面,你可以按以下4種方式之一為你的問題建模:
● 數據分類;
● 回歸分析;
● 聚類問題;
● 時序問題。
當然有時也需要綜合多種方式來對問題進行建模。接下來將從數據分類開始,對以上方法逐一進行講解。
1.2.1 數據分類
分類問題試圖將輸入數據歸為某一類,通常是監督學習,即由用戶提供數據和機器學習算法的預期輸出結果。在數據分類問題中,預期結果就是數據類別。
監督學習處理的都是已知數據,在訓練期間,機器學習算法的性能由對已知數據的分類效果來評估。理想狀態是算法經過訓練之后,也能夠正確分類未知數據。
包含了鳶尾花測量數據的費雪鳶尾花數據集[4]是一個分類問題樣例。這也是最著名的數據集之一,通常被用來評估機器學習算法的性能。完整的數據集可在以下網址獲?。?/p>
http://www.heatonresearch.com/wiki/Iris_Data_Set[5]
下面是一個該數據集中的小樣本。
“Sepal Length”,“Sepal Width”,“Petal Length”,“Petal Width”,“Species” 5.1,3.5,1.4,0.2,“setosa” 4.9,3.0,1.4,0.2,“setosa” 4.7,3.2,1.3,0.2,“setosa” ... 7.0,3.2,4.7,1.4,“versicolor” 6.4,3.2,4.5,1.5,“versicolor” 6.9,3.1,4.9,1.5,“versicolor” ... 6.3,3.3,6.0,2.5,“virginica” 5.8,2.7,5.1,1.9,“virginica” 7.1,3.0,5.9,2.1,“virginica”
上面的數據顯示為逗號分隔值文件(Comma Separated Values,CSV)格式,這是一種在機器學習中很常見的輸入數據格式。如樣本所示,文件首行內容通常是每列數據的定義。在樣本中,每朵花都有5個維度的信息:
● 花萼長度;
● 花萼寬度;
● 花瓣長度;
● 花瓣寬度;
● 種屬。
對分類問題來說,算法需要在給定花萼和花瓣長、寬的情況下,判斷花的種屬,這個種屬也就是這朵花所屬的“類”[6]。
“類”一般是一種非數值型數據屬性,因此類中的成員必須有非常良好的定義。比如說這個鳶尾花數據集中只有3種不同種屬的鳶尾花,那么用這個數據集訓練的機器學習算法就不能指望它能夠辨識玫瑰。此外,所有的類中元素在訓練時都必須是已知數據。
1.2.2 回歸分析
在1.2.1節中,我們學習了如何對數據進行分類。但一般來說,所要的輸出通常并不是簡單的類別數據,而是數值數據,譬如要計算汽車的燃油效率,那么在給定發動機規格和車身重量之后,就應該可以算出特定車型的燃油效率。
下面列舉了5種車型的燃油效率:
“mpg”,“cylinders”,“displacement”,“horsepower”,“weight”, “acceleration”,“model year”,“origin”,“car name” 18.0,8,307.0,130.0,3504.,12.0,70,1,“chevrolet chevelle malibu” 15.0,8,350.0,165.0,3693.,11.5,70,1,“buick skylark 320” 18.0,8,318.0,150.0,3436.,11.0,70,1,“plymouth satellite” 16.0,8,304.0,150.0,3433.,12.0,70,1,“amc rebel sst” 17.0,8,302.0,140.0,3449.,10.5,70,1,“ford torino” ...
完整的數據集可以在下面這個網址獲?。?/p>
http://www.heatonresearch.com/wiki/MPG_Data_Set[7]
回歸分析旨在用汽車相關的輸入數據訓練算法,使之能夠根據輸入計算得到特定的輸出。在這個例子中,算法需要給出特定車型最可能的燃油效率。
另外需要注意,文件中并不是每個數據都有用,比如“車型”和“產地”兩列數據就沒什么用處?!败囆停╟ar name)”被排除在有效數據之外是因為它跟燃油效率壓根兒沒什么關系,而“產地(origin)”也同樣跟燃油效率關系不大——雖說“產地”這一項以數值形式給出了汽車的生產區域,并且某些地區比較重視燃油效率這一參數,但這個數據實在有些過于寬泛了,因此棄之不用。
1.2.3 聚類問題
聚類問題跟分類問題很像,在這兩類問題中,計算機都要將輸入數據進行編組。在訓練開始之前,程序員通常要預先指定聚類的簇的數目,計算機則根據輸入數據將相近項放到一起。由于并未指定給定輸入一定屬于某個簇,因此在缺乏目標輸出數據時,聚類算法極為有用。也因為沒有指定的預期輸出,所以聚類算法屬于非監督學習。
想想1.2.2節中汽車相關的數據,你可以用聚類算法把汽車分為4組,每一組中都會是一些特性相近的車型。
聚類問題和分類問題的不同之處在于,聚類問題給了算法更大的自由度,令其從數據中自行發現規律;而分類問題則需要給算法指定已知數據的類別,從而使它最終能夠正確識別不曾用來訓練過的新數據。
聚類和分類算法處理新數據的方式大相徑庭。分類算法的最終目的是根據訓練過的前序數據能夠正確辨識新數據;而聚類算法中就沒有“新數據”這樣的說法,要想在現有的分組中添加新數據,就必須重新劃分整個數據集。
1.2.4 時序問題
機器學習算法的工作原理有些像數學中的函數,將輸入值映射為特定的輸出值。如果機器學習算法沒有“內部狀態”的存在,那么給定的輸入數據集總會產生相同的輸出。然而,許多機器學習算法都不存在可以改變或者影響輸出的所謂“內部狀態”。譬如說,對汽車數據而言,你會希望分類算法的計算結果擬合了全部數據,而不僅僅擬合它接受的最后幾輛車的數據。
一般來說時序都很重要,雖然有一部分機器學習算法支持時序,卻也有一部分并不支持這個功能。如果僅僅是對汽車或鳶尾花進行分類,倒也確實不必太過在意時序;但要是僅有的輸入是當前股票價格,那時序就有著舉足輕重的作用了,因為某天某只股票的單一價格對預測價格走勢沒有什么幫助,但拉長時間區間,綜合數天的股票價格得到的走勢可能就大有用處了。
也有一些方法可以將時間序列數據轉換到不支持時序的算法上,這樣你就要把前幾天的數據也作為輸入的一部分。比如你可以用5個輸入來代表要預測那天的前5個交易日的數據。
1.3 對輸入/輸出建模
在本章前面部分提到過,機器學習算法實際上就是給定輸入,產生輸出,而輸出又受到算法本身的長短期記憶影響。圖1-3展示了機器學習算法中長短期記憶如何參與產生輸出的過程。
圖1-3 機器學習算法抽象圖示
如圖1-3所示,算法接受輸入,產生輸出。大多數機器學習算法的輸入和輸出是完全同步的,只有給定輸入,才會產生輸出,而不像人腦,既可以對輸出做出響應,偶爾也能夠在沒有輸入的情況下自行產生輸出。
到目前為止,我們一直在抽象地談論輸入/輸出模式,你一定很好奇輸入/輸出到底長什么樣兒。實際上,輸入和輸出都是向量形式,而向量本質上就是一個如下所示的浮點數組:
Input:[-0.245,.283,0.0] Output:[0.782,0.543]
絕大多數機器學習算法的輸入和輸出數目是固定的,就像計算機程序中的函數一樣。輸入數據可以被視作函數參數,而輸出則是函數的返回值。就上例而言,算法會接受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個實例。在數據有限的情況下,“最接近的匹配項”沒有什么實際意義。
上面這個映射關系也給我們提出了另一個關鍵問題:對于給定的接受一個浮點數組返回另一個浮點數組的算法來說,如何傳入一個字符串形式的值呢?下面介紹一種方法,雖然這種方法更適合處理數值型數據,但也不失為一種解決辦法。
詞袋算法[8]是一種編碼字符串的常見方法。在這個算法模型中,每個輸入值都代表一個特定單詞出現的次數,整個輸入向量就由這些值構成。以下面這個字符串為例:
Of Mice and Men Three Blind Mice Blind Man's Bluff Mice and More Mice
由上例我們可以得到下面這些不重復的單詞,這就是我們的一個“字典”:
Input 0 :and Input 1 :blind Input 2 :bluff Input 3 :man's Input 4 :men Input 5 :mice Input 6 :more Input 7 :of Input 8 :three
因此,例子中的4行字符串可以被編碼如下:
Of Mice and Men [0 4 5 7] Three Blind Mice [1 5 8] Blind Man's Bluff [1 2 3] Mice and More Mice [0 5 6]
我們還必須用0來填充字符串中不存在的單詞,最終結果會是下面這樣:
Of Mice and Men [1,0,0,0,1,1,0,1,0] Three Blind Mice [0,1,0,0,0,1,0,0,1] Blind Man's Bluff [0,1,1,1,0,0,0,0,0] Mice and More Mice [1,0,0,0,0,2,1,0,0]
請注意,因為我們的“字典”中總共有9個單詞,所以我們得到的是長度為9的定長向量。向量中每一個元素的值都代表著字典中對應單詞出現的次數,而這些元素在向量中的編號則對應著字典中有效單詞的索引。構成每個字符串的單詞集合都僅僅是字典的一個子集,這就導致向量中大多數值是0。
如上例所示,機器學習程序最大的特征之一是會把問題建模為定長浮點數組。下面的小節會用幾個例子來演示如何進行這種建模。
1.3.1 一個簡單的例子
你要是讀過機器學習相關的資料,就一定見過“XOR”(即邏輯異或,eXclusive OR)這個運算符,模仿異或操作的人工智能程序堪稱人工智能界的“Hello World”。本書確實有比XOR運算符復雜得多的內容,但XOR運算符依然是最佳入門案例。我們也將從XOR運算符上手。首先將其視作一個哈希表——如果你對XOR運算符不太熟悉的話,可以類比一下AND和OR運算符,它們工作原理十分相似,都是接受二元輸入從而產生一個布爾值的輸出。AND運算符當二元輸入都為真時,輸出則為真;而OR運算符只要二元輸入中有一個為真,輸出就為真。
對于XOR運算符而言,只有當其二元輸入互異時,輸出才為真。XOR運算符的真值表如下:
False XOR False = False True XOR False = True False XOR True = True True XOR True = False
將上面的真值表用哈希表形式表示的話,會是下面這樣:
[0.0,0.0] -> [0.0] [1.0,0.0] -> [1.0] [0.0,1.0] -> [1.0] [1.0,1.0] -> [0.0]
以上映射展現了這個算法中輸入和理想的預期輸出間的關系。
1.3.2 燃油效率
機器學習問題通常需要處理一組數據,通過計算來對輸出進行預測,或者對一系列行為進行決策。以一個包含以下字段的汽車數據庫為例:
● 汽車重量;
● 發動機排量;
● 氣缸數;
● 功率;
● 混合動力或常規動力;
● 燃油效率。
假如你已經收集到了以上字段對應的數據,那么你就能夠建立模型并基于其余屬性對應的值對某個屬性的值進行預測了。舉個例子,讓我們來預測一下汽車的燃油效率。
首先我們要把問題歸化為一個映射到輸出浮點數組的輸入浮點數組,并且每個數組元素的取值范圍應該在0~1或-1~1,這一步操作稱為“歸一化”。歸一化將在第2章中詳細介紹。
首先我們來看看如何歸一化上例數據。考慮一下輸入、輸出數據格式,我們總共有6個字段屬性,并且要用其中5個來預測第6個屬性,所以算法要有5個輸入和1個輸出。
算法的輸入和輸出大概是像下面這樣:
● 輸入1:汽車重量;
● 輸入2:發動機排量;
● 輸入3:氣缸數;
● 輸入4:功率;
● 輸入5:混合動力或常規動力;
● 輸出1:燃油效率。
我們需要對數據進行歸一化,首先要為每個值選定一個合理的區間,然后再在保持相對大小不變的情況下將這些值轉換為(0, 1)區間中的值。下面這個例子就為這些值選定了一個合理的區間:
● 汽車重量:45~2 268千克;
● 發動機排量:0.1~10升;
● 氣缸數:2~12個;
● 功率:0.736~736千瓦;
● 混合動力或常規動力:“真”或“假”;
● 燃油效率:0.425~212.6千米/升。
這些范圍對如今的汽車而言取得有些大了,不過卻保證了未來不需要怎么重構就可以繼續使用這個算法。大范圍也有大范圍的優點,那就是不至于產生太多極端數據。
現在來看一個例子,怎么樣歸一化一個900千克的重量數據呢?重量的取值區間大小是2 223千克,在區間中這個重量的相對大小是855(900-45)千克,占取值區間的百分比是0.385(855 / 2 223),因此我們會給算法的輸入傳入一個0.385的值來代表900千克的重量。這也滿足了常見的輸入為(0, 1)區間的范圍要求。
“混合動力或常規動力”的值是真或假的布爾值,只要用1代表混合動力,用0代表常規動力,就輕易完成了布爾值到1或0兩個值的歸一化。
1.3.3 向算法傳入圖像
圖像是算法的常見輸入源。本節我們將介紹一種歸一化圖像的方法,這種方法雖然不太高級,但效果很不錯。
以一個300像素×300像素的全彩圖像為例,90 000個像素點乘以3個RGB色彩通道數,總共有270 000個像素。要是我們把每個像素都作為輸入,就會有270 000個輸入——這對大多數算法來說都太多了。
因此,我們需要一個降采樣的過程。圖1-4是一幅全分辨率圖像。
圖1-4 一幅全分辨率圖像
我們要把它降采樣為32像素×32像素的圖像,如圖1-5所示。
圖1-5 降采樣后的圖像
在圖片被壓縮為32像素×32像素之后,其網格狀模式使得我們可以按像素來生成算法的輸入。如果算法只能分辨每個像素點的亮度的話,那么只需要1 024個輸入就夠了——只能分辨亮度意味著算法只能“看見”黑色和白色。
要是希望算法能夠辨識色彩,還需要向算法提供每個像素點的紅綠藍3色(RGB)光強的值,這就意味著每個像素點有3個輸入,一下子把輸入數據的數目提升到了3 072個。
通常RGB值的范圍在0~255,要為算法創建輸入數據,就要先把光強除以255來得到一個“光強百分數”,比如光強度10經過計算就會變成0.039(10/255)。
你可能還想知道輸出的處理辦法。在這個例子中,輸出應該表明算法認為圖片內容是什么。通常的解決方案是為需要算法識別的每種圖片創建一個輸出通道,訓練好的算法會在置信的圖片種類對應的輸出通道返回一個值1.0。
在1.3.4節中,我們將以金融算法為例,繼續講解針對實際問題格式化算法的方法。
1.3.4 金融算法
金融預測是一種時間算法的常見應用。所謂“時間算法”,指的是接受時變性輸入值的一種算法。要是算法支持短期記憶(即內部狀態)的話,也就意味著自動支持輸入范圍的時變性。要是算法不具有內部狀態,那就需要分別使用一個輸入窗口和一個預測窗口——而大多數算法又沒有內部狀態。下面以預測股市的算法為例來講解如何使用這兩個數據窗口。假設你有了某只股票如下數天的收盤價:
Day 1 : $45 Day 2 : $47 Day 3 : $48 Day 4 : $40 Day 5 : $41 Day 6 : $43 Day 7 : $45 Day 8 : $57 Day 9 : $50 Day 10 : $41
第一步要將數據歸一化。無論你的算法有沒有內部狀態,這一步都是不可或缺的。要將數據歸一化,我們把每個數據都轉換為對前一天的同比百分比變化,比如第2天的數據就會變成0.04,因為45美元到47美元之間變化了4%。在對每一天的數據都進行相同操作之后,數據集會變成下面這樣:
Day 2 : 0. 04 Day 3 : 0. 02 Day 4 : -0.16 Day 5 : 0. 02 Day 6 : 0. 04 Day 7 : 0. 04 Day 8 : 0. 26 Day 9 : -0.12 Day 10 : -0.18
要創建一個預測后一天股票價格的算法,需要考慮一下怎么樣把數據編碼為算法可接受的輸入形式。而這個編碼方式又取決于算法是否具有內部狀態,因為具有內部狀態的算法只需要最近幾天的輸入數據就可以對走勢進行預測。
而問題在于很多機器學習算法都沒有“內部狀態”這一說,在這種情況下,一般使用滑動窗口算法對數據進行編碼。要達到這個目的,需要使用前幾天的股票價格來預測下一天的股票價格,所以我們假定輸入是前3天的收盤價,輸出是第4天的股價。于是就可以對上面的數據如下劃分,得到訓練數據,這些數據實例都指定了對于給定輸入的理想輸出。
[0.04,0.02,-0.16]->0.02 [0.02,-0.16,0.02]->0.04 [-0.16,0.02,0.04]->0.04 [0.02,0.04,0.04]->0.26 [0.04,0.04,0.26]->-0.12 [0.04,0.26,-0.12]->-0.18
上面這種編碼方式要求算法有3個輸入通道和1個輸出通道。
1.4 理解訓練過程
訓練的本質是什么?訓練是一個算法擬合訓練數據的過程——這又不同于前面提到過的“內部狀態”了,你可以把“訓練”認為是對長期記憶的塑造過程。對神經網絡而言,訓練改變的就是權重矩陣。
何時訓練由算法決定。一般來說,算法的訓練和實際應用是鮮明分立的兩個階段,但也確實有訓練和應用并行不悖的時候。
1.4.1 評估成果
在學校里,學生們在學習科目的時候會被打分,這種打分出于很多目的,其中最基本的目的是對他們的學習過程提供反饋。同樣,你也必須在算法訓練階段評估你的算法性能,這種評估既對訓練有著指引意義,又能提供一種對訓練成果的反饋。
一種評估方法是用一個評分函數,這個評分函數會使用訓練好的算法并對它進行評估。這個評分函數只會返回一個分數,而我們的目標則是使這個分數達到上限或下限——對任何給定的問題來說,取上限還是下限都完全無所謂,僅僅取決于評分函數的設置。
1.4.2 批量學習和在線學習
批量學習(batch training)和在線學習(online training)跟學習過程的類型有關,因此通常在處理訓練數據集的時候發揮作用。所謂“在線學習”,就是每輸入訓練集中的一個元素就進行一次學習;而批量學習則是一次性對特定數量的訓練集元素進行學習,并同步更新算法。批量學習中指定的元素數量稱為“批量大小”,并且這個“大小”通常與整個訓練集的大小相當。
在線學習在必須同步進行學習和訓練的情況下很有用,人腦就是以這種模式在工作,但在人工智能領域就不那么常見了,并且也不是所有算法都支持在線學習。不過在神經網絡中在線學習倒是比較普遍。
1.4.3 監督學習和非監督學習
本章浮光掠影式地了解了兩種截然不同的訓練方法:監督學習(surprised training)和非監督學習(unsurprised training)。當給定算法的預期輸出時,就是監督學習;沒有給定預期輸出的情況就是非監督學習。
此外還有一種混合訓練方法,只需要提供部分預期輸出即可,常被用于深度置信網絡。
1.4.4 隨機學習和確定學習
確定學習(deterministic training)算法只要給定相同的初始狀態,就總會以完全相同的方式運行,在整個算法中一般都沒有用到隨機數。
而隨機學習(stochastic training)則不同,需要用到隨機數。因此,即使選用同樣的初始狀態,算法也會得到全然不同的訓練結果,這就使得評估隨機算法的性能變得比較困難。但是不得不說,隨機算法應用廣泛并且效果拔群。
1.5 本章小結
本章介紹了人工智能領域,尤其是機器學習領域的一些基礎知識。在本章中,你可以學會如何將問題建模為機器學習算法——機器學習算法與生物過程頗有一些相似之處,但人工智能的目標并非完全模擬人腦的工作機制,而是要超越簡單的流程化作業程序,制造出具有一定智能的機器。
機器學習算法和人腦的相似之處在于都有輸入、輸出和不顯于外的內部狀態,其中輸入和內部狀態決定了輸出。內部狀態可以視作影響輸出的短期記憶。還有一種被稱作“長期記憶”的屬性,明確指定了給定輸入和內部狀態之后,機器學習算法的輸出。訓練就是一個通過調整長期記憶來使算法獲得預期輸出的過程。
機器學習算法通常被分為兩個大類:回歸算法和分類算法?;貧w算法根據給定的一至多個輸入,返回一個數值輸出,本質上是一個多輸入的多元函數,其輸出可能為單值,也可能是多值。
分類算法接受一至多個輸入,返回一個類別實例,由算法基于輸入進行決策。比如,可以用分類算法將求職者分為優先組、備選組和否決組。
本章說明了機器學習算法的輸入是一個數值型向量。要想用算法處理問題,明白如何用數值向量的形式表達問題至關重要。
第2章將進一步介紹“歸一化”的概念。歸一化泛指通過預處理將數據轉化為算法的輸入形式的各種方法。此外,歸一化也用于解釋機器學習算法的輸出。
[1] Koch, 2013。
[2] Sigiel, 1999。
[3] Bostrum, 2003。
[4] 又稱“安德森鳶尾花數據集”或“鳶尾花數據集”,由埃德加?安德森建立,在羅納德?費雪1936年論文《多重測量在分類問題中的應用》之后被廣泛使用?!g者注
[5] 定向內容已失效,讀者可考慮訪問另一個網址:http://archive.ics.uci.edu/ml/datasets/Iris?!g者注
[6] 本書中的“類”無特殊說明一般是“種類”之意。區別于面向對象中的“類”?!g者注
[7] 定向內容已失效,讀者可考慮訪問另一個網址:https://archive.ics.uci.edu/ml/datasets/auto+mpg。——譯者注
[8] Harris, 1954。
- Learning Neo4j
- Xcode 7 Essentials(Second Edition)
- 算法基礎:打開程序設計之門
- R語言游戲數據分析與挖掘
- INSTANT CakePHP Starter
- JavaScript by Example
- WebRTC技術詳解:從0到1構建多人視頻會議系統
- Microsoft Azure Storage Essentials
- Mastering C++ Multithreading
- Android應用開發實戰
- Using Yocto Project with BeagleBone Black
- Head First Kotlin程序設計
- 每個人的Python:數學、算法和游戲編程訓練營
- HTML5+CSS+JavaScript深入學習實錄
- Mastering Magento Theme Design