<label id="jgr5k"></label>
    <legend id="jgr5k"><track id="jgr5k"></track></legend>

    <sub id="jgr5k"></sub>
  1. <u id="jgr5k"></u>
      久草国产视频,91资源总站,在线免费看AV,丁香婷婷社区,久久精品99久久久久久久久,色天使av,无码探花,香蕉av在线
      您正在使用IE低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
      此為臨時鏈接,僅用于文章預覽,將在時失效
      人工智能 正文
      發私信給hain
      發送

      0

      如何利用深度學習技術訓練聊天機器人語言模型?

      本文作者: hain 2017-02-13 17:57
      導語:模型能聊的內容也取決于選取的語料。如果已經具備了原始聊天數據,可以用SQL通過關鍵字查詢一些對話,也就是從大庫里選取出一個小庫來訓練。

      雷鋒網按:本文作者王海良,呤呤英語開發總監,北京JavaScript/Node.js開發者社區的運營者,曾就職IBM創新中心。本文為系列文章第三篇,由雷鋒網獨家首發。前兩篇文章作者分別介紹了聊天機器人目前的發展狀況及基于規則和檢索的聊天機器人引擎。本文將主要介紹如何使用深度學習技術,依靠聊天語料來訓練Bot Model。

      第一篇傳送門:聊天機器人的發展狀況與分類

      第二篇傳送門:基于規則和檢索的聊天機器人引擎

      本篇文章以這個開源項目為主線進行。

      數據預處理

      模型能聊的內容也取決于選取的語料。如果已經具備了原始聊天數據,可以用SQL通過關鍵字查詢一些對話,也就是從大庫里選取出一個小庫來訓練。從一些論文上,很多算法都是在數據預處理層面的,比如Mechanism-Aware Neural Machine for Dialogue Response Generation就介紹了,從大庫中抽取小庫,然后再進行融合,訓練出有特色的對話來。

      如何利用深度學習技術訓練聊天機器人語言模型?

      【圖 3-1】 語料預處理, Ref. #7

      對于英語,需要了解NLTK,NLTK提供了加載語料,語料標準化,語料分類,PoS詞性標注,語意抽取等功能。

      另一個功能強大的工具庫是CoreNLP,作為 Stanford開源出來的工具,特色是實體標注,語意抽取,支持多種語言。

      下面主要介紹兩個內容:

      中文分詞

      現在有很多中文分詞的SDK,分詞的算法也比較多,也有很多文章對不同SDK的性能做比較。做中文分詞的示例代碼如下。

      # coding:utf8
      '''  
      Segmenter with Chinese  
      '''

      import jieba  
      import langid


      def segment_chinese_sentence(sentence):  
         '''
         Return segmented sentence.
         '''
         seg_list = jieba.cut(sentence, cut_all=False)
         seg_sentence = u" ".join(seg_list)
         return seg_sentence.strip().encode('utf8')


      def process_sentence(sentence):  
         '''
         Only process Chinese Sentence.
         '''
         if langid.classify(sentence)[0] == 'zh':
             return segment_chinese_sentence(sentence)
         return sentence

      if __name__ == "__main__":  
         print(process_sentence('飛雪連天射白鹿'))
         print(process_sentence('I have a pen.'))

      以上使用了langid先判斷語句是否是中文,然后使用jieba進行分詞。

      在功能上,jieba分詞支持全切分模式,精確模式和搜索引擎模式。

      全切分:輸出所有分詞。

      精確:概率上的最佳分詞。

      所有引擎模式:對精確切分后的長句再進行分詞。

      jieba分詞的實現

      主要是分成下面三步:

      1、加載字典,在內存中建立字典空間。

      字典的構造是每行一個詞,空格,詞頻,空格,詞性

      上訴書 3 n
      上訴人 3 n
      上訴期 3 b
      上訴狀 4 n
      上課 650 v

      建立字典空間的是使用python的dict,采用前綴數組的方式。

      使用前綴數組的原因是樹結構只有一層 - word:freq,效率高,節省空間。比如單詞"dog", 字典中將這樣存儲:

      {
       "d": 0,
       "do": 0,
       "dog": 1 # value為詞頻
      }

      字典空間的主要用途是對輸入句子建立有向無環圖,然后根據算法進行切分。算法的取舍主要是根據模式 - 全切,精確還是搜索。

      2、對輸入的語句分詞,首先是建立一個有向無環圖。 
      有向無環圖, Directed acyclic graph (音 /?d?ɡ/)。

      如何利用深度學習技術訓練聊天機器人語言模型?

      【圖 3-2】 DAG

      DAG對于后面計算最大概率路徑和使用HNN模型識別新詞有直接關系。

      3、按照模式,對有向無環圖進行遍歷,比如,在精確模式下,便利就是求最大權重和的路徑,權重來自于在字典中定義的詞頻。對于沒有出現在詞典中的詞,連續的單個字符也許會構成新詞。然后用HMM模型和Viterbi算法識別新詞。

      精確模型切詞:使用動態規劃對最大概率路徑進行求解。

      最大概率路徑:求route = (w1, w2, w3 ,.., wn),使得Σweight(wi)最大。Wi為該詞的詞頻。

      更多的細節還需要讀一下jieba的源碼

      自定義字典

      jieba分詞默認的字典是:1998人民日報的切分語料還有一個msr的切分語料和一些txt小說。開發者可以自行添加字典,只要符合字典構建的格式就行。

      jieba分詞同時提供接口添加詞匯。

      Word embedding

      使用機器學習訓練的語言模型,網絡算法是使用數字進行計算,在輸入進行編碼,在輸出進行解碼。word embedding就是編解碼的手段。

      如何利用深度學習技術訓練聊天機器人語言模型?

      【圖 3-3】 word embedding, Ref. #7

      word embedding是文本的數值化表示方法。表示法包括one-hot,bag of words,N-gram,分布式表示,共現矩陣等。

      Word2vec

      如何利用深度學習技術訓練聊天機器人語言模型?

      近年來,word2vec被廣泛采用。Word2vec輸入文章或者其他語料,輸出語料中詞匯建設的詞向量空間。詳細可參考word2vec數學原理解析

      • 使用word2vec

      安裝完成后,得到word2vec命令行工具。

      word2vec -train "data/review.txt" \  
       -output "data/review.model" \
       -cbow 1 \
       -size 100 \
       -window 8 \
       -negative 25 \
       -hs 0 \
       -sample 1e-4 \
       -threads 20 \
       -binary 1 \
       -iter 15

      -train "data/review.txt" 表示在指定的語料庫上訓練模型

      -cbow 1 表示用cbow模型,設成0表示用skip-gram模型

      -size 100 詞向量的維度為100

      -window 8 訓練窗口的大小為8 即考慮一個單詞的前八個和后八個單詞

      -negative 25 -hs 0 是使用negative sample還是HS算法

      -sample 1e-4 采用閾值

      -threads 20 線程數

      -binary 1 輸出model保存成2進制

      -iter 15 迭代次數

      在訓練完成后,就得到一個model,用該model可以查詢每個詞的詞向量,在詞和詞之間求距離,將不同詞放在數學公式中計算輸出相關性的詞。比如:

      vector("法國") - vector("巴黎) + vector("英國") = vector("倫敦")"  

      對于訓練不同的語料庫,可以單獨的訓練詞向量模型,可以利用已經訓練好的模型。

      其它訓練詞向量空間工具推薦:Glove

      Seq2Seq

      2014年,Sequence to Sequence Learning with Neural Networks提出了使用深度學習技術,基于RNN和LSTM網絡訓練翻譯系統,取得了突破,這一方法便應用在更廣泛的領域,比如問答系統,圖像字幕,語音識別,撰寫詩詞等。Seq2Seq完成了【encoder + decoder -> target】的映射,在上面的論文中,清晰的介紹了實現方式。

      如何利用深度學習技術訓練聊天機器人語言模型?

      【圖 3-4】 Seq2Seq, Ref. #1

      也有很多文章解讀它的原理。在使用Seq2Seq的過程中,雖然也研究了它的結構,但我還不認為能理解和解釋它。下面談兩點感受:

      a. RNN保存了語言順序的特點,這和CNN在處理帶有形狀的模型時如出一轍,就是數學模型的設計符合物理模型。

      如何利用深度學習技術訓練聊天機器人語言模型?

      【圖 3-5】 RNN, Ref. #6

      b. LSTM Cell的復雜度對應了自然語言處理的復雜度。

      如何利用深度學習技術訓練聊天機器人語言模型?

      【圖 3-6】 LSTM, Ref. #6

      理由是,有人將LSTM Cell嘗試了多種其它方案傳遞狀態,結果也很好。

      如何利用深度學習技術訓練聊天機器人語言模型?

      【圖 3-7】 GRU, Ref. #6

      LSTM的一個替代方案:GRU。只要RNN的Cell足夠復雜,它就能工作的很好。

      使用DeepQA2訓練語言模型

      準備工作,下載項目:

      git clone https://github.com/Samurais/DeepQA2.git  
      cd DeepQA2  
      open README.md # 根據README.md安裝依賴包  

      DeepQA2將工作分成三個過程:

      • 數據預處理:從語料庫到數據字典。

      • 訓練模型:從數據字典到語言模型。

      • 提供服務:從語言模型到RESt API。

      預處理

      DeepQA2使用Cornell Movie Dialogs Corpus作為demo語料庫。

      原始數據就是movie_lines.txt 和movie_conversations.txt。這兩個文件的組織形式參考README.txt

      deepqa2/dataset/preprocesser.py是將這兩個文件處理成數據字典的模塊。

      如何利用深度學習技術訓練聊天機器人語言模型?

      train_max_length_enco就是問題的長度,train_max_length_deco就是答案的長度。在語料庫中,大于該長度的部分會被截斷。

      程序運行后,會生成dataset-cornell-20.pkl文件,它加載到python中是一個字典:

      如何利用深度學習技術訓練聊天機器人語言模型?

      word2id存儲了{word: id},其中word是一個單詞,id是int數字,代表這個單詞的id。

      id2word存儲了{id: word}。

      trainingSamples存儲了問答的對話對。

      比如 [[[1,2,3],[4,5,6]], [[7,8,9], [10, 11, 12]]]

      1,2,3 ... 12 都是word id。

      [1,2,3] 和 [4,5,6] 構成一個問答。 [7,8,9] 和 [10, 11, 12] 構成一個問答。

      開始訓練

      cp config.sample.ini config.ini # modify keys  
      python deepqa2/train.py  

      config.ini是配置文件, 根據config.sample.ini進行修改。訓練的時間由epoch,learning rate, maxlength和對話對的數量而定。

      deepqa2/train.py大約100行,完成數據字典加載、初始化tensorflow的session,saver,writer、初始化神經元模型、根據epoch進行迭代,保存模型到磁盤。

      session是網絡圖,由placeholder, variable, cell, layer, output 組成。

      saver是保存model的,也可以用來恢復model。model就是實例化variable的session。

      writer是查看loss fn或者其他開發者感興趣的數據的收集器。writer的結果會被saver保存,然后使用tensorboard查看。

      如何利用深度學習技術訓練聊天機器人語言模型?

      【圖 3-8】 TensorBoard

      Model

      Model的構建要考慮輸入,狀態,softmax,輸出。

      如何利用深度學習技術訓練聊天機器人語言模型?

      定義損耗函數,使用AdamOptimizer進行迭代。

      如何利用深度學習技術訓練聊天機器人語言模型?

      最后,參考一下訓練的loop部分。

      如何利用深度學習技術訓練聊天機器人語言模型?

      每次訓練,model會被存儲在 save路徑下,文件夾的命名根據機器的hostname,時間戳生成。

      如何利用深度學習技術訓練聊天機器人語言模型?

      提供服務

      在TensorFlow中,提供了標準的serving模塊 - tensorflow serving。但研究了很久,還專門看了一遍 《C++ Essentials》,還沒有將它搞定,社區也普遍抱怨tensorflow serving不好學,不好用。訓練結束后,使用下面的腳本啟動服務,DeepQA2的serve部分還是調用TensorFlow的python api。

      cd DeepQA2/save/deeplearning.cobra.vulcan.20170127.175256/deepqa2/serve  
      cp db.sample.sqlite3 db.sqlite3  
      python manage.py runserver 0.0.0.0:8000  

      測試

      POST /api/v1/question HTTP/1.1  
      Host: 127.0.0.1:8000  
      Content-Type: application/json  
      Authorization: Basic YWRtaW46cGFzc3dvcmQxMjM=  
      Cache-Control: no-cache

      {"message": "good to know"}

      response  
      {
       "rc": 0,
       "msg": "hello"
      }

      serve的核心代碼在serve/api/chatbotmanager.py中。

      使用腳本

      scripts/start_training.sh 啟動訓練

      scripts/start_tensorboard.sh 啟動Tensorboard

      scripts/start_serving.sh 啟動服務

      對模型的評價

      目前代碼具有很高的維護性,這也是從DeepQA項目進行重構的原因,更清晰的數據預處理、訓練和服務。有新的變更可以添加到deepqa2/models中,然后在train.py和chatbotmanager.py變更一下。

      有待改進的地方

      a. 新建models/rnn2.py, 使用dropout。目前DeepQA中已經使用了Drop.

      b. tensorflow rc0.12.x中已經提供了seq2seq network,可以更新成tf版本.

      c. 融合訓練,目前model只有一個庫,應該是設計一個新的模型,支持一個大庫和小庫,不同權重進行,就如Mechanism-Aware Neural Machine for Dialogue Response Generation的介紹。

      d. 代碼支持多機多GPU運行。

      e. 目前訓練的結果都是QA對,對于一個問題,可以有多個答案。

      f. 目前沒有一個方法進行accuracy測試,一個思路是在訓練中就提供干擾項,因為當前只有正確的答案,如果提供錯誤的答案(而且越多越好),就可以使用recall_at_k方法進行測試。

      最后

      歡迎聯系我,尤其是業內人士,給予指正,一起優化。

      本系列完結。

      References

      1. A Neural Conversational Model

      2. Sequence to Sequence Learning with Neural Networks

      3. DeepQA Project

      4. Efficient Estimation of Word Representations in Vector Space

      5. jieba分詞分析

      6. Tensorflow and deep learning - without a PhD by Martin G?rner

      7. Pragmatic NLP by Matt Fortier

      雷峰網特約稿件,未經授權禁止轉載。詳情見轉載須知

      如何利用深度學習技術訓練聊天機器人語言模型?

      分享:
      相關文章

      專欄作者

      當月熱門文章
      最新文章
      請填寫申請人資料
      姓名
      電話
      郵箱
      微信號
      作品鏈接
      個人簡介
      為了您的賬戶安全,請驗證郵箱
      您的郵箱還未驗證,完成可獲20積分喲!
      請驗證您的郵箱
      立即驗證
      完善賬號信息
      您的賬號已經綁定,現在您可以設置密碼以方便用郵箱登錄
      立即設置 以后再說
      主站蜘蛛池模板: 国产偷伦| 国产太嫩了在线观看| 久久se精品一区精品二区 | 2020久久香蕉国产线看观看| 成人福利国产午夜AV免费不卡在线 | 亚洲成人资源| 人妻精品网站| 亚洲综合天堂一区二区三区| 欧美精品亚洲日韩a| 精品国产性色无码av网站| 国产wwww| 国产人妻人伦精品1国产丝袜| 亚洲精品成人无码AV在线| 亚洲男女羞羞无遮挡久久丫 | 一区二区三区鲁丝不卡| 精品久久精品久久99| 精品国产网站| 粗大猛烈进出高潮视频| 亚洲最大成人| 成人色一区二区三区| 欧洲无码一区二区三区在线观看 | 国产成人无码VA在线观看| 亚洲日本韩国| 色99久久久久高潮综合影院| 一本无码av中文出轨人妻| 怡春院综合| 国语精品一区二区三区| 日韩AV中文字幕在线| 欧洲无码成人| japanese无码中文字幕| 天天天欲色欲色www免费| 精品无码三级在线观看视频 | 国产午夜免费啪视频观看视频| AV?无码?白浆| 高级会所人妻互换94部分| 久久综合九色综合网站| 四虎在线视频| 日日插插| 亚洲AV无码专区首页第一页| 性色av 一区二区三区| 中文字幕av一区二区三区人妻少妇|