Mail.ru Mail 中機器學習的操作

Mail.ru Mail 中機器學習的操作

基於我在 Highload++ 和 DataFest Minsk 2019 上的演講。

對於今天的許多人來說,郵件是在線生活不可或缺的一部分。 在它的幫助下,我們可以進行商務信函,儲存與財務、飯店預訂、下訂單等相關的各種重要資訊。 2018年年中,我們制定了郵件開發的產品策略。 現代郵件應該是什麼樣的?

郵件必須是 烏姆諾,即幫助用戶瀏覽不斷增加的資訊:過濾、結構化並以最便捷的方式提供資訊。 她一定是 有用,允許您直接在郵箱中解決各種任務,例如支付罰款(不幸的是,我使用了該功能)。 當然,同時,郵件必須提供資訊保護,切斷垃圾郵件並防止駭客攻擊,即 安全的.

這些領域定義了許多關鍵問題,其中許多問題可以使用機器學習有效解決。 以下是作為該策略的一部分開發的現有功能的範例 - 每個方向一個。

  • 聰明的回复。 郵件具有智慧回覆功能。 神經網路分析信件的文本,理解其意義和目的,從而提供三種最合適的回應選項:積極、消極和中立。 這有助於顯著節省回信時間,而且通常會以非標準且有趣的方式回覆。
  • 將電子郵件分組與線上商店中的訂單相關。 我們經常在網上購物,通常商店可以為每個訂單發送多封電子郵件。 例如,最大的服務速賣通,一個訂單會包含很多字母,我們計算出,在終端情況下,它們的數量最多可達 29 個。因此,使用命名實體識別模型,我們提取訂單號以及文本中的其他訊息,並將所有字母分組到一個線程中。 我們還在單獨的框中顯示有關訂單的基本信息,這使得使用此類電子郵件變得更加容易。

    Mail.ru Mail 中機器學習的操作

  • 反網絡釣魚。 網路釣魚是一種特別危險的詐騙電子郵件類型,攻擊者試圖利用該電子郵件獲取財務資訊(包括使用者的銀行卡)和登入資訊。 這些信件模仿了該服務發送的真實信件,包括視覺上的模仿。 因此,在電腦視覺的幫助下,我們可以識別大公司(例如Mail.ru、Sber、Alfa)的標誌和信件的設計風格,並將其與垃圾郵件和網路釣魚分類器中的文字和其他特徵一起考慮在內。

機器學習

關於電子郵件中的機器學習的一些一般知識。 郵件是一個高負載的系統:平均每天有 1,5 億封信件通過我們的伺服器,為 30 萬 DAU 用戶提供服務。 大約 30 個機器學習系統支援所有必要的功能和特性。

每個字母都會經過整個分類流程。 首先,我們切斷垃圾郵件並留下好的電子郵件。 使用者通常不會注意到反垃圾郵件的工作,因為 95-99% 的垃圾郵件甚至沒有進入適當的資料夾。 垃圾郵件識別是我們系統中非常重要的部分,也是最困難的部分,因為在反垃圾郵件領域,防禦和攻擊系統之間不斷適應,這為我們的團隊提供了持續的工程挑戰。

接下來,我們將來自人和機器人的字母分開。 來自人們的電子郵件是最重要的,因此我們為他們提供了智慧回覆等功能。 機器人發出的信件分為兩部分:交易性的——這些是來自服務的重要信件,例如購買或酒店預訂、財務的確認,以及資訊性的——這些是商業廣告、折扣。

我們相信交易電子郵件與個人信件同等重要。 它們應該在手邊,因為我們經常需要快速查找有關訂單或機票預訂的信息,並且我們會花時間搜索這些信件。 因此,為了方便起見,我們自動將其分為六個主要類別:旅行、訂單、金融、門票、登記,最後是罰款。

資訊信件是最大且可能不太重要的一組,不需要立即回复,因為如果用戶不閱讀此類信件,其生活不會發生任何重大變化。 在我們的新介面中,我們將它們折疊成兩個線程:社交網路和時事通訊,從而在視覺上清理收件箱,只留下重要的訊息可見。

Mail.ru Mail 中機器學習的操作

