原文地址:https://alphahinex.github.io/2023/11/12/hands-on-machine-learning/
description: "內(nèi)容很多针贬,不易消化被因,習(xí)題配有答案"
date: 2023.11.12 10:26
categories:
- Book
- AI
tags: [Book, AI]
keywords: 機器學(xué)習(xí), Keras, TensorFlow
第一部分 機器學(xué)習(xí)的基礎(chǔ)知識
第1章 機器學(xué)習(xí)概覽
1.2 為什么使用機器學(xué)習(xí)
使用機器學(xué)習(xí)方法挖掘大量數(shù)據(jù)來幫助發(fā)現(xiàn)不太明顯的規(guī)律。這稱作數(shù)據(jù)挖掘长已。
1.4 機器學(xué)習(xí)系統(tǒng)的類型
根據(jù)訓(xùn)練期間接受的監(jiān)督數(shù)量和監(jiān)督類型砰逻,可以將機器學(xué)習(xí)系統(tǒng)分為以下四個主要類別:有監(jiān)督學(xué)習(xí)鸣驱、無監(jiān)督學(xué)習(xí)、半監(jiān)督學(xué)習(xí)和強化學(xué)習(xí)蝠咆。
在機器學(xué)習(xí)里踊东,屬性是一種數(shù)據(jù)類型(例如“里程”),而特征取決于上下文刚操,可能有多個含義闸翅,但是通常狀況下,特征意味著一個屬性加上其值(例如菊霜,“里程=15 000”)坚冀。盡管如此,許多人還是在使用屬性和特征這兩個名詞時不做區(qū)分鉴逞。
降維的目的是在不丟失太多信息的前提下簡化數(shù)據(jù)记某。方法之一是將多個相關(guān)特征合并為一個。例如构捡,汽車?yán)锍膛c其使用年限存在很大的相關(guān)性液南,所以降維算法會將它們合并成一個代表汽車磨損的特征。這個過程叫作特征提取勾徽。
1.5 機器學(xué)習(xí)的主要挑戰(zhàn)
對復(fù)雜問題而言滑凉,數(shù)據(jù)比算法更重要
不過需要指出的是,中小型數(shù)據(jù)集依然非常普遍,獲得額外的訓(xùn)練數(shù)據(jù)并不總是一件輕而易舉或物美價廉的事情畅姊,所以暫時先不要拋棄算法闪幽。
如果樣本集太小,將會出現(xiàn)采樣噪聲(即非代表性數(shù)據(jù)被選中)涡匀;而即便是非常大的樣本數(shù)據(jù)盯腌,如果采樣方式欠妥,也同樣可能導(dǎo)致非代表性數(shù)據(jù)集陨瘩,這就是所謂的采樣偏差腕够。
在機器學(xué)習(xí)中,這稱為過擬合舌劳,也就是指模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)良好帚湘,但是泛化時卻不盡如人意。
通過約束模型使其更簡單甚淡,并降低過擬合的風(fēng)險大诸,這個過程稱為正則化。
在學(xué)習(xí)時贯卦,應(yīng)用正則化的程度可以通過一個超參數(shù)來控制资柔。超參數(shù)是學(xué)習(xí)算法(不是模型)的參數(shù)。因此撵割,它不受算法本身的影響贿堰。超參數(shù)必須在訓(xùn)練之前設(shè)置好,并且在訓(xùn)練期間保持不變啡彬。
欠擬合和過擬合正好相反羹与。它的產(chǎn)生通常是因為對于底層的數(shù)據(jù)結(jié)構(gòu)來說,你的模型太過簡單庶灿。
機器學(xué)習(xí)系統(tǒng)有很多類型:有監(jiān)督和無監(jiān)督纵搁,批量的和在線的,基于實例的和基于模型的往踢,等等腾誉。
在一個機器學(xué)習(xí)項目中,你從訓(xùn)練集中采集數(shù)據(jù)菲语,然后將數(shù)據(jù)交給學(xué)習(xí)算法來計算妄辩。如果算法是基于模型的,它會調(diào)整一些參數(shù)來將模型適配于訓(xùn)練集(即對訓(xùn)練集本身做出很好的預(yù)測)山上,然后算法就可以對新的場景做出合理的預(yù)測眼耀。如果算法是基于實例的,它會記住這些示例佩憾,并根據(jù)相似度度量將它們與所學(xué)的實例進(jìn)行比較哮伟,從而泛化這些新實例干花。
如果訓(xùn)練集的數(shù)據(jù)太少或數(shù)據(jù)代表性不夠,包含太多噪聲或者被一些無關(guān)特征污染(垃圾進(jìn)楞黄,垃圾出)池凄,那么系統(tǒng)將無法很好地工作。最后鬼廓,你的模型既不能太簡單(會導(dǎo)致欠擬合)肿仑,也不能太復(fù)雜(會導(dǎo)致過擬合)。
第2章 端到端的機器學(xué)習(xí)項目
2.3 獲取數(shù)據(jù)
標(biāo)準(zhǔn)差通常表示為σ(希臘字母sigma)碎税,它是方差的平方根尤慰,方差是均值平方差的平均值。當(dāng)特征具有常見的鐘形正態(tài)分布(也稱為高斯分布)時雷蹂,適用“68-95-99.7”規(guī)則:大約68%的值落在均值的1σ內(nèi)伟端,95%落在2σ以內(nèi),99.7%落在3σ之內(nèi)匪煌。
2.5 機器學(xué)習(xí)算法的數(shù)據(jù)準(zhǔn)備
這就是獨熱編碼责蝠,因為只有一個屬性為1(熱),其他均為0(冷)萎庭。
如果類別屬性具有大量可能的類別(例如霜医,國家代碼、專業(yè)擎椰、物種)支子,那么獨熱編碼會導(dǎo)致大量的輸入特征创肥,這可能會減慢訓(xùn)練并降低性能达舒。如果發(fā)生這種情況,你可能想要用相關(guān)的數(shù)字特征代替類別輸入叹侄。例如巩搏,你可以用與海洋的距離來替換ocean_proximity特征(類似地,可以用該國家的人口和人均GDP來代替國家代碼)趾代」岬祝或者,你可以用可學(xué)習(xí)的低維向量(稱為嵌入)來替換每個類別撒强。每個類別的表征可以在訓(xùn)練期間學(xué)習(xí)禽捆。這是表征學(xué)習(xí)的示例
最小-最大縮放(又叫作歸一化)很簡單:將值重新縮放使其最終范圍歸于0~1之間。實現(xiàn)方法是將值減去最小值并除以最大值和最小值的差飘哨。
標(biāo)準(zhǔn)化則完全不一樣:首先減去平均值(所以標(biāo)準(zhǔn)化值的均值總是零)胚想,然后除以方差,從而使得結(jié)果的分布具備單位方差芽隆。不同于最小-最大縮放的是浊服,標(biāo)準(zhǔn)化不將值綁定到特定范圍统屈,對某些算法而言,這可能是個問題(例如牙躺,神經(jīng)網(wǎng)絡(luò)期望的輸入值范圍通常是0~1)愁憔。但是標(biāo)準(zhǔn)化的方法受異常值的影響更小。
2.8 啟動孽拷、監(jiān)控和維護你的系統(tǒng)
驗證碼是一種確保用戶不是機器人的測試吨掌,這些測試經(jīng)常被用作標(biāo)記訓(xùn)練數(shù)據(jù)的廉價方法。
第3章 分類
最常見的有監(jiān)督學(xué)習(xí)任務(wù)包括回歸任務(wù)(預(yù)測值)和分類任務(wù)(預(yù)測類)脓恕。
3.1 MNIST
這個數(shù)據(jù)集被廣為使用思犁,因此也被稱作是機器學(xué)習(xí)領(lǐng)域的“Hello World”
3.3 性能測量
K-折交叉驗證的意思是將訓(xùn)練集分解成K個折疊(在本例中,為3折)进肯,然后每次留其中1個折疊進(jìn)行預(yù)測激蹲,剩余的折疊用來訓(xùn)練
這說明準(zhǔn)確率通常無法成為分類器的首要性能指標(biāo),特別是當(dāng)你處理有偏數(shù)據(jù)集時(即某些類比其他類更為頻繁)江掩。
評估分類器性能的更好方法是混淆矩陣学辱,其總體思路就是統(tǒng)計A類別實例被分成為B類別的次數(shù)。例如环形,要想知道分類器將數(shù)字3和數(shù)字5混淆多少次策泣,只需要通過混淆矩陣的第5行第3列來查看。
混淆矩陣能提供大量信息抬吟,但有時你可能希望指標(biāo)更簡潔一些萨咕。正類預(yù)測的準(zhǔn)確率是一個有意思的指標(biāo),它也稱為分類器的精度(見公式3-1):
公式3-1:精度TP是真正類的數(shù)量火本,F(xiàn)P是假正類的數(shù)量危队。
精度通常與另一個指標(biāo)一起使用,這個指標(biāo)就是召回率钙畔,也稱為靈敏度或者真正類率:它是分類器正確檢測到的正類實例的比率(見公式3-2):
公式3-2:召回率FN是假負(fù)類的數(shù)量茫陆。
如果你對混淆矩陣還是感到疑惑,圖3-2或許可以幫助你理解擎析。
圖3-2:混淆矩陣顯示了真負(fù)(左上)簿盅、假正(右上)、假負(fù)(左下)和真正(右下)的示例
因此我們可以很方便地將精度和召回率組合成一個單一的指標(biāo)揍魂,稱為F1分?jǐn)?shù)桨醋。當(dāng)你需要一個簡單的方法來比較兩種分類器時,這是個非常不錯的指標(biāo)现斋。F1分?jǐn)?shù)是精度和召回率的諧波平均值(見公式3-3)喜最。正常的平均值平等對待所有的值,而諧波平均值會給予低值更高的權(quán)重步责。因此返顺,只有當(dāng)召回率和精度都很高時禀苦,分類器才能得到較高的F1分?jǐn)?shù)。
公式3-3:F<sub>1</sub>
你不能同時增加精度又減少召回率遂鹊,反之亦然振乏。這稱為精度/召回率權(quán)衡。
圖3-3在這個精度/召回率權(quán)衡中秉扑,圖像按其分類器評分進(jìn)行排名慧邮,而高于所選決策閾值的圖像被認(rèn)為是正的;閾值越高舟陆,召回率越低误澳,但是(通常)精度越高
由于ROC曲線與精度/召回率(PR)曲線非常相似,因此你可能會問如何決定使用哪種曲線秦躯。有一個經(jīng)驗法則是忆谓,當(dāng)正類非常少見或者你更關(guān)注假正類而不是假負(fù)類時,應(yīng)該選擇PR曲線踱承,反之則是ROC曲線倡缠。
3.4 多類分類器
要創(chuàng)建一個系統(tǒng)將數(shù)字圖片分為10類(從0到9),一種方法是訓(xùn)練10個二元分類器茎活,每個數(shù)字一個(0-檢測器昙沦、1-檢測器、2-檢測器载荔,以此類推)盾饮。然后,當(dāng)你需要對一張圖片進(jìn)行檢測分類時懒熙,獲取每個分類器的決策分?jǐn)?shù)丘损,哪個分類器給分最高,就將其分為哪個類煌珊。這稱為一對剩余(OvR)策略号俐,也稱為一對多(one-versus-all)。
另一種方法是為每一對數(shù)字訓(xùn)練一個二元分類器:一個用于區(qū)分0和1定庵,一個區(qū)分0和2,一個區(qū)分1和2踪危,以此類推蔬浙。這稱為一對一(OvO)策略。如果存在N個類別贞远,那么這需要訓(xùn)練N×(N-1)/2個分類器畴博。
OvO的主要優(yōu)點在于,每個分類器只需要用到部分訓(xùn)練集對其必須區(qū)分的兩個類進(jìn)行訓(xùn)練蓝仲。
有些算法(例如支持向量機分類器)在數(shù)據(jù)規(guī)模擴大時表現(xiàn)糟糕俱病。對于這類算法官疲,OvO是一個優(yōu)先的選擇,因為在較小訓(xùn)練集上分別訓(xùn)練多個分類器比在大型數(shù)據(jù)集上訓(xùn)練少數(shù)分類器要快得多亮隙。但是對大多數(shù)二元分類器來說途凫,OvR策略還是更好的選擇。
3.6 多標(biāo)簽分類
假設(shè)分類器經(jīng)過訓(xùn)練溢吻,已經(jīng)可以識別出三張臉——愛麗絲维费、鮑勃和查理,那么當(dāng)看到一張愛麗絲和查理的照片時促王,它應(yīng)該輸出[1犀盟,0,1](意思是“是愛麗絲蝇狼,不是鮑勃阅畴,是查理”)這種輸出多個二元標(biāo)簽的分類系統(tǒng)稱為多標(biāo)簽分類系統(tǒng)。
3.7 多輸出分類
分類和回歸之間的界限有時很模糊迅耘,比如這個示例恶阴。可以說豹障,預(yù)測像素強度更像是回歸任務(wù)而不是分類冯事。而多輸出系統(tǒng)也不僅僅限于分類任務(wù),可以讓一個系統(tǒng)給每個實例輸出多個標(biāo)簽血公,同時包括類標(biāo)簽和值標(biāo)簽昵仅。
第4章 訓(xùn)練模型
4.1 線性回歸
訓(xùn)練模型就是設(shè)置模型參數(shù)直到模型最擬合訓(xùn)練集的過程。
回歸模型最常見的性能指標(biāo)是均方根誤差(RMSE)
因此累魔,在訓(xùn)練線性回歸模型時摔笤,你需要找到最小化RMSE的θ值。在實踐中垦写,將均方誤差(MSE)最小化比最小化RMSE更為簡單吕世,二者效果相同(因為使函數(shù)最小化的值,同樣也使其平方根最刑萃丁)
偽逆本身是使用被稱為奇異值分解(Singular Value Decomposition命辖,SVD)的標(biāo)準(zhǔn)矩陣分解技術(shù)來計算的,可以將訓(xùn)練集矩陣X分解為三個矩陣UΣVT的乘積
4.4 學(xué)習(xí)曲線
如果你的模型欠擬合訓(xùn)練數(shù)據(jù)分蓖,添加更多訓(xùn)練示例將無濟于事尔艇。你需要使用更復(fù)雜的模型或提供更好的特征。
改善過擬合模型的一種方法是向其提供更多的訓(xùn)練數(shù)據(jù)么鹤,直到驗證誤差達(dá)到訓(xùn)練誤差為止终娃。
統(tǒng)計學(xué)和機器學(xué)習(xí)的重要理論成果是以下事實:模型的泛化誤差可以表示為三個非常不同的誤差之和:
- 偏差
- 方差
- 不可避免的誤差
增加模型的復(fù)雜度通常會顯著提升模型的方差并減少偏差。反過來蒸甜,降低模型的復(fù)雜度則會提升模型的偏差并降低方差棠耕。這就是為什么稱其為權(quán)衡余佛。
4.5 正則化線性模型
減少過擬合的一個好方法是對模型進(jìn)行正則化(即約束模型):它擁有的自由度越少,則過擬合數(shù)據(jù)的難度就越大窍荧。正則化多項式模型的一種簡單方法是減少多項式的次數(shù)辉巡。
Lasso回歸的一個重要特點是它傾向于完全消除掉最不重要特征的權(quán)重(也就是將它們設(shè)置為零)。
通常來說搅荞,有正則化——哪怕很小红氯,總比沒有更可取一些。所以大多數(shù)情況下咕痛,你應(yīng)該避免使用純線性回歸痢甘。嶺回歸是個不錯的默認(rèn)選擇,但是如果你覺得實際用到的特征只有少數(shù)幾個茉贡,那就應(yīng)該更傾向于Lasso回歸或是彈性網(wǎng)絡(luò)塞栅,因為它們會將無用特征的權(quán)重降為零。一般而言腔丧,彈性網(wǎng)絡(luò)優(yōu)于Lasso回歸激捏,因為當(dāng)特征數(shù)量超過訓(xùn)練實例數(shù)量括享,又或者是幾個特征強相關(guān)時球涛,Lasso回歸的表現(xiàn)可能非常不穩(wěn)定泼掠。
對于梯度下降這一類迭代學(xué)習(xí)的算法,還有一個與眾不同的正則化方法衣厘,就是在驗證誤差達(dá)到最小值時停止訓(xùn)練如蚜,該方法叫作提前停止法。
通過早期停止法影暴,一旦驗證誤差達(dá)到最小值就立刻停止訓(xùn)練错邦。這是一個非常簡單而有效的正則化技巧,所以Geoffrey Hinton稱其為“美麗的免費午餐”型宙。
4.6 邏輯回歸
一些回歸算法也可用于分類(反之亦然)撬呢。邏輯回歸(Logistic回歸,也稱為Logit回歸)被廣泛用于估算一個實例屬于某個特定類別的概率妆兑。(比如魂拦,這封電子郵件屬于垃圾郵件的概率是多少?)如果預(yù)估概率超過50%箭跳,則模型預(yù)測該實例屬于該類別(稱為正類晨另,標(biāo)記為“1”),反之谱姓,則預(yù)測不是(稱為負(fù)類,標(biāo)記為“0”)刨晴。這樣它就成了一個二元分類器屉来。
邏輯回歸模型經(jīng)過推廣路翻,可以直接支持多個類別,而不需要訓(xùn)練并組合多個二元分類器茄靠。這就是Softmax回歸茂契,或者叫作多元邏輯回歸。
原理很簡單:給定一個實例x慨绳,Softmax回歸模型首先計算出每個類k的分?jǐn)?shù)sk(x)掉冶,然后對這些分?jǐn)?shù)應(yīng)用softmax函數(shù)(也叫歸一化指數(shù)),估算出每個類的概率脐雪。
Softmax回歸分類器一次只能預(yù)測一個類(即它是多類厌小,而不是多輸出),因此它只能與互斥的類(例如不同類型的植物)一起使用战秋。你無法使用它在一張照片中識別多個人璧亚。
第5章 支持向量機
支持向量機(Support Vector Machine,SVM)是一個功能強大并且全面的機器學(xué)習(xí)模型脂信,它能夠執(zhí)行線性或非線性分類癣蟋、回歸,甚至是異常值檢測任務(wù)狰闪。
SVM特別適用于中小型復(fù)雜數(shù)據(jù)集的分類疯搅。
5.3 SVM回歸
SVM算法非常全面:它不僅支持線性和非線性分類,而且還支持線性和非線性回歸埋泵。訣竅在于將目標(biāo)反轉(zhuǎn)一下:不再嘗試擬合兩個類之間可能的最寬街道的同時限制間隔違例幔欧,SVM回歸要做的是讓盡可能多的實例位于街道上,同時限制間隔違例(也就是不在街道上的實例)秋泄。
第6章 決策樹
與SVM一樣琐馆,決策樹是通用的機器學(xué)習(xí)算法,可以執(zhí)行分類和回歸任務(wù)恒序,甚至多輸出任務(wù)瘦麸。它們是功能強大的算法,能夠擬合復(fù)雜的數(shù)據(jù)集歧胁。
決策樹也是隨機森林的基本組成部分滋饲,它們是當(dāng)今最強大的機器學(xué)習(xí)算法之一。
6.2 做出預(yù)測
Scikit-Learn使用的是CART算法喊巍,該算法僅生成二叉樹:非葉節(jié)點永遠(yuǎn)只有兩個子節(jié)點(即問題答案僅有是或否)屠缭。但是,其他算法(比如ID3生成的決策樹)崭参,其節(jié)點可以擁有兩個以上的子節(jié)點呵曹。
6.4 CART訓(xùn)練算法
Scikit-Learn使用分類和回歸樹(Classification and Regression Tree,CART)算法來訓(xùn)練決策樹(也稱為“增長樹”)。
該算法的工作原理是:首先使用單個特征k和閾值tk(例如奄喂,“花瓣長度”≤2.45cm”)將訓(xùn)練集分為兩個子集铐殃。
一旦CART算法成功地將訓(xùn)練集分為兩部分,它就會使用相同的邏輯將子集進(jìn)行分割跨新,然后再分割子集富腊,以此類推。一旦達(dá)到最大深度(由超參數(shù)max_depth定義)域帐,或者找不到可減少不純度的分割赘被,它將停止遞歸。
如你所見肖揣,CART是一種貪婪算法:從頂層開始搜索最優(yōu)分裂民假,然后每層重復(fù)這個過程。幾層分裂之后许饿,它并不會檢視這個分裂的不純度是否為可能的最低值阳欲。貪婪算法通常會產(chǎn)生一個相當(dāng)不錯的解,但是不能保證是最優(yōu)解陋率。
6.6 基尼不純度或熵
熵的概念源于熱力學(xué)球化,是一種分子混亂程度的度量:如果分子保持靜止和良序,則熵接近于零瓦糟。后來這個概念推廣到各個領(lǐng)域筒愚,其中包括香農(nóng)的信息理論,它衡量的是一條信息的平均信息內(nèi)容[1]:如果所有的信息都相同菩浙,則熵為零巢掺。在機器學(xué)習(xí)中,它也經(jīng)常被用作一種不純度的測量方式:如果數(shù)據(jù)集中僅包含一個類別的實例劲蜻,其熵為零陆淀。
6.7 正則化超參數(shù)
為避免過擬合,需要在訓(xùn)練過程中降低決策樹的自由度∠孺遥現(xiàn)在你應(yīng)該知道轧苫,這個過程被稱為正則化。
減小max_depth可使模型正則化疫蔓,從而降低過擬合的風(fēng)險含懊。
第7章 集成學(xué)習(xí)和隨機森林
如果你隨機向幾千個人詢問一個復(fù)雜問題,然后匯總他們的回答衅胀。在許多情況下岔乔,你會發(fā)現(xiàn),這個匯總的回答比專家的回答還要好滚躯,這被稱為群體智慧雏门。
同樣嘿歌,如果你聚合一組預(yù)測器(比如分類器或回歸器)的預(yù)測,得到的預(yù)測結(jié)果也比最好的單個預(yù)測器要好剿配。這樣的一組預(yù)測器稱為集成搅幅,所以這種技術(shù)也被稱為集成學(xué)習(xí)阅束,而一個集成學(xué)習(xí)算法則被稱為集成方法呼胚。
例如,你可以訓(xùn)練一組決策樹分類器息裸,每一棵樹都基于訓(xùn)練集不同的隨機子集進(jìn)行訓(xùn)練蝇更。做出預(yù)測時,你只需要獲得所有樹各自的預(yù)測呼盆,然后給出得票最多的類別作為預(yù)測結(jié)果年扩。這樣一組決策樹的集成被稱為隨機森林访圃,盡管很簡單,但它是迄今可用的最強大的機器學(xué)習(xí)算法之一批糟。
7.1 投票分類器
當(dāng)預(yù)測器盡可能互相獨立時盛末,集成方法的效果最優(yōu)悄但。獲得多種分類器的方法之一就是使用不同的算法進(jìn)行訓(xùn)練。這會增加它們犯不同類型錯誤的機會石抡,從而提升集成的準(zhǔn)確率檐嚣。
7.2 bagging和pasting
前面提到,獲得不同種類分類器的方法之一是使用不同的訓(xùn)練算法汁雷。還有另一種方法是每個預(yù)測器使用的算法相同净嘀,但是在不同的訓(xùn)練集隨機子集上進(jìn)行訓(xùn)練。
采樣時如果將樣本放回侠讯,這種方法叫作bagging[1](bootstrap aggregating[2]的縮寫挖藏,也叫自舉匯聚法)。采樣時樣本不放回厢漩,這種方法則叫作pasting[3]膜眠。
7.5 提升法
提升法(boosting,最初被稱為假設(shè)提升)是指可以將幾個弱學(xué)習(xí)器結(jié)合成一個強學(xué)習(xí)器的任意集成方法。大多數(shù)提升法的總體思路是循環(huán)訓(xùn)練預(yù)測器宵膨,每一次都對其前序做出一些改正架谎。可用的提升法有很多辟躏,但目前最流行的方法是AdaBoost[1](Adaptive Boosting的簡稱)和梯度提升谷扣。
這種依序?qū)W習(xí)技術(shù)有一個重要的缺陷就是無法并行(哪怕只是一部分),因為每個預(yù)測器只能在前一個預(yù)測器訓(xùn)練完成并評估之后才能開始訓(xùn)練捎琐。因此会涎,在擴展方面,它的表現(xiàn)不如bagging和pasting方法瑞凑。
第8章 降維
8.1 維度的詛咒
簡而言之末秃,訓(xùn)練集的維度越高,過擬合的風(fēng)險就越大籽御。
8.2 降維的主要方法
減少維度的兩種主要方法:投影和流形學(xué)習(xí)练慕。
許多降維算法通過對訓(xùn)練實例所在的流形進(jìn)行建模來工作。這稱為流形學(xué)習(xí)技掏。它依賴于流形假設(shè)(也稱為流形假說)铃将,該假設(shè)認(rèn)為大多數(shù)現(xiàn)實世界的高維數(shù)據(jù)集都接近于低維流形。通常這是根據(jù)經(jīng)驗觀察到的這種假設(shè)零截。
簡而言之麸塞,在訓(xùn)練模型之前降低訓(xùn)練集的維度肯定可以加快訓(xùn)練速度,但這并不總是會導(dǎo)致更好或更簡單的解決方案涧衙,它取決于數(shù)據(jù)集哪工。
8.3 PCA
主成分分析(PCA)是迄今為止最流行的降維算法。首先弧哎,它識別最靠近數(shù)據(jù)的超平面雁比,然后將數(shù)據(jù)投影到其上
比較原始數(shù)據(jù)集與其軸上的投影之間的均方距離,使這個均方距離最小的軸是最合理的選擇撤嫩,這也正是PCA背后的簡單思想偎捎。
軸的數(shù)量與數(shù)據(jù)集維度數(shù)量相同。
第i個軸稱為數(shù)據(jù)的第i個主要成分(PC)序攘。
那么如何找到訓(xùn)練集的主要成分呢茴她?幸運的是,有一種稱為奇異值分解(SVD)的標(biāo)準(zhǔn)矩陣分解技術(shù)程奠,該技術(shù)可以將訓(xùn)練集矩陣X分解為三個矩陣UΣVT的矩陣乘法丈牢,其中V包含定義所有主要成分的單位向量。
8.5 LLE
局部線性嵌入(LLE)是另一種強大的非線性降維(NLDR)技術(shù)[1]瞄沙。它是一種流形學(xué)習(xí)技術(shù)己沛,不像以前的算法那樣依賴于投影慌核。簡而言之,LLE的工作原理是首先測量每個訓(xùn)練實例如何與其最近的鄰居(c.n.)線性相關(guān)申尼,然后尋找可以最好地保留這些局部關(guān)系的訓(xùn)練集的低維表示形式(稍后會詳細(xì)介紹)垮卓。這種方法特別適合于展開扭曲的流形,尤其是在沒有太多噪聲的情況下师幕。
8.6 其他降維技術(shù)
線性判別分析(LDA)
LDA是一種分類算法粟按,但是在訓(xùn)練過程中,它會學(xué)習(xí)各類之間最有判別力的軸们衙,然后可以使用這些軸來定義要在其上投影數(shù)據(jù)的超平面钾怔。這種方法的好處是投影將使類保持盡可能遠(yuǎn)的距離,因此LDA是在運行其他分類算法(例如SVM分類器)之前降低維度的好技術(shù)蒙挑。
第9章 無監(jiān)督學(xué)習(xí)技術(shù)
9.1 聚類
你可能需要植物學(xué)家告訴你什么是物種,但你當(dāng)然不需要專家來識別外觀相似的物體組愚臀。這稱為聚類:識別相似實例并將其分配給相似實例的集群或組忆蚀。
與分類不同,聚類是一項無監(jiān)督任務(wù)姑裂。
聚類是無監(jiān)督學(xué)習(xí)任務(wù)
K-Means通常是最快的聚類算法之一馋袜。
嘗試選擇k時,慣性不是一個好的性能指標(biāo)舶斧,因為隨著k的增加欣鳖,慣性會不斷降低。實際上茴厉,集群越多泽台,每個實例將越接近其最接近的中心點,因此慣性將越低矾缓。
9.2 高斯混合模型
如果你將正常實例的重建誤差與異常的重建誤差進(jìn)行比較怀酷,則后者通常會大得多。這是一種簡單且通常非常有效的異常檢測方法
第二部分 神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)
第10章 Keras人工神經(jīng)網(wǎng)絡(luò)簡介
10.1 從生物神經(jīng)元到人工神經(jīng)元
事實證明嗜闻,可以通過堆疊多個感知器來消除感知器的某些局限性蜕依。所得的ANN稱為多層感知器(MLP)。
MLP由一層(直通)輸入層琉雳、一層或多層TLU(稱為隱藏層)和一個TLU的最后一層(稱為輸出層)組成
靠近輸入層的層通常稱為較低層样眠,靠近輸出層的層通常稱為較高層。除輸出層外的每一層都包含一個偏置神經(jīng)元翠肘,并完全連接到下一層檐束。
對于每個訓(xùn)練實例,反向傳播算法首先進(jìn)行預(yù)測(正向傳遞)并測量誤差锯茄,然后反向經(jīng)過每個層以測量來自每個連接的誤差貢獻(xiàn)(反向傳遞)厢塘,最后調(diào)整連接權(quán)重以減少錯誤(梯度下降步驟)茶没。
10.2 使用Keras實現(xiàn)MLP
如果你對模型的性能不滿意,則應(yīng)回頭調(diào)整超參數(shù)晚碾。首先要檢查的是學(xué)習(xí)率抓半。如果這樣做沒有幫助,請嘗試使用另一個優(yōu)化器(并在更改任何超參數(shù)后始終重新調(diào)整學(xué)習(xí)率)格嘁。如果性能仍然不佳笛求,則嘗試調(diào)整模型超參數(shù)(例如層數(shù)、每層神經(jīng)元數(shù)以及用于每個隱藏層的激活函數(shù)的類型)糕簿。你還可以嘗試調(diào)整其他超參數(shù)探入,例如批處理大小
在測試集上獲得比在驗證集上略低的性能是很常見的,因為超參數(shù)是在驗證集而不是測試集上進(jìn)行調(diào)優(yōu)的
切記不要調(diào)整測試集上的超參數(shù)懂诗,否則你對泛化誤差的估計將過于樂觀蜂嗽。
Keras使用HDF5格式保存模型的結(jié)構(gòu)(包括每一層的超參數(shù))和每一層的所有模型參數(shù)值(例如,連接權(quán)重和偏置)殃恒。
它還可以保存優(yōu)化器(包括其超參數(shù)及其可能具有的任何狀態(tài))植旧。
在這種情況下,你不僅應(yīng)該在訓(xùn)練結(jié)束時保存模型离唐,還應(yīng)該在訓(xùn)練過程中定期保存檢查點病附,以免在計算機崩潰時丟失所有內(nèi)容。
10.3 微調(diào)神經(jīng)網(wǎng)絡(luò)超參數(shù)
Google還使用了一種進(jìn)化方法亥鬓,不僅用于搜索超參數(shù)完沪,而且還為該問題尋找最佳神經(jīng)網(wǎng)絡(luò)架構(gòu)。
實際上嵌戈,進(jìn)化算法已成功用于訓(xùn)練單個神經(jīng)網(wǎng)絡(luò)覆积,從而取代了無處不在的梯度下降!
盡管取得了這些令人振奮的進(jìn)步以及這些工具和服務(wù)咕别,但是了解每個超參數(shù)的合理值技健,仍然有助于你構(gòu)建快速原型并限制搜索空間。
對于許多問題惰拱,你可以從單個隱藏層開始并獲得合理的結(jié)果雌贱。只要具有足夠的神經(jīng)元,只有一個隱藏層的MLP理論上就可以對最復(fù)雜的功能進(jìn)行建模偿短。但是對于復(fù)雜的問題欣孤,深層網(wǎng)絡(luò)的參數(shù)效率要比淺層網(wǎng)絡(luò)高得多:與淺層網(wǎng)絡(luò)相比,深層網(wǎng)絡(luò)可以使用更少的神經(jīng)元對復(fù)雜的函數(shù)進(jìn)行建模昔逗,從而使它們在相同數(shù)量的訓(xùn)練數(shù)據(jù)下可以獲得更好的性能降传。
較低的隱藏層對低層結(jié)構(gòu)(例如形狀和方向不同的線段)建模,中間的隱藏層組合這些低層結(jié)構(gòu)勾怒,對中間層結(jié)構(gòu)(例如正方形婆排、圓形)進(jìn)行建模声旺,而最高的隱藏層和輸出層將這些中間結(jié)構(gòu)組合起來,對高層結(jié)構(gòu)(例如人臉)進(jìn)行建模段只。
這種分層架構(gòu)不僅可以幫助DNN更快地收斂到一個好的解腮猖,而且還可以提高DNN泛化到新數(shù)據(jù)集的能力。例如赞枕,如果你已經(jīng)訓(xùn)練了一個模型來識別圖片中的人臉澈缺,并且現(xiàn)在想訓(xùn)練一個新的神經(jīng)網(wǎng)絡(luò)來識別發(fā)型,則可以通過重用第一個網(wǎng)絡(luò)的較低層來開始訓(xùn)練炕婶。你可以將它們初始化為第一個網(wǎng)絡(luò)較低層的權(quán)重和偏置值姐赡,而不是隨機初始化新神經(jīng)網(wǎng)絡(luò)前幾層的權(quán)重和偏置值。這樣柠掂,網(wǎng)絡(luò)就不必從頭開始學(xué)習(xí)大多數(shù)圖片中出現(xiàn)的所有底層結(jié)構(gòu)项滑。只需學(xué)習(xí)更高層次的結(jié)構(gòu)(例如發(fā)型)。這稱為遷移學(xué)習(xí)陪踩。
總而言之杖们,對于許多問題,你可以僅從一兩個隱藏層開始肩狂,然后神經(jīng)網(wǎng)絡(luò)就可以正常工作。例如姥饰,僅使用一個具有幾百個神經(jīng)元的隱藏層傻谁,就可以輕松地在MNIST數(shù)據(jù)集上達(dá)到97%以上的準(zhǔn)確率,而使用具有相同總數(shù)的神經(jīng)元的兩個隱藏層列粪,可以在大致相同訓(xùn)練時間上輕松達(dá)到98%以上的精度审磁。對于更復(fù)雜的問題,你可以增加隱藏層的數(shù)量岂座,直到開始過擬合訓(xùn)練集為止态蒂。非常復(fù)雜的任務(wù)(例如圖像分類或語音識別)通常需要具有數(shù)十層(甚至數(shù)百層,但不是全連接的網(wǎng)絡(luò))的網(wǎng)絡(luò)费什,并且它們需要大量的訓(xùn)練數(shù)據(jù)钾恢。你幾乎不必從頭開始訓(xùn)練這樣的網(wǎng)絡(luò):重用一部分類似任務(wù)的經(jīng)過預(yù)訓(xùn)練的最新網(wǎng)絡(luò)更為普遍。這樣鸳址,訓(xùn)練就會快得多瘩蚪,所需的數(shù)據(jù)也要少得多
輸入層和輸出層中神經(jīng)元的數(shù)量取決于任務(wù)所需的輸入類型和輸出類型。例如稿黍,MNIST任務(wù)需要28×28=784個輸入神經(jīng)元和10個輸出神經(jīng)元先匪。
對于隱藏層幅疼,通常將它們調(diào)整大小以形成金字塔狀,每一層的神經(jīng)元越來越少涯鲁,理由是許多低層特征可以合并成更少的高層特征。
就像層數(shù)一樣该贾,你可以嘗試逐漸增加神經(jīng)元的數(shù)量,直到網(wǎng)絡(luò)開始過擬合為止。但是在實踐中汹押,選擇一個比你實際需要的層和神經(jīng)元更多的模型,然后使用提前停止和其他正則化技術(shù)來防止模型過擬合鸯乃,通常更簡單鲸阻、更有效。
學(xué)習(xí)率可以說是最重要的超參數(shù)缨睡。一般而言鸟悴,最佳學(xué)習(xí)率約為最大學(xué)習(xí)率的一半(即學(xué)習(xí)率大于算法發(fā)散的學(xué)習(xí)率
因此一種策略是嘗試使用大批量處理,慢慢增加學(xué)習(xí)率奖年,如果訓(xùn)練不穩(wěn)定或最終表現(xiàn)令人失望细诸,則嘗試使用小批量處理。
通常陋守,ReLU激活函數(shù)是所有隱藏層的良好的默認(rèn)設(shè)置震贵。
在大多數(shù)情況下,實際上不需要調(diào)整訓(xùn)練迭代次數(shù)水评,只需使用提前停止即可猩系。
最佳學(xué)習(xí)率取決于其他超參數(shù),尤其是批量大小中燥,因此如果你修改了任何超參數(shù)寇甸,請確保也更新學(xué)習(xí)率。
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)
11.1 梯度消失與梯度爆炸問題
隨著算法向下傳播到較低層疗涉,梯度通常會越來越小拿霉。結(jié)果梯度下降更新使較低層的連接權(quán)重保持不變,訓(xùn)練不能收斂到一個良好的解咱扣。我們稱其為梯度消失問題绽淘。
在某些情況下,可能會出現(xiàn)相反的情況:梯度可能會越來越大闹伪,各層需要更新很大的權(quán)重直到算法發(fā)散為止沪铭。這是梯度爆炸問題,它出現(xiàn)在遞歸神經(jīng)網(wǎng)絡(luò)中祭往。更籠統(tǒng)地說伦意,深度神經(jīng)網(wǎng)絡(luò)很受梯度不穩(wěn)定的影響,不同的層可能以不同的速度學(xué)習(xí)硼补。
那么驮肉,你應(yīng)該對深度神經(jīng)網(wǎng)絡(luò)的隱藏層使用哪個激活函數(shù)呢?盡管你的目標(biāo)會有所不同已骇,但通常SELU>ELU>leaky ReLU(及其變體)>ReLU>tanh>logistic离钝。如果網(wǎng)絡(luò)的架構(gòu)不能自歸一化票编,那么ELU的性能可能會優(yōu)于SELU(因為SELU在z=0時不平滑)。如果你非常關(guān)心運行時延遲卵渴,那么你可能更喜歡leaky ReLU慧域。如果你不想調(diào)整其他超參數(shù),則可以使用Keras使用的默認(rèn)α值(例如浪读,leaky ReLU為0.3)昔榴。如果你有空閑時間和計算能力,則可以使用交叉驗證來評估其他激活函數(shù)碘橘,例如互订,如果網(wǎng)絡(luò)過擬合,則為RReLU痘拆;如果你的訓(xùn)練集很大仰禽,則為PReLU。也就是說纺蛆,由于ReLU是迄今為止最常用的激活函數(shù)吐葵,因此許多庫和硬件加速器都提供了ReLU特定的優(yōu)化。因此桥氏,如果你將速度放在首位温峭,那么ReLU可能仍然是最佳選擇。
批量歸一化的作用就像正則化一樣字支,減少了對其他正則化技術(shù)的需求诚镰。
但是,批量歸一化確實增加了模型的復(fù)雜性
由于每一層都需要額外的計算祥款,因此神經(jīng)網(wǎng)絡(luò)的預(yù)測速度較慢。幸運的是月杉,經(jīng)橙絮耍可以在訓(xùn)練后將BN層與上一層融合,從而避免了運行時的損失苛萎。
這是通過更新前一層的權(quán)重和偏置來完成的桨昙,以便它直接產(chǎn)生適當(dāng)縮放和偏移的輸出。
BatchNormalization已成為深度神經(jīng)網(wǎng)絡(luò)中最常用的層之一腌歉,以至于在圖表中通常將其省略蛙酪,因為假定在每層之后都添加了BN。
緩解梯度爆炸問題的另一種流行技術(shù)是在反向傳播期間裁剪梯度翘盖,使它們永遠(yuǎn)不會超過某個閾值桂塞。這稱為梯度裁剪[12]。這種技術(shù)最常用于循環(huán)神經(jīng)網(wǎng)絡(luò)馍驯,因為在RNN中難以使用批量歸一化阁危,
11.2 重用預(yù)訓(xùn)練層
一般而言玛痊,當(dāng)輸入具有類似的低級特征時,遷移學(xué)習(xí)最有效狂打。
任務(wù)越相似擂煞,可重用的層越多(從較低的層開始)。對于非常相似的任務(wù)趴乡,請嘗試保留所有的隱藏層和只是替換掉輸出層对省。
首先嘗試凍結(jié)所有可重復(fù)使用的層(使其權(quán)重不可訓(xùn)練,這樣梯度下降就不會對其進(jìn)行修改)晾捏,訓(xùn)練模型并查看其表現(xiàn)蒿涎。然后嘗試解凍上部隱藏層中的一兩層,使反向傳播可以對其進(jìn)行調(diào)整粟瞬,再查看性能是否有所提高同仆。你擁有的訓(xùn)練數(shù)據(jù)越多,可以解凍的層就越多裙品。當(dāng)解凍重用層時俗批,降低學(xué)習(xí)率也很有用,可以避免破壞其已經(jīng)調(diào)整好的權(quán)重市怎。
但是由于新的輸出層是隨機初始化的岁忘,它會產(chǎn)生較大的錯誤(至少在前幾個輪次內(nèi)),因此將存在較大的錯誤梯度区匠,這可能會破壞重用的權(quán)重干像。為了避免這種情況,一種方法是在前幾個輪次時凍結(jié)重用的層驰弄,給新層一些時間來學(xué)習(xí)合理的權(quán)重麻汰。為此,請將每一層的可訓(xùn)練屬性設(shè)置為False并編譯模型
凍結(jié)或解凍層后戚篙,你必須總是要編譯模型五鲫。
解凍重用層之后,降低學(xué)習(xí)率通常是個好主意岔擂,可以再次避免損壞重用的權(quán)重
事實證明位喂,遷移學(xué)習(xí)在小型密集型網(wǎng)絡(luò)中不能很好地工作,大概是因為小型網(wǎng)絡(luò)學(xué)習(xí)的模式很少乱灵,密集網(wǎng)絡(luò)學(xué)習(xí)的是非常特定的模式塑崖,這在其他任務(wù)中不是很有用。遷移學(xué)習(xí)最適合使用深度卷積神經(jīng)網(wǎng)絡(luò)痛倚,該神經(jīng)網(wǎng)絡(luò)傾向于學(xué)習(xí)更為通用的特征檢測器(尤其是在較低層)规婆。
自我監(jiān)督學(xué)習(xí)是指你從數(shù)據(jù)本身自動生成標(biāo)簽,然后使用有監(jiān)督學(xué)習(xí)技術(shù)在所得到的“標(biāo)簽”數(shù)據(jù)集上訓(xùn)練模型。由于此方法不需要任何人工標(biāo)記聋呢,因此最好將其分類為無監(jiān)督學(xué)習(xí)的一種形式苗踪。
11.3 更快的優(yōu)化器
到目前為止,我們已經(jīng)知道了四種加快訓(xùn)練速度(并獲得了更好的解決方法)的方法:對連接權(quán)重應(yīng)用一個良好的初始化策略削锰,使用良好的激活函數(shù)通铲,使用批量歸一化,以及重用預(yù)訓(xùn)練網(wǎng)絡(luò)的某些部分(可能建立在輔助任務(wù)上或使用無監(jiān)督學(xué)習(xí))器贩。
動量優(yōu)化的一個缺點是它增加了另一個超參數(shù)來調(diào)整颅夺。但是,動量值為0.9通常在實踐中效果很好蛹稍,幾乎總是比常規(guī)的“梯度下降”更快吧黄。
對于簡單的二次問題,AdaGrad經(jīng)常表現(xiàn)良好唆姐,但是在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時拗慨,它往往停止得太早。學(xué)習(xí)率被按比例縮小奉芦,以至于算法在最終達(dá)到全局最優(yōu)解之前完全停止了赵抢。
Adam[5]代表自適應(yīng)矩估計,結(jié)合了動量優(yōu)化和RMSProp的思想:就像動量優(yōu)化一樣声功,它跟蹤過去梯度的指數(shù)衰減平均值烦却。就像RMSProp一樣,它跟蹤過去平方梯度的指數(shù)衰減平均值
所有的優(yōu)化算法都產(chǎn)生了密集模型先巴,這意味著大多數(shù)參數(shù)都是非零的其爵。如果你在運行時需要一個非常快的模型伸蚯,或者需要占用更少的內(nèi)存摩渺,那么你可能更喜歡使用一個稀疏模型。
實現(xiàn)這一點的一個簡單方法是像往常一樣訓(xùn)練模型剂邮,然后去掉很小的權(quán)重(將它們設(shè)置為零)证逻。注意,這通常不會導(dǎo)致非常稀疏的模型抗斤,而且可能會降低模型的性能。一個更好的選擇是在訓(xùn)練時使用強1正規(guī)化
因為它會迫使優(yōu)化器產(chǎn)生盡可能多的為零的權(quán)重
表11-2比較了我們目前討論的所有優(yōu)化器(
*
不好丈咐,**
平均瑞眼,***
好)。表11-2:優(yōu)化器比較
11.4 通過正則化避免過擬合
深度神經(jīng)網(wǎng)絡(luò)通常具有數(shù)萬個參數(shù)棵逊,有時甚至有數(shù)百萬個伤疙。這給它們帶來了難以置信的自由度,意味著它們可以擬合各種各樣的復(fù)雜數(shù)據(jù)集。但是徒像,這種巨大的靈活性也使網(wǎng)絡(luò)易于過擬合訓(xùn)練集黍特。我們需要正則化。
最好的正則化技術(shù)之一:提前停止锯蛀。
即使“批量歸一化”被設(shè)計用來解決不穩(wěn)定的梯度問題灭衷,它的作用也像一個很好的正則化。
其他流行的神經(jīng)網(wǎng)絡(luò)正則化技術(shù):l1和l2正則化旁涤、dropout和最大范數(shù)正則化翔曲。
對于深度神經(jīng)網(wǎng)絡(luò),dropout是最受歡迎的正則化技術(shù)之一劈愚。
只需要增加dropout瞳遍,即使最先進(jìn)的神經(jīng)網(wǎng)絡(luò)也能獲得1~2%的準(zhǔn)確率提升。
在實踐中菌羽,你通常只可以對第一至第三層(不包括輸出層)中的神經(jīng)元應(yīng)用dropout掠械。
dropout確實會明顯減慢收斂速度,但是如果正確微調(diào)注祖,通常會導(dǎo)致更好的模型猾蒂。因此,花額外的時間和精力是值得的氓轰。
簡而言之婚夫,MC Dropout是一種出色的技術(shù),可以提升dropout模型并提供更好的不確定性估計署鸡。當(dāng)然案糙,由于這只是訓(xùn)練期間的常規(guī)dropout,所以它也像正則化函數(shù)靴庆。
對于神經(jīng)網(wǎng)絡(luò)而言时捌,另一種流行的正則化技術(shù)稱為最大范數(shù)正則化
11.5 總結(jié)和實用指南
你如果可以找到解決類似問題的神經(jīng)網(wǎng)絡(luò),那應(yīng)該嘗試重用部分神經(jīng)網(wǎng)絡(luò)炉抒;如果有大量未標(biāo)記的數(shù)據(jù)奢讨,則應(yīng)使用無監(jiān)督預(yù)訓(xùn)練;如果有相似任務(wù)的大量標(biāo)記的數(shù)據(jù)焰薄,則應(yīng)該在輔助任務(wù)上使用預(yù)訓(xùn)練拿诸。
如果你需要低延遲的模型(執(zhí)行閃電般快速預(yù)測的模型),則可能需要使用更少的層塞茅,將批量歸一化層融合到先前的層中亩码,并使用更快的激活函數(shù),例如leaky ReLU或僅僅使用ReLU野瘦。擁有稀疏模型也將有所幫助描沟。最后飒泻,你可能想把浮點精度從32位降低到16位甚至8位
如果你要構(gòu)建風(fēng)險敏感的應(yīng)用,或者推理延遲在你的應(yīng)用中不是很重要吏廉,則可以使用MC Dropout來提高性能并獲得更可靠的概率估計以及不確定性估計泞遗。
第12章 使用TensorFlow自定義模型和訓(xùn)練
12.1 TensorFlow快速瀏覽
越來越多的ML論文連同實現(xiàn)一起發(fā)布,有時甚至帶有預(yù)訓(xùn)練的模型席覆。查看https://paperswithcode.com/史辙,可以輕松找到它們。
12.2 像NumPy一樣使用TensorFlow
TensorFlow的API一切都圍繞張量娜睛,張量從一個操作流向另一個操作髓霞,因此命名為TensorFlow。張量非常類似NumPy的ndarray畦戒,它通常是一個多維度組方库,但它也可以保存標(biāo)量(簡單值,例如42)障斋。
請注意纵潦,默認(rèn)情況下NumPy使用64位精度,而TensorFlow使用32位精度垃环。這是因為32位精度通常對于神經(jīng)網(wǎng)絡(luò)來說綽綽有余邀层,而且運行速度更快且使用的RAM更少。因此遂庄,當(dāng)你從NumPy數(shù)組創(chuàng)建張量時寥院,請確保設(shè)置dtype=tf.float32。
類型轉(zhuǎn)換會嚴(yán)重影響性能涛目,并且自動完成轉(zhuǎn)換很容易被忽視秸谢。為了避免這種情況,TensorFlow不會自動執(zhí)行任何類型轉(zhuǎn)換:如果你對不兼容類型的張量執(zhí)行操作霹肝,會引發(fā)異常估蹄。
當(dāng)然當(dāng)你確實需要轉(zhuǎn)換類型時,可以使用tf.cast()
第13章 使用TensorFlow加載和預(yù)處理數(shù)據(jù)
13.3 預(yù)處理輸入特征
詞匯表外(outof-vocabulary沫换,oov)桶
為什么要使用oov桶臭蚁?如果類別數(shù)量很大(例如郵政編碼、城市讯赏、單詞垮兑、產(chǎn)品或用戶)并且數(shù)據(jù)集也很大,或者它們一直在變化漱挎,那么得到類別的完整列表可能不是很方便甥角。一種解決方法是基于數(shù)據(jù)樣本(而不是整個訓(xùn)練集)定義詞匯表,并為不在數(shù)據(jù)樣本中的其他類別添加一些桶识樱。你希望在訓(xùn)練期間找到的類別越多,就應(yīng)該使用越多的oov桶。如果沒有足夠的oov桶怜庸,就會發(fā)生沖突:不同的類別最終會出現(xiàn)在同一個桶中当犯,因此神經(jīng)網(wǎng)絡(luò)將無法區(qū)分它們(至少不是基于這個特征)。
根據(jù)經(jīng)驗割疾,如果類別數(shù)少于10嚎卫,則通常采用獨熱編碼方式。(但數(shù)字可能會有所不同:觊拧)如果類別數(shù)大于50(通常這種情況需要使用哈希桶)拓诸,通常最好使用嵌入。在10到50個類別中麻昼,你可能需要嘗試兩種方法奠支,然后看看哪種最適合你。
訓(xùn)練使嵌入成為類別的有用表征抚芦。這稱為表征學(xué)習(xí)
確保深度學(xué)習(xí)算法的公平性是重要且活躍的研究課題倍谜。
第14章 使用卷積神經(jīng)網(wǎng)絡(luò)的深度計算機視覺
14.2 卷積層
CNN的最重要的構(gòu)建塊是卷積層[1]:第一卷積層的神經(jīng)元不會連接到輸入圖像中的每個像素(如前文所述),而只與其接受野內(nèi)的像素相連接(見圖14-2)叉抡。反過來尔崔,第二卷積層的每個神經(jīng)元僅連接到位于第一層中的一個小矩陣內(nèi)的神經(jīng)元。這種架構(gòu)允許網(wǎng)絡(luò)集中在第一個隱藏層的低階特征中褥民,然后在下一個隱藏層中將它們組裝成比較高階的特征季春,等等。CNN在圖像識別方面效果很好的原因之一是這種層次結(jié)構(gòu)在現(xiàn)實世界的圖像中很常見消返。
在CNN中载弄,每一層都以2D表示,這使得將神經(jīng)元與其相應(yīng)的輸入進(jìn)行匹配變得更加容易侦副。
特征圖中所有的神經(jīng)元共享相同的參數(shù)侦锯,大大減少了模型中的參數(shù)數(shù)量。CNN一旦學(xué)會了在一個位置識別模式秦驯,就可以在其他任何位置識別模式尺碰。相反,常規(guī)DNN學(xué)會了在一個位置識別模式译隘,它就只能在那個特定位置識別它亲桥。
在推理期間(即對新實例進(jìn)行預(yù)測時),只要計算了下一層固耘,就可以釋放由前一層占用的RAM题篷,因此你只需要兩個連續(xù)層所需的RAM。但是在訓(xùn)練過程中厅目,需要保留正向傳播過程中計算出的所有內(nèi)容以供反向傳播番枚,因此所需的RAM量至少是所有層所需的RAM總量法严。
14.3 池化層
平均池化層曾經(jīng)很受歡迎,但是現(xiàn)在人們通常都使用最大池化層葫笼,因為它們通常表現(xiàn)更好深啤。這似乎令人驚訝,因為計算均值通常比計算最大值損失更少的信息路星。但是另一方面溯街,最大池化僅保留最強的特征,將所有無意義的特征都丟棄掉洋丐,因此下一層可獲得更清晰的信號來使用呈昔。而且與平均池化相比,最大池化提供了更強的變換不變性友绝,并且所需計算量略少于平均池化堤尾。
14.4 CNN架構(gòu)
與常規(guī)卷積層相比,可分離卷積層使用更少的參數(shù)九榔、更少的內(nèi)存和更少的計算哀峻,而且通常它們表現(xiàn)更好,因此哲泊,你應(yīng)默認(rèn)使用它們(除了在通道較少的層之后)剩蟀。
14.8 分類和定位
評估模型對邊界框的預(yù)測能力不是一個很好的指標(biāo)。最常用的度量指標(biāo)是“交并比”(Intersection over Union切威,IoU):預(yù)測邊界框和目標(biāo)邊界框之間的重疊面積除以它們的聯(lián)合面積(見圖14-23)育特。
圖14-23:邊界框的交并比(IoU)度量
第15章 使用RNN和CNN處理序列
15.1 循環(huán)神經(jīng)元和層
循環(huán)神經(jīng)網(wǎng)絡(luò)看起來非常像前饋神經(jīng)網(wǎng)絡(luò),除了它還具有指向反向的連接先朦。
由于在時間步長t時遞歸神經(jīng)元的輸出是先前時間步長中所有輸入的函數(shù)缰冤,因此你可以說它具有記憶的形式。在時間步長上保留某些狀態(tài)的神經(jīng)網(wǎng)絡(luò)的一部分稱為記憶單元(或簡稱為單元)喳魏。
許多研究人員更喜歡在RNN中使用雙曲正切(tanh)激活函數(shù)棉浸,而不是ReLU激活函數(shù)。
15.3 預(yù)測時間序列
典型的任務(wù)是預(yù)測未來值刺彩,這稱為預(yù)測迷郑。另一個常見任務(wù)是填補空白:預(yù)測過去的缺失值。這稱為插補创倔。
15.4 處理長序列
簡而言之嗡害,LSTM單元可以學(xué)會識別重要的輸入(這是輸入門的作用),將其存儲在長期狀態(tài)中畦攘,只要需要就保留它(即遺忘門的作用)霸妹,并在需要時將其提取出來。這就解釋了為什么這些單元在識別時間序列知押、長文本叹螟、錄音等的長期模式方面取得了驚人的成功鹃骂。
門控循環(huán)單元(Gated Recurrent Unit稍刀,GRU)是LSTM單元的簡化版介袜,它的性能似乎也不錯
LSTM和GRU單元是RNN成功的主要原因之一。盡管它們可以處理比簡單RNN更長的序列方篮,但它們的短期記憶仍然非常有限有缆,而且很難學(xué)習(xí)100個或更多時間步長序列中的長期模式,例如音頻樣本温亲、長時間序列或長句子棚壁。解決這個問題的一種方法是縮短輸入序列,例如使用一維卷積層栈虚。
第16章 使用RNN和注意力機制進(jìn)行自然語言處理
16.3 神經(jīng)機器翻譯的編碼器-解碼器網(wǎng)絡(luò)
在同一輸入上運行兩個循環(huán)層袖外,一層從左至右讀取單詞,另一層從右至左讀取單詞魂务。然后曼验,只需在每個時間步長上簡單地組合它們的輸出,通常將它們合并即可粘姜。這稱為雙向循環(huán)層
集束搜索:它跟蹤k個最有希望的句子(例如前三個)的一個短列表鬓照,在每個解碼器步長中嘗試用一個單詞它們擴展,僅僅保留k個最有可能的句子孤紧。參數(shù)k稱為集束寬度豺裆。
第17章 使用自動編碼器和GAN的表征學(xué)習(xí)和生成學(xué)習(xí)
生成式對抗網(wǎng)絡(luò)(GAN)
GAN由兩個神經(jīng)網(wǎng)絡(luò)組成:一個試圖生成看起來與訓(xùn)練數(shù)據(jù)相似數(shù)據(jù)的生成器,以及一個試圖從虛假數(shù)據(jù)中分辨出真實數(shù)據(jù)的判別器号显。這種架構(gòu)在深度學(xué)習(xí)中非常創(chuàng)新的臭猜,因為生成器和判別器在訓(xùn)練期間相互競爭:生成器就像是一個試圖做假幣的犯罪分子,而判別器就像是一個警察押蚤,試圖從真幣中分辨出假幣蔑歌。對抗訓(xùn)練(訓(xùn)練競爭性神經(jīng)網(wǎng)絡(luò))被廣泛認(rèn)為是近年來最重要的想法之一。
17.2 使用不完整的線性自動編碼器執(zhí)行PCA
一個模型可以用作另一個模型中的一個層
第18章 強化學(xué)習(xí)
18.7 馬爾可夫決策過程
無記憶的隨機過程揽碘,稱為馬爾可夫鏈次屠。這個過程具有固定數(shù)量的狀態(tài),并且在每個步驟中它都從一種狀態(tài)隨機演變到另一種狀態(tài)钾菊。它從狀態(tài)s演變?yōu)闋顟B(tài)s'的概率是固定的帅矗,并且僅取決于(s,s')煞烫,而不取決于過去的狀態(tài)(這就是為什么我們說系統(tǒng)沒有記憶)浑此。
18.8 時序差分學(xué)習(xí)
時序差分學(xué)習(xí)(TD學(xué)習(xí))算法與值迭代算法非常相似,但進(jìn)行了調(diào)整滞详,以考慮到智能體僅僅對MDP有部分了解的事實凛俱。
TD學(xué)習(xí)與隨機梯度下降有很多相似之處紊馏,特別是它一次處理一個樣本。而且蒲犬,就像隨機梯度下降一樣朱监,它只有在逐漸降低學(xué)習(xí)率的情況下才能真正收斂(否則它將不斷在最佳Q值附近震蕩)。
第19章 大規(guī)模訓(xùn)練和部署TensorFlow模型
19.2 將模型部署到移動端或嵌入式設(shè)備
圖19-8:使用對稱量化原叮,從32位浮點數(shù)到8位整數(shù)
在運行時赫编,量化權(quán)重在使用之前會轉(zhuǎn)換回浮點數(shù)(這些恢復(fù)的浮點數(shù)與原始浮點數(shù)并不完全相同,但相差不大奋隶,因此精度損失通常是可以接受的)擂送。
為避免始終對它們進(jìn)行重新計算,將對被恢復(fù)的浮點進(jìn)行緩存唯欣,因此不會減少RAM使用量嘹吨。而且計算速度也不會降低。
19.3 使用GPU加速計算86
Compute Unified Device Architecture(CUDA)庫境氢,該庫使開發(fā)人員可以利用支持CUDA的GPU來進(jìn)行各種計算(不僅是圖形加速)蟀拷,還有CUDA深度神經(jīng)網(wǎng)絡(luò)庫(cuDNN),這是GPU加速的DNN算子庫萍聊。cuDNN提供了常見DNN計算的優(yōu)化實現(xiàn)问芬,例如激活層、歸一化脐区、前向和后向卷積以及池化
TensorFlow使用CUDA和cuDNN來控制GPU卡并加速計算(見圖19-10)愈诚。
圖19-10:TensorFlow使用CUDA和cuDNN來控制GPU和加速DNN
19.4 跨多個設(shè)備的訓(xùn)練模型
在多個設(shè)備上訓(xùn)練單個模型的主要方法有兩種:模型并行(模型在設(shè)備之間劃分)和數(shù)據(jù)并行(模型在每個設(shè)備上復(fù)制,每個副本在數(shù)據(jù)子集上訓(xùn)練)牛隅。
跨設(shè)備通信速度很慢(尤其是當(dāng)設(shè)備位于不同的計算機上時)炕柔,這很可能會完全抵消并行計算的好處。
深度循環(huán)神經(jīng)網(wǎng)絡(luò)(見第15章)可以在多個GPU之間更有效地拆分媒佣。
模型并行化可以加快運行或訓(xùn)練某些類型的神經(jīng)網(wǎng)絡(luò)的速度匕累,但不是全部,需要特別注意和調(diào)整默伍,例如確保需要通信最多的設(shè)備在同一臺機器上運行