一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

自然語言處理實戰(zhàn)之卷積神經(jīng)網(wǎng)絡(luò)

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2020-12-08 22:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

為什么在 NLP 分類任務(wù)中選擇 CNN 呢? 它的主要好處是高效率。在許多方面,由于池化層和卷積核大小所造成的限制 (雖然可以將卷積核設(shè)置得更大),會導(dǎo)致丟棄大量的信息,但這并不意味著它們不是有用的模型。大家已經(jīng)看到,利用 CNN 能夠有效地對相對較大的數(shù)據(jù)集進行檢測和預(yù)測情感,即使依賴 Word2vec 詞嵌入,CNN 也可以在不映射整個語言的條件下,通過較少的詞嵌入表示來運行。(本文節(jié)選自《自然語言處理實戰(zhàn)》一書,我們將在文末抽取五位幸運用戶,每人送出一本該書)

語言的真正力量不在于文字本身,而在于文字的間隔、順序以及詞的各種組合。有時候,語言的意義隱藏在文字的背后,蘊含在形成詞的特定組合的意圖和情感中。無論是人類還是機器,理解隱藏在文字背后的意圖,對于同理心強、情商高的傾聽者或自然語言的閱讀者而言,都是一項重要的技能。就像在思想和觀念中,正是詞之間的聯(lián)系創(chuàng)造了語言的深度、信息度和復(fù)雜度。除了理解單個詞的含義,詞之間還有各種各樣巧妙的組合方式,有沒有一些比 n-gram 匹配更靈活的方法,可以用來衡量這些組合詞的意義呢? 我們?nèi)绾螐囊粋€詞序列中得到語義和情感——隱性語義信息,從而利用它來做一些事情呢? 更進一步地說,我們?nèi)绾尾拍軐⑦@種隱藏的語義傳達給冰冷的計算機來生成文本呢?

“機器生成的文本”這個短語甚至讓人聯(lián)想到由空洞的金屬聲音發(fā)出的一個個詞塊。機器也許能讓人明白它表達的意思,但僅此而已。其中缺少的是什么呢? 是交流過程中人們變化的語調(diào)、流利度以及即使是在非常短暫的交談中,人們也期待表露出來的個性特點,這些微妙之處存在于字里行間以及詞的構(gòu)建模式中。人們在交流時,會在他們的文字和演講中蘊含各種語言模式。偉大的作家和演講家會積極運用這些模式來制造非常好的效果。人們天生具有識別這些模式的能力,這種識別甚至是在無意識的狀態(tài)下進行的,而這也正是機器生成的文本聽起來很糟糕的原因,因為它們不具備這些模式。不過大家可以從人類生成的文本中挖掘這些模式,并將其賦給機器。

在過去的幾年里,圍繞神經(jīng)網(wǎng)絡(luò)的研究迅速開展起來,同時出現(xiàn)了大量可用的開源工具,神經(jīng)網(wǎng)絡(luò)在大型數(shù)據(jù)集中發(fā)現(xiàn)模式的能力得到大幅提升,并使 NLP 領(lǐng)域發(fā)生了巨大的轉(zhuǎn)變。感知 機迅速轉(zhuǎn)變?yōu)榍梆伨W(wǎng)絡(luò) (一個多層感知機),并由此衍生出各種變體: 卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò),并發(fā)展出各種應(yīng)用于大型數(shù)據(jù)集上模式挖掘的更為有效和準(zhǔn)確的工具。

正如大家看到的 Word2Vec 那樣,神經(jīng)網(wǎng)絡(luò)給 NLP 領(lǐng)域帶來了一個全新的方法。雖然設(shè)計神經(jīng)網(wǎng)絡(luò)最初的目的是作為一個學(xué)習(xí)量化輸入的機器,這個領(lǐng)域已經(jīng)從只能處理分類、回歸問題 (主題分析、情緒分析) 發(fā)展到能夠基于以前未見過的輸入來生成新文本: 將短語翻譯為另一種語言,對未見過的問題生成回復(fù) (聊天機器人),甚至能夠生成基于特定作者風(fēng)格的新文本。

完全理解神經(jīng)網(wǎng)絡(luò)的數(shù)學(xué)原理對于使用本章介紹的工具并不重要,不過這確實有助于加強我們對神經(jīng)網(wǎng)絡(luò)內(nèi)部如何運作的認識。另外,還可以簡化神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu) (層數(shù)或者神經(jīng)元數(shù)量) 來改進效果,這也有助于大家了解神經(jīng)網(wǎng)絡(luò)如何賦予聊天機器人深度。神經(jīng)網(wǎng)絡(luò)讓聊天機器人成為一個很好的、從表面上看不怎么健談的傾聽者。

7.1 語義理解

詞的性質(zhì)和奧妙與詞之間的關(guān)系密切相關(guān)。這種關(guān)系至少有兩種表達方式。

(1) 詞序——下面兩個句子含義完全不一樣:

The dog chased the cat.
The cat chased the dog.

(2) 詞的鄰近度 (proximity)——下面句子的“shone”指的是句子另一端的“hull”:

The ship's hull, despite years at sea, millions of tons of cargo, and two mid-sea
collisions, shone like new.

這些關(guān)系的模式 (以及詞本身存在的模式) 可以從兩個方面來表示: 空間和時間。兩者的區(qū) 別主要是: 對于前者,要像在書頁上的句子那樣來處理——在文字的位置上尋找關(guān)系 ; 對于后者, 要像說話那樣來處理——詞和字母變成了時間序列數(shù)據(jù)。這兩者是密切相關(guān)的,但是它們標(biāo)志著 神經(jīng)網(wǎng)絡(luò)處理方式的一個關(guān)鍵區(qū)別。空間數(shù)據(jù)通常通過固定寬度的窗口來查看,而時間序列則可 以對于未知的時間無限延展。

基本的前饋網(wǎng)絡(luò) (多層感知機) 能夠從數(shù)據(jù)中提取模式,這些模式來自與權(quán)重相關(guān)的輸入片段, 但它無法捕獲到詞條在空間或時間上的關(guān)系。不過前饋神經(jīng)網(wǎng)絡(luò)只是神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的開端部分,目前,自然語言處理領(lǐng)域中兩個最重要的模型是卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò),以及它們的各種變體。

在圖 7-1 中,對神經(jīng)網(wǎng)絡(luò)輸入層傳入 3 個詞條。每個輸入層神經(jīng)元都與隱藏層神經(jīng)元全連接,并各自具有不同的權(quán)重。

提示:怎樣將詞條傳入網(wǎng)絡(luò)呢? 本章使用的兩種主要方法是前面章節(jié)中使用的獨熱編碼和詞向 量。大家可以對輸入進行獨熱編碼——在向量中我們考慮的所有可能的詞位置上都標(biāo)記為 0,對正在編碼的詞的位置標(biāo)記為 1。或者,也可以使用第 6 章中訓(xùn)練好的詞向量??傊?,需要將詞表示為數(shù)字以便進行數(shù)學(xué)運算。

圖 7-1 全連接神經(jīng)網(wǎng)絡(luò)

如果將這些詞條的順序從“See Jim run”改為“run See Jim”并將其傳入網(wǎng)絡(luò)中,不出所料, 會得到一個不同的結(jié)果。因此請記住,每個輸入位置與每個隱藏層神經(jīng)元都有一個特定的對應(yīng)權(quán) 重 (x1 與 w1 相連,x2 與 w2 相連,以此類推)。

因為詞條同時出現(xiàn)在一個樣本中的不同位置,所以前饋網(wǎng)絡(luò)可以學(xué)習(xí)詞條之間的一些特定關(guān)系,但是大家可以很容易看出,對于 5 個、10 個或 50 個詞條的長句子 (每個位置上都包含所有 可能的詞對、三元組等),這會成為一個棘手的問題。幸運的是,我們還有其他可選方案。