開發

系統數量眾多,為操作帶來許多困難。 畢竟,模型會隨著時間的推移而退化,就像任何軟體一樣:功能損壞、機器故障、程式碼變得錯誤。 此外,數據不斷變化:新數據的添加、用戶行為模式的轉變等,因此沒有適當支援的模型隨著時間的推移變得越來越糟糕。

我們不能忘記,機器學習越深入使用者的生活,對生態系統的影響就越大,市場參與者可以獲得的經濟損失或利潤就越大。 因此,在越來越多的領域,玩家正在適應機器學習演算法的工作(典型的例子是廣告、搜尋和已經提到的反垃圾郵件)。

此外,機器學習任務有一個特殊性:系統中的任何(即使是微小的)變更都可能導致模型產生大量工作:處理資料、重新訓練、部署,這可能需要數週或數月的時間。 因此,模型運作的環境變化越快,維護它們所需的精力就越多。 一個團隊可以創建很多系統並對此感到高興,但隨後會花費幾乎所有資源來維護它們,而沒有機會做任何新的事情。 我們在反垃圾郵件團隊中曾經遇到過這樣的情況。 他們得出了明顯的結論:支援需要自動化。

自動化

什麼可以自動化? 事實上,幾乎一切。 我確定了定義機器學習基礎設施的四個領域:

  • 數據採集;
  • 附加訓練;
  • 部署;
  • 測試和監控。

如果環境不穩定且不斷變化,那麼模型周圍的整個基礎設施就會比模型本身重要得多。 它可能是一個很好的老式線性分類器,但如果你為其提供正確的功能並從用戶那裡獲得良好的反饋,它將比具有所有花哨功能的最先進模型工作得更好。

回饋迴路

這個週期結合了資料收集、額外的訓練和部署——實際上是整個模型更新周期。 為什麼它如此重要? 查看郵件中的報名時間表:

Mail.ru Mail 中機器學習的操作

機器學習開發人員實施了一種反機器人模型,可防止機器人在電子郵件中註冊。 此圖表下降到僅保留真實使用者的值。 一切都很好! 但四個小時過去了,機器人調整了劇本,一切恢復正常。 在此實施中,開發人員花了一個月的時間添加功能並重新訓練模型,但垃圾郵件發送者能夠在四個小時內適應。

為了不那麼痛苦,也不必以後重做所有事情,我們必須先考慮回饋循環會是什麼樣子,以及如果環境改變我們會做什麼。 讓我們從收集數據開始——這是我們演算法的燃料。

資料收集

顯然,對於現代神經網路來說,數據越多越好,而且它們實際上是由產品的用戶生成的。 使用者可以透過標記資料來幫助我們,但我們不能濫用這一點,因為在某些時候使用者會厭倦完成你的模型並會切換到另一個產品。

最常見的錯誤之一(這裡我引用了吳恩達)是過於專注於測試資料集的指標,而不是用戶的回饋,這實際上是衡量工作品質的主要指標,因為我們創建了為用戶提供的產品。 如果使用者不理解或不喜歡模型的工作,那麼一切都毀了。

因此,用戶應該始終能夠投票,並且應該為用戶提供回饋工具。 如果我們認為一封與財務相關的信件已到達郵箱,我們需要將其標記為“財務”,並繪製一個按鈕,用戶可以單擊該按鈕並說這不是財務。

反饋品質

我們來談談用戶回饋的品質。 首先,您和使用者可以將不同的意義賦予一個概念。 例如,你和你的產品經理認為「金融」就是銀行的信件,而用戶認為奶奶寫的一封關於她退休金的信也指的是金融。 其次,有些使用者喜歡盲目地按下沒有任何邏輯的按鈕。 第三,使用者的結論可能有嚴重錯誤。 我們實踐中的一個引人注目的例子是分類器的實現 尼日利亞垃圾郵件,一種非常有趣的垃圾郵件,要求用戶從突然發現的非洲遠親那裡拿走幾百萬美元。 實施此分類器後,我們檢查了這些電子郵件上的「非垃圾郵件」點擊,結果發現其中 80% 是有趣的尼日利亞垃圾郵件,這表明用戶可能非常容易上當受騙。

