智慧科技探索

我們目前擷取人臉使用的開源套件為 yolov3。

Yolo 系列 (You only look once, Yolo) 是關於物件偵測 (object detection) 的類神經網路演算法,以小眾架構 darknet 實作,實作該架構的作者 Joseph Redmon 沒有用到任何著名深度學習框架,輕量、依賴少、演算法高效率,在工業應用領域很有價值,例如行人偵測、工業影像偵測等等。

Yolo 最大的特色是直接 end-to-end 做物件偵測,利用整張圖片作為神經網路的輸入,直接預測 bounding box 坐標位置、bounding box 含物體的 confidence 和物體所屬的類別。




(1) Yolov3 的基底網路為 Darknet-53,有 53 層,隨著網絡層數不斷加深 (數量級從 20~30 層到 ~50 層),採用了一般類神經網路加深時常用的 ResNet 結構來解決梯度問題。

(2) 使用多層級預測架構以提升小物體預測能力,特徵層從單層 13x13 變成了多層 13x13、26x26 和 52x52,單層預測 5 種 bounding box 變成每層 3 種 bounding box (共 9 種),詳見網路結構圖。使用 FPN 的架構可以讓低層較佳的目標位置和高層較佳的語義特徵融合,並且在不同特徵層獨立進行預測,使得小物體檢測改善效果十分明顯。

使用 MobilenetV2 實現人臉的辨識

MobileNetV2是以第一代為基礎來改善,延續了第一代透過深度可分離卷積(Depthwise Separable Convolution)的方式,來達到壓縮模型的目的,減少參數並提升運算速度,還新增了2項特性,層間的線性轉換方式(Linear bottleneck),以及Bottleneck之間的捷徑連接(Shortcut connections)。

MobileNetV2在深度可分離卷積方法前,增加了1X1的擴張層,來增加Channel數量,進而製造更多特徵,最後輸出時則不用線性整流單元(Rectified Linear Unit,ReLU)函數,為了避免特徵被破壞,改採用線性轉換的方式。 另一個特性則是,MobileNetV2與傳統的ResNet不同,ResNet是先壓縮維度,透過卷積萃取特徵,最後再擴張,而MobileNetV2則是相反的結構(Inverted residuals),先擴張,萃取特徵,最後再壓縮,因此,捷徑連接的是維度縮減後的結果。

MobileNetV2在深度可分離卷積方法前,增加了1X1的擴張層,來增加Channel數量,進而製造更多特徵,最後輸出時則不用線性整流單元(Rectified Linear Unit,ReLU)函數,為了避免特徵被破壞,改採用線性轉換的方式。 另一個特性則是,MobileNetV2與傳統的ResNet不同,ResNet是先壓縮維度,透過卷積萃取特徵,最後再擴張,而MobileNetV2則是相反的結構(Inverted residuals),先擴張,萃取特徵,最後再壓縮,因此,捷徑連接的是維度縮減後的結果。


(1)首先由 Yolo 將影像中的人臉擷取出來,並儲存其照片

(2)再使用 MoblieNetv2 對這張照片作特徵的提取,將其格式轉換成 embedding

(3)最後將得到的 embedding 由 PLDA 對其作分類,判斷是哪位已註冊的成員或是未註冊者


參考資料:
Yolov3 論文:YOLOv3: An Incremental Improvement
Yolov3 源碼:https://github.com/AlexeyAB/darknet
ModlieNet 論文:MobileNetV2: Inverted Residuals and Linear Bottlenecks
PLDA 論文Probabilistic Linear Discriminant Analysis

1.收集資料:

(1) 原始資料集 - WIDER FACE dataset
images : 12,880
faces : 159,420
(2) 以 dlib 擷取 - WIDER FACE dataset
training images : 18,880
faces : 10,921
2.YOLO V3 tiny - 訓練參數
width : 256
height : 256
batch size : 64
steps : 220,000
3.YOLO V3 tiny - results
FPS : 50
擷取結果 :

3.MobileNet V2 - 訓練參數
(1) 訓練集 - CASIA WebFACE
以 YOLO 擷取人臉
160*160*3
圖片 : 462,120張
(2) 參數設定
epoch : 150
batch size : 32
optimizer : Adam
learning rate :
( epoch : 0, learning rate : 0.001 )
( epoch : 100, learning rate : 0.0001 )
4.訓練結果
LFW 正確率:0.87

試玩程式說明:
此程式需要先用 Webcam 拍五張您的照片 (五個角度:正面、稍微偏右、稍微偏左、稍微朝上、稍微朝下),然後上傳到我們的 Server 進行臉部資料分析與建檔,接著您可以透過 Webcam 拍攝其他人或您自己的照片來跟建檔的臉部資料進行比對,我們的程式可以分辨是否為同一人。

按下「試玩臉部辨識」按鈕,開始試玩:


• 語音合成
隨著科技發展,人機互動的情況已經越來越普及,像是Google小姐、智能導航、有聲書讀物等等,接已還繞在我們生活,而這些應用當中,語音合技術就扮演了相當重要的角色。

雖然語音合成的產品眾多,且能產生中文語音的技術也已成熟,但合成的中文語音大多數為『大陸腔調中文語音』,此結果的原因主要是因為可大量取得的中文訓練語料,皆由大陸腔調的語者錄製而成。因此我們希望透過不同的訓練資料、不同的訓練方式,用現有的中文訓練語料,合成好的語音品質、接近人類自然語音的『台灣腔調中文語音』。

一個完整的語音合成系統(Text-to-Speech),是由合成器與聲碼器所組成,合成器是將 我們輸入的文字輸出一個梅爾頻譜圖,聲碼器則將梅爾頻譜圖作為輸入,最後輸出一 個語音訊號,而目前我們所使用的合成器模型為Google提出的Tacotron-2,聲碼器模 型為ESPnet團隊開發的Parallel WaveGAN,兩者皆為可訓練的神經網路。

在合成器Tacotron-2,先使用訓練資料Biaobei(單一女性語者,12小時,大陸腔中文,3-5秒)加上將Biaobei的資料分割出短句(單一女性語者,37分鐘,大陸腔中文,0-1秒)加入資料集中當成預訓練,接著使用部份經過人工處理的NER(單一女性語者,2.2小時,台灣腔中文,5-8秒)加上將NER資料分割出短句(單一女性語者,12分鐘,台灣中文腔,0-1秒)繼續訓練。

• -語音辨識
現今語音辨識已經成為我們生活中常見的應用,並且可以帶來許多便利,例如 Siri、Google Assistant,我們可以透過講話使人工智慧 (AI) 來為我們做事。目前我們使用的開源套件為 ESPnet,它是一個專門處理語音任務的工具,主要是用 pytorch撰寫,並結合 kaldi進行前處 理。使用深度學習的方法替代了傳統自動語音辨識的訓練方式,用單個模型替換傳統自動語音 辨識的多個模塊,移除了對語音處理的方法使用,包含對音檔文本的強制對齊 。

傳統語音識別可由三個部分組成,聲學模型、詞典、語言模型,聲學模型通常代表的是我們說話的聲音,而一個詞可以分為多個音節組成,還需要詞典提供文字對應的音節,因此我們訓練聲學模型和詞典可以知道文字該對應哪些音節,擁有聲學模型後,語言模型包含了各個詞彙之間順序的機率大小,可以幫助我們知道怎樣排序詞彙可以更加通順,而其中的聲學模型和語言模型是分別訓練的,各自有各自的目標函數,由於各個模塊間不能互相取長補短,往往也使得最後所訓練出的網絡不能達到最優化。
• 語音合成
語音合成架構由合成器與聲碼器組成,合成器使用的是Tacotron-2模型,聲碼器使用 的是Parallel WaveGAN模型。以下將各別簡單介紹。

