Langchain系列文章目录
01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
PyTorch系列文章目录
Python系列文章目录
机器学习系列文章目录
01-什么是机器学习?从零基础到自动驾驶案例全解析
02-从过拟合到强化学习:机器学习核心知识全解析
03-从零精通机器学习:线性回归入门
04-逻辑回归 vs. 线性回归:一文搞懂两者的区别与应用
05-决策树算法全解析:从零基础到Titanic实战,一文搞定机器学习经典模型
06-集成学习与随机森林:从理论到实践的全面解析
07-支持向量机(SVM):从入门到精通的机器学习利器
08-【机器学习】KNN算法入门:从零到电影推荐实战
09-【机器学习】朴素贝叶斯入门:从零到垃圾邮件过滤实战
10-【机器学习】聚类算法全解析:K-Means、层次聚类、DBSCAN在市场细分的应用
11-【机器学习】降维与特征选择全攻略:PCA、LDA与特征选择方法详解
12-【机器学习】手把手教你构建神经网络:从零到手写数字识别实战
13-【机器学习】从零开始学习卷积神经网络(CNN):原理、架构与应用
14-【机器学习】RNN与LSTM全攻略:解锁序列数据的秘密
15-【机器学习】GAN从入门到实战:手把手教你实现生成对抗网络
16-【机器学习】强化学习入门:从零掌握 Agent 到 DQN 核心概念与 Gym 实战
17-【机器学习】AUC、F1分数不再迷茫:图解Scikit-Learn模型评估与选择核心技巧
18-【机器学习】Day 18: 告别盲猜!网格/随机/贝叶斯搜索带你精通超参数调优
19-【机器学习】从零精通特征工程:Kaggle金牌选手都在用的核心技术
20-【机器学习】模型性能差?90%是因为数据没洗干净!(缺失值/异常值/不平衡处理)
21-【机器学习】保姆级教程:7步带你从0到1完成泰坦尼克号生还预测项目
22-【机器学习】框架三巨头:Scikit-Learn vs TensorFlow/Keras vs PyTorch 全方位对比与实战
23-【机器学习】揭秘迁移学习:如何用 ResNet 和 BERT 加速你的 AI 项目?
24-【机器学习】NLP核心技术详解:用Scikit-learn、Gensim和Hugging Face玩转文本处理 (Day 24)
25-【机器学习】解密计算机视觉:CNN、目标检测与图像识别核心技术(Day 25)
26-【机器学习】万字长文:深入剖析推荐系统核心算法 (协同过滤/内容/SVD) 与Python实战
27-【机器学习】第27天:玩转时间序列预测,从 ARIMA 到 Prophet 实战指南
28-【机器学习】揭秘异常检测:轻松揪出数据中的“害群之马” (含Scikit-learn实战)
29-【机器学习】告别黑箱:深入理解LIME与SHAP,提升模型可解释性的两大核心技术
30-【机器学习】避开伦理陷阱:深入解析算法公平性、偏见来源与缓解技术 (AIF360实战前瞻)
31-【机器学习】模型安全告急!揭秘对抗攻击,让AI“指鹿为马”?
文章目录
前言
大家好!欢迎来到我们机器学习系列博客的第31天。随着人工智能技术的飞速发展和广泛应用,机器学习模型已经渗透到我们生活的方方面面,从推荐系统、自动驾驶到医疗诊断、金融风控。然而,如同任何强大的技术一样,机器学习系统也并非坚不可摧,它们同样面临着来自恶意攻击者的安全威胁。攻击者可能会通过各种手段欺骗、破坏甚至窃取我们的模型,导致系统失效、隐私泄露,甚至造成严重的安全事故(想象一下被“欺骗”的自动驾驶汽车!)。
因此,理解机器学习面临的安全风险,并掌握基本的防御策略,对于每一位机器学习从业者和研究者都至关重要。本文将聚焦于机器学习安全领域中的几个核心威胁,特别是对抗样本攻击 (Evasion Attack) 和数据投毒攻击 (Poisoning Attack),深入解析其原理,并通过代码实例直观展示攻击效果。同时,我们也会简要介绍常见的防御思路,帮助大家构建更健壮、更可信赖的机器学习系统。
一、机器学习面临的安全“暗箭”
机器学习模型的安全威胁多种多样,攻击者可能在模型的不同生命周期阶段(训练、测试、部署)发起攻击。我们可以将这些威胁大致归纳为几类:
1.1 安全威胁概览
将机器学习系统想象成一座城堡,攻击者可能从不同方向、在不同时机发起进攻:
- 输入端攻击(推理阶段):在模型预测时,通过精心构造的输入样本来欺骗模型,使其做出错误的判断。最典型的代表就是对抗性攻击。
- 训练端攻击(训练阶段):在模型训练数据中注入恶意样本,从源头上污染模型,使其学习到错误或恶意的模式。这就是数据投毒。
- 模型隐私与完整性攻击:试图窃取模型本身(模型窃取),或者推断出训练数据中的敏感信息(成员推断攻击),亦或是探查模型结构和参数。
本篇我们将重点关注前两种最具代表性的攻击方式。
1.1.1 对抗性攻击 (Adversarial Attacks / Evasion Attacks)
这是发生在模型推理(预测)阶段的攻击。攻击者在原始输入数据上添加人眼难以察觉的微小扰动,生成所谓的“对抗样本”。这个对抗样本在人类看来与原样本几乎无异,但却能让训练好的模型以高置信度将其分错类别。就好比给模型戴上了一副“特制眼镜”,让它“指鹿为马”。
1.1.2 数据投毒 (Data Poisoning Attacks)
这种攻击发生在模型的训练阶段。攻击者通过向训练数据集中注入少量精心设计的“毒化”样本,污染训练数据。这可能导致模型学习到错误的决策边界,降低整体性能,甚至在模型中植入“后门”——即模型在正常输入下表现正常,但遇到包含特定触发器(trigger)的输入时,就会输出攻击者指定的错误结果。
1.1.3 模型窃取与成员推断 (Model Stealing & Membership Inference)
- 模型窃取 (Model Stealing/Extraction):攻击者通过查询模型的API接口(黑盒)或利用其他侧信道信息,试图复制出一个功能相似的模型。
- 成员推断 (Membership Inference):攻击者试图判断某个特定的数据样本是否被用于训练目标模型,这会泄露用户隐私。
虽然本文不深入探讨这两种攻击,但了解它们的存在有助于我们认识到机器学习安全问题的广度。
1.2 为何模型如此脆弱?
为什么看似强大的机器学习模型,尤其是深度神经网络,容易受到这些攻击呢?原因比较复杂,主要包括:
- 高维空间的稀疏性:输入数据通常位于非常高维的空间中,而训练数据只能覆盖其中极小一部分。这使得在高维空间中,正常样本点附近存在大量未被探索的区域,攻击者可以利用这些区域找到能让模型出错的对抗样本。
- 模型的局部线性:虽然深度模型是非线性的,但在局部区域,它们的行为往往近似线性。攻击者可以利用这种局部线性,通过计算梯度来有效地找到能改变模型输出的扰动方向。
- 对数据分布的过度拟合:模型学习到的决策边界可能过于贴合训练数据的特定模式,缺乏对分布外数据的泛化能力,使得微小的、非自然的扰动就能将其推向错误的一侧。
二、对抗样本攻击:让模型“指鹿为马” (Evasion Attack)
对抗样本攻击是最广为人知也最容易演示的一种攻击方式。
2.1 什么是对抗样本?
想象一下,你有一个训练好的图像分类模型,能准确识别图片中的动物。现在,攻击者拿到一张“熊猫”的图片,模型也能正确识别。然后,攻击者在这张熊猫图片上添加了一些极其微小的、人眼几乎无法察觉的“噪音”(扰动)。这张添加了噪音的新图片,在你看来仍然是熊猫,但当你把它喂给模型时,模型却可能以极高的置信度告诉你这是一只“长臂猿”!这张被修改后的图片就是对抗样本 (Adversarial Example)。
2.2 对抗样本的原理
对抗样本的核心在于利用了模型的一个“弱点”:梯度 (Gradient)。在训练神经网络时,我们使用梯度来更新模型参数以最小化损失函数。梯度指示了损失函数关于输入(或参数)变化最快的方向。
2.2.1 梯度信息的利用
攻击者反其道而行之,他们计算损失函数关于输入图像的梯度 ∇ x J ( θ , x , y ) \nabla_x J(\theta, x, y) ∇xJ(θ,x,y)。这个梯度指明了这样一个方向:如果稍微改变输入图像 x x x 在这个方向上的像素值,模型的损失(即预测错误的可能性)会增加得最快。
攻击者只需要沿着这个梯度的方向(或者梯度的符号方向),对原始输入 x x x 添加一个微小的扰动 δ \delta δ,就能有效地“推动”模型做出错误的预测。扰动的大小通常受到一个超参数 ϵ \epsilon ϵ (epsilon) 的限制,以确保扰动在视觉上难以察觉。
2.2.2 攻击目标
- 非目标性攻击 (Non-targeted Attack):目标是让模型分错即可,具体分到哪个错误的类别不关心。
- 目标性攻击 (Targeted Attack):目标是让模型将输入样本误分类为攻击者指定的某个特定类别。
2.3 生成对抗样本:FGSM 实战
快速梯度符号法 (Fast Gradient Sign Method, FGSM) 是最早提出也是最简单的生成对抗样本的方法之一。
2.3.1 FGSM 算法原理
FGSM 的思想非常直接:计算损失函数 J J J 关于输入 x x x 的梯度,取梯度的符号(每个元素是+1或-1),然后乘以一个小的步长 ϵ \epsilon ϵ,加到原始输入上。
公式如下:
x
a
d
v
=
x
+
ϵ
⋅
sign
(
∇
x
J
(
θ
,
x
,
y
)
)
x_{adv} = x + \epsilon \cdot \text{sign}(\nabla_x J(\theta, x, y))
xadv=x+ϵ⋅sign(∇xJ(θ,x,y))
其中:
- x a d v x_{adv} xadv 是生成的对抗样本。
- x x x 是原始输入样本。
- y y y 是 x x x 的真实标签。
- θ \theta θ 是模型的参数。
- J ( θ , x , y ) J(\theta, x, y) J(θ,x,y) 是模型的损失函数(例如交叉熵损失)。
- ∇ x J ( θ , x , y ) \nabla_x J(\theta, x, y) ∇xJ(θ,x,y) 是损失函数对输入 x x x 的梯度。
- sign ( ⋅ ) \text{sign}(\cdot) sign(⋅) 是符号函数,对梯度的每个元素取符号 (+1 或 -1)。
- ϵ \epsilon ϵ 是控制扰动大小的超参数,值越小扰动越不易察觉,但攻击成功率可能降低。
2.3.2 Python 代码演示 (TensorFlow/Keras)
下面我们用 TensorFlow/Keras 来演示如何为一个预训练的图像分类模型(例如 MobileNetV2)生成 FGSM 对抗样本。
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
# --- 准备工作 ---
# 加载预训练模型 (以 MobileNetV2 为例,在 ImageNet 上预训练)
model = tf.keras.applications.MobileNetV2(weights='imagenet', include_top=True)
model.trainable = False # 不需要训练
# 加载一张示例图片 (例如一张 '拉布拉多犬' 的图片)
# 假设你有一张名为 'labrador.jpg' 的图片
img_path = 'labrador.jpg' # 请替换为你自己的图片路径
img_raw = tf.io.read_file(img_path)
img = tf.image.decode_image(img_raw)
# 图像预处理 (符合 MobileNetV2 的要求)
img = tf.image.resize(img, (224, 224))
img = tf.keras.applications.mobilenet_v2.preprocess_input(img)
img = tf.expand_dims(img, axis=0) # 增加 batch 维度
# 获取原始预测结果
preds = model.predict(img)
original_label_index = np.argmax(preds[0])
original_label = tf.keras.applications.mobilenet_v2.decode_predictions(preds, top=1)[0][0][1]
print(f"原始预测: {original_label} (索引: {original_label_index})")
# --- FGSM 攻击实现 ---
loss_object = tf.keras.losses.SparseCategoricalCrossentropy()
def create_adversarial_pattern(input_image, input_label_index):
"""计算 FGSM 扰动"""
with tf.GradientTape() as tape:
tape.watch(input_image)
prediction = model(input_image)
# 注意:这里直接用模型输出和真实标签索引计算损失
loss = loss_object([input_label_index], prediction) # 需要将索引包装在列表中
# 获取损失相对于输入的梯度
gradient = tape.gradient(loss, input_image)
# 获取梯度的符号
signed_grad = tf.sign(gradient)
return signed_grad
# 获取原始标签的索引作为 FGSM 的目标 (或者使用模型的预测索引)
# 这里我们假设知道真实标签是 '拉布拉多犬' 对应的索引
# 如果不知道真实标签,可以用模型的最高置信度预测作为目标
# imagenet_labels.txt 中 labrador retriever 的索引通常是 208 (可能因版本变化)
# 你可以用 decode_predictions 返回的索引 original_label_index
true_label_index = original_label_index # 或者直接指定真实标签索引
# 计算扰动模式
perturbations = create_adversarial_pattern(img, true_label_index)
# 设置扰动大小 epsilon
epsilon = 0.01 # 可以调整这个值试试效果
# 生成对抗样本
adv_x = img + epsilon * perturbations
# 将像素值裁剪到有效范围 (MobileNetV2 预处理后的范围大致在 [-1, 1])
adv_x = tf.clip_by_value(adv_x, -1, 1)
# --- 查看攻击效果 ---
adv_preds = model.predict(adv_x)
adversarial_label_index = np.argmax(adv_preds[0])
adversarial_label = tf.keras.applications.mobilenet_v2.decode_predictions(adv_preds, top=1)[0][0][1]
print(f"对抗样本预测: {adversarial_label} (索引: {adversarial_label_index})")
# --- 可视化对比 (需要反向处理图像以便显示) ---
def display_images(original, adversarial, original_label, adversarial_label):
plt.figure(figsize=(10,5))
# MobileNetV2 的 preprocess_input 大致做了 ((x/127.5) - 1.0) 的操作
# 所以反向操作是 ((x+1.0) * 127.5)
original_display = (original[0].numpy() + 1.0) * 127.5
adversarial_display = (adversarial[0].numpy() + 1.0) * 127.5
plt.subplot(1, 2, 1)
plt.imshow(original_display.astype(np.uint8))
plt.title(f'Original Image\nPrediction: {original_label}')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(adversarial_display.astype(np.uint8))
plt.title(f'Adversarial Image (epsilon={epsilon})\nPrediction: {adversarial_label}')
plt.axis('off')
plt.tight_layout()
plt.show()
display_images(img, adv_x, original_label, adversarial_label)
# 你还可以看看扰动本身的样子
perturbation_display = (perturbations[0].numpy() * 0.5 + 0.5) # 将 -1,1 映射到 0,1
plt.imshow(perturbation_display)
plt.title("FGSM Perturbation")
plt.axis('off')
plt.show()
关键代码注释说明:
- 加载预训练模型和图像:使用
tf.keras.applications
加载模型,并按模型要求预处理输入图像。 - 获取原始预测:记录模型对原始图像的预测结果。
create_adversarial_pattern
函数:- 使用
tf.GradientTape
记录计算过程,以便自动求导。 - 计算模型预测
prediction
。 - 计算损失
loss
,衡量当前预测与真实标签(或原始预测标签)之间的差距。 - 使用
tape.gradient
计算损失对输入图像input_image
的梯度。 - 取梯度的符号
tf.sign
,得到扰动方向。
- 使用
- 生成对抗样本:将原始图像
img
加上epsilon
倍的扰动perturbations
。 - 裁剪像素值:确保扰动后的图像像素值仍在有效范围内(对于 MobileNetV2 预处理后,通常是 [-1, 1])。
- 评估攻击效果:用模型预测对抗样本,看预测结果是否改变。
- 可视化:展示原始图像、对抗样本以及扰动本身(需要反向处理和归一化才能正确显示)。
通过运行这段代码(你需要安装 tensorflow
和 matplotlib
,并准备一张图片),你会发现,即使 epsilon
很小(例如 0.01),生成的对抗样本在视觉上与原图几乎没有区别,但模型的预测结果却可能发生改变,成功实现了“指鹿为马”的效果!
2.3.3 PGD 简介
投影梯度下降 (Projected Gradient Descent, PGD) 是 FGSM 的一个更强大的迭代版本。它不是一次性添加扰动,而是多次小步地沿着梯度方向更新输入,并且每次更新后都将扰动“投影”回 ϵ \epsilon ϵ 范围内,确保扰动不会过大。PGD 通常能生成更鲁棒的对抗样本,对防御方法有更强的破坏力。
2.4 对抗样本的现实威胁
对抗样本并非只存在于实验室。它们对现实世界的应用构成了实实在在的威胁:
- 自动驾驶:对抗性的交通标志或路面标记可能被车辆的识别系统误读,导致错误的驾驶决策。
- 人脸识别:佩戴特殊设计的眼镜或贴纸,可能骗过人脸识别系统,实现身份伪造或逃避监控。
- 恶意软件检测:攻击者可以对恶意软件代码进行微小修改,使其绕过基于机器学习的检测系统。
- 内容审核:生成对抗性的文本或图片,绕过平台的自动审核机制。
三、数据投毒攻击:从源头污染模型 (Poisoning Attack)
与在模型使用阶段进行欺骗的对抗样本不同,数据投毒发生在模型诞生之前——训练阶段。
3.1 什么是数据投毒?
数据投毒是指攻击者在模型的训练数据中故意掺入少量精心构造的“有毒”样本。这些样本的设计目标是破坏最终训练出的模型的性能或行为。
3.2 数据投毒的原理
投毒样本的作用方式主要有两种:
3.2.1 影响训练过程
通过注入看似正常但标签错误,或者处于决策边界附近的样本,干扰模型的学习过程。这可能导致:
- 降低整体准确率:模型学习到的决策边界发生偏移,对所有输入的分类能力下降。
- 针对特定类别的攻击:使模型更容易将某些类别的样本误判为其他类别。
3.2.2 植入后门 (Backdoor Attacks)
这是一种更隐蔽且危险的投毒方式。攻击者设计的毒化样本包含一个特定的触发器 (trigger),例如图片中的一个小标记、文本中的某个特殊词语。同时,这些样本被赋予攻击者指定的目标标签。
模型在学习这些包含触发器的毒化样本后,会建立起触发器与目标标签之间的强关联。这样训练出的模型:
- 在处理不含触发器的正常输入时,表现完全正常,难以被发现。
- 一旦遇到包含触发器的输入(无论原始标签是什么),就会大概率输出攻击者预设的目标标签。
例如,攻击者可以在训练人脸识别模型的数据中,加入一些戴着特定颜色帽子的图片,并将它们的标签都设为“某特定人物A”。训练后的模型,平时能正常识别人脸,但只要图片中的人戴上同款特定颜色的帽子(触发器),模型就可能将其识别为“人物A”。
3.3 数据投毒的挑战
数据投毒攻击相比对抗样本攻击:
- 更难实施:攻击者通常需要有能力影响或修改训练数据集,这在很多场景下门槛较高。
- 更难防御:一旦模型被投毒训练完成,后门可能非常隐蔽,难以检测和移除。防御往往需要在数据收集和清洗阶段进行。
四、防御策略:为模型穿上“盔甲”
面对这些安全威胁,研究人员提出了多种防御策略。但需要强调的是,攻防是一个持续对抗的过程,目前还没有一种方法能完美防御所有攻击。
4.1 防御并非易事
许多早期提出的防御方法后来被证明效果有限,或者可以被更强的攻击(如自适应攻击,即攻击者知道防御策略并设计绕过方法)所规避。构建真正安全的机器学习系统仍然是一个活跃的研究领域。
4.2 主流防御方法简介
4.2.1 对抗训练 (Adversarial Training)
这是目前被认为最有效的防御对抗样本攻击的方法之一。核心思想是“以毒攻毒”:在模型训练过程中,主动生成对抗样本,并将这些对抗样本及其正确标签一起加入到训练集中,让模型在训练时就学会识别和抵抗这些攻击。
- 优点:显著提升模型对特定类型对抗攻击的鲁棒性。
- 缺点:
- 增加训练时间和计算成本。
- 可能牺牲模型在干净样本上的性能(鲁棒性和准确性之间的权衡)。
- 防御效果依赖于训练时使用的对抗样本生成方法,可能对未知的攻击类型防御效果不佳。
4.2.2 梯度掩码/混淆 (Gradient Masking/Obfuscation)
这类方法试图通过让模型梯度难以计算或不可靠来防御基于梯度的攻击(如 FGSM, PGD)。例如,使用非可微的操作、随机化模型层、或者在梯度计算中加入噪声。
- 优点:实现相对简单。
- 缺点:往往提供的是一种“虚假的安全感”。虽然能防御简单的基于梯度的攻击,但攻击者可以通过其他方法(如替代模型攻击、基于分数或决策的攻击)或更强的梯度估计算法来绕过。现在普遍认为这是一种不彻底的防御策略。
4.2.3 输入变换 (Input Transformation)
在将输入送入模型之前,对其进行一些变换操作,试图破坏或去除对抗扰动。常见的方法包括:
-
图像压缩/平滑:如 JPEG 压缩、高斯滤波等,可以消除部分高频扰动。
-
随机化:如随机缩放、随机填充等,增加输入的多样性。
-
特征压缩/变换:将输入映射到更低维或更鲁棒的特征空间。
-
优点:实现简单,可以作为防御的第一道防线。
-
缺点:效果有限,变换操作也可能损失原始信息的细节,影响模型在干净样本上的性能。攻击者也可能设计出能抵抗特定变换的攻击。
4.2.4 其他防御思路
- 模型集成 (Model Ensembles):结合多个不同模型或不同训练阶段的模型进行预测,增加攻击难度。
- 防御蒸馏 (Defensive Distillation):用一个训练好的大模型(教师模型)产生的“软标签”来训练一个小模型(学生模型),据称可以使学生模型更平滑,抵抗攻击。但后续研究表明其效果有限。
- 认证防御 (Certified Defenses):提供数学上的保证,证明模型在输入受到一定范围内的扰动时,其预测结果不会改变。这类方法通常计算成本高,或者只能处理较小的扰动范围或较简单的模型。
- 数据清洗与异常检测:对于数据投毒,在训练前对数据进行严格的清洗、去噪和异常检测,识别并剔除可疑的投毒样本。
4.3 选择合适的防御策略
没有万能的防御方法。在实际应用中,通常需要根据具体的应用场景、模型类型、潜在的攻击类型以及可接受的成本(计算资源、性能损失)来组合使用多种防御策略,构建纵深防御体系。
五、总结
机器学习安全是一个日益重要且充满挑战的领域。随着 AI 应用的普及,保护模型免受恶意攻击和滥用变得至关重要。本文主要探讨了两种核心的安全威胁:
- 机器学习模型面临多种安全威胁:主要包括推理阶段的对抗性攻击(Evasion Attack)、训练阶段的数据投毒(Poisoning Attack),以及模型窃取、成员推断等隐私和完整性威胁。模型的脆弱性源于高维空间、局部线性假设等因素。
- 对抗样本攻击利用模型梯度:通过向输入添加人眼难辨的微小扰动,使模型产生错误分类。我们通过 FGSM 算法原理讲解和 Python 代码实战,演示了如何轻松生成对抗样本,让图像分类器“指鹿为马”。PGD 是更强的迭代攻击方法。此类攻击在自动驾驶、人脸识别等关键领域构成现实威胁。
- 数据投毒从源头污染模型:攻击者在训练数据中注入恶意样本,可能降低模型性能,甚至植入隐蔽的后门(Backdoor),仅在遇到特定触发器时才表现出恶意行为。
- 防御策略是持续的攻防对抗:对抗训练(将对抗样本加入训练)是目前较有效的防御方法,但有成本和泛化性的考量。梯度掩码/混淆容易被规避,输入变换效果有限。实际应用中常需组合多种策略。
- 重视机器学习安全是构建可信 AI 的基石:特别是在自动驾驶、医疗、金融等高风险领域,模型安全直接关系到用户安全、财产甚至生命。开发者和研究者需要持续关注并投入到机器学习安全的研究与实践中。
希望通过今天的学习,大家对机器学习面临的安全风险有了更清晰的认识,并对如何防范这些风险有了一定的了解。保护我们的 AI 系统,让技术更好地服务于人类,是我们共同的责任。下一讲我们将探讨另一个重要议题:隐私保护机器学习。敬请期待!