我們不要忘記,這些按鈕不僅可以被點擊,還可以被各種偽裝成瀏覽器的機器人點擊。 所以原始回饋不利於學習。 您可以利用這些資訊做什麼?

我們使用兩種方法:

  • 來自連結 ML 的回饋。 例如,我們有一個線上反機器人系統,正如我所提到的,它根據有限數量的跡像做出快速決策。 還有第二個緩慢的系統事後才會運作。 它有更多關於用戶、他的行為等的數據。 因此,所做的決策是最明智的,因而具有更高的準確性和完整性。 您可以將這些系統的操作差異引導到第一個系統作為訓練資料。 因此,一個更簡單的系統總是會嘗試接近一個更複雜的系統的效能。
  • 點擊分類。 您可以簡單地對每個使用者點擊進行分類,評估其有效性和可用性。 我們在反垃圾郵件中使用使用者屬性、歷史記錄、寄件者屬性、文字本身和分類器的結果來執行此操作。 結果,我們得到了一個驗證使用者回饋的自動系統。 由於它需要重新訓練的頻率要低得多,因此它的工作可以成為所有其他系統的基礎。 此模型的首要任務是精確度,因為使用不準確的資料訓練模型會帶來後果。

當我們清理數據並進一步訓練我們的機器學習系統時,我們不能忘記用戶,因為對我們來說,圖表上成千上萬的錯誤只是統計數據,而對於用戶來說,每個錯誤都是一場悲劇。 除了用戶必須以某種方式忍受產品中的錯誤之外,在收到回饋後,他預計將來會消除類似的情況。 因此,不僅值得為用戶提供投票的機會,而且還可以糾正機器學習系統的行為,例如為每次反饋點擊創建個人啟發法;就郵件而言,這可能是過濾的能力此類信件的發件人以及該用戶的頭銜。

您還需要根據一些報告或請求建立模型,以半自動或手動模式提供支持,以便其他使用者不會遇到類似的問題。

啟發式學習

這些啟發法和拐杖有兩個問題。 首先,拐杖的數量不斷增加,難以維護,更不用說長期的品質和性能了。 第二個問題是錯誤可能不會頻繁發生,並且幾次點擊來進一步訓練模型是不夠的。 如果應用以下方法,這兩種不相關的影響似乎可以被顯著抵消。

  1. 我們製作了一個臨時拐杖。
  2. 我們將資料從它發送到模型,它會定期自我更新,包括接收到的資料。 當然,在這裡,啟發式方法具有高精度非常重要,以免降低訓練集中資料的品質。
  3. 然後我們設定監視器來觸發拐杖,如果一段時間後拐杖不再起作用並且完全被模型覆蓋,那麼你就可以安全地將其移除。 現在這個問題不太可能再發生。

所以一支拐杖大軍是非常有用的。 最主要的是他們的服務是緊急的而不是永久性的。

附加訓練

再訓練是添加根據使用者或其他系統的回饋所獲得的新數據,並在其上訓練現有模型的過程。 額外的訓練可能會出現幾個問題:

  1. 這個模型可能根本不支援額外的訓練,而只能從頭開始學習。
  2. 自然書中沒有任何地方寫到額外的訓練肯定會提高生產工作的品質。 常常會發生相反的情況,即只會惡化。
  3. 變化可能是不可預測的。 這是我們自己確定的一個相當微妙的點。 即使新模型在 A/B 測試中顯示與目前模型相似的結果,但這並不意味著它的工作原理相同。 他們的工作可能只有百分之一的差異,這可能會帶來新的錯誤或返回已更正的舊錯誤。 我們和用戶都已經知道如何忍受當前的錯誤,當出現大量新錯誤時,用戶也可能不明白發生了什麼,因為他期望可預測的行為。

因此,額外訓練最重要的是保證模型得到改善,或至少不會惡化。

當我們談論額外訓練時,首先想到的是主動學習方法。 這是什麼意思? 例如,分類器確定電子郵件是否與財務相關,並在其決策邊界周圍添加標記範例的樣本。 例如,在廣告領域,這種方法效果很好,因為那裡有很多回饋,您可以在線上訓練模型。 如果回饋很少,那麼我們會得到相對於生產資料分佈高度偏差的樣本,在此基礎上無法評估模型在運行過程中的行為。