Tacotron-2由Google Brain於2018年提出,模型主要由 Encoder、Location Sensitive Attention、Decoder構成。資料進行訓練前必須做前處理,中文文本會經過轉換得到 漢語拼音,聲音訊號也會截取出梅爾頻譜圖。在訓練過程,文本作為Encoder的輸入 ,梅爾頻譜圖作為Decoder的輸入。整個神經網路由多層Convolution、LSTM、Fully Connected組成,透過對文字編碼、將與之成對的梅爾頻譜圖解碼,一次解碼出一個 frame,直至Stop token機制觸發,梅爾頻譜圖則產生完畢,如下圖一。

產生的梅爾頻譜圖透過聲碼器產生聲音訊號,這邊使用可訓練的神經網路Parallel WaveGAN代替演算法Griffin-Lim,藉此提升合成的語音品質。Parallel WaveGAN是 一個生成對抗網路,由一個Generator(這邊使用Waveglow)及一個Discriminator兩個 網路來生成語音。輸入為聲音訊號擷取出的梅爾頻譜圖以及高斯分佈所產生的random noise經由Generator生成出語音檔。而生成出的語音檔會與ground truth語音檔作為 Discriminator的輸入,並透過最小化Adversarial loss以及計算STFT loss來訓練 Generator網路生成出語音檔的品質,以及最小化Discriminator loss來訓練 Discriminator判別語音檔為真或假的能力進而加強Generator所生成因檔的品質,如下 圖二。

圖一、Tacotron-2模型架構(自行繪製)

圖二、Parallel WaveGAN(參考原始論文圖)

參考資料: Tacotron-2論文: https://arxiv.org/pdf/1712.05884.pdf
Tacotron-2源碼: https://github.com/NVIDIA/tacotron2
Parallel WaveGAN論文: https://arxiv.org/pdf/1910.11480.pdf
Parallel WaveGAN源碼: https://github.com/kan-bayashi/ParallelWaveGAN

• 語音辨識
目前使用的模型為混合 CTC-Conformer 的 End-to-End 架構。 在連續性時序分類( Temporal Classification, CTC )的訓練前,不需要將每個音框強制對齊到 label,因此 CTC 適用於輸入特徵與輸出標籤之間關係不確定的時間序列問題。

Conformer 為合併Transformer架構以及CNN module的架構,此作法是因為Transformer中 擅長在全域(global)的交互作用下抓取資訊,而CNN對於鄰近的(local)區域下有較好的效果, 因此合併這兩個架構而得到Conformer。

混合CTC-Conformer架構中,CTC以及Transformer Decoder會共享Conformer Encoder,並 且會結合CTC以及Transformer Decoder的loss function進行參數更新。網路架構如下圖三


參考資料: Conformer : https://arxiv.org/pdf/2005.08100.pdf
Improving Transformer-based End-to-End Speech Recognition withConnectionist Temporal Classification and Language Model Integration: https://www.isca-speech.org/archive/Interspeech_2019/pdfs/1938.pdf
ESPnet: https://github.com/espnet/espnet
• 語音辨識
語音合成的架構由合成器Tacotron-2與聲碼器Parallel WaveGAN組成 以下將簡單介紹兩個模型的訓練資料及訓練方式,訓練資料參考表1。

在合成器Tacotron-2方面,使用Biaobei作為預訓練的訓練資料,為大陸腔中文,由單一女性語者錄製,而為了生成出品質較好的短音檔加入由資料集切割出的短語音檔加入資料一併訓練,總時長約12小時加上37分鐘,每筆音檔由5~7秒以及0~1秒組成,共11112筆音檔,接著使用NER的部份資料集繼續訓練,只使用部份資料的原因,第一原因是此為多語者資料集,容易導致訓練出來的合成品質較差,第二則是因為此資料集的每筆音檔皆為30秒,較長的音檔對於模型不易訓練,因此利用人工方式對音檔進行裁切,並對文本內容再次校正對齊,以致能產生的新資料量有限,這也是導致使用預訓練方式的原因。經過處理後並實際使用的資料為台灣腔中文,單一女性語者,總時長為2.5小時,每筆音檔約略8~10秒,前面提到為了生成出品質叫好的短音檔,將處理後的台灣腔中文資料在細切割出短音檔,共1870筆音檔。整體的訓練時間為2~3天。

在聲碼器Parallel WaveGAN的部份,是直接使用Biaobei資料集,為大陸腔中文,由 單一女性語者錄製,共10000筆音檔來做訓練。

表1、模型使用的資料集與訓練方式


• 語音合成
我們使用此架構自行訓練中文語音模型,使用 NER、Aishell 及科技大擂台做為訓練資料,約 221 小時,共85,106筆音檔(如表2)。

目前有兩個測試集文本,其中一個測試集為FSRC2018這個比賽所提供的測試集。

另一個測試集為自行錄製的音檔,三位語者,約0.75小時,共1008筆音檔。測試集文本內容 為中山無人書店聊天機器人中使用者常用的語句 (如表3)。

目前模型準確率在這兩個測試集下可以達到88.8%以及80.9% (如表4、5)。

