健全的邏輯和單調的 AI 模型
已發表: 2022-03-11AI 正迅速成為一項驚人的資產,在圖像識別、圍棋甚至撲克等領域達到了超人的性能水平。 許多人對人工智能和人類的未來感到興奮。 與此同時,人們普遍認為 AI 確實存在一個令人討厭的缺陷:當前狀態下的 AI 可能無法預測地不可靠。
經典的例子是危險! IBM 挑戰賽期間,IBM AI 沃森輕鬆地清理了棋盤,卻錯過了“最後的危險!” 問題,屬於美國城市類別:“它最大的機場以二戰英雄的名字命名; 它是二戰中第二大戰役。” 沃森回答說:“多倫多是什麼????”——額外的問號(和低賭注)表明了它的懷疑。
因此,即使人工智能在很長一段時間內(數月、數年、甚至數十年)都具有童話般的性能,但總是有這種令人煩惱的可能性,即突然之間,它會莫名其妙地犯錯。
我們人類最關心的不是人工智能會犯錯,而是這個錯誤有多“不合邏輯”。 在 Watson 的案例中,不知道問題答案的人會“從邏輯上”嘗試至少猜測美國的一個主要城市。 我相信這是我們尚未公開採用自動駕駛汽車的主要原因之一:即使自動駕駛汽車在統計上可能更安全,但我們擔心它們的底層人工智能可能會出現與 Watson 類似的意外錯誤,但後果更嚴重。
這讓我想知道,正確的 AI 模型能否解決這個問題? 正確的人工智能是否有能力在關鍵時刻做出正確的決定,即使它沒有所有的答案? 這樣的人工智能將能夠改變技術的進程,讓我們獲得人工智能的童話般的好處……
我相信這些問題的答案是肯定的。 我相信像 Watson 那樣的錯誤可以通過使用改進的、邏輯上更受約束的模型來避免,這些模型的早期原型被稱為單調機器學習模型。 暫時不詳述,使用適當的單調 AI 模型:
- 自動駕駛汽車會更安全,因為即使在存在大量其他信號的情況下,檢測到最少量的人類信號也總是足以激活安全協議。
- 機器學習 (ML) 系統對對抗性攻擊和意外情況更加穩健。
- ML 性能將更合乎邏輯且更易於理解。
我相信我們正在從 AI 的計算和算法能力大幅增長的時代走向 AI 的技巧、有效性和理解力的時代,而單調的機器學習模型是這一激動人心的旅程的第一步。 單調模型使 AI 更“合乎邏輯”。
編者註:鼓勵希望在了解 ML 基礎知識方面邁出自己第一步的讀者閱讀我們關於 ML 的介紹性文章。
單調人工智能模型理論
那麼什麼是單調模型呢? 鬆散地說,單調模型是具有某些特徵(單調特徵)的 ML 模型,這些特徵的增加總是會導致模型增加其輸出。
從技術上...
...有兩個地方上面的定義是不精確的。
首先,這裡的特徵是單調遞增的。 我們也可以有單調遞減的特徵,其增加總是導致模型減少。 兩者可以簡單地通過取反(乘以-1)相互轉換。
其次,當我們說輸出增加時,我們並不是說它嚴格增加——我們的意思是它不會減少,因為輸出可以保持不變。
在現實生活中,許多變量對錶現出單調關係。 例如:
- 旅行的汽油價格在行駛距離上單調增加。
- 信用越好,獲得貸款的可能性就越大。
- 預計駕駛時間會隨著交通量的增加而增加。
- 收入隨著廣告點擊率的增加而增加。
儘管這些邏輯關係足夠清晰,但對於使用有限數據且沒有領域知識進行插值的 ML 模型,它們可能不是。 事實上,該模型可能會錯誤地插入它們,從而導致荒謬和古怪的預測。 確實捕獲此類知識的機器學習模型在實踐中表現更好(通過避免過度擬合),更容易調試,並且更易於解釋。 在大多數用例中,單調模型應與普通模型結合使用,作為學習器集合的一部分。
單調 AI 模型真正大放異彩的一個地方是對抗性魯棒性。 單調模型是“強化”機器學習模型,這意味著它們可以抵抗對抗性攻擊。 只能操縱非單調特徵的攻擊者無法避開單調 AI 模型,因為他們無法更改示例相對於單調 AI 模型的標籤。
單調 AI 模型的用例
到目前為止,這個討論完全是理論上的。 讓我們討論一些現實生活中的用例。
用例 #1:惡意軟件檢測
單調 AI 模型最酷的用例之一就是它們在惡意軟件檢測中的應用。 作為 Windows Defender 的一部分實施,每台最新的 Windows 設備中都存在一個單調模型,可以悄悄地保護用戶免受惡意軟件的侵害。
在一種情況下,惡意軟件作者冒充合法的註冊企業來欺騙證書頒發機構,成功地使用受信任的證書對其惡意軟件進行數字代碼簽名。 一個幼稚的惡意軟件分類器可能會使用代碼簽名作為一種特徵,並且會指示此類樣本是良性的。
但 Windows Defender 的單調 AI 模型並非如此,其單調特徵只是指示惡意軟件的特徵。 無論惡意軟件作者向其惡意軟件中註入了多少“良性”內容,Windows Defender 的單調 AI 模型都將繼續捕獲樣本並保護用戶免受損害。
在我的紅隊黑客機器學習課程中,我教授了幾種規避基於 ML 的惡意軟件分類器的技術。 其中一種技術包括用“良性”內容/特徵填充惡意樣本以逃避幼稚的 ML 模型。 單調模型可以抵抗這種攻擊,並迫使惡意行為者更加努力地工作,如果他們想要逃避分類器的話。
用例 #2:內容過濾
假設一個團隊正在為學校圖書館構建一個網上沖浪內容過濾器。 單調的 AI 模型非常適合在這裡使用,因為包含不適當內容的論壇也可能包含大量可接受的內容。
一個簡單的分類器可能會權衡“適當”特徵的存在與“不適當”特徵的存在。 但這行不通,因為我們不希望我們的孩子訪問不適當的內容,即使它只佔內容的一小部分。
用例 #3:自動駕駛汽車 AI
想像一下構建一個自動駕駛汽車算法。 它查看圖像並看到綠燈。 它還看到一個行人。 它應該權衡每個信號嗎? 絕對不。 行人的存在足以做出停車的決定。 行人的存在應被視為單調特徵,在這種情況下應使用單調 AI 模型。
用例 #4:推薦引擎
推薦引擎是單調 AI 模型的一個很好的用例。 一般來說,他們可能對每個產品有很多輸入:星級、價格、評論數量等。在所有其他輸入相同的情況下,例如星級和價格,我們更喜歡評論數量更多的產品。 我們可以使用單調的 AI 模型來執行這樣的邏輯。
用例 #5:垃圾郵件和網絡釣魚過濾
此用例類似於惡意軟件檢測用例。 惡意用戶可能會在他們的垃圾郵件或網絡釣魚電子郵件中註入看似良性的術語,以欺騙垃圾郵件過濾器。 單調的 AI 模型將對此免疫。
實施與示範
在單調 AI 模型的免費實現方面,三個最受支持的模型脫穎而出:XGBoost、LightGBM 和 TensorFlow Lattice。
單調 ML XGBoost 教程
基於多年的實證研究和競爭,XGBoost 被認為是結構化數據上性能最好的算法之一。 此外,XGBoost 中還實現了單調性。
以下有關如何使用單調 ML 模型的演示 XGBoost 教程附帶 Python 存儲庫。
首先導入一些庫:
import random import numpy as np import matplotlib.pyplot as plt %matplotlib inline from sklearn.metrics import confusion_matrix import seaborn as sns sns.set(font_scale=1.4)
我們要建模的場景是內容過濾或惡意軟件數據庫。 我們將有一些benign_features
特徵,例如,與“科學”、“歷史”和“體育”相關的內容量,或者在惡意軟件案例中,“代碼簽名”和“公認的作者”。
此外,我們將有malicious_features
特徵,它可以建模,例如,與“暴力”和“毒品”相關的內容量,或者在惡意軟件案例中,“調用加密庫的次數”和“對與已知的惡意軟件家族相似。”
我們將通過生成模型對情況進行建模。 我們使用以下函數隨機生成大量數據點,大約一半是良性的,一半是惡意的:
def flip(): """Simulates a coin flip.""" return 1 if random.random() < 0.5 else 0
每個數據點將隨機生成其特徵。 “良性”數據點對良性特徵的偏差更高,而“惡意”數據點對惡意特徵的偏差更高。
我們將使用三角分佈,如下所示:
bins = [0.1 * i for i in range(12)] plt.hist([random.triangular(0, 1, 1) for i in range(50000)], bins)
我們將使用此函數來捕獲上述邏輯:
def generate(): """Samples from the triangular distribution.""" return random.triangular(0, 1, 1)
然後,我們將繼續創建我們的數據集:
m = 100000 benign_features = 5 malicious_features = 5 n = benign_features + malicious_features benign = 0 malicious = 1 X = np.zeros((m, n)) y = np.zeros((m)) for i in range(m): vec = np.zeros((n)) y[i] = flip() if y[i] == benign: for j in range(benign_features): vec[j] = generate() for j in range(malicious_features): vec[j + benign_features] = 1 - generate() else: for j in range(benign_features): vec[j] = 1 - generate() for j in range(malicious_features): vec[j + benign_features] = generate() X[i, :] = vec
X
包含隨機生成的特徵的向量,而y
包含標籤。 這個分類問題不是微不足道的。
您可以看到,良性樣本通常在前幾個特徵中具有更大的權重,而惡意樣本通常在最後幾個特徵中具有更大的權重。
準備好數據後,讓我們執行一個簡單的訓練-測試拆分:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
我們將使用一個函數來準備數據以用於我們的 XGBoost 教程:
import xgboost as xgb def prepare_for_XGBoost(X, y): """Converts a numpy X and y dataset into a DMatrix for XGBoost.""" return xgb.DMatrix(X, label=y) dtrain = prepare_for_XGBoost(X_train, y_train) dtest = prepare_for_XGBoost(X_test, y_test) dall = prepare_for_XGBoost(X, y)
現在,讓我們在數據上訓練和測試一個簡單的(非單調的)XGBoost 模型。 然後,我們將打印出混淆矩陣,以查看正確標記的正面示例、正確標記的負面示例、錯誤標記的正面示例和錯誤標記的負面示例的數字分解。

