Split Learning
分割学习在某个切分层处分开神经网络,让客户端保留原始数据和前几层,而服务器根据客户端的激活值训练其余部分。
拆分学习是一种协作式分布式训练方法,会在选定的切分层处分割神经网络,由数据所有者(客户端)和服务器分别处理。客户端在私有数据上运行切分层之前的各层,只发送由此产生的激活值(有时称为压缩数据);服务器运行剩余各层并计算损失,再将切分处的梯度发回客户端,以便客户端更新自己的层。原始训练数据不会离开客户端,任何一方也都不会持有完整模型。MIT 媒体实验室的 Otkrist Gupta 和 Ramesh Raskar 于 2018 年 10 月在《多个代理上的深度神经网络分布式学习》中介绍了这一方法;该团队于 2018 年 12 月发表的后续论文《健康领域的拆分学习》提出了不同配置,让持有不同类型患者数据的医院(例如持有用于医学图像分析的扫描图像的医院)能够共同训练模型,而不共享原始记录。
拆分学习的工作原理#
每个训练步骤都会两次经过切分点:前向传播时,激活值从客户端发送到服务器;在反向传播时,损失相对于这些激活值的梯度会传回客户端。由于链式法则只需要这一个梯度就能继续计算,客户端的更新结果与训练未拆分模型完全相同。下面通过一个PyTorch单进程模拟展示这一过程:
import torch
from torch import nn
torch.manual_seed(0)
client = nn.Sequential(nn.Linear(784, 256), nn.ReLU()) # 切分点之前的层,与私有数据并列
server = nn.Sequential(nn.Linear(256, 10)) # 切分点之后的层
images, labels = torch.randn(32, 784), torch.randint(0, 10, (32,))
# 客户端:前向传播到切分层,然后只发送激活值
activations = client(images)
received = activations.detach().requires_grad_()
# 服务器:完成前向传播并反向传播至切分点,然后将该梯度发回
nn.functional.cross_entropy(server(received), labels).backward()
# 客户端:根据返回的梯度继续反向传播
activations.backward(received.grad)
split_grad = client[0].weight.grad.clone()
# 在未拆分模型上执行相同步骤时,客户端得到的梯度完全相同
client.zero_grad()
nn.functional.cross_entropy(server(client(images)), labels).backward()
print("Same client gradients as unsplit training:", torch.equal(split_grad, client[0].weight.grad))输出结果为 Same client gradients as unsplit training: True。随后,双方分别执行自己的优化器步骤。使用多个客户端时,原始协议会让客户端依次训练;每个客户端都会接着使用前一个客户端最新的客户端侧权重。
具体设置会根据需要保密的内容而变化。上面的基础设置会将标签发送给服务器;U 形设置也会将最后几层和标签保留在客户端;纵向设置则适用于掌握同一批记录的不同特征的组织:
拆分学习与联邦学习的对比#
联邦学习也会将数据保留在数据所有者的设备上,但每个客户端都会训练一份完整的模型副本,并发送权重更新以供平均。拆分学习发送的是激活值和梯度,因此客户端所需的计算资源少得多,也不会持有完整模型;通信量会随着数据量而非模型大小增长,而且客户端是依次训练,而不是并行训练。Chandra Thapa 等人于 2020 年提出的 SplitFed 学习结合了这两种方法:客户端侧各层并行运行,并采用联邦学习的方式进行平均。
纵向拆分学习也适用于金融领域,例如银行与掌握相同客户的不同特征的合作方共同训练一个模型,SecretFlow 的银行营销教程就是一个例子,而且双方无需交换私有数据。流水线并行也会按深度切分网络,但切分发生在同一可信集群的多块 GPU 之间,以便将大型模型装入内存。
隐私风险#
激活值和梯度仍然会携带数据相关信息。早期层的激活值可以被逆向还原为可辨认的图像;当服务器持有标签时,服务器返回的梯度也可能将标签泄露给客户端。Dario Pasquini、Giuseppe Ateniese 和 Massimo Bernaschi 在 ACM CCS 2021 上证明,恶意服务器可以通过返回的梯度劫持训练过程,使客户端的各层变成一种能让服务器重建私有输入的形式。防御措施可以添加差分隐私噪声、惩罚激活值泄露输入信息的程度,或检测异常梯度;这些方法都会在一定程度上影响准确率。部署时会将拆分学习与数据安全控制措施(例如身份验证和加密传输)结合起来,因为该协议本身只规定哪些内容可以跨越切分点。
如何选择切分层#
切分层决定了客户端计算量、通信量和信息暴露之间的平衡:较早的切分层所需的客户端计算量最少,但会发送较大的激活值,这些激活值仍与输入相似;较晚的切分层会发送更抽象的特征图,但对客户端硬件的要求更高,这对边缘 AI设备尤其重要。跳跃连接会让选择更加复杂,因为每个跨越切分点的张量都必须发送。若在主干网络之后切分 Ultralytics YOLO26,就必须发送三张特征图,因为其模型配置会将第 4、6 和 10 层的输出输入颈部网络:对于 YOLO26n(imgsz=640),这些特征图包含 1,126,400 个值,几乎与输入图像中的 1,228,800 个值一样多。










