Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

機器之心編譯

TensorFlow 和 PyTorch 的框架之爭愈演愈烈。二者各有優缺點,選擇起來需要費一番腦筋。但是,有句話說得好,「小孩子才做選擇,成年人全都要」。為此,來自Petuum Inc 和卡內基梅隆大學的研究者開源了一個通用機器學習包——Texar-PyTorch,結合了 TensorFlow 和 PyTorch 中的許多實用功能與特性。

Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

項目地址:https://github.com/asyml/texar

Texar-PyTorch 對各類不同的機器學習任務有著廣泛的支持,尤其是自然語言處理(NLP)和文本生成任務。 基於其已有的 TensorFlow 版本,Texar-PyTorch 結合了 TensorFlow 和 PyTorch 中的許多實用功能與特性。同時,Texar-PyTorch 具有高度可定製性,提供了不同抽象層級的 API,以方便新手和經驗豐富的用戶。 Texar-PyTorch 將實用的 TensorFlow (TF) 模塊融合進了 PyTorch,顯著增強了 PyTorch 現有的功能。這些模塊包括:

  • 數據:內置常用的預處理、創建批次(batching)、迭代、隨機打亂方法。所有方法均採取最佳實踐,並可以結合緩存與惰性加載達到高效率。該項目也實現了類似 TFRecord 的模塊,以支持複雜類型的大型數據集。
  • 模型模塊:豐富的功能和完美的模塊化的機器學習(ML)模型,比如統一接口的序列模型,包括用於文本生成的解碼器、注意力機制(attention)和 RNN 等。
  • 訓練:開發者基於 TF Estimator 和 keras.Model 的高級 API,設計了更加靈活的訓練模塊。該模塊集模型訓練、評估、預測、TensorBoard 可視化於一體,並能與第三方的超參數調優工具完美結合。

Texar-PyTorch 功能 通過結合 TF 中的最佳特性與 PyTorch 的直觀編程模型,Texar-Pytorch 為構建 ML 應用提供全面支持:

  • 最先進的模型構建模塊—搭建 ML 模型就和搭積木一樣,你可以隨心所欲地替換模型模塊。
  • 簡單而高效的數據處理—豐富的內置數據處理模塊,適用於常見類型的數據集。用戶可以利用簡單的接口實現自定義數據處理模塊,而無需擔心性能問題。
  • 一體化的自定義模型訓練模塊—不用再寫千篇一律的訓練代碼,也不用為了簡潔而犧牲可拓展性。

代碼示例 1 演示了使用 Texar-PyTorch 搭建並訓練用於摘要生成或機器翻譯的條件GPT-2 模型的完整代碼。

Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

代碼示例 1:使用 Texar-PyTorch 搭建並訓練條件 GPT-2 模型 (用於摘要生成等任務)。

為何選擇 Texar?

  • 同時支持 TensorFlow & PyTorch。有時,你無法選擇使用哪個底層框架,而學習新的工具包就和自己編寫一樣費時。現在,使用 Texar,你可以在這兩個框架中使用幾乎相同的接口,只需對代碼進行最小限度的更改。兩個版本的工具包還能共享下載的預訓練模型權重。
  • 一個工具包,覆蓋所有自然語言處理任務。Texar 提供了自然語言處理任務(尤其是文本生成任務)中常用的大多數神經網絡模型。圖 1 給出了 Texar 各模塊的簡介。Texar 內置了最先進的預訓練模型,同時還包括了數據處理、建模、訓練和評估所需的各類實用方法。一切盡在 Texar 掌握中。
  • 方便新手和行家。
    無論你是剛剛入門深度學習,還是一名經驗豐富的研究員,Texar 都適合你。Texar 提供最先進的內置組件,同時具有足夠的靈活性可以自定義。
Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

圖 1:Texar 為數據處理、模型架構、損失函數、訓練、評估以及一系列先進的預訓練 ML/NLP 模型 (例如,BERT, GPT-2 等) 提供了全套的模塊。

接下來將更詳細地介紹 Texar-PyTorch 中建模、數據處理和模型訓練這三個關鍵部分。

建模模塊

如圖 1 所示,Texar-Pytorch 提供了全套的 ML 模塊集。通過精心設計的界面,用戶可以通過組合模塊自由地構建任意模型。 下面的實例展示瞭如何靈活運用模塊接口,以滿足不同的機器學習算法的需要,如最大似然學習和對抗性學習。此外,Texar 為具有不同專業知識的用戶提供多個抽象層級的接口。例如:

  • 通過簡單地設置解碼器參數 decoding_strategy=「train_greedy」,就可以方便地調用常用的解碼策略,例如,teacher-forcing 方法。
  • 另一方面,用戶可以使用 Helper 類進行更復雜的解碼策略,例如,用 GumbelSoftmaxHelper 在對抗學習中使用 Gumbel softmax 解碼。經驗豐富的用戶可以進一步定義新的 Helper 類來定製任意解碼策略。
Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

代碼示例 2:構建預訓練的 GPT-2 語言模型,使用最大似然學習和對抗學習 (使用 BERT 作為判別器) 進行微調。

總之,使用 Texar-PyTorch 建模具有以下主要優勢:

  • 完美的模塊化—通過簡單地插入/交換幾個模塊,就可以在不同的使用場景之間進行切換。
  • 多層級的接口—為新手用戶提供高層級的簡單 API,為專家用戶提供底層級的自定義 API。
  • 內置最先進的預訓練模塊—BERT, GPT-2, RoBERTa, XLNet 等,用於文本編碼、分類、序列標記和生成等任務。

數據

Texar-Pytorch 的數據模塊旨在為任意 ML 和 NLP 任務提供簡單、高效

