作者 | 李嘉璇
文章來源Gitchat,AI科技大本營合作釋出
前言
人工智慧是目前各行各業最火熱的技術,如果說前兩年是『網際網路+』,那麼這兩年一定是『AI+』,利用深度學習的技術,給各行各業賦能,並提高效率,是企業智慧化的一個方向。
從AI的結合方向來說,一般有2種,一種是行業結合,例如量化投資和智慧投顧。
量化投資,量化投資就是利用計算機技術並且採用一定的數學模型去實踐投資理念,實現投資策略的過程。它能嚴格執行投資策略,這樣可以克服人性的弱點,如貪婪、恐懼、僥倖心理,也可以克服認知偏差。並且對海量資料的多角度觀察,能快速跟蹤市場,擴充套件投資機會。
在比如,AI與教育,國內的幾家線上教育機構都有涉獵。英語流利說,用語音識別的方法,來判斷使用者的發音是否準確;乂學教育,將高中小學的題目,依據語義識別,將題目背後的知識點挖掘出來,用來診斷使用者對一道題的不會做,究竟是哪些知識點不會,可能涉及到的小初高的各個知識點,分別列出,方便針對性的練習;小猿搜題利用OCR技術,獲取題目的文字資料,最後對題目在資料庫中及知識點中做匹配。
另一種是技術結合,這裡的技術指的是網際網路企業從業人員的各個角色,例如運維、開發、運營、搜尋、推薦等。也是我們這裡主要介紹的內容。這裡可以做的事情很多,一般是一些重複性工作,有一定規律,但是這種規律不容易用規則描述,都可以嘗試用深度學習的方法來賦能。
當然,深度學習或者機器學習在上面兩種結合的情況下獲得成功案例,離不開這幾大要素:
資料
標註
工具(演算法和系統)
應用場景
我們也逐個來展開。最後介紹深度學習中遇到的幾個挑戰,以及解決的思路。
如何將深度學習與你正在做的事情相結合
智慧運維
運維的發展目前經歷了從基於規則到基於學習的。運維面臨的最大挑戰就是:在網際網路公司很難人工指定規則。在一個較大的企業中,它的特點如下:
規模大:
100多個產品線
上萬個模組
幾十萬臺伺服器
百萬級KPI監控
變化快:
每天上萬個軟體更新
網際網路從業員工流動性強
那麼在運維中,都有哪些場景,可以嘗試引入機器學習的演算法呢?
場景一:事故的根因分析(RCA)
自動挖掘模組報警事件之間的關聯關係,這需要對大量的事故單和專案流程進行學習,從而達到自動根因定位
場景二:自動檢測PV異常
主要是學習PV的變化曲線,標註出異常點;當資料量不足時,也可以人為模擬一些日誌,製造異常的峰谷值。
場景三:自動分析效能瓶頸並提出優化建議
場景四:自動關聯KPI異常與版本上線
KPIs(Key Performance Indicators)是用來衡量服務效能的關鍵指標。伺服器的異常行為包括潛在的風險、故障、bugs、攻擊等。而KPI異常檢測是指在KPI時序曲線上識別異常行為,並進行診斷和修復。
場景五:自動評估軟體更新對應用的影響(PV、網路卡吞吐率、記憶體利用率)
場景六:從線上事故報告單中提取有價值的資訊
現在事故報告單在公司裡都有相對固定的格式,可以用NLP技術+關鍵詞提取+命名實體識別等對事故報告單結合PV、KPI等指標進行分析。
上述情景下這幾大要素的解決:
資料:海量日誌作為特徵資料。
標註:格式化的線上事故單、事故報告。
演算法:運維人員向演算法開發人員描述運維異常,開發人員負責構建異常檢測系統和檢測器。
應用:運維人員可以設計、部署、使用、並受益於智慧運維繫統,形成有效閉環。
同時,如果我們把關注的那些KPI,如果抽象成時序資料,跟電商的銷售資料,跟遊戲的KPI指標沒有本質的區別,因此,如何結合行業,也可以做一些智慧的銷售預測,遊戲線上峰值監控等。如果抽象成演算法層面,可能都有很好的應用場景,但是如果在演算法層面進行更多投入,可以跳出運維本身到智慧運營這塊。
智慧運營
微信自動化運營工具及微信讀群助手。
場景一:微信讀群助手:每天群過多,大多數群處於『訊息免打擾』的狀態,希望智慧的讀取群中的有用資訊,生成每日群訊息日報。
資料及標註:有很多hook的方式可以獲取到個人的所有群的訊息。對群訊息進行人為的劃分,實際上抽象為『有用』和『無用』的二分類問題。
例如,在『人工智慧』的相關群中,對討論AI相關的聊天,劃分為『有用』,而『呵呵』或者表情,劃分為『無用』。在『吉他彈唱』相關的群裡,將吉他相關的聊天以及分享文章劃分為『有用』,其他劃分為『無用』。
模型及演算法,可以參考利用深度學習進行情感分析的論文以及開源專案。例如:
https://github.com/yala/introdeeplearning
但是,聊天不同於陳述。這背後涉及到一個本質的區別——“是否有互動”。一旦涉及到互動,情感分析(sentiment analysis)評判標準的複雜度就要上升不止一個數量級了。
原因第一是大部分隱藏資訊不出現在文字里,第二是互動對話資訊的跳躍,這導致LSTM的記憶其實作用不是太大。
一些方式可以利用NLU語義理解,從文字中抽取重要的實體和意圖,作為特徵加入到學習中,並且加上一套規則,結合使用者的建模模型再對這個聊天互動的『作用』進行判別。
場景二:微信自動化運營工具:如果你是一個B端,如何同時管理多個使用者群。除了目前的第三方工具的微信群的訊息轉發功能,其實有很多地方都可以引入智慧管理。
例如,群內使用者發廣告問題,可以抽象為二分類問題,利用NLP等技術對廣告進行識別。
再如,我們可以抓取分析群內使用者的歷史訊息行為,分析他們的職業、年齡等資訊,使用深度學習對使用者畫像標籤進行建模。
參考文獻:
http://www.aclweb.org/anthology/W15-1705
這樣,在使用者數極大的情況下,希望能篩選出最可能消費產品的潛在使用者。
智慧測試
智慧測試分為兩種,一種是採用智慧化的手段對線上產品做測試,另一種就是本身對深度學習模型引入深度學習的方法進行測試。
場景一:比如新上線一個功能,從UI介面的操作角度,可以有自動化的測試流程。順次執行介面上的各個功能,統計是否達到預期。再比如對各種API介面的測試,對傳入介面的引數依次做校驗,以及對結果資料是否達到預期進行測試。目前在這個領域,還在觀察智慧化引入的地方,也和大家多多交流。
場景二:用來測試深度學習系統的工具,例如DeepXplore,一個測試深度學習系統的白箱框架。它的主要作用在於:(1)可以生成輸入,生成儘可能不同的異常case,測試深度學習系統邏輯的不同部分;(2)不去人工干預的情況下,識別深度學習系統的不正確行為。並且利用多個有類似功能的深度學習系統作為交叉引證,因此避免了對錯誤行為的手動檢查。
參考文獻:
https://arxiv.org/abs/1705.06640
其他領域例如化學、製藥工程與深度學習相結合
這種結合可以發生在從巨集觀到微觀的多個層面:
例如上面這幅圖,是使用SVM和決策樹來發現無機-有機雜化材料,並且登上了Nature的封面。
在巨集觀上,例如在新藥合成上,通常通過對藥物分子化合物庫的學習來找到有意義的藥物分子結構。各種機器學習方法可以被用來預測化合物的毒理性,如急性毒性、皮膚敏感性以及各種慢性毒性,如致癌性、致畸性、對各種臟器的毒性等等。
到微觀層面,就和理論化學相關。比如將藥物分子抽象為圖,它的原子是節點,鍵是邊,利用分子的對稱性來預測分子的性質。
文獻參考:《Neural Message Passing for Quantum Chemistry》
將深度學習的方法引入化學,實際上是一種統計代替解析的思想。例如,在自然語言處理領域,最初的方法是像程式語言一樣,寫語法規則做語法分析然後得到語法樹再做下一步考慮。後來採用基於統計的方法——不考慮一個詞A到底是什麼成分,只看這個詞A出現在另一個詞B後面的概率有多大。化學也是類似,不再去使用DFT求薛定諤方程的近似解,而是基於累積的現象,用統計的方法,來預測分子的性質。
幾大要素的解決:
資料及標註:即表示化合物的方法。例如毒理性,遇上一條記錄一條,量不是很大。描述化合物的方法,有很多現成的軟體,比如PaDEL,這些描述符會計算化合物的一些結構資訊,比如包含幾個芳香環,有幾個sp2雜化的碳原子之類的,也會計算化合物的電荷分佈還有極性等性質。
搜尋和推薦
目前,推薦和搜尋中引入強化學習是非常有效的手段。強化學習,目前分類可以有以下幾種: 有根據獎賞最大化的不同,是基於概率(Policy_based),直接輸出下一步要採取的各種動作的概率, 然後根據概率採取行動;還是基於價值(Value_based)的方法輸出則是所有動作的價值, 我們會根據最高價值來選著動作。
有根據狀態更新策略來劃分的,比如是一個回合再進行更新,還是每進行一個動作就去更新。
主要建模方法為,把搜尋/推薦系統看作智慧體(Agent)、把使用者看做環境(Environment),則商品的推薦問題可以被視為典型的順序決策問題。Agent每一次排序策略的選擇可以看成一次試錯(Trial-and-Error),把使用者的反饋,點選成交等作為從環境獲得的獎賞。在這種反覆不斷地試錯過程中,Agent將逐步學習到最優的排序策略,最大化累計獎賞。
例如在推薦商品的場景中,利用使用者前幾個狀態下的點選、下單、收藏等行為,來推薦出當前狀態下的商品列表。
參考文獻:
《Reinforcement Learning Architecture for Web Recommendations》
《結合TensorFlow進行強化學習的程式碼實現》
視覺與行業結合
視覺和電商行業結合,已經有一些落地的產品應用。例如,陌上花科技對視訊和直播平臺,做實時的貼圖廣告、互動;瑪隆科技做時尚的智慧搜尋,可以上傳服裝圖片,找到含有相似服裝的圖片。Amazon Go也是利用視覺技術,鋪設線下的無人超市。視覺和行業結合的點也非常多。
那麼在AI+的過程中,我們會面臨哪些問題,以及如何解決呢?
深度學習面臨的4個挑戰及遞進解決方案
標註資料量較小
目前標註資料是非常昂貴的,尤其當資料量很大的時候。因此,如何從無標註資料或者儘可能需要少的標註資料裡學習,一個途徑就是利用生成式對抗網路,以及對偶學習的思路。
很多AI領域的任務,例如機器翻譯(中英對譯)、語音識別和語音合成,影象描述和影象生成,問題回答和問題生成等,都是對稱的任務。
而對偶學習的思路在於,用兩個神經網路分別對對稱任務進行學習,用學習的結果和源資料的相似性大小來進行訓練。
另一個途徑就是做一些自動標註工具。用一些標註資料先訓練一個自動標註模型,儘管準確度可以不是很高。用這個自動標註工具來對剩餘的大批量資料進行標註,最後加入人工稽核校對的過程。
模型本身太大,如何應用在移動端以及儘量不損失精度
目前在手持裝置上採用AI模型是前沿趨勢。這就衍生出了很多加速計算的方向,其中重要的兩個方向是對記憶體空間和速度的優化。採用的方式一是精簡模型,既可以節省記憶體空間,也可以加快計算速度;二是加快框架的執行速度,影響框架執行速度主要有兩方面的因素,即模型的複雜度和每一步的計算速度。
精簡模型主要是使用更低的權重精度,如量化(quantization)或權重剪枝(weight pruning)。剪枝是指剪小權重的連線,把所有權值連線低於一個閾值的連線從網路裡移除。
而加速框架的執行速度一般不會影響模型的引數,是試圖優化矩陣之間的通用乘法(GEMM)運算,因此會同時影響卷積層(卷積層的計算是先對資料進行im2col運算,再進行GEMM運算)和全連線層。
量化(quantitative),這裡不是指金融上的量化交易,而是指離散化。量化是一個總括術語,是用比32位浮點數更少的空間來儲存和執行模型,並且TensorFlow量化的實現遮蔽了儲存和執行細節。
神經網路訓練時要求速度和準確率,訓練通常在GPU上進行,所以使用浮點數影響不大。但是在預測階段,使用浮點數會影響速度。量化可以在加快速度的同時,保持較高的精度。
量化網路的動機主要有兩個。最初的動機是減小模型檔案的大小。模型檔案往往佔據很大的磁碟空間,例如,ImageNet上訓練出的幾個模型每個都接近200 MB,模型中儲存的是分佈在大量層中的權值。在儲存模型的時候用8位整數,模型大小可以縮小為原來32位的25%左右。在載入模型後運算時轉換回32位浮點數,這樣已有的浮點計算程式碼無需改動即可正常執行。
量化的另一個動機是降低預測過程需要的計算資源。這在嵌入式和移動端非常有意義,能夠更快地執行模型,功耗更低。從體系架構的角度來說,8位的訪問次數要比32位多,在讀取8位整數時只需要32位浮點數的1/4的記憶體頻寬,例如,在32位記憶體頻寬的情況下,8位整數可以一次訪問4個,32位浮點數只能1次訪問1個。而且使用SIMD指令,可以在一個時鐘週期裡實現更多的計算。另一方面,8位對嵌入式裝置的利用更充分,因為很多嵌入式晶片都是8位、16位的,如微控制器、數字訊號處理器(DSP晶片),8位可以充分利用這些。
此外,神經網路對於噪聲的健壯性很強,因為量化會帶來精度損失(這種損失可以認為是一種噪聲),並不會危害到整體結果的準確度。
那能否用低精度格式來直接訓練呢?答案是,大多數情況下是不能的。因為在訓練時,儘管前向傳播能夠順利進行,但往往反向傳播中需要計算梯度。例如,梯度是0.2,使用浮點數可以很好地表示,而整數就不能很好地表示,這會導致梯度消失。因此需要使用高於8位的值來計算梯度。因此,正如在本節一開始介紹的那樣,在移動端訓練模型的思路往往是,在PC上正常訓練好浮點數模型,然後直接將模型轉換成8位,移動端是使用8位的模型來執行預測的過程。
如何從小樣本中有效學習
深度學習往往需要大量資料,當資料量不足,或者資料不足以覆蓋所有場景時,往往就要把深度學習、知識圖譜、邏輯推理、符號學習等結合起來,將人類已有的一些先驗知識結合神經網路進行訓練。
例如,《Label-Free Supervision of Neural Networks with Physics and Domain Knowledge》中介紹的『用物理和特定領域知識讓神經網路進行不帶標籤的監督學習』,在視訊中把運動的枕頭的軌跡檢測出來。結合物質知識,枕頭運動的軌跡應該是二次型的拋物線,這樣就減少林要大量地對視訊的每一幀枕頭運動軌跡進行標註。
資料稀疏
資料稀疏性很多場景下面臨的調整,尤其是個性化推薦系統中,待處理的推薦系統規模越來越大,使用者和商品數目動輒百千萬計,兩個使用者之間選擇的重疊非常少,使用者對商品的消費、點選、評論行為更是稀少。資料非常稀疏,使得絕大部分基於關聯分析的演算法(譬如協同過濾)效果都不好。
因此,一般會用一些特徵提取、或者對使用者和商品進行聚類的方法。亞馬遜的 DSSTNE(https://github.com/amznlabs/amazon-dsstne)是專門針對稀疏場景下的開源深度學習框架。在稀疏場景下,DSSTNE的運算速度比其他深度學習庫快得多,推薦問題及不少自然語言理解任務都屬於這個領域。
最後,歡迎大家提出自己領域中的問題,一起交流AI的解決方案。
作者簡介:李嘉璇,《TensorFlow技術解析與實戰》作者,建立 TensorFlow 技術社群,活躍於國內各大技術社群,知乎程式設計問題回答者。擅長研究深度學習框架的架構、原始碼分析及在不同領域的應用。