7.2 工具包

Python 是神經(jīng)網(wǎng)絡(luò)工具包最豐富的語言之一。雖然很多主要的參與者 (如谷歌和 Facebook) 已經(jīng)轉(zhuǎn)移到較低級別的語言以便于密集計算的實現(xiàn),不過依然留下了用 Python 在早期模型上投 入大量資源進行開發(fā)的痕記。兩個主要的神經(jīng)網(wǎng)絡(luò)架構(gòu)分別是 Theano 和 TensorFlow。這兩者的 底層計算深度依賴 C 語言,不過它們都提供了強大的 Python API。Facebook 基于 Lua 語言開發(fā) 了 Torch,它在 Python 里面也有一個對應(yīng)的 API 是 PyTorch。這些框架都是高度抽象的工具集, 適用于從頭構(gòu)建模型。Python 社區(qū)開發(fā)了一些第三方庫來簡化這些底層架構(gòu)的使用。Lasagne(Theano) 和 Skflow(TensorFlow) 很受歡迎,我們選擇使用 Keras,它在 API 的友好性和功能性 方面比較均衡。Keras 可以使用 TensorFlow 或 Theano 作為后端,這兩者各有利弊,我們將使用 TensorFlow 后端來做演示,另外我們還需要 h5py 包來保存已訓(xùn)練模型的內(nèi)部狀態(tài)。

Keras 默認以 TensorFlow 作為后端,運行時第一行輸出就會提醒大家目前使用的是哪個后端。大家可以通過在環(huán)境變量或腳本中修改配置文件來更換后端。Keras 的說明文檔非常清晰完整,我們強 烈建議大家在上面多花點兒時間。不過我們在這里也提供一個快速概述:Sequential() 是一個神經(jīng)網(wǎng)絡(luò)的抽象類,用于訪問 Keras 的基本 API,compile 方法主要用于構(gòu)建底層權(quán)重及它們之間的 相互關(guān)系,而 fit 方法計算訓(xùn)練過程中產(chǎn)生的誤差并實施最重要的應(yīng)用反向傳播過程。epochs、 batch_size 和 optimizer 是需要調(diào)優(yōu)的超參數(shù),從某種意義上來說,調(diào)參也是一門藝術(shù)。

遺憾的是,對于神經(jīng)網(wǎng)絡(luò)的設(shè)計和調(diào)優(yōu),沒有一個放之四海而皆準(zhǔn)的方法。對于特定的應(yīng)用應(yīng)選擇哪種適合的框架,需要大家根據(jù)自己的經(jīng)驗和直覺來判斷。不過如果能找到和當(dāng)前的應(yīng)用 相似的實現(xiàn)案例,那么完全可以使用這個框架并對實現(xiàn)進行調(diào)整來滿足大家的需求。神經(jīng)網(wǎng)絡(luò)框 架或者所有這些花哨的東西并沒有什么可怕的?,F(xiàn)在我們把話題轉(zhuǎn)回到基于圖像處理的自然語言 處理。為什么還有圖像? 稍微耐心學(xué)習(xí)一下就會明白了。

7.3 卷積神經(jīng)網(wǎng)絡(luò)

卷積神經(jīng)網(wǎng)絡(luò) (convolutional neural net,CNN) 得名于在數(shù)據(jù)樣本上用滑動窗口 (或卷積) 的概念。

卷積在數(shù)學(xué)中應(yīng)用很廣泛,通常與時間序列數(shù)據(jù)相關(guān)。在本章中,可以不用關(guān)注其中的高階概念,只需要知道它是用一個可視化盒子在一個區(qū)域內(nèi)滑動 (如圖 7-2 所示)。大家將從圖像上的滑動窗口概念入手,然后擴展到文本上的滑動窗口。總體來說,就是在較大的數(shù)據(jù)塊上設(shè)置一個滑動窗口,每次滑動時只能看到窗口范圍內(nèi)的數(shù)據(jù)。

圖 7-2 卷積窗口函數(shù)

7.3.1 構(gòu)建塊

卷積神經(jīng)網(wǎng)絡(luò)最早出現(xiàn)在圖像處理和圖像識別領(lǐng)域,它能夠捕捉每個樣本中數(shù)據(jù)點之間的空間關(guān)系,也就能識別出圖像中的是貓還是狗在駕駛推土機。

卷積網(wǎng)絡(luò) (convolutional net),也稱為 convnet(這個多出來的 n 很難發(fā)音), 不像傳統(tǒng)的前饋網(wǎng)絡(luò)那樣對每個元素 (圖像中的每個像素) 分配權(quán)重,而是定義了一組在圖像上移動的過濾器 (filter,也稱為卷積核、濾波器或者特征檢測器)。這就是卷積!

在圖像識別中,每個數(shù)據(jù)點的元素可以是黑白圖像中的每個像素點,取值是 1(on) 或 0(off)。

圖 7-3 電線桿圖像

也可以是灰度圖像中每個像素的強度 (如圖 7-3 和圖 7-4 所示),或者彩色圖像中每個像素的每個顏色通道的強度。

圖 7-4 電線桿圖像的像素值

卷積核會在輸入樣本中 (在這個例子中,就是圖像的像素值) 進行卷積或滑動。我們先暫 停一下,講講滑動是什么意思。在窗口“移動”的時候我們不會做任何事情,大家可以把它看作是一系列的快照,數(shù)據(jù)通過這個窗口的時候,會做一些處理,窗口向下滑動一點,就再做一 次處理。

提示:正是這個滑動 / 快照使卷積神經(jīng)網(wǎng)絡(luò)具有高度的并行性。對給定數(shù)據(jù)樣本的每個快照都可以獨 立于其他數(shù)據(jù)樣本進行計算,后面的快照也不需要等待上一個快照。

我們談?wù)摰倪@些卷積核有多大呢? 卷積核窗口大小的參數(shù)由模型構(gòu)建器選擇,并且高度依賴數(shù)據(jù)內(nèi)容。不過其中還是有一些共性的。在圖像數(shù)據(jù)中,大家通常會看到窗口大小為 3 × 3(3, 3) 像素。在本章后面回到 NLP 上時我們會更詳細地講解窗口大小的選擇。

7.3.2 步長

注意,在滑動階段,移動的距離是一個參數(shù),一般不會超過卷積核寬度,每個快照通常都與相鄰快照有重疊的部分。

每個卷積“走”的距離稱為步長,通常設(shè)置為 1。只移動一個像素 (或其他小于卷積核寬度 的距離) 將使進入卷積核的不同輸入在一個位置和下一個位置之間出現(xiàn)重疊。如果由于步長太大 而使卷積核之間沒有重疊,就會失去像素 (在 NLP 中是詞條) 與相鄰像素之間的“模糊”效果。

這種重疊有一些有趣的特性,特別是在查看卷積核如何隨時間變化的時候,這些特性非常明顯。

7.3.3 卷積核的組成

到目前為止,我們已經(jīng)描述了數(shù)據(jù)上的滑動窗口,以及通過這個窗口來觀察數(shù)據(jù),但還沒有介紹如何處理觀察到的數(shù)據(jù)。

卷積核由兩部分組成:

  • 一組權(quán)重 (就像第 5 章中給神經(jīng)元分配的權(quán)重);
  • 一個激活函數(shù)。

如前所述,卷積核通常是 3 × 3(也有其他大小和形狀)。

提示:卷積核神經(jīng)元與普通的隱藏層神經(jīng)元十分相似,但是在掃描輸入樣本的整個過程中,每個卷 積核的權(quán)重是固定的,在整個圖像中所有卷積核的權(quán)重都一樣。卷積神經(jīng)網(wǎng)絡(luò)中的每個卷積核都是 獨一無二的,但是在圖像快照中每個卷積核的元素都是固定的。

