PaddleHub 1.0正式釋出: 一鍵模型載入,十行程式碼完成遷移學習

飛槳PaddlePaddle發表於2019-07-10

飛槳(PaddlePaddle)核心框架Paddle Fluid v1.5已經發布,而作為其關鍵工具,用來遷移學習的PaddleHub也進行了全面更新,正式釋出了1.0版本。

全新的PaddleHub模型和任務更加豐富,為使用者提供了覆蓋文字影像影片三大領域八大任務的40+預訓練模型,同時還在飛槳官網上開闢了PaddleHub的網頁。

本文將對PaddleHub及其更新做更加全面的介紹。

PaddleHub是什麼

深度學習模型的價值在AI時代不斷增大。要想得到一個高質量的深度學習模型,離不開4個要素,優秀的演算法、充足的算力、豐富的資料以及專家知識。大家在深度學習中常常遇到以下問題:

  • 一些研究領域只有少量標註資料,且資料標註成本較高,不足以訓練一個足夠魯棒的神經網路

  • 大規模神經網路的訓練依賴於大量的計算資源,這對於一般使用者而言難以實現

  • 應對於普適化需求的模型,在特定應用上表現不盡如人意

PaddleHub就是為了解決對深度學習模型的需求而開發的工具。

它基於飛槳領先的核心框架,精選效果優秀的演算法,提供了百億級大資料訓練的預訓練模型,方便使用者不用花費大量精力從頭開始訓練一個模型。PaddleHub可以便捷地獲取這些預訓練模型,完成模型的管理和一鍵預測。

配合使用Fine-tune API,可以基於大規模預訓練模型快速完成遷移學習,讓預訓練模型能更好地服務於使用者特定場景的應用。

PaddleHub有什麼特色

1、 透過PaddleHub,開發者可以便捷地獲取飛槳生態下的所有預訓練模型,涵蓋了影像分類目標檢測詞法分析、語義模型、情感分析、語言模型、影片分類、影像生成八類主流模型40餘個,如圖1 所示。飛槳還發布了PaddleHub的官方網頁,對各個預訓練模型的應用提供了詳實的介紹。

PaddleHub 1.0正式釋出: 一鍵模型載入,十行程式碼完成遷移學習

圖1 PaddleHub提供了40+官方預訓練模型

2、PaddleHub引入了模型即軟體的概念,透過Python API或者命令列工具,一鍵完成預訓練模型地預測。此外還借鑑了Anaconda和pip軟體包管理的理念設計了一套命令列介面。

深度學習時代,模型發展的趨勢會逐漸向軟體工程靠攏;未來模型可以當作一個可執行程式,一鍵預測;也可以是第三方庫,透過模型插拔的方式提高開發者的開發效率。

同時模型會有版本的概念,透過不斷迭代升級的方式提升我們模型的效果。透過命令列工具,可以方便快捷的完成模型的搜尋、下載、安裝、預測等功能,對應的關鍵的命令分別是search,download,install,run等。

如以下示例,在安裝完成飛槳和PaddleHub以後(具體安裝方法見後文示例),使用詞法分析模型LAC,可以一鍵實現分詞。

$ hub run lac --input_text "今天是個好日子"
[{'word': ['今天', '是', '個', '好日子'], 'tag': ['TIME', 'v', 'q', 'n']}]

再如以下示例所示,是一個目標檢測的例子,透過hub run 呼叫不同的目標檢測模型,一行即可完成預測,同時也可以快速體驗哪個模型能更符合開發的需求。

$ hub run yolov3_coco2017 --input_path test.jpg 
$ hub run faster_rcnn_coco2017 --input_path test.jpg

PaddleHub 1.0正式釋出: 一鍵模型載入,十行程式碼完成遷移學習

圖2 PaddleHub一鍵完成預訓練模型地預測

3、透過PaddleHub Fine-tune API,結合少量程式碼即可完成大規模預訓練模型的遷移學習。下面一節我們也會全面介紹PaddleHub的API。

PaddleHub API全景

PaddleHub API的全景圖如圖3所示。

為了更好幫助使用者更好的應用預訓練模型,PaddleHub對Fine-tune做了6個層次的抽象。

PaddleHub 1.0正式釋出: 一鍵模型載入,十行程式碼完成遷移學習

