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

مشاهده در 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 به نظر نمی رسد بیش از حد مهم تا زمانی که نرخ یادگیری به طور مناسب تنظیم شده است. با این حال ، تنظیم آن بسیار پایین ممکن است نیاز به افزایش میزان یادگیری سرور برای بهترین عملکرد ، نسبت به عدم استفاده از clipping داشته باشد ، به همین دلیل ما به طور پیش فرض 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)

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

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