【总结】Clustered Sampling 小结

本文探讨了如何通过修改梯度和调整样本量来应对基于模型相似性的Clustered Sampling攻击,重点关注了不同攻击者比例和数据量调整对算法稳定性的影响。作者还遇到并解决了计算过程中出现的数值问题。

(2条消息) 【论文复现3】算法2——Clustered sampling based on model similarity_admin11111111的博客-优快云博客icon-default.png?t=LA92https://blog.youkuaiyun.com/admin11111111/article/details/121072203#comments_19068693

一、对于梯度的修改

接着上篇的思路,只有在local_learning中对梯度进行修改才算是真正意义上的worker遭受到攻击。于是有下面的代码:

def local_learning(model, mu: float, optimizer, train_data, n_SGD: int, loss_f, k):
    model_0 = deepcopy(model)

    for _ in range(n_SGD):
        features, labels = next(iter(train_data))
        features_ = features.to(DEVICE)  # 1013
        labels_ = labels.to(DEVICE)  # 1013

        optimizer.zero_grad()

        predictions = model(features_)

        batch_loss = loss_f(predictions, labels_)
        batch_loss += mu / 2 * difference_models_norm_2(model, model_0)

        batch_loss.backward()

        # 1122 改变4个worker的梯度
        AT = 1  # 设置攻击者类型
        if AT == 0:
            attack_type = backward
        elif AT == 1:
            attack_type = random_attack
        elif AT == 2:
            attack_type = same_value_attack
        else:
            raise Exception("No such type of attack!")

        # 1124
        attacker_count = 0
        ATTACK_WORKER = 4  # 设置攻击者数量
        if attacker_count < ATTACK_WORKER:
            for param in model.parameters():
                param.grad = attack_type(param.grad)
            attacker_count += 1

        optimizer.step()

实验结果:

很明显,对于worker的攻击产生效果了。不过这个攻击worker占比40%还是太高了。接下来需要对比一下,10%,20%,30%的情况看看。

???还有一个疑问点有待解决,在backward和same_value_attack时,会报错:The condensed distance matrix must contain only finite values。至于为什么会出现NaN可能与聚类的ward方法有关。

不过在StackOverflow上有相关的解答,明天试试看。ValueError: The condensed distance matrix must contain only finite values. in python - Stack Overflowicon-default.png?t=LA92https://stackoverflow.com/questions/68039205/valueerror-the-condensed-distance-matrix-must-contain-only-finite-values-in-py

 二、 对于样本量的修改

之前修改样本量是直接在算法里面改的,虽然效果一样,但这个也是不合理的。因为这里给的是weights数组来表示各个worker的数据量占比大小的,因此只需要调整weights数组即可,然后也实现了对于篡改worker的数据量也能影响到算法稳定性。实验结果如下:

 这里也是修改了四个worker的数据量,让他们的数据量占比提高10倍,其实真实数据量还是相同的。

至此,符合预期的结果都出来了。接下来进一步的想法就是改变聚类方法或者相似性方法了。

在数据库分区和大数据处理中,"clustered by" 是一个关键概念,通常用于描述数据如何在物理存储层面上进行组织。当一个表被 **clustered by** 某个列时,意味着数据将根据该列的值进行物理排序和分布[^1]。 ### 数据库中的聚类Clustered) 在关系型数据库中,如 SQL Server 或 PostgreSQL,"clustered" 通常指 **聚簇索引(Clustered Index)**。聚簇索引决定了数据行在磁盘上的物理顺序。每个表只能有一个聚簇索引,因为数据行只能按照一种方式进行物理排序。例如: ```sql CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY CLUSTERED, Name NVARCHAR(100), DepartmentID INT ); ``` 在这个例子中,`EmployeeID` 被定义为聚簇索引,这意味着数据将按照 `EmployeeID` 的顺序存储在磁盘上[^3]。 ### 大数据处理中的聚类Clustered By) 在大数据处理框架中,如 Apache Hive 或 Spark SQL,"clustered by" 通常用于 **分桶(Bucketing)** 或 **哈希分区(Hash Partitioning)**。通过指定 `CLUSTERED BY` 子句,可以将数据按照某个列的哈希值分布在多个文件或节点中,从而提高查询性能和连接效率。例如,在 Hive 中: ```sql CREATE TABLE sales ( order_id INT, customer_id INT, amount DECIMAL(10,2) ) CLUSTERED BY (customer_id) INTO 4 BUCKETS; ``` 此语句表示数据将根据 `customer_id` 的哈希值分成 4 个桶,使得相同 `customer_id` 的数据会落在同一个桶中,便于后续的聚合或连接操作。 ### 总结 - 在数据库中,"clustered by" 通常与 **聚簇索引** 相关,决定数据的物理存储顺序。 - 在大数据处理中,"clustered by" 通常用于 **分桶或哈希分区**,以优化分布式查询性能。 这两种机制虽然应用场景不同,但核心目标一致:即通过合理的物理数据布局来提升查询效率和数据管理能力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值