當(dāng)卷積核在圖像上滑動時,每次前進一個步長,得到當(dāng)前覆蓋像素的快照,然后將這些像素 的值與卷積核中對應(yīng)位置的權(quán)重相乘。

假設(shè)大家用的是 3 × 3 卷積核,從左上角開始,第一個像素 (0, 0) 乘以卷積核第一個位置 (0, 0) 上的權(quán)重,第二個像素 (0, 1) 乘以位置 (0, 1) 上的權(quán)重,以此類推。

然后對像素和權(quán)重 (對應(yīng)位置) 的乘積求和,并傳遞到激活函數(shù)中 (如圖 7-5 所示),通常選擇 ReLU 函數(shù) (線性修正單元)——我們待會再討論這個問題。

在圖 7-5 和圖 7-6 中,xi 是位置 i 上的像素值,z0 是 ReLU 激活函數(shù)的輸出 z_0 = max(sum(x * w), 0) 或 z0 = max(xi × wj)), 0)。該激活函數(shù)的輸出將被記錄在輸出圖像中的一個位置上。卷積核 滑動一個步長,處理下一個快照,并將輸出值放在上一個輸出值的旁邊 (如圖 7-6 所示)。

在一個層中有多個這樣的卷積核,當(dāng)它們在整個圖像上進行卷積時,會各自創(chuàng)建一個新的“圖像”——一個被“過濾”后的圖像。假設(shè)有 n 個卷積核,在經(jīng)過這個處理之后,將得到 n 個經(jīng)過 過濾的新圖像。

我們一會兒再來看看對這 n 個新圖像的處理。

圖 7-5 卷積神經(jīng)網(wǎng)絡(luò)步驟

圖 7-6 卷積

7.3.4 填充

然而,在圖像的邊緣會發(fā)生一些有趣的事情。如果大家從輸入圖像的左上角開始一個 3 × 3 的卷積核,每次移動一個像素,當(dāng)卷積核的最右側(cè)邊緣到達輸入圖像的最右側(cè)邊緣時停止,那么 輸出的“圖像”將比原圖像窄兩個像素。

Keras 提供了處理這個問題的工具。第一個策略是忽略輸出維度變小的問題。在 Keras 中,可以設(shè)置參數(shù) padding = 'valid'。使用這種方法時,需要注意下一層輸入的維度。這種策 略的缺點是重疊位置上的內(nèi)部數(shù)據(jù)點被多次傳遞到每個卷積核上,原始輸入的邊緣數(shù)據(jù)將被欠采 樣。在比較大的圖像上,這可能不是問題,但是如果把這個概念應(yīng)用到 Twitter 數(shù)據(jù)上,例如, 在一個 10 個單詞的數(shù)據(jù)集上進行欠采樣,則可能會極大地改變輸出結(jié)果。

另一個策略稱為填充 (padding),即向輸入數(shù)據(jù)的外部邊緣添加足夠多的數(shù)據(jù),使邊緣上的第一個數(shù)據(jù)點可以被視為內(nèi)部數(shù)據(jù)點進行處理。這種策略的缺點是向輸入數(shù)據(jù)中添加了可能不相 關(guān)的內(nèi)容,導(dǎo)致偏離了輸出結(jié)果。大家不需要專門去尋找生成虛假數(shù)據(jù)的模式,可以用幾種不同 的方法進行填充以盡量減少不良影響。具體做法參見代碼清單 7-1。

代碼清單 7-1 Keras 中一個卷積層的神經(jīng)網(wǎng)絡(luò)

稍后將詳細介紹實現(xiàn)細節(jié)。需要對這些數(shù)據(jù)位多加注意,大家使用的工具中已經(jīng)對這些問題進行了很好的處理。

還有一些策略,例如在預(yù)處理過程中通過模擬已存在的邊緣數(shù)據(jù)點來預(yù)測要填充位置上的值。不過這種策略危險性較大,NLP 應(yīng)用中一般不會使用。

卷積流水線

現(xiàn)在有 n 個卷積核和 n 個新圖像,接下來怎么處理呢? 和大多數(shù)神經(jīng)網(wǎng)絡(luò)應(yīng)用一樣,我們從一個已標(biāo)注的數(shù)據(jù)集開始,任務(wù)目標(biāo)也類似: 預(yù)測一個給定新圖像的標(biāo)簽。最簡單的方法是將每 個過濾后的圖像串起來并輸入到前饋層。

提示:大家可以將這些經(jīng)過過濾的圖像傳遞到第二個卷積層,它也有一組卷積核。在實踐中,這是最常見的架構(gòu),稍后我們會再詳細介紹。多層卷積網(wǎng)絡(luò)對抽象層的學(xué)習(xí)路徑一般是: 首先是邊緣, 然后是形狀 / 顏色,最后是含義。

不管大家在網(wǎng)絡(luò)中添加了多少層 (卷積層或其他層),一旦得到一個最終輸出,就可以計算出誤差并通過網(wǎng)絡(luò)進行反向傳播該誤差。

因為激活函數(shù)是可微的,所以可以像之前一樣反向傳播并更新各個卷積核的權(quán)重。然后網(wǎng)絡(luò)會學(xué)習(xí)到需要什么樣的卷積核才能為給定的輸入獲得正確的輸出。

大家可以將此過程視為神經(jīng)網(wǎng)絡(luò)在學(xué)習(xí)檢測和提取信息,以便讓后面的層能更容易地進行處理。

7.3.5 學(xué)習(xí)

就像所有神經(jīng)網(wǎng)絡(luò)一樣,卷積核本身會以初始化為接近零的隨機值的權(quán)重開始。那么輸出的“圖像”怎樣才不會是噪聲呢? 在最初的幾輪迭代訓(xùn)練中,它確實只是噪聲。

但是大家構(gòu)建的分類器會根據(jù)各個輸入數(shù)據(jù),從期望標(biāo)簽中獲得一定的誤差值,并通過激活函數(shù)將輸入數(shù)據(jù)反向傳播給卷積核。對于誤差值的反向傳播,我們還需要計算誤差對輸入權(quán)重的導(dǎo)數(shù)。

當(dāng)卷積層剛出現(xiàn)時,它用的是上層梯度對輸入權(quán)重的導(dǎo)數(shù)。這個計算和正常的反向傳播類似,對于給定訓(xùn)練樣本,卷積核權(quán)重會在多個位置上輸出對應(yīng)的結(jié)果。
梯度對卷積核權(quán)重的導(dǎo)數(shù)的具體計算超出了本書的范圍,不過可以簡單介紹一下,對于一個給定卷積核的權(quán)重,梯度是前向傳播過程中卷積的每個位置上梯度的和。這是一個相當(dāng)復(fù)雜的公式,兩個求和及多個疊加式如下:

公式 7-1 卷積核權(quán)值的梯度之和

這一概念與常規(guī)的前饋網(wǎng)絡(luò)基本相同,即計算出每個特定權(quán)重對系統(tǒng)總體誤差的貢獻,然后再來決定如何更好地調(diào)整權(quán)重,使其能夠在后面的訓(xùn)練樣本上盡量減小誤差。這些細節(jié)對于理解卷積神經(jīng)網(wǎng)絡(luò)在自然語言處理中的應(yīng)用并不是特別重要,但還是希望大家對如何調(diào)整神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)有直觀的認識,在本書后面的內(nèi)容中會構(gòu)建這些示例。

小結(jié)

  • 卷積是在一個大的數(shù)據(jù)集上滑動窗口 (使關(guān)注點保持在整體的一個子集上)。
  • 神經(jīng)網(wǎng)絡(luò)可以像處理圖像一樣處理文本并“理解”它們。
  • 用 dropout 來阻礙學(xué)習(xí)過程實際上是有幫助的。
  • 情感不僅存在于詞中,還存在于使用的語言模式中。
  • 神經(jīng)網(wǎng)絡(luò)有很多可調(diào)參數(shù)。

