학습을 위한 권장 집계 조정

TensorFlow.org에서 보기 Google Colab에서 실행 GitHub에서 소스 보기 노트북 다운로드

tff.learning 모듈은 권장 기본 구성으로 집계 모델 udpates에 여러 가지 방법이 포함되어 있습니다

이 자습서에서는 기본 동기와 구현 방법을 설명하고 구성을 사용자 지정하는 방법에 대한 제안을 제공합니다.


!pip install --quiet --upgrade tensorflow-federated-nightly
!pip install --quiet --upgrade nest-asyncio

import nest_asyncio
nest_asyncio.apply()
import math
import tensorflow_federated as tff
tff.federated_computation(lambda: 'Hello, World!')()
b'Hello, World!'

집계 방법에 전달 될 수있는 객체로 표현됩니다 tff.learning.build_federated_averaging_process 그것으로 model_update_aggregation_factory 키워드 인수입니다. 따라서, 여기서 논의 된 수집기 직접 수정하는 데 사용할 수 있습니다 이전 튜토리얼 연합 학습에 있습니다.

평균 가중치로부터 기준 FedAvg 알고리즘을 사용하여 표현 될 수 tff.aggregators.MeanFactory 다음과 같이

mean = tff.aggregators.MeanFactory()
iterative_process = tff.learning.build_federated_averaging_process(
    ...,
    model_update_aggregation_factory=mean)

이 튜토리얼에서 다루는 가중 평균을 확장하는 데 사용할 수 있는 기술은 다음과 같습니다.

  • 제로화
  • 깎는
  • 차등 프라이버시
  • 압축
  • 보안 집계

확장이되는 조성물, 사용 완료 MeanFactory 그 자체가 다른 집합 공장 래핑 된 위임 집합체의 일부이거나, 또는 내부에 공장 랩. 디자인에 대한 자세한 내용은 다음을 참조 구현 사용자 지정 수집기 튜토리얼.

먼저 이러한 기술을 개별적으로 활성화하고 구성하는 방법을 설명한 다음 함께 결합하는 방법을 보여줍니다.

기법

개별 기술을 살펴보기 전에 먼저 아래 기술을 구성하는 데 유용한 분위수 일치 알고리즘을 소개합니다.

분위수 매칭

아래의 몇 가지 집계 기술은 집계의 일부 측면을 제어하는 ​​표준 경계를 사용해야 합니다. 이러한 경계는 상수로 제공될 수 있지만 일반적으로 훈련 과정에서 경계를 조정하는 것이 좋습니다. 권장되는 방법은의 분위수 매칭 알고리즘을 사용하는 것입니다 앤드류 외. (2019) , 초기에보다 광범위하게 차동 개인 정보 보호하지만, 유용과의 호환성을 위해 제안했다. 주어진 분위수의 값을 추정하려면 사용할 수 있습니다 tff.aggregators.PrivateQuantileEstimationProcess . 예를 들어 분포의 중앙값에 맞게 조정하려면 다음을 사용할 수 있습니다.

median_estimate = tff.aggregators.PrivateQuantileEstimationProcess.no_noise(
    initial_estimate=1.0, target_quantile=0.5, learning_rate=0.2)

분위수 추정 알고리즘을 사용하는 다른 기술은 우리가 보게 될 것과 같이 알고리즘 매개변수의 다른 값을 필요로 합니다. 일반적으로, 증가 learning_rate 매개 수단을 올바른 분위수 빠른 적응을하지만, 이상 분산이. no_noise 차동 개인 정보 보호에 대한 노이즈 추가하지 않습니다 classmethod 구성하는 분위수 매칭 과정.

제로화

영점 조정은 비정상적으로 큰 값을 0으로 바꾸는 것을 말합니다. 여기서 "비정상적으로 크다"는 것은 미리 정의된 임계값보다 크거나 이전 계산 라운드의 값에 비해 클 수 있음을 의미할 수 있습니다. 제로화는 결함이 있는 클라이언트의 데이터 손상에 대한 시스템 견고성을 높일 수 있습니다.

