মূল কনটেন্টে যান
এআই টিউটোরিয়াল

FlashREINFORCE দিয়ে এজেন্টিক ভাষা মডেল প্রশিক্ষণ

জানুন কীভাবে FlashREINFORCE প্রতি প্রম্পটে একটি রোলআউট, ব্যাচ-কেন্দ্রিক রিওয়ার্ড, টোকেন ইম্পর্ট্যান্স স্যাম্পলিং, একটি Sequence Trust Region এবং স্যাম্পল-মিন অপ্টিমাইজেশন ব্যবহার করে ভাষা-মডেল এজেন্ট প্রশিক্ষণ দেয়। এই টিউটোরিয়ালে ইনস্টলেশন, CPU রেফারেন্স উদাহরণ, অ্যাসিনক্রোনাস আপডেট পাইপলাইন, Molt লঞ্চার প্রস্তুতি এবং ব্যবহারিক স্থিতিশীলতা নির্দেশিকা আলোচনা করা হয়েছে।

FlashREINFORCE দিয়ে এজেন্টিক ভাষা মডেল প্রশিক্ষণ

FlashREINFORCE কী?

FlashREINFORCE হলো এজেন্ট-ভিত্তিক ভাষা মডেলের অ্যাসিনক্রোনাস প্রশিক্ষণের জন্য একটি সমালোচক-মুক্ত রিইনফোর্সমেন্ট-লার্নিং ফ্রেমওয়ার্ক। এটি দীর্ঘ-হরাইজনের কাজের জন্য তৈরি, যেখানে পরিবর্তনশীল দৈর্ঘ্যের রিজনিং, টুল কল বা পরিবেশের সঙ্গে ইন্টারঅ্যাকশনের কারণে ট্রাজেক্টরিগুলো অনিয়মিত সময়ে শেষ হয়।

প্রতিটি প্রম্পটের জন্য একাধিক সমজাতীয় রোলআউট তৈরি করার বদলে, FlashREINFORCE প্রতি প্রম্পটে একটি রোলআউট ব্যবহার করে। ফলে Bটি ট্রাজেক্টরি-সমৃদ্ধ একটি ব্যাচ Bটি ভিন্ন প্রম্পট কভার করতে পারে, এবং একই প্রম্পটের একাধিক উত্তরের জন্য অপেক্ষা না করেই সম্পন্ন ট্রাজেক্টরিগুলো লার্নারের কাছে পৌঁছাতে পারে।

রিপোজিটরিতে একটি স্বতন্ত্র PyTorch রেফারেন্স লস, CPU অপ্টিমাইজার-আপডেটের উদাহরণ, টেস্ট, R1 ও Qwen2.5-Math-এর জন্য Molt লঞ্চার এবং রিজনিং, Python টুল, mixture-of-experts মডেল ও ALFWorld-এর পরীক্ষার সেটিংস রয়েছে। সম্পূর্ণ অ্যাসিনক্রোনাস প্রশিক্ষণ লঞ্চারগুলো Molt ব্যবহার করে।

রিইনফোর্সমেন্ট লার্নিংয়ের REINFORCE করা উচিত।

একটি রোলআউট কেন ব্যবহার করবেন?

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

সিঙ্গেল-রোলআউট লার্নিং সমজাতীয় রোলআউটের প্রয়োজনীয়তা দূর করে, তবে এটি স্থিতিশীলতার তিনটি সমস্যা তৈরি করে:

  • প্রম্পট-স্তরের বেসলাইন তৈরির জন্য কোনো সমজাতীয় গ্রুপ থাকে না।
  • অ্যাসিনক্রোনাসভাবে সংগৃহীত ট্রাজেক্টরিগুলো পুরোনো বিহেভিয়ার পলিসি দিয়ে তৈরি হয়ে থাকতে পারে।
  • প্রতিটি টোকেন সমান ব্যাচ-স্তরের ওজন পেলে দীর্ঘ, ব্যর্থ ট্রাজেক্টরি একটি আপডেটে অতিরিক্ত প্রভাব ফেলতে পারে।

FlashREINFORCE One-Batch REINFORCE, একটি Sequence Trust Region এবং Sample-Mean Optimization ব্যবহার করে এসব সমস্যার সমাধান করে।

মূল উপাদান

1. One-Batch REINFORCE

