當前位置:
首頁 > 最新 > 基於序列到序列模型創造神奇數據產品

基於序列到序列模型創造神奇數據產品

作者:Hamel Husain

編譯:weakish

編者按:Github機器學習開發者Hamel Husain最近寫了一篇詳盡的教程,介紹了如何使用Keras和TensorFlow,基於序列到序列模型從Github工單中提取特徵、總結文本。

難題:訓練模型總結Github工單

矩形框內的為預測

以上結果為隨機選擇所得。請繼續閱讀,下面會有更多結果的鏈接。

動機

我從未想像過自己有一天會使用"神奇"來描述機器學習技術的結果。當我入門深度學習後,這一想法改變了,使用深度學習可以完成諸如識別圖片中的物體和排列兩噸樂高這樣的任務。更令人吃驚的是,你不需要一個博士學位或多年的訓練來釋放這些技術的威力。你只需要會寫代碼,具備高中程度的數學知識,以及耐心。

然而,在業界使用深度學習技術的可復現的例子很匱乏。今天,我將分享一個可復現的、最小可行產品演示如何利用深度學習技術基於文本(Github工單)構建數據產品。

本教程將圍繞如何使用序列到序列模型來總結Github工單中的文本,並展示如下事實:

我將在本文中介紹:

我的目標聚焦於提供一個端到端的例子,這樣你可以領會工作流的概念模型,而不是鑽研很多數學。我同時也會提供相應的鏈接,以供有興趣的讀者進一步深入。

收集數據

如果你不熟悉Github工單,我強烈建議你在閱讀下面的內容前去看一下Github工單是什麼樣子的。特別地,我們在這個練習中將使用Github工單的正文和標題。下面是一個例子:

github.com/scikit-learn/scikit-learn/issues/10458

我們將收集許多對工單標題和工單正文,以便訓練我們的總結工單的模型。基本的思路是看過很多工單描述和標題後,模型可以學習如何總結新的工單。

如果你不在Github工作,獲取Github數據的最佳途徑是使用這個超棒的開源項目,這個項目是這樣描述自己的:

……一個記錄、歸檔公開GitHub時間線,使其易於訪問,以供未來分析所用的項目。

從該項目查詢請求數據的指令可以在本文的附錄部分找到。一個機敏的讀者(David Shinn)按照附錄概述的步驟收集了數據,並將本練習所需的數據上傳到了Kaggle!

預備、清洗數據

有時候,清洗數據很不容易。圖片來源:rd.com

Keras文本預處理初步

既然我們已經收集了數據,我們需要為模型準備數據。在轉到代碼之前 ,讓我們溫習下由兩份文檔組成的玩具樣例:

下面是我預處理這一原始文本的大致步驟:

決定目標文檔長度的一個合理方法是構建文檔長度的直方圖,然後選擇一個有意義的數字。(注意上面的例子在文檔之前補齊了數據,不過我們也可以在文檔之後補齊。我們會在下一節更多地討論這個。)

準備Github工單數據

我們需要處理的數據看起來是這樣:

包含工單正文和標題的Pandas dataframe

你可以看到,其中包括工單標題和正文,後面我們將分別處理。我在建模時不會使用超鏈接,它們僅供參考。注意,我從原本的5百萬條工單中取樣了2百萬條工單,使這個教程更易於處理。

我個人覺得為深度學習預處理文本數據是極度重複性的工作。Keras有很好的預處理文本數據的工具,不過我希望並行運行這些任務以加快速度。

ktext包

我創建了一個名為ktext的工具,可以進行上一節提到的文本預處理任務。這個庫是keras及其他一些文本處理工具的一層很薄的封裝,利用python的基於進程的多線程進行加速。它同時將所有的預處理步驟連接起來,提供了一些很方便的函數。警告:這個包正在開發之中,所以將其用於本教程以外的任務時要小心(歡迎發起合併請求!)。了解更多這個庫如何工作的信息,可以參閱這篇教程(不過目前而言我建議繼續閱讀本文)。

運行以下代碼處理正文數據:

以上代碼清洗、token化數據,並應用前補齊和後截斷以確保每份文檔的長度為70個單詞。我研究了ktext提供的文檔長度直方圖決定了補齊的長度。此外,我只保留了詞頻最高的8000個辭彙,剩餘辭彙的索引設置為1以代表這是一個罕見詞(這是一個武斷的選擇)。在AWS p3.2xlarge實例(8核、60GB內存)上,運行這些代碼花了1小時。下面的例子顯示了原始數據和處理後的數據的差別:

處理標題的過程差不多:

這次,我們傳遞了一些額外的參數:

如此處理標題是因為我們希望我們的模型學習預測標題的第一個字母將出現在哪裡,以及片語的結尾應該在哪裡。下一節討論模型架構的時候,這麼做的意義會更明顯。

定義模型架構

創建神經網路架構就像是搭樂高積木。對初學者而言,將每一層看成API可能會有所幫助:你發給API一些數據,然後API返回一些數據。以這種方式思考問題,你不會被過多知識所壓倒,你可以慢慢地加深你的理解。理解兩個概念很重要:

