作者:Aravind Pai
翻譯:王威力
校對:張一豪
本文介紹了利用Pytorch框架實現文本分類的關鍵知識點,包括使用如何處理Out of Vocabulary words,如何解決變長序列的訓練問題,舉出了具體實例。學習如何使用PyTorch實現文本分類
理解文本分類中的關鍵點
學習使用壓縮填充方法
在我的編程歷程中,我總是求助於最先進的架構。現在得益於深度學習框架,比如說PyTorch,Keras和 TensorFlow,實現先進的架構已經變得更簡單了。這些深度學習框架提供了一種實現複雜模型架構和算法的簡單方式,不需要你掌握大量的專業知識和編程技能。總結來說,這是數據科學的金礦。在本文中,我們將使用PyTorch框架,它以其快速的計算能力而聞名。因此,在本文中,我們將介紹解決文本分類問題的關鍵點。然後我們將在PyTorch框架實現我們的第一個文本分類器!A Beginner-Friendly Guide to PyTorch and How it Works from Scratch:
https://www.analyticsvidhya.com/blog/2019/09/introduction-to-pytorch-from-scratch/?utm_source=blog&utm_medium=building-image-classification-models-cnn-pytorch
1. 解決Out of Vocabulary words
2. 解決變長序列
3. 包裝器和預訓練模型
在我們深入專業概念前,我們先快速熟悉一下PyTorch這個框架。PyTorch的基本數據單元是Tensor,類似於python中的numpy數列。使用PyTorch的最重要的兩個優點是:動態的網絡——訓練過程中網絡結構可以變化
多GPU分布式訓練
我肯定你在想-為什麼我們要用PyTorch處理文本數據?接下來我們討論一下PyTorch的一些令人難以置信的特性,這些特性使它不同於其他框架,特別是在處理文本數據時。1. 處理Out of Vocabulary words問題文本分類模型是在固定數據大小的文本數據集上進行訓練的。但是對於推理問題,可能會遇到有些詞並不涵蓋在詞彙集內,這些詞叫做Out of Vocabulary words。忽略Out of Vocabulary words可能會導致信息丟失,因此這是一個重要的問題。為了解決這個問題,PyTorch支持把訓練數據集中的稀有詞替換為unknown token,幫助我們處理Out of Vocabulary words問題。是否聽過,循環神經網絡用來解決變長序列的問題,有沒有疑惑它是怎麼實現的?PyTorch帶來了很有用的'Packed Padding sequence',來實現動態循環神經網絡。Padding(填充)是在句子的開頭或者結尾填充額外的token的過程。由於每個句子的詞的數量不同,我們把長度不同的句子輸入,增加padding tokens,擴充以使得句子等長。由於大部分的框架支持的是靜態網絡,也就是說在模型訓練過程中,模型框架是不變的,因此padding是必要的。儘管padding解決了變長序列的問題,但也帶來了新的問題——padding token是增加了新的信息/數據,下面我用一個簡單的圖來做解釋。下邊這個圖中,最後一個單詞表示的是一個padding token,但它也在產生輸出的過程裡發生了作用。這個問題可以交給pytorch中的Packed Padding sequence(壓縮填充序列)來處理。壓縮填充會忽略掉padding token的部分。這些值,永遠不會出現在循環神經網絡的訓練過程中,可以幫助我們建立動態的循環神經網絡。Pytorch正在推出先進的框架。Hugging Face 公司的Transformers庫提供了超過32個先進的框架用於自然語言理解和自然語言生成。除此之外,pytorch還提供了一些預訓練的模型,可以用很少的代碼去解決文本到語言、目標檢測等問題。是不是感覺到難以置信?這些是PyTorch的一些非常有用的特性。現在讓我們使用PyTorch解決文本分類問題。Quora希望在他們的平臺上跟蹤「不真誠」的問題,以便讓用戶在分享知識的同時感到安全。在這種情況下,一個不真誠的問題被定義為一個旨在陳述而不是尋求有用答案的問題。為了進一步分解這一點,這裡有一些特徵可以表明某個特定問題是不真誠的:訓練集包括以上被問的問題,以及一個標誌它是否是不真誠的標籤(target=1表示不真誠)。基本事實中存在噪聲,也就是說,訓練集並不是完美的。我們的任務是識別一個給定的問題是否是「不真誠的」。https://drive.google.com/open?id=1fcip8PgsrX7m4AFgvUPLaac5pZ79mpwX
現在是時候用PyTorch編寫我們自己的文本分類模型了。首先導入所有建模需要的包。這裡有一個簡單的關於我們要用到的包的概覽:為了使結果可復現,我指定了種子值。由於深度學習模型的隨機性,在執行時可能會產生不同的結果,因此指定種子值非常重要。現在我們來看,如何用field(域)來做文本的預處理。這裡有兩種域對象——Field和LabelField。我們來快速理解一下它們的區別:然後,創建元組構成的列表,每個元組都包含一個列名,第二個值是field對象。另外,按照csv文件中列的順序,來排列元組,當我們忽略一列的時候,用(None,None)表示。fields = [(None, None), ('text',TEXT),('label', LABEL)]這個代碼塊中,我通過定義field對象加載了自定義數據集。
下一步是建立文本的vocabulary並把它們轉化為整數序列。Vocabulary包含整個文本中的所有的獨立的詞,每一個詞都分配一個索引。下面是參數:我們建立起vocabulary,用預訓練好的詞嵌入來初始化單詞成向量。如果你想隨機初始化詞嵌入,可以忽略向量的參數。接下來,準備訓練模型的batch。BucketIterator以需要最小填充量的方式形成批次。現在需要定義模型的架構來解決這個二分類問題。Torch中的nn模塊,是一個所有模型的基礎模型。也就是說,每個模型都必須是nn模塊的子類。我定義了兩個函數,init和forward。我來解釋一下這兩個函數的應用場景。嵌入層:對於任何NLP相關的任務,詞嵌入都很重要,因為它可以應用數字形式表示一個單詞。嵌入層得到一個查詢表,其中每一行代表一個詞嵌入。嵌入層可以把表示文本的整數序列轉化為稠密向量矩陣。嵌入層的兩個重要的參數:LSTM:LSTM是RNN的一個變體,可以學習長的依賴關係。下面列舉了LSTM的一些你應該了解的重要參數:input_size:輸入向量的維度;
hidden_size:隱藏層節點的個數;
num_layers:網絡中的層數;
batch_first:如果等於True,輸入輸出的tensor的形式都是(batch, seq, feature);
dropout:默認值是0,如果設為非0,每個LSTM層輸出結果都會進到dropout層,以dropout參數值的概率刪掉對應比例的神經元;
bidirection:如果為True, LSTM是雙向的。
Linear Layer:線性層指的是稠密層,有兩個重要參數:in_features:輸入特徵的個數;
out_features:隱藏層節點個數。
壓縮填充:上文已經討論過,壓縮填充用於動態循環神經網絡。如果不採用壓縮填充的話,填充後的輸入,rnn也會處理padding輸入,並返回padded元素的hidden state。但壓縮填充是一個很棒的包裝,它不顯示填充的輸入。它直接忽略填充部分並返回非填充元素部分的hidden state。現在我們已經對這個架構中的所有板塊都有了了解,現在可以去看代碼了!讓我們看看模型摘要,並使用預訓練的詞嵌入初始化嵌入層。所以我們有一個函數來訓練模型,但是我們也需要一個函數來評估模型。我們來吧 !最後,我們將對模型進行一定數量的訓練,並保存每個時期的最佳模型。讓我們加載最佳模型並定義一個推理函數,它接受用戶定義的輸入並進行預測太神了!讓我們用這個模型來預測幾個問題。我們已經看到了如何在PyTorch中構建自己的文本分類模型,並了解了壓縮填充的重要性。您可以隨意使用長短期模型的超參數,如隱藏節點數、隱藏層數等,以進一步提高性能。原文連結:
https://www.analyticsvidhya.com/blog/2020/01/first-text-classification-in-pytorch/
原文標題:
Build Your First Text Classification model using PyTorch
如您想與我們保持交流探討、持續獲得數據科學領域相關動態,包括大數據技術類、行業前沿應用、講座論壇活動信息、各種活動福利等內容,敬請掃碼加入數據派THU粉絲交流群,紅數點恭候各位。
編輯:黃繼彥
校對:林亦霖
工作內容:需要一顆細緻的心,將選取好的外文文章翻譯成流暢的中文。如果你是數據科學/統計學/計算機類的留學生,或在海外從事相關工作,或對自己外語水平有信心的朋友歡迎加入翻譯小組。
你能得到:定期的翻譯培訓提高志願者的翻譯水平,提高對於數據科學前沿的認知,海外的朋友可以和國內技術應用發展保持聯繫,THU數據派產學研的背景為志願者帶來好的發展機遇。
其他福利:來自於名企的數據科學工作者,北大清華以及海外等名校學生他們都將成為你在翻譯小組的夥伴。
點擊文末「閱讀原文」加入數據派團隊~
轉載須知
如需轉載,請在開篇顯著位置註明作者和出處(轉自:數據派ID:DatapiTHU),並在文章結尾放置數據派醒目二維碼。有原創標識文章,請發送【文章名稱-待授權公眾號名稱及ID】至聯繫郵箱,申請白名單授權並按要求編輯。
發布後請將連結反饋至聯繫郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。
點擊「閱讀原文」擁抱組織