附:機器學(xué)習(xí)常見工具與技術(shù)

許多自然語言處理都涉及機器學(xué)習(xí),所以理解機器學(xué)習(xí)的一些基本工具和技術(shù)是有益處的。有些工具已經(jīng)討論過,有些還沒有,但這里我們會討論所有這些工具。

D.1 數(shù)據(jù)選擇和避免偏見

數(shù)據(jù)選擇和特征工程會帶來偏見的風(fēng)險 (用人類的話來說)。一旦我們把自己的偏見融入算法中,通過選擇一組特定的特征,模型就會適應(yīng)這些偏見并產(chǎn)生帶有偏差的結(jié)果。如果我們足夠幸運能在投入生產(chǎn)之前發(fā)現(xiàn)這種偏見,那么也需要投入大量的工作來消除這種偏見。例如,必須重新構(gòu)建和重新訓(xùn)練整個流水線,以便能夠充分利用分詞器的新詞匯表。我們必須重新開始。

一個例子是著名的 Word2vec 模型的數(shù)據(jù)和特征選擇。Word2vec 是針對大量的新聞報道進行訓(xùn)練的,從這個語料庫中選擇了大約 100 萬個 n-gram 作為這個模型的詞匯表 (特征)。它產(chǎn)生了一個使數(shù)據(jù)科學(xué)家和語言學(xué)家興奮的模型,后者能夠?qū)υ~向量 (如“king ? man + woman = queen”) 進行數(shù)學(xué)運算。但隨著研究的深入,在模型中也出現(xiàn)了更多有問題的關(guān)系。

例如,對于“醫(yī)生 ? 父親 + 母親 = 護士”這個表達式,“護士”的答案并不是人們希望的無偏見和合乎邏輯的結(jié)果。性別偏見在不經(jīng)意間被訓(xùn)練到模型中。類似的種族、宗教甚至地理區(qū)域偏見在原始的 Word2vec 模型中普遍存在。谷歌公司的研究人員無意制造這些偏見,偏見存在于數(shù)據(jù)中,即他們訓(xùn)練 Word2vec 使用的谷歌新聞?wù)Z料庫中詞使用統(tǒng)計的數(shù)據(jù)。

許多新聞報道只是帶有文化偏見,因為它們是由記者撰寫的,目的是讓讀者開心。這些記者描寫的是一個存在制度偏見和現(xiàn)實生活中人們對待事件的偏見的世界。谷歌新聞中的詞使用統(tǒng)計數(shù)據(jù)僅僅反映的是,在母親當(dāng)中當(dāng)護士的數(shù)目要比當(dāng)醫(yī)生的多得多,同時在父親當(dāng)中當(dāng)醫(yī) 生的數(shù)目比當(dāng)護士的多得多。Word2vec 模型只是為我們提供了一個窗口,讓我們了解我們創(chuàng)建的世界。

幸運的是,像 Word2vec 這樣的模型不需要標(biāo)記訓(xùn)練數(shù)據(jù)。因此,我們可以自由選擇任何喜歡的文本來訓(xùn)練模型。我們可以選擇一個更平衡的、更能代表大家希望模型做出的信念和推理的數(shù)據(jù)集。當(dāng)其他人躲在算法背后說他們只是按照模型做事時,我們可以與他們分享自己的數(shù)據(jù)集,這些數(shù)據(jù)集更公平地代表了一個社會,在這個社會里,我們渴望為每個人提供平等的機會。

當(dāng)訓(xùn)練和測試模型時,大家可以依靠自己天生的公正感來幫助決定一個模型何時可以做出影響用戶生活的預(yù)測。如果得到的模型以我們希望的方式對待所有用戶,那么我們可以在晚上睡個好覺。它還可以幫助密切關(guān)注那些與大家不同的用戶的需求,特別是那些通常處于社會不利地位的用戶。如果需要更正式的理由來證明自己的行為,大家還可以學(xué)習(xí)更多關(guān)于統(tǒng)計學(xué)、哲學(xué)、倫理學(xué)、心理學(xué)、行為經(jīng)濟學(xué)和人類學(xué)的知識,來增強大家在本書中學(xué)到的計算機科學(xué)技能。

作為一名自然語言處理實踐者和機器學(xué)習(xí)工程師,大家有機會訓(xùn)練出比人類做得更好的機器。老板和同事不會告訴大家應(yīng)該在訓(xùn)練集中添加或刪除哪些文本,大家自己有能力影響塑造整體社區(qū)和社會的機器的行為。

我們已經(jīng)為大家提供了一些關(guān)于如何組裝一個帶有更少偏見和更公平的數(shù)據(jù)集的想法?,F(xiàn)在,我們將展示如何使得到的模型與無偏見數(shù)據(jù)相擬合,以便它們在現(xiàn)實世界中精確和有用。

D.2 模型擬合程度

對于所有機器學(xué)習(xí)模型,一個主要的挑戰(zhàn)是克服模型過度優(yōu)異的表現(xiàn)。什么是“過度優(yōu)異” 呢? 在處理所有模型中的樣本數(shù)據(jù)時,給定的算法都可以很好地在給定數(shù)據(jù)集中找到模式。但是考慮到我們已經(jīng)知道訓(xùn)練集中所有給定樣本的標(biāo)簽 (如果不知道其標(biāo)簽表明它不在訓(xùn)練集中), 因此算法在訓(xùn)練樣本的上述預(yù)測結(jié)果不會特別有用。我們真正的目的是利用這些訓(xùn)練樣本來構(gòu)建一個有泛化能力的模型,能夠為一個新樣本打上正確標(biāo)簽。盡管該樣本與訓(xùn)練集的樣本類似,但是它是訓(xùn)練集以外的樣本。在訓(xùn)練集之外新樣本上的預(yù)測性能就是我們想優(yōu)化的目標(biāo)。

我們稱能夠完美描述 (并預(yù)測) 訓(xùn)練樣本的模型“過擬合”(overfit)(如圖 D-1 所示)。這樣的模型將很難或沒有能力描述新數(shù)據(jù)。它不是一個通用的模型,當(dāng)給出一個不在訓(xùn)練集中的樣本時,很難相信它會做得很好。

圖 D-1 訓(xùn)練樣本上的過擬合現(xiàn)象

相反,如果我們的模型在訓(xùn)練樣本上做出了許多錯誤的預(yù)測,并且在新樣本上也做得很差,則稱它“欠擬合”(underfit)(如圖 D-2 所示)。在現(xiàn)實世界中,這兩種模型都對預(yù)測作用不大。因此,下面看看哪些技術(shù)能夠檢測出上述兩種擬合問題,更重要的是,我們還會給出一些避免上述問題的方法。

圖 D-2 訓(xùn)練樣本上的欠擬合現(xiàn)象

D.3 數(shù)據(jù)集劃分

在機器學(xué)習(xí)實踐中,如果數(shù)據(jù)是黃金,那么標(biāo)注數(shù)據(jù)就是 raritanium(某游戲里的一種珍貴 資源)。我們的第一直覺可能是獲取帶標(biāo)注數(shù)據(jù)并把它們?nèi)總鬟f給模型。更多的訓(xùn)練數(shù)據(jù)會產(chǎn)生更有彈性的模型,對吧? 但這使我們沒有辦法測試這個模型,只能心中希望它在現(xiàn)實世界中能產(chǎn)生好的結(jié)果。這顯然是不切實際的。解決方案是將帶標(biāo)注的數(shù)據(jù)拆分為兩個數(shù)據(jù)集,有時是 3 個數(shù)據(jù)集: 一個訓(xùn)練集、一個驗證集,在某些情況下還有一個測試集。

