赞
踩
联合学习 (FL) 是一种出色的 ML 方法,它使多个设备(例如物联网 (IoT) 设备)或计算机能够在模型训练完成时进行协作,而无需共享它们的数据。
“客户端”是 FL 中使用的计算机和设备,它们可以彼此完全分离并且拥有各自不同的数据,这些数据可以应用同不隐私策略,并由不同的组织拥有,并且彼此不能相互访问。
使用 FL,模型可以在没有数据的情况下从更广泛的数据源中学习。FL 的广泛使用的领域如下:
由于数据隐私对于许多应用程序(例如医疗数据)来说是一个大问题,因此 FL 主要用于保护客户的隐私而不与任何其他客户或方共享他们的数据。FL的客户端与中央服务器共享他们的模型更新以聚合更新后的全局模型。全局模型被发送回客户端,客户端可以使用它进行预测或对本地数据采取其他操作。
数据隐私:适用于敏感或隐私数据应用。
数据分布:训练分布在大量设备或服务器上;模型应该能够泛化到新的数据。
模型聚合:跨不同客户端更新的模型并且聚合生成单一的全局模型,模型的聚合方式如下:
通信开销:客户端与服务器之间模型更新的传输,需要考虑通信协议和模型更新的频率。
收敛性:FL中的一个关键因素是模型收敛到一个关于数据的分布式性质的良好解决方案。
首先我们先建立一个简单的服务端:
importtensorflowastf # Set up a server and some client devices server=tf.keras.server.Server() devices= [tf.keras.server.ClientDevice(worker_id=i) foriinrange(4)] # Define a simple model and compile it inputs=tf.keras.Input(shape=(10,)) outputs=tf.keras.layers.Dense(2, activation='softmax')(inputs) model=tf.keras.Model(inputs=inputs, outputs=outputs) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # Define a federated dataset and iterate over it federated_dataset=tf.keras.experimental.get_federated_dataset(devices, model, x=X, y=y) forx, yinfederated_dataset: # Train the model on the client data model.fit(x, y)
然后我们实现模型聚合步骤:
1、简单平均
# Average the updated model weights
model_weights=model.get_weights()
fordeviceindevices:
device_weights=device.get_weights()
fori, (model_weight, device_weight) inenumerate(zip(model_weights, device_weights)):
model_weights[i] = (model_weight+device_weight) /len(devices)
# Update the model with the averaged weights
model.set_weights(model_weights)
2、加权平均
# Average the updated model weights using weights based on the quality of the model or the amount of data used to train it
model_weights=model.get_weights()
total_weight=0
fordeviceindevices:
device_weights=device.get_weights()
weight=compute_weight(device) # Replace this with a function that returns the weight for the device
total_weight+=weight
fori, (model_weight, device_weight) inenumerate(zip(model_weights, device_weights)):
model_weights[i] =model_weight+ (device_weight-model_weight) * (weight/total_weight)
# Update the model with the averaged weights
model.set_weights(model_weights)
3、联邦平均
# Use federated averaging to aggregate the updated models
model_weights=model.get_weights()
client_weights= []
fordeviceindevices:
client_weights.append(device.get_weights())
server_weights=model_weights
for_inrange(num_rounds):
fori, deviceinenumerate(devices):
device.set_weights(server_weights)
model.fit(x[i], y[i])
client_weights[i] =model.get_weights()
server_weights=server.federated_average(client_weights)
# Update the model with the averaged weights
model.set_weights(server_weights)
以上就是联邦学习中最基本的3个模型聚合方法,希望对你有所帮助
https://avoid.overfit.cn/post/d426b291716c48409d3b68704545f6d0
作者:Dr Roushanak Rahmat, PhD
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。