Path: blob/master/site/ko/federated/tutorials/random_noise_generation.ipynb
25118 views
Copyright 2021 The TensorFlow Federated Authors.
TFF에서 무작위 노이즈 생성
이 튜토리얼에서는 TFF의 무작위 노이즈 생성에 대한 권장 모범 사례를 설명합니다. 무작위 노이즈 생성은 페더레이션 학습 알고리즘(예: 차등 프라이버시)의 많은 개인정보보호 기술에서 중요한 부분을 차지합니다.
시작하기 전에
먼저, 노트북이 관련 구성 요소가 컴파일된 백엔드에 연결되어 있는지 확인합니다.
다음 "Hello World" 예제를 실행하여 TFF 환경이 올바르게 설정되었는지 확인합니다. 작동하지 않으면 설치 가이드에서 지침을 참조하세요.
클라이언트의 무작위 노이즈
클라이언트에서 노이즈의 필요성은 일반적으로 동일한 노이즈와 i.i.d. 노이즈의 두 가지 경우로 나뉩니다.
동일한 노이즈의 경우, 권장되는 패턴은 서버에 시드를 유지하고 이를 클라이언트에 브로드캐스트한 다음,
tf.random.stateless
함수를 사용하여 노이즈를 생성하는 것입니다.i.i.d. 노이즈의 경우 tf.random.<distribution> 함수를 피하라는 TF의 권장 사항에 따라 from_non_deterministic_state로 클라이언트에서 초기화된 tf.random.Generator를 사용합니다.
클라이언트 동작은 서버와 다릅니다(나중에 설명할 함정이 없음). 각 클라이언트가 자체 계산 그래프를 빌드하고 자체 기본 시드를 초기화하기 때문입니다.
클라이언트의 동일 노이즈
클라이언트의 독립적 노이즈
클라이언트의 모델 이니셜라이저
서버의 무작위 노이즈
권장되지 않는 사용: tf.random.normal
을 직접 사용
TF의 무작위 노이즈 생성 튜토리얼에 따라 무작위 노이즈 생성을 위한 API tf.random.normal
과 같은 TF1.x는 TF2에서 가능한 한 권장되지 않습니다. 이러한 API를 tf.function
및 tf.random.set_seed
와 함께 사용하면 놀라운 동작이 발생할 수 있습니다. 예를 들어, 다음 코드는 각 호출에서 동일한 값을 생성합니다. 이 놀라운 동작은 TF에 대해 예상되며, 설명은 tf.random.set_seed
문서에서 찾을 수 있습니다.
TFF에서는 상황이 약간 다릅니다. 노이즈 생성을 tff.tf_computation
대신 tf.function
으로 래핑하면 비결정성 무작위 노이즈가 생성됩니다. 그러나 이 코드 조각을 여러 번 실행하면 매번 다른 (n1, n2)
세트가 생성됩니다. TFF에 대한 전역 무작위 시드를 설정하는 쉬운 방법은 없습니다.
또한 명시적으로 시드를 설정하지 않고도 TFF에서 결정성 있는 노이즈가 생성될 수 있습니다. 다음 코드 조각의 return_two_noise
함수는 두 개의 동일한 노이즈 값을 반환합니다. 이는 TFF가 실행 전에 미리 계산 그래프를 작성하기 때문에 예상되는 동작입니다. 그러나 이것은 사용자가 TFF에서 tf.random.normal
을 사용하면서 주의를 기울여야 함을 시사합니다.
주의가 필요한 사용: tf.random.Generator
TF 튜토리얼에서 제안한 대로 tf.random.Generator
를 사용할 수 있습니다.
다만, 이용자에게 사용 상의 주의가 필요할 수 있습니다.
tf.random.Generator
는tf.Variable
을 사용하여 RNG 알고리즘의 상태를 유지합니다. TFF에서는tff.tf_computation
내에서 생성기를 구성하는 것이 좋습니다. 그리고tff.tf_computation
함수 사이에서 생성기와 그 상태를 전달하는 것은 어렵습니다.이전 코드 조각에서는 생성기에서 시드를 설정할 때 주의가 요구됩니다.
tf.random.Generator.from_non_deterministic_state()
를 대신 사용하면 예상은 하지만 놀라운 결과(결정성 있는n1==n2
)를 얻을 수 있습니다.
일반적으로, TFF는 기능적 연산을 선호하며 다음 섹션에서 tf.random.stateless_*
함수의 사용법을 보여줄 것입니다.
페더레이션 학습을 위한 TFF에서 우리는 종종 스칼라 대신 중첩 구조로 작업하며 이전 코드 조각은 자연스럽게 중첩 구조로 확장될 수 있습니다.
권장 사용법: 헬퍼가 있는 tf.random.stateless_*
TFF에서 일반적인 권장 사항은 무작위 노이즈 생성에 기능적인 tf.random.stateless_*
함수를 사용하는 것입니다. 이러한 함수는 무작위 노이즈를 생성하기 위한 명시적 입력 인수로 seed
(형상이 [2]
인 텐서 또는 두 스칼라 텐서의 tuple
)를 취합니다. 먼저 시드를 의사 상태로 유지하기 위해 헬퍼 클래스를 정의합니다. 헬퍼 RandomSeedGenerator
에는 state-in-state-out 방식의 기능 연산자가 있습니다. 카운터를 tf.random.stateless_*
에 대한 의사 상태로 사용하는 것은 합리적인데, 이러한 함수는 통계적으로 상관 관계가 없는 상관된 시드에 의해 노이즈가 만들어지기 전에 시드를 스크램블하기 때문입니다.
이제 헬퍼 클래스와 tf.random.stateless_normal
을 사용하여 TFF에서 무작위 노이즈(중첩 구조)를 생성해 보겠습니다. 다음 코드 조각은 TFF 반복 프로세스와 매우 유사해 보입니다. 페더레이션 학습 알고리즘을 TFF 반복 프로세스로 표현하는 예로 simple_fedavg를 참조하세요. 여기서 무작위 노이즈 생성을 위한 의사 시드 상태는 TFF 및 TF 함수에서 쉽게 전달할 수 있는 tf.Tensor
입니다.