第4章-机器学习基础
Keras 是一個模型級(model-level)的庫,為開發(fā)深度學(xué)習(xí)模型提供了高層次的構(gòu)建模塊。
它不處理張量操作、求微分等低層次的運算。
相反,它依賴于一個專門的、高度優(yōu)化的張量庫來完成這些運算,這個張量庫就是 Keras 的后端引擎(backend engine)。
Keras 沒有選擇單個張量庫并將 Keras 實現(xiàn)與這個庫綁定,而是以模塊化的方式處理這個問題(見圖 3-3)。
因此,幾個不同的后端引擎都可以無縫嵌入到 Keras 中。目前,Keras 有三個后端實現(xiàn):TensorFlow 后端、Theano 后端和微軟認(rèn)知工具包(CNTK,Microsoft cognitive toolkit)后端。未來 Keras 可能會擴(kuò)展到支持更多的深度學(xué)習(xí)引擎。
?
TensorFlow、CNTK 和 Theano 是當(dāng)今深度學(xué)習(xí)的幾個主要平臺。Theano 由蒙特利爾大學(xué)的MILA 實驗室開發(fā),TensorFlow 由 Google 開發(fā),CNTK 由微軟開發(fā)。你用 Keras 寫的每一段代碼都可以在這三個后端上運行,無須任何修改。
?
?
?
監(jiān)督學(xué)習(xí)是目前最常見的機器學(xué)習(xí)類型。給定一組樣本(通常由人工標(biāo)注),它可以學(xué)會將
輸入數(shù)據(jù)映射到已知目標(biāo)[也叫標(biāo)注(annotation)]。
雖然監(jiān)督學(xué)習(xí)主要包括分類和回歸,但還有更多的奇特變體,主要包括如下幾種。
?
序列生成(sequence generation)。給定一張圖像,預(yù)測描述圖像的文字。序列生成有時可以被重新表示為一系列分類問題,比如反復(fù)預(yù)測序列中的單詞或標(biāo)記。
語法樹預(yù)測(syntax tree prediction)。給定一個句子,預(yù)測其分解生成的語法樹。
目標(biāo)檢測(object detection)。給定一張圖像,在圖中特定目標(biāo)的周圍畫一個邊界框。這個問題也可以表示為分類問題(給定多個候選邊界框,對每個框內(nèi)的目標(biāo)進(jìn)行分類)或分類與回歸聯(lián)合問題(用向量回歸來預(yù)測邊界框的坐標(biāo))。
圖像分割(image segmentation)。給定一張圖像,在特定物體上畫一個像素級的掩模(mask)。
?
降維(dimensionality?reduction)和聚類(clustering)都是眾所周知的無監(jiān)督學(xué)習(xí)方法。
?
自監(jiān)督學(xué)習(xí)是監(jiān)督學(xué)習(xí)的一個特例,它與眾不同,值得單獨歸為一類。自監(jiān)督學(xué)習(xí)是沒有人工標(biāo)注的標(biāo)簽的監(jiān)督學(xué)習(xí),你可以將它看作沒有人類參與的監(jiān)督學(xué)習(xí)。
標(biāo)簽仍然存在(因為總要有什么東西來監(jiān)督學(xué)習(xí)過程),但它們是從輸入數(shù)據(jù)中生成的,通常是使用啟發(fā)式算法生成的。
舉個例子,自編碼器(autoencoder)是有名的自監(jiān)督學(xué)習(xí)的例子,其生成的目標(biāo)就是未經(jīng)修改的輸入。同樣,給定視頻中過去的幀來預(yù)測下一幀,或者給定文本中前面的詞來預(yù)測下一個詞,都是自監(jiān)督學(xué)習(xí)的例子[這兩個例子也屬于時序監(jiān)督學(xué)習(xí)(temporally supervised learning),即用未來的輸入數(shù)據(jù)作為監(jiān)督]。
注意,監(jiān)督學(xué)習(xí)、自監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)之間的區(qū)別有時很模糊,這三個類別更像是沒有明確界限的連續(xù)體。
?
分類和回歸術(shù)語表
樣本(sample)或輸入(input):進(jìn)入模型的數(shù)據(jù)點。
預(yù)測(prediction)或輸出(output):從模型出來的結(jié)果。?
目標(biāo)(target):真實值。對于外部數(shù)據(jù)源,理想情況下,模型應(yīng)該能夠預(yù)測出目標(biāo)。
預(yù)測誤差(prediction error)或損失值(loss value):模型預(yù)測與目標(biāo)之間的距離。
類別(class):分類問題中供選擇的一組標(biāo)簽。例如,對貓狗圖像進(jìn)行分類時,“狗”和“貓”就是兩個類別。
標(biāo)簽(label):分類問題中類別標(biāo)注的具體例子。比如,如果 1234 號圖像被標(biāo)注為包含類別“狗”,那么“狗”就是 1234 號圖像的標(biāo)簽。
真值(ground-truth)或標(biāo)注(annotation):數(shù)據(jù)集的所有目標(biāo),通常由人工收集。
二分類(binary classification):一種分類任務(wù),每個輸入樣本都應(yīng)被劃分到兩個互斥的類別中。
多分類(multiclass classification):一種分類任務(wù),每個輸入樣本都應(yīng)被劃分到兩個以上的類別中,比如手寫數(shù)字分類。
多標(biāo)簽分類(multilabel classification):一種分類任務(wù),每個輸入樣本都可以分配多個標(biāo)簽。舉個例子,如果一幅圖像里可能既有貓又有狗,那么應(yīng)該同時標(biāo)注“貓”標(biāo)簽和“狗”標(biāo)簽。每幅圖像的標(biāo)簽個數(shù)通常是可變的。
標(biāo)量回歸(scalar regression):目標(biāo)是連續(xù)標(biāo)量值的任務(wù)。預(yù)測房價就是一個很好的例子,不同的目標(biāo)價格形成一個連續(xù)的空間。
向量回歸(vector regression):目標(biāo)是一組連續(xù)值(比如一個連續(xù)向量)的任務(wù)。如果對多個值(比如圖像邊界框的坐標(biāo))進(jìn)行回歸,那就是向量回歸。
小批量(mini-batch)或批量(batch):模型同時處理的一小部分樣本(樣本數(shù)通常為 8~128)。樣本數(shù)通常取 2 的冪,這樣便于 GPU 上的內(nèi)存分配。訓(xùn)練時,小批量用來為模型權(quán)重計算一次梯度下降更新。
?
?
評估模型的重點是將數(shù)據(jù)劃分為三個集合:訓(xùn)練集、驗證集和測試集。在訓(xùn)練數(shù)據(jù)上訓(xùn)練模型,在驗證數(shù)據(jù)上評估模型。一旦找到了最佳參數(shù),就在測試數(shù)據(jù)上最后測試一次。
你可能會問,為什么不是兩個集合:一個訓(xùn)練集和一個測試集?在訓(xùn)練集上訓(xùn)練模型,然后在測試集上評估模型。這樣簡單得多!
原因在于開發(fā)模型時總是需要調(diào)節(jié)模型配置,比如選擇層數(shù)或每層大小[這叫作模型的超參數(shù)(hyperparameter),以便與模型參數(shù)(即權(quán)重)區(qū)分開]。這個調(diào)節(jié)過程需要使用模型在驗證數(shù)據(jù)上的性能作為反饋信號。這個調(diào)節(jié)過程本質(zhì)上就是一種學(xué)習(xí):在某個參數(shù)空間中尋找良好的模型配置。
因此,如果基于模型在驗證集上的性能來調(diào)節(jié)模型配置,會很快導(dǎo)致模型在驗證集上過擬合,即使你并沒有在驗證集上直接訓(xùn)練模型也會如此。
造成這一現(xiàn)象的關(guān)鍵在于信息泄露(information leak)。每次基于模型在驗證集上的性能來調(diào)節(jié)模型超參數(shù),都會有一些關(guān)于驗證數(shù)據(jù)的信息泄露到模型中。如果對每個參數(shù)只調(diào)節(jié)一次,那么泄露的信息很少,驗證集仍然可以可靠地評估模型。但如果你多次重復(fù)這一過程(運行一次實驗,在驗證集上評估,然后據(jù)此修改模型),那么將會有越來越多的關(guān)于驗證集的信息泄露到模型中。
?
書中提到的三種驗證方法:
1. 簡單的留出驗證
2.K折驗證
3. 帶有打亂數(shù)據(jù)的重復(fù) K 折驗證
如果可用的數(shù)據(jù)相對較少,而你又需要盡可能精確地評估模型,那么可以選擇帶有打亂數(shù)據(jù)的重復(fù) K 折驗證(iterated K-fold validation with shuffling)。我發(fā)現(xiàn)這種方法在 Kaggle 競賽中
特別有用。具體做法是多次使用 K 折驗證,在每次將數(shù)據(jù)劃分為 K 個分區(qū)之前都先將數(shù)據(jù)打亂。
最終分?jǐn)?shù)是每次 K 折驗證分?jǐn)?shù)的平均值。注意,這種方法一共要訓(xùn)練和評估 P×K 個模型(P
是重復(fù)次數(shù)),計算代價很大。
?
4.2.2 評估模型的注意事項
選擇模型評估方法時,需要注意以下幾點。
數(shù)據(jù)代表性(data representativeness)。你希望訓(xùn)練集和測試集都能夠代表當(dāng)前數(shù)據(jù)。例
如,你想要對數(shù)字圖像進(jìn)行分類,而圖像樣本是按類別排序的,如果你將前 80% 作為訓(xùn)
練集,剩余 20% 作為測試集,那么會導(dǎo)致訓(xùn)練集中只包含類別 0~7,而測試集中只包含
類別 8~9。這個錯誤看起來很可笑,卻很常見。因此,在將數(shù)據(jù)劃分為訓(xùn)練集和測試集
之前,通常應(yīng)該隨機打亂數(shù)據(jù)。
時間箭頭(the arrow of time)。如果想要根據(jù)過去預(yù)測未來(比如明天的天氣、股票走勢
等),那么在劃分?jǐn)?shù)據(jù)前你不應(yīng)該隨機打亂數(shù)據(jù),因為這么做會造成時間泄露(temporal?
leak):你的模型將在未來數(shù)據(jù)上得到有效訓(xùn)練。在這種情況下,你應(yīng)該始終確保測試集
中所有數(shù)據(jù)的時間都晚于訓(xùn)練集數(shù)據(jù)。
數(shù)據(jù)冗余(redundancy in your data)。如果數(shù)據(jù)中的某些數(shù)據(jù)點出現(xiàn)了兩次(這在現(xiàn)實中
的數(shù)據(jù)里十分常見),那么打亂數(shù)據(jù)并劃分成訓(xùn)練集和驗證集會導(dǎo)致訓(xùn)練集和驗證集之
間的數(shù)據(jù)冗余。從效果上來看,你是在部分訓(xùn)練數(shù)據(jù)上評估模型,這是極其糟糕的!一
定要確保訓(xùn)練集和驗證集之間沒有交集。
?
?
4.3.1 神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)預(yù)處理
數(shù)據(jù)預(yù)處理的目的是使原始數(shù)據(jù)更適于用神經(jīng)網(wǎng)絡(luò)處理,包括向量化、標(biāo)準(zhǔn)化、處理缺失值和特征提取。
1. 向量化
神經(jīng)網(wǎng)絡(luò)的所有輸入和目標(biāo)都必須是浮點數(shù)張量(在特定情況下可以是整數(shù)張量)。無論處理什么數(shù)據(jù)(聲音、圖像還是文本),都必須首先將其轉(zhuǎn)換為張量,這一步叫作數(shù)據(jù)向量化(data vectorization)。例如,在前面兩個文本分類的例子中,開始時文本都表示為整數(shù)列表(代表單詞序列),然后我們用 one-hot 編碼將其轉(zhuǎn)換為 float32 格式的張量。在手寫數(shù)字分類和預(yù)
測房價的例子中,數(shù)據(jù)已經(jīng)是向量形式,所以可以跳過這一步。
2. 值標(biāo)準(zhǔn)化
在手寫數(shù)字分類的例子中,開始時圖像數(shù)據(jù)被編碼為 0~255 范圍內(nèi)的整數(shù),表示灰度值。將這一數(shù)據(jù)輸入網(wǎng)絡(luò)之前,你需要將其轉(zhuǎn)換為 float32 格式并除以 255,這樣就得到 0~1 范圍內(nèi)的浮點數(shù)。同樣,預(yù)測房價時,開始時特征有各種不同的取值范圍,有些特征是較小的浮點數(shù),有些特征是相對較大的整數(shù)。將這一數(shù)據(jù)輸入網(wǎng)絡(luò)之前,你需要對每個特征分別做標(biāo)準(zhǔn)化,使
其均值為 0、標(biāo)準(zhǔn)差為 1。
一般來說,將取值相對較大的數(shù)據(jù)(比如多位整數(shù),比網(wǎng)絡(luò)權(quán)重的初始值大很多)或異質(zhì)數(shù)據(jù)(heterogeneous data,比如數(shù)據(jù)的一個特征在 0~1 范圍內(nèi),另一個特征在 100~200 范圍內(nèi))輸入到神經(jīng)網(wǎng)絡(luò)中是不安全的。這么做可能導(dǎo)致較大的梯度更新,進(jìn)而導(dǎo)致網(wǎng)絡(luò)無法收斂。為了讓網(wǎng)絡(luò)的學(xué)習(xí)變得更容易,輸入數(shù)據(jù)應(yīng)該具有以下特征。
?
取值較小:大部分值都應(yīng)該在 0~1 范圍內(nèi)。
同質(zhì)性(homogenous):所有特征的取值都應(yīng)該在大致相同的范圍內(nèi)。
此外,下面這種更嚴(yán)格的標(biāo)準(zhǔn)化方法也很常見,而且很有用,雖然不一定總是必需的(例如,
對于數(shù)字分類問題就不需要這么做)。
將每個特征分別標(biāo)準(zhǔn)化,使其平均值為 0。
將每個特征分別標(biāo)準(zhǔn)化,使其標(biāo)準(zhǔn)差為 1。
這對于 Numpy 數(shù)組很容易實現(xiàn)。
3. 處理缺失值
你的數(shù)據(jù)中有時可能會有缺失值。例如在房價的例子中,第一個特征(數(shù)據(jù)中索引編號為0 的列)是人均犯罪率。
如果不是所有樣本都具有這個特征的話,怎么辦?那樣你的訓(xùn)練數(shù)據(jù)或測試數(shù)據(jù)將會有缺失值。
一般來說,對于神經(jīng)網(wǎng)絡(luò),將缺失值設(shè)置為 0 是安全的,只要 0 不是一個有意義的值。
網(wǎng)絡(luò)能夠從數(shù)據(jù)中學(xué)到 0 意味著缺失數(shù)據(jù),并且會忽略這個值。
注意,如果測試數(shù)據(jù)中可能有缺失值,而網(wǎng)絡(luò)是在沒有缺失值的數(shù)據(jù)上訓(xùn)練的,那么網(wǎng)絡(luò)不可能學(xué)會忽略缺失值。在這種情況下,你應(yīng)該人為生成一些有缺失項的訓(xùn)練樣本:多次復(fù)制一些訓(xùn)練樣本,然后刪除測試數(shù)據(jù)中可能缺失的某些特征。
?
我們來看一個直觀的例子。假設(shè)你想開發(fā)一個模型,輸入一個時鐘圖像,模型能夠輸出對
應(yīng)的時間(見圖 4-3).
深度學(xué)習(xí)出現(xiàn)之前,特征工程曾經(jīng)非常重要,因為經(jīng)典的淺層算法沒有足夠大的假設(shè)空間來自己學(xué)習(xí)有用的表示。
?
幸運的是,對于現(xiàn)代深度學(xué)習(xí),大部分特征工程都是不需要的,因為神經(jīng)網(wǎng)絡(luò)能夠從原始
數(shù)據(jù)中自動提取有用的特征。這是否意味著,只要使用深度神經(jīng)網(wǎng)絡(luò),就無須擔(dān)心特征工程呢?
并不是這樣,原因有兩點。
良好的特征仍然可以讓你用更少的資源更優(yōu)雅地解決問題。例如,使用卷積神經(jīng)網(wǎng)絡(luò)來
讀取鐘面上的時間是非常可笑的。
良好的特征可以讓你用更少的數(shù)據(jù)解決問題。深度學(xué)習(xí)模型自主學(xué)習(xí)特征的能力依賴于
大量的訓(xùn)練數(shù)據(jù)。如果只有很少的樣本,那么特征的信息價值就變得非常重要。
?
?
表 4-1 為模型選擇正確的最后一層激活和損失函數(shù)
| 問題類型 | 最后一層激活 | 損失函數(shù) |
| 二分類問題 | sigmoid | binary_crossentropy |
| 多分類、單標(biāo)簽問題 | softmax | categorical_crossentropy |
| 多分類、多標(biāo)簽問題 | sigmoid | binary_crossentropy |
| 回歸到任意值 | 無 | mse |
| 回歸到 0~1 范圍內(nèi)的值 | sigmoid | mse 或 binary_crossentropy |
稍微補充下sigmoid函數(shù)與softmax函數(shù):
| 激活函數(shù) | Softmax | Sigmoid | |
| 公式 | | ||
| 任務(wù) | 多分類 | 二分類 | |
| 定義域 | 某個一維向量 | 單個數(shù)值 |
另外回顧下機器學(xué)習(xí)方面的知識:
[1]中提到;
Neural networks are somewhat related to logistic regression.
Basically, we can think of logistic regression as a one layer neural network.(邏輯回歸就是單層神經(jīng)網(wǎng)絡(luò))
[2]提到:邏輯回歸就是在線性回歸的基礎(chǔ)上增加了激活函數(shù)
[3]提到:邏輯回歸也可以完成多分類(其實就是神經(jīng)網(wǎng)絡(luò)的最后一層),
自己理解,其實就是輸出層的激活函數(shù)是不變,然后每個激活函數(shù)對應(yīng)的權(quán)重和偏置不一樣,就可以讓各個softmax得到不同的輸出結(jié)果,然后選擇輸出結(jié)果最大的作為類別.
Reference:
[1]https://sebastianraschka.com/faq/docs/logisticregr-neuralnet.html
[2]https://blog.csdn.net/legalhighhigh/article/details/81367638
[3]https://blog.csdn.net/szu_hadooper/article/details/78619001
總結(jié)
以上是生活随笔為你收集整理的第4章-机器学习基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 淘宝上的所有cuda书籍调研
- 下一篇: 基于ChipSmith的逆向(反向)模拟