প্রতিটি নতুন ব্যাচের জন্য লার্নার স্বাধীন প্রম্পটগুলোর মধ্যে স্কেলার রিওয়ার্ডকে কেন্দ্রভূত করে। যদি R_i ট্রাজেক্টরি i-এর রিওয়ার্ড হয়, তাহলে এর অ্যাডভান্টেজ হলো ট্রাজেক্টরির রিওয়ার্ড থেকে ব্যাচের গড় বিয়োগ:

mean_reward = sum(R_j for j in batch) / B
A_i = R_i - mean_reward

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

2. Sequence Trust Region

প্রতিটি ট্রাজেক্টরিকে অবশ্যই সেই বিহেভিয়ার-পলিসির সম্ভাব্যতা সংরক্ষণ করতে হবে, যা বাস্তবে প্রতিটি স্যাম্পল করা টোকেন তৈরি করেছিল। লার্নার বর্তমান-পলিসির সম্ভাব্যতা পুনরায় গণনা করে এবং একটি টোকেন ইম্পর্ট্যান্স রেশিও তৈরি করে:

rho_i_t = exp(current_log_probability_i_t
              - behavior_log_probability_i_t)

এই রেশিও সংরক্ষিত একটি ইতিহাসে স্যাম্পল করা অ্যাকশনের বণ্টন সংশোধন করে। তবে ইতিহাসটি নিজেই যে পুরোনো বিহেভিয়ার পলিসি থেকে এসেছে, সেই বিষয়টি এটি সংশোধন করে না। তাই FlashREINFORCE সম্পূর্ণ ট্রাজেক্টরি জুড়ে সঞ্চিত ড্রিফটও মূল্যায়ন করে।

প্রতিটি স্যাম্পল করা অ্যাকশনের জন্য এটি বিহেভিয়ার সম্ভাব্যতা p এবং বর্তমান সম্ভাব্যতা q থেকে একটি Bernoulli KL প্রক্সি গণনা করে:

d_i_t = p * log(p / q)
        + (1 - p) * log((1 - p) / (1 - q))

টোকেনের মানগুলো ট্রাজেক্টরি জুড়ে গড় করা হয়। কোনো ট্রাজেক্টরি তখনই গ্রহণ করা হয়, যখন এর গড় প্রক্সি কনফিগার করা ট্রাস্ট থ্রেশহোল্ডের চেয়ে বেশি না হয়:

mean_drift_i = sum(d_i_t for t in trajectory_i) / T_i
mask_i = 1 if mean_drift_i <= delta else 0

প্রত্যাখ্যাত ট্রাজেক্টরি কোনো টোকেন লসে অবদান রাখে না। তাই ট্রাস্টের সিদ্ধান্ত বিচ্ছিন্ন টোকেনের পরিবর্তে সম্পূর্ণ সংরক্ষিত ইতিহাসের ওপর প্রযোজ্য হয়।

3. Sample-Mean Optimization

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

FlashREINFORCE প্রথমে প্রতিটি ট্রাজেক্টরির মধ্যে টোকেন অবদানের গড় করে, তারপর ট্রাজেক্টরিগুলোর মধ্যে গড় করে:

trajectory_term_i = (
    mask_i * advantage_i / trajectory_length_i
    * sum(importance_ratio_i_t for each token t)
)
objective = sum(trajectory_term_i for i in batch) / B

ফলে প্রতিটি ট্রাজেক্টরি প্রতিক্রিয়ার দৈর্ঘ্য নির্বিশেষে 1/B ওজন পায়। ব্যবহারিক লসে detached ইম্পর্ট্যান্স রেশিও ব্যবহার করা হয়। বেস পদ্ধতিতে শেখানো সমালোচক, রেশিও ক্লিপিং বা রেফারেন্স-মডেল ফরোয়ার্ড পাস ব্যবহার করা হয় না।

ইনস্টলেশন ও স্থানীয় সেটআপ

FlashREINFORCE রিপোজিটরি ক্লোন বা ডাউনলোড করুন, এর রুট ডিরেক্টরিতে প্রবেশ করুন এবং টেস্ট নির্ভরতা সহ editable mode-এ ইনস্টল করুন:

pip install -e '.[test]'

এরপর অন্তর্ভুক্ত CPU উদাহরণটি চালান:

