কোয়ান্টাইজেশনকে বাস্তব সংখ্যার একটি বড় সেট থেকে একটি ছোট বিযুক্ত সেটের মানগুলিতে মান ম্যাপ করার প্রক্রিয়া হিসাবে সংজ্ঞায়িত করা যেতে পারে। সাধারণত, এটি আউটপুটে স্থির মানগুলিতে ক্রমাগত ইনপুট ম্যাপিং জড়িত। এটি অর্জন করার একটি সাধারণ উপায় হল বৃত্তাকার বা ছাঁটাই করা। রাউন্ডিংয়ের ক্ষেত্রে, আমরা নিকটতম পূর্ণসংখ্যা গণনা করি। উদাহরণস্বরূপ, 1.8 এর মান 2 হয়ে যায়। কিন্তু 1.2 এর মান 1 হয়ে যায়। ছেঁটে ফেলার ক্ষেত্রে, ইনপুটটিকে একটি পূর্ণসংখ্যাতে রূপান্তর করতে আমরা অন্ধভাবে দশমিকের পরে মানগুলি সরিয়ে ফেলি।
আমরা যেভাবেই এগিয়ে যাই না কেন, গভীর নিউরাল নেটওয়ার্কের পরিমাপকরণের পিছনে মূল প্রেরণা হল অনুমানের গতি উন্নত করা কারণ এটা বলার অপেক্ষা রাখে না যে নিউরাল নেটওয়ার্কগুলির অনুমান এবং প্রশিক্ষণ গণনাগতভাবে বেশ ব্যয়বহুল। লার্জ ল্যাঙ্গুয়েজ মডেলের আবির্ভাবের সাথে, এই মডেলগুলিতে প্যারামিটারের সংখ্যা কেবল বাড়ছে যার অর্থ মেমরি পদচিহ্ন কেবল উচ্চতর এবং উচ্চতর হচ্ছে।
যে গতিতে এই নিউরাল নেটওয়ার্কগুলি বিকশিত হচ্ছে, আমাদের ল্যাপটপ বা মোবাইল ফোন এমনকি ঘড়ির মতো ছোট ডিভাইসেও এই নিউরাল নেটওয়ার্কগুলি চালানোর চাহিদা বাড়ছে৷ এর কোনোটাই পরিমাপ ছাড়া সম্ভব নয়।
কোয়ান্টাইজেশনে ডুব দেওয়ার আগে, আসুন আমরা ভুলে যাই না যে প্রশিক্ষিত নিউরাল নেটওয়ার্কগুলি কম্পিউটারের মেমরিতে সংরক্ষিত ভাসমান সংখ্যা।
কম্পিউটারে সংখ্যা সংরক্ষণের জন্য কিছু সুপরিচিত উপস্থাপনা বা বিন্যাস হল float32 বা FP32, float16 বা FP16, int8, bfloat16 যেখানে B মানে Google Brain বা আরও সম্প্রতি, tensor float 32 বা TF32, ম্যাট্রিক্স বা টেনসর পরিচালনার জন্য একটি বিশেষ বিন্যাস অপারেশন এই ফর্ম্যাটগুলির প্রতিটি মেমরির একটি আলাদা অংশ গ্রহণ করে। উদাহরণস্বরূপ, float32 চিহ্নের জন্য 1 বিট, সূচকের জন্য 8 বিট এবং ম্যান্টিসার জন্য 23 বিট বরাদ্দ করে।
একইভাবে, float16 বা FP16 চিহ্নের জন্য 1 বিট বরাদ্দ করে কিন্তু সূচকের জন্য মাত্র 5 বিট এবং ম্যান্টিসার জন্য 10 বিট। অন্যদিকে, BF16 এক্সপোনেন্টের জন্য 8 বিট এবং ম্যান্টিসার জন্য মাত্র 7 বিট বরাদ্দ করে।
উপস্থাপনা যথেষ্ট. আমি যা বলতে চাচ্ছি তা হল, একটি উচ্চ মেমরি বিন্যাস থেকে একটি নিম্ন মেমরি বিন্যাসে রূপান্তরকে কোয়ান্টাইজেশন বলে। গভীর শিক্ষার পরিভাষায় কথা বললে, Float32 কে একক বা সম্পূর্ণ নির্ভুলতা বলা হয় এবং Float16 এবং BFloat16 কে বলা হয় অর্ধ নির্ভুলতা । ডিফল্ট উপায়ে ডিপ লার্নিং মডেলগুলিকে প্রশিক্ষিত এবং সংরক্ষণ করা হয় সম্পূর্ণ নির্ভুলতায়। সর্বাধিক ব্যবহৃত রূপান্তর হল সম্পূর্ণ নির্ভুলতা থেকে একটি int8 বিন্যাসে।
কোয়ান্টাইজেশন ইউনিফর্ম বা অ ইউনিফর্ম হতে পারে। ইউনিফর্ম ক্ষেত্রে, ইনপুট থেকে আউটপুটে ম্যাপিং একটি রৈখিক ফাংশন যার ফলে সমানভাবে ব্যবধানযুক্ত ইনপুটগুলির জন্য সমানভাবে ব্যবধানযুক্ত আউটপুট হয়। নন-ইউনিফর্ম ক্ষেত্রে, ইনপুট থেকে আউটপুটে ম্যাপিং একটি নন-লিনিয়ার ফাংশন তাই আউটপুটগুলি অভিন্ন ইনপুটের জন্য সমানভাবে ব্যবধানে থাকবে না।
ইউনিফর্ম ধরনের মধ্যে ডাইভিং, রৈখিক ম্যাপিং ফাংশন একটি স্কেলিং এবং রাউন্ডিং অপারেশন হতে পারে। এইভাবে অভিন্ন পরিমাপকরণে একটি স্কেলিং ফ্যাক্টর জড়িত, সমীকরণে S।
float16 থেকে int8 তে রূপান্তর করার সময়, লক্ষ্য করুন যে আমরা সর্বদা -127 এবং প্লাস 127-এর মধ্যে মানগুলিতে সীমাবদ্ধ রাখতে পারি এবং নিশ্চিত করতে পারি যে ইনপুটের শূন্য পুরোপুরি আউটপুটের শূন্যের সাথে মানচিত্র করে যা একটি প্রতিসম ম্যাপিংয়ের দিকে নিয়ে যায় এবং তাই এই পরিমাপকে সিমেট্রিক বলা হয় পরিমাপ
অন্যদিকে, যদি শূন্যের উভয় পাশের মান একই না হয় উদাহরণস্বরূপ -128 এবং +127 এর মধ্যে। অতিরিক্তভাবে, যদি আমরা ইনপুটের শূন্যকে আউটপুটে শূন্য ছাড়া অন্য কোনো মানের সাথে ম্যাপিং করি, তাহলে একে বলা হয় অসিম্যাট্রিক কোয়ান্টাইজেশন । যেহেতু আমরা এখন আউটপুটে শূন্য মান স্থানান্তরিত করেছি, তাই আমাদের সমীকরণে শূন্য ফ্যাক্টর, Z , অন্তর্ভুক্ত করে আমাদের সমীকরণে এটি গণনা করতে হবে।
আমরা কীভাবে স্কেল ফ্যাক্টর এবং শূন্য বিন্দু বেছে নিতে পারি তা শিখতে, বাস্তব সংখ্যা অক্ষে উপরের চিত্রের মতো বিতরণ করা ইনপুটের উদাহরণ নেওয়া যাক। স্কেল ফ্যাক্টরটি মূলত ইনপুটের এই সম্পূর্ণ পরিসরটিকে সর্বনিম্ন মান r_min থেকে সর্বোচ্চ মান r_max পর্যন্ত অভিন্ন পার্টিশনে ভাগ করে। তবে আমরা এই ইনপুটটি ক্লিপ করতে বেছে নিতে পারি কিছু সময়ে নেতিবাচক মানগুলির জন্য আলফা এবং ইতিবাচক মানের জন্য বিটা বলুন। আলফা এবং বিটা ছাড়িয়ে যে কোনো মান অর্থপূর্ণ নয় কারণ এটি আলফার মতো একই আউটপুটে মানচিত্র তৈরি করে। এই উদাহরণে, এটি -127 এবং +127। এই ক্লিপিং মানগুলি বেছে নেওয়ার প্রক্রিয়াটি আলফা এবং বিটা এবং তাই ক্লিপিং পরিসীমাকে ক্রমাঙ্কন বলা হয়।
অত্যধিক ক্লিপিং প্রতিরোধ করার জন্য, সবচেয়ে সহজ বিকল্পটি হতে পারে আলফাকে r_min এর সমান এবং বিটাকে r_max এর সমান। এবং আমরা এই r_min এবং r_max মানগুলি ব্যবহার করে আনন্দের সাথে স্কেল ফ্যাক্টর S গণনা করতে পারি। যাইহোক, এটি আউটপুটকে অপ্রতিসম হতে রেন্ডার করতে পারে। উদাহরণস্বরূপ, ইনপুটে r_max 1.5 হতে পারে কিন্তু r_min শুধুমাত্র -1.2 হতে পারে। তাই সিমেট্রিক কোয়ান্টাইজেশনকে সীমাবদ্ধ করার জন্য, আমাদের দুটির সর্বোচ্চ মান হতে আলফা এবং বিটা প্রয়োজন এবং অবশ্যই শূন্য বিন্দুকে 0 সেট করুন।
নিউরাল নেটওয়ার্ক ওজনের পরিমাপ করার সময় সিমেট্রিক কোয়ান্টাইজেশন ঠিক যা ব্যবহার করা হয় কারণ প্রশিক্ষিত ওজনগুলি ইতিমধ্যে অনুমানের সময় প্রাক-গণনা করা হয় এবং অনুমানের সময় পরিবর্তিত হয় না। শূন্য বিন্দু 0 এ সেট করায় অসমমিতিক ক্ষেত্রের তুলনায় গণনাও সহজ।
এখন আসুন আমরা একটি উদাহরণ পর্যালোচনা করি যেখানে ইনপুটগুলি এক দিকে বাঁকানো হয়, ইতিবাচক দিকে বলুন। এটি ReLU বা GeLU এর মতো কিছু সফল অ্যাক্টিভেশন ফাংশনের আউটপুটের সাথে সাদৃশ্যপূর্ণ। তার উপরে, সক্রিয়করণের আউটপুট ইনপুটের সাথে পরিবর্তিত হয়। উদাহরণস্বরূপ, যখন আমরা একটি বিড়ালের দুটি ছবি দেখাই তখন অ্যাক্টিভেশন ফাংশনগুলির আউটপুট বেশ আলাদা। তাই এখন প্রশ্ন হল, "কখন আমরা পরিমাপকরণের জন্য পরিসীমা ক্যালিব্রেট করব?" এটা কি প্রশিক্ষণের সময়? অথবা অনুমানের সময়, এবং যখন আমরা ভবিষ্যদ্বাণীর জন্য ডেটা পাই?
এই প্রশ্নটি বিভিন্ন কোয়ান্টাইজেশন মোডের দিকে নিয়ে যায়, বিশেষ করে পোস্ট ট্রেনিং কোয়ান্টাইজেশনে (PTQ)। PTQ-তে, আমরা অতিরিক্ত প্রশিক্ষণ না নিয়েই একটি প্রাক-প্রশিক্ষিত মডেল দিয়ে শুরু করি। মডেল থেকে প্রয়োজনীয় গুরুত্বপূর্ণ তথ্যের মধ্যে ক্রমাঙ্কন ডেটা জড়িত, যা ক্লিপিং পরিসীমা গণনা করতে ব্যবহৃত হয় এবং পরবর্তীকালে, স্কেল ফ্যাক্টর (S) এবং শূন্য বিন্দু (Z)। সাধারণত, এই ক্রমাঙ্কন ডেটা মডেল ওজন থেকে প্রাপ্ত করা হয়। ক্রমাঙ্কন প্রক্রিয়ার পরে, আমরা মডেলের পরিমাপ করতে এগিয়ে যেতে পারি, যার ফলে কোয়ান্টাইজড মডেল হবে।
কোয়ান্টাইজেশন অ্যাওয়্যার ট্রেনিং বা QAT-তে সংক্ষেপে, আমরা প্রশিক্ষিত মডেলটিকে মানক পদ্ধতি ব্যবহার করে পরিমাপ করি কিন্তু তারপর কোয়ান্টাইজড মডেল পাওয়ার জন্য নতুন প্রশিক্ষণ ডেটা ব্যবহার করে আরও সূক্ষ্ম-টিউনিং বা পুনরায় প্রশিক্ষণ করি। QAT সাধারণত মডেলের পরামিতি সামঞ্জস্য করার জন্য করা হয় যাতে হারানো নির্ভুলতা বা অন্য কোনো মেট্রিক যা আমরা কোয়ান্টাইজেশনের সময় উদ্বিগ্ন থাকি। সুতরাং, QAT প্রশিক্ষণ-পরবর্তী কোয়ান্টাইজেশনের চেয়ে আরও ভাল মডেল সরবরাহ করে।
ফাইন-টিউনিং করার জন্য, মডেলটি আলাদা হতে হবে। কিন্তু কোয়ান্টাইজেশন অপারেশন অ-পার্থক্যযোগ্য। এটি কাটিয়ে উঠতে, আমরা নকল কোয়ান্টাইজার ব্যবহার করি যেমন স্ট্রেইট-থ্রু এস্টিমেটর। ফাইন-টিউনিংয়ের সময়, এই অনুমানকারীরা পরিমাপকরণের ত্রুটিটি অনুমান করে, এবং ত্রুটিগুলিকে প্রশিক্ষণের ত্রুটির সাথে একত্রিত করা হয় যাতে আরও ভাল পারফরম্যান্সের জন্য মডেলটিকে সূক্ষ্ম-টিউন করা যায়। ফাইন-টিউনিংয়ের সময়, ফ্লোটিং পয়েন্টে কোয়ান্টাইজড মডেলে ফরোয়ার্ড এবং পশ্চাদগামী পাসগুলি সঞ্চালিত হয়। যাইহোক, প্রতিটি গ্রেডিয়েন্ট আপডেটের পর পরামিতিগুলি পরিমাপ করা হয়।
গভীর শিক্ষায় মডেল কোয়ান্টাইজেশন ব্যাখ্যা করে নীচের ভিডিওটি দেখুন
এটি কোয়ান্টাইজেশনের মূল বিষয়গুলিকে কভার করে। আমরা কোয়ান্টাইজেশনের প্রয়োজনীয়তা দিয়ে শুরু করেছি এবং বিভিন্ন ধরনের কোয়ান্টাইজেশন যেমন সিমেট্রিক এবং অ্যাসিমেট্রিক। আমরা দ্রুত শিখেছি কিভাবে আমরা কোয়ান্টাইজেশন প্যারামিটারগুলি বেছে নিতে পারি—যেমন, স্কেল ফ্যাক্টর এবং জিরো পয়েন্ট। এবং আমরা পরিমাপকরণের বিভিন্ন মোড দিয়ে শেষ করেছি। কিন্তু কিভাবে এটি সব PyTorch বা TensorFlow বাস্তবায়িত হয়? সেটা আরেকদিনের জন্য। আমি আশা করি এই ভিডিওটি আপনাকে ডিপ লার্নিং-এ কোয়ান্টাইজেশন সম্পর্কে কিছু অন্তর্দৃষ্টি দিয়েছে।
আমি আমার পরের আপনি দেখতে আশা করি. ততক্ষণ পর্যন্ত, যত্ন নিন!