想要理解這篇教程,理解上面兩個概念是必要的。如果你不能很好地理解這兩個概念,我強烈建議你先去這個MOOC看一些教學,再回過頭來閱讀本文。

在這篇教程中,我們將利用一個稱為序列到序列(Sequence to Sequence)的網路架構。暫停閱讀本文,仔細閱讀這篇Francois Chollet寫的A ten-minute introduction to sequence-to-sequence learning in Keras(基於Keras10分鐘入門序列到序列學習)。

讀完上面提到的文章之後,你應該能從概念上理解下面的示意圖,一個接受兩個輸入、返回一個輸出的網路:

我們即將使用的網路和上面示意圖中的網路很相似:

閱讀上面的代碼的時候,你會注意到teacher forcing(教師強制)這個概念。教師強制是一個極為重要的機制,它可以使網路更快地訓練。這篇文章更好地解釋了這一點。

圖片來源:xkcd

【譯者注】圖中的對話為:甲:「這就是你的機器學習系統?」乙:「是呀!你把數據投入到這一大堆線性代數,然後從另一邊收集答案」甲:「如果答案不對會怎麼樣?」乙:「那就攪拌這堆東西直到答案開始變得看起來是對的。」

你也許好奇——我是怎麼想到這些結構的。我從可公開訪問的例子開始,然後進行了很多試驗。上面的xkcd漫畫真的是這一過程的最佳描述。你將注意到我的損失函數是稀疏分類交叉熵而不是分類交叉熵,因為這允許我將整數作為預測的目標,而不是one-hot編碼,這樣更省內存。

訓練模型

訓練模型的代碼相當直截了當,調用我們定義的模型對象的擬合(fit)方法。我們傳遞了一些額外的參數,例如日誌回調、epoch數目、batch尺寸。

下面是我們訓練模型所調用的代碼,以及顯示代碼輸出的markdown文件。

我在AWS p3.2xlarge實例上訓練了這個模型,訓練7個epoch大概花了35分鐘。在生產環境中,我大概會讓模型訓練更長的事件,並利用額外的回調提前停止訓練或動態調整學習率。不過,我發現上面概述的訓練過程對一個最小可用產品而言已經足夠了。

使用更高級的學習率規劃和架構增強可以帶來顯著的提升,文末的「下一步」一節討論了這方面的內容。

為進行推斷預備模型

圖片來源:wired

為進行推斷(預測)預備模型,我們需要重新組織模型(保持訓練好的權重不變),以便解碼器使用上一個預測作為輸入,而不是接受上一時步的正確答案,如下圖所示:

如果你不明白上面一段話,請複習下這篇教程。使用下面的代碼重組解碼器(我寫了很詳見的注釋,以方便你閱讀代碼):

用於預測的更多輔助函數在這個文件中定義。特別地,generateissuetitle(生成工單標題)方法定義了預測工單標題的機制。在這篇教程中,我使用了貪婪下一個最可能單詞方法(greedy next-most-probable word approach)。我會建議你仔細閱讀代碼以完全理解預測是如何做出的。

模型用途演示

圖片來源:starwars.com

1. 開箱即用,總結文本,生成非常出色的demo

在典型的分類和回歸模型中,人們對預測本身不怎麼感興趣,除非附加上大量的可視化和謊言。然而,如果你訓練模型總結自然語言中的文本,預測本身是一個很好的展示方式,向受眾展示你學會了提取有意義的領域特徵——如果同時預測較准,那這看起來就很神奇了。

總結文本的能力本身就可以成為一個有用的數據產品,例如,為用戶自動建議標題。然而,這可能不是這個模型最有用的部分。我們將在下面的小節討論這個模型的其他能力。

文本總結的一些例子(更多例子看這裡):

矩形框內的為預測

2. 提取特徵用於大量任務

回顧下序列到序列模型,它有兩個組件:編碼器和解碼器。編碼器「編碼」信息或從文本中提取特徵,並將信息轉呈解碼器,解碼器接受這些信息,嘗試生成清晰的自然語言總結。

這篇教程中的編碼器為每個工單生成了一個300維向量。這一向量可用於許多機器學習任務,例如:

需要注意的是,從正文文本提取特徵有很多方法,並不保證對某項特定任務而言,這些特徵比用其他方法提取的特徵要優越。我發現將使用這一方法的特徵與其他特徵組合常常有所幫助。然而,我想重點突出的是你通過訓練總結文本的模型免費獲得了這些作為副作用的特徵!

下面展示了實做上面的概念的例子,相似工單建議。由於編碼器提供描述每個工單的300維向量,直截了當的做法就是尋找每個工單在向量空間中的最近鄰。使用annoy包,我在為一些工單生成標題時還展示了最近鄰:

上面兩個例子展示了編碼器提取的特徵如何用於查找語義相似的工單。例如,你可以使用這些特徵給推薦系統或上面提到的其他機器學習任務提供信息。

更激動人心的是,這一切並不僅限於工單。我們可以應用相同的方法基於README文件或代碼的注釋和文檔字元串生成倉庫標題。有無盡的可能性。我在附錄中提供了一些數據,你甚至可以利用這些數據自行進行嘗試。

