ضبط التجميعات الموصى بها للتعلم

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

و 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 يلتف مصنع الداخلي الذي كان مندوبا جزء من التجميع، أو هو في حد ذاته ملفوفة بواسطة مصنع التجميع آخر. لمزيد من التفاصيل على التصميم، انظر تطبيق مخصص تجميع البرنامج التعليمي.

أولاً ، سنشرح كيفية تمكين هذه التقنيات وتكوينها بشكل فردي ، ثم نوضح كيف يمكن دمجها معًا.

التقنيات

قبل الخوض في التقنيات الفردية ، نقدم أولاً خوارزمية المطابقة الكمية ، والتي ستكون مفيدة لتكوين التقنيات أدناه.

المطابقة الكمية

تحتاج العديد من تقنيات التجميع أدناه إلى استخدام معيار محدد يتحكم في بعض جوانب التجميع. يمكن توفير هذه الحدود بشكل ثابت ، ولكن عادة ما يكون من الأفضل تكييف الحدود أثناء فترة التدريب. الطريقة الموصى بها لاستخدام خوارزمية quantile مطابقة أندرو وآخرون. (2019) ، واقترح في البداية من أجل التوافق مع خصوصية تفاضلية ولكنها مفيدة على نطاق أوسع. لتقدير القيمة في quantile معين، يمكنك استخدام tff.aggregators.PrivateQuantileEstimationProcess . على سبيل المثال ، للتكيف مع متوسط ​​التوزيع ، يمكنك استخدام:

median_estimate = tff.aggregators.PrivateQuantileEstimationProcess.no_noise(
    initial_estimate=1.0, target_quantile=0.5, learning_rate=0.2)

سوف تتطلب التقنيات المختلفة التي تستخدم خوارزمية التقدير الكمي قيمًا مختلفة لمعلمات الخوارزمية ، كما سنرى. بشكل عام، وزيادة learning_rate سائل المعلمة أسرع التكيف مع quantile الصحيح، ولكن مع التباين العالي. و no_noise classmethod يبني على quantile عملية المطابقة التي لا تضيف الضوضاء لخصوصية تفاضلية.

التصفير

يشير التصفير إلى استبدال القيم الكبيرة بشكل غير عادي بالأصفار. هنا ، قد تعني "كبيرة بشكل غير عادي" أكبر من عتبة محددة مسبقًا ، أو كبيرة بالنسبة للقيم من الجولات السابقة للحساب. يمكن أن يؤدي التصفير إلى زيادة متانة النظام لتلف البيانات على العملاء المعيلين.

لحساب متوسط القيم مع المعايير 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 ) إلى قيمة أكبر إلى حد ما من أكبر القيم رأيناه حتى الآن. لتقدير quantile Q ، عتبة تستخدم لالتصفير سيكون Q * multiplier + increment .

لقطة لمعيار L2 المربوط

يمكن أن يؤدي قص تحديثات العميل (الإسقاط على كرة L2) إلى تحسين المتانة للقيم المتطرفة. A 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 لأننا لاحظنا أن المتغيرات التي تحتوي على عدد صغير من العناصر ، مثل التحيزات في أنواع الطبقات الشائعة ، تكون أكثر حساسية للضوضاء المقدمة. علاوة على ذلك ، هناك القليل الذي يمكن اكتسابه من ضغط المتغيرات مع عدد صغير من العناصر في الممارسة العملية ، حيث أن حجمها غير المضغوط صغير نسبيًا لتبدأ به.

في بعض التطبيقات ، قد يكون من المنطقي تغيير اختيار العتبة. على سبيل المثال ، قد تكون تحيزات الطبقة الناتجة لنموذج التصنيف أكثر حساسية للضوضاء. إذا كنت تدريب نموذج اللغة مع مفردات 20004، قد ترغب في مجموعة threshold أن يكون 20004.

بت الكمي. القيمة الافتراضية من 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)

علما بأن هذا الهيكل يطابق تجميع الافتراضي للخوارزميات التعلم.

التركيبات الأخرى ممكنة أيضًا. نقوم بتمديد هذا المستند عندما نكون واثقين من أنه يمكننا توفير التكوين الافتراضي الذي يعمل في العديد من التطبيقات المختلفة. لتنفيذ أفكار جديدة، انظر تطبيق مخصص تجميع البرنامج التعليمي.