訓(xùn)練集是顯而易見的。在一輪訓(xùn)練中,驗證集是我們保留的對模型隱藏的一小部分帶標(biāo)注數(shù)據(jù)。在驗證集上獲得良好性能是驗證經(jīng)過訓(xùn)練的模型在訓(xùn)練集之外的新數(shù)據(jù)上表現(xiàn)良好的第一步。大家經(jīng)常會看到將一個給定的標(biāo)注數(shù)據(jù)集按照訓(xùn)練與驗證比 80%/20% 或 70%/30% 進行劃分。測試集類似于驗證集,也是帶標(biāo)注訓(xùn)練數(shù)據(jù)的子集,用于測試模型并度量性能。但是這個測試集與驗證集有什么不同呢? 在組成上,它們其實沒有任何不同,區(qū)別在于使用它們的方法。

在訓(xùn)練集上對模型進行訓(xùn)練時,會有若干次迭代,迭代過程中會有不同的超參數(shù)。我們選擇的最終模型將是在驗證集上執(zhí)行得最好的模型。但是這里有一個問題,我們?nèi)绾沃雷约簺]有 優(yōu)化一個僅僅是高度擬合驗證集的模型? 我們沒有辦法驗證該模型在其他數(shù)據(jù)上的性能是否 良好。這就是我們的老板或論文的讀者最感興趣的地方——該模型在他們的數(shù)據(jù)上的效果到底 如何?

因此,如果有足夠的數(shù)據(jù),需要將標(biāo)注數(shù)據(jù)集的第三部分作為測試集。這將使我們的讀者 (或老板) 更有信心,確信模型在訓(xùn)練和調(diào)優(yōu)過程中在從未看到的數(shù)據(jù)上也可以獲得很好的效果。一旦根據(jù)驗證集性能選擇了經(jīng)過訓(xùn)練的模型,并且不再訓(xùn)練或調(diào)整模型,那么就可以對測試集中的每個樣本進行預(yù)測 (推理)。假如模型在第三部分數(shù)據(jù)上表現(xiàn)良好,那么它就有不錯的泛化性。為了得到這種具有高可信度的模型驗證,大家經(jīng)常會看到數(shù)據(jù)集按照 60%/20%/20% 的訓(xùn)練 / 驗證 / 測試比進行劃分的情形。

提示:在對數(shù)據(jù)集進行訓(xùn)練集、驗證集和測試集的劃分之前,對數(shù)據(jù)集進行重新排序是非常重要的。我們希望每個數(shù)據(jù)子集都是能代表“真實世界”的樣本,并且它們需要與期望看到的每個標(biāo)簽的比大致相同。如果訓(xùn)練集有 25% 的正向樣本和 75% 的負向樣本,那么同樣也希望測試集和驗證集也有 25% 的正向樣本和 75% 的負向樣本。如果原始數(shù)據(jù)集的前面都是負向樣本,并且在將數(shù)據(jù)集劃分為 50%/50% 比的訓(xùn)練集 / 測試集前沒有打亂數(shù)據(jù),那么在訓(xùn)練集中將得到 100% 的負向樣本,而在測試集中將得到 50% 的負向樣本。這種情況下,模型永遠不能從數(shù)據(jù)集中的正向樣本中學(xué)習(xí)。

D.4 交叉擬合訓(xùn)練

另一個劃分訓(xùn)練集 / 測試集的方法是交叉驗證或者 k 折交叉驗證 (如圖 D-3 所示)。交叉驗證背后的概念和我們剛討論過的數(shù)據(jù)劃分非常相似,但是它允許使用所有的帶標(biāo)記數(shù)據(jù)集進行訓(xùn)練。這個過程將訓(xùn)練集劃分為 k 等分,或者說 k 折。然后通過將 k ? 1 份數(shù)據(jù)作為訓(xùn)練集訓(xùn)練模 型并在第 k 份數(shù)據(jù)上進行驗證。之后將第一次嘗試中用作訓(xùn)練的 k ? 1 份數(shù)據(jù)中的一份數(shù)據(jù)作為驗證集,剩下的 k ? 1 份數(shù)據(jù)成為新訓(xùn)練集,進行重新訓(xùn)練。

圖 D-3 k 折交叉驗證

該技術(shù)對于分析模型的結(jié)構(gòu)和尋找對各個驗證數(shù)據(jù)性能表現(xiàn)良好的超參數(shù)具有重要價值。一旦選擇了超參數(shù),還需要選擇表現(xiàn)最好的經(jīng)過訓(xùn)練的模型,因此很容易受到上一節(jié)所表述的偏見的影響,因此,在此過程中仍然建議保留一份測試集。

這種方法還提供了關(guān)于模型可靠性的一些新信息。我們可以計算一個 P 值,表示模型發(fā)現(xiàn)的輸入特征和輸出預(yù)測之間的關(guān)系的可能性在統(tǒng)計上是顯著的,而不是隨機選擇的結(jié)果。如果訓(xùn)練集確實是真實世界的代表性樣本,那么這將是一個非常重要的新信息。

這種對模型有額外信心的代價是,需要 k 倍的訓(xùn)練時間來進行 k 折的交叉驗證。所以,如果 想要得到關(guān)于問題的 90% 的答案,通??梢院唵蔚刈?1 折交叉驗證。這個驗證方法與我們之前做的訓(xùn)練集 / 驗證集劃分方法完全相同。我們不會對模型這個對真實世界的動態(tài)描述的可靠性有 100% 的信心,但是如果它在測試集中表現(xiàn)良好,也可以非常自信地認為它是預(yù)測目標(biāo)變量的有用模型。所以通過這種實用方法得到的機器學(xué)習(xí)模型對大多數(shù)商業(yè)應(yīng)用來說都是有意義的。

D.5 抑制模型

在 model.fit() 中,梯度下降過分熱衷于追求降低模型中可能出現(xiàn)的誤差。這可能導(dǎo)致過擬合,即學(xué)到的模型在訓(xùn)練集上效果很好,但是在新的未見樣本集 (測試集) 上卻效果很差。因此,我們可能希望“保留”對模型的控制。以下是 3 種方法:

  • 正則化 ;
  • 隨機 dropout;
  • 批歸一化。

D.5.1 正則化

在所有機器學(xué)習(xí)模型中,最終都會出現(xiàn)過擬合。幸運的是,有幾種工具可以解決這個問題。第一個是正則化,它是對每個訓(xùn)練步驟的學(xué)習(xí)參數(shù)的懲罰。它通常但不總是參數(shù)本身的一個因子。其中,L1 范數(shù)和 L2 范數(shù)是最常見的做法。

L1 正則化:

L1 是所有參數(shù) (權(quán)重) 的絕對值與某個 λ(超參數(shù)) 乘積的和,通常是 0 到 1 之間的一個小浮點數(shù)。這個和應(yīng)用于權(quán)重的更新——其思想是,較大的權(quán)重會產(chǎn)生較大的懲罰,因此鼓勵模型 使用更多的、均勻的權(quán)重......

L2 正則化:

類似地,L2 是一種權(quán)重懲罰,但定義略有不同。這種情況下,它是權(quán)重的平方與某個 λ 乘 積的和,這個 λ 值是一個要在訓(xùn)練前選擇的單獨超參數(shù)。

D.5.2 dropout

在神經(jīng)網(wǎng)絡(luò)中,dropout 是另一個解決過擬合的辦法——乍一看似乎很神奇。dropout 的概念是,在神經(jīng)網(wǎng)絡(luò)的任何一層,我們都會在訓(xùn)練的時候,按一定比例關(guān)閉通過這一層的信號。注意,這只發(fā)生在訓(xùn)練期間,而不是推理期間。在所有訓(xùn)練過程中,網(wǎng)絡(luò)層中一部分神經(jīng)元子集都會被 “忽略”,這些輸出值被顯式地設(shè)置為零。因為它們對預(yù)測結(jié)果沒有輸入,所以在反向傳播步驟中不會進行權(quán)重更新。在下一個訓(xùn)練步驟中,將選擇層中不同權(quán)重的子集,并將其他權(quán)重歸零。

