Öğrenme için önerilen toplamaları ayarlama

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:

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

  1. Sıfırlama
  2. Kırpma
  3. 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.