#tensorflow-federated
#тензорный поток-федеративный
Вопрос:
Код в руководствах по TFF и в исследовательских проектах, которые я вижу, обычно отслеживает только состояния сервера. Я бы хотел, чтобы были внутренние состояния клиента (например, дополнительные клиентские внутренние нейронные сети, которые полностью децентрализованы и не обновляются федеративным образом), которые влияли бы на вычисления федеративного клиента.
Однако в клиентских вычислениях, которые я видел, они являются только функциями состояний сервера и данных. Возможно ли выполнить вышеуказанное?
Ответ №1:
Да, это легко выразить в TFF, и в стеках выполнения по умолчанию это будет выполняться просто отлично.
Как вы заметили, в репозитории TFF обычно есть примеры объединенного обучения на разных устройствах (Kairouz et. al 2019). Обычно мы говорим о том, что состояние имеет tff.SERVER
размещение, а сигнатура функции для одного «раунда» федеративного обучения имеет структуру (подробнее о сокращении типа TFF см. раздел «Объединенные данные» в руководствах):
(<State@SERVER, {Dataset}@CLIENTS> -> State@Server)
Мы можем представить клиента с отслеживанием состояния, просто расширив подпись:
(<State@SERVER, {State}@Clients, {Dataset}@CLIENTS> -> <State@Server, {State}@Clients>)
Реализация версии федеративного усреднения (McMahan et. al 2016), которая включает объект состояния клиента, может выглядеть примерно так:
@tff.tf_computation(
model_type,
client_state_type, # additional state parameter
client_data_type)
def client_training_fn(model, state, dataset):
model_update, new_state = # do some local training
return model_update, new_state # return a tuple including updated state
@tff.federated_computation(
tff.FederatedType(server_state_type, tff.SERVER),
tff.FederatedType(client_state_type , tff.CLIENTS), # new parameter for state
tff.FederatedType(client_data_type , tff.CIENTS))
def run_fed_avg(server_state, client_states, client_datasets):
client_initial_models = tff.federated_broadcast(server_state.model)
client_updates, new_client_state = tff.federated_map(client_training_fn,
# Pass the client states as an argument.
(client_initial_models, client_states, client_datasets))
average_update = tff.federated_mean(client_updates)
new_server_state = tff.federated_map(server_update_fn, (server_state, average_update))
# Make sure to return the client states so they can be used in later rounds.
return new_server_state, new_client_states
Вызов run_fed_avg
потребовал бы передачи Python list
тензоров / структур для каждого клиента, участвующего в раунде, и результатом вызова метода будет состояние сервера и список состояний клиента.