[TDSC 2022] A Multi-shuffler Framework to Establish Mutual Confidence for Secure Federated Learning

为安全联邦学习建立互信的多混洗框架

背景:

两种威胁:机密威胁、完整威胁安全联合学习(SFL)

confidentiality/privacy-oriented threat:模型反转攻击、深度泄露攻击

integrity-oriented threat:中毒攻击、后门攻击

②隐私&完整性的权衡 → 如何在个人和聚合者之间建立互信?

SFL三个领域:
privacy-oriented SFLs, integrity-oriented SFLs, and privacy & integrity SFLs.

本文的三个目标:

•目标1:在聚合阶段减轻恶意上传的影响。

•目标2:基于长期评估,从良性同行中识别和消除敌对的客户。

•目标3:在整个训练过程中,在不损害保密保证的情况下,保护客户不受复杂的攻击。换句话说,在实现两个以上的目标时,不应牺牲匿名性。


本文框架:多洗牌器安全联合学习(MSFL)

I. MSFL,训练聚合

II. 相互信任过程有3模块:

①分层洗牌机制

②恶意评估模块

③复合防御策略

效果:强大的隐私保护、高效的抗毒能力和快速的对手消除

 

 


本文的四大贡献:

① 首先确定了FL参与者和聚合器之间的安全冲突,以及由此产生的严重的信任危机。基于多洗牌框架,建立所有参与者之间的相互信任,以保持模型的完整性,隐私不对出现的中毒攻击妥协。

FL的互置信度问题

个体到聚合器的置信度:个体敏感数据的隐私保护

聚合器到个人的置信度:聚合器的全局模型的完整性保护

由于个人到聚合器的安全目的和聚合器到个人的信任目的之间的直接冲突,当前面向隐私和面向完整性的SFL是不兼容的。

②其次,与现有的仅进行模型洗牌来放大隐私的洗牌方法不同,设计了一种同时包含模型和用户洗牌分层洗牌机制,以获得强大的隐私/完整性保证,并抵抗对手。

分层混洗机制(Fig 2):

步骤1(用户洗牌):在每一轮中,用户最初被分成不同的组(洗牌器)。信用评分过高的客户被认定为对手,并在一开始就被淘汰了。每个用户都被分配一个实时恶意评估的分数,使随后的对手消除。

步骤2(本地训练和扰动):用户私下训练本地模型。扰动是进一步实现不同隐私或可识别性的一种替代方法。

步骤3(模型洗牌):通过模型拆分,将用户权重混合隐藏在组内,保留模型结构。

步骤4(恶意评估):后门在收到每个洗牌者的更新后,根据当前上传和历史上传,分别计算瞬时评估值和时间平均评估信用评分两个值来评估用户的恶意。

步骤5(聚合):最后,根据瞬时评估值,将打乱后的局部更新不均匀地聚合并公开发布。

③提出了一种分批动态评估机制来评估参与者在基于洗牌的学习过程中的恶意。与现有的单独评估用户的方法不同,进一步计算了分批的长期恶意因子,以有效地过滤掉对手,并在匿名场景下保持良性用户。

通过定期打乱用户组,可以实时评估整个组U^m_t,然后平等、匿名地为U^m_t内的所有用户分配信用评分,最终识别出“害群之马”,即长期累计信用评分异常高的用户

④实验分析了对代表性中毒攻击的防御效应,包括加性噪声、标签翻转和后门攻击。

标签翻转攻击。为了污染全局模型,标签翻转攻击者选择调整他们的本地数据集。将图像样本xi对应的正确分类标签y_i突变为y_j,∀i ≠ j,称为翻转。通过这个标签翻转过程,错误地训练模型。

加性噪声攻击比翻转更简单。攻击者没有修改数据样本,而是将随机干扰作为高斯噪声直接添加到局部模型或梯度中。此外,一个放大系数可以乘以它来扩大影响。因此,即使有一小部分受损的节点,攻击者也会显著恶化聚合模型。

后门攻击。目的是暗中操纵全球模型的一个特定部分。很明显,标签翻转和加性噪声都会降低分类任务的整体性能。后门攻击者只是改变了一些任务,而主要任务几乎不受影响


补充:

信息系统的安全等级三个性质CIA:机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
data["水流量"] = data["水流量"] / 60 # 原单位L/min,现转换为L/sec sj["总用水量"] = 0 # 给总用水量赋一个初始值0 for i in range(len(sj)): Start = sj.loc[i,"事件起始编号"]-1 End = sj.loc[i,"事件终止编号"]-1 if Start != End: for j in range(Start,End): if data.loc[j,"水流量"] != 0: sj.loc[i,"总用水量"] = (data.loc[j + 1,"发生时间"] - data.loc[j,"发生时间"]).seconds* \ data.loc[j,"水流量"] + sj.loc[i,"总用水量"] sj.loc[i,"总用水量"] = sj.loc[i,"总用水量"] + data.loc[End,"水流量"] * 2 else: sj.loc[i,"总用水量"] = data.loc[Start,"水流量"] * 2 sj["平均水流量"] = sj["总用水量"] / sj["用水时长"] # 定义特征 平均水流量 # 构造特征:水流量波动 # 水流量波动=∑(((单次水流的值-平均水流量)^2)*持续时间)/用水时长 sj["水流量波动"] = 0 # 给水流量波动赋一个初始值0 for i in range(len(sj)): Start = sj.loc[i,"事件起始编号"] - 1 End = sj.loc[i,"事件终止编号"] - 1 for j in range(Start,End + 1): if data.loc[j,"水流量"] != 0: slbd = (data.loc[j,"水流量"] - sj.loc[i,"平均水流量"])**2 slsj = (data.loc[j + 1,"发生时间"] - data.loc[j,"发生时间"]).seconds sj.loc[i,"水流量波动"] = slbd * slsj + sj.loc[i,"水流量波动"] sj.loc[i,"水流量波动"] = sj.loc[i,"水流量波动"] / sj.loc[i,"用水时长"] # 构造特征:停顿时长波动 # 停顿时长波动=∑(((单次停顿时长-平均停顿时长)^2)*持续时间)/总停顿时长 sj["停顿时长波动"] = 0 # 给停顿时长波动赋一个初始值0 for i in range(len(sj)): if sj.loc[i,"停顿次数"] > 1: # 当停顿次数为0或1
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值