L-무한대 규범보다 더 큰과 값의 평균 계산하기 ZEROING_CONSTANT 제로 아웃, 우리는 포장 tff.aggregators.MeanFactory 로모그래퍼 tff.aggregators.zeroing_factory 수행이 영점 것을 :

zeroing_mean = tff.aggregators.zeroing_factory(
    zeroing_norm=MY_ZEROING_CONSTANT,
    inner_agg_factory=tff.aggregators.MeanFactory())

여기서 우리는 포장 MeanFactory 로모그래퍼 zeroing_factory 우리는 (사전 집계)를 원하기 때문에의 효과 zeroing_factory 그들 내부에 전달되기 전에 클라이언트에서 값에 적용 할 MeanFactory 평균을 통해 집계.

그러나 대부분의 응용 프로그램에서는 분위수 추정기를 사용하여 적응형 영점 조정을 권장합니다. 이를 위해 다음과 같이 분위수 일치 알고리즘을 사용합니다.

zeroing_norm = tff.aggregators.PrivateQuantileEstimationProcess.no_noise(
    initial_estimate=10.0,
    target_quantile=0.98,
    learning_rate=math.log(10),
    multiplier=2.0,
    increment=1.0)
zeroing_mean = tff.aggregators.zeroing_factory(
    zeroing_norm=zeroing_norm,
    inner_agg_factory=tff.aggregators.MeanFactory())

# Equivalent to:
# zeroing_mean = tff.learning.robust_aggregator(clipping=False)

매개 변수가 선택되었다 프로세스 적응 매우 빠르게 (비교적 큰되도록 learning_rate 지금까지 본 최대 값보다 큰 값으로) 약간 크다. 분위수 추정을 위해 Q , 임계치는 것이다 제로 사용 Q * multiplier + increment .

경계 L2 표준으로 클리핑

클라이언트 업데이트를 클리핑(L2 공에 투영)하면 이상값에 대한 견고성을 향상시킬 수 있습니다. tff.aggregators.clipping_factory 똑같이 구성되어 tff.aggregators.zeroing_factory 상술 한 상수 또는 어느 취할 수 tff.templates.EstimationProcess 그 같은 clipping_norm 인수. 권장되는 모범 사례는 다음과 같이 적당히 높은 표준에 적당히 빠르게 적응하는 클리핑을 사용하는 것입니다.

clipping_norm = tff.aggregators.PrivateQuantileEstimationProcess.no_noise(
    initial_estimate=1.0,
    target_quantile=0.8,
    learning_rate=0.2)
clipping_mean = tff.aggregators.clipping_factory(
    clipping_norm=clipping_norm,
    inner_agg_factory=tff.aggregators.MeanFactory())

# Equivalent to:
# clipping_mean = tff.learning.robust_aggregator(zeroing=False)

많은 문제를 통해 우리의 경험에서의 정확한 값 target_quantile 오랫동안 학습 속도가 적절하게 튜닝으로 너무 많이 중요하지 않는 것 같습니다. 그러나 매우 낮게 설정하면 클리핑을 사용하지 않는 것과 비교하여 최상의 성능을 위해 서버 학습률을 높여야 할 수 있으므로 기본적으로 0.8을 권장합니다.

차등 프라이버시

TFF는 적응형 클리핑 및 가우시안 노이즈를 사용하여 차등 비공개 집계도 지원합니다. 차등 개인 평균을 수행하는 집계기는 다음과 같이 구성할 수 있습니다.

dp_mean = tff.aggregators.DifferentiallyPrivateFactory.gaussian_adaptive(
    noise_multiplier=0.1, clients_per_round=100)

# Equivalent to:
# dp_mean = tff.learning.dp_aggregator(
#   noise_multiplier=0.1, clients_per_round=100, zeroing=False)

설정된하는 방법에 대한 지침 noise_multiplier 인수는에서 찾을 수 있습니다 TFF DP 튜토리얼 .

손실 압축

gzip과 같은 무손실 압축과 비교할 때 손실 압축은 일반적으로 훨씬 더 높은 압축 비율을 가져오며 이후에 여전히 무손실 압축과 결합될 수 있습니다. 클라이언트-서버 통신에 더 적은 시간을 소비해야 하므로 교육 라운드가 더 빨리 완료됩니다. 학습 알고리즘의 본질적으로 무작위화된 특성으로 인해 일부 임계값까지는 손실 압축의 부정확성이 전체 성능에 부정적인 영향을 미치지 않습니다.

