【问题标题】:Federated learning with tensorflowjs使用 tensorflowjs 进行联邦学习
【发布时间】:2019-04-22 03:07:58
【问题描述】:

我正在使用 tensorflowjs 实现联邦学习。但我有点卡在联合平均过程中。这个想法很简单:从多个客户端获取更新的权重并在服务器中对其进行平均。

我已经在浏览器上训练了一个模型,通过 model.getWeights() 方法获得了更新的权重,并将权重发送到服务器进行平均。


//get weights from multiple clients(happens i client-side)
w1 = model.getWeights(); //weights from client 1
w2 = model.getWeights(); //weights from client 2


//calculate average of the weights(server-side)
var mean_weights= [];
let length = w1.length; // length of all weights_array is same
for(var i=0; i<length; i++){
    let sum = w1[i].add(w2[i]);
    let mean = sum.divide(2); //got confused here, how to calculate mean of tensors ??
    mean_weights.push(mean);
}

//apply updates to the model(both client-side and server-side)
model.setWeights(mean_weights);

所以我的问题是: 如何计算张量数组的平均值? 另外,这是通过 tensorflowjs 执行联合平均的正确方法吗?

【问题讨论】:

    标签: tensorflow tensorflow.js


    【解决方案1】:

    是的,但要小心。你可以用tf.mean 平均两个张量,就像https://stackoverflow.com/users/5069957/edkeveked 说的那样。但是,请记住 axis=0 在 JavaScript 中应缩短为 0

    只是用第二种方式重写他的代码:

    const x = tf.tensor([1, 2, 3, 2, 3, 4], [2, 3]);
    x.mean(0).print()
    

    但是, 您问自己是否做得对,这取决于您是否在进行平均。滚动平均值存在问题。

    示例:

    如果你平均 (10, 20) 然后 30,你得到 (22.5) 与平均 (20, 30) 然后 10 (17.5) 不同的数字,这当然不同于同时平均所有三个,后者会给你20。

    计算后的平均值不遵循顺序无关原则。删除关联属性的是除法部分。所以你需要:

    答:存储所有模型权重,并根据所有以前的模型每次计算一个新的平均值

    B:为您的联合平均值添加一个加权系统,这样更新的模型不会显着影响系统。

    哪个有意义?

    我推荐B在你的情况下:

    1. 不想或不能存储曾经提交的每个模型和重量。
    2. 您知道,有些模型看到了更多有效数据,与盲模型相比,应该适当加权。

    您可以计算加权平均数,调整现有模型与传入模型的分母。

    在 JavaScript 中,您可以执行类似这样的简单操作来计算两个值之间的加权平均值:

    const modelVal1 = 0
    const modelVal2 = 1
    
    const weight1 = 0.5
    const weight2 = 1 - weight1
    
    
    const average = (modelVal1 * weight1) + (modelVal2 * weight2)
    

    上面的代码是你常见的平均加权平均值,但是当你调整权重1时,你正在重新平衡天平以显着调整结果以支持modelVal1modelVal2

    显然,您需要将我展示的 JavaScript 转换为张量数学函数,但这很简单。

    在联合学习中经常使用权重衰减的迭代平均(或加权平均)。请参阅Iterate averaging as regularization for stochastic gradient descentServer Averaging for Federated Learning

    【讨论】:

      【解决方案2】:

      要计算2个张量的平均值,可以使用tf.mean

      const x = tf.tensor1d([1, 2, 3]);
      const y = tf.tensor1d([2, 3, 4]);
      tf.stack([x, y]).print()
      const mean = tf.stack([x, y]).mean(axis=0)
      
      mean.print(); 
      

      【讨论】:

        猜你喜欢
        • 2022-06-29
        • 2021-05-29
        • 1970-01-01
        • 2021-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多