В настоящее время это может показаться немного неестественным, но да, такая возможность возможна.
Один из подходов к этому, который поддерживается сегодня, заключается в том, чтобы каждый клиент использовал свою локальную скорость обучения в качестве вершины. -уровень, и используйте это в обучении. Дурацкий пример здесь будет (скольжение параметра модели в вычислениях ниже) что-то вроде
@tff.tf_computation(tff.SequenceTyoe(...), tf.float32)
def train_with_learning_rate(ds, lr):
# run training with `tf.data.Dataset` ds and learning rate lr
...
@tff.federated_computation(tff.FederatedType([tff.SequenceType(...), tf.float32])
def run_one_round(datasets_and_lrs):
return tff.federated_mean(
tff.federated_map(train_with_learning_rate, datasets_and_lrs))
Вызов федеративного вычисления здесь со списком кортежей с первым элементом кортежа, представляющим клиентов data и второй элемент, представляющий скорость обучения конкретного клиента, дадут то, что вы хотите.
Такая вещь требует написания пользовательских федеративных вычислений и, в частности, вероятности определения ваших собственных IterativeProcess
. Аналогичное определение итеративного процесса было недавно получено с открытым исходным кодом здесь, ссылка ведет на соответствующее определение локальной функции клиента , чтобы учесть планирование скорости обучения на клиентах, принимая дополнительный целочисленный параметр, представляющий круглое число, это, вероятно, хорошее место, чтобы посмотреть.