শেখার জন্য প্রস্তাবিত সমষ্টিগুলিকে টিউন করা

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 নির্মান একটি সমাংশক ম্যাচিং প্রক্রিয়া যা ডিফারেনশিয়াল গোপনীয়তা জন্য গোলমাল যোগ নেই।

জিরোয়িং

জিরোয়িং বলতে শূন্য দ্বারা অস্বাভাবিকভাবে বড় মান প্রতিস্থাপন করা বোঝায়। এখানে, "অস্বাভাবিকভাবে বড়" বলতে পূর্বনির্ধারিত থ্রেশহোল্ডের চেয়ে বড়, অথবা গণনার পূর্ববর্তী রাউন্ডের মানের তুলনায় বড় হতে পারে। জিরো করা ত্রুটিপূর্ণ ক্লায়েন্টদের ডেটা দুর্নীতিতে সিস্টেমের দৃঢ়তা বাড়াতে পারে।

এল-অনন্ত নিয়ম অধিক মাপের সঙ্গে মূল্যবোধের একটি গড় গনা ZEROING_CONSTANT zeroed-আউট, আমরা একটি মোড়ানো tff.aggregators.MeanFactory একটি সঙ্গে tff.aggregators.zeroing_factory যে সঞ্চালিত zeroing:

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 , থ্রেশহোল্ড zeroing হতে হবে জন্য ব্যবহার করা 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 ডিপি টিউটোরিয়াল

ক্ষতিকারক কম্প্রেশন

লসলেস কম্প্রেশন যেমন gzip-এর তুলনায়, ক্ষতিকর কম্প্রেশন সাধারণত অনেক বেশি কম্প্রেশন রেশিওতে পরিণত হয় এবং তারপরেও লসলেস কম্প্রেশনের সাথে মিলিত হতে পারে। যেহেতু ক্লায়েন্ট-টু-সার্ভার যোগাযোগে কম সময় ব্যয় করতে হবে, প্রশিক্ষণ রাউন্ডগুলি দ্রুত সম্পন্ন হয়। অ্যালগরিদম শেখার সহজাত এলোমেলো প্রকৃতির কারণে, কিছু থ্রেশহোল্ড পর্যন্ত, ক্ষতিকারক কম্প্রেশন থেকে ভুলতা সামগ্রিক কর্মক্ষমতার উপর নেতিবাচক প্রভাব ফেলে না।

ডিফল্ট সুপারিশ সহজ অভিন্ন quantization ব্যবহার করবেন (দেখতে । সুরেশ এট টেন্সর আকার কম্প্রেশন: উদাহরণস্বরূপ), দুটি মানের দ্বারা স্থিতিমাপ 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 , ভাল কাজ, কারণ এলোমেলোভাবে ভ্রম quantization চালু একাধিক ক্লায়েন্ট আপডেট উপর গড়ে দ্বারা evened করা যেতে পারে।

নিরাপদ একত্রীকরণ

সিকিউর অ্যাগ্রিগেশন (SecAgg) দ্বারা আমরা একটি ক্রিপ্টোগ্রাফিক প্রোটোকল উল্লেখ করি যেখানে ক্লায়েন্ট আপডেটগুলি এমনভাবে এনক্রিপ্ট করা হয় যাতে সার্ভার শুধুমাত্র তাদের যোগফল ডিক্রিপ্ট করতে পারে। যদি রিপোর্ট করা ক্লায়েন্টের সংখ্যা অপর্যাপ্ত হয়, তাহলে সার্ভার কিছুই শিখবে না -- এবং কোনও ক্ষেত্রেই সার্ভার পৃথক আপডেটগুলি পরিদর্শন করতে সক্ষম হবে না। এই ব্যবহার নিরূপিত হয় tff.federated_secure_sum_bitwidth অপারেটর।

মডেল আপডেট ফ্লোটিং পয়েন্ট মান, কিন্তু SecAgg পূর্ণসংখ্যার উপর কাজ করে। তাই আমরা একটি পূর্ণসংখ্যা ধরনের discretization আগে কিছু আবদ্ধ কোনো বড় মান ক্লিপ করা প্রয়োজন. ক্লিপিং আবদ্ধ হয় একটি ধ্রুবক বা অভিযোজিতভাবে নির্ধারিত হতে পারে (প্রস্তাবিত ডিফল্ট)। তারপর পূর্ণসংখ্যাগুলি সুরক্ষিতভাবে যোগ করা হয় এবং যোগফলকে ফ্লোটিং পয়েন্ট ডোমেনে ম্যাপ করা হয়।

সঙ্গে 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)

লক্ষ্য করুন এই কাঠামো মিলে যায় ডিফল্ট সংযোগকারীদের আলগোরিদিম শেখার জন্য।

অন্যান্য রচনাগুলিও সম্ভব। আমরা এই নথিটি প্রসারিত করি যখন আমরা আত্মবিশ্বাসী যে আমরা ডিফল্ট কনফিগারেশন প্রদান করতে পারি যা একাধিক ভিন্ন অ্যাপ্লিকেশনে কাজ করে। নতুন ধারণা বাস্তবায়নের জন্য, দেখুন বাস্তবায়নকারী কাস্টম সংযোগকারীদের টিউটোরিয়াল।