一個在任何時間都有 20% 處于關(guān)閉狀態(tài)的大腦的網(wǎng)絡(luò)該如何學(xué)習(xí)呢? 其思想是,沒有一個特 定的權(quán)重路徑可以完全定義數(shù)據(jù)的特定屬性。該模型必須泛化其內(nèi)部結(jié)構(gòu),以便該模型通過神經(jīng)元的多條路徑都能夠處理數(shù)據(jù)。

被關(guān)閉的信號的百分比被定義為超參數(shù),因為它是一個介于 0 和 1 之間的浮點數(shù)。在實踐中,從 0.1 到 0.5 的 dropout 通常是最優(yōu)的,當(dāng)然,這是依賴模型的。在推理過程中,dropout 會被忽 略,從而充分利用訓(xùn)練后的權(quán)值對新數(shù)據(jù)進行處理。

Keras 提供了一種非常簡單的實現(xiàn)方法,可以在本書的示例和代碼清單 D-1 中看到。

D.5.3 批歸一化

神經(jīng)網(wǎng)絡(luò)中一個稱為批歸一化的新概念可以幫助對模型進行標(biāo)準(zhǔn)化和泛化。批歸一化的思想 是,與輸入數(shù)據(jù)非常相似,每個網(wǎng)絡(luò)層的輸出應(yīng)該歸一化為 0 到 1 之間的值。關(guān)于如何、為什么、 什么時候這樣做是有益的,以及在什么條件下應(yīng)該使用它,仍然存在一些爭議。我們希望大家自 己去對這個研究方向進行探索。

但是 Keras 的 BatchNormalization 層提供了一個簡單的實現(xiàn)方法,如代碼清單 D-2 所示。

D.6 非均衡訓(xùn)練集

機器學(xué)習(xí)模型的好壞取決于提供給它們的數(shù)據(jù)。只有當(dāng)樣本中涵蓋了希望在預(yù)測階段的所有 情況時,擁有大量的數(shù)據(jù)才有幫助,并且數(shù)據(jù)集涵蓋每種情況僅僅一次是不夠的。想象一下我們 正試圖預(yù)測一副圖像到底是一只狗還是一只貓。這時我們手里有一個訓(xùn)練集,里面包含 20 000 張貓的照片,但是狗的照片只有 200 張。如果要在這個數(shù)據(jù)集中訓(xùn)練一個模型,那么這個模型很 可能只是簡單地學(xué)會將任何給定的圖像都預(yù)測為一只貓,而不管輸入是什么。從模型的角度來說, 這個結(jié)果還可以接受,對不對? 我的意思是,對 99% 的訓(xùn)練樣本的預(yù)測結(jié)果都是正確的。當(dāng)然, 這個觀點實際完全站不住腳,這個模型毫無價值。但是,完全超出了特定模型的范圍之外,造成 這種失敗的最可能原因是非均衡訓(xùn)練集。

模型可能會非常關(guān)注訓(xùn)練集,其原因很簡單,來自標(biāo)記數(shù)據(jù)中過采樣類的信號會壓倒來自欠 采樣類的信號。權(quán)重將更經(jīng)常地由主類信號的誤差進行更新,而來自小類的信號將被忽視。獲得 每個類的絕對均勻表示并不重要,因為模型自己能夠克服一些噪聲。這里的目標(biāo)只是讓類的比例 達到均衡水平。

與任何機器學(xué)習(xí)任務(wù)一樣,第一步是長時間、仔細地查看數(shù)據(jù),了解一些細節(jié),并對數(shù)據(jù)實 際表示的內(nèi)容進行一些粗略的統(tǒng)計。不僅要知道有多少數(shù)據(jù),還要知道有多少種類的數(shù)據(jù)。

那么,如果事情從一開始就沒有特別之處,大家會怎么做呢? 如果目標(biāo)是使類的表示均勻 (確 實如此),則有 3 個主要方法可供選擇: 過采樣、欠采樣和數(shù)據(jù)增強。

D.6.1 過采樣

過采樣是一種重復(fù)采樣來自一個或多個欠表示類的樣本的技術(shù)。我們以先前的狗 / 貓分類示 例為例 (只有 200 只狗,有 20 000 只貓)。我們可以簡單地重復(fù) 100 次已有的 200 張狗的圖像, 最終得到 40 000 個樣本,其中一半是狗,一半是貓。

這是一個極端的例子,因此會導(dǎo)致自身固有的問題。這個網(wǎng)絡(luò)很可能會很好地識別出這 200 只特定的狗,而不能很好地推廣到其他不在訓(xùn)練集中的狗。但是,在不那么極端不平衡的情況下, 過采樣技術(shù)肯定有助于平衡訓(xùn)練集。

D.6.2 欠采樣

欠采樣是同一枚硬幣的反面。在這里,就是從過度表示的類中刪除部分樣本。在上面的貓 / 狗示例中,我們將隨機刪除 19 800 張貓的圖片,這樣就會剩下 400 個樣本,其中一半是狗,一 半是貓。當(dāng)然,這樣做本身也有一個突出的問題,就是我們拋棄了絕大多數(shù)的數(shù)據(jù),而只在一個 不那么寬泛的數(shù)據(jù)基礎(chǔ)上進行研究。上述例子中這樣的極端做法并不理想,但是如果欠表示類本 身包含大量的樣本,那么上述極端做法可能是一個很好的解決方案。當(dāng)然,擁有這么多數(shù)據(jù)絕對 是太奢侈了。

D.6.3 數(shù)據(jù)增強

數(shù)據(jù)增強有點兒棘手,但在適當(dāng)?shù)那闆r下它可以給我們帶來幫助。增強的意思是生成新的數(shù) 據(jù),或者從現(xiàn)有數(shù)據(jù)的擾動中生成,或者重新生成。AffNIST 就是這樣一個例子。著名的 MNIST 數(shù)據(jù)集由一組手寫的 0~9 數(shù)字組成 (如圖 D-4 所示)。AffNIST 在保留原始標(biāo)簽的同時,以各種 方式對每個數(shù)字進行傾斜、旋轉(zhuǎn)和縮放。

圖 D-4 最左側(cè)列中的條目是原始 MNIST 中的樣本,其他列都是經(jīng)仿射 轉(zhuǎn)換后包含在 affNIST 中的數(shù)據(jù) (圖片經(jīng)“affNIST”授權(quán))

這種特別的做法的目的并不是平衡訓(xùn)練集,而是使像卷積神經(jīng)網(wǎng)絡(luò)一樣的網(wǎng)絡(luò)對以其他方式 編寫的新數(shù)據(jù)更具彈性,但這里數(shù)據(jù)增強的概念仍然適用。

不過,大家必須小心,添加不能真正代表待建模型數(shù)據(jù)的數(shù)據(jù)有可能弊大于利。假設(shè)數(shù)據(jù)集 是之前的 200 只狗和 20 000 只貓組成的圖片集。我們進一步假設(shè)這些圖像都是在理想條件下拍 攝的高分辨率彩色圖像。現(xiàn)在,給 19 000 名幼兒園教師一盒蠟筆并不一定能得到想要的增強數(shù) 據(jù)。因此,考慮一下增強的數(shù)據(jù)會對模型產(chǎn)生什么樣的影響。答案并不是在任何時候都清晰無比, 所以如果一定要沿著這條路徑走下去的話,在驗證模型時請記住模型的影響這一點,并努力圍繞 其邊緣進行測試,以確保沒有無意中引入意外的行為。

最后,再說一件可能價值最小的事情,但這的確是事實: 如果數(shù)據(jù)集“不完整”,那么首先 應(yīng)該考慮回到原來的數(shù)據(jù)源中尋找額外的數(shù)據(jù)。這種做法并不總是可行,但至少應(yīng)該把它當(dāng)作一 種選擇。

