記錄
李航大佬說過(原文連結)
電腦上達到和人同等的對話能力還非常困難。現在的技術,一般是資料驅動,基於機器學習的。
單輪對話有基於分析的,基於檢索的,基於產生的方法。
好吧, 我也感覺基於檢索的是low的, 但是現在各家智能音箱貌似都沒有突破這個坎. 大家聽到的siri的b-box, 背後是一個無聊的逗逼程式員; 小愛同學的驚人語錄, 寫語料也許是一群摳腳大漢.
這半年的工作, 主要集中在開發一個基於檢索的語義理解平台, 最近幾天剛剛完成了第三版的進化.
初代目
去年年底, 剛來這裡接手這項工作的時候, 老大給我的架構是簡單的純檢索, 基於ES, 把事先編好的模板寫到搜尋引擎裡. 每次收到前台請求, 將asr獲得的文本扔到ES裡搜, 一開始模板量比較少的時候, 分類效果挺不錯的, 甚至還有點泛化能力, 但是當樣本量上去之後, 檢索的效果變得很差, 準確率下降的很厲害. 當時分析原因, 在於ES的檢索原理, 是將放進去的文本進行分詞, 而後再對每個詞求
TF-IDF
分數, 形成一個向量, 匹配階段可能是逐個比對返回分數最高的.
使用期間主要遇到兩個問題, 首先是錯誤的識別, 因為檢索出來的是模板, 進而參照模板進行具名實體抽取, 就出現了問題. 例如, 北京今天天氣怎麼樣, ES通常會把它分類到模板: 今天@city天氣怎麼樣. 而實際上對應的正確模板是@city今天天氣怎麼樣, 使用這個錯誤的模板再走序列檢測比對演算法needle時, 就會出錯. 其次是分詞問題, 將文本放到ES時, 如果使用內建的
分詞
器, 它會把中文逐個分開, 也就是說, 內建分詞只會英文, 後來給ES配置了IK的外掛程式基本上解決了問題. 但是根本上來說, 基於第三方的工具, 出現的問題始終難以控制, 只能是每次出現漏洞就針對性補上, 然後又可能會把別的地方捅個洞.
二代目
初代的主要問題, 我們認為在於基於TF-IDF的分類器, 只能是識別詞, 而做不到語義. 後來想起了前一份工作做的廣告文本分類, 於是又開始求助於萬能的
word2vec
,於是有了二代.
在二代中, 我們採取了最為簡單的演算法: KNN, 逐條比對語料, 由於有了word2vec護體, 同時將匹配流程與NER結合, 終於徹底避開了初代中的第一類問題; 與此同時我在系統中添加了上下文配置, 使得簡單的追問也得以實現, 比如問完北京的天氣, 再追問南京呢, 也會成功分類到天氣預測, 並且正確地抽取槽位.
第二代系統確實成功地協助我們擺脫了ES, 基本上做到填什麼就能識別出什麼, 不會天天有人追問我你這又識別錯了, 但是問題也很明顯.
首先, 匹配效率低, 在初期只有大概一點多條人工模板時, 單條記錄的分類時間居然達到了600ms, 效率簡直慘不忍睹, 再看看人家訊飛的AIUI, 基本上在50ms左右. 我表示很無奈.
其次, 受分詞器影響大. 比如說在公司開發一個語音遙控器時, 添加了許多的例如, 第@index個, 第@index個加@num個.etc. 這些玩意對應的話術是第一個, 第一個加三個. 但是在轉化詞向量前的分詞步驟, 第一個分出來的此就是第一個, 模板分出來的是第 index 個, 每回有這種情況出現時, 就必須對應地調整分詞詞庫, 非常蛋疼. 更蛋疼的是, 這類問題, 易於解決, 難以預防, 指不定哪次示範就掛了呢.
再次, 沒有泛化能力究其原因, 我們訓練詞向量的語料庫很小, 以至於每個領域對應的閥值都非常高, 這樣也就限制了泛化能力.
三代目
針對第二版出現的三個問題, 當時先解決的是效率問題, 也就是在解決效率問題的過程中, 發現自己作業系統知識的薄弱, 於是乎擼了一本兒比較薄的清華的教材. 弄明白線程調度之後, 又簡單學了下Golang裡面的協程Goroutine, 寫了個筆記, 公眾號準備跟簡書同步. 細節不能贅述, 反正就是我把介面回應時間從600ms最佳化到40ms.
再往後就是最近第三版的開發, 這一版周期比較短, 起因在於有幾個項目在使用第二版系統時, 遇到了一系列問題. 在填坑的過程中, 我發現來一個坑填一個也不是什麼事, 於是思考了幾天開始了三代目的開發. 我先是將NER作為一個微服務從系統中分離出來, 減少了各部分的耦合度(其實我是嫌這玩意啟動載入的東西太多了, 調試時等半天); 然後又搞了個使用者自訂閥值的功能, 並且融入到匹配流程中, 驚人地發現, 我的閥值跟訊飛那邊近期出的類似功能裡的建議範圍一毛一樣, 我真的沒抄....
再後面就是重點了. 前一段時間我看了下某比賽(SMP2018, 一個垂直領域的短文本分類比賽)冠軍的PPT, 發現他們的思路是CNN + 匹配. 其中很重要的一點是, 先做NER再走演算法. 這個思路在幾個月前其實我同樣考慮過, 但是當時的NER過度以來Needle演算法, 現在有了新的NER, 這個思路也就可以實踐了. 於是我把整個匹配流程進行了大修, 同時重構了代碼, 原本700行的核心代碼被縮減到300行, 真的好爽. 附加的收益就是二代裡的第二個缺點得到瞭解決.
挖坑
全文中黑粗斜體都是後面要好好寫的內容, 也就是坑位, 當然還有別的坑位.
四代目開發
在這之所以用火影的編號, 也對應了各代系統的特點, 初代簡單粗暴, 二代發現黑科技, 三代完善卻老舊. 所以我們四代的開發目標就是.
很黃很暴力.
不對不對, 其實是快准狠.
暫訂計劃九月份開始嘗試拋棄之前瞎搞的CNN模型, 山寨一下一篇經典的CNN文本分類論文, 再試試
Transformer模型
跟
注意力機制
. 前一段時間偷來的
遷移學習
的代碼也準備試一下, 看能不能結合搞一下檢saniaoqu索與產生共存的對話系統.
模型推導與代碼實現
其實我也就是感覺學的東西不牢固, 想複習一遍統計學習方法, 好好再看一遍西瓜書, 還有之前買的那本死貴的花書, 在這過程中把基礎的所有演算法實現一遍, 寫出來正好也能規範一下代碼.
繼續刷leetcode
有興趣一起刷題的我的gayhub庫, 代碼寫的不好, 歡迎指導. 目標就是今年mid及以上的題刷到100題以上把.