圖3 PaddleHub Fine-tune API全景

  • 資料集Dataset:PaddleHub提供多種NLP任務和CV任務的資料集,使用者也可以在自定義資料集上完成Fine-tune。

  • 資料預處理Reader:PaddleHub的資料預處理模組Reader對常見的NLP和CV任務進行了抽象。

  • 預訓練模型Module:Module代表了一個預訓練模型。

  • 最佳化策略Strategy:在PaddleHub中,Strategy類封裝了一系列適用於遷移學習的Fine-tune策略。Strategy包含了對預訓練引數使用什麼學習率變化策略,使用哪種型別的最佳化器,使用什麼型別的正則化等。

  • 執行配置 RunConfig:在PaddleHub中,RunConfig代表了在對Task進行Fine-tune時的執行配置。包括執行的epoch次數、batch的大小、是否使用GPU訓練等。

  • 遷移任務Task:PaddleHub預置了常見任務的Task。Task代表了一個Fine-tune的任務。任務中包含了執行該任務相關的Program、資料Reader、執行配置等內容。每種Task都有自己特有的應用場景以及提供了對應的度量指標,用於適應使用者的不同需求。預置的任務型別包括影像分類文字分類、序列分類和多標籤分類各類任務。

PaddleHub還支援使用者可以透過繼承BasicTask來實現自己的任務。

PaddleHub封裝了finetune、eval、finetune_and_eval、predict等直觀的基礎介面,讓開發者更方便完成模型的遷移和應用。

如何快速開始

PaddleHub 1.0正式釋出: 一鍵模型載入,十行程式碼完成遷移學習

圖4 PaddleHub Fine-tune API使用

接下來本文結合實際案例,講述如何快速使用PaddleHub實現十行程式碼完成文字分類遷移。

場景是標註資料不多中文文字分類場景,如何提高分類的精度和模型的泛化能力。

這裡的方案是藉助ERNIE + PaddleHub Finetune API,除去安裝,只想要5個步驟,10行程式碼即可解決這一問題。

這裡先介紹一下ERNIE,它是百度釋出的知識增強的預訓練模型,透過建模海量資料中的詞、實體及實體關係,學習真實世界的語義知識。

具體來說,ERNIE 模型透過對詞、實體等語義單元的掩碼,使得模型學習完整概念的語義表示。

相較於 BERT 學習原始語言訊號,ERNIE 直接對先驗語義知識單元進行建模,增強了模型語義表示能力。

ERNIE在多個公開的中文資料集上進行了效果驗證,包括語言推斷、語義相似度、命名實體識別、情感分析、問答匹配等自然語言處理各類任務上,均超越了語義表示模型 BERT 的效果。

接下來開始實戰演練PaddleHub。

1. 安裝

$ pip install paddlepaddle  #CPU安裝命令

或者

$ pip install paddlepaddle-gpu # GPU安裝

以上命令是安裝CPU或者GPU版本的飛槳。透過以下命令則可以安裝PaddleHub。

$ pip install paddlehub

另外,PaddleHub內建了深度學習視覺化工具VisualDL的依賴,透過VisualDL,可以很好的對深度學習任務進行視覺化。

2. 選擇預訓練模型

在完成安裝飛槳與PaddleHub,import匯入相應模組後,一行程式碼即可載入預訓練模型。只要1分鐘,你就能得到萬級別GPU小時訓練出來的ERNIE模型。當然也可以支援BERT模型呼叫,只需要更換不同的模型名稱即可。

import paddle.fluid as fluid
import paddlehub as hub
module = hub.Module(name="ernie")
inputs, outputs, program = module.context(trainable=True, max_seq_len=128)

第二步是獲取模型上下文,包括了預訓練模型的輸入Tensor,輸出Tensor還有計算圖。這裡面有個關鍵引數是trainable。如果trainable為True,那麼就是一個fine-tune的任務,預訓練模型的引數會做微調,以更好的適應頂層的應用、如果trainable為False,那麼就預訓練模型引數保持不變,將它當作特徵提取器。對於ERNIE模型而言,不推薦使用特徵提取,一定要透過Finetune的方式才能取得更好的效果。

3. 資料處理

選擇模型後就是進行資料預處理,針對不同的遷移任務做了一系列資料處理的封裝。