D.7 性能指標(biāo)

任何機器學(xué)習(xí)流水線中最重要的部分都是性能指標(biāo)。如果不知道學(xué)到的機器學(xué)習(xí)模型運行得 有多好,就無法讓它變得更好。當(dāng)啟動機器學(xué)習(xí)流水線時,要做的第一件事是在任何 sklearn 機 器學(xué)習(xí)模型上設(shè)置一個性能度量方法,例如“.score()”。然后我們構(gòu)建一個完全隨機的分類 / 回歸 流水線,并在最后計算性能分數(shù)。這使我們能夠?qū)α魉€進行增量式改進,從而逐步提高分數(shù), 以便更接近最終的目標(biāo)。這也是讓老板和同事確信大家走在正確的軌道上的好方法。

D.7.1 分類的衡量指標(biāo)

對分類器而言,我們希望它做對兩件事: 一是用類標(biāo)簽標(biāo)記真正屬于該類的對象,二是不用 這個標(biāo)簽去標(biāo)記不屬于此類的對象。這兩件事對應(yīng)得到的正確計數(shù)值分別稱為真陽 (true positive) 和真陰 (true negative)。如果有一個 numpy 數(shù)組包含模型分類或預(yù)測的所有結(jié)果,那么就可以計 算出正確的預(yù)測結(jié)果,如代碼清單 D-3 所示。

通常而言,對模型預(yù)測錯誤的計數(shù)也很重要,如代碼清單 D-4 所示。

有時,這 4 個數(shù)合并成一個 4 × 4 矩陣,稱為誤差矩陣或混淆矩陣。代碼清單 D-5 給出了混 淆矩陣中預(yù)測值和真實值的樣子。

在混淆矩陣中,我們希望對角線 (左上角和右下角) 上的數(shù)字較大,希望對角線外的數(shù)字 (左 上角和左下角) 較小。然而,正向類和負向類的順序是任意的,所以有時可能會看到這個表的數(shù) 字被調(diào)換了位置。請始終標(biāo)記好混淆矩陣的列和下標(biāo)。有時可能會聽到統(tǒng)計學(xué)家把這個矩陣稱為 分類器列聯(lián)表,但如果堅持使用“混淆矩陣”這個名字的話,就可以避免混淆。

對于機器學(xué)習(xí)分類問題,有兩種有用的方法可以將這 4 種計數(shù)值中的一些指標(biāo)組合成一個性 能指標(biāo): 正確率 (precision) 和召回率 (recall)。信息檢索 (搜索引擎) 和語義搜索就是此分類 問題的例子,因為那里的目標(biāo)是將文檔分為 (和輸入查詢) 匹配或不匹配兩類。第 2 章中,我們 學(xué)習(xí)過詞干還原和詞形歸并如何能夠提高召回率,但同時降低了正確率。

正確率度量的是模型在檢測所感興趣類的所有對象 (稱為正向類) 的能力,因此它也被稱為 正向預(yù)測值 (positive predictive value)。由于真陽是預(yù)測正確的正向類樣本數(shù)目,而假陽是錯誤地 標(biāo)記為正向類的負向類樣本數(shù)目,因此可以按照代碼清單 D-6 所示來計算正確率。

上述例子中的混淆矩陣給出了約 57% 的正確率,因為在所有預(yù)測為正向類的樣本中有約 57% 是正確的。

召回率和正確率類似,它也被稱為靈敏度、真陽率或查全率。因為數(shù)據(jù)集中的樣本總數(shù)是真 陽 (true positive) 和假陰 (false negative) 的和,所以可以計算召回率,即檢測到的預(yù)測正確的 正向類樣本占所有樣本的百分比,代碼如代碼清單 D-7 所示。

這就是說上面例子中得到的模型檢測到了數(shù)據(jù)集中 80% 的正向類樣本。

D.7.2 回歸的衡量指標(biāo)

用于機器學(xué)習(xí)回歸問題的兩個最常見的性能評價指標(biāo)是均方根誤差 (RMSE) 和皮爾遜相關(guān)系數(shù) (R2)。事實證明,分類問題背后實際上是回歸問題。因此,如果類標(biāo)簽已經(jīng)轉(zhuǎn)換為數(shù)字 (就像我們在上一節(jié)中所做的那樣),就可以在其上使用回歸度量方法。下面的代碼示例將復(fù)用上一節(jié)的那些預(yù)測值和真實值。RMSE 對于大多數(shù)問題是最有用的,因為它給出的是預(yù)測值與真實值可能的相差程度。RMSE 給出的是誤差的標(biāo)準(zhǔn)偏差,如代碼清單 D-8 所示。

皮爾遜相關(guān)系數(shù)是回歸函數(shù)的另一個常見性能指標(biāo)。sklearn 模塊默認將其作為.score() 函數(shù)附加到大多數(shù)模型上。如果大家不清楚這些指標(biāo)如何計算的話,那么應(yīng)該手動計算一下找找感覺。相關(guān)系數(shù)的計算參見代碼清單 D-9。

由此可見我們的樣本預(yù)測值與真實值的相關(guān)度只有 28%。

D.8 專業(yè)技巧

一旦掌握了基本知識,那么下面這些簡單的技巧將有助于更快地建立良好的模型:

  • 使用數(shù)據(jù)集中的一個小的隨機樣本子集來發(fā)現(xiàn)流水線的可能缺陷 ;
  • 當(dāng)準(zhǔn)備將模型部署到生產(chǎn)環(huán)境中時,請使用所有的數(shù)據(jù)來訓(xùn)練模型 ;
  • 首先應(yīng)該嘗試自己最了解的方法,這個技巧也適用于特征提取和模型本身 ;
  • 在低維特征和目標(biāo)上使用散點圖和散點矩陣,以確保沒有遺漏一些明顯的模式 ;
  • 繪制高維數(shù)據(jù)作為原始圖像,以發(fā)現(xiàn)特征的轉(zhuǎn)移 1;
  • 當(dāng)希望最大化向量對之間的差異時,可以嘗試對高維數(shù)據(jù)使用 PCA(對 NLP 數(shù)據(jù)使用 LSA);
  • 當(dāng)希望在低維空間中進行回歸或者尋找匹配的向量對時,可以使用非線性降維,如 t-SNE;
  • 構(gòu)建一個 sklearn.Pipeline 對象,以提高模型和特性提取器的可維護性和可復(fù)用性 ;
  • 使超參數(shù)的調(diào)優(yōu)實現(xiàn)自動化,這樣模型就可以了解數(shù)據(jù),大家就可以花時間學(xué)習(xí)機器學(xué)習(xí)。

超參數(shù)調(diào)優(yōu): 超參數(shù)是所有那些確定流水線性能的值,包括模型類型及其配置方式等。超參數(shù)還可 以是神經(jīng)網(wǎng)絡(luò)中包含的神經(jīng)元數(shù)和層數(shù),或者是 sklearn.linear_model.Ridge 嶺回歸模型中 的 alpha 值。超參數(shù)還包括控制所有預(yù)處理步驟的值,例如分詞類型、所有忽略的詞列表、TF-IDF 詞匯表的最小和最大文檔頻率、是否使用詞形歸并、TF-IDF 歸一化方法等。

超參數(shù)調(diào)優(yōu)可能是一個十分緩慢的過程,因為每個實驗都需要訓(xùn)練和驗證一個新模型。因此,在搜索范圍廣泛的超參數(shù)時,我們需要將數(shù)據(jù)集減小到具有代表性的最小樣本集。當(dāng)搜索接近滿足需求的最終模型時,可以增加數(shù)據(jù)集的大小,以使用盡可能多的所需數(shù)據(jù)。

