联邦学习(FL,Federated Learning) 之FedAvg算法

Communication-Efficient Learning of Deep Networks from Decentralized Data 

论文地址:[1602.05629] Communication-Efficient Learning of Deep Networks from Decentralized Data (arxiv.org)

FL主要瓶颈 :     

1. 通信速率不稳定,且可能不可靠     

2. 聚合服务器的容量有限,同时与server通信的client的数量受限

解决方案:

在FL的每一步考虑:     

        1. 减少client数量     

        2. 减少通信带宽

FedAvg算法采取策略:

        增加客户端计算,限制通信频率(在上传更新的梯度之前执行多次本地梯度下降迭代)

FedAvg算法       

        随机选择m个客户端采样,对这m个客户端的梯度更新进行平均以形成全局更新,同时用当前全局模型替换未采样的客户端     

优点:相对于FedSGD在相同效果情况下,通讯成本大大降低     

缺点:最终的模型是有偏倚的,不同于预期的每个客户端确定性聚合后的模型。

FedAvg客户端抽样:

               联邦学习(FL,Federated Learning) 之FedAvg算法_第1张图片

  • 在每次迭代中对随机选择参与的客户端子集St进行统一抽样,并下发当前全局模型参数θt,在客户端本地进行训练更新梯度,并上传至服务端进行平均形成更新参数θi^(t+1);
  • 不属于抽样子集的客户端的更新则由当前的全局模型参数θt代替;
  • 然后服务端进行平均产生新的全局参数θt+1。

FedAvg算法伪代码:

                联邦学习(FL,Federated Learning) 之FedAvg算法_第2张图片

 FedAvg算法步骤:

1. 在每一轮迭代的步骤t,服务端发送当前全局模型参数θ给客户端

2. 非抽样子集中的客户端根据θt,通过SGD更新本地模型

3. 抽样子集中每个客户端上传更新后的本地参数θt+1

4. 在迭代步骤t+1,服务端根据全局模型参数θi(t+1)计算出加权平均值θt+1

          

             联邦学习(FL,Federated Learning) 之FedAvg算法_第3张图片

其中,由此可得最终的优化的目标函数。

 优化目标:

pi表示权重,一般表达式为nk/n。FedAvg算法最终取Li(θ)的加权平均值。

算法实现代码:

 # Set the model to train and send it to device.
    global_model.to(device)
    global_model.train()
    print(global_model)

    # copy weights
    global_weights = global_model.state_dict()

    # Training
    train_loss, train_accuracy = [], []
    val_acc_list, net_list = [], []
    cv_loss, cv_acc = [], []
    print_every = 2
    val_loss_pre, counter = 0, 0

    for epoch in tqdm(range(args.epochs)):
        local_weights, local_losses = [], []
        print(f'\n | Global Training Round : {epoch+1} |\n')

        global_model.train()
        m = max(int(args.frac * args.num_users), 1)
        idxs_users = np.random.choice(range(args.num_users), m, replace=False)

        for idx in idxs_users:
            local_model = LocalUpdate(args=args, dataset=train_dataset,
                                      idxs=user_groups[idx], logger=logger)
            w, loss = local_model.update_weights(
                model=copy.deepcopy(global_model), global_round=epoch)
            local_weights.append(copy.deepcopy(w))
            local_losses.append(copy.deepcopy(loss))

        # update global weights
        global_weights = average_weights(local_weights)

        # update global weights
        global_model.load_state_dict(global_weights)

        loss_avg = sum(local_losses) / len(local_losses)
        train_loss.append(loss_avg)

        # Calculate avg training accuracy over all users at every epoch
        list_acc, list_loss = [], []
        global_model.eval()
        for c in range(args.num_users):
            local_model = LocalUpdate(args=args, dataset=train_dataset,
                                      idxs=user_groups[idx], logger=logger)
            acc, loss = local_model.inference(model=global_model)
            list_acc.append(acc)
            list_loss.append(loss)
        train_accuracy.append(sum(list_acc)/len(list_acc))

源代码地址:

Federated-Learning-PyTorch/federated_main.py at master · AshwinRJ/Federated-Learning-PyTorch · GitHub

你可能感兴趣的:(论文阅读笔记,联邦学习,pytorch,机器学习,人工智能)