丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能 正文
發(fā)私信給hain
發(fā)送

0

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

本文作者: hain 2017-02-13 17:57
導(dǎo)語(yǔ):模型能聊的內(nèi)容也取決于選取的語(yǔ)料。如果已經(jīng)具備了原始聊天數(shù)據(jù),可以用SQL通過(guò)關(guān)鍵字查詢(xún)一些對(duì)話,也就是從大庫(kù)里選取出一個(gè)小庫(kù)來(lái)訓(xùn)練。

雷鋒網(wǎng)按:本文作者王海良,呤呤英語(yǔ)開(kāi)發(fā)總監(jiān),北京JavaScript/Node.js開(kāi)發(fā)者社區(qū)的運(yùn)營(yíng)者,曾就職IBM創(chuàng)新中心。本文為系列文章第三篇,由雷鋒網(wǎng)獨(dú)家首發(fā)。前兩篇文章作者分別介紹了聊天機(jī)器人目前的發(fā)展?fàn)顩r及基于規(guī)則和檢索的聊天機(jī)器人引擎。本文將主要介紹如何使用深度學(xué)習(xí)技術(shù),依靠聊天語(yǔ)料來(lái)訓(xùn)練Bot Model。

第一篇傳送門(mén):聊天機(jī)器人的發(fā)展?fàn)顩r與分類(lèi)

第二篇傳送門(mén):基于規(guī)則和檢索的聊天機(jī)器人引擎

本篇文章以這個(gè)開(kāi)源項(xiàng)目為主線進(jìn)行。

數(shù)據(jù)預(yù)處理

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

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

【圖 3-1】 語(yǔ)料預(yù)處理, Ref. #7

對(duì)于英語(yǔ),需要了解NLTK,NLTK提供了加載語(yǔ)料,語(yǔ)料標(biāo)準(zhǔn)化,語(yǔ)料分類(lèi),PoS詞性標(biāo)注,語(yǔ)意抽取等功能。

另一個(gè)功能強(qiáng)大的工具庫(kù)是CoreNLP,作為 Stanford開(kāi)源出來(lái)的工具,特色是實(shí)體標(biāo)注,語(yǔ)意抽取,支持多種語(yǔ)言。

下面主要介紹兩個(gè)內(nèi)容:

中文分詞

現(xiàn)在有很多中文分詞的SDK,分詞的算法也比較多,也有很多文章對(duì)不同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先判斷語(yǔ)句是否是中文,然后使用jieba進(jìn)行分詞。

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

全切分:輸出所有分詞。

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

所有引擎模式:對(duì)精確切分后的長(zhǎng)句再進(jìn)行分詞。

jieba分詞的實(shí)現(xiàn)

主要是分成下面三步:

1、加載字典,在內(nèi)存中建立字典空間。

字典的構(gòu)造是每行一個(gè)詞,空格,詞頻,空格,詞性。

上訴書(shū) 3 n
上訴人 3 n
上訴期 3 b
上訴狀 4 n
上課 650 v

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

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

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

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

2、對(duì)輸入的語(yǔ)句分詞,首先是建立一個(gè)有向無(wú)環(huán)圖。 
有向無(wú)環(huán)圖, Directed acyclic graph (音 /?d?ɡ/)。

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

【圖 3-2】 DAG

DAG對(duì)于后面計(jì)算最大概率路徑和使用HNN模型識(shí)別新詞有直接關(guān)系。

3、按照模式,對(duì)有向無(wú)環(huán)圖進(jìn)行遍歷,比如,在精確模式下,便利就是求最大權(quán)重和的路徑,權(quán)重來(lái)自于在字典中定義的詞頻。對(duì)于沒(méi)有出現(xiàn)在詞典中的詞,連續(xù)的單個(gè)字符也許會(huì)構(gòu)成新詞。然后用HMM模型和Viterbi算法識(shí)別新詞。

精確模型切詞:使用動(dòng)態(tài)規(guī)劃對(duì)最大概率路徑進(jìn)行求解。

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

更多的細(xì)節(jié)還需要讀一下jieba的源碼。

自定義字典

jieba分詞默認(rèn)的字典是:1998人民日?qǐng)?bào)的切分語(yǔ)料還有一個(gè)msr的切分語(yǔ)料和一些txt小說(shuō)。開(kāi)發(fā)者可以自行添加字典,只要符合字典構(gòu)建的格式就行。

jieba分詞同時(shí)提供接口添加詞匯。

Word embedding