기본 포인트는 (참조 간단한 균일 양자화를 사용하는 것이다 . 수레 쉬 등 텐서 크기 압축 : 예를 들면), 두 값에 의해 파라미터 threshold 와 수 quantization_bits . 모든 텐서 들어 t 의 요소 수 있다면, t 작거나 같은 threshold 이를 압축되지 않는다. 가 크면 소자의 t 무작위로 반올림하여 양자화된다 quantizaton_bits 비트. 즉, 우리는 연산을 적용합니다

t = round((t - min(t)) / (max(t) - min(t)) * (2**quantizaton_bits - 1)),

범위의 정수 값 결과 [0, 2**quantizaton_bits-1] . 양자화된 값을 정수형으로 직접 패킹하여 전송한 후 역변환을 적용한다.

우리는 설정하는 것이 좋습니다 quantizaton_bits 8과 동일한 threshold 20000과 동일 :

compressed_mean = tff.aggregators.MeanFactory(
    tff.aggregators.EncodedSumFactory.quantize_above_threshold(
        quantization_bits=8, threshold=20000))

# Equivalent to:
# compressed_mean = tff.learning.compression_aggregator(zeroing=False, clipping=False)

튜닝 제안

두 매개 변수, quantization_bitsthreshold 조정할 수 있으며, 각각의 훈련 라운드에 참가하는 클라이언트의 수는 압축의 효과에 영향을 미칠 수 있습니다.

한계점. 기본 값 20000이 선택되었습니다. 왜냐하면 공통 레이어 유형의 편향과 같이 요소 수가 적은 변수가 노이즈 도입에 훨씬 더 민감하다는 것을 관찰했기 때문입니다. 게다가, 압축되지 않은 크기가 처음에는 상대적으로 작기 때문에 실제로 적은 수의 요소로 변수를 압축하여 얻을 수 있는 것이 거의 없습니다.

일부 응용 프로그램에서는 임계값 선택을 변경하는 것이 합리적일 수 있습니다. 예를 들어, 분류 모델의 출력 레이어의 바이어스는 노이즈에 더 민감할 수 있습니다. 당신은 20004의 어휘와 언어 모델을 훈련하는 경우 설정을 할 수 있습니다 threshold 20004로.

양자화 비트. 8의 기본 값 quantization_bits 대부분의 사용자에게 잘해야한다. 8이 잘 작동하고 성능을 조금 더 끌어내고 싶다면 7이나 6으로 낮추십시오. 리소스가 작은 그리드 검색을 수행할 수 있는 경우 훈련이 불안정해지는 값을 식별하거나 최종 모델 품질이 저하되기 시작한 다음 해당 값을 2로 늘립니다. 예를 들어, 설정하면 quantization_bits 5 개 작품,하지만 4 개 저하로 모델을 설정, 우리는 기본 "안전 측면에"수 (6)로 추천 할 것입니다.

라운드당 클라이언트 수. 크게 라운드 당 클라이언트의 수를 증가하기위한 작은 값으로 설정할 수 있습니다 quantization_bits 양자화에 의해 도입 된 무작위 부정확 이상의 클라이언트 업데이트를 통해 평균하여 evened 할 수 있기 때문에, 잘 작동합니다.

보안 집계

Secure Aggregation(SecAgg)이란 서버가 합계만 해독할 수 있는 방식으로 클라이언트 업데이트가 암호화되는 암호화 프로토콜을 말합니다. 보고하는 클라이언트의 수가 충분하지 않으면 서버는 전혀 학습하지 않으며 어떤 경우에도 서버가 개별 업데이트를 검사할 수 없습니다. 이것은 사용하여 실현 tff.federated_secure_sum_bitwidth 연산자를.

모델 업데이트는 부동 소수점 값이지만 SecAgg는 정수에서 작동합니다. 따라서 정수 유형으로 이산화하기 전에 큰 값을 일부 경계로 잘라야 합니다. 클리핑 경계는 상수이거나 적응적으로 결정될 수 있습니다(권장 기본값). 그런 다음 정수가 안전하게 합산되고 합이 부동 소수점 도메인으로 다시 매핑됩니다.

SecAgg로를 이용하여 가중 합산 값의 평균을 계산 MY_SECAGG_BOUND 결합 클립핑으로서 전달 SecureSumFactoryMeanFactory 같이

secure_mean = tff.aggregators.MeanFactory(
    tff.aggregators.SecureSumFactory(MY_SECAGG_BOUND))

경계를 적응적으로 결정하면서 동일한 작업을 수행하려면 다음을 수행합니다.

secagg_bound = tff.aggregators.PrivateQuantileEstimationProcess.no_noise(
    initial_estimate=50.0,
    target_quantile=0.95,
    learning_rate=1.0,
    multiplier=2.0)
secure_mean = tff.aggregators.MeanFactory(
    tff.aggregators.SecureSumFactory(secagg_bound))

# Equivalent to:
# secure_mean = tff.learning.secure_aggregator(zeroing=Fasle, clipping=False)

튜닝 제안

경계가 좁도록 적응 매개변수가 선택되었지만(이산화에서 정밀도가 많이 떨어지지 않음) 클리핑이 거의 발생하지 않습니다.

매개변수를 조정하는 경우 SecAgg 프로토콜은 평균에 가중치를 부여한 후 가중치가 적용된 모델 업데이트를 합산합니다. 가중치는 일반적으로 로컬에서 처리되는 데이터 포인트의 수이므로 다른 작업 간에 올바른 경계는 이 수량에 따라 달라질 수 있습니다.

우리는 사용하지 않는 것이 좋습니다 increment 적응 작성시 키워드 인수를 secagg_bound 이 큰 상대 정밀도가 손실 될 수 있기 때문에 작은 것까지의 경우, 실제 추정 끝.

위의 코드 조각은 SecAgg 가중 값만 사용합니다. 가중치 합계에도 SecAgg를 사용해야 하는 경우 일반적인 훈련 설정에서와 같이 경계를 상수로 설정하는 것이 좋습니다. 가능한 가장 큰 가중치를 미리 알 수 있습니다.

secure_mean = tff.aggregators.MeanFactory(
    value_sum_factory=tff.aggregators.SecureSumFactory(secagg_bound),
    weight_sum_factory=tff.aggregators.SecureSumFactory(
        upper_bound_threshold=MAX_WEIGHT, lower_bound_threshold=0.0))

작곡 기법

위에 소개된 평균을 확장하는 개별 기술은 함께 결합될 수 있습니다.

이러한 기술이 클라이언트에 적용되는 순서를 권장합니다.

  1. 제로화
  2. 깎는
  3. 기타 기술

수집기의 tff.aggregators (그의 예비 응집 효과 일 지난 후의 응집 효과 발생 제) "외부 수집기"내부 래핑 "내부 수집기"로 구성되는 모듈을 포함한다. 예를 들어 영점화, 클리핑 및 압축(순서대로)을 수행하려면 다음과 같이 작성합니다.

# Compression is innermost because its pre-aggregation effects are last.
compressed_mean = tff.aggregators.MeanFactory(
    tff.aggregators.EncodedSumFactory.quantize_above_threshold(
        quantization_bits=8, threshold=20000))
# Compressed mean is inner aggregator to clipping...
clipped_compressed_mean = tff.aggregators.clipping_factory(
    clipping_norm=MY_CLIPPING_CONSTANT,
    inner_agg_factory=compressed_mean)
# ...which is inner aggregator to zeroing, since zeroing happens first.
final_aggregator = tff.aggregators.zeroing_factory(
    zeroing_norm=MY_ZEROING_CONSTANT,
    inner_agg_factory=clipped_compressed_mean)

이 구조가 일치하는지 참고 기본 애그리 게이터 알고리즘을 학습합니다.

다른 구성도 가능합니다. 다양한 애플리케이션에서 작동하는 기본 구성을 제공할 수 있다고 확신할 때 이 문서를 확장합니다. 새로운 아이디어를 구현하기위한 참조 구현 사용자 지정 수집기 튜토리얼.