python examples/toy_update.py

এই উদাহরণটি যাচাই করে যে রেফারেন্স অবজেক্টিভ CPU-তে একটি অপ্টিমাইজার আপডেট তৈরি করতে পারে। এটি একটি কার্যকরী যাচাইকরণ উদাহরণ, পেপারের বেঞ্চমার্ক ফলাফল পুনরুৎপাদনের উদাহরণ নয়।

সবশেষে, টেস্ট স্যুট চালান:

python -m pytest -q

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

রেফারেন্স ইমপ্লিমেন্টেশন দেখুন

কেন্দ্রীয় রেফারেন্স অবজেক্টিভটি flashreinforce/loss.py-তে অবস্থিত। এতে পেপার ও README-তে বর্ণিত অপারেশনগুলো রয়েছে:

  • ব্যাচ জুড়ে রিওয়ার্ড কেন্দ্রভূতকরণ।
  • টোকেন-স্তরের ইম্পর্ট্যান্স স্যাম্পলিং।
  • সিকোয়েন্স-স্তরের ট্রাস্ট অ্যাডমিশন।
  • স্যাম্পল-মিন অপ্টিমাইজেশন।
  • ব্যর্থ টোকেন ফিল্টার করার জন্য ঐচ্ছিক entropy-ভিত্তিক ফিল্টারিং।

রেফারেন্স লস কীভাবে একটি অপ্টিমাইজার আপডেটে অংশ নেয় তা দেখতে examples/toy_update.py দিয়ে শুরু করুন। এরপর flashreinforce/loss.py পরীক্ষা করে উদাহরণের টেনসর ও মাস্কগুলোকে অবজেক্টিভের পৃথক ধাপগুলোর সঙ্গে মিলিয়ে দেখুন।

CPU উদাহরণটি সবচেয়ে নিরাপদ মৌলিক ব্যবহারপথ, কারণ এর জন্য সম্পূর্ণ বিতরণকৃত রোলআউট অবকাঠামো প্রয়োজন হয় না।

একবারের অ্যাসিঙ্ক্রোনাস আপডেট বুঝুন

একটি প্রোডাকশন FlashREINFORCE আপডেট ছয়টি ধাপ অনুসরণ করে:

  1. সংগ্রহ: রোলআউট কর্মীরা স্বাধীনভাবে প্রতিটি প্রম্পটের জন্য একটি করে সম্পূর্ণ ট্রাজেক্টরি জমা দেয়। প্রতিটি ট্রাজেক্টরিতে তার রিওয়ার্ড এবং টোকেন নমুনা করার সময় ব্যবহৃত প্রকৃত বিহেভিয়ার-পলিসি সম্ভাবনা থাকে।
  2. ব্যাচ: লার্নার পরবর্তী Bটি সম্পূর্ণ ট্রাজেক্টরি নেয় এবং সইযুক্ত অ্যাডভান্টেজ পেতে তাদের রিওয়ার্ডকে কেন্দ্রায়িত করে।
  3. সংশোধন: লার্নার বর্তমান পলিসির লগ-সম্ভাবনা পুনরায় গণনা করে এবং টোকেন ইম্পর্ট্যান্স রেশিও তৈরি করে।
  4. বিশ্বাস: এটি প্রতিটি ট্রাজেক্টরির জন্য নমুনাকৃত অ্যাকশনের গড় KL প্রক্সি গণনা করে এবং মানটি কনফিগার করা সীমার মধ্যে থাকলেই সম্পূর্ণ ট্রাজেক্টরিটি গ্রহণ করে।
  5. অপ্টিমাইজ: এটি প্রতিটি গৃহীত ট্রাজেক্টরির মধ্যে গড়, ব্যাচজুড়ে গড় এবং একটি অপ্টিমাইজার ধাপ সম্পন্ন করে।
  6. বর্জন: অতিরিক্ত লার্নার আপডেটের জন্য সংগৃহীত ব্যাচটি পুনরায় চালায় না।

শেষের বর্জন ধাপটি পদ্ধতিটির একটি গুরুত্বপূর্ণ অংশ। FlashREINFORCE সদ্য সংগৃহীত প্রতিটি ব্যাচের জন্য একই বিহেভিয়ার স্ন্যাপশট থেকে একাধিক ধারাবাহিক মিনিব্যাচ আপডেট চালানোর পরিবর্তে একটি পূর্ণ-ব্যাচ আপডেট ব্যবহার করে।