可自定義的數據處理。結合 Tensorflow tf.data 中的最佳實踐,這些模塊極大地增強了 Pytorch 內置的 DataLoader 模塊:

  • 解耦單個實例預處理和批次構建 – 以獲得更清晰的程序邏輯和更簡便的自定義。
  • 基於緩衝區的隨機打亂、緩存和惰性加載 – 以提高效率。
  • 通用的數據集迭代器 – 無需額外的用戶配置。
  • 更直觀的 APIs – 在項目中獲得最佳實踐不需要任何專業知識。

Texar-PyTorch 內置數據模塊

對於常見類型的數據集,Texar-Pytorch 已經包含了可以使用的模塊,如下圖 2 所示。

Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

圖 2:Texar-Pytorch 內置大量 ML 和 NLP 任務的數據模塊。 特別的是,RecordData 相當於 TensorFlow 著名的 TFRecordData,後者以二進制格式讀取文件,從而允許從文本到圖像的任意數據類型。太酷了,不是嗎?更重要的是 – 它的使用方式與 TFRecordData 類似。下面的例子說明了一切。

假設你想運行一個圖像描述模型。每個數據示例通常包含一個圖像、一個描述和其他元信息。如何使用 Texar-Pytorch 如下。

Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

代碼示例 3:使用 Texar-Pytorch RecordData 加載複雜的圖像標題數據。

創建自定義數據集 用戶可以自定義如何處理數據實例和創建批次,而 Texar 將為你處理緩存、惰性處理和迭代。下面的示例說明了這一點。

Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

代碼示例 4:對輸入文本執行 BPE 分詞的自定義數據集。

訓練器 每當開始一個新的項目時,你是否厭煩了一次又一次地編寫訓練和評估代碼?你是否需要一個 API 來實現自動化訓練,並配備日誌記錄、保存中間模型、可視化和超參數調優功能? 你是否希望 API 靈活適應你的非傳統算法,例如,在對抗學習中交替優化多個損失函數?Texar 訓練器(Executor)是你的不二選擇。 Executor 與廣泛使用的 TF Estimator 和 tf.keras.Model 類似,但是更加輕量級,更易自定義。 為了演示 Executor 的功能,開發者展示了一般的訓練代碼,並與 Executor 作對比: 假設我們希望在項目中具有以下功能:

  • 每隔 logging_step 次迭代,在命令行、日誌文件和 Tensorboard 上記錄進度。
  • 每隔`validate_steps`次迭代在驗證集上評估模型,使用 BLEU 來評估模型性能。
  • 如果驗證結果有所改善,保存當前模型權重。如果連續`patience`次驗證結果都沒有改善,那麼載入之前存儲的模型權重,並調整學習率。

上面的步驟描述了一個很常見的訓練循環。以下是一般的訓練循環的實例:

Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

代碼示例 5:典型的手寫 train-eval 循環。

代碼非常冗長。當你需要添加或更改一些功能時,事情會變得更加複雜。現在,如果使用 Executors,該代碼將是什麼樣子?

Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

代碼示例 6:使用 Executor 的相同 train-eval 循環。

Executor 在命令行的輸出如下:

Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

在這裡,你可以看到驗證 BLEU 分數是根據已有結果不斷更新的。這要歸功於 Executor 流處理度量,它允許對度量值進行增量計算。無需等到最後才能看到驗證集的結果!

正如我們所見,使用 Executor 的代碼結構化更強,可讀性更高。它還具有更強的可擴展性:

問:如果我們還想在每個週期結束後在驗證集上評估呢?

答:只需將` validate_every` 更改為:

Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

問:如果我們想在調整學習率`early_stop_patience`次後提前停止訓練呢?

答:

只需將`action_on_plateau`改為:

Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

問:如果我們還想測量單詞級別的損失呢?

答:只需在`valid_metrics`中添加一個新的度量即可:

Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

問:如果我們想要進行超參數調優並多次訓練模型,該怎麼辦?

:只需為你想要測試的每一組超參數創建 Executor。由於 Executor 負責模型創建之外的所有進程,所以不需要擔心消耗額外的內存或意外地保留以前運行的對象。這是一個在 Hyperopt 中使用 Executor 的示例。

問:如果在每個週期結束後,我們想把當前的模型權重上傳到服務器,發送一封電子郵件彙報進度,然後出門去遛狗,該如何操作?

:很奇怪,但沒問題。只需在你選擇的條件下注冊一個自定義操作,並做你想做的任何事情:

Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性

Texar-TF 與 Texar-PyTorch 互相切換

如果你是 Texar-TF 用戶,毫不費力就可切換到 Texar-PyTorch。相比 Texar TensorFlow,Texar PyTorch 具有幾乎相同的接口,可以輕鬆切換底層框架。

儘管有類似的接口,但開發者也遵循每個框架的編碼風格,這樣你無需學習一種新的子語言。為此,他們更改了一些較低層級的可擴展接口,以便緊密匹配對應框架的原生設計。大多數更改都在數據和訓練器模塊中,但正如你所見,它們非常容易上手。 開始使用 Texar-PyTorch

請訪問該項目的 GitHub repository,並按照安裝說明進行操作。實用的資源包括:

  • 文檔:該項目對每個模塊和功能都有詳細的文檔。
  • 鏈接:https://texar-pytorch.readthedocs.io/en/latest/
  • 示例:開發者強烈建議我們查看項目中的示例,以瞭解在實踐中如何使用 Texar。這些示例都有明確的文檔記錄,涵蓋了豐富的用例。
  • 鏈接:https://github.com/asyml/texar-pytorch/blob/master/examples/README.md
  • ASYML 工具庫:查找到所有 Texar 資源的快速鏈接。
  • 鏈接:https://asyml.io/


分享到:


相關文章: