تنظیم مجموعه های توصیه شده برای یادگیری

مشاهده در 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 سازه های یک چندک روند تطبیق می کند که سر و صدا برای حفظ حریم خصوصی دیفرانسیل اضافه کنید.

صفر کردن

صفر کردن به جایگزینی مقادیر غیرعادی بزرگ با صفر اشاره دارد. در اینجا، "غیر معمول بزرگ" می تواند بزرگتر از یک آستانه از پیش تعریف شده، یا بزرگتر از مقادیر دورهای قبلی محاسبات باشد. صفر کردن می تواند استحکام سیستم را در برابر خرابی داده ها در مشتریان معیوب افزایش دهد.

برای محاسبه متوسط ارزش با هنجارهای 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_bits و threshold را می توان تنظیم و تعدادی از مشتریان شرکت در هر دور آموزش همچنین می تواند در اثر فشرده سازی تأثیر بگذارد.

آستانه. مقدار پیش‌فرض 20000 انتخاب شده است زیرا مشاهده کرده‌ایم که متغیرهایی با تعداد عناصر کم، مانند بایاس‌ها در انواع لایه‌های رایج، به نویز معرفی‌شده بسیار حساس‌تر هستند. علاوه بر این، از فشرده سازی متغیرها با تعداد عناصر کم در عمل چیز کمی به دست می آید، زیرا اندازه فشرده نشده آنها برای شروع نسبتاً کوچک است.

در برخی از برنامه ها ممکن است تغییر انتخاب آستانه منطقی باشد. به عنوان مثال، سوگیری های لایه خروجی یک مدل طبقه بندی ممکن است به نویز حساس تر باشد. اگر شما به آموزش یک مدل زبانی با یک فرهنگ لغت از 20،004، شما ممکن است به مجموعه ای می خواهید threshold به 20،004.

بیت های کوانتیزاسیون مقدار پیش فرض 8 برای quantization_bits باید خوب برای اکثر کاربران باشد. اگر 8 به خوبی کار می‌کند و می‌خواهید کمی عملکرد را کاهش دهید، می‌توانید آن را به 7 یا 6 کاهش دهید. اگر منابع اجازه انجام یک جستجوی شبکه‌ای کوچک را می‌دهند، توصیه می‌کنیم مقداری را که آموزش برای آن ناپایدار می‌شود یا ناپایدار می‌شود، شناسایی کنید. کیفیت مدل نهایی شروع به کاهش می کند و سپس آن مقدار را دو برابر افزایش می دهد. برای مثال، اگر تنظیم quantization_bits به 5 کار می کند، اما تنظیم آن را به 4 تنزل مدل، ما توصیه می کنم به طور پیش فرض به 6 به "در سمت امن" است.

مشتریان در هر دور توجه داشته باشید که به طور قابل توجهی افزایش تعداد مشتریان در هر دور می توانید یک مقدار کوچکتر برای فعال quantization_bits به کار خوب، به دلیل عدم دقت تصادفی معرفی شده توسط تدریج ممکن است توسط میانگین گیری روی به روز رسانی مشتری بیشتر به تساوی.

تجمع امن

توسط Secure Aggregation (SecAgg) به یک پروتکل رمزنگاری اشاره می کنیم که در آن به روز رسانی های مشتری به گونه ای رمزگذاری می شوند که سرور فقط می تواند مجموع آنها را رمزگشایی کند. اگر تعداد کلاینت هایی که گزارش می دهند کافی نباشد، سرور اصلاً چیزی یاد نخواهد گرفت -- و در هیچ موردی سرور نمی تواند به روز رسانی های فردی را بررسی کند. این کار با استفاده متوجه tff.federated_secure_sum_bitwidth اپراتور.

به روز رسانی های مدل مقادیر ممیز شناور هستند، اما SecAgg بر روی اعداد صحیح عمل می کند. بنابراین ما باید قبل از گسسته سازی به یک نوع عدد صحیح، هر مقدار بزرگ را به برخی از کران ها برش دهیم. کران برش می تواند ثابت باشد یا به صورت تطبیقی ​​تعیین شود (پیش فرض توصیه شده). سپس اعداد صحیح به طور ایمن جمع می شوند و مجموع به دامنه ممیز شناور نگاشت می شود.

برای محاسبه میانگین با ارزش وزنی خلاصه با استفاده از SecAgg با MY_SECAGG_BOUND به عنوان قطع محدود، عبور SecureSumFactory به MeanFactory عنوان:

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)

توجه داشته باشید که این ساختار منطبق بر جمع آوری به طور پیش فرض برای الگوریتم های یادگیری.

ترکیب های دیگر نیز امکان پذیر است. ما این سند را زمانی گسترش می دهیم که مطمئن باشیم می توانیم پیکربندی پیش فرض را ارائه دهیم که در چندین برنامه مختلف کار می کند. برای اجرای ایده های جدید، و جمع آوری پیاده سازی سفارشی آموزش.