良好學習過程的關(guān)鍵原則之一,,就是讓學習的內(nèi)容略高于當前的理解。如果該主題與你已知的內(nèi)容太過于相似,,那么你就不會有很大的進步,。另一方面,如果這個主題太難的話,,你就會停滯不前,,幾乎沒有進展。 深度學習涉及很多不同的主題和很多我們需要學習的東西,,所以一個好的策略就是開始研究人們已經(jīng)為我們構(gòu)建好了的東西,。這就是為什么框架非常棒的原因??蚣苁刮覀儾槐靥^于關(guān)心如何構(gòu)建模型的細節(jié),,使得我們可以更多地關(guān)注我們想要完成的任務(wù)(而不是專注于如何實現(xiàn))。 對于構(gòu)建深度學習中的NLP模型,,AllenNLP框架使得任務(wù)變得十分有趣,。這對我來說是一個驚喜,因為我之前在深度學習中的NLP的學習經(jīng)歷是痛苦的,。 處理NLP任務(wù)需要不同類型的神經(jīng)網(wǎng)絡(luò)單元,,因此在開始學習如何使用AllenNLP框架之前,,我們先快速回顧這些單元背后的理論。 當簡單的神經(jīng)網(wǎng)絡(luò)不夠時 在簡單的工作中,,閱讀文本的任務(wù)包括構(gòu)建我們之前閱讀的內(nèi)容,。舉個例子,如果之前你沒讀過這個句子你可能就不懂這個句子的意思,,所以創(chuàng)建這些神經(jīng)網(wǎng)絡(luò)單元背后的想法是:
遞歸神經(jīng)網(wǎng)絡(luò) 為了使用考慮時間的網(wǎng)絡(luò),我們需要一種表示時間的方式,。但我們?nèi)绾巫龅竭@一點,?
問題是這種方法有幾個缺點,,例如:
Jeffrey L. Elman討論了論文中發(fā)現(xiàn)的其他缺陷。本文介紹了 Elman網(wǎng)絡(luò),,這是一個三層網(wǎng)絡(luò),,增加了一組“上下文統(tǒng)一”。 如果你對神經(jīng)網(wǎng)絡(luò)完全陌生,,那么閱讀我寫的另一篇文章可能是個好主意,。但簡單地說,神經(jīng)網(wǎng)絡(luò)是有機會被激活的或者不是被輸入的,。 Elman根據(jù)Jordan(1986)提出的方法開始他的工作,。Jordan引入遞歸連接。
上下文單元和輸入激活神經(jīng)網(wǎng)絡(luò)隱藏單元,。 當神經(jīng)網(wǎng)絡(luò)“學習”時,這意味著它有一個表示所有輸入網(wǎng)絡(luò)處理的模式,。上下文單元記住以前的內(nèi)部狀態(tài),。 如果這些都沒有意義,不要擔心,。只要想一想,,現(xiàn)在我們有一個神經(jīng)網(wǎng)絡(luò)單元,它將先前的狀態(tài)考慮在內(nèi)以產(chǎn)生下一個狀態(tài),。
當RNNs不夠時:LSTM 正如Christopher Ola 在另一篇文章解釋的那樣 (如果你想了解更多關(guān)于LSTM的信息,,這篇文章是很棒的),有時我們需要更多的上下文,,也就是有時我們需要存儲很久以前看到的信息,。
LSTM單元解決了這個問題。它們是一種特殊的RNN,,能夠?qū)W習長期的依賴關(guān)系,。我們將只使用LSTM單元,而不是構(gòu)建它們,,因此對于我們而言,,可以將LSTM單元看作具有不同架構(gòu)并能夠?qū)W習長期依賴性的單元。 構(gòu)建一個文本分類的高級模型 好了,,有了足夠的理論,,現(xiàn)在讓我們進入有趣的部分,并建立模型,。 訓練過程 上面的圖片向我們展示了我們?nèi)绾卧O(shè)置一切。首先我們得到數(shù)據(jù),然后將它編碼為模型將理解的格式('tokens'和'internal_text_encoder'),,然后我們用這些數(shù)據(jù)來訓練網(wǎng)絡(luò),,對比標記并調(diào)整權(quán)重。在這個過程結(jié)束時,,模型已經(jīng)準備好做出預(yù)測了,。 現(xiàn)在我們終于會感受到AllenNLP的魔力!我們將用一個簡單的JSON文件指定上圖中的所有內(nèi)容,。
讓我們來看下這段代碼,。 1 數(shù)據(jù)輸入 為了告訴AllenNLP輸入的數(shù)據(jù)集以及如何讀取它,我們在JSON文件中設(shè)置了“dataset_reader”鍵值,。 DatasetReader從某個位置讀取數(shù)據(jù)并構(gòu)造Dataset,。除文件路徑之外的讀取數(shù)據(jù)所需的所有參數(shù)都應(yīng) 遞給DatasetReader的構(gòu)造器。 — AllenNLP documentation 數(shù)據(jù)集是 20個新聞組,,我們將在稍后定義如何讀取(在 python 類中),。先來定義模型的其余部分。 2 模型 我們先設(shè)置'model'鍵值來指定模型,,在'model'鍵值中還有三個參數(shù):'model_text_field_embedder','internal_text_encoder'和'classifier_feedforward',。 我們先來看一下第一個,其余的兩個將在稍后說明,。 通過'model_text_field_embedder',,我們告訴AllenNLP數(shù)據(jù)在傳遞給模型之前應(yīng)該如何編碼。 簡而言之,,我們希望使數(shù)據(jù)更“有意義”,。 背后的想法是這樣的:如果可以像比較數(shù)字那樣比較文字會怎么樣? 如果5 - 3 + 2 = 4 ,, 國王-男人+女人=女王,,又何嘗不對呢? 用詞嵌入我們可以做到這一點,。 這對模型也很有用,,因為現(xiàn)在我們不需要使用很多稀疏數(shù)組(具有很多零的數(shù)組)作為輸入,。
在我們的模型中將使用GloVe:用于詞匯表征的全局向量,。
如果還是難以理解,,只要將Glove看作是一種將單詞編碼為向量的模型。我們將每個嵌入向量的大小設(shè)置為100,。 Glove把單詞編碼為向量 這就是'model_text_field_embedder'所做的,。 3 數(shù)據(jù)迭代器 像往常一樣,我們將分批分離訓練數(shù)據(jù),。 AllenNLP提供了一個名為BucketIterator的迭代器,,通過對每批最大輸入長度填充批量,使計算(填充)更高效,。 要做到這一點,,它將按照每個文本中的符號數(shù)對實例進行排序。 我們在'iterator'鍵值中設(shè)置這些參數(shù),。 4 訓練器 最后一步是設(shè)置訓練階段的配置,。 訓練器使用AdaGrad優(yōu)化器作10代訓練,如果最后3代的驗證準確性沒有提高,,則停止,。 為了訓練模型,我們只需要運行: python run.py our_classifier.json -s /tmp/your_output_dir_here 另一個很酷的事情是,,通過框架我們可以停止并在稍后恢復(fù)訓練,。 但在此之前,我們需要指定dataset_reader和模型python類,。 編寫AllenNLP Python類 dataset_reader.py 我們將使用scikit-learn提供的20個新聞組,。 為了引用JSON文件中的DatasetReader,我們需要注冊它:
你將實施三種方法:其中兩個為read()和text_to_instance(),。
read()從scikit-learn獲取數(shù)據(jù),。通過AllenNLP,你可以設(shè)置數(shù)據(jù)文件的路徑(例如JSON文件的路徑),,但在我們的例子中,,我們只需像Python模塊一樣導(dǎo)入數(shù)據(jù)。 我們將讀取數(shù)據(jù)集中的每個文本和每個標簽,,并用text_to_instance()包裝它,。
此方法“進行任何符號化或必要的處理,來把文本輸入轉(zhuǎn)為Instance”(AllenNLP Documentation),。在我們的實例中意味著這樣做:
我們將來自20個新聞組的文本和標簽包裝到TextField和LabelField中,。 model.py 我們將使用雙向LSTM網(wǎng)絡(luò),該網(wǎng)絡(luò)是第一個循環(huán)層被復(fù)制的單元,。 一層按原樣接收輸入,,另一層接收輸入序列的反向副本。 因此,BLSTM網(wǎng)絡(luò)被設(shè)計為捕獲順序數(shù)據(jù)集的信息并保持過去和未來的上下文特征,。 (來源:中文分詞雙向LSTM循環(huán)神經(jīng)網(wǎng)絡(luò)) 首先我們來定義模型的類參數(shù)
因為在你的模型中經(jīng)常會有幾種不同的映射,,所以Vocabulary會追蹤不同的命名空間。 在這種情況下,,我們?yōu)槲谋驹O(shè)置了“符號”詞匯(代碼中未顯示,,是在背后使用的默認值),以及我們試圖預(yù)測的標簽的“標簽”詞匯,?!?Using AllenNLP in your Project)
用于嵌入符號與作為輸入的TextField。 返回單詞的 Glove向量表征,。
我們用來把輸入文本轉(zhuǎn)換為單個向量的編碼器(RNNs,,還記得嗎?),。 Seq2VecEncoder是一個模塊,,它將一個向量序列作為輸入并返回一個向量。
現(xiàn)在我們來實現(xiàn)模型類的方法
前向法做的是
正向法基本上是在做模型訓練任務(wù)。 如果你想多了解一些,,可以看這個?,F(xiàn)在我們來談?wù)勀P皖悈?shù)的一個重要部分:classifier_feedforward。
運行代碼 正如我之前所說,,通過命令行來訓練模型,,可以使用以下命令: python run.py our_classifier.json -s /tmp/your_output_dir_here 我還創(chuàng)建了一個筆記本,以便我們可以在Google Colaboratory上運行實驗并免費使用GPU,,以下是鏈接:https://colab.research.google.com/drive/1q3b5HAkcjYsVd6yhrwnxL2ByqGK08jhQ 你也可以在這查看代碼:this repository 我們建立了一個簡單的分類模型,,但可能性是無限的。 該框架是為我們的產(chǎn)品創(chuàng)建奇特的深度學習模型的絕佳工具,。 |
|