Есть ли способ для клиентов TFF иметь внутренние состояния?

#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 тензоров / структур для каждого клиента, участвующего в раунде, и результатом вызова метода будет состояние сервера и список состояний клиента.