300萬行到100行:機器學習造就更好的開發體驗
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)。
這個場景想想就很災難了:為了找到發生在第100萬行上的bug或回歸,不得不在一個失敗的軟件構建中瀏覽2.5GB的日志條目(也就是300萬行),這簡直難以靠人工手動完成!
還好,有一個巧妙的方法能解救你——執行diff命令,將這些行與最近成功的軟件構建進行對比,期望bug在日志中生成異常行。
標準的md5 diff命令執行速度很快,但它顯示了行之間的字符級差異,因此仍然會生成至少數十萬候選行以供瀏覽。使用機器學習中K-最鄰近聚類的模糊diffing算法(logreduce所做的事情)能產生大約40000條候選行,但需要一個小時才能完成。
而我們的解決方案是在20分鐘的計算時間內生成20000行候選行——而且得益于開放源碼,只需要大約100行Python代碼就能實現。
該應用程序結合了神經嵌入(將單詞和句子中的語義信息進行編碼)和局部敏感哈希算法(高效地將大致鄰近的項分配到相同的儲存器,而將遠處的項分配到不同的儲存器)。將嵌入式系統與LSH(Locality Sensitive Hashing,局部敏感哈希)結合是個不錯的想法,而這一想法的誕生還不到十年!
我們急不可待地在CPU上使用了Tensorflow 2.2,用于遷移學習,而將scikit-learnNearestNeighbor用于K-最鄰近算法。實際上,有一些復雜的近似最鄰近實現會更有助于實現基于模型的最鄰近解決方案。
嵌入式系統是什么?為什么需要它們?
構建k-hot詞袋模型是一個典型的出發點,常常針對非結構化或半結構化文本的重復數據刪除、搜索和相似性問題,這類詞袋編碼看起來很像一個包含單個單詞及其計數的字典。下面以“log in error, checklog”這句話為例:
- {“log”: 2,“in”: 1, “error”: 1, “check”: 1}
這種編碼還可以借助向量表示,其中索引對應一個單詞,值是計數。下面以“log in error, checklog” 為例展示其如何用向量表示,其中第一個條目保留為“log”單詞計數,第二個條目保留為“in”單詞計數,以此類推:
- [2, 1, 1,1, 0, 0, 0, 0, 0, …]
注意,這個向量由許多0組成。零值條目表示所有存在于字典中,但未出現在本句中的所有其他單詞。可能出現的向量條目總數,或向量的維數,是你語言字典的容量,通常可達幾百萬條或更多,可以通過一些巧妙的技巧精簡到幾十萬條。
現在來看看“problem authentication”的字典和向量表示,與前五個向量條目對應的單詞根本不會出現在新句子中。
- {“problem”:1, “authenticating”: 1}
- [0, 0, 0, 0, 1, 1, 0, 0, 0, …]
這兩個句子在語義上是相似的,也就是說它們的意思本質上是一樣的,但是在詞匯上是截然不同的,它們沒有出現相同的詞。在模糊區分設置中,可能這些句子太相似而不能突出顯示,但是K最鄰近算法中的md5和k-hot文檔編碼不支持該功能。
降維使用線性代數或人工神經網絡的方式將語義相似的單詞、句子和日志行鄰近放在一個新的向量空間中,用“嵌入”來表示。在示例中,“log in error,check log”可能有一個五維嵌入向量:
- [0.1, 0.3,-0.5, -0.7, 0.2]
“problem authenticating”可能是:
- [0.1,0.35, -0.5, -0.7, 0.2]
與它們的k-hot詞袋模型向量不同,這些嵌入向量通過距離度量的方式(比如余弦相似度)彼此接近,密集、低維的表示對于諸如構建行或系統日志的短文檔十分有用。
實際上,你需要用100個而不是5個信息豐富的嵌入維,來替換幾千個或更多個字典維,最先進的降維方法包括單詞共現矩陣的奇異值分解(GloVe)和專門的神經網絡(word2vec, BERT,ELMo)。
聚類是什么?讓我們再回到構建日志應用程序
我們開玩笑說Netflix是一個日志制作服務商,它有時會傳輸視頻。在異常監視、日志處理和流處理等領域,每秒會處理幾十萬個請求。如果我們想在遙測和日志空間中應用機器學習,必須要擴展NLP解決方案。
圖源:unsplash
這就是為什么我們關注擴展文本重復數據刪除、語義相似度搜索和文本異常值檢測等問題——如果需要實時解決業務問題,這是唯一的辦法。
diff命令解決方案包括將每個行嵌入到一個低維向量中(可選擇“微調”或同時更新嵌入模型),將其分配到一個聚類中,并將不同聚類中的行標識為“不同”。局部敏感哈希是一種概率算法,它允許常數時間的聚類分配和近常數時間的最鄰近搜索。
LSH的工作原理是將一個向量表示映射到一個標量數字,或者更準確地說是映射到一個標量的集合。標準哈希算法的目標是避免任何兩個不相同的輸入之間的沖突,而LSH的目標是在輸入距離較遠的情況下避免沖突,輸入不同但在向量空間中彼此靠近的情況下促進沖突。
“log in error, checklog”的嵌入向量可以映射到二進制數01(01表示集群)。“problem authenticating”的嵌入向量很有可能映射到相同的二進制數01。這就是LSH如何實現模糊匹配、反問題和模糊區分,LSH早期應用于高維詞袋模型向量空間。
使用LSH將字符放在同一個儲存器中,但方向顛倒。
在構建日志的文本離群點檢測中應用LSH和神經嵌入,它將允許工程師查看日志的一小部分行來識別和修復潛在的關鍵業務軟件中的錯誤,并且它還允許我們實時獲取幾乎任何日志行的語義聚類。
現在,將語義LSH的這一優勢應用到Netflix的每個構建中。語義部分允許我們基于含義對看似不同的項目進行分組,并將它們標注在異常值報告中。
成熟的開源遷移學習數據產品和SDKs使得我們能夠通過LSH用非常少的代碼行來解決語義最近鄰的搜索問題。遷移學習和微調可能給應用程序帶來的優勢特性令我們非常驚喜,機器學習在幫助人們提升工作效率方面還大有可為。