模型評估

評估文本總結模型表現的一個較好的方法是使用BLEU分數。這裡有為我們的數據生成BLEU分數的代碼。最近的一篇文章使用一些很不錯的可視化出色地解釋了這一指標。我把這留給讀者作練習。

儘管我沒法在這裡分享我最佳模型的BLEU指標,我可以告訴你,我在本文中分享的模型還有顯著的提升空間。我在下一節下一步中給出了一些提示。

下一步

本文的目標是展示Seq2Seq模型如何用於創建有趣的數據產品。我事實上試驗的模型採用了不同的架構,但基本的思路是一樣的。本文沒有提到的一些有用的改進:

上面的一些改進是更高級的主題,但學起來並不難。想要學習更多內容的讀者,可以參閱下面的資源一節。

重現我的環境:Nvidia-Docker

為了方便讀者嘗試運行我的代碼,我將所有的依賴打包進了一個Nvidia-Docker容器(使用Nvidia-Docker v1.0,而不是2.0)。不熟悉Docker的讀者可以參考我的另一篇文章。本教程所用的docker鏡像發布在Dockerhub上。

資源

感謝

此外,感謝審閱本文並給出寶貴意見的David Shinn、Robert Chang、Zachary Deane-Mayer。

聯繫我

我希望你喜歡這篇文章。歡迎在Twitter、Linkedin、Github上聯繫我。

注意和聲明

本文中包含的任何想法和意見都是我個人的想法和意見。這裡呈現的任何想法和技術並不預示Github未來的產品。

附錄——【可選】如何從頭自行獲取Github工單數據

圖片來源:Jim Holmes,許可:CC BY 2.0

獲取這些數據最簡單的方法是使用BigQuery。當你註冊Google Cloud賬戶時,你會獲贈300美元的額度,遠超獲取本文所用數據所需的金額。如果有機敏的讀者找到更容易的獲取數據的方法,請留言。

我們將仔細參照這個鏈接中的步驟。如果你迷失了方向,可以參考鏈接的文檔。不過我下面將提供具體的步驟:

如果你還沒有Google項目:

確保你創建的項目連接到你的支付賬戶,以便利用300美元新用戶免費額度(獲取本文的數據花了我4美元)。

完成上述步驟後,你可以進一步請求數據。你可以點擊此鏈接查看請求控制台。在這個頁面,你可以選中右上角的「Query Table」(請求表)按鈕。接著你會看到類似這樣的頁面:

BigQuery 請求編輯器

接著,你需要點擊「Show Options」(顯示選型)按鈕並確保「Legacy SQL」複選框處於未選中狀態(默認選中)。

你會注意到左手邊有項目的名稱,例如GithubIssues。點擊旁邊的藍色下拉菜單(如下圖所示),並選中「Create new dataset」(創建新數據集),為數據集提供一個名字。你會注意到我將數據集起名為github_issues。之後你會用到這個名稱。

現在,我們可以獲取我們想要的數據了!複製粘貼下面的SQL請求到控制台,並點擊紅色的「Run Query」(運行請求)按鈕。作為替代,你也可以點擊這個鏈接。歡迎研究下面的SQL,我們簡單地收集工單的標題和正文,並進行一些數據清洗工作。

上述請求將返回大約5百萬行數據,包含從Github工單提取的信息。你也可以從本文的Github倉庫獲取上面的SQL代碼文件。

請求完成後,你需要將其保存到Google Cloud Bucket,這是一個和Amazon S3類似的服務。為此,你需要點擊請求結果上方的「Save as Table」(作為表保存)按鈕,點擊後,會顯示如下的窗口:

選中「destination dataset」(目標數據集,也就是你之前創建的數據集),然後點擊「OK」。在左面板訪問你剛創建的表,選中藍色的下拉菜單,再選擇「Export Table」(導出表),你會看到這樣的一個對話框:

如果你還沒有創建bucket,你需要點擊「View Files」(查看文件)鏈接以創建bucket。Google Cloud Storage的URL語法如下:

然而,你需要添加一個通配符,因為數據太大了,無法存儲進單個csv文件中(總共大約有3GB的數據)。比如,我的(私有)bucket的名字是hamel_githubissues,因此我在這裡填寫的路徑是:

一旦你正確進行了上述操作,你會看到表名附近顯示…extracting信息。這隻需要若干分鐘。當這一過程完成後,你可以訪問你的Google Cloud Storage bucket查看你的文件(你會看到類似如下的頁面):

一旦你下載了數據,你將具備完成本教程其他部分所需的一切數據。你可以直接點擊每個文件下載數據,或使用Google Cloud Storage CLI。你甚至可以使用pandas完成整個請求過程。說實話,我決定直接使用用戶界面,因為我平時很少用到Google Cloud。

原文地址:https://towardsdatascience.com/how-to-create-data-products-that-are-magical-using-sequence-to-sequence-models-703f86a231f8


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

進了一家門,也未必是一家人,要看看這家門裡的人是否真的把你當成一家人
趁假期與好書相遇

TAG:全球大搜羅 |