使用機(jī)器學(xué)習(xí)訓(xùn)練的語(yǔ)言模型,網(wǎng)絡(luò)算法是使用數(shù)字進(jìn)行計(jì)算,在輸入進(jìn)行編碼,在輸出進(jìn)行解碼。word embedding就是編解碼的手段。

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

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

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

Word2vec

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

近年來(lái),word2vec被廣泛采用。Word2vec輸入文章或者其他語(yǔ)料,輸出語(yǔ)料中詞匯建設(shè)的詞向量空間。詳細(xì)可參考word2vec數(shù)學(xué)原理解析。

  • 使用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" 表示在指定的語(yǔ)料庫(kù)上訓(xùn)練模型

-cbow 1 表示用cbow模型,設(shè)成0表示用skip-gram模型

-size 100 詞向量的維度為100

-window 8 訓(xùn)練窗口的大小為8 即考慮一個(gè)單詞的前八個(gè)和后八個(gè)單詞

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

-sample 1e-4 采用閾值

-threads 20 線程數(shù)

-binary 1 輸出model保存成2進(jìn)制

-iter 15 迭代次數(shù)

在訓(xùn)練完成后,就得到一個(gè)model,用該model可以查詢(xún)每個(gè)詞的詞向量,在詞和詞之間求距離,將不同詞放在數(shù)學(xué)公式中計(jì)算輸出相關(guān)性的詞。比如:

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

對(duì)于訓(xùn)練不同的語(yǔ)料庫(kù),可以單獨(dú)的訓(xùn)練詞向量模型,可以利用已經(jīng)訓(xùn)練好的模型。

其它訓(xùn)練詞向量空間工具推薦:Glove。

Seq2Seq

2014年,Sequence to Sequence Learning with Neural Networks提出了使用深度學(xué)習(xí)技術(shù),基于RNN和LSTM網(wǎng)絡(luò)訓(xùn)練翻譯系統(tǒng),取得了突破,這一方法便應(yīng)用在更廣泛的領(lǐng)域,比如問(wèn)答系統(tǒng),圖像字幕,語(yǔ)音識(shí)別,撰寫(xiě)詩(shī)詞等。Seq2Seq完成了【encoder + decoder -> target】的映射,在上面的論文中,清晰的介紹了實(shí)現(xiàn)方式。

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

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

也有很多文章解讀它的原理。在使用Seq2Seq的過(guò)程中,雖然也研究了它的結(jié)構(gòu),但我還不認(rèn)為能理解和解釋它。下面談兩點(diǎn)感受:

a. RNN保存了語(yǔ)言順序的特點(diǎn),這和CNN在處理帶有形狀的模型時(shí)如出一轍,就是數(shù)學(xué)模型的設(shè)計(jì)符合物理模型。

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

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

b. LSTM Cell的復(fù)雜度對(duì)應(yīng)了自然語(yǔ)言處理的復(fù)雜度。

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

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

理由是,有人將LSTM Cell嘗試了多種其它方案?jìng)鬟f狀態(tài),結(jié)果也很好。

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

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

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

使用DeepQA2訓(xùn)練語(yǔ)言模型

準(zhǔn)備工作,下載項(xiàng)目:

git clone https://github.com/Samurais/DeepQA2.git  
cd DeepQA2  
open README.md # 根據(jù)README.md安裝依賴(lài)包  

DeepQA2將工作分成三個(gè)過(guò)程:

  • 數(shù)據(jù)預(yù)處理:從語(yǔ)料庫(kù)到數(shù)據(jù)字典。

  • 訓(xùn)練模型:從數(shù)據(jù)字典到語(yǔ)言模型。

  • 提供服務(wù):從語(yǔ)言模型到RESt API。

預(yù)處理

DeepQA2使用Cornell Movie Dialogs Corpus作為demo語(yǔ)料庫(kù)。

原始數(shù)據(jù)就是movie_lines.txt 和movie_conversations.txt。這兩個(gè)文件的組織形式參考README.txt

deepqa2/dataset/preprocesser.py是將這兩個(gè)文件處理成數(shù)據(jù)字典的模塊。

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

train_max_length_enco就是問(wèn)題的長(zhǎng)度,train_max_length_deco就是答案的長(zhǎng)度。在語(yǔ)料庫(kù)中,大于該長(zhǎng)度的部分會(huì)被截?cái)唷?/p>

程序運(yùn)行后,會(huì)生成dataset-cornell-20.pkl文件,它加載到python中是一個(gè)字典:

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

