Lihat di TensorFlow.org | Jalankan di Google Colab | Lihat sumber di GitHub | Unduh buku catatan |
The tff.learning
modul berisi sejumlah cara untuk agregat Model udpates dengan konfigurasi default yang direkomendasikan:
-
tff.learning.robust_aggregator
-
tff.learning.dp_aggregator
-
tff.learning.compression_aggregator
-
tff.learning.secure_aggregator
Dalam tutorial ini, kami menjelaskan motivasi yang mendasarinya, bagaimana penerapannya, dan memberikan saran tentang cara menyesuaikan konfigurasinya.
!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!'
Metode agregasi diwakili oleh benda-benda yang dapat dikirimkan ke tff.learning.build_federated_averaging_process
sebagai yang model_update_aggregation_factory
argumen kata kunci. Dengan demikian, agregator dibahas di sini bisa langsung digunakan untuk memodifikasi sebelumnya tutorial pembelajaran federasi.
Baseline tertimbang rata-rata dari FedAvg algoritma dapat dinyatakan dengan menggunakan tff.aggregators.MeanFactory
sebagai berikut:
mean = tff.aggregators.MeanFactory()
iterative_process = tff.learning.build_federated_averaging_process(
...,
model_update_aggregation_factory=mean)
Teknik yang dapat digunakan untuk memperluas rata-rata tertimbang yang tercakup dalam tutorial ini adalah:
- Zeroing
- Guntingan
- Privasi Diferensial
- Kompresi
- Agregasi Aman
Ekstensi ini dilakukan dengan menggunakan komposisi, di mana MeanFactory
membungkus sebuah pabrik batin untuk yang delegasi beberapa bagian dari agregasi, atau itu sendiri dibungkus oleh pabrik agregasi lain. Untuk detail lebih lanjut tentang desain, lihat Pelaksana agregator kustom tutorial.
Pertama, kami akan menjelaskan cara mengaktifkan dan mengonfigurasi teknik ini satu per satu, lalu menunjukkan bagaimana teknik ini dapat digabungkan.
Teknik
Sebelum mempelajari teknik individu, pertama-tama kami memperkenalkan algoritma pencocokan kuantil, yang akan berguna untuk mengonfigurasi teknik di bawah ini.
Pencocokan kuantitas
Beberapa teknik agregasi di bawah ini perlu menggunakan batas norma yang mengontrol beberapa aspek agregasi. Batas tersebut dapat diberikan sebagai konstanta, tetapi biasanya lebih baik untuk menyesuaikan batas selama pelatihan. Cara yang disarankan adalah dengan menggunakan algoritma kuantil pencocokan Andrew et al. (2019) , awalnya diusulkan untuk kompatibilitas dengan privasi diferensial namun bermanfaat secara lebih luas. Untuk memperkirakan nilai pada kuantil yang diberikan, Anda dapat menggunakan tff.aggregators.PrivateQuantileEstimationProcess
. Misalnya, untuk beradaptasi dengan median distribusi, Anda dapat menggunakan:
median_estimate = tff.aggregators.PrivateQuantileEstimationProcess.no_noise(
initial_estimate=1.0, target_quantile=0.5, learning_rate=0.2)
Teknik berbeda yang menggunakan algoritme estimasi kuantil akan memerlukan nilai parameter algoritme yang berbeda, seperti yang akan kita lihat. Secara umum, meningkatkan learning_rate
berarti parameter lebih cepat adaptasi dengan kuantil yang benar, tetapi dengan varians yang lebih tinggi. The no_noise
classmethod konstruksi proses kuantil pencocokan yang tidak menambahkan suara untuk privasi diferensial.
Zeroing
Zeroing mengacu pada penggantian nilai yang luar biasa besar dengan nol. Di sini, "luar biasa besar" bisa berarti lebih besar dari ambang batas yang telah ditentukan, atau relatif besar terhadap nilai dari putaran perhitungan sebelumnya. Zeroing dapat meningkatkan ketahanan sistem terhadap korupsi data pada klien yang salah.
Untuk menghitung rata-rata nilai dengan norma-norma L-infinity lebih besar dari ZEROING_CONSTANT
memusatkan perhatian-out, kami membungkus tff.aggregators.MeanFactory
dengan tff.aggregators.zeroing_factory
yang melakukan zeroing:
zeroing_mean = tff.aggregators.zeroing_factory(
zeroing_norm=MY_ZEROING_CONSTANT,
inner_agg_factory=tff.aggregators.MeanFactory())
Di sini kita membungkus MeanFactory
dengan zeroing_factory
karena kami ingin (pra-agregasi) efek dari zeroing_factory
untuk menerapkan nilai-nilai di klien sebelum mereka dilewatkan ke dalam MeanFactory
untuk agregasi melalui rata-rata.
Namun, untuk sebagian besar aplikasi, kami merekomendasikan zeroing adaptif dengan estimator kuantil. Untuk melakukannya, kami menggunakan algoritma pencocokan kuantil sebagai berikut:
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)
Parameter telah dipilih sehingga proses beradaptasi dengan sangat cepat (relatif besar learning_rate
) ke nilai agak lebih besar dari nilai terbesar lihat sejauh ini. Untuk perkiraan kuantil Q
, ambang batas yang digunakan untuk zeroing akan Q * multiplier + increment
.
Kliping untuk mengikat norma L2
Memotong pembaruan klien (memproyeksikan ke bola L2) dapat meningkatkan ketahanan terhadap outlier. Sebuah tff.aggregators.clipping_factory
terstruktur persis seperti tff.aggregators.zeroing_factory
dibahas di atas, dan dapat mengambil baik konstan atau tff.templates.EstimationProcess
sebagai yang clipping_norm
argumen. Praktik terbaik yang direkomendasikan adalah menggunakan kliping yang beradaptasi cukup cepat dengan norma yang cukup tinggi, sebagai berikut:
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)
Dalam pengalaman kami lebih banyak masalah, nilai yang tepat dari target_quantile
tampaknya tidak peduli terlalu banyak selama tingkat belajar disetel dengan tepat. Namun, menyetelnya sangat rendah mungkin memerlukan peningkatan kecepatan pembelajaran server untuk kinerja terbaik, dibandingkan tidak menggunakan kliping, itulah sebabnya kami merekomendasikan 0,8 secara default.
Privasi Diferensial
TFF juga mendukung agregasi pribadi yang berbeda, menggunakan kliping adaptif dan noise Gaussian. Sebuah agregator untuk melakukan rata-rata pribadi yang berbeda dapat dibangun sebagai berikut:
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)
Pedoman tentang bagaimana mengatur noise_multiplier
argumen dapat ditemukan di tutorial TFF DP .
Kompresi Rugi
Dibandingkan dengan kompresi lossless seperti gzip, kompresi lossy umumnya menghasilkan rasio kompresi yang jauh lebih tinggi dan masih dapat dikombinasikan dengan kompresi lossless setelahnya. Karena lebih sedikit waktu yang dibutuhkan untuk komunikasi klien-ke-server, putaran pelatihan selesai lebih cepat. Karena sifat algoritma pembelajaran yang acak secara inheren, hingga beberapa ambang batas, ketidakakuratan dari kompresi lossy tidak berdampak negatif pada kinerja keseluruhan.
Rekomendasi default adalah untuk menggunakan sederhana seragam kuantisasi (lihat Suresh et al. Misalnya), parameter dengan dua nilai: kompresi ukuran tensor threshold
dan jumlah quantization_bits
. Untuk setiap tensor t
, jika jumlah elemen t
kurang atau sama dengan threshold
, tidak dikompresi. Jika lebih besar, unsur-unsur t
dikuantisasi menggunakan pembulatan secara acak untuk quantizaton_bits
bit. Artinya, kami menerapkan operasi
t = round((t - min(t)) / (max(t) - min(t)) * (2**quantizaton_bits - 1)),
mengakibatkan nilai integer dalam kisaran [0, 2**quantizaton_bits-1]
. Nilai terkuantisasi secara langsung dikemas ke dalam tipe integer untuk transmisi, dan kemudian transformasi terbalik diterapkan.
Kami merekomendasikan pengaturan quantizaton_bits
sama dengan 8 dan threshold
sama ke 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)
Saran penyetelan
Kedua parameter, quantization_bits
dan threshold
dapat disesuaikan, dan jumlah klien berpartisipasi dalam setiap putaran pelatihan juga dapat mempengaruhi efektivitas kompresi.
Ambang. Nilai default 20000 dipilih karena kami telah mengamati bahwa variabel dengan sejumlah kecil elemen, seperti bias pada jenis lapisan umum, jauh lebih sensitif terhadap gangguan yang ditimbulkan. Selain itu, ada sedikit yang bisa diperoleh dari mengompresi variabel dengan sejumlah kecil elemen dalam praktiknya, karena ukurannya yang tidak terkompresi relatif kecil untuk memulai.
Dalam beberapa aplikasi mungkin masuk akal untuk mengubah pilihan ambang batas. Misalnya, bias dari lapisan keluaran model klasifikasi mungkin lebih sensitif terhadap noise. Jika Anda pelatihan model bahasa dengan kosakata 20004, Anda mungkin ingin set threshold
menjadi 20.004.
bit kuantisasi. Nilai default dari 8 untuk quantization_bits
harus baik untuk sebagian besar pengguna. Jika 8 bekerja dengan baik dan Anda ingin memeras sedikit lebih banyak kinerja, Anda dapat mencoba menurunkannya menjadi 7 atau 6. Jika sumber daya mengizinkan melakukan pencarian grid kecil, kami sarankan Anda mengidentifikasi nilai pelatihan yang menjadi tidak stabil atau kualitas model akhir mulai menurun, dan kemudian meningkatkan nilai itu dua kali lipat. Misalnya, jika pengaturan quantization_bits
untuk 5 karya, tetapi pengaturan untuk 4 degradasi model, kami akan merekomendasikan default menjadi 6 menjadi "di sisi yang aman".
Klien per putaran. Catatan yang secara signifikan meningkatkan jumlah klien per putaran dapat mengaktifkan nilai yang lebih kecil untuk quantization_bits
bekerja dengan baik, karena ketidaktelitian acak diperkenalkan oleh kuantisasi dapat menyamakan keluar dengan rata-rata lebih update client lebih.
Agregasi Aman
Dengan Agregasi Aman (SecAgg) kami merujuk ke protokol kriptografi di mana pembaruan klien dienkripsi sedemikian rupa sehingga server hanya dapat mendekripsi jumlah mereka. Jika jumlah klien yang melapor kembali tidak mencukupi, server tidak akan mempelajari apa pun -- dan server tidak akan dapat memeriksa pembaruan individual. Hal ini diwujudkan dengan menggunakan tff.federated_secure_sum_bitwidth
operator.
Pembaruan model adalah nilai floating point, tetapi SecAgg beroperasi pada bilangan bulat. Oleh karena itu kita perlu memotong nilai besar apa pun ke beberapa ikatan sebelum diskritisasi ke tipe integer. Batas kliping dapat berupa konstanta atau ditentukan secara adaptif (default yang disarankan). Bilangan bulat kemudian dijumlahkan dengan aman, dan jumlahnya dipetakan kembali ke domain floating point.
Untuk menghitung rata-rata dengan nilai-nilai tertimbang dijumlahkan menggunakan SecAgg dengan MY_SECAGG_BOUND
sebagai kliping terikat, lulus SecureSumFactory
ke MeanFactory
sebagai:
secure_mean = tff.aggregators.MeanFactory(
tff.aggregators.SecureSumFactory(MY_SECAGG_BOUND))
Untuk melakukan hal yang sama saat menentukan batas secara adaptif:
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)
Saran penyetelan
Parameter adaptif telah dipilih sehingga batasnya ketat (kita tidak akan kehilangan banyak presisi dalam diskritisasi) tetapi kliping jarang terjadi.
Jika menyetel parameter, perlu diingat bahwa protokol SecAgg menjumlahkan pembaruan model berbobot, setelah bobot rata-rata. Bobot biasanya jumlah titik data yang diproses secara lokal, maka antara tugas yang berbeda, batas kanan mungkin bergantung pada kuantitas ini.
Kami tidak menyarankan menggunakan increment
argumen kata kunci saat membuat adaptif secagg_bound
, karena hal ini bisa mengakibatkan hilangnya presisi relatif besar, dalam hal estimasi ujung aktual sampai yang kecil.
Cuplikan kode di atas hanya akan menggunakan SecAgg nilai berbobot. Jika SecAgg juga harus digunakan untuk jumlah bobot, kami merekomendasikan batas untuk ditetapkan sebagai konstanta, seperti dalam pengaturan pelatihan umum, bobot terbesar yang mungkin akan diketahui sebelumnya:
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))
Teknik komposisi
Teknik individu untuk memperluas mean yang diperkenalkan di atas dapat digabungkan bersama.
Kami merekomendasikan urutan penerapan teknik ini pada klien untuk menjadi
- Zeroing
- Guntingan
- Teknik lainnya
Agregator di tff.aggregators
modul yang terdiri oleh pembungkus "agregator batin" (yang pra-agregasi efek terjadi lalu dan pasca-agregasi efek terjadi pertama) dalam "agregator luar". Misalnya, untuk melakukan zeroing, clipping, dan kompresi (dalam urutan itu), seseorang akan menulis:
# 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)
Perhatikan bahwa struktur ini sesuai dengan agregator standar untuk algoritma belajar.
Komposisi lain juga dimungkinkan. Kami memperluas dokumen ini ketika kami yakin bahwa kami dapat menyediakan konfigurasi default yang berfungsi di beberapa aplikasi berbeda. Untuk menerapkan ide-ide baru, lihat Pelaksana agregator kustom tutorial.