Molt প্রশিক্ষণ কনফিগারেশন প্রিভিউ করুন

রিপোজিটরিতে Molt-এর অ্যাসিঙ্ক্রোনাস ইমপ্লিমেন্টেশনের মাধ্যমে প্রশিক্ষণ চালু করার জন্য scripts/train_molt.py রয়েছে। পূর্ণ প্রশিক্ষণ রান বরাদ্দ করার আগে প্রশিক্ষণের ফ্ল্যাগগুলো প্রিভিউ করতে এর ড্রাই-রান মোড ব্যবহার করুন:

python scripts/train_molt.py --dry-run

GPU সেটআপ, ডেটা প্রস্তুতি, প্রশিক্ষণ কমান্ড, পেপার থেকে কোডে রূপান্তর এবং জানা পুনরুৎপাদন সীমাবদ্ধতার জন্য docs/training.md দেখুন। examples/README.md গাইডে টাস্ক প্রিসেট, অ্যাবলেশন এবং সক্ষমতা যাচাইসহ একটি নেটিভ ট্রেইনার লঞ্চার রয়েছে।

R1 এবং Qwen2.5-Math লঞ্চারগুলো রিপোজিটরিতে নির্দিষ্ট সংস্করণে স্থির করা আছে। টুল-ব্যবহার এবং ALFWorld সেটিংসের জন্য সামঞ্জস্যপূর্ণ এজেন্ট ও এনভায়রনমেন্টও প্রয়োজন, তাই এসব পরীক্ষা চালু করার আগে তাদের রানটাইম প্রয়োজনীয়তা পর্যালোচনা করুন।

প্রতিটি ট্রাজেক্টরিতে যে ডেটা সংরক্ষণ করতে হবে

আপডেটটি জেনারেশনের সময় ধারণ করা তথ্যের ওপর নির্ভর করে। অন্ততপক্ষে, ধারণাগত প্রশিক্ষণপ্রবাহে সম্পূর্ণ টোকেন সিকোয়েন্স, এর স্কেলার রিওয়ার্ড এবং প্রতিটি নমুনাকৃত অ্যাকশনের সঙ্গে সম্পর্কিত বিহেভিয়ার সম্ভাবনা থাকা দরকার। এরপর লার্নার সংরক্ষিত অ্যাকশন ও ইতিহাস মূল্যায়ন করে সংশ্লিষ্ট বর্তমান-পলিসি সম্ভাবনা পায়।

রেকর্ড করা স্যাম্পলিং সম্ভাবনার পরিবর্তে পরে পুনর্গঠিত সম্ভাবনা ব্যবহার করবেন না। পরে করা মডেল মূল্যায়ন ইনফারেন্স ইঞ্জিন স্যাম্পলিংয়ের সময় যে সম্ভাবনা বাস্তবে ব্যবহার করেছিল, সেটি পুনরায় তৈরি করবে এমন নিশ্চয়তা নেই।

উন্নত স্থিতিশীলতা পরামর্শ

স্যাম্পলিং সাপোর্ট সংরক্ষণ করুন

সঠিক ইম্পর্ট্যান্স সংশোধন ধরে নেয় যে টার্গেট পলিসি বিহেভিয়ার পলিসির সাপোর্টের বাইরে কোনো সম্ভাবনা নির্ধারণ করে না। আক্রমণাত্মক top-k বা top-p ট্রাঙ্কেশন এই অনুমান লঙ্ঘন করতে পারে। তাই সাপোর্টের প্রয়োজনীয়তা বিবেচনা করে স্যাম্পলিং সেটিং নির্বাচন করা উচিত।

টোকেন ইম্পর্ট্যান্স স্যাম্পলিংকে পূর্ণ ট্রাজেক্টরি সংশোধন হিসেবে বিবেচনা করবেন না

টোকেন ইম্পর্ট্যান্স রেশিও সংরক্ষিত ইতিহাসের শর্তাধীন নমুনাকৃত অ্যাকশন সংশোধন করে। এগুলো সেই ইতিহাসগুলোর বণ্টন সংশোধন করে না। যেসব ট্রাজেক্টরিতে সঞ্চিত বিহেভিয়ার-টু-লার্নার ড্রিফট অতিরিক্ত বড়, সেগুলো বাছাই করতে Sequence Trust Region ব্যবহার করুন।

