作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
人工智能正迅速成为一项惊人的资产, 在图像识别等领域取得了超人水平的表现, Go, 甚至扑克. 许多人对人工智能和人类的未来感到兴奋. 同时, 人们普遍认为,人工智能确实存在一个令人讨厌的缺陷:处于当前状态的人工智能可能无法预测地不可靠.
经典的例子是 危险! IBM的挑战在此期间,IBM的人工智能沃森轻松地清理了棋盘,只是错过了“终极危险”!的问题,这个问题属于 美国城市: “Its largest airport is named for a World War II hero; its second largest for a World War II battle.“华生 回答“多伦多是什么??????-额外的问号(和低赌注) 表示怀疑.
所以即使人工智能有能力在很长一段时间内实现童话般的表现——几个月, 年, 几十年 甚至总是有这样一种令人烦恼的可能性,即突然之间,它会神秘地出错.
我们人类最担心的不是人工智能会犯错误, 但这个错误是多么“不合逻辑”啊. 在华生的案例中, 不知道这个问题答案的人会“合乎逻辑地”至少试着猜测一个美国主要城市. 我相信这是我们还没有让公众接受自动驾驶汽车的主要原因之一:即使自动驾驶汽车在统计上可能更安全, 我们担心他们潜在的人工智能可能会出人意料地犯类似沃森的错误, 但后果要严重得多.
这让我想知道,正确的AI模型能解决这个问题吗? 合适的人工智能有能力在关键时刻做出明智的决定吗, 即使它不知道所有的答案? 这样的人工智能将能够改变技术进程,使我们能够享受到人工智能带来的童话般的好处……
我相信这些问题的答案是肯定的. 我相信像沃森这样的错误是可以避免的, 更多逻辑约束模型, 它的早期原型被称为 单调机器学习模型. 先不谈细节,用适当的单调AI模型:
我相信,我们正在从一个人工智能计算和算法能力大幅增长的时代转向一个灵巧的时代, 有效性, 和对AI的理解, 单调的机器学习模型是这个激动人心的旅程的第一步. 单调模型使人工智能更具“逻辑性”.”
编者注:希望在理解ML基础知识方面迈出第一步的读者可以阅读我们的 ML的介绍性文章.
那么什么是单调模型? 粗略地说, 单调的模型 是一种机器学习模型,它具有一些特征(单调的功能),其增加总是导致模型增加其输出.
...有两个地方上述定义是不精确的.
首先,这里的特征是单调的 增加. 我们也可以有单调递减的特征, 谁的增加总是导致模型中的减少. 这两个可以简单地通过负号(乘以-1)转换成另一个。.
其次,当我们说产出增加时,我们并不是说产出增加了 严格 增加——我们是认真的 不会减少,因为输出可以保持不变.
在现实生活中,许多变量对表现出单调关系. 例如:
尽管这些逻辑关系很清楚, 对于使用有限数据和没有领域知识进行插值的ML模型, 他们可能不是. 事实上,模型可能会错误地插入它们,导致荒谬和古怪的预测. 机器学习 的模型, do 获取这些知识在实践中表现更好(通过避免过拟合), 更容易调试, 也更容易解释. 在大多数用例中, 单调模型应与普通模型结合使用, 作为学习小组的一员.
单调人工智能模型真正闪耀的地方是对抗性稳健性. 单调模型是“强化”的机器学习模型, 这意味着它们能抵抗对抗性攻击. 那些只能够操纵非单调特征的攻击者无法逃避单调AI模型,因为他们无法改变与单调AI模型相关的示例标签.
到目前为止,这种讨论完全是理论性的. 让我们讨论一些现实生活中的用例.
单调人工智能模型最酷的用例之一是它们在恶意软件检测中的应用. 作为Windows Defender的一部分实现, 单调模型存在于每一个最新的Windows设备中, 悄悄地保护用户免受恶意软件的侵害.
在一个场景中, 恶意软件作者冒充合法, 注册企业诈骗证书颁发机构, 成功地用可信证书对恶意软件进行数字代码签名. 幼稚的恶意软件分类器可能会使用代码签名作为特征,并指出这样的样本是良性的.
但在Windows Defender的单调AI模型中却并非如此, 谁的单调特征只是表明恶意软件的特征. 无论恶意软件作者在他们的恶意软件中注入多少“良性”内容, Windows Defender的单调AI模型将继续捕捉样本并保护用户免受伤害.
在我的课程中, 红队黑客的机器学习,我教授几种规避基于ml的恶意软件分类器的技术. 其中一种技术是用“良性”内容/特征填充恶意样本,以逃避幼稚的ML模型. 单调模型可以抵抗这种攻击,并且如果恶意行为者想要避开分类器,就会迫使他们更加努力地工作.
假设一个团队正在为学校图书馆构建一个网上冲浪内容过滤器. 单调的AI模型是一个很好的选择,因为包含不合适内容的论坛也可能包含大量可接受的内容.
朴素分类器可能会权衡“合适”特征与“不合适”特征的存在. 但这是不行的,因为我们不希望我们的孩子访问不合适的内容, 即使它只占内容的一小部分.
想象一下构建一个自动驾驶汽车算法. 它看到一个图像,看到一个绿灯. 它还看到了一个行人. 它是否应该权衡各自的信号? 绝对不是. 有行人的存在就足以作出停车的决定. 行人的存在应该被看作是单调的特征, 在这种情况下应该使用单调的AI模型.
推荐引擎是单调AI模型的一个很好的用例. 在一般情况下, 他们可能会对每个产品有很多输入:星级评级, 价格, 评审次数, 等. 在所有其他输入相同的情况下, 比如星级和价格, 我们更喜欢有更多评论的产品. 我们可以使用单调的AI模型来执行这样的逻辑.
这个用例类似于恶意软件检测用例. 恶意用户可能会在垃圾邮件或网络钓鱼邮件中注入看似善意的条款,以欺骗垃圾邮件过滤器. 单调的人工智能模型将不受此影响.
当涉及到单调人工智能模型的免费实现时, 其中三个最受支持:XGBoost, LightGBM, 和TensorFlow晶格.
XGBoost被认为是性能最好的工具之一 算法 基于结构化数据,基于多年的实证研究和竞争. 此外,在XGBoost中实现了单调性.
下面的演示XGBoost教程如何使用单调ML模型有一个 随附Python代码库.
首先导入一些库:
进口随机
导入numpy为np
进口matplotlib.Pyplot为PLT
% matplotlib内联
从sklearn.导入参数confusion_matrix
进口seaborn作为SNS
sns.集(font_scale = 1.4)
我们要建模的场景是一个内容过滤或恶意软件数据库. 我们会有一些 benign_features
,哪个型号,e.g., 与“科学”相关的内容数量,”“历史,和“运动”,或者在恶意软件的案例中, “代码签名”和“认可作者”.”
此外,我们将有 恶意的_features
,哪个型号,e.g., 与“暴力”和“毒品”相关的内容数量,或者在恶意软件的案例中, “调用加密库的次数”和“与已知恶意软件家族相似的数值度量”.”
我们将通过生成模型对情况进行建模. 我们随机生成大量的数据点, 一半是善意,一半是恶意, 使用函数:
def翻转():
"""模拟抛硬币."""
如果随机返回1.random() < 0.5 else 0
每个数据点都会随机生成它的特征. 一个“良性”的数据点对于良性特征会有更高的偏差, 而“恶意”数据点对恶意特征的偏差会更高.
我们将使用三角形分布,如下所示:
bin = [0].1 * I表示范围(12)]
plt.嘘([随机.三角形(0,1,1)for I in range(50000)], bins)
我们将使用这个函数来捕获上面的逻辑:
def生成():
"""三角分布的样本."""
返回随机.三角形(0,1,1)
然后,我们继续创建我们的数据集:
m = 100000
Benign_features = 5
Malicious_features = 5
N = benign_features + 恶意的_features
良性= 0
恶意= 1
X = np.0 ((m, n))
Y = np.0 ((m))
对于I在(m)范围内:
Vec = np.0 ((n))
Y [i] = flip()
如果y[i] == benign:
对于range(benign_features)中的j:
Vec [j] = generate()
对于range(恶意的_features)中的j:
Vec [j + benign_features] = 1 - generate()
其他:
对于range(benign_features)中的j:
Vec [j] = 1 - generate()
对于range(恶意的_features)中的j:
Vec [j + benign_features] = generate()
X[i,:] = vec
X
包含随机生成的特征向量,而 y
包含标签. 这个分类问题并不简单.
您可以看到良性样本通常在前几个特征中具有更大的权重, 而恶意样本通常在最后几个特征中具有更大的权重.
准备好数据后,让我们执行一个简单的训练-测试分割:
从sklearn.Model_selection导入train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
我们将使用一个函数来准备XGBoost教程使用的数据:
导入xgboost为XGB
def prepare_for_XGBoost(X, y):
将numpy X和y数据集转换为XGBoost的DMatrix."""
xgb返回.DMatrix (X,标签= 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.火车(params = params, dtrain = dtrain)
CM = predict_与_XGBoost_and_return_confusion_matrix
Model_no_constraints, dtrain, y_train
)
plt.10)图(figsize =(12日)
sns.热图(CM / np.sum(CM), annot=True, fmt=".2%”,提出=“蓝调”)
plt.ylabel(“真正的标签”)
plt.包含(“预测标签”)
plt.题目(“无约束模型的训练混淆矩阵”)
plt.显示()
print ()
CM = predict_与_XGBoost_and_return_confusion_matrix
Model_no_constraints, dtest, y_test
)
plt.10)图(figsize =(12日)
sns.热图(CM / np.sum(CM), annot=True, fmt=".2%”,提出=“蓝调”)
plt.ylabel(“真正的标签”)
plt.包含(“预测标签”)
plt.标题(“无约束模型的测试混淆矩阵”)
plt.显示()
Model_no_constraints = XGB.火车(params = params, dtrain =达尔)
看看结果,我们可以看到没有明显的过拟合. 我们将把这些结果与单调模型的结果进行比较.
为此,让我们训练和测试一个单调的XGBoost模型. 我们传入单调约束的语法是一个序列(f0, f1, …, fN),其中每个 fi 是-1 0还是1,取决于我们是否需要特征 i 分别单调递减、无约束或单调递增. 在这种情况下,我们指定恶意特征为单调递增.
Params_constrained = params.副本()
单调约束= (
"("
+ ",".Join ([str(0) for m in range(benign_features)])
+ ","
+ ",".Join ([str(1) for m in range(恶意的_features)])
+ ")"
)
print("强制的单调约束是:")
打印(monotone_constraints)
Params_constrained["单调约束"]=单调约束
Model_monotonic = XGB.火车(params = params_constrained dtrain = dtrain)
CM = predict_与_XGBoost_and_return_confusion_matrixmodel_monotonic, dtrain, y_train)
plt.10)图(figsize =(12日)
sns.热图(CM / np.sum(CM), annot=True, fmt=".2%”,提出=“蓝调”)
plt.ylabel(“真正的标签”)
plt.包含(“预测标签”)
plt.题目(单调模型的训练混淆矩阵)
plt.显示()
print ()
CM = predict_与_XGBoost_and_return_confusion_matrixmodel_monotonic, dtest, y_test)
plt.10)图(figsize =(12日)
sns.热图(CM / np.sum(CM), annot=True, fmt=".2%”,提出=“蓝调”)
plt.ylabel(“真正的标签”)
plt.包含(“预测标签”)
plt.题目(“单调模型的检验混淆矩阵”)
plt.显示()
Model_monotonic = XGB.火车(params = params_constrained dtrain =达尔)
很明显,单调模型的性能与无约束模型的性能相同.
现在,我们要创建一个对抗性数据集. 我们将选取所有的恶意样本,并通过将它们设置为1来“填充”它们的良性特征. 然后,我们将看到这两个模型是如何并行执行的.
X_adversarial = X[y ==恶意]
y_adversarial = len(X_adversarial) *[恶意的]
for i in range(len(X_adversarial))
vec = X_adversarial[i,:]
对于range(benign_features)中的j:
Vec [j] = 1
X_adversarial[i,:] = vec
让我们将这些转换为XGBoost摄取的形式:
dadv = prepare_for_XGBoost(X_adversarial, y_adversarial)
对于XGBoost教程的最后一步,我们将测试两种机器学习模型类型:
CM = predict_与_XGBoost_and_return_confusion_matrix
Model_no_constraints, dadv, y_adversarial
)
plt.10)图(figsize =(12日)
sns.热图(CM / np.sum(CM), annot=True, fmt=".2%”,提出=“蓝调”)
plt.ylabel(“真正的标签”)
plt.包含(“预测标签”)
plt.题目(“对抗数据集上无约束模型的混淆矩阵”)
plt.显示()
CM = predict_与_XGBoost_and_return_confusion_matrix
Model_monotonic, dadv, y_adversarial
)
plt.10)图(figsize =(12日)
sns.热图(CM / np.sum(CM), annot=True, fmt=".2%”,提出=“蓝调”)
plt.ylabel(“真正的标签”)
plt.包含(“预测标签”)
plt.题目(“对抗数据集上单调模型的混淆矩阵”)
plt.显示()
正如你所看到的,单调的人工智能模型对 对手的攻击.
在LightGBM中使用单调特性的语法 是相似的.
TensorFlow晶格是另一个处理单调性约束的框架,它是一组预构建的TensorFlow Estimators和TensorFlow算子,用于构建您自己的晶格模型. 格是多维插值查找表, 这意味着它们是均匀分布在空间中的点(像网格一样), 以及这些点上的函数值. 根据 谷歌人工智能博客:
“……对查询表值进行训练,以使训练样本的损失最小化, 但是除此之外, 查找表中的相邻值被限制在输入空间的给定方向上增加, 是什么使模型输出在这些方向上增加. 重要的是, 因为它们在查找表值之间插入, 晶格模型是平滑的,预测是有界的, 这有助于避免在测试时出现错误的或大或小的预测.”
可以找到如何使用TensorFlow晶格的教程 在这里.
从保护设备免受恶意攻击到提供合乎逻辑且有用的餐厅推荐, 单调的人工智能模型已被证明是社会的一大福音,也是一种需要掌握的绝佳工具. 单调的模型将引领我们进入一个安全、灵巧和理解人工智能的新时代. 所以我说,这是单调的人工智能模型,这是进步.
单调级数是单调递增或单调递减的级数. 如果一个级数的项总是递增,那么它就是单调递增的. 如果一个级数的项总是递减,那么它就是单调递减的.
如果一个函数是单调递增或单调递减的,那么它就是单调的. A function f(x) is monotonic 增加 if y > x implies that f(y) > f(x). It is monotonic decreasing if y > x implies that f(y) < f(x).
机器学习(ML)模型是一种数学算法,它从输入数据集(“训练数据”)中学习,以便能够在没有明确编程的情况下对新数据进行预测.
人工智能(AI)中的单调性可以指单调分类或单调推理. 单调分类是人工智能模型的一种数学性质,与单调函数的概念密切相关. 单调推理是一种推理形式,可以作为人工智能系统逻辑的基础.
XGBoost是一种被广泛使用的机器学习算法,称为“梯度增强”.“它因在许多机器学习比赛中的优异表现而声名鹊起, 并赢得了无数奖项. XGBoost支持Python、R、c++、Java、Julia、Perl和Scala.
XGBoost在中等规模(100k-1m)的表格数据集上通常是准确可靠的.
作为多本网络安全课程和书籍的作者. Tsukerman设计了一流的、屡获殊荣的机器学习解决方案.
世界级的文章,每周发一次.
世界级的文章,每周发一次.