dataset = hub.dataset.ChnSentiCorp()
reader = hub.reader.ClassifyReader(
    dataset=dataset,
    vocab_path=module.get_vocab_path(),
    max_seq_len=128)

hub.dataset.ChnSentiCorp() 會自動從網路下載資料集並解壓到使用者目錄下。

4. 策略配置

接下來開始配置Fine-tune時用到的最佳化策略。針對ERNIE與BERT類任務,PaddleHub封裝了適合這一任務的遷移學習最佳化策略AdamWeightDecayStrategy

strategy = hub.AdamWeightDecayStrategy(
    learning_rate=5e-5,
    weight_decay=0.01,
    lr_scheduler="linear_decay",
)

config=hub.RunConfig(use_cuda=True, num_epoch=3,batch_size=32,checkpoint_dir=" ckpt_dir",strategy=strategy)

5. 建立遷移學習任務

組建移學習任務這塊也非常簡單,首先是選擇預訓練的模型輸出,作為我們句子的特徵。

在這裡ERNIE我們選擇pooled_output作為句子的特徵輸出。也可以透過獲取sequence_output來得到詞粒度的特徵,這個特徵般用於序列標註。

pooled_output = outputs["pooled_output"]

# feed_list的Tensor順序不可以調整
feed_list = [
    inputs["input_ids"].name,
    inputs["position_ids"].name,
    inputs["segment_ids"].name,
    inputs["input_mask"].name,
]

cls_task = hub.TextClassifierTask(
    data_reader=reader,
    feature=pooled_output,
    feed_list=feed_list,
    num_classes=dataset.num_labels,
    config=config)

cls_task.finetune_and_eval()

Finetuning API非常智慧,會自動完成評估,儲存最優模型還有自動視覺化的功能。Finetune API訓練過程中會自動對關鍵訓練指標進行打點,啟動程式後執行下面命令

$ visualdl --logdir ckpt_dir/vdllog -t ${HOST_IP}

其中${HOST_IP}為本機IP地址,如本機IP地址為192.168.0.1,用瀏覽器開啟192.168.0.1:8040,其中8040為埠號,即可看到訓練過程中指標的變化情況

6. 模型預測

透過Finetune完成模型訓練後,在對應的ckpt_dir目錄下,會自動儲存驗證集上效果最好的模型。接下來可以按照如下的示例進行預測。

# Data to be prdicted
data = [
    ["這個賓館比較陳舊了,特價的房間也很一般。總體來說一般"], ["交通方便;環境很好;服務態度很好 房間較小"],["還稍微重了點,可能是硬碟大的原故,還要再輕半斤就好了。其他要進一步驗證。貼的幾種膜氣泡較多,用不了多久就要更換了,螢幕膜稍好點,但比沒有要強多了。建議配贈幾張膜讓用使用者自己貼。"],[ "前臺接待太差,酒店有A B樓之分,本人check-in後,前臺未告訴B樓在何處,並且B樓無明顯指示;房間太小,根本不像4星級設施,下次不會再選擇入住此店啦"], ["19天硬碟就罷工了~~~算上運來的一週都沒用上15天~~~可就是不能換了~~~唉~~~~你說這算什麼事呀~~~"]]
index = 0
run_states = cls_task.predict(data=data)
results = [run_state.run_results for run_state in run_states]
for batch_result in results:
    # get predict index
    batch_result = np.argmax(batch_result, axis=2)[0]
    for result in batch_result:
        print("%s\tpredict=%s" % (data[index][0], result))
        index += 1

除了以上的介紹,PaddleHub還在AI Studio和AIBook上提供了IPython NoteBook形式的demo,開發者可以直接在平臺上線上體驗PaddleHub帶來的各種便捷。

此外,AI studio平臺還發布了億元算力支援計劃,提供了“每日執行贈12小時”和“連續5天執行贈48小時”兩種機制共同服務,每天都得能輕鬆獲得! 

該平臺整合算力、教程、 樣例模型、工程開發、線上部署的能力, 乃至比賽平臺,滿足從0基礎學習到技術落地的全生命週期,幫助開發者全面掌握深度學習技術的各方各面。

專案地址:
https://github.com/PaddlePaddle/PaddleHub?fr=gzh

相關文章