智慧科技探索

我們目前人臉辨識使用的開源套件為 FaceNet。

FaceNet 源碼在 GitHub 上有 6245 個星並可能還會持續上升,使用此套件是因為 FaceNet 為 Google 在現今的人臉偵測辨識及深度學習領域中相當有突破性及份量的巨擘論文的實作品。

FaceNet 簡介:
FaceNet 是一款由 Google 用於人臉方面的系統。FaceNet 亦提供分類、驗證人臉的功能,並附有由 Tensorflow 程式語言完成的開源代碼。FaceNet 跟傳統辨識人臉的方法不同,傳統的方法是先輸出高維度的特徵向量,並使用 PCA 降維後透過 SVM 進行分類。FaceNet 則是直接將在卷基層網路訓練的人臉圖像映射到歐幾里得空間。透過計算兩張人臉圖片的歐式距離,我們可以得到這兩人是否為同一個人,距離越小的代表相似度越高。

FaceNet 的架構在源代碼中亦提供了 Inception-ResNet V1,Inception-ResNet V2,SqueezeNet,等模型架構提供訓練。同時也有提供預訓練好的模型參數,訓練使用的資料集為 CASIA-Webface (453453 張圖,10575 類) 或 VGGFace2 (3.31M 圖,9131 類)。在原論文中使用的目標函數是 Triplet Loss,Triplet 指的分別為 (Anchor, Negative, Positive),對於一個圖片 X 嵌入一個維度為 d 的歐氏空間,,在該空間內我們希望單個圖片 (anchor) 和自己本身同類的圖片 (positive) 距離近,與其他類的圖片 (negative) 遠。相比以往使用 softmax 做為目標函數,Facenet 採用了 Triplet Loss 直接優化了距離,比起 softmax 更直接而純粹,因此效能也更好,相比之下 Triplet Loss 能產生的特徵維度也更小。

整體來說 FaceNet 可分為 Batch (輸入的圖片樣本),可透過 FaceNet 源代碼提供的人臉對齊工具 (MTCNN) 裁剪成想要的大小 -> Deep Architecture (ZF, Inception-ResNet V1,Inception-ResNet V2) 等 -> L2 Regularization -> Embeddings (通過前面的深度學習得到的特徵向量) -> Triplet loss (與同類的盡可能縮小距離,不同類的距離遠)。

Facenet 的架構在源代碼中提供了 Inception-ResNet V1,InceptionResNet V2,SqueezeNet,等模型架構提供訓練。同時也有提供預訓練好的模型參數,訓練使用的資料集為 CASIA-Webface (453453 張圖,10575 類)或 VGGFace2 (3.31M 圖,9131 類)。

可分為 Batch(輸入的圖片樣本),可透過 FaceNet 源代碼提供的人臉對齊工具 (MTCNN) 裁剪成想要的大小 -> Deep Architecture (Inception-ResNet V1,Inception-ResNet V2) 等 -> L2 Regularization -> Embeddings (通過前面的深度學習得到的特徵向量) -> Triplet loss (與同類的盡可能縮小距離不同類的距離遠)。


參考資料:
FaceNet 論文:https://arxiv.org/pdf/1503.03832.pdf
FaceNet 源碼:https://github.com/davidsandberg/facenet

我們使用源代碼提供的預訓練模型模型,並使用兩種自行收集的資料進行評估,一組為網路收集的明星圖,一組為實驗室成員自行拍的照片。

我們將圖片分為 Enrollment Data 及 Testing Data,Enrollment 的意思為將 Enrollment Data 的特徵值相加並取平均,透過Testing Data 可以得到一閥值和一 Equal Error Rate。


實驗步驟與結果:
  1. 資料收集:
    (A) 100 位網路明星照片,每位明星各 15 張照片。
    (B) 10 位實驗室成員,每人各 10 張照片。
  2. 將照片做預處理裁成 160 * 160 pixels,並將照片 cropping 至臉部。
  3. 使用預訓練好的模型提出匹張照片 512-d 特徵 Pre-train model (Dataset:VGGFACE2,3.31M 張圖,9131類。架構:Inception-ResNetV1)
  4. 計算閥值與 Equal Error Eate:使用 A 資料集每人各 5 張照片做註冊,10 張做測試,得到閥值為 0.8295,EER 為 0.0094
  5. 得到的閥值用來測試在 B 資料集上,註冊 5 張,測試 5 張共 (500 個 trials) 得到 97.4% Accuracy。

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

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


現今語音辨識已經成為我們生活中常見的應用,並且可以帶來許多便利,例如 Siri、Google Assistant,我們可以透過講話使人工智慧 (AI) 來為我們做事,而此為百度團隊所開發的自動語音辨識系統 DeepSpeech2,使用 Tensorflow 和 Python 2.7 撰寫,可以用來識別英語或是中文,相較於其他開源項目,DeepSpeech 系列在語音辨識準確度可以達到最高,而其中DeepSpeech2系統對於中文語音辨識的處理更加優秀,且系統效能也較佳。使用深度學習的方法替代了傳統自動語音辨識的訓練方式,用單個模型替換傳統自動語音辨識的多個模塊,移除了對語音處理的方法使用,包含對音檔文本的強制對齊 。

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

相較於傳統語音識別,連結時序分類 (CTC) 更適合用於輸入特徵和輸出標籤之間對齊關係不確定的時間序列問題,CTC 可以在自動端到端的同時優化模型參數和對齊切分的邊界,代表我們不需要先將語音和文本做對齊,因此系統不再有獨立的模塊,從輸入端到輸出端就只有一個神經網絡模型,如此也可確保最後階段的解可達到最優。

使用端到端的架構來做訓練,其輸入為時頻譜圖經過多個卷積輸入層,接著經過多個遞歸層或雙向遞歸層,之後接上一個全連接層,輸出層為 Softmax。使用 CTC 當作損失函數進行端到端的訓練,並且 CTC 可以直接從輸入語音中預測輸出符號的序列,網路架構如下圖(參考原論文圖)。

參考資料:
Deep Speech 2: End-to-End Speech Recognition in English and Mandarin
DeepSpeech (GitHub)

我們使用此架構自行訓練中文語音模型,使用 Aishell-1 做為訓練資料共 178 小時,其中訓練集有 120,098筆(如表1),驗證集使用 14,326 筆,並且特製一份測試集來當作我們的評判標準,此測試集內容與財金科技科學以及智慧家電相關,較符合我們所需情境模擬,目前模型準確率可以達到 69.85%(如表2)。

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

表1:

表2:

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


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

如 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 需要佔用更多內存而無法訓練。

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