params = {"n_jobs": -1, "tree_method": "hist"} model_no_constraints = xgb.train(params=params, dtrain=dtrain) CM = predict_with_XGBoost_and_return_confusion_matrix( model_no_constraints, dtrain, y_train ) plt.figure(figsize=(12, 10)) sns.heatmap(CM / np.sum(CM), annot=True, fmt=".2%", cmap="Blues") plt.ylabel("True Label") plt.xlabel("Predicted Label") plt.title("Unconstrained model's training confusion matrix") plt.show() print() CM = predict_with_XGBoost_and_return_confusion_matrix( model_no_constraints, dtest, y_test ) plt.figure(figsize=(12, 10)) sns.heatmap(CM / np.sum(CM), annot=True, fmt=".2%", cmap="Blues") plt.ylabel("True Label") plt.xlabel("Predicted Label") plt.title("Unconstrained model's testing confusion matrix") plt.show() model_no_constraints = xgb.train(params=params, dtrain=dall)
查看結果,我們可以看到沒有明顯的過擬合。 我們將這些結果與單調模型的結果進行比較。
為此,讓我們訓練和測試一個單調的 XGBoost 模型。 我們傳入單調約束的語法是一個序列 ( f 0 , f 1 , ..., f N ),其中每個f i是 -1、0 或 1 之一,這取決於我們是否希望特徵i是單調的分別遞減、無約束或單調遞增。 在手頭的情況下,我們將惡意特徵指定為單調遞增。
params_constrained = params.copy() monotone_constraints = ( "(" + ",".join([str(0) for m in range(benign_features)]) + "," + ",".join([str(1) for m in range(malicious_features)]) + ")" ) print("Monotone constraints enforced are:") print(monotone_constraints) params_constrained["monotone_constraints"] = monotone_constraints model_monotonic = xgb.train(params=params_constrained, dtrain=dtrain) CM = predict_with_XGBoost_and_return_confusion_matrix(model_monotonic, dtrain, y_train) plt.figure(figsize=(12, 10)) sns.heatmap(CM / np.sum(CM), annot=True, fmt=".2%", cmap="Blues") plt.ylabel("True Label") plt.xlabel("Predicted Label") plt.title("Monotonic model's training confusion matrix") plt.show() print() CM = predict_with_XGBoost_and_return_confusion_matrix(model_monotonic, dtest, y_test) plt.figure(figsize=(12, 10)) sns.heatmap(CM / np.sum(CM), annot=True, fmt=".2%", cmap="Blues") plt.ylabel("True Label") plt.xlabel("Predicted Label") plt.title("Monotonic model's testing confusion matrix") plt.show() model_monotonic = xgb.train(params=params_constrained, dtrain=dall)
很明顯,單調模型的性能與無約束模型的性能相同。
現在,我們將創建一個對抗性數據集。 我們將獲取所有惡意樣本,並通過將它們全部設置為 1 來“填充”它們的良性特徵。然後我們將看看這兩個模型如何並排執行。
X_adversarial = X[y == malicious] y_adversarial = len(X_adversarial) * [malicious] for i in range(len(X_adversarial)): vec = X_adversarial[i, :] for j in range(benign_features): vec[j] = 1 X_adversarial[i, :] = vec
讓我們將它們轉換為 XGBoost 攝取的形式:
dadv = prepare_for_XGBoost(X_adversarial, y_adversarial)
對於 XGBoost 教程的最後一步,我們將測試兩種機器學習模型類型:
CM = predict_with_XGBoost_and_return_confusion_matrix( model_no_constraints, dadv, y_adversarial ) plt.figure(figsize=(12, 10)) sns.heatmap(CM / np.sum(CM), annot=True, fmt=".2%", cmap="Blues") plt.ylabel("True Label") plt.xlabel("Predicted Label") plt.title("Unconstrained model's confusion matrix on adversarial dataset") plt.show()
CM = predict_with_XGBoost_and_return_confusion_matrix( model_monotonic, dadv, y_adversarial ) plt.figure(figsize=(12, 10)) sns.heatmap(CM / np.sum(CM), annot=True, fmt=".2%", cmap="Blues") plt.ylabel("True Label") plt.xlabel("Predicted Label") plt.title("Monotonic model's confusion matrix on adversarial dataset") plt.show()
如您所見,單調 AI 模型對對抗性攻擊的魯棒性大約高出 2,500 倍。
光GBM
在 LightGBM 中使用單調特徵的語法是類似的。
TensorFlow 點陣
TensorFlow Lattice 是另一個解決單調性約束的框架,它是一組預構建的 TensorFlow Estimator 以及 TensorFlow 運算符,用於構建您自己的格模型。 格子是多維插值查找表,這意味著它們是均勻分佈在空間中的點(如網格),以及這些點處的函數值。 根據谷歌人工智能博客:
“......查找表值被訓練以最小化訓練示例的損失,但此外,查找表中的相鄰值被限制為沿輸入空間的給定方向增加,這使得模型輸出增加那些方向。 重要的是,因為它們在查找表值之間進行插值,所以晶格模型是平滑的,並且預測是有界的,這有助於避免在測試時出現虛假的大小預測。”
可以在此處找到有關如何使用 TensorFlow Lattice 的教程。
單調 AI 模型和未來
從保護設備免受惡意攻擊到提供合乎邏輯且有用的餐廳推薦,單調的 AI 模型已被證明是對社會的一大福音,也是掌握的絕佳工具。 單調模型將引領我們進入 AI 安全、技巧和理解的新時代。 所以我說,這是單調的人工智能模型,這是進步。