Mail.ru Mail 中機器學習的操作

事實上,我們的目標是保留舊的模式、已知的模型,並獲得新的模型。 連續性在這裡很重要。 我們經常煞費苦心推出的模型已經在發揮作用,因此我們可以專注於它的性能。

郵件中使用了不同的模型:樹、線性、神經網路。 對於每一個,我們都會發展出自己的附加訓練演算法。 在額外訓練的過程中,我們不僅收到新數據,而且經常收到新特徵,我們將在下面的所有演算法中考慮到這些新特徵。

線性模型

假設我們有邏輯迴歸。 我們從以下元件建立損失模型:

  • 新數據的 LogLoss;
  • 我們規範新特徵的權重(我們不觸及舊特徵);
  • 我們也從舊資料中學習以保留舊模式;
  • 也許最重要的是:我們添加了諧波正則化,這保證了根據規範,權重相對於舊模型不會發生太大變化。

由於每個Loss分量都有係數,我們可以透過交叉驗證或根據產品需求為我們的任務選擇最佳值。

Mail.ru Mail 中機器學習的操作

樹木

讓我們繼續討論決策樹。 我們編寫了以下演算法來進行樹的額外訓練:

  1. 該產品運行著一個由 100-300 棵樹組成的森林,並根據舊資料集進行訓練。
  2. 最後,我們刪除 M = 5 區塊並新增 2M = 10 個新區塊,在整個資料集上進行訓練,但新資料的權重較高,這自然保證了模型的增量變化。

顯然,隨著時間的推移,樹木的數量大大增加,必須定期減少樹木以滿足時間要求。 為此,我們使用現在無所不在的知識蒸餾(KD)。 簡單介紹一下其工作原理。

  1. 我們有當前的“複雜”模型。 我們在訓練資料集上運行它並在輸出處獲得類機率分佈。
  2. 接下來,我們訓練學生模型(在本例中是樹較少的模型),以使用類別分佈作為目標變數來重複模型的結果。
  3. 這裡要注意的是,我們不以任何方式使用資料集標記,因此我們可以使用任意資料。 當然,我們使用戰鬥流中的資料樣本作為學生模型的訓練樣本。 因此,訓練集使我們能夠確保模型的準確性,而流樣本保證了生產分佈上的相似性能,補償了訓練集的偏差。

Mail.ru Mail 中機器學習的操作

這兩種技術的結合(添加樹並使用知識蒸餾定期減少樹的數量)確保了新模式的引入和完整的連續性。

在 KD 的幫助下,我們也對模型特徵執行不同的操作,例如刪除特徵和處理間隙。 在我們的例子中,我們有許多重要的統計特徵(按寄件者、文字雜湊、URL 等)儲存在資料庫中,這些特徵往往會失敗。 當然,該模型還沒有準備好應對事件的這種發展,因為訓練集中不會發生故障情況。 在這種情況下,我們結合 KD 和增強技術:在訓練部分資料時,我們刪除或重置必要的特徵,並採用原始標籤(目前模型的輸出),學生模型學習重複此分佈。

Mail.ru Mail 中機器學習的操作

我們注意到,模型操縱越嚴重,所需的線程樣本百分比就越大。

特徵刪除是最簡單的操作,只需要流程的一小部分,因為只有幾個特徵發生變化,而當前模型是在同一組上訓練的 - 差異很小。 為了簡化模型(減少數倍的樹數量),已經需要50到50棵了,而對於重要統計特徵的遺漏,會嚴重影響模型的性能,甚至需要更多的流量來均衡工作量。適用於所有類型字母的新防遺漏模型。

Mail.ru Mail 中機器學習的操作

快速文本

讓我們繼續討論 FastText。 讓我提醒您,單字的表示(嵌入)由單字本身的嵌入及其所有字母 N 元語法(通常是三元語法)的嵌入總和組成。 由於三元組可能相當多,因此使用了Bucket Hashing,即將整個空間轉換為某個固定的hashmap。 這樣就得到了內層每個單字數+桶的維度的權重矩陣。

透過額外的訓練,新的符號出現:單字和三元組。 Facebook 的標準後續訓練沒有發生任何重大事件。 只有具有交叉熵的舊權重才會根據新資料進行重新訓練。 因此,不使用新特徵;當然,這種方法具有與生產中模型的不可預測性相關的所有上述缺點。 這就是我們對 FastText 進行一些修改的原因。 我們添加了所有新的權重(單字和三元組),用交叉熵擴展整個矩陣,並與線性模型類似地添加調和正則化,這保證了舊權重的變化不顯著。

Mail.ru Mail 中機器學習的操作

CNN的

卷積網稍微複雜一些。 如果最後幾層在 CNN 中完成,那麼當然可以應用調和正則化並保證連續性。 但如果需要對整個網路進行額外的訓練,那麼這種正則化就不能再應用於所有層。 然而,可以選擇透過 Triplet Loss 來訓練互補嵌入(來源文章).

三重損失

以反釣魚任務為例,我們來概括一下 Triplet Loss。 我們採用我們的徽標以及其他公司徽標的正面和反面範例。 我們最小化第一個之間的距離並最大化第二個之間的距離,我們以較小的間隙來確保類別的更緊湊。

Mail.ru Mail 中機器學習的操作

如果我們進一步訓練網絡,那麼我們的度量空間就會完全改變,並且它與先前的度量空間完全不相容。 這是使用向量的問題中的一個嚴重問題。 為了解決這個問題,我們將在訓練期間混合舊的嵌入。

我們已將新資料新增至訓練集中,並從頭開始訓練模型的第二個版本。 在第二階段,我們進一步訓練我們的網路(微調):先完成最後一層,然後整個網路解凍。 在組合三元組的過程中,我們僅使用經過訓練的模型計算部分嵌入,其餘部分使用舊模型。 因此,在額外訓練的過程中,我們保證了度量空間v1和v2的兼容性。 諧波正規化的獨特版本。

Mail.ru Mail 中機器學習的操作

整體架構

如果我們以使用反垃圾郵件的整個系統為例,那麼模型並不是孤立的,而是相互嵌套的。 我們拍攝圖片、文字和其他特徵,使用 CNN 和 Fast Text 獲得嵌入。 接下來,在嵌入之上應用分類器,它提供各種類別的分數(字母類型、垃圾郵件、標誌的存在)。 信號和標誌已經進入樹林,等待做出最終決定。 此方案中的各個分類器可以更好地解釋系統的結果,並在出現問題時更具體地重新訓練組件,而不是將所有資料以原始形式輸入決策樹。

Mail.ru Mail 中機器學習的操作

因此,我們保證各個層面的連續性。 在CNN和Fast Text的底層,我們使用調和正則化,對於中間的分類器,我們也使用調和正則化和速率校準來確保機率分佈的一致性。 嗯,樹提升是增量訓練的或使用知識蒸餾。

一般來說,維護這樣一個嵌套的機器學習系統通常很痛苦,因為較低層級的任何組件都會導致上面整個系統的更新。 但由於在我們的設置中,每個組件都略有變化並且與前一個組件兼容,因此整個系統可以逐個更新,而不需要重新訓練整個結構,這使得它可以在沒有嚴重開銷的情況下得到支持。

部署

我們已經討論了不同類型模型的資料收集和額外訓練,因此我們將繼續將它們部署到生產環境中。

A/B 測試

正如我前面所說,在收集資料的過程中,我們通常會得到一個有偏差的樣本,從中無法評估模型的生產表現。 因此,在部署時,必須將模型與先前的版本進行比較,以了解實際情況如何,即進行A/B測試。 事實上,推出和分析圖表的過程非常常規,並且可以輕鬆自動化。 我們逐漸向 5%、30%、50% 和 100% 的用戶推出模型,同時收集有關模型回應和用戶回饋的所有可用指標。 在一些嚴重異常值的情況下,我們會自動回滾模型,而對於其他情況,在收集了足夠數量的使用者點擊後,我們決定增加百分比。 因此,我們完全自動地將新模型帶給 50% 的用戶,並且向整個受眾的推出將由一個人批准,儘管此步驟可以自動化。

