文章目录
本笔记参考自b站up主:丸一口
原视频链接
如上图,现有6个医院:眼科、儿科、妇科、骨科、综合医院1、综合医院2。中间节点为政府。
现政府要求用各个医院的数据训练某个模型,希望对某些疾病进行一些预测,数据如下图:
如果是传统方法,那就是六个医院直接把数据发送到政府处,然后政府那边做机器学习。
如果用联邦学习,那政府是不能直接接收其他医院的所有数据的,因为如果直接接收数据,会有一个严重问题,就是隐私泄露的问题。因为传数据的过程中可能会被拦截,并且大量数据传送过程中对带宽也是有较高要求。
联邦学习的具体解决方案:中心节点初始化一个模型,把这个初始模型发给其他节点,其他节点在自己的地方做训练,训练结束后,把训练好的模型传到中心节点。然后中心节点做一个加权平均。然后中心节点再把模型发给其他节点,重复上述广播模型,上传模型操作。一直到中心节点认为准确率达到要求后,停止操作。
可以看到,联邦学习的过程中,中心节点是没有在本地存储数据的,这样就保证了数据的隐私。并且中心节点在没有数据的情况下,也能达到训练所有其他节点数据的效果。
再来看数据分布的问题:IID和Non-IID
ps:IID:independent identical distribution
这里的独立同分布
独立:就类似概率论里面两个事件发生互不影响。
同分布:如上图的综1和综2,它两个的数据分布情况都相同,都是均匀分布。
对于上图中的数据,如果我们仅仅用综合医院1的数据是不是也可以做到各个方面数据的训练?那为什么还需要其他的医院数据一起训练?
因为我们在机器学习训练的过程中,数据是训练的越多,对一些疾病的预测是更准确的,拟合效果也是更好的。
另外,虽然综合医院1可以对眼CT、胸CT、腿CT的数据分别训练。但是单眼CT来说,眼科医院的数据一方面更多,另一方面肯定也是更精确的。
在神经网络中,其实就是一个带权无向图。以上图中h1为例
前向传播:
利用公式IN=i1w1+i2w2,我们得到h1的IN的数据,把这个数据称之为net值。
而h1数据从第二层传给第三层时,还需要经过一个处理,也就是激活函数。
激活函数的作用就是不让网络数据线性的往下传递,每一层进行一点干扰,这样非线性的传递,才能拟合非线性的曲线。
这里用到的激活函数是ReLu,负数为0,正数是它本身,ReLu曲线如下:
然后计算出h1的out值。然后以此类推,依次往下传,直到传播到final。
比如我们这个神经网络是做一个猫狗识别,我们input进去一个图片,然后final出来一个猫或狗的结果。假设猫是1,狗是0。
然后final出来一个值是0.35,那么就是产生了一个误差,我们确定真实值为r,final值为f,然后使用误差函数,我们这里就简单的做误差就是r和f差的绝对值。具体误差函数看工业要求。
后向传播:
如果是猫狗检测,得到上述0.35这种非猫非狗的数据,肯定要再来一轮。下一轮经过神经网络的各个节点就需要调整各路的权重了。因为第一轮权重是随机出来的,后续就是要把这些路径的权重训练成所需,比如这里传入猫图片训练成1,传入成狗图片训练成0
所以我们在经历一轮前向传播之后,要立即接一轮后向传播来改变各路权重。
ps:如果不做后向传播改变各路权重,那么前向传播得到的值会一直不变。
后向传播具体做法:
等式右侧三个偏导解释分别如下:
最后更新w5,新的w5=旧的w5-学习率*刚跟求的偏导
学习率可以认为是一个步长,如果不设置学习率就相当于学习率是1,对准确率影响较大,一般学习率设为0.01或者其他接近0的数。
其他的w和前面介绍的w5都是一样的步骤做GD梯度下降,即权重更新。
SGD就是在神经网络中每次随机选一个数据做梯度下降训练。
注:
SGD:随机选一个数据
BGD:全批量数据,比如数据集1000个,每次训练都全部1000个
MBGD:比如数据集1000个,分成几个组,比如分成20组,每组50个。做20轮梯度下降,每次取1组50个出来。
下面对FedAvg联邦平均算法进行一个具体的解释:
Client:
Server: