TensorFlow.org'da görüntüleyin | Google Colab'da çalıştırın | Kaynağı GitHub'da görüntüleyin | Not defterini indir |
tff.learning
modülü önerilen varsayılan yapılandırma ile agrega modeli udpates için çeşitli yollar içerir:
-
tff.learning.robust_aggregator
-
tff.learning.dp_aggregator
-
tff.learning.compression_aggregator
-
tff.learning.secure_aggregator
Bu öğreticide, temel motivasyonu, bunların nasıl uygulanacağını açıklıyor ve yapılandırmalarının nasıl özelleştirileceğine ilişkin öneriler sunuyoruz.
!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!'
Toplama yöntemleri geçirilebilir nesneler tarafından temsil edilir tff.learning.build_federated_averaging_process
onun kadar model_update_aggregation_factory
kelime argüman. Bunun gibi, burada tartışılan toplayıcılar doğrudan değiştirmek için kullanılabilir önceki öğretici federe öğrenmeye.
Ortalama ağırlıklı başlangıç FedAvg algoritması kullanılarak ifade edilebilir tff.aggregators.MeanFactory
aşağıdaki gibi:
mean = tff.aggregators.MeanFactory()
iterative_process = tff.learning.build_federated_averaging_process(
...,
model_update_aggregation_factory=mean)
Bu eğitimde kapsanan ağırlıklı ortalamayı genişletmek için kullanılabilecek teknikler şunlardır:
- Sıfırlama
- Kırpma
- Diferansiyel Gizlilik
- Sıkıştırma
- Güvenli Toplama
Uzantısı olan bileşim kullanılarak yapılır MeanFactory
kendisi de başka bir agregasyon fabrika tarafından sarılmış olan bu delegeler agregasyon kısmı ya da bir iç fabrika sarar. Tasarımla ilgili daha fazla ayrıntı için bkz Uygulama özel toplayıcılar öğretici.
İlk olarak, bu tekniklerin tek tek nasıl etkinleştirileceğini ve yapılandırılacağını açıklayacağız ve ardından bunların birlikte nasıl birleştirilebileceğini göstereceğiz.
teknikler
Tek tek teknikleri incelemeden önce, aşağıdaki teknikleri yapılandırmak için faydalı olacak nicel eşleştirme algoritmasını tanıtıyoruz.
kantil eşleştirme
Aşağıdaki toplama tekniklerinden birçoğunun, toplamanın bazı yönlerini kontrol eden bir norm sınırı kullanması gerekir. Bu tür sınırlar sabit olarak sağlanabilir, ancak genellikle sınırı eğitim sırasında uyarlamak daha iyidir. Önerilen yol arasında kuantil eşleştirme algoritması kullanmaktır Andrew ve ark. (2019) , ilk olarak daha geniş bir diferansiyel gizlilik ama yararlı ile uyumluluğunu önerdi. Belirli bir dağılım de değerini tahmin etmek için, kullanabilir tff.aggregators.PrivateQuantileEstimationProcess
. Örneğin, bir dağıtımın medyanına uyum sağlamak için şunları kullanabilirsiniz:
median_estimate = tff.aggregators.PrivateQuantileEstimationProcess.no_noise(
initial_estimate=1.0, target_quantile=0.5, learning_rate=0.2)
Kantil tahmin algoritmasını kullanan farklı teknikler, göreceğimiz gibi, algoritma parametrelerinin farklı değerlerini gerektirecektir. Genel olarak, artan learning_rate
parametresini, doğru bir dağılım daha hızlı uyarlama, ancak daha yüksek bir varyansı. no_noise
diferansiyel gizlilik için gürültü eklemez classmethod yapılar bir kuantil eşleştirme işlemi.
Sıfırlama
Sıfırlama, alışılmadık derecede büyük değerleri sıfırlarla değiştirmek anlamına gelir. Burada "olağandışı büyük", önceden tanımlanmış bir eşikten daha büyük veya önceki hesaplama turlarındaki değerlere göre büyük anlamına gelebilir. Sıfırlama, hatalı istemcilerde veri bozulmasına karşı sistem sağlamlığını artırabilir.
L-sonsuzluk normlarına daha büyük olan değerler ortalama hesaplamak için ZEROING_CONSTANT
sıfırlanmasını aşımı, bir sarmak tff.aggregators.MeanFactory
bir ile tff.aggregators.zeroing_factory
gerçekleştirdiği sıfırlama o:
zeroing_mean = tff.aggregators.zeroing_factory(
zeroing_norm=MY_ZEROING_CONSTANT,
inner_agg_factory=tff.aggregators.MeanFactory())
Burada bir sarmak MeanFactory
bir ile zeroing_factory
biz (önceden toplanmasını) istiyorum çünkü etkileri zeroing_factory
onlar iç geçirilir önce müşterilerine en değerlerine uygulamak için MeanFactory
ortalama alma yoluyla toplama için.
Bununla birlikte, çoğu uygulama için, nicelik tahmincisi ile uyarlamalı sıfırlamayı öneriyoruz. Bunu yapmak için, nicel eşleştirme algoritmasını aşağıdaki gibi kullanırız:
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)
Parametreler seçilmiştir süreç uyarlar çok hızlı (nispeten büyük böylece learning_rate
bugüne kadar gördüğü en büyük değerlerinden daha bir değere) biraz daha büyük. Bir miktarsal tahmini için Q
, eşik olacaktır sıfırlanması için kullanılan Q * multiplier + increment
.
L2 normuna bağlı kırpma
İstemci güncellemelerini kırpmak (bir L2 topuna yansıtma), aykırı değerlere karşı sağlamlığı artırabilir. Bir tff.aggregators.clipping_factory
gibi tam olarak yapılandırılmıştır tff.aggregators.zeroing_factory
, yukarıda tartışılan ve bir sabit ya da bir ya da sunar tff.templates.EstimationProcess
onun kadar clipping_norm
argüman. Önerilen en iyi uygulama, aşağıdaki gibi orta derecede yüksek bir norma orta derecede hızlı bir şekilde uyum sağlayan kırpma kullanmaktır:
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)
Çok sayıda sorunu Deneyimlerimize göre, kesin değeri target_quantile
kadar uzun öğrenme hızları uygun şekilde ayarlanmış olarak çok fazla bir önemi görünmüyor. Ancak, bunu çok düşük ayarlamak, kırpma kullanmamaya göre en iyi performans için sunucu öğrenme oranını artırmayı gerektirebilir, bu nedenle varsayılan olarak 0,8 öneririz.
Diferansiyel Gizlilik
TFF, uyarlamalı kırpma ve Gauss gürültüsünü kullanarak, diferansiyel olarak özel toplamayı da destekler. Diferansiyel olarak özel ortalamayı gerçekleştirmek için bir toplayıcı aşağıdaki gibi oluşturulabilir:
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)
Nasıl ayarlanacağı ile ilgili Rehberlik noise_multiplier
argüman bulunabilir TFF DP öğretici .
Kayıplı Sıkıştırma
Gzip gibi kayıpsız sıkıştırma ile karşılaştırıldığında, kayıplı sıkıştırma genellikle çok daha yüksek bir sıkıştırma oranı ile sonuçlanır ve daha sonra kayıpsız sıkıştırma ile birleştirilebilir. İstemciden sunucuya iletişim için daha az zaman harcanması gerektiğinden, eğitim turları daha hızlı tamamlanır. Öğrenme algoritmalarının doğal olarak rasgele doğası nedeniyle, belirli bir eşiğe kadar, kayıplı sıkıştırmadan kaynaklanan yanlışlığın genel performans üzerinde olumsuz bir etkisi yoktur.
Varsayılan tavsiye (bakınız basit eş biçimli bir nicemleme kullanmaktır . Suresh ve ark tensör boyutu sıkıştırma: örneğin), iki değer parametreli threshold
ve sayısı quantization_bits
. Her tensör için t
elemanlarının sayısı ise, t
az ya da eşit threshold
, sıkıştırılmış değildir. Daha büyük ise, elemanları t
randomize yuvarlama kullanılarak nicelleştirilir quantizaton_bits
bit. Yani işlemi uyguluyoruz
t = round((t - min(t)) / (max(t) - min(t)) * (2**quantizaton_bits - 1)),
aralığında bir tam sayıdır değerleri ile sonuçlanır [0, 2**quantizaton_bits-1]
. Kuantize edilmiş değerler, iletim için doğrudan bir tamsayı tipine paketlenir ve ardından ters dönüşüm uygulanır.
Biz ayarı tavsiye quantizaton_bits
ila 8 arasında değişen eşit threshold
20000 eşit:
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)
Ayar önerileri
Her iki parametre, quantization_bits
ve threshold
ayarlanabilir ve her antrenman turunda katılan müşteri sayısı da sıkıştırma etkinliğini etkileyebilir.
Eşik. 20000 varsayılan değeri seçilmiştir, çünkü ortak katman türlerindeki önyargılar gibi az sayıda elemana sahip değişkenlerin, eklenen gürültüye karşı çok daha duyarlı olduğunu gözlemledik. Ayrıca, sıkıştırılmamış boyutları başlangıçta nispeten küçük olduğundan, pratikte değişkenleri az sayıda elemanla sıkıştırmaktan elde edilecek çok az şey vardır.
Bazı uygulamalarda eşik seçimini değiştirmek mantıklı olabilir. Örneğin, bir sınıflandırma modelinin çıktı katmanının önyargıları gürültüye karşı daha duyarlı olabilir. Eğer 20004 bir kelime ile bir dil modeli eğitim yapıyorsanız, set isteyebilirsiniz threshold
20004 olmak.
Kuantizasyon bitleri. İçin 8 varsayılan değer quantization_bits
çoğu kullanıcı için iyi olmalı. 8 iyi çalışıyorsa ve biraz daha fazla performans elde etmek istiyorsanız, 7 veya 6'ya düşürmeyi deneyebilirsiniz. nihai model kalitesi düşmeye başlar ve ardından bu değeri iki katına çıkarır. Örneğin, ayar eğer quantization_bits
5 çalışmalara ancak 4 giderek yavaşlar modeli ayarlayarak, biz varsayılan "güvenli tarafta" olmak 6 olmak öneriyoruz.
Tur başına müşteri. Önemli ölçüde yuvarlak başına müşterilerin sayısını artırmak için daha küçük bir değer etkinleştirebilmesi Not quantization_bits
nicelenmesinin tanıtıldı randomize yanlışlık daha istemci güncelleştirmeleri üzerinde ortalaması alınarak evened olabileceğinden, iyi işe.
Güvenli Toplama
Güvenli Toplama (SecAgg) ile, istemci güncellemelerinin sunucunun yalnızca toplamlarının şifresini çözebileceği şekilde şifrelendiği bir şifreleme protokolüne atıfta bulunuyoruz. Geri bildirimde bulunan istemci sayısı yetersizse, sunucu hiçbir şey öğrenemez ve hiçbir durumda sunucu tek tek güncellemeleri denetleyemez. Bu kullanılarak gerçekleştirilmiştir tff.federated_secure_sum_bitwidth
operatörü.
Model güncellemeleri kayan nokta değerleridir, ancak SecAgg tamsayılar üzerinde çalışır. Bu nedenle, bir tamsayı tipine ayrıklaştırmadan önce herhangi bir büyük değeri bazı sınırlara kırpmamız gerekir. Kırpma sınırı, sabit olabilir veya uyarlanabilir şekilde belirlenebilir (önerilen varsayılan). Tamsayılar daha sonra güvenli bir şekilde toplanır ve toplam, kayan nokta alanına geri eşlenir.
İle SecAgg kullanılarak toplanır ağırlıklı değerlerle ortalama hesaplamak için MY_SECAGG_BOUND
bağlı kırpma, pass SecureSumFactory
için MeanFactory
edilmiştir:
secure_mean = tff.aggregators.MeanFactory(
tff.aggregators.SecureSumFactory(MY_SECAGG_BOUND))
Uyarlanabilir olarak sınırları belirlerken aynısını yapmak için:
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)
Ayar önerileri
Uyarlanabilir parametreler, sınırların sıkı olması için seçilmiştir (ayrıklaştırmada fazla hassasiyet kaybetmeyeceğiz), ancak kırpma nadiren gerçekleşir.
Parametreleri ayarlarsanız, SecAgg protokolünün ortalamada ağırlıklandırmadan sonra ağırlıklı model güncellemelerini topladığını unutmayın. Ağırlıklar tipik olarak yerel olarak işlenen veri noktalarının sayısıdır, bu nedenle farklı görevler arasında doğru sınır bu miktara bağlı olabilir.
Biz kullanılmasını önermiyoruz increment
adaptif oluştururken anahtar kelime argüman secagg_bound
bu büyük göreli kesinlik kaybına neden olabilir gibi küçük olmak kadar halinde, fiili tahmin biter.
Yukarıdaki kod parçacığı, yalnızca ağırlıklı değerleri SecAgg kullanır. Ağırlıkların toplamı için de SecAgg kullanılması gerekiyorsa, ortak bir eğitim kurulumunda olduğu gibi sınırların sabit olarak ayarlanmasını öneririz, olası en büyük ağırlık önceden bilinecektir:
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))
beste teknikleri
Yukarıda tanıtılan bir ortalamayı genişletmek için bireysel teknikler birlikte birleştirilebilir.
Bu tekniklerin danışanlara uygulanma sırasının
- Sıfırlama
- Kırpma
- Diğer teknikler
Olarak toplayıcılar tff.aggregators
(ki ön çekiş etkisi meydana son ve post-agregasyon etkiler birinci olur) "dış toplayıcılar" iç sarma "iç toplayıcılar" tarafından oluşan modülü. Örneğin, sıfırlama, kırpma ve sıkıştırma (bu sırayla) gerçekleştirmek için şöyle yazılır:
# 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)
Bu yapı aynı olduğundan Not varsayılan toplayıcılar algoritmaları öğrenmek için.
Başka kompozisyonlar da mümkündür. Bu belgeyi, birden çok farklı uygulamada çalışan varsayılan yapılandırmayı sağlayabileceğimizden emin olduğumuzda genişletiyoruz. Yeni fikirler uygulamak için bkz Uygulama özel toplayıcılar öğretici.