準確率為( 1 - CER ) %,CER (Character Error Rate) 計算方式為 (辨認錯誤的中文字數量 (插入+刪除+替換) / 答案的總中文字數量 * 100%。

表2、

表3、

表4、

表5、

• 語音辨識

試玩程式說明:
此 Web 程式可開啟麥克風進行錄音,錄完音後,按下 "Recognize" 按鈕,即可將語音 (中文) 轉換成文字內容。

按下「試玩語音辨識」按鈕,開始試玩:



• 語音合成
此網頁可進行語音合成。在『請輸入文字』處,輸入想要合成的中文文字,按下"合成"按鈕,即可將中文文字合成中文語音。播放音檔的右邊處,可下載此合成音檔。

電腦和人類之間互動的方式,隨著時代進步越趨於自動化、智慧化,因而逐漸發展出以模擬人類對話情境,取代既有人力的對話系統、聊天機器人,來解決商業上或其他領域上的任務。

如 Google 的 dialogflow、Facebook 的 wit.ai、Microsoft 的 LUIS,都有推出類似的對話系統平台,提供使用者在上面建立聊天機器人,但如果你想對你對話系統的訓練資料,做客制化的訓練模型或其他相關的更動,是沒有辦法辦到的,對於開發者來說靈活度不高,因此我們找了許多軟體或套件,最後選擇了 Rasa NLU 和 Rasa Core,功能成熟度高、架構完整性高、也能很好的整合到其他系統上,也因為它在 Github 上關於對話系統的開源專案,是最多人在關注的。

Rasa NLU 以及 Rasa Core 此兩個工具,是以機器學習 (Machine Learning) 的方式為基礎來建構對話系統的開源套件,Rasa NLU用以將使用者輸入的句子解析,找出句子的意圖、辨識句子中有提到的實體/對象,讓後續對話系統能以此為基礎,正確的回覆使用者。而Rasa Core 則是整個對話系統的核心,紀錄整個對話過程、預測並決定聊天機器人下一個該採取的動作/回覆應該是什麼,與使用者對談互動。

目的希望能提供儘管不是此領域、但有興趣開發實作聊天機器人的使用者們,能夠透過上述工具/套件來踏出第一步,建構自己的聊天機器人!

Rasa NLU:
為自然語言理解的模組,裡面結合了許多可以處理自然語言的套件和機器學習的函式庫,透過將這些個別處理自然語言不同部份的功能,依需要加入到 pipeline 當中,來解析輸入的句子,得到我們所需要的使用者意圖、關鍵詞/實體和其他資訊。

Rasa Core:
為對話管理的模組,主要在建構聊天機器人,為整個形成對話系統的關鍵。有別於一般對話系統,以建立 state machine 的方式 (if/else),來達成機器人回覆內容或採取動作的改變,Rasa Core 是以故事 (stories) 當作其訓練資料,用來模擬真實對話的情境,每則故事當中都記錄了使用者輸入怎樣的意圖時,機器人該採取怎樣的動作,也就是對話一問一答的流程。所以在 Rasa Core 的部分會藉由 Tracker 所記錄的前幾次所採取的動作、目前的對話流程、得到的使用者意圖和關鍵詞/實體,把所有這些資訊傳送到 Policy 的部分,轉成特徵向量以單層的 LSTM,來訓練一個 Keras policy model,會得到所有動作的機率分布,便可以拿來預測機器人最有可能的下一個動作是什麼。

架構圖:

         ref : https://arxiv.org/abs/1712.05181

  1. 使用者輸入的句子傳輸到 Rasa NLU 解析器 (Interpreter),辨識出意圖和提取出實體,或其他資訊。
  2. Rasa Core 部份裡面的追蹤器 (Tracker) 會去記錄使用者狀態和輸入進來的句子中的資訊,以及整個對話流程。
  3. 政策 (Policy) 的部分,會去接收追蹤器 (Tracker) 中當前對話流程所擁有的資訊,轉成特徵向量來訓練一個機率模型,回傳各個動作的機率後,依此來預測。
  4. 選取機率最大的動作 (Action),作為對話系統回覆使用者的下一個動作。
  5. 將選定的動作記錄到追蹤器 (Tracker) 當中。
  6. 最後執行動作並輸出訊息回覆給使用者。

說明:

目前常見的聊天機器人 (chatbot) 主要分為兩大類,一種為任務導向 (Task-oriented) 的聊天機器人,以數位助理為其主要定位,幫助使用者完成特定的任務,而另一種則為社交型、純聊天 (Chit-chat) 的聊天機器人,沒有要解決特定面向的問題,以閒聊、互動為其主要目的。

以下將介紹利用 Rasa NLU 以及 Rasa Core,來建置一個任務導向的數位助理時的訓練過程、需要提供什麼類型的資料,以及當建置完成數位助理後,可以整合到哪些社群平台。

1. 定義領域 (Domain):

如果可以不用打電話,只需線上詢問就能簡單完成餐廳的預訂,是不是方便許多? 因此當我們想建置一個餐廳搜尋預訂的數位助理的時候,首先,我們需要去制定數位助理所處在的迷你世界,才能讓數位助理可以辨識使用者輸入句子,使得它可以給予使用者正確的回覆,不會答非所問。

在一開始定義領域 (Domain) 的時候,需要來定義下述表格中五個部份的內容,以用來在 Rasa NLU 中建構可以解析使用者輸入進來的訊息的解析器。

intents (意圖) 使用者輸入的句子所想表達的意圖。(意圖 : 預訂餐廳)
entities (實體) 使用者輸入的句子中有哪些資訊。(可以是人數.地點.餐點類型等等)
actions (動作) 機器人可以採取的動作和回覆。
slots (暫存槽) 在對話過程中會追蹤同一使用者輸入的資訊,暫存在一個 slot 當中。
templates (模板) 定義機器人該回覆什麼對話內容。
當使用者輸入我想找高雄的韓式料理餐廳的訊息,「高雄」為使用者輸入的實體 location,「韓式料理」為實體 cuisine,整個訊息的意圖便是 search_restaurant。


在 Rasa NLU 當中,定義的領域 (Domain) 格式如下方 domain.yml 範例所示,能讓你更了解該如何定義你的數位助理的領域:

2. 訓練資料準備及格式要求。
定義好領域 (Domain) 的檔案之後,接下來需要準備訓練資料,以下分為兩個部份來介紹:

◎ 自然語言理解 (Natural Language Understanding):
用來訓練在 Rasa NLU 的解析器,使得能正確的解析使用者輸入的訊息,在準備此訓練資料的時候,需要注意的是要為輸入的訊息,標籤上正確的意圖和實體,才不會在後續與數位助理對話時,有混淆語意、無法辨識的情況發生。

  • 格式:
    以 json 形式儲存,包含意圖和實體在訊息當中的位置資訊。

  • 使用工具:
    Rasa NLU 官方套件有提供一個視覺化的圖形介面:Rasa NLU Online Trainer,可以讓使用者在介面上,為每一個輸入訊息,標籤上其所屬的意圖和擁有的實體,讓準備自然語言理解的訓練資料上,能夠更加方便。
    網址:https://rasahq.github.io/rasa-nlu-trainer/

◎ 對話情境故事 (Stories):
使用者要和數位助理產生對話互動,需要仰賴建立對話情境故事 (Stories),訓練資料中會有多則的故事 (Stories),當中定義著當使用者輸入的是怎樣意圖的訊息時,該回應怎麼樣的動作,在訓練對話模型的時候,便是依賴這些資料來建立預測數位助理下一步最該採取什麼動作的機率模型,所以如果能有大量的故事 (Stories) 來訓練,預測的效能會更好,也能回覆使用者回覆得更精確。

  • 格式:
    每一則故事的定義格式如下所示,就像模擬現實世界人與人的對話流程,以一個意圖對應一個數位助理要採取的動作,一問一答的方式,建構整個對話系統。

  • 使用工具:
    當要建置少量的故事 (Stories) 時,是可以使用手動的方式來達成,但是,如果想要讓回覆更精確,勢必需要大量的故事來訓練整個模型,這個時候就不可能一一用手工的方式來建置,此處是接觸建置功能完善的數位助理,最困難麻煩的地方,要取得這樣的故事 (Stories) 格式資料,或是自己轉成 Rasa Core 可以接受的格式,都是一件不容易的事,需要耗費的時間和成本最大。

    雖然,Rasa Core 上有提供一個 Interactive Learning 的功能,可以透過終端機視窗,以和系統邊互動邊學習的模式,校對故事的對話流程,是否合乎邏輯,耗費的時間相比起來稍少,但一樣需要人類在旁監督、除錯,是否能完整的包含常見的對話型態,也是一個問題,因為這會影響到數位助理在判斷下一步該採取什麼動作的時候之預測準確率。

3. 模型訓練:

◎ 自然語言理解模型 (NLU Model): 在 Rasa NLU 中要建構一個解析器解析輸入的訊息,而解析器是由一系列的單元元件所組成的,包括提取實體、意圖分類、文字的前處理等等的流程,因此,需要定義組合一個流程管道 (processing pipeline),訂定 config.yml,挑選一系列單元元件,取得訓練資料的特徵,來建立模型。

因為其他許多語言已經有預先訓練好通用且大量的詞向量,所以能夠利用這些預先訓練好的詞向量,建立模型來為訊息分類,但由於中文部份尚未有這麼大量的預先訓練好的詞向量,所以如果採用此種方式建立模型,分類的效能會差許多。

因此,中文的部分是使用 tensorflow_embedding 為主體,來建立模型,此種方式不需要預先訓練的詞向量,而且因為是從訓練資料中去擷取特徵,所以他可以很好的配適該領域的資料,分類的效能佳。

以下範例為一個用以解析中文訊息的 NLU 模型,所需訂定的 config.yml 和挑選的 pipeline:

  • 以JIEBA斷詞,再以訓練資料來建立意圖的特徵向量,然後透過將使用者輸入的訊息和意圖的標籤映射到相同維度空間,進行模型分類:

◎ 對話政策模型 (Dialogue Policy Model):
在 Rasa Core 當中,會以 Tracker 所記錄的前幾次所採取的動作、目前為止的歷史對話、以及從 NLU 模型的輸出所得到的使用者意圖和關鍵詞/實體,當作訓練的資料。將所有訓練的資料都傳送到政策 (Policy),設定參數、參考前多少個的歷史對話,轉成特徵向量以單層的LSTM,來訓練一個Keras policy model,然後會得到所有動作 (Action) 的機率分布,便可以拿來預測數位助理最有可能的下一個動作是什麼,回覆使用者正確的語句。

4. 使用聊天機器人:

透過建立上述兩個模型,你已經有一個NLU模型可以判斷使用者輸入訊息的意圖和實體,以及一個對話政策模型根據使用者輸入的訊息和到目前為止的對話狀態,來預測數位助理下一步該做些什麼動作,如此一來,將這兩個模型結合在一起,成為一個數位助理的核心思想中樞,即可以完成一個線上餐廳預訂的數位助理了!

除了可以將建構好的數位助理,串接到個人網頁上,也可以串接到其他社群平台,為使用者解決問題、提供協助,給予不同領域或商業上的應用,以下為有支援整合的社群平台:

  • Facebook
  • Slack
  • Mattermost
  • Telegram
  • Twilio
  • RocketChat
  • Microsoft Bot Framework


參考資料:
1. https://rasa.com/
2. https://github.com/RasaHQ/
3. https://github.com/RasaHQ/rasa-nlu-trainer
4. ”Rasa: Open Source Language Understanding and Dialogue Management”, Tom Bocklisch, Joey Faulkner, Nick Pawlowski, Alan Nichol, 2017 NIPS. (https://arxiv.org/abs/1712.05181)

Demo 影片 :

- 中山無人書店聊天機器人 -

按下「試玩聊天機器人」按鈕,開始試玩:


在現今社會,如 WhatsApp、Skype、Slack、Jandi 等通訊軟體的使用者數量急速上升,僅 Facebook Messenger 每個月的使用人數就超過 12 億人。隨著大量訊息的傳播,模仿人類對話以解決各種任務的聊天機器人的需求日漸增加。

聊天機器人指的是使用電腦來模擬人類聊天與對話的過程,聊天機器人能針對客戶的疑問選擇適當的回答、根據客戶的需求提供對應的資訊。使用聊天機器人的好處在於能節省大量的時間及人力成本,如今被廣泛應用於即時通訊平台如:FB、Line、WeChat,以行銷、客服為主要目的。

我們主要使用 Chatterbot、Keras-Language Model 等技術來實現我們的問答系統。

◎ 為何選擇 Chatterbot:
Chatterbot 已經包裝成 Python 的一個工具包,能夠非常簡單的安裝,套件本身內建多語言的訓練資料可供使用者快速建構一個基本的聊天機器人。也可快速的與 Python 的網頁框架結合 (如:Flask、Django),建構一個網頁介面作為與使用者溝通的媒介。

Chatterbot 是 Python 的套件,能夠讓使用者快速的建立一個聊天機器人並自動與用戶進行對話。 Chatterbot 提供數種訓練方式:

  1. 能夠透過準備好的文本進行訓練,將文本轉為 Python 的 List 形態,做為輸入的格式,如下圖,每一個問答集以 [‘問題’,‘答案’] 的形式提供:
  2. Chatterbot 有提供內建數種語言的文本 (Traing Corpus),可以直接使用來作為訓練的資料。包含英文、中文、泰文、法文、德文、義大利文…等等,更多語言可以參考此處
  3. Chatterbot 可以透過與用戶對話來進行進一步訓練,將用戶回答的內容儲存至資料庫中。
  4. 與 Twitter 提供的 API 進行串接,收集 Twitter 的貼文作為訓練資料。


◎ 為何選擇 Keras-Language Model:
本工具是一個深度學習的框架用來進行 Answer Selection,可適用於各個語言及各個領域,除了常見的卷積神經網路 (CNN) 外,還有提供長短期記憶模型 (LSTM) 等不同結構的模型供使用。論文發布後,在 GitHub 上累積了 600 多個關注度。

Keras-Language Model 這個模型來自 Feng 等人在 2015 年所提出的論文 "Applying Deep Learning to Answer Selection: A Study and An Open Task"。

此模型的目的是針對使用者輸入的問題,從已經存在的多個答案中選擇最適合的答案。這個模型會將使用者的問題及已經存在的答案轉成表徵向量,透過比較問題向量及答案向量間的相似度來選擇答案。理想狀態下,問題與正確答案經由模型產生的表徵向量相似度應大於其他答案產生的表徵向量

◎ Chatterbot 基本架構:
Chatterbot 機器人的資料庫中以「一個問題對應一到多個答案」爲單位儲存知識。

Chatterbot 機器人將用戶輸入的問題與資料庫中已儲存的問答資料進行比對,尋找資料庫中最接近使用者問題的資料,將該筆資料所屬的回答作為機器人的回覆傳遞給使用者。

Chatterbot 的架構可以分為三個部分:

使用者輸入:
Chatterbot可以從不同的來源獲得使用者輸入的內容。(例如:終端機、API、語音辨識等等…)。

比對內容:
根據使用者輸入的內容進行比對,比對方式是使用數個 Logic Adapter (邏輯適配器) 進行比對。
每個 Logic Adpater 的作用在於:根據使用者輸入的內容到資料庫中尋找最接近使用者內容的問答集。選擇此問答集的答案作為最終答案的候選之一,並產生對這個答案的信心分數。
最終送往下一層的答案是數個候選答案中,信心分數最高的答案。

回傳結果:
將最後的答案回傳至使用者端(例如:終端機、API、語音辨識等等…)。

訓練方式:
Chatterbot 提供數種訓練方式,可以透過準備好的問答集來進行訓練,也可以在與使用者互動的過程中,自行進行訓練,達到自我升級的效果。

在訓練時,Chatterbot 會將每一句對話建構成關係圖 (如下圖所示),並儲存於資料庫中,當使用者輸入內容後,將自動尋找最接近使用者輸入內容的節點,並以下一個節點的內容作為回應。


資料儲存:
使用 Chatterbot 時需要指定一個儲存空間,存放 Chatterbot 當前所學習到的知識,目前提供兩種儲存格式:
  1. SQL Storage Adapter:將資料儲存在如 SQLite 的傳統型資料庫。
  2. MongoDB Storage Adapter:將資料儲存在近期相當熱門的非關聯式資料庫。
參考資料:
Chatterbot 官方網站:https://chatterbot.readthedocs.io/en/stable/


◎ Keras-Language Model 基本架構:

此模型的目的是針對使用者輸入的問題,從已經存在的多個答案中選擇最適合的答案。 這個模型會將使用者的問題及已經存在的答案轉成表徵向量,透過比較問題向量及答案向量間的相似度來選擇答案。理想狀態下,問題與正確答案經由模型產生的表徵向量相似度應大於其他答案產生的表徵向量

原始論文中提出了數種架構的模型,我們選用了基本的 CNN 架構 (如附圖):

將原始問題及答案透過 Hidden Layer 轉成表徵向量 (feature representation),在訓練過程中,使用卷積神經網路(Convolutional Neural Network) 捕捉特徵,透過最大池化層(Max-Pooling) 及使用 tanh 函數做為激活函數 (activation function),產生處理後的表徵向量。

模型訓練過程是以讓問題及其正確答案的表徵向量距離縮小、問題及其錯誤答案的表徵向量距離增加爲目的,調整模型的參數。這個模型最終的目的在於讓一個問題與其正確答案之間的表徵向量有很高的相似度 (Cosine Similarity)

當使用者輸入問題後,會透過訓練好的模型轉換為表徵向量,並與現有的所有候選答案之表徵向量進行比對,相似度最高的答案會作為此問題最終的答案回傳給使用者。

參考資料:
1. “Applying Deep Learning to Answer Selection: A Study and An Open Task”
2. Keras-Language Modeling (github)

◎ 展示網站之訓練資料 (使用 Chatterbot):
我們透過爬蟲從台北市勞工局及勞動部常見問答收集了 576 則問答,格式如下:

問題 答案
雇主可否要求員工預排未來一整年的特休假? 勞動基準法特別休假,是為了提供勞工休憩之用,休假日期由勞工依照自己意願決定。雇主可提醒或促請勞工排定休假,但不可以限制勞工僅得一次預先排定或在特定期日前休假。
例假及休息日一定要安排在星期六、日嗎? 1.例假及休息日之安排,以每7日為1週期,除彈性工時之情況外,每1週期內應有1日例假、1日休息日。2.勞工的「例假」及「休息日」,得由勞雇雙方於不違反現行規定情形下,依照事業單位營運特性及勞工的需求自行約定,並未限制僅能安排於星期六、日。
休息日經過調移後,是否就不會產生休息日出勤工資的問題? 雇主如有於週間更動之需要,除應與勞工協商合意外,變動時,仍應符合「不得連續工作逾6日」之要件。雇主如再有使勞工於調移後的休息日工作之必要,仍須經勞工同意並應按休息日出勤加成工資的標準給付。


◎ 使用 Keras-Language Model 進行訓練與評估:
我們使用英文的保險領域問答集 Insurane-QA 進行訓練與評估,該資料集中共有 27,413 則問答。

所有 27,413 個問答集全部被使用來作為訓練資料,訓練完模型後,我們從訓練資料中抽樣產生了三組測試問答集,使模型針對「抽樣資料中的特定問題」以及「抽樣資料中的所有答案選項」進行選擇,並比較模型選擇之答案與正確答案的準確度。

測試結果如下:

測試集 Top1 準確度 Top5 準確度
測試集1 (1000個問答) 0.509 0.79
測試集2 (1800個問答) 0.491 0.798
測試集3 (1800個問答) 0.466 0.766



◎ 質化比較:

工具 Chatterbot Keras-Language Model
訓練速度 較快 較慢
內建訓練資料 須自行準備
訓練好的模型
能否自行訓練模型
能否模糊化搜尋 不可
預測準確度 *無法比較 *無法比較
* Keras-Language Model 是從定義好的候選答案中 (例如特定的 500 ~ 1000 個) 選擇最適合的答案,透過類神經網路來學習詞彙間的關係,因此可以進行模糊化的搜尋 (同一個問題換句話說)。

而 Chatterbot 則是將所有對話建構成一張關係圖,從圖中找到符合使用者輸入的節點,將該節點的下一個節點 (通常與這個句子有關係) 回傳。

兩者的性質不相同,Chatterbot 適用於關鍵字回應關鍵字、而 Keras-Language Model 則適用於完整句子的預測。


◎ 注意事項:
Chatterbot:
  • 系統預設的儲存方式為 SQLite,當問答資料到達一定數量 (超過 10000 則) 後,訓練速度會顯著下降,此時將儲存方式切換為 MongoDB 可以改善問題。
Keras-Language Model:
  • 此模型是從所有候選答案中選擇最適合的答案,因此在使用前需要先定義所有的候選答案 (Answer Pool),Answer Pool 的數量將會影響到預測的時間。
  • 此模型使用時需要將文字轉為表徵向量 (feature representation,可參考 Keras-Language Model 之"模型與參考資料"),運用在中文資料時,斷詞的好壞對於最終答案的選擇有極大的影響。
  • 此模型會受到專業領域的限制,同一個詞彙在不同領域中可能含有不同的含義,需要使用大量該領域的文本、以及人工進行斷詞才能得到更準確的預測結果。

試玩程式說明:
一個可回答保險相關問題的問答系統。

按下「試玩問答系統」按鈕,開始試玩:


簡介:
現實生活中許多變動可以透過時間的遞延來作觀察,而時間序列分析是指將某一現象所發生的變化作為分析,依照時間先後順序排列的資料點,可以用來觀察隨著時間移動此現象的變化規律,進而預測未來此現象發展的方向。當今常見的時間序列資料如:股票、國民生產毛額 (GDP)、空氣懸浮粒子指數、車站流量...等。

功能:
將資料整理成 Predictor Variable (自變數) 與 Target Variable (依變數),並指定相關參數 (參考幾個時間點前、要預測多少個時間點...等),模型會將預測的結果輸出出來。

目前只要使用長短期記憶(Long Short-Term Memory,LSTM)這種遞歸神經網路(Recurrent Neural Network)來進行時間序列分析即可達到不錯的效果,因此我們選擇自行撰寫這個功能。

LSTM 是一種神經網路模型,為 RNN 的變形,適合處理和預測時間序列資料、文字資料...等。

架構:

我們使用 LSTM 來進行預測,LSTM 為 RNN 的變形,RNN 透過將輸入與前一個時間點的輸出合併進行運算,用以預測時序相關資料,但單時間一拉長,便容易有梯度消失的問題,而 LSTM 的出現解決了此問題,讓模型能記憶到更長久前的訊息,使得預測更加準確。

參考來源:
https://colah.github.io/posts/2015-08-Understanding-LSTMs/


傳統方法:
  • 自回歸模型 (Autoregressive Model,AR):
    先根據預測目的和要求,對預測目標的時間序列資料加以整理,並將這些數列劃分為應變數和自變數數列。應變數序列的週期長度(即項數),可以根據所要反映的周期變動規律。自變數數列則可用原時間數列向後逐期推移取得。

    再來計算各個自變數數列的自相關係數,自相關係數的計算方法如同一般相關係數的計算方法。根據自相關係數的大小,選擇自相關係數較大的自變數數列,來擬合回歸模型。自回歸模型可以是線性或是非線性的;如果自回歸模型中只有一個自變數,稱為一階自回歸模型;兩個自變數則稱為二階自回歸模型。

    而回歸模型參數的求法,和其它回歸模型一樣。要預測的自變數,就是自變數數列的下一期數值。除此之外,對於預測值的可靠性檢驗,也與其它回歸模型相同。

  • 移動平均模型 (Moving Average Model,MA):
    一個MA(q)模型,稱為 q 階移動平均模型,過去我們說的移動平均線是指過去的價格加權平均所得到的估計值,但在這裡我們要針對一個隨機過程去預測,隨機過程的估計是現在到過去 q 期的隨機衝擊之加權平均:
    簡而言之:
    AR 模型是通過分析研究歷史資料對當前資料的影響進行建模。
    MA 模型是用過去各個時期的隨機干擾或預測誤差的線性組合來表達當前預測值。

  • 自回歸移動平均模型 (Autoregressive Integrated Moving Average Model,ARIMA):
    ARIMA 模型是由 George Box 和 Gwilym Jenkins 於 1970 年提出的時間序列預測方法,全稱為 ARIMA(p, d, q) 模型,p 與 q 分別為 AR 與 MA 的參數。相較於 ARMA 模型只是單純結合 AR 與 MA, ARIMA 多了一個參數 d,而在時間序列的穩定態處理中,可以透過差分使得資料變得更為穩定。但有時候並不是一階差分資料就會完美的呈現定態,這時候 ARIMA 中的 d 參數代表的就是使時間序列成為平穩所需做的差分次數。ARIMA 模型在預測時,不僅考慮該現象在時間序列上的依存性,還考慮隨機波動的干擾,對於短期趨勢的預測準確率較高,是近年應用比較廣泛的方法之一。

  • 廣義自回歸條件異方差模型 (Generalized Autoregressive Conditional Heteroskedasticity,GARCH):
    GARCH 模型是一個專門針對金融資料的回歸模型,除了和普通回歸模型的相同之處,GARCH 對誤差的方差做了進一步的建模。特別適用於波動性的分析和預測。

  • prophet:
    由 Facebook 所開發的套件,基於疊加模型(Additive Model)來預測時間序列資料,將趨勢按照週期與使用者自己定義的重要節日結合,適用於具有明顯季節性影響和多個季節歷史資料的時間序列。除此之外,prophet 能夠應對資料缺失和趨勢變化,並妥善處理異常值。

傳統的線性方法只適合預測較短的資料,若遇到需要預測較長序列之資料,模型的準確度就會明顯降低。


※ 我們實作的程式碼的下載網址: https://github.com/RexMao/ibtb_timeseries
使用股票資料做 LSTM 與傳統模型的比較

以 2013 年 4 月 18 日到 2018 年 6 月 15 日的台積電股價為資料來做評估,變數有:開盤價、最高價、最低價、收盤價以及交易量。

收盤價的走勢圖如下圖,我們使用所有變數的過去值,來預測下個時間點的收盤價,2013 年 4 月 18 日到 12 月 31 日的資料作為訓練資料,2018 年後的資料作為測試資料,用來比較傳統模型與 LSTM 的差別。用過去所有來去預測下個時間點的收盤價結果如下表,MAE 越小表示預測精確,可以看到在股票這種較為隨機的時間序列資料上,LSTM 的表現較為傳統模型突出許多。


結果如下表,可以看到 LSTM 的表現較為傳統模型突出許多。
LSTM prophet egarch arima
MAE 0.126649 0.9840268 0.6122634 1.504293
※ Metrics: MAE:實際值與預測值相差的絕對值取平均。


高雄車站進站人數 from 2005/1/1 to 2018/6/30 , per day a datapoint, 4748 rows of data. (univariable)


由觀察高雄車站進出站人數資料可知,週末搭乘人數較多,平日較少,形成每週一個週期的短季節性資料,因此我們用高雄車站進站人數來評估各種時間序列模型在短季節性資料的效果,收集資料時間為 2005/1/1 至 2018/6/30 每日進站人數,我們使用 2015~2017 年的資料進行訓練,2018/1/1 ~ 2018/6/30 的資料進行評估,結果如下表,MAE 的值越大表示模型預測出來的值和實際值差距越大,可以看到在短季節性資料上 LSTM 的表現仍為最佳。

LSTM prophet garch(1,1) arima(4,1,2)
MAE 1557.897 1679.424 3595.586 3396.617



高雄(前金區) pm2.5 Data from 2017/1/1 ~ 2017/12/31, a data point per hour, 8084 rows of data. (multivariable)


使用 2017 年 1 月 1 日 到 12 月 31 日高雄前金區的 pm2.5 資料來進行評估。pm2.5 的資料有較長的季節性變化(冬天較高,夏天較低),我們以此資料來評估各種時間序列預測模型在長季節性資料上的表現如何。我們使用 2017 年 1 月 1 日 到 11 月 30 日的資料進行訓練,2017 年 12 月的資料進行預測來評估結果。


為了評估模型的效果,我們這裡使用用過去所有變數 (例如SO2,CO...等) 來預測下個時間點的 pm2.5,結果如下表,MAE 的值越小表示模型閱測出來的值和實際值差距越小,可以看到在季節性資料上 LSTM 的表現較為傳統模型突出許多。

LSTM prophet garch(1,1) arima(4,1,4)
MAE 5.883804 13.13367 23.98893 21.18558


Evaluation of Multi-step LSTM :

LSTM 模型也支援多步的預測,常見的多步預測方法有4種:
  • Direct Multi-step Forecast Strategy:每預測一個時間點都建一個模型。例如:
  • Recursive Multi-step Forecast Strategy:將預測出來的值加入原始資料並用同個模型進行多步預測。例如:
  • Direct-Recursive Hybrid Multi-step Forecast Strategies:將預測出來的值加入原始資料並用不同模型進行多步預測。例如:
  • Multiple Output Forecast Strategy:直接用過去的值進行多步預測。例如:

我們進行預測多步評估的方法為 Recursive Multi-step Forecast Strategy,將預測出來的值丟入原始資料並用同個模型進行多步預測,結果如下,可以看到預測的步數越遠 (預測的時間點距離現在越久),MSE 越高,表示模型預測的越不精準,可以發現精準度隨著時間推進而降低。

試玩程式說明:
“PM2.5 時間序列分析” 網頁會顯示一個台灣地圖,上面會有台灣各個空氣品質觀測站的點位,點選點位,會秀出該位置未來 24 小時與未來一週的 PM2.5 濃度預測。


簡介:

隨著電子商務規模的不斷擴大,商品個數和種類快速增長,顧客需要花費大量的時間才能找到自己想買的商品,這種瀏覽大量無關的訊息和產品過程會使消費者不斷流失。由此推薦系統應運而生,推薦系統是一種資訊過濾系統,透過用戶對於不同項目的評分紀錄,能夠預測用戶對於其他項目的評分或是偏好,進而向用戶推薦更可能感興趣的項目。

推薦系統的強大威力因此備受矚目,漸漸地出現在非電子商務的應用場合,隨後逐漸佔領各行各業,線上影音串流平台 Netflix 將過去用戶觀看的紀錄訓練出推薦模型,進一步推薦更適切用戶偏好類型的電影、影集;社群交友軟體 Tinder 藉由個人的擇友偏好來推薦你更適配的好友;論文搜尋平台 Google Scholar 甚至能夠推薦你更多相關的論文,讓學者更能夠掌握研究趨勢。

推薦系統分類主要為以下三者:
  1. 基於內容的推薦系統 (Content-based Recommender System):
    通過相關特徵來定義用戶或是項目,依據用戶資料與待預測項目的批配程度進行推薦,盡力向用戶推薦類似於過去喜歡的項目,例如:用戶喜歡看動作片,而推薦系統則會盡力去推薦用戶喜歡的動作片。基於內容的推薦系統的優點是簡單且有效;缺點是提取特徵的能力有限,就算過分細化特徵,依舊無法為用戶推薦不同種類的項目,只能推薦用戶已有興趣的項目。這種推薦系統被限制在容易分析內容的項目推薦。

  2. 協同過濾推薦系統 (Collaborative Filtering Recommender System):
    相較於傳統的基於內容的方法透過直接分析內容來進行推薦,協同過濾推薦系統分析用戶的興趣,在用戶群中找到與指定用戶有相似興趣的用戶群,綜合興趣相投、擁有共同經驗的用戶對於所有項目的喜好程度預測來作喜好預測排序再推薦。近年研究發展出許多數學運算方法讓電腦在計算協同過濾推薦的效率提升,協同過濾推薦系統又分為以使用者為基礎(User-based)的協同過濾跟以項目為基礎(Item-based)的協同過濾,後續將會有詳細介紹。協同過濾推薦系統的優點是能夠過濾難以自動內容分析的資訊,像是音樂或是藝術品,由於是興趣相投方式的推薦,也往往能夠找出用戶意想不到的項目;缺點則是系統對於新用戶掌握度不高,難以推薦相關興趣的項目,推薦品質會較差,而當用戶以及項目過大,也會產生評分矩陣過於稀疏延伸矩陣分解的問題。

  3. 混合推薦系統 (Hybrid Recommender System):
    綜合以上兩種主要的推薦系統方法,混合推薦系統組合以上兩種推薦系統方法以彌補彼此間的優缺點,混合推薦系統組合的方式又分為「循序組合」、「線性組合」,循序組合是在不同用戶使用階段,使用不同推薦方法,來產生該階段所需的協果,例如:先利用基於內容的方式找出相似的使用者,接著再利用協同過濾方式來作推薦;而線性組合是同時使用兩種以上的推薦系統方法,分別產生個別的推薦結過,在賦予各個方法個別不同權重,加權之後即可得到最後的推薦結果。

本篇範例以第二種方法「協同過濾推薦系統」為主的演算法,因為協同過濾推薦系統對於資料格式要求低,方便各位使用者實現應用。將會以 R 的套件 RecommenderLab 來運行基於用戶的協同過濾(User-based CF)和基於項目的協同過濾(Item-based CF),除此之外也會介紹透過 Python PyTorch 實作的 DeepRecommender 深度學習演算法來進行協同過濾推薦。

功能:

將N個用戶對於M個項目評分的歷史資料整理成以下資料表形式,而用戶對於項目列表至少給予一筆以上的評分。透過歷史評分資料,推薦系統會將資料轉換成 N * M 的評分矩陣,再去學習用戶跟項目之間的連結關係。後續預測時,您可以輸入一名新用戶對於多筆不同項目的評分,系統將會推薦給適合的項目給這位新用戶。

基於用戶的協同過濾(User-based CF)技術描述:

基於用戶協同過濾先尋找與目標用戶有相同喜好的鄰近用戶,然後根據目標用戶的鄰近用戶的喜好產生對目標用戶的推薦。基本原理就是利用用戶喜好行為的相似性來互相推薦用戶可能感興趣的項目,如下圖所示,用戶 A 喜歡項目 A 跟 C,用戶 B 喜歡項目 B ,用戶 C 喜歡項目 A、C 跟 D,從這些用戶的歷史偏好資訊中,我們可以發現用戶 A 跟用戶 C的偏好很類似,而用戶 C 還同時喜歡項目 D,那麼我們可以推斷用戶 A 也可能喜歡項目 D,因此將項目 D 推薦給用戶 A。


基於項目的協同過濾(Item-based CF)技術描述:

根據所有用戶對於項目的評價,發現項目彼此之間的相似度,然後根據目標用戶的歷史偏好資訊將類似的項目推薦給該用戶,如下圖所示,用戶 A 喜歡項目 B 跟 C,用戶 B 喜歡項目 A、B 跟 C,用戶 C 喜歡項目 A,從這些用戶的偏好資料中可以認為項目 A 跟項目 C 比較類似,喜歡項目 A 的都會喜歡項目 C,基於這個案段用戶 C 也可能喜歡項目 C,所以推薦項目 C 給用戶 C。


DeepRecommender 提出的 DeepAutoencoder 演算法技術描述:

DeepRecommemder 為 NVIDIA 於 2017 年 8 月 5 日發表於 arXiv 。使用的程式語言為 Python 3.6,另外使用 PyTorch 作為深度學習模型框架。而 DeepRecommemder 是屬於協同過濾式推薦系統。 DeepAutoencoder 藉由多層的 Autoencoder 來訓練用戶跟項目間的評分關係。DeepAutoencoder 會將 M 個維度的資料壓縮成 L 個維度,再將其推回 M 個維度,試圖還原原本 M 個維度的原始資料,如下圖所示。由於 DeepAutoencoder 學習到用戶跟項目的關係,您可以輸入一名新用戶對於多筆不同項目的評分,接著 DeepAutoencoder 會試著還原所有的評分矩陣,換句話說,能夠自動填上它認為新用戶對於不同項目各自該有的評分,再以還原的評分進行推薦即可。

訓練參數為:DeepAutoencoder 之網路層數、神經元數量跟激勵函式及位於 z 層的 Dropout 率。


原始資料中會有用戶對不同項目的評分,DeepRecommender 會將這些評分切成 90% 部分為訓練資料用以訓練 DeepAutoencoder,5% 為驗證集,用以驗證訓練的 DeepAuencoder 之水準,剩餘 5% 為測試集,作為最後測試結果。





參考資料:
1. RecommenderLab 2. DeepRecommender
測試資料:
  1. Movielens:
    包含 6,040 位用戶對 3,706 部電影,總共一百萬筆的評分紀錄,評分矩陣稀疏率約為 95.5326%。
  2. Netflix:
    包含 67,878 位用戶對 10,677 部電影,總共一千萬筆的評分紀錄,評分矩陣稀疏率約為 98.6202% 評分紀錄從 1999-12-01 到 2005-11-31。
測試模型:
  1. RecommenderLab, User-based Collaborative Filtering.
  2. RecommenderLab, Item-based Collaborative Filtering.
  3. DeepRecommender, DeepAutoencoder.
評量標準:


◎ 實驗一:
測試資料:Movielens,包含 6,040 位用戶對 3,706 部電影,總共一百萬筆的評分紀錄,評分矩陣稀疏率約為 95.5326%。

測試結果:
DeepRecommender (1080ti * 1) IBCF UBCF
RMSE 0.950686 1.2904 0.9518
Training Time 46 sec 12 min 7 sec 0.2 sec
結論:在規模適中的資料,DeepRecommender 的效能與 UBCF 接近。由於電影數量較多,IBCF 的表現較差、運算時間較長。


◎ 實驗二:
測試資料:Netflix,包含 67,878 位用戶對 10,677 部電影,總共一千萬筆的評分紀錄,評分矩陣稀疏率約為 98.6202%。

測試結果:
DeepRecommender (1080ti * 1) IBCF UBCF
RMSE 0.9121 NA 0.9612
Training Time 35 min 21 sec NA 2.15 sec
結論:在規模較大的資料,DeepRecommender 的效能與 UBCF 接近,因為 DeepRecommender 是透過深度學習框架訓練,能夠設定 Batch size,也讓資料的規模能夠提高到更高上限,相較於在記憶體中計算的演算法 UBCF,DeepRecommender 的演算法提供了更彈性的選擇。由於電影數量更多,IBCF 需要佔用更多內存而無法訓練。

試玩程式說明:
本推薦系統會列出十幾部電影讓您評分,評分完後上傳評分結果,系統會對您的評分進行分析,並列出幾部您可能會喜歡的電影。

按下「試玩推薦系統」按鈕,開始試玩:


近年來深度學習受到了大量的關注,也在許多領域的應用上得到了令人驚呼的準確度,然而,深度學習模型的超大量參數,卻限制了我們將其部署到算力有限的行動設備與邊緣設備上做運用,為了解決這個實務問題,「模型壓縮」儼然成為一個需要重視的研究方向,讓我們探討如何在壓縮模型大小、加快模型推論速度的同時,又不會使模型原本的準確度下降太多。

因此,本文主要介紹兩款主流的模型壓縮工具的使用經驗:

  • Tencent 騰訊開發的 PocketFlow 與
  • Microsoft 開發的 NNI。

    以及 4 個我們測試過的模型壓縮演算法,包括:

  • 基於不同 channel 重要性評估方式的模型剪枝 (Channel Pruning 及 Discrimination-aware Channel Pruning)
  • 降低模型權重精度的參數精度削減 (Parameter Quantization) 方法以及
  • 迭代式的 Lottery Ticket Hypothesis 演算法。

    Tencent 騰訊 - PocketFlow



    sourse: https://pocketflow.github.io/

    PocketFlow 是一套由騰訊開發,基於 TensorFlow 的模型壓縮工具,主要框架是結合了模型壓縮演算法、模型蒸餾與參數微調。而模型壓縮演算法的部分包含了 3 個壓縮方法,分別是:Channel Pruning、Weight Sparsification 與 Parameter Quantization。

    Microsoft - NNI ( Neural Network Intelligence )



    Microsoft 開發的 NNI 相對於 PocketFlow,是一套更加完整與易用的工具,除了模型壓縮演算法之外,NNI 也結合了模型架構搜尋、特徵工程等等在建立深度學習模型時可以使用的工具,建立了一套完整的從建模到模型壓縮的工具生態系。此外,NNI 也相容 Pytorch 框架,更在 Pytorch 框架上開發出能夠真正刪除模型壓縮後冗餘的參數,使模型的檔案大小與運算時間實際減少的套件。

  • 演算法:
    PocketFlow - Channel Pruning

    Channel Pruning 的演算法是從各個卷積層之中選出比較重要的 Filter,這個壓縮器實現了 He et al. [3] 在 2017 年提出的方法,先用 LASSO 計算出各個 Channel 的重要性,在最小化壓縮前後的 feature map 的重建誤差的條件下依序選擇要保留的 filter。



    PocketFlow - Discrimination-aware Channel Pruning

    Discrimination-aware Channel Pruning 使用了不同的方式來選擇重要的 Filter,這個壓縮器根據 Zhuang et al. [4] 在 2018 年提出的方法,提出DCP (Discrimination-aware channel pruning) 方法一方面在中間層添加額外的 discrimination-aware loss (用以強化中間層的判斷能力),另一方面也考慮特徵重建誤差的 loss,綜合兩方面 loss 對於參數的梯度資訊,決定哪些為需要被裁剪的 channel。

    PocketFlow - Uniform Quantization

    精度削減 ( Quantization ) 透過使用較少的位元來表示每個參數與權重的方法,來達到減少模型的記憶體佔用的目的。這種方法雖然無法減少模型的計算量 ( FLOPs 浮點運算次數 ),不過卻是一種相對直覺且壓縮過程非常簡單的方法。例如,TensorFlow 預設的浮點數精度為 32 位元,我們可以透過將權重的浮點數精度降低為 8 位元,使得模型的權重只需要原先的四分之一左右的儲存空間。

    NNI - Lottery Ticket Hypothesis Algorithm

    NNI 的這個壓縮器實現了 ICLR 2019 最佳論文「The Lottery Ticket Hypothesis: Finding The Sparse, Trainable Neural Network」[5] 的概念:一個大型類神經網路包含了大量的子網路,這些子網路當中有些在原本的模型中具有影響力,有些則否。因此只要找出這些對預測具有影響力的子網路,去除影響力低的子網路,那麼保留的子網路的集合也能夠具有與完整模型相同的能力。

    這個壓縮方法使用了迭代的權重剪枝過程,意即重複的找出要保留的參數子集合之後,再從這個子集合繼續找出要保留的子集合的循環,直到剩餘的參數量滿足一開始設定的參數稀疏度。

    References:
    [1] https://pocketflow.github.io/
    [2] https://nni.readthedocs.io/en/latest/index.html
    [3] https://arxiv.org/abs/1707.06168
    [4]https://arxiv.org/abs/1810.11809
    [5]https://arxiv.org/abs/1803.03635

    PocketFlow 測試結果:
    我們使用 PocketFlow 來壓縮以 CASIA webface dataset 訓練的 Mobilenet v2 模型,我們測試的壓縮方法有 Channel Pruning、Discrimination-aware Channel Pruning 以及 Uniform Quantization。

    其中,測試的條件控制為:

  • batch size = 64
  • evaluation set size = 20,000

    Channel Pruning

    由上表可以看出在使用 Channel Pruning 的情況下,保留的參數量在 50% 以上時,可以維持與原始模型接近的準確度。

    比較不同壓縮演算法

    為了探討不同壓縮方法在相同壓縮比率下的表現,我們比較了 Channel Pruning、Discrimination-aware Channel Pruning 在保留 3 成的權重,Uniform Quantization 在 8 bit 的情況下的準確度與模型檔案大小。

    雖然模型的 .ckpt 檔大小在壓縮之後有變小,但是實際檢視模型參數量時,會發現壓縮後的模型的浮點運算次數減少的原因在於 PocketFlow 會產生一個 Mask File 紀錄需要被刪掉的參數,在載入模型時同時載入這些遮罩,來避免這些被遮罩的參數參與運算。

    NNI 測試結果:
    Lottery Ticket Hypothesis Pruner

    由於 Lottery Ticket Hypothesis Pruner 使用了 Fine-grained 的壓縮方式,這種 parameter-wised 的壓縮方法會造成模型架構的不規則化,因此經過 Lottery Ticket Hypothesis Pruner 壓縮後的模型無法套用 NNI 的 speed up 功能,所以即使這種壓縮方式可以只保留 10% 參數的清況下仍然能維持與原始模型接近的準確度。

    實驗設計:

  • 資料:CIFAR-10
  • 目標稀疏度:0.9
  • 進行 5 個迭代的剪枝與微調 10 個 epochs

    Speed Up Function

    由於 PocketFlow 目前只能做到「找出不重要的參數」並且加上遮罩,使這些參數不會在運算時被使用,卻不能真正的修改模型結構,將這些參數從模型中真正的移除。而 NNI 開發了一個基於 pytorch 框架,用於刪除這些被遮罩住的參數的工具,所以我們在 NNI 的測試項目主要在於刪除參數功能的部分。

    實驗設計:

  • 模型架構:VGG16 加上兩層全連階層 (FC Layer)
  • Sparsity of channel = 0.7 ( 保留 30% 參數)
  • batch size = 64
  • Inference time 為在 batch size = 64 的情況下,預測 1000 個 batch 所花費的時間總和

  • 此程式提供LeNet,ResNet-20 與 ResNet-34兩種模型供您選擇,選擇模型之後,程式會先顯示原始模型在 MNIST 資料及上的準確度。之後您可以調整要保留的模型參數量與模型壓縮方法,選擇完成後,系統會使用 Microsoft 開發的 NNI 壓縮您選擇的模型,並且呈現壓縮之後模型的表現。