Jak manipulować gradientami klienta w sfederowanym sgd tensorflow
Postępuję zgodnie z tym samouczkiem, aby rozpocząć korzystanie z federacyjnego tensorflow. Moim celem jest uruchomienie sfederowanego sgd (nie federacyjnego avg) z pewnymi manipulacjami na wartościach gradientu klienta przed wysłaniem ich na serwer.
Przed przejściem do przodu, aby krótko powtórzyć proces federacyjny sgd, dla każdego tury klienci będą wysyłać swoje obliczone gradienty (niezaktualizowane wagi) na serwer, serwer je agreguje i rozgłasza zaktualizowany model do klientów.
Teraz z tego, co zebrałem do tej pory, mogę użyć tej funkcji build_federated_sgd_processzamiast build_federated_averaging_processwe wspomnianym samouczku, aby wykonać sfederowane sgd w sposób opisany powyżej.
Tam, gdzie jestem zagubiony, muszę przyciąć gradienty klienta i dodać do nich trochę szumu (niezależnie generowanego dla każdej wartości gradientu) przed wysłaniem gradientów na serwer i nie jestem pewien, jak to zrobić. Generowanie hałasu jest dość proste, ale jaką funkcję powinienem zmodyfikować / zaimplementować, aby móc zastosować hałas do gradientów?
Odpowiedzi
build_federated_sgd_processjest w pełni konserwowany; tak naprawdę ma służyć jako implementacja referencyjna, a nie jako punkt rozszerzalności.
Wierzę, że to, czego szukasz, jest funkcja, która build_federated_sgd_processwzywa pod HOOS, tff.learning.framework.build_model_delta_optimizer_process. Ta funkcja umożliwia dostarczenie własnego mapowania z funkcji modelu (IE, wywoływanej bezargumentowej funkcji, która zwraca a tff.learning.Model) do pliku tff.learning.framework.ClientDeltaFn.
Twój ClientDeltaFnwyglądałby mniej więcej tak:
@tf.function
def _clip_and_noise(grads):
return ...
class ClippedGradClientDeltaFn(tff.learning.framework.ClientDeltaFn)
def __init__(self, model, ...):
self._model = model
...
@tf.function
def __call__(dataset, weights):
# Compute gradients grads
return _clip_and_noise(grads)
I mógłbyś skonstruować tff.templates.IterativeProcess, dzwoniąc:
def clipped_sgd(model_fn: Callable[[], model_lib.Model]) -> ClippedGradClientDeltaFn:
return ClippedGradClientDeltaFn(
model_fn(),
...)
iterproc = optimizer_utils.build_model_delta_optimizer_process(
model_fn, model_to_client_delta_fn=clipped_sgd, ...)
mniej więcej w ciele build_federated_sgd_process.
Wydaje mi się, że interesuje Cię prywatność różnicowa; TFF jest w rzeczywistości zaprojektowany do tworzenia z różnicową prywatnością ogólnie poprzez procesy agregacji, zamiast pisania różnych aktualizacji klienta, chociaż jest to z pewnością jedno podejście. Zobacz wskazówki z TFF, aby uzyskać dokumentację badawczą dla idiomatycznych sposobów połączenia prywatności różnicowej z TFF.