আপডেট সতেজ রাখুন

প্রতিটি সংগৃহীত ব্যাচের জন্য একটি অপ্টিমাইজার আপডেট সম্পন্ন করে সেটি বর্জন করুন। একটি পুরোনো ব্যাচে একাধিক লার্নার আপডেট চালানো নথিভুক্ত একবারের পদ্ধতি থেকে বিচ্যুত হয় এবং পলিসি অমিল বাড়াতে পারে।

ট্রাজেক্টরি-স্তরের ওজন সংরক্ষণ করুন

ব্যাচজুড়ে ট্রাজেক্টরিগুলোর গড় নেওয়ার আগে প্রতিটি ট্রাজেক্টরির মধ্যে টোকেন অবদানের গড় নিন। সব বৈধ টোকেনকে একটি ব্যাচ-জুড়ে গড়ে সমতল করলে প্রতিক্রিয়ার দৈর্ঘ্যজনিত গুণক আবার ফিরে আসবে এবং দীর্ঘ ট্রাজেক্টরিগুলোকে অসমানুপাতিক ওজন পাওয়ার সুযোগ দেবে।

ট্রাস্ট মাস্ক সঠিকভাবে ব্যাখ্যা করুন

Sequence Trust Region সম্পূর্ণ ট্রাজেক্টরির জন্য একটি গ্রহণের সিদ্ধান্ত নেয়। কোনো ট্রাজেক্টরি সীমা অতিক্রম করলে সেই আপডেট থেকে তার সব টোকেন লস বাদ দেওয়া হয়।

যাচাই ও পুনরুৎপাদন আলাদা রাখুন

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

প্রতিবেদিত প্রয়োগক্ষেত্র

প্রতিবেদিত পরীক্ষাগুলো গাণিতিক যুক্তি, বহু-টার্ন Python টুল ব্যবহার, mixture-of-experts প্রশিক্ষণ এবং ইন্টার‌্যাক্টিভ ALFWorld সিদ্ধান্ত গ্রহণ অন্তর্ভুক্ত করে। README-তে DeepSeek-R1-Distill-Qwen-1.5B-এর জন্য 6,000 আপডেট পর্যন্ত স্থিতিশীল দীর্ঘ chain-of-thought প্রশিক্ষণ, Qwen2.5-Math-1.5B-এর গাণিতিক যুক্তির ফল, Qwen2.5-7B-Instruct ও Qwen3-30B-A3B-এর Python-টুল পরীক্ষা এবং Qwen2.5-7B-Instruct-এর ALFWorld পরীক্ষার ফলাফল উল্লেখ করা হয়েছে।

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

সহায়ক রিসোর্স

উপসংহার

FlashREINFORCE একক-রোলআউট প্রম্পট কভারেজকে একটি সংক্ষিপ্ত, ক্রিটিক-মুক্ত আপডেটের সঙ্গে একত্র করে। ব্যাচ-কেন্দ্রিক পুরস্কারগুলো সাইনযুক্ত অ্যাডভান্টেজ প্রদান করে, টোকেন ইম্পর্ট্যান্স স্যাম্পলিং পুরোনো অ্যাকশনগুলোর প্রভাব সামলায়, Sequence Trust Region সঞ্চিত ট্র্যাজেক্টরি বিচ্যুতি নিয়ন্ত্রণ করে, এবং স্যাম্পল-মিন অপ্টিমাইজেশন নিশ্চিত করে যে রেসপন্সের দৈর্ঘ্য ট্র্যাজেক্টরির ওজন নির্ধারণ না করে।

এডিটযোগ্য ইনস্টলেশন, CPU আপডেটের উদাহরণ এবং টেস্ট দিয়ে শুরু করুন। এগুলো কাজ করলে --dry-run ব্যবহার করে Molt লঞ্চারটি প্রিভিউ করুন এবং মডেল-নির্দিষ্ট GPU ও ডেটা প্রস্তুতির জন্য প্রশিক্ষণ নির্দেশিকা অনুসরণ করুন। প্রকল্পটি Apache License 2.0-এর অধীনে উপলব্ধ।