優(yōu)化流水線的超參數(shù)是提高模型性能的方法。實現(xiàn)超參數(shù)調(diào)優(yōu)自動化可以節(jié)省更多的時間來閱讀本書這樣的書籍,或者可視化和分析最后的結(jié)果。當(dāng)然大家仍然可以通過直覺設(shè)置要嘗試的超參數(shù)范圍來指導(dǎo)調(diào)優(yōu)。

提示:超參數(shù)調(diào)優(yōu)最有效的算法是 (從最好到最差):

(1) 貝葉斯搜索 ;

(2) 遺傳算法 ;

(3) 隨機搜索 ;

(4) 多分辨率網(wǎng)格搜索 ;

(5) 網(wǎng)格搜索。

但是無論如何,在大家進入夢鄉(xiāng)時工作的所有計算機搜索算法,都比手動猜測一個個新參數(shù)好。

本文轉(zhuǎn)自 公眾號:AI前線 ,節(jié)選自《自然語言處理實戰(zhàn)》,點擊閱讀原文

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 人工智能
    +關(guān)注

    關(guān)注

    1806

    文章

    49011

    瀏覽量

    249364
  • 機器學(xué)習(xí)
    +關(guān)注

    關(guān)注

    66

    文章

    8502

    瀏覽量

    134592
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    BP神經(jīng)網(wǎng)絡(luò)卷積神經(jīng)網(wǎng)絡(luò)的比較

    BP神經(jīng)網(wǎng)絡(luò)卷積神經(jīng)網(wǎng)絡(luò)在多個方面存在顯著差異,以下是對兩者的比較: 一、結(jié)構(gòu)特點 BP神經(jīng)網(wǎng)絡(luò) : BP神經(jīng)網(wǎng)絡(luò)是一種多層的前饋
    的頭像 發(fā)表于 02-12 15:53 ?662次閱讀

    自然語言處理與機器學(xué)習(xí)的關(guān)系 自然語言處理的基本概念及步驟

    自然語言處理(Natural Language Processing,簡稱NLP)是人工智能和語言學(xué)領(lǐng)域的一個分支,它致力于研究如何讓計算機能夠理解、解釋和生成人類語言。機器學(xué)習(xí)(Ma
    的頭像 發(fā)表于 12-05 15:21 ?1981次閱讀

    ASR與自然語言處理的結(jié)合

    ASR(Automatic Speech Recognition,自動語音識別)與自然語言處理(NLP)是人工智能領(lǐng)域的兩個重要分支,它們在許多應(yīng)用中緊密結(jié)合,共同構(gòu)成了自然語言理解和生成的技術(shù)體系
    的頭像 發(fā)表于 11-18 15:19 ?1025次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的實現(xiàn)工具與框架

    卷積神經(jīng)網(wǎng)絡(luò)因其在圖像和視頻處理任務(wù)中的卓越性能而廣受歡迎。隨著深度學(xué)習(xí)技術(shù)的快速發(fā)展,多種實現(xiàn)工具和框架應(yīng)運而生,為研究人員和開發(fā)者提供了強大的支持。 TensorFlow 概述
    的頭像 發(fā)表于 11-15 15:20 ?668次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)自然語言處理中的應(yīng)用

    自然語言處理是人工智能領(lǐng)域的一個重要分支,它致力于使計算機能夠理解、解釋和生成人類語言。隨著深度學(xué)習(xí)技術(shù)的發(fā)展,卷積神經(jīng)網(wǎng)絡(luò)(CNNs)作為
    的頭像 發(fā)表于 11-15 14:58 ?803次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)與傳統(tǒng)神經(jīng)網(wǎng)絡(luò)的比較

    在深度學(xué)習(xí)領(lǐng)域,神經(jīng)網(wǎng)絡(luò)模型被廣泛應(yīng)用于各種任務(wù),如圖像識別、自然語言處理和游戲智能等。其中,卷積神經(jīng)網(wǎng)絡(luò)(CNNs)和傳統(tǒng)
    的頭像 發(fā)表于 11-15 14:53 ?1867次閱讀

    深度學(xué)習(xí)中的卷積神經(jīng)網(wǎng)絡(luò)模型

    深度學(xué)習(xí)近年來在多個領(lǐng)域取得了顯著的進展,尤其是在圖像識別、語音識別和自然語言處理等方面。卷積神經(jīng)網(wǎng)絡(luò)作為深度學(xué)習(xí)的一個分支,因其在圖像處理
    的頭像 發(fā)表于 11-15 14:52 ?844次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的基本原理與算法

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)是一類包含卷積計算且具有深度結(jié)構(gòu)的前饋神經(jīng)網(wǎng)絡(luò)(Feedforward Neural Networks
    的頭像 發(fā)表于 11-15 14:47 ?1773次閱讀

    循環(huán)神經(jīng)網(wǎng)絡(luò)自然語言處理中的應(yīng)用

    自然語言處理(NLP)是人工智能領(lǐng)域的一個重要分支,它致力于使計算機能夠理解、解釋和生成人類語言。隨著深度學(xué)習(xí)技術(shù)的發(fā)展,循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)因其在
    的頭像 發(fā)表于 11-15 09:41 ?813次閱讀

    LSTM神經(jīng)網(wǎng)絡(luò)與傳統(tǒng)RNN的區(qū)別

    神經(jīng)網(wǎng)絡(luò)(RNN) RNN的基本結(jié)構(gòu) RNN是一種特殊的神經(jīng)網(wǎng)絡(luò),它能夠處理序列數(shù)據(jù)。在RNN中,每個時間步的輸入都會通過一個循環(huán)結(jié)構(gòu)傳遞到下一個時間步,使得網(wǎng)絡(luò)能夠保持對之前信息的記
    的頭像 發(fā)表于 11-13 09:58 ?1208次閱讀

    使用LSTM神經(jīng)網(wǎng)絡(luò)處理自然語言處理任務(wù)

    自然語言處理(NLP)是人工智能領(lǐng)域的一個重要分支,它旨在使計算機能夠理解、解釋和生成人類語言。隨著深度學(xué)習(xí)技術(shù)的發(fā)展,特別是循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)及其變體——長短期記憶(LSTM)
    的頭像 發(fā)表于 11-13 09:56 ?1158次閱讀

    LSTM神經(jīng)網(wǎng)絡(luò)的基本原理 如何實現(xiàn)LSTM神經(jīng)網(wǎng)絡(luò)

    LSTM(長短期記憶)神經(jīng)網(wǎng)絡(luò)是一種特殊的循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),它能夠?qū)W習(xí)長期依賴信息。在處理序列數(shù)據(jù)時,如時間序列分析、自然語言處理等,
    的頭像 發(fā)表于 11-13 09:53 ?1580次閱讀

    自然語言處理的未來發(fā)展趨勢

    隨著技術(shù)的進步,自然語言處理(NLP)已經(jīng)成為人工智能領(lǐng)域的一個重要分支。NLP的目標(biāo)是使計算機能夠理解、解釋和生成人類語言,這不僅涉及到語言的表層形式,還包括
    的頭像 發(fā)表于 11-11 10:37 ?1726次閱讀

    自然語言處理與機器學(xué)習(xí)的區(qū)別

    在人工智能的快速發(fā)展中,自然語言處理(NLP)和機器學(xué)習(xí)(ML)成為了兩個核心的研究領(lǐng)域。它們都致力于解決復(fù)雜的問題,但側(cè)重點和應(yīng)用場景有所不同。 1. 自然語言處理(NLP) 定義:
    的頭像 發(fā)表于 11-11 10:35 ?1542次閱讀

    關(guān)于卷積神經(jīng)網(wǎng)絡(luò),這些概念你厘清了么~

    神經(jīng)網(wǎng)絡(luò)和其他類型網(wǎng)絡(luò)的主要區(qū)別在于處理數(shù)據(jù)的方式。卷積神經(jīng)網(wǎng)絡(luò)通過濾波依次檢查輸入數(shù)據(jù)的屬性。卷積
    發(fā)表于 10-24 13:56