word2id存儲(chǔ)了{(lán)word: id},其中word是一個(gè)單詞,id是int數(shù)字,代表這個(gè)單詞的id。

id2word存儲(chǔ)了{(lán)id: word}。

trainingSamples存儲(chǔ)了問(wèn)答的對(duì)話對(duì)。

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

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

[1,2,3] 和 [4,5,6] 構(gòu)成一個(gè)問(wèn)答。 [7,8,9] 和 [10, 11, 12] 構(gòu)成一個(gè)問(wèn)答。

開(kāi)始訓(xùn)練

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

config.ini是配置文件, 根據(jù)config.sample.ini進(jìn)行修改。訓(xùn)練的時(shí)間由epoch,learning rate, maxlength和對(duì)話對(duì)的數(shù)量而定。

deepqa2/train.py大約100行,完成數(shù)據(jù)字典加載、初始化tensorflow的session,saver,writer、初始化神經(jīng)元模型、根據(jù)epoch進(jìn)行迭代,保存模型到磁盤(pán)。

session是網(wǎng)絡(luò)圖,由placeholder, variable, cell, layer, output 組成。

saver是保存model的,也可以用來(lái)恢復(fù)model。model就是實(shí)例化variable的session。

writer是查看loss fn或者其他開(kāi)發(fā)者感興趣的數(shù)據(jù)的收集器。writer的結(jié)果會(huì)被saver保存,然后使用tensorboard查看。

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

【圖 3-8】 TensorBoard

Model

Model的構(gòu)建要考慮輸入,狀態(tài),softmax,輸出。

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

定義損耗函數(shù),使用AdamOptimizer進(jìn)行迭代。

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

最后,參考一下訓(xùn)練的loop部分。

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

每次訓(xùn)練,model會(huì)被存儲(chǔ)在 save路徑下,文件夾的命名根據(jù)機(jī)器的hostname,時(shí)間戳生成。

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

提供服務(wù)

在TensorFlow中,提供了標(biāo)準(zhǔn)的serving模塊 - tensorflow serving。但研究了很久,還專(zhuān)門(mén)看了一遍 《C++ Essentials》,還沒(méi)有將它搞定,社區(qū)也普遍抱怨tensorflow serving不好學(xué),不好用。訓(xùn)練結(jié)束后,使用下面的腳本啟動(dòng)服務(wù),DeepQA2的serve部分還是調(diào)用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  

測(cè)試

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 啟動(dòng)訓(xùn)練

scripts/start_tensorboard.sh 啟動(dòng)Tensorboard

scripts/start_serving.sh 啟動(dòng)服務(wù)

對(duì)模型的評(píng)價(jià)

目前代碼具有很高的維護(hù)性,這也是從DeepQA項(xiàng)目進(jìn)行重構(gòu)的原因,更清晰的數(shù)據(jù)預(yù)處理、訓(xùn)練和服務(wù)。有新的變更可以添加到deepqa2/models中,然后在train.py和chatbotmanager.py變更一下。

有待改進(jìn)的地方

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

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

c. 融合訓(xùn)練,目前model只有一個(gè)庫(kù),應(yīng)該是設(shè)計(jì)一個(gè)新的模型,支持一個(gè)大庫(kù)和小庫(kù),不同權(quán)重進(jìn)行,就如Mechanism-Aware Neural Machine for Dialogue Response Generation的介紹。

d. 代碼支持多機(jī)多GPU運(yùn)行。

e. 目前訓(xùn)練的結(jié)果都是QA對(duì),對(duì)于一個(gè)問(wèn)題,可以有多個(gè)答案。

f. 目前沒(méi)有一個(gè)方法進(jìn)行accuracy測(cè)試,一個(gè)思路是在訓(xùn)練中就提供干擾項(xiàng),因?yàn)楫?dāng)前只有正確的答案,如果提供錯(cuò)誤的答案(而且越多越好),就可以使用recall_at_k方法進(jìn)行測(cè)試。

最后

歡迎聯(lián)系我,尤其是業(yè)內(nèi)人士,給予指正,一起優(yōu)化。

本系列完結(jié)。

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

雷峰網(wǎng)特約稿件,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知

如何利用深度學(xué)習(xí)技術(shù)訓(xùn)練聊天機(jī)器人語(yǔ)言模型?

分享:
相關(guān)文章

專(zhuān)欄作者

當(dāng)月熱門(mén)文章
最新文章
請(qǐng)?zhí)顚?xiě)申請(qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶(hù)安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說(shuō)