獨家 | 教你用Pytorch建立你的第一個文本分類模型!

2021-03-02 數據派THU

作者: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】至聯繫郵箱,申請白名單授權並按要求編輯。

發布後請將連結反饋至聯繫郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。


點擊「閱讀原文」擁抱組織

相關焦點

  • 獨家 :教你用Pytorch建立你的第一個文本分類模型!
    學習如何使用PyTorch實現文本分類理解文本分類中的關鍵點學習使用壓縮填充方法在我的編程歷程中,我總是求助於最先進的架構。現在得益於深度學習框架,比如說PyTorch,Keras和 TensorFlow,實現先進的架構已經變得更簡單了。這些深度學習框架提供了一種實現複雜模型架構和算法的簡單方式,不需要你掌握大量的專業知識和編程技能。
  • 使用PyTorch建立你的第一個文本分類模型
    這些框架提供了一種簡單的方法來實現複雜的模型體系結構和算法,而只需要很少的概念知識和代碼技能。簡而言之,它們是數據科學社區的一座金礦!在本文中,我們將使用PyTorch,它以其快速的計算能力而聞名。因此,在本文中,我們將介紹解決文本分類問題的關鍵點。然後我們將在PyTorch中實現第一個文本分類器!
  • 手把手教你用 PyTorch 快速準確地建立神經網絡
    這些框架的普及推動了近年來深度學習的興起。二者都不乏堅定的支持者,但在過去的一年裡,一個明顯的贏家已經開始出現。PyTorch是2018年最流行的框架之一。它已迅速成為學術界和工業界研究人員的首選深度學習框架。在過去幾周使用了PyTorch之後,我體會到它是一個非常靈活且易於使用的深度學習庫。在本文中,我們將探討PyTorch的全部內容。
  • 教你使用torchlayers 來構建PyTorch 模型(附連結)
    torchlayers 旨在做Keras為TensorFlow所做的事情,它提供了更高級的模型構建的API和一些方便的默認值以及附加功能,這些功能對構建PyTorch神經網絡很有用。通過在線搜索的趨勢判斷(連結:https://trends.google.com/trends/explore?
  • 用Spark-NLP建立文本分類模型
    這些平臺不僅能夠處理大數據,使組織能夠對非結構化數據(如文本分類)進行大規模分析。但在機器學習方面,大數據系統和機器學習工具之間仍然存在差距。流行的機器學習python庫,如scikit-learn和Gensim,經過高度優化,可以在單節點計算機上執行,而不是為分布式環境設計的。
  • 【深度學習】textCNN論文與原理——短文本分類(基於pytorch)
    前言前文已經介紹了TextCNN的基本原理,如果還不熟悉的建議看看原理:【深度學習】textCNN論文與原理[1]及一個簡單的基於pytorch的圖像分類案例:【深度學習】卷積神經網絡-圖片分類案例(pytorch實現)[2]。
  • textCNN論文與原理——短文本分類(基於pytorch和torchtext)
    前言之前書寫了使用pytorch進行短文本分類,其中的數據處理方式比較簡單粗暴。自然語言處理領域包含很多任務,很多的數據向之前那樣處理的話未免有點繁瑣和耗時。在pytorch中眾所周知的數據處理包是處理圖片的torchvision,而處理文本的少有提及,快速處理文本數據的包也是有的,那就是torchtext[1]。
  • 獨家 | 手把手教你用Python構建你的第一個多標籤圖像分類模型(附案例)
    多標籤圖像分類與多類圖像分類有何不同?3. 了解多標籤圖像分類模型體系結構;4. 構建多標籤圖像分類模型的步驟;5. 案例研究:用Python解決多標籤圖像分類問題;6.接下來的步驟和你的實驗;7.尾記。1. 什麼是多標籤圖像分類?
  • 【PyTorch實戰】手把手教你用torchtext處理文本數據
    如何將一個純文本數據(比如一個 txt 文本), 變成一個模型可接受的數據(比如一個 embedding 序列)呢?如果你是 pytorch 的用戶,你可能已經非常熟悉 torchvision 了,因為它已經比較穩定,而且官方也為它出了教程。torchtext 跟 torchvision 一樣,是為了處理特定的數據和數據集而存在的。
  • 教你用BERT進行多標籤文本分類
    預訓練模型在研究領域的應用已經令許多NLP項目的最新成果產生了巨大的飛躍,例如文本分類,自然語言推理和問答。ELMo,ULMFiT 和OpenAI Transformer是其中幾個關鍵的裡程碑。這讓我們可以通過對下遊特定任務(例如情緒分類,意圖檢測,問答等)進行微調來使用預先訓練的BERT模型。本文將手把手教你,用BERT完成一個Kaggle競賽。
  • 用 PyTorch 實現一個簡單的分類器
    所以我總結了一下自己當初學習的路線,準備繼續深入鞏固自己的 pytorch 基礎;另一方面,也想從頭整理一個教程,從沒有接觸過 pytorch 開始,到完成一些最新論文裡面的工作。以自己的學習筆記整理為主線,大家可以針對參考。第一篇筆記,我們先完成一個簡單的分類器。
  • 基於TorchText的PyTorch文本分類
    文本分類是自然語言處理的重要應用之一。在機器學習中有多種方法可以對文本進行分類。但是這些分類技術大多需要大量的預處理和大量的計算資源。在這篇文章中,我們使用PyTorch來進行多類文本分類,因為它有如下優點:PyTorch提供了一種強大的方法來實現複雜的模型體系結構和算法,其預處理量相對較少,計算資源(包括執行時間)的消耗也較少。
  • onnx實現對pytorch模型推理加速
    如果不這樣做,將會產生不一致的推斷結果#在保存用於推理或恢復訓練的通用檢查點時,必須保存模型的state_dictPytorch模型轉onnx舉例模型是調用resnet50訓練的4分類模型,訓練過程調用gpu,則轉換過程如下:1 如果保存的是整個模型import torchdevice = torch.device
  • 手把手教你用PyTorch實現圖像分類器(第一部分)
    通過3篇短文,介紹如何實現圖像分類器的概念基礎——這是一種能夠理解圖像內容的算法。本文的目標不是提供手把手的指導,而是幫助理解整個過程。如果你正在考慮學習機器學習或人工智慧,你將不得不做類似的項目,並理解本系列文章中介紹的概念。文章主要進行概念上的解釋,不需要知道如何編寫代碼。
  • 文本分類的14種算法
    這種簡單的文本分類練習,不同算法的性能分層還是比較明顯的。知識總結1.機器學習、集成學習和深度學習:1)機器學習泛指所有的使機器通過建立和調整模型從而實現特定功能的算法。1)伯努利貝葉斯即特徵的取值只有取和不取兩類(0和1),對應樸素貝葉斯公式中,p(yi)=標籤為yi的文本數(句子數)/文本總數(句子總數)p(xj|yi)=(標籤為yi的文本中出現了單詞xj的文本數+1)/(標籤為yi的文本數+2)。
  • 如何用 Python 和 BERT 做多標籤(multi-label)文本分類?
    10餘行代碼,藉助 BERT 輕鬆完成多標籤(multi-label)文本分類任務。疑問之前我寫了《如何用 Python 和 BERT 做中文文本二元分類?》一文,為你講解過如何用 BERT 語言模型和遷移學習進行文本分類。不少讀者留言詢問:王老師,難道 BERT 只能支持二元分類嗎?
  • 手把手教你用BERT進行多標籤文本分類
    預訓練模型在研究領域的應用已經令許多NLP項目的最新成果產生了巨大的飛躍,例如文本分類,自然語言推理和問答。ELMo,ULMFiT 和OpenAI Transformer是其中幾個關鍵的裡程碑。所有這些算法都允許我們在大型資料庫(例如所有維基百科文章)上預先訓練無監督語言模型,然後在下遊任務上對這些預先訓練的模型進行微調。
  • 雲計算學習:用PyTorch實現一個簡單的分類器
    所以我總結了一下自己當初學習的路線,準備繼續深入鞏固自己的 pytorch 基礎;另一方面,也想從頭整理一個教程,從沒有接觸過 pytorch 開始,到完成一些最新論文裡面的工作。以自己的學習筆記整理為主線,大家可以針對參考。第一篇筆記,我們先完成一個簡單的分類器。
  • 手把手教你用 TensorFlow 實現文本分類(上)
    利用空閒時間,想用神經網絡做一個文本分類的應用, 目的是從頭到尾完成一次機器學習的應用,學習模型的優化方法,同時學會使用主流的深度學習框架(這裡選擇tensorflow)。文章分為兩部分,本文僅實現流程,用簡單的softmax回歸對文本進行分類,後面一篇文章再從流程的各個方面對模型進行優化,達到比較好的效果。
  • 手把手教你用Python構建你的第一個多標籤圖像分類模型(附案例)
    多標籤圖像分類與多類圖像分類有何不同?3. 了解多標籤圖像分類模型體系結構;4. 構建多標籤圖像分類模型的步驟;5. 案例研究:用Python解決多標籤圖像分類問題;6.接下來的步驟和你的實驗;7.尾記。1. 什麼是多標籤圖像分類?