然而,A/B 測試過程提供了優化的空間。 事實上,任何 A/B 測試都相當長(在我們的例子中,需要 6 到 24 小時,取決於回饋量),這使得它相當昂貴且資源有限。 此外,需要足夠高的測試流量百分比才能從本質上加快 A/B 測試的整體時間(招募具有統計意義的樣本來評估小百分比的指標可能需要很長時間),這使得A/B 插槽的數量極為有限。 顯然,我們只需要測試最有前景的模型,我們在額外的訓練過程中收到了很多模型。

為了解決這個問題,我們訓練了一個單獨的分類器來預測 A/B 測試的成功。 為此,我們將訓練集、延遲集以及流中樣本的決策統計資料、精確度、召回率和其他指標作為特徵。 我們也將該模型與目前生產中的模型進行啟發式比較,並考慮模型的複雜性。 使用所有這些特徵,經過測試歷史訓練的分類器會評估候選模型(在我們的例子中,這些模型是樹木森林),並決定在 A/B 測試中使用哪個模型。

Mail.ru Mail 中機器學習的操作

在實施時,這種方法使我們能夠將成功的 A/B 測試數量增加數倍。

測試與監控

奇怪的是,測試和監測不會損害我們的健康;相反,它們會改善我們的健康並減輕我們不必要的壓力。 測試可以讓你預防故障,監控可以讓你及時發現故障,減少對使用者的影響。

重要的是要理解,您的系統遲早總是會犯錯 - 這是由於任何軟體的開發週期造成的。 系統開發之初總是會出現許多bug,直到一切穩定下來,完成創新的主要階段。 但隨著時間的推移,熵會產生影響,並且由於周圍組件的退化和數據的變化,錯誤再次出現,這我在開始時談到過。

這裡我想指出的是,任何機器學習系統都應該從整個生命週期的利潤角度來考慮。 下圖顯示了系統如何捕獲罕見類型的垃圾郵件的範例(圖中的線接近零)。 有一天,由於一個錯誤快取的屬性,她發瘋了。 幸運的是,由於沒有監控異常觸發,系統開始將大量信件儲存到決策邊界的「垃圾郵件」資料夾中。 儘管糾正了後果,但該系統已經犯了很多次錯誤,即使五年後也無法收回成本。 從模型生命週期的角度來看,這是徹底的失敗。

Mail.ru Mail 中機器學習的操作

因此,像監控這樣簡單的事情可能會成為模型生命週期中的關鍵。 除了標準和明顯的指標之外,我們還考慮模型反應和分數的分佈,以及關鍵特徵值的分佈。 使用KL散度,我們可以將當前分佈與歷史分佈進行比較,或將A/B測試中的值與流的其餘部分進行比較,這使我們能夠注意到模型中的異常並及時回滾變更。

在大多數情況下,我們使用簡單的啟發式方法或模型來啟動我們的第一個版本的系統,並在未來用作監控。 例如,我們監控特定線上商店的 NER 模型與常規模型的比較,如果分類器覆蓋率與它們相比下降,那麼我們就能了解原因。 啟發式的另一個有用用途!

結果

讓我們再回顧一下這篇文章的核心思想。

  • 纖維甲板。 我們始終為使用者著想:他將如何忍受我們的錯誤,以及他將如何報告這些錯誤。 不要忘記,使用者並不是訓練模型的純粹回饋來源,需要藉助輔助機器學習系統來清除。 如果無法從使用者收集訊號,那麼我們會尋找替代回饋來源,例如連接系統。
  • 附加訓練。 這裡最主要的是連續性,所以我們依賴目前的生產模式。 我們訓練新模型,由於諧波正則化和類似的技巧,它們與先前的模型沒有太大區別。
  • 部署。 基於指標的自動部署大大減少了模型實現的時間。 監控決策的統計數據和分佈、用戶跌倒次數對於您安寧的睡眠和高效的周末至關重要。

好吧,我希望這可以幫助您更快地改進機器學習系統,更快地將其推向市場,並使其更可靠、壓力更小。

來源: www.habr.com

添加評論