ট্রান্সফরমার (ডিপ লার্নিং আর্কিটেকচার)

ডিপ লার্নিং-এর ক্ষেত্রে, **ট্রান্সফরমার** (transformer) হলো একটি কৃত্রিম নিউরাল নেটওয়ার্ক আর্কিটেকচার যা মাল্টি-হেড অ্যাটেনশন (multi-head attention) মেকানিজমের ওপর ভিত্তি করে তৈরি। এতে টেক্সট বা পাঠ্যকে সংখ্যাসূচক উপস্থাপনায় রূপান্তর করা হয় যাকে টোকেন (tokens) বলা হয় এবং প্রতিটি টোকেনকে একটি ওয়ার্ড এমবেডিং (word embedding) টেবিল থেকে লুকআপের (lookup) মাধ্যমে একটি ভেক্টরে রূপান্তর করা হয়। প্রতিটি লেয়ার বা স্তরে, একটি সমান্তরাল মাল্টি-হেড অ্যাটেনশন মেকানিজমের মাধ্যমে কনটেক্সট উইন্ডো-র (context window) সীমার মধ্যে থাকা অন্যান্য (আনমাস্কড) টোকেনগুলোর সাথে প্রতিটি টোকেনকে প্রাসঙ্গিক (contextualized) করা হয়। এটি গুরুত্বপূর্ণ টোকেনগুলোর সংকেতকে (signal) পরিবর্ধিত করতে এবং কম গুরুত্বপূর্ণ টোকেনগুলোকে সংকুচিত করতে সাহায্য করে।

ট্রান্সফরমারের অন্যতম সুবিধা হলো এতে কোনো রিকারেন্ট ইউনিট (recurrent units) নেই, যার ফলে এটি রিকারেন্ট নিউরাল আর্কিটেকচারের (RNNs) তুলনায়, যেমন: লং শর্ট-টার্ম মেমরি (LSTM), অনেক কম প্রশিক্ষণ সময়ের প্রয়োজন হয়। পরবর্তীতে এর বিভিন্ন উন্নত সংস্করণগুলো বিশাল (ভাষাগত) ডেটাসেট ব্যবহার করে বৃহৎ ভাষা মডেল (LLMs) প্রশিক্ষণের জন্য ব্যাপকভাবে গৃহীত হয়েছে।

ট্রান্সফরমারের আধুনিক সংস্করণটি ২০১৭ সালে গুগল-এর গবেষকদের প্রকাশিত "Attention Is All You Need" নামক গবেষণাপত্রে প্রস্তাব করা হয়েছিল। ট্রান্সফরমারের পূর্বসূরিরা মূলত যান্ত্রিক অনুবাদ (machine translation) ব্যবস্থার উন্নতির লক্ষ্যে পূর্ববর্তী আর্কিটেকচারগুলোর বিকল্প হিসেবে তৈরি করা হয়েছিল, তবে এরপর থেকে এটি আরও অসংখ্য ক্ষেত্রে ব্যবহৃত হয়ে আসছে। বর্তমানে এটি বৃহৎ পরিসরে প্রাকৃতিক ভাষা প্রক্রিয়াকরণ (natural language processing), কম্পিউটার ভিশন (ভিশন ট্রান্সফরমার), রিইনফোর্সমেন্ট লার্নিং, অডিও সিগন্যাল প্রসেসিং, মাল্টিমোডাল লার্নিং, রোবোটিক্স এবং দাবা খেলার ক্ষেত্রেও ব্যবহৃত হচ্ছে। এটি বিভিন্ন প্রাক-প্রশিক্ষিত সিস্টেম (pre-trained systems) তৈরির পথ প্রশস্ত করেছে, যেমন: জেনারেটিভ প্রি-ট্রেইনড ট্রান্সফরমার (GPTs) এবং বার্ট (BERT) (ট্রান্সফরমার থেকে প্রাপ্ত দ্বিমুখী এনকোডার উপস্থাপনা)।
## ইতিহাস
### পূর্বসূরি
অনেক বছর ধরে সিকোয়েন্স মডেলিং (sequence modelling) এবং জেনারেশনের কাজ সাধারণ রিকারেন্ট নিউরাল নেটওয়ার্ক (RNNs) ব্যবহার করে করা হতো। এর একটি বহুল আলোচিত প্রাথমিক উদাহরণ ছিল এলম্যান নেটওয়ার্ক (Elman network) (১৯৯০)। তাত্ত্বিকভাবে, একটি টোকেন থেকে তথ্য সিকোয়েন্সের যেকোনো দূরত্ব পর্যন্ত প্রবাহিত হতে পারে, কিন্তু বাস্তবে ভ্যানিশিং গ্র্যাডিয়েন্ট সমস্যার (vanishing-gradient problem) কারণে একটি দীর্ঘ বাক্যের শেষে মডেলের অবস্থা এমন হয় যে, আগের টোকেনগুলো সম্পর্কে সুনির্দিষ্ট তথ্য উদ্ধার করা কঠিন হয়ে পড়ে।

একটি গুরুত্বপূর্ণ মাইলফলক ছিল এলএসটিএম (LSTM) (১৯৯৫), যা একটি আরএনএন (RNN) আর্কিটেকচার। এটি ভ্যানিশিং গ্র্যাডিয়েন্ট সমস্যা কাটিয়ে ওঠার জন্য বিভিন্ন উদ্ভাবনী পদ্ধতি ব্যবহার করেছিল, যা দীর্ঘ সিকোয়েন্স মডেলিংয়ের দক্ষ শিখন নিশ্চিত করে। এর একটি মূল উদ্ভাবন ছিল অ্যাটেনশন মেকানিজম-এর ব্যবহার, যেখানে এমন কিছু নিউরন ব্যবহার করা হয় যা অন্য নিউরনের আউটপুটকে গুণ করতে পারে—যাকে বলা হয় 'মাল্টিপ্লিকেটিভ ইউনিটস' (multiplicative units)। মাল্টিপ্লিকেটিভ ইউনিট ব্যবহার করা নিউরাল নেটওয়ার্কগুলোকে পরবর্তীতে 'সিগমা-পাই নেটওয়ার্ক' বা 'হায়ার-অর্ডার নেটওয়ার্ক' (higher-order networks) বলা হতো। ২০১৭ সালে ট্রান্সফরমার প্রকাশিত হওয়ার আগ পর্যন্ত এলএসটিএম (LSTM) দীর্ঘ সিকোয়েন্স মডেলিংয়ের জন্য আদর্শ আর্কিটেকচার হিসেবে বিবেচিত হতো। তবে, অন্যান্য আরএনএন-এর মতো এলএসটিএম-ও সিকোয়েন্সিয়াল প্রসেসিং বা ক্রমানুযায়ী প্রক্রিয়াকরণ পদ্ধতি ব্যবহার করত। সুনির্দিষ্টভাবে বলতে গেলে, আরএনএনগুলো শুরু থেকে শেষ পর্যন্ত একটির পর একটি টোকেন নিয়ে কাজ করে; তারা একটি সিকোয়েন্সের সমস্ত টোকেন নিয়ে সমান্তরালভাবে (parallel) কাজ করতে পারে না।
আধুনিক ট্রান্সফরমারগুলো এই সমস্যাটি কাটিয়ে উঠতে সক্ষম হয়েছে, তবে আরএনএন (RNN)-এর বিপরীতে এগুলোর ক্ষেত্রে কম্পিউটেশন সময় কনটেক্সট উইন্ডোর আকারের বর্গানুসারে (quadratic) বৃদ্ধি পায়। লিনিয়ারলি স্কেলিং ফাস্ট ওয়েট (fast weight) কন্ট্রোলার (১৯৯২) ইনপুটের ওপর ভিত্তি করে পরবর্তী প্রক্রিয়াকরণের জন্য একটি ওয়েট ম্যাট্রিক্স (weight matrix) গণনা করতে শেখে। এর দুটি নেটওয়ার্কের মধ্যে একটিতে "ফাস্ট ওয়েটস" (fast weights) বা "ডায়নামিক লিংকস" (dynamic links) (১৯৮১) থাকে। একটি স্লো (slow) নিউরাল নেটওয়ার্ক গ্রেডিয়েন্ট ডিসেন্টের মাধ্যমে এমন কিছু 'কি' (key) এবং 'ভ্যালু' (value) তৈরি করতে শেখে, যা একটি ফাস্ট (fast) নিউরাল নেটওয়ার্কের ওয়েট পরিবর্তন গণনা করতে ব্যবহৃত হয়; আর এই ফাস্ট নেটওয়ার্কটিই মূলত কোয়েরিগুলোর (queries) উত্তর প্রদান করে। পরবর্তীতে এটি আননরমালাইজড লিনিয়ার ট্রান্সফরমারের (unnormalized linear transformer) সমতুল্য হিসেবে প্রমাণিত হয়েছে।

### seq2seq-এর সাথে অ্যাটেনশন

এনকোডার-ডিকোডার সিকোয়েন্স ট্রান্সডাকশনের (sequence transduction) ধারণাটি ২০১০-এর দশকের শুরুর দিকে বিকশিত হয়েছিল; সাধারণত ২০১৪ সালে সমসাময়িক প্রকাশিত দুটি গবেষণাপত্রকে seq2seq-এর উৎস হিসেবে উল্লেখ করা হয়।

যান্ত্রিক অনুবাদের জন্য ব্যবহৃত একটি ৩৮০ মিলিয়ন (380M) প্যারামিটারের মডেলে দুটি লং শর্ট-টার্ম মেমরি (LSTM) ব্যবহার করা হয়। এর আর্কিটেকচার দুটি অংশ নিয়ে গঠিত। 'এনকোডার' হলো একটি এলএসটিএম যা টোকেনের একটি সিকোয়েন্স গ্রহণ করে এবং সেটিকে একটি ভেক্টরে রূপান্তরিত করে। 'ডিকোডার' হলো অন্য একটি এলএসটিএম যা ওই ভেক্টরটিকে পুনরায় টোকেনের একটি সিকোয়েন্সে রূপান্তর করে। একইভাবে, অন্য একটি ১৩০ মিলিয়ন (130M) প্যারামিটারের মডেলে এলএসটিএম-এর পরিবর্তে গেটেড রিকারেন্ট ইউনিট (GRU) ব্যবহার করা হয়েছিল। পরবর্তী গবেষণাগুলোতে দেখা গেছে যে, seq2seq-এর ক্ষেত্রে জিআরইউ (GRU) এলএসটিএম-এর চেয়ে ভালো বা খারাপ কোনোটিই নয়।
এই প্রাথমিক seq2seq মডেলগুলোতে কোনো অ্যাটেনশন মেকানিজম ছিল না এবং উৎস পাঠ্যের (source text) 'শেষ' শব্দটি প্রক্রিয়াজাত করার পরেই কেবল স্টেট ভেক্টরটি (state vector) পাওয়া যেত। তাত্ত্বিকভাবে এই ধরনের ভেক্টর সম্পূর্ণ মূল বাক্যের তথ্য ধরে রাখলেও, বাস্তবে তথ্যগুলো সঠিকভাবে সংরক্ষিত থাকে না। এর কারণ হলো, ইনপুটটি একটি রিকারেন্ট নেটওয়ার্ক দ্বারা ক্রমানুযায়ী প্রক্রিয়াজাত হয়ে একটি 'নির্ধারিত' আকারের আউটপুট ভেক্টরে পরিণত হয়, যা পরে আরেকটি রিকারেন্ট নেটওয়ার্ক দ্বারা আউটপুটে রূপান্তরিত হয়। ইনপুট দীর্ঘ হলে আউটপুট ভেক্টরটি সমস্ত প্রাসঙ্গিক তথ্য ধারণ করতে সক্ষম হয় না, যা আউটপুটের মান কমিয়ে দেয়। এর প্রমাণ হিসেবে দেখা গেছে, ইনপুট বাক্যটিকে উল্টে দিলে (reversing) seq2seq অনুবাদের মান উন্নত হয়।

'RNN search' মডেলটি যান্ত্রিক অনুবাদের জন্য seq2seq-এ একটি অ্যাটেনশন মেকানিজম প্রবর্তন করে যাতে এই 'নির্ধারিত আকারের' আউটপুট ভেক্টরের সীমাবদ্ধতা দূর করা যায়। এটি মডেলটিকে দীর্ঘ দূরত্বের প্রাসঙ্গিকতাগুলো (long-distance dependencies) আরও সহজে প্রক্রিয়াজাত করতে সাহায্য করে। এই নামকরণ করা হয়েছে কারণ এটি "অনুবাদ ডিকোডিংয়ের সময় একটি উৎস বাক্যের মধ্য দিয়ে অনুসন্ধানের (search) অনুকরণ করে"।

যান্ত্রিক অনুবাদের ক্ষেত্রে গ্লোবাল (global - যা 'RNN search'-এর মতো) এবং লোকাল (local - স্লাইডিং উইন্ডো) অ্যাটেনশন মডেল আর্কিটেকচারের আপেক্ষিক কার্যকারিতা তুলনা করে দেখা গেছে যে, মিক্সড (mixed) অ্যাটেনশনের মান গ্লোবাল অ্যাটেনশনের চেয়ে ভালো ছিল, অন্যদিকে লোকাল অ্যাটেনশন অনুবাদের সময় কমিয়ে দেয়।

২০১৬ সালে গুগল অনুবাদ-কে (Google Translate) গুগল নিউরাল মেশিন ট্রান্সলেশন-এ রূপান্তরিত করা হয়, যা পরিসংখ্যানগত যান্ত্রিক অনুবাদ-এর (statistical machine translation) ওপর ভিত্তি করে তৈরি পূর্ববর্তী মডেলটিকে প্রতিস্থাপন করে। নতুন এই মডেলটি ছিল একটি seq2seq মডেল যেখানে এনকোডার এবং ডিকোডার উভয়ই ছিল ৮ স্তরের দ্বিমুখী LSTM। এটি তৈরি করতে নয় মাস সময় লেগেছিল এবং এটি পরিসংখ্যানগত পদ্ধতির চেয়ে অনেক ভালো ফলাফল দেখিয়েছে, যা তৈরি করতে দশ বছর সময় লেগেছিল।

### অ্যাটেনশনের সমান্তরালীকরণ
অ্যাটেনশনযুক্ত (সেলফ-অ্যাটেনশনসহ) seq2seq মডেলগুলো তখনও রিকারেন্ট নেটওয়ার্কের একই সমস্যায় ভুগছিল; আর তা হলো এগুলোকে সমান্তরাল করা (parallelize) কঠিন ছিল, যা জিপিইউ-তে (GPU) এদের গতি বৃদ্ধিতে বাধা দিত। ২০১৬ সালে, 'ডিকম্পোজেবল অ্যাটেনশন' (decomposable attention) পদ্ধতিটি ফিডফরোয়ার্ড নিউরাল নেটওয়ার্ক-এ একটি সেলফ-অ্যাটেনশন মেকানিজম প্রয়োগ করে, যা সমান্তরাল করা সহজ। এটি এলএসটিএম (LSTM)-এর তুলনায় দশ গুণ কম প্যারামিটার ব্যবহার করেও টেক্সচুয়াল এন্টেইলমেন্ট-এ (textual entailment) তৎকালীন সেরা (SOTA) ফলাফল অর্জন করে। এই গবেষণাপত্রের অন্যতম লেখক ইয়াকুব উসকোরিট (Jakob Uszkoreit) সন্দেহ করেছিলেন যে, রিকারেন্স বা পুনরাবৃত্তি 'ছাড়াই' কেবল অ্যাটেনশনই ভাষা অনুবাদের জন্য যথেষ্ট হবে; আর এভাবেই "অ্যাটেনশন ইজ 'অল' ইউ নিড" (attention is 'all' you need) শিরোনামটির উৎপত্তি। এই হাইপোথিসিস বা অনুমানটি সে সময়ের প্রচলিত ধারণার বিরুদ্ধে ছিল, এমনকি তার বাবা বিখ্যাত কম্পিউটেশনাল লিঙ্গুইস্ট হান্স উসকোরিট-ও (Hans Uszkoreit) এ নিয়ে সংশয়ে ছিলেন। একই বছরে, এলএসটিএম-এর জন্য সেলফ-অ্যাটেনশন (যাকে 'ইন্ট্রা-অ্যাটেনশন' বা 'ইন্ট্রা-সেন্টেন্স অ্যাটেনশন' বলা হয়) প্রস্তাব করা হয়েছিল।

২০১৭ সালে, "Attention is all you need" গবেষণাপত্রে মূল (১০০ মিলিয়ন প্যারামিটার আকারের) এনকোডার-ডিকোডার ট্রান্সফরমার মডেলটি প্রস্তাব করা হয়। সে সময় গবেষণার মূল লক্ষ্য ছিল সমস্ত টোকেনকে সমান্তরালভাবে প্রক্রিয়াজাত করার জন্য রিকারেন্স বা পুনরাবৃত্তি বাদ দিয়ে seq2seq যান্ত্রিক অনুবাদ ব্যবস্থার উন্নতি করা, কিন্তু টেক্সট প্রসেসিং পারফরম্যান্স বজায় রাখতে এর ডট-প্রোডাক্ট অ্যাটেনশন মেকানিজমকে সংরক্ষণ করা। এর ফলে একটি মাল্টি-হেড অ্যাটেনশন মডেলের সূচনা হয় যা স্বতন্ত্র 'হেড' ব্যবহার এবং রিকারেন্স না থাকার কারণে সমান্তরাল করা অনেক সহজ ছিল। এর এই সমান্তরালীকরণযোগ্যতা বৃহৎ নিউরাল নেটওয়ার্কগুলোতে এর ব্যাপক ব্যবহারের একটি গুরুত্বপূর্ণ কারণ ছিল।

### এআই বুম যুগ
২০১৭ সালের বসন্তের শুরুতে, এমনকি *"Attention is all you need"* গবেষণাপত্রটি প্রি-প্রিন্ট হিসেবে প্রকাশিত হওয়ার আগেই, এর অন্যতম একজন সহ-লেখক এই আর্কিটেকচারের "ডিকোডার-অনলি" সংস্করণ ব্যবহার করে কাল্পনিক উইকিপিডিয়া নিবন্ধ তৈরি করেছিলেন। ট্রান্সফরমার আর্কিটেকচার এখন এমন অনেক জেনারেটিভ মডেলের সাথে ব্যবহৃত হচ্ছে যা চলমান এআই বিপ্লবে অবদান রাখছে।

ভাষা মডেলিংয়ের ক্ষেত্রে, ELMo (২০১৮) ছিল একটি দ্বিমুখী এলএসটিএম (LSTM), যা প্রাসঙ্গিক ওয়ার্ড এমবেডিং তৈরি করতে পারত এবং এটি ব্যাগ অফ ওয়ার্ডস ও word2vec সংক্রান্ত গবেষণার উন্নতি ঘটায়। এর পর পরই বার্ট (BERT) (২০১৮) আসে, যা একটি এনকোডার-অনলি ট্রান্সফরমার মডেল। ২০১৯ সালের অক্টোবরে গুগল তাদের সার্চ কুয়েরিগুলো প্রসেস করার জন্য বার্ট (BERT) ব্যবহার শুরু করে। ২০২০ সালে গুগল অনুবাদ তাদের পূর্ববর্তী RNN-encoder–RNN-decoder মডেলটিকে একটি transformer-encoder–RNN-decoder মডেল দ্বারা প্রতিস্থাপন করে।

২০১৮ সাল থেকে ওপেনএআই-এর ডিকোডার-অনলি ট্রান্সফরমার ভিত্তিক জিপিটি (GPT) সিরিজ প্রাকৃতিক ভাষা উৎপাদনে (natural language generation) শ্রেষ্ঠত্ব অর্জন করে। ২০২২ সালে জিপিটি-৩ (GPT-3) ভিত্তিক একটি চ্যাটবট চ্যাটজিপিটি (ChatGPT) অপ্রত্যাশিতভাবে জনপ্রিয় হয়ে ওঠে, যা বৃহৎ ভাষা মডেল (LLM) ঘিরে এক বিশাল উদ্দীপনার সৃষ্টি করে।

২০২০ সাল থেকে ট্রান্সফরমারগুলো টেক্সটের বাইরে অন্যান্য ক্ষেত্রেও প্রয়োগ করা হচ্ছে, যার মধ্যে রয়েছে ভিশন ট্রান্সফরমার, স্পিচ রিকগনিশন, রোবোটিক্স, এবং মাল্টিমোডাল লার্নিং। ভিশন ট্রান্সফরমার পরবর্তীতে কনভোলিউশনাল নিউরাল নেটওয়ার্ক-এর (CNN) ক্ষেত্রে নতুন বিবর্তনে উৎসাহ জোগায়। ইমেজ এবং ভিডিও জেনারেটর যেমন: DALL-E, স্টেবল ডিফিউশন ৩ (২০২৪) এবং সোরা (২০২৪) ইনপুট ডেটা বিশ্লেষণের জন্য ট্রান্সফরমার ব্যবহার করে। এটি ডেটাকে "টোকেন"-এ বিভক্ত করে এবং সেলফ-অ্যাটেনশন ব্যবহারের মাধ্যমে প্রতিটি টোকেনের মধ্যকার প্রাসঙ্গিকতা গণনা করে, যা মডেলকে ডেটার মধ্যকার প্রেক্ষাপট এবং সম্পর্ক বুঝতে সাহায্য করে।
## প্রশিক্ষণ
### প্রশিক্ষণ স্থিতিশীল করার পদ্ধতিসমূহ
সাধারণ ট্রান্সফরমার আর্কিটেকচার প্রশিক্ষণের সময় কনভার্জ বা একটি স্থির মানে পৌঁছাতে সমস্যার সম্মুখীন হতো। মূল গবেষণাপত্রে, লেখকগণ লার্নিং রেট ওয়ার্মআপ ব্যবহারের পরামর্শ দিয়েছিলেন। অর্থাৎ, প্রশিক্ষণের প্রথম অংশে লার্নিং রেট ০ থেকে একটি সর্বোচ্চ মান পর্যন্ত লিনিয়ারলি বৃদ্ধি করা হয় (সাধারণত মোট প্রশিক্ষণ ধাপের ২% পর্যন্ত), এবং এরপর তা আবার কমতে থাকে।

২০২০ সালের একটি গবেষণায় দেখা গেছে যে, মাল্টি-হেড অ্যাটেনশন এবং ফিডফরোয়ার্ড লেয়ারের 'পরে' লেয়ার নরমালাইজেশন ব্যবহার না করে তার 'আগে' (pre-LN) ব্যবহার করলে প্রশিক্ষণ আরও স্থিতিশীল হয় এবং লার্নিং রেট ওয়ার্মআপের প্রয়োজন হয় না। একে বলা হয় "প্রাক-এলএন ট্রান্সফরমার" (pre-LN Transformer), যা মূল "পরবর্তী-এলএন ট্রান্সফরমার" (post-LN Transformer)-এর তুলনায় বর্তমানে বেশি ব্যবহৃত হয়।

### প্রাক-প্রশিক্ষণ ও ফাইন-টিউনিং
ট্রান্সফরমারগুলোকে সাধারণত প্রথমে একটি বিশাল সাধারণ ডেটাসেটে সেলফ-সুপারভাইজড লার্নিং-এর মাধ্যমে প্রাক-প্রশিক্ষিত করা হয়। এরপর একটি নির্দিষ্ট ছোট ডেটাসেটে সুপারভাইজড লার্নিং-এর মাধ্যমে এর ফাইন-টিউনিং করা হয়। প্রাক-প্রশিক্ষণের জন্য সাধারণত লেবেলহীন বিশাল ডেটা সংগ্রহ বা কর্পাস ব্যবহার করা হয়, যেমন দ্য পাইল (The Pile)। প্রাক-প্রশিক্ষণ এবং ফাইন-টিউনিংয়ের সাধারণ কাজগুলোর মধ্যে রয়েছে:

* ভাষা মডেলিং
* পরবর্তী বাক্য অনুমান
* প্রশ্নোত্তর 
* পঠন বোধগম্যতা
* সেন্টিমেন্ট অ্যানালিসিস
* প্যারাফ্রেজিং (paraphrasing)

টি-ফাইভ (T5) ট্রান্সফরমার রিপোর্টে অনেকগুলো প্রাকৃতিক ভাষা প্রাক-প্রশিক্ষণ কাজের বিবরণ দেওয়া হয়েছে। কিছু উদাহরণ হলো:

* অসম্পূর্ণ বা বিকৃত টেক্সট পুনরুদ্ধার করা। যেমন, ইনপুট যদি হয়: *"Thank you~~me to your party~~week",* তবে এটি আউটপুট তৈরি করতে পারে: *"Thank you *'for inviting** me to your party **last** week".''
* বিভিন্ন প্রাকৃতিক ভাষার মধ্যে অনুবাদ করা ([[যান্ত্রিক অনুবাদ]])।
* প্রাকৃতিক ভাষার ব্যাকরণগত ও ব্যবহারিক গ্রহণযোগ্যতা বিচার করা। উদাহরণস্বরূপ, নিচের বাক্যটিকে "গ্রহণযোগ্য নয়" বলে বিচার করা হতে পারে, কারণ এর গঠন সঠিক হলেও মানুষের সাধারণ ব্যবহারে এটি অসম্ভব: ''The course is jumping well.'' (কোর্সটি ভালো লাফ দিচ্ছে)।

উল্লেখ্য যে, এই কাজগুলো ভাষার দক্ষ ব্যবহারকারীদের কাছে খুব সহজ মনে হলেও, মেশিন লার্নিং আর্কিটেকচারের আগের প্রজন্মগুলোর জন্য এগুলো অত্যন্ত চ্যালেঞ্জিং ছিল।

=== কাজসমূহ ===
সাধারণত ল্যাঙ্গুয়েজ মডেলিংয়ের কাজগুলোকে ৩টি শ্রেণিতে ভাগ করা হয়: "মাস্কড" (masked), "অটোরেগ্রেসিভ" (autoregressive), এবং "প্রিফিক্স-এলএম" (prefixLM)। এই শ্রেণিগুলো ট্রান্সফরমারের মতো নির্দিষ্ট কোনো মডেলিং আর্কিটেকচারের ওপর নির্ভরশীল নয়, তবে ট্রান্সফরমারের প্রেক্ষাপটে এগুলো প্রায়ই আলোচিত হয়।

একটি **মাস্কড (masked)** কাজে, এক বা একাধিক টোকেনকে মাস্ক (আড়াল) করে দেওয়া হয় এবং মডেলটি প্রাসঙ্গিক প্রেক্ষাপটের ওপর ভিত্তি করে ওই মাস্কড টোকেনগুলো কী হতে পারে তার একটি সম্ভাব্য বিন্যাস (probability distribution) তৈরি করে। এই কাজের জন্য [[লস ফাংশন]] (loss function) সাধারণত মাস্কড টোকেনগুলোর [[পারপ্লেক্সিটি|লগ-পারপ্লেক্সিটির]] সমষ্টি হয়ে থাকে:
<math display="block">\text{Loss} = -\sum_{t\in\text{masked tokens}}\ln(\text{context-এর ওপর ভিত্তি করে }t\text{-এর সম্ভাবনা}) </math>
মডেলটিকে এই লস ফাংশন সর্বনিম্ন করার জন্য প্রশিক্ষণ দেওয়া হয়। [[BERT (ভাষা মডেল)|বার্ট (BERT) সিরিজের মডেলগুলো]] মাস্কড টোকেন প্রেডিকশন এবং অন্য একটি কাজের জন্য প্রশিক্ষিত।

একটি অটোরেগ্রেসিভ কাজে, প্রথমে পুরো সিকোয়েন্সটিকে মাস্ক করা হয় এবং মডেলটি প্রথম টোকেনের জন্য একটি সম্ভাব্য বিন্যাস তৈরি করে। এরপর প্রথম টোকেনটি উন্মোচন করা হয় এবং মডেলটি দ্বিতীয় টোকেনটি অনুমান করে, এভাবে প্রক্রিয়াটি চলতে থাকে। এই কাজের লস ফাংশনও সাধারণত একই থাকে। [[জেনারেটিভ প্রি-ট্রেইনড ট্রান্সফরমার|জিপিটি (GPT) সিরিজের মডেলগুলো]] অটোরেগ্রেসিভ কাজের মাধ্যমে প্রশিক্ষিত।

একটি প্রিফিক্স-এলএম কাজে, সিকোয়েন্সটিকে দুটি অংশে ভাগ করা হয়। প্রথম অংশটি প্রেক্ষাপট (context) হিসেবে উপস্থাপন করা হয় এবং মডেলটি দ্বিতীয় অংশের প্রথম টোকেনটি অনুমান করে। এরপর সেটি উন্মোচন করা হয় এবং মডেল দ্বিতীয় টোকেনটি অনুমান করে। এভাবে শেষ পর্যন্ত চলতে থাকে। এই কাজের লস ফাংশনও সাধারণত একই থাকে। [[T5 (ভাষা মডেল)|টি-ফাইভ (T5) সিরিজের মডেলগুলো]] প্রিফিক্স-এলএম কাজের মাধ্যমে প্রশিক্ষিত।

দ্রষ্টব্য যে, "মাস্কড ল্যাঙ্গুয়েজ মডেলিং"-এর "মাস্কড" এবং "[[#মাস্কড অ্যাটেনশন|মাস্কড অ্যাটেনশন]]"-এর "মাস্কড" এক বিষয় নয়। একইভাবে, "প্রিফিক্স ল্যাঙ্গুয়েজ মডেলিং"-এর "প্রিফিক্স-এলএম" এবং "[[#প্রিফিক্স-এলএম|প্রিফিক্স ল্যাঙ্গুয়েজ মডেল]]" ভিন্ন অর্থ বহন করে।

== স্থাপত্য (Architecture) ==
সব ধরনের ট্রান্সফরমারে কিছু প্রাথমিক উপাদান থাকে:
* টোকেনাইজার (Tokenizers), যা পাঠ্য বা টেক্সটকে টোকেনে রূপান্তর করে।
* এমবেডিং লেয়ার (Embedding layer), যা টোকেন এবং টোকেনের অবস্থানগুলোকে ভেক্টর উপস্থাপনায় (vector representations) রূপান্তর করে।
* ট্রান্সফরমার লেয়ার (Transformer layers), যা ভেক্টর উপস্থাপনাগুলোর ওপর বারবার রূপান্তর প্রক্রিয়া চালায় এবং অধিকতর ভাষাগত তথ্য নিষ্কাশন করে। এগুলো পর্যায়ক্রমিক অ্যাটেনশন এবং ফিডফরোয়ার্ড লেয়ার নিয়ে গঠিত। ট্রান্সফরমার লেয়ার প্রধানত দুই ধরনের: এনকোডার লেয়ার এবং ডিকোডার লেয়ার (এর আরও কিছু রূপভেদ রয়েছে)।
* আন-এমবেডিং লেয়ার (Un-embedding layer), যা চূড়ান্ত ভেক্টর উপস্থাপনাগুলোকে পুনরায় টোকেনগুলোর একটি সম্ভাব্য বিন্যাসে (probability distribution) রূপান্তর করে।

নিচের বর্ণনাটি মূল গবেষণাপত্রে বর্ণিত ট্রান্সফরমারকে অনুসরণ করে তৈরি করা হয়েছে। এর বিভিন্ন রূপভেদ পরবর্তী [[#পরবর্তী কাজ|পরবর্তী কাজ]] বিভাগে বর্ণনা করা হয়েছে।

কনভেনশন বা নিয়ম অনুযায়ী, আমরা সমস্ত ভেক্টরকে রো-ভেক্টর (row vectors) হিসেবে লিখি। উদাহরণস্বরূপ, একটি ভেক্টরকে একটি লিনিয়ার লেয়ারের মধ্য দিয়ে পাঠানো মানে হলো সেটিকে ডান দিক থেকে একটি ওয়েট ম্যাট্রিক্স (weight matrix) দ্বারা গুণ করা, যেমন: <math>xW</math>।

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



প্রথমত, ইনপুট টেক্সটটি একটি 'প্রি-প্রসেসর' (preprocessor) দ্বারা প্রক্রিয়াজাত করা হয়, যা টেক্সটকে রূপান্তর করার পাশাপাশি টেক্সটটিকে 'প্রি-টোকেন' (pretokens) নামক কিছু স্থূল খণ্ডে বিভক্ত করে। এই প্রক্রিয়াকে বলা হয় 'প্রি-টোকেনাইজেশন'। দ্বিতীয়ত, প্রতিটি প্রি-টোকেনকে একটি 'টোকেনাইজার' দ্বারা আরও ক্ষুদ্রতর 'টোকেন'-এ বিভক্ত করা হয়। এই টোকেনাইজারটি কেবল তার প্রি-প্রসেসর থেকে প্রাপ্ত প্রি-টোকেনগুলো নিয়ে কাজ করে। এর তৈরি করা প্রতিটি টোকেন হলো এক বা একাধিক অক্ষরের একটি স্ট্রিং, যা একটি সসীম স্ট্রিং সেট বা 'ভোকাবুলারি' (vocabulary) <math>V</math>-এর অন্তর্ভুক্ত। তৃতীয়ত, যেহেতু ভোকাবুলারি সসীম এবং আগে থেকেই জানা থাকে, তাই প্রতিটি টোকেনকে একটি পূর্ণসংখ্যা আইডি (integer identifier) প্রদান করা হয়। এই ম্যাপিংটি টোকেনের সিকোয়েন্সের ওপর প্রয়োগ করা হয় যাতে যেকোনো ইনপুট টেক্সটকে একটি সংখ্যাসূচক সিকোয়েন্স হিসেবে উপস্থাপন করা যায়। যেহেতু এই ম্যাপিংটি বাইজেক্টিভ (bijective), আউটপুট সাইড থেকে প্রাপ্ত পূর্ণসংখ্যা আইডির সিকোয়েন্সকে পুনরায় টোকেনে রূপান্তর করা সম্ভব। প্রি-প্রসেসিংয়ের ধাপগুলো উল্টোভাবে প্রয়োগ করলে পুনরায় পাঠযোগ্য টেক্সট পাওয়া যায়।

একটি টোকেনাইজারকে প্রশিক্ষণ দেওয়া (যাকে কখনও কখনও 'ভোকাবুলারাইজেশন' বলা হয়) মানে হলো একটি উপযুক্ত ভোকাবুলারি <math>V</math> খুঁজে বের করা এবং সেটি ব্যবহারের নিয়ম শেখা। কারণ <math>|s|</math> দৈর্ঘ্যের যেকোনো স্ট্রিং <math>s</math>-এর <math>2^{|s|-1}</math> টি সম্ভাব্য বিভাজন থাকতে পারে, যার মধ্যে কিছু অংশ ভোকাবুলারিতে নাও থাকতে পারে। ভোকাবুলারাইজেশনের সময় সবচেয়ে গুরুত্বপূর্ণ হাইপার-প্যারামিটার হলো 'ভোকাবুলারি সাইজ' <math>|V|</math>: যখন এটি ছোট হয়, তখন ভোকাবুলারি সাধারণত অক্ষর এবং ছোট ছোট স্ট্রিং নিয়ে গঠিত হয় এবং শব্দগুলো অনেকগুলো টোকেনে বিভক্ত হয়। ভোকাবুলারি বড় হলে পূর্ণ শব্দগুলোকে টোকেন হিসেবে রাখা সম্ভব হয়।

যেহেতু টোকেনগুলো সব সময় পূর্ণ শব্দ হয় না, তাই এদেরকে কখনও কখনও 'সাব-ওয়ার্ড' (subwords) বলা হয় এবং টোকেনাইজেশন অ্যালগরিদমগুলোকে 'সাব-ওয়ার্ড টোকেনাইজার' বলা হয়। এটি মূলত পুরোনো ইনফরমেশন রিট্রিভাল এবং ন্যাচারাল ল্যাঙ্গুয়েজ প্রসেসিং সিস্টেমের [[শব্দতত্ত্ব|ঐতিহ্যগত পরিভাষা]] থেকে বর্তমান পদ্ধতিকে আলাদা করার জন্য ব্যবহৃত হয়। পুরোনো সিস্টেমে "টোকেনাইজেশন" বলতে যা বোঝাতো, তাকে আজ "প্রি-টোকেনাইজেশন" (সহজ কথায়: শব্দে ভাগ করা) বলা হয়। যেসব টোকেনাইজারে এমন টোকেন তৈরি হয় যা ভোকাবুলারির অংশ নয়, সেখানে একটি বিশেষ টোকেন ব্যবহৃত হয় যা ভোকাবুলারির অন্তর্ভুক্ত, একে জেনেরিক স্ট্যান্ড-ইন হিসেবে লেখা হয় "[UNK]" (unknown বা অজানা)। নীতিগতভাবে, যেকোনো স্ট্রিং এমন একটি [UNK] দ্বারা লুকানো থাকতে পারে।
সাধারণত ব্যবহৃত সাবওয়ার্ড টোকেনাইজেশন অ্যালগরিদমগুলো হলো [[বাইট পেয়ার এনকোডিং]] (বিপিই) এবং ইউনিগ্রাম ল্যাঙ্গুয়েজ মডেল (ইউএলএম), যার প্রতিটিতে একটি ভোকাবুলারাইজেশন (vocabularization) অ্যালগরিদম এবং একটি ডেডিকেটেড সেগমেন্টেশন অ্যালগরিদম অন্তর্ভুক্ত থাকে। এছাড়াও এমন কিছু সেগমেন্টেশন অ্যালগরিদম রয়েছে যেগুলোর জন্য কোনো লার্নিং বা প্রশিক্ষণের প্রয়োজন হয় না এবং একটি ভোকাবুলারি (যেমন বিপিই বা ইউএলএম দ্বারা তৈরি) থাকলে সেগুলো প্রয়োগ করা যায়; যেমন বাম-থেকে-ডানে সরানোর মাধ্যমে একটি প্রি-টোকেনের মধ্যে থাকা টোকেনগুলোকে লোভীভাবে (greedily) চেনা। সাবওয়ার্ড টোকেনাইজারের সুপরিচিত সফটওয়্যার ইমপ্লিমেন্টেশনগুলো হলো [[হাগিং ফেস]] (Hugging Face)-এর <code>tokenizers</code> পাইথন প্যাকেজ যা রাস্ট (Rust)-এ ইমপ্লিমেন্ট করা হয়েছে এবং <code>sentencepiece</code> পাইথন প্যাকেজ যা সি++ (C++)-এ ইমপ্লিমেন্ট করা হয়েছে। শেষোক্ত প্যাকেজটির নামকরণ এমন করা হয়েছে কারণ এর একটি কনফিগারেশন অপশন বিল্ট-ইন প্রি-টোকেনাইজারকে নিষ্ক্রিয় করতে দেয়, ফলে কার্যকরভাবে পুরো বাক্যগুলোকে একটি প্রি-টোকেন হিসেবে বিবেচনা করা হয় এবং টোকেনাইজারটি আলাদা শব্দের পরিবর্তে পুরো বাক্য দেখতে পায়।

=== এমবেডিং (Embedding) ===

প্রতিটি পূর্ণসংখ্যা টোকেন আইডেন্টিফায়ারকে একটি [[লুকআপ টেবিল]]-এর মাধ্যমে এমবেডিং ভেক্টরে রূপান্তরিত করা হয়। সহজভাবে বললে, এটি টোকেন আইডেন্টিফায়ারের একটি [[ওয়ান-হট]] (one-hot) রিপ্রেজেন্টেশনকে একটি এমবেডিং ম্যাট্রিক্স $M$ দ্বারা গুণ করে। উদাহরণস্বরূপ, যদি ইনপুট টোকেনের আইডেন্টিফায়ার $3$ হয়, তবে ওয়ান-হট রিপ্রেজেন্টেশনটি হবে $[0, 0, 0, 1, 0, 0, \dots]$, এবং এর এমবেডিং ভেক্টরটি হবে:
$$\mathrm{Embed}(3) = [0, 0, 0, 1, 0, 0, \dots]M$$
টোকেন এমবেডিং ভেক্টরগুলো তাদের নিজ নিজ পজিশনাল এনকোডিং ভেক্টরের (নিচে দেখুন) সাথে যোগ করা হয়, যা ইনপুট ভেক্টরের ক্রম তৈরি করে।

একটি এমবেডিং ভেক্টরের মাত্রাকে ''হিডেন সাইজ'' (hidden size) বা ''এমবেডিং সাইজ'' বলা হয় এবং একে $d_{\text{emb}}$ হিসেবে লেখা হয়। মূল ট্রান্সফরমার পেপারে এই সাইজটিকে $d_{\text{model}}$ হিসেবে লেখা হয়েছে।



=== আন-এমবেডিং (Un-embedding) ===
একটি আন-এমবেডিং লেয়ার প্রায় এমবেডিং লেয়ারের বিপরীত। যেখানে একটি এমবেডিং লেয়ার টোকেন আইডেন্টিফায়ারকে ভেক্টরে রূপান্তরিত করে, সেখানে একটি আন-এমবেডিং লেয়ার একটি ভেক্টরকে টোকেনগুলোর ওপর একটি সম্ভাব্যতা বিন্যাসে (probability distribution) রূপান্তরিত করে।



আন-এমবেডিং লেয়ারটি হলো একটি লিনিয়ার-[[সফটম্যাক্স ফাংশন|সফটম্যাক্স]] (Softmax) লেয়ার:
$$\mathrm{UnEmbed}(x) = \mathrm{softmax}(xW + b)$$
ম্যাট্রিক্সটির আকার (shape) হলো $(d_{\text{emb}}, |V|)$। কিছু আর্কিটেকচার এমবেডিং ম্যাট্রিক্স $M$-এর ট্রান্সপোজকে (transpose) আন-এমবেডিং ম্যাট্রিক্স $W$ হিসেবে ব্যবহার করে। এর ফলে এমবেডিং-সংক্রান্ত প্যারামিটারের পরিমাণ দ্বিগুণ করার প্রয়োজন হয় না এবং প্রশিক্ষণের সময় বিচ্যুতি (divergence) এড়ানো যায়। এই পদ্ধতিটিকে ''ওয়েট টাইং'' (weight tying) বলা হয়।

=== পজিশনাল এনকোডিং ===


**পজিশনাল এনকোডিং** (Positional encoding) হলো একটি সিকোয়েন্সের মধ্যে টোকেনগুলোর আপেক্ষিক অবস্থানের একটি নির্দিষ্ট আকারের ভেক্টর রিপ্রেজেন্টেশন: এটি ট্রান্সফরমার মডেলকে ইনপুট সিকোয়েন্সে শব্দগুলো 'কোথায়' অবস্থিত সেই সম্পর্কে তথ্য প্রদান করে। এটি ইনপুট সিকোয়েন্সের ক্রমের প্রতি একটি [[ইনডাক্টিভ বায়াস]] (inductive bias) তৈরি করে, যাতে উদাহরণস্বরূপ, "মানুষ কামড়ালো কুকুরকে" (man bites dog) ইনপুট সিকোয়েন্সটি "কুকুর কামড়ালো মানুষকে" (dog bites man) থেকে ভিন্নভাবে প্রসেস করা হয়।



পজিশনাল এনকোডিংকে <math>f: \mathbb{R} \to \mathbb{R}^d</math> টাইপের একটি ফাংশন হিসেবে সংজ্ঞায়িত করা হয়, যেখানে <math>d</math> একটি ধনাত্মক জোড় [[পূর্ণসংখ্যা]]। মূল পেপারে সংজ্ঞায়িত সম্পূর্ণ পজিশনাল এনকোডিংটি হলো:
<math display="block">(f(t)_{2k}, f(t)_{2k+1}) = (\sin(\theta), \cos(\theta)) \quad \forall k \in \{0, 1, \dots, d/2 - 1\}</math>
যেখানে <math>\theta = \frac{t}{r^k}</math> এবং <math>r = N^{2/d}</math>।

এখানে, <math>N</math> একটি মুক্ত প্যারামিটার (free parameter) যা পজিশনাল এনকোডিং ফাংশনে ইনপুট হিসেবে দেওয়া বৃহত্তম <math>k</math>-এর চেয়ে উল্লেখযোগ্যভাবে বড় হওয়া উচিত। মূল পেপারে <math>N=10000</math> ব্যবহার করা হয়েছে।


ফাংশনটিকে যখন <math>f: \mathbb{R} \to \mathbb{C}^{d/2}</math> টাইপের একটি জটিল ফাংশন (complex function) হিসেবে লেখা হয়, তখন এটি আরও সহজ রূপ লাভ করে:
<math display="block">f(t) = \left(e^{it/r^k}\right)_{k=0, 1, \dots, \frac d 2 - 1}</math>
যেখানে <math>r = N^{2/d}</math>।

এই পজিশনাল এনকোডিং ফাংশনটি ব্যবহার করার প্রধান কারণ হলো, এটি ব্যবহার করলে শিফটগুলো (shifts) লিনিয়ার ট্রান্সফরমেশন বা রৈখিক রূপান্তর হিসেবে কাজ করে:
<math display="block">f(t + \Delta t) = \mathrm{diag}(f(\Delta t)) f(t)</math>
যেখানে <math>\Delta t \in \mathbb{R}</math> হলো সেই দূরত্ব যা কেউ শিফট করতে চায়। এটি ট্রান্সফরমারকে যেকোনো এনকোড করা অবস্থান নিতে এবং ম্যাট্রিক্স গুণের মাধ্যমে <math>n</math>-ধাপ-আগে বা <math>n</math>-ধাপ-পিছনের অবস্থানের এনকোডিং খুঁজে পেতে সহায়তা করে।

একটি লিনিয়ার সাম (linear sum) গ্রহণের মাধ্যমে, যেকোনো কনভোলিউশনকেও (convolution) লিনিয়ার ট্রান্সফরমেশন হিসেবে ইমপ্লিমেন্ট করা যেতে পারে:
<math display="block">\sum_j c_j f(t + \Delta t_j) = \left(\sum_j c_j \,\mathrm{diag}(f(\Delta t_j))\right) f(t)</math>
যেকোনো ধ্রুবক <math>c_j</math>-এর জন্য এটি সত্য। এটি ট্রান্সফরমারকে যেকোনো এনকোড করা অবস্থান নিতে এবং তার পার্শ্ববর্তী অবস্থানগুলোর এনকোড করা অবস্থানের একটি লিনিয়ার সাম খুঁজে পেতে সাহায্য করে। এনকোড করা অবস্থানগুলোর এই যোগফল যখন অ্যাটেনশন মেকানিজমে দেওয়া হয়, তখন এটি তার পার্শ্ববর্তী অবস্থানগুলোর ওপর অ্যাটেনশন ওয়েট (attention weights) তৈরি করে, অনেকটা [[কনভোলিউশনাল নিউরাল নেটওয়ার্ক]] [[ল্যাঙ্গুয়েজ মডেল]]-এ যা ঘটে তার মতো। লেখকের ভাষায়, "আমরা অনুমান করেছিলাম যে এটি মডেলটিকে আপেক্ষিক অবস্থানের মাধ্যমে সহজেই অ্যাটেন্ড (attend) করতে শিখতে সাহায্য করবে।"

সাধারণ ইমপ্লিমেন্টেশনগুলোতে সমস্ত অপারেশন বাস্তব সংখ্যার (real numbers) ওপর করা হয়, জটিল সংখ্যার (complex numbers) ওপর নয়। তবে যেহেতু [[জটিল সংখ্যার ম্যাট্রিক্স রিপ্রেজেন্টেশন|জটিল সংখ্যার গুণনকে বাস্তব ২-বাই-২ ম্যাট্রিক্স গুণন হিসেবে ইমপ্লিমেন্ট করা যায়]], তাই এটি কেবল গাণিতিক উপস্থাপনার একটি পার্থক্য মাত্র।

=== এনকোডার–ডিকোডার (সারসংক্ষেপ) ===



পূর্ববর্তী [[seq2seq]] মডেলগুলোর মতো, মূল ট্রান্সফরমার মডেলটিও একটি **এনকোডার-ডিকোডার** (encoder–decoder) আর্কিটেকচার ব্যবহার করেছিল। এনকোডারটি এমন কিছু এনকোডিং লেয়ারের সমন্বয়ে গঠিত যা সমস্ত ইনপুট টোকেনকে একের পর এক লেয়ারের মাধ্যমে একসাথে প্রসেস করে। অন্যদিকে, ডিকোডারটি কিছু ডিকোডিং লেয়ারের সমন্বয়ে গঠিত যা এনকোডারের আউটপুট এবং ডিকোডারের এখন পর্যন্ত তৈরি হওয়া আউটপুট টোকেনগুলোকে পর্যায়ক্রমে (iteratively) প্রসেস করে।



প্রতিটি এনকোডার লেয়ারের উদ্দেশ্য হলো টোকেনগুলোর কনটেক্সচুয়ালাইজড (contextualized) রিপ্রেজেন্টেশন তৈরি করা, যেখানে প্রতিটি রিপ্রেজেন্টেশন এমন একটি টোকেনের প্রতিনিধিত্ব করে যা সেলফ-অ্যাটেনশন মেকানিজমের মাধ্যমে অন্যান্য ইনপুট টোকেন থেকে তথ্য "মিশ্রিত" করে। প্রতিটি ডিকোডার লেয়ারে দুটি অ্যাটেনশন সাব-লেয়ার থাকে: (১) এনকোডারের আউটপুট (কনটেক্সচুয়ালাইজড ইনপুট টোকেন রিপ্রেজেন্টেশন) অন্তর্ভুক্ত করার জন্য ক্রস-অ্যাটেনশন (cross-attention), এবং (২) ডিকোডারের ইনপুট টোকেনগুলোর (অর্থাৎ ইনফারেন্সের সময় এ পর্যন্ত উৎপন্ন টোকেনগুলো) মধ্যে তথ্য "মিশ্রিত" করার জন্য সেলফ-অ্যাটেনশন।

এনকোডার এবং ডিকোডার উভয় লেয়ারেই আউটপুটগুলোকে আরও প্রসেস করার জন্য একটি [[ফিডফরওয়ার্ড নিউরাল নেটওয়ার্ক]] (feed-forward neural network) থাকে এবং এতে রেসিডুয়াল কানেকশন (residual connections) ও লেয়ার নরমালাইজেশন ধাপ অন্তর্ভুক্ত থাকে। একটি ট্রান্সফরমার মডেলের অধিকাংশ প্যারামিটার এই ফিড-ফরওয়ার্ড লেয়ারগুলোতে থাকে।

=== ফিডফরওয়ার্ড নেটওয়ার্ক ===



একটি ট্রান্সফরমারের ফিডফরওয়ার্ড নেটওয়ার্ক (FFN) মডিউলগুলো হলো ২-স্তর বিশিষ্ট [[ফিডফরওয়ার্ড নিউরাল নেটওয়ার্ক|মাল্টিলেয়ার পারসেপট্রন]]:
$$\mathrm{FFN}(x) = \phi(xW^{(1)} + b^{(1)})W^{(2)} + b^{(2)}$$
যেখানে $W^{(1)}$ এবং $W^{(2)}$ হলো ওয়েট ম্যাট্রিক্স এবং $b^{(1)}$ ও $b^{(2)}$ হলো বায়াস ভেক্টর, এবং $\phi$ হলো এর অ্যাক্টিভেশন ফাংশন। মূল ট্রান্সফরমার মডেলে [[রেকটিফায়ার (নিউরাল নেটওয়ার্ক)|ReLU]] অ্যাক্টিভেশন ব্যবহার করা হয়েছিল।

মধ্যবর্তী স্তরে নিউরনের সংখ্যাকে ''ইন্টারমিডিয়েট সাইজ'' (intermediate size - GPT), ''ফিল্টার সাইজ'' (filter size - BERT), অথবা ''ফিডফরওয়ার্ড সাইজ'' (feedforward size - BERT) বলা হয়। এটি সাধারণত এমবেডিং সাইজের চেয়ে বড় হয়। উদাহরণস্বরূপ, GPT-2 সিরিজ এবং BERT সিরিজ উভয় ক্ষেত্রেই একটি মডেলের ইন্টারমিডিয়েট সাইজ তার এমবেডিং সাইজের ৪ গুণ: $d_{\text{ffn}} = 4 d_{\text{emb}}$।

=== স্কেলড ডট-প্রডাক্ট অ্যাটেনশন ===

==== অ্যাটেনশন হেড ====



ট্রান্সফরমার আর্কিটেকচারে ব্যবহৃত অ্যাটেনশন মেকানিজম হলো স্কেলড [[ডট-প্রোডাক্ট অ্যাটেনশন|ডট-প্রোডাক্ট অ্যাটেনশন]] ইউনিট। প্রতিটি ইউনিটের জন্য ট্রান্সফরমার মডেল তিনটি ওয়েট ম্যাট্রিক্স (weight matrix) শেখে: কুয়েরি ওয়েট <math>W^Q</math>, কী ওয়েট <math>W^K</math>, এবং ভ্যালু ওয়েট <math>W^V</math>।



এই মডিউলটি তিনটি সিকোয়েন্স গ্রহণ করে: একটি কুয়েরি সিকোয়েন্স, একটি কী সিকোয়েন্স এবং একটি ভ্যালু সিকোয়েন্স। কুয়েরি সিকোয়েন্সটির দৈর্ঘ্য <math>\ell_{\text{seq, query}}</math>, এবং এর প্রতিটি এন্ট্রি হলো <math>d_{\text{emb, query}}</math> ডাইমেনশনের একটি ভেক্টর। কী এবং ভ্যালু সিকোয়েন্সের ক্ষেত্রেও একইভাবে কাজ করে।

কুয়েরি সিকোয়েন্সের প্রতিটি ভেক্টর <math>x_{i, \text{query}}</math>-কে একটি ম্যাট্রিক্স <math>W^Q</math> দ্বারা গুণ করে একটি কুয়েরি ভেক্টর <math>q_i = x_{i, \text{query}} W^Q</math> তৈরি করা হয়। সমস্ত কুয়েরি ভেক্টরের ম্যাট্রিক্সটি হলো কুয়েরি ম্যাট্রিক্স:
<math display="block">Q = X_{\text{query}} W^Q</math>

একইভাবে, আমরা কী ম্যাট্রিক্স <math>K = X_{\text{key}} W^K</math> এবং ভ্যালু ম্যাট্রিক্স <math>V = X_{\text{value}} W^V</math> তৈরি করি।

সাধারণত দেখা যায় যে <math>W^Q, W^K, W^V</math> সবগুলোই বর্গাকার ম্যাট্রিক্স (square matrices), যার অর্থ <math>d_{\text{emb, query}}= d_{\text{query}}</math> ইত্যাদি।

কুয়েরি এবং কী ভেক্টর ব্যবহার করে অ্যাটেনশন ওয়েট (attention weights) গণনা করা হয়: টোকেন <math>i</math> থেকে টোকেন <math>j</math>-এর অ্যাটেনশন ওয়েট <math>a_{ij}</math> হলো <math>q_i</math> এবং <math>k_j</math>-এর মধ্যকার [[ডট প্রোডাক্ট]]। 

অ্যাটেনশন ওয়েটগুলোকে কী ভেক্টরের ডাইমেনশনের বর্গমূল <math>\sqrt{d_k}</math> দ্বারা ভাগ করা হয়, যা প্রশিক্ষণের সময় গ্র্যাডিয়েন্ট স্থিতিশীল রাখে এবং এরপর একটি [[সফটম্যাক্স ফাংশন|সফটম্যাক্স]]-এর মাধ্যমে চালনা করা হয় যা ওয়েটগুলোকে নরমালাইজ করে। <math>W^Q</math> এবং <math>W^K</math> ভিন্ন ম্যাট্রিক্স হওয়ার ফলে অ্যাটেনশন অসমমিত (non-symmetric) হতে পারে: যদি টোকেন <math>i</math>, টোকেন <math>j</math>-কে অ্যাটেন্ড করে (অর্থাৎ <math>q_i \cdot k_j</math> বড় হয়), তবে তার মানে এই নয় যে টোকেন <math>j</math> অবশ্যই টোকেন <math>i</math>-কে অ্যাটেন্ড করবে (অর্থাৎ <math>q_j \cdot k_i</math> ছোট হতে পারে)। 
টোকেন <math>i</math>-এর জন্য অ্যাটেনশন ইউনিটের আউটপুট হলো সমস্ত টোকেনের ভ্যালু ভেক্টরের একটি ওয়েটেড সাম, যেখানে ওয়েট হিসেবে <math>a_{ij}</math> (টোকেন <math>i</math> থেকে প্রতিটি টোকেনের অ্যাটেনশন) ব্যবহৃত হয়।

সমস্ত টোকেনের জন্য অ্যাটেনশন গণনাকে [[সফটম্যাক্স ফাংশন]] ব্যবহার করে একটি বৃহৎ ম্যাট্রিক্স গণনা হিসেবে প্রকাশ করা যেতে পারে, যা কম্পিউটেশনাল ম্যাট্রিক্স অপারেশন অপ্টিমাইজেশনের কারণে প্রশিক্ষণের জন্য অত্যন্ত কার্যকর। <math>Q</math>, <math>K</math> এবং <math>V</math> ম্যাট্রিক্সগুলোকে এমনভাবে সংজ্ঞায়িত করা হয় যেখানে <math>i</math>-তম সারিগুলো যথাক্রমে <math>q_i, k_i</math> এবং <math>v_i</math> ভেক্টর। তখন আমরা অ্যাটেনশনকে এভাবে উপস্থাপন করতে পারি:



<math display="block">\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\mathrm{T}}{\sqrt{d_k}}\right)V</math>

এখানে ম্যাট্রিক্সের প্রতিটি সারির ওপর সফটম্যাক্স প্রয়োগ করা হয়।

একটি কুয়েরি ভেক্টরের ডাইমেনশন সংখ্যা হলো ''কুয়েরি সাইজ'' <math>d_{\text{query}}</math>, একইভাবে ''কী সাইজ'' <math>d_{\text{key}}</math> এবং ''ভ্যালু সাইজ'' <math>d_{\text{value}}</math> সংজ্ঞায়িত। একটি অ্যাটেনশন হেডের আউটপুট ডাইমেনশন হলো এর ''হেড ডাইমেনশন'' <math>d_{\text{head}}</math>। অ্যাটেনশন মেকানিজমের জন্য নিচের তিনটি সমতা বজায় থাকা প্রয়োজন:
<math display="block">\ell_{\text {seq, key}}=\ell_{\text {seq, value}}, \;d_{\text {query}}=d_{\text {key}}, \; d_{\text {value}}=d_{\text {head}}</math>

তবে এটি ছাড়া অন্য কোনো বাধ্যবাধকতা নেই।

যদি অ্যাটেনশন হেডটি সেলফ-অ্যাটেনশন হিসেবে ব্যবহৃত হয়, তবে <math>X_{\text{query}} = X_{\text{key}} = X_{\text{value}}</math> হয়। যদি এটি ক্রস-অ্যাটেনশন হিসেবে ব্যবহৃত হয়, তবে সাধারণত <math>X_{\text{query}} \neq X_{\text{key}} = X_{\text{value}}</math> হয়। তাত্ত্বিকভাবে তিনটিই ভিন্ন হওয়া সম্ভব, তবে বাস্তবে এমনটা খুব কমই ঘটে।

=== মাল্টি-হেড অ্যাটেনশন ===



এক সেট <math>(W^Q, W^K, W^V)</math> ম্যাট্রিক্সকে একটি ''অ্যাটেনশন হেড'' বলা হয় এবং একটি ট্রান্সফরমার মডেলের প্রতিটি লেয়ারে একাধিক অ্যাটেনশন হেড থাকে। প্রতিটি অ্যাটেনশন হেড যখন একটি টোকেনের জন্য প্রাসঙ্গিক টোকেনগুলোকে অ্যাটেন্ড করে, তখন একাধিক অ্যাটেনশন হেড মডেলটিকে "প্রাসঙ্গিকতা"-র বিভিন্ন সংজ্ঞা অনুযায়ী এটি করার সুযোগ দেয়। 



সুনির্দিষ্টভাবে বলতে গেলে, কুয়েরি এবং কী প্রজেকশন ম্যাট্রিক্স (<math>W^Q</math> এবং <math>W^K</math>), যা অ্যাটেনশন স্কোর গণনায় জড়িত, তারা এই "প্রাসঙ্গিকতা" নির্ধারণ করে। অন্যদিকে, ভ্যালু [[প্রজেকশন ম্যাট্রিক্স]] <math>W^V</math> এবং আউটপুট প্রজেকশন ম্যাট্রিক্স <math>W^O</math>-এর অংশ যৌথভাবে নির্ধারণ করে যে, অ্যাটেন্ড করা টোকেনগুলো পরবর্তী লেয়ারগুলোতে এবং চূড়ান্ত আউটপুট লজিটে (logits) কী ধরনের প্রভাব ফেলবে। 



এছাড়া, টোকেনগুলো যখন ধারাবাহিক লেয়ারগুলোর মধ্য দিয়ে যায়, তখন প্রতিটি অ্যাটেনশন হেড দ্বারা ক্যাপচার করা টোকেন সম্পর্কের পরিধি বা ব্যাপ্তি বৃদ্ধি পেতে পারে। এটি গভীরতর লেয়ারগুলোতে মডেলটিকে আরও জটিল এবং দীর্ঘ-পাল্লার নির্ভরতা (long-range dependencies) ক্যাপচার করতে সাহায্য করে। ট্রান্সফরমারের অনেক অ্যাটেনশন হেড এমন প্রাসঙ্গিক সম্পর্ক এনকোড করে যা মানুষের কাছে অর্থবহ। উদাহরণস্বরূপ, কিছু অ্যাটেনশন হেড মূলত পরবর্তী শব্দের ওপর নজর দেয়, আবার অন্যগুলো ক্রিয়া (verb) থেকে তাদের কর্মের (direct object) ওপর নজর দেয়। প্রতিটি অ্যাটেনশন হেডের গণনা [[প্যারালাল কম্পিউটিং|সমান্তরালভাবে]] সম্পন্ন করা যায়, যা দ্রুত প্রসেসিং নিশ্চিত করে। অ্যাটেনশন লেয়ারের আউটপুটগুলোকে একত্রিত (concatenate) করে [[ফিডফরওয়ার্ড নিউরাল নেটওয়ার্ক]] লেয়ারগুলোতে পাঠানো হয়।

সুনির্দিষ্টভাবে বলতে গেলে, যদি একাধিক অ্যাটেনশন হেডকে <math>i</math> দ্বারা চিহ্নিত করা হয়, তবে আমরা পাই:

<math display="block">\text{MultiheadAttention}(Q, K, V) = \text{Concat}_{i \in [n_{\text{heads}}]}(\text{Attention}(XW^Q_i, XW^K_i, XW^V_i)) W^O</math>

যেখানে ম্যাট্রিক্স <math>X</math> হলো ওয়ার্ড এমবেডিংগুলোর কনক্যাটেনেশন (concatenation), এবং ম্যাট্রিক্স <math>W^Q_i, W^K_i, W^V_i</math> হলো প্রতিটি স্বতন্ত্র অ্যাটেনশন হেড <math>i</math>-এর নিজস্ব "প্রজেকশন ম্যাট্রিক্স", এবং <math>W^O</math> হলো সম্পূর্ণ মাল্টি-হেড অ্যাটেনশন ইউনিটের একটি চূড়ান্ত প্রজেকশন ম্যাট্রিক্স।



তাত্ত্বিকভাবে প্রতিটি অ্যাটেনশন হেডের জন্য ভিন্ন ভিন্ন হেড ডাইমেনশন <math>d_{\text{head}}</math> থাকা সম্ভব, তবে বাস্তবে এটি খুব কমই দেখা যায়।

উদাহরণস্বরূপ, ক্ষুদ্রতম GPT-2 মডেলে শুধুমাত্র সেলফ-অ্যাটেনশন মেকানিজম রয়েছে। এর ডাইমেনশনগুলো নিচে দেওয়া হলো:
<math display="block">d_{\text{emb}} = 768, n_{\text{head}} = 12, d_{\text{head}} = 64</math>

যেহেতু <math>12 \times 64 = 768</math>, তাই এর আউটপুট প্রজেকশন ম্যাট্রিক্স <math>W^O \in \mathbb{R}^{(12 \times 64) \times 768}</math> একটি বর্গাকার ম্যাট্রিক্স।


==== মাস্কড অ্যাটেনশন ====
ট্রান্সফরমার আর্কিটেকচারটি আউটপুট টোকেনগুলোকে পর্যায়ক্রমে (iteratively) গণনা করার জন্য তৈরি করা হয়েছে। ধরে নিই <math>t = 0</math> বলতে প্রথম আউটপুট টোকেন <math>i = 0</math> গণনা করাকে বোঝায়। সেক্ষেত্রে ধাপ <math>t > 0</math>-এর জন্য আউটপুট টোকেন <math>i = 0</math> অপরিবর্তিত থাকবে। এটি মডেলের মধ্যে [[অটোরেগ্রেসিভ মডেল|অটোরেগ্রেসিভ মডেলের]] মতো বৈশিষ্ট্য নিশ্চিত করে। 

তাই প্রতিটি টাইম স্টেপ <math>t</math>-তে, সমস্ত আউটপুট <math>i</math>-এর গণনার সময় অবস্থান <math>j \ge i</math> এর টোকেনগুলোতে প্রবেশাধিকার থাকা উচিত নয় (কারণ টাইম স্টেপ <math>t=i</math> তে <math>j>t</math> পজিশনের টোকেনগুলো তখনও গণনা করা হয়নি)। সফটম্যাক্স ধাপের আগে একটি মাস্ক ম্যাট্রিক্স <math>M</math> যোগ করে এটি সম্পন্ন করা যেতে পারে। যেখানে অ্যাটেনশন লিংক কেটে দিতে হবে সেখানে মাস্কের মান হবে <math>-\infty</math>, এবং অন্যান্য স্থানে এর মান হবে <math>0</math>:



<math display="block">\text{MaskedAttention}(Q, K, V) = \text{softmax}\left(M + \frac{QK^\mathrm{T}}{\sqrt{d_k}}\right)V</math>

ডিকোডার সেলফ-অ্যাটেনশন মডিউলগুলোতে নিচের ম্যাট্রিক্সটি সাধারণত ব্যবহৃত হয়, যাকে "কজাল মাস্কিং" (causal masking) বলা হয়:



<math display="block">M_{\text{causal}} = \begin{bmatrix}
0 & -\infty & -\infty & \dots  & -\infty \\
0 & 0 & -\infty & \dots  & -\infty \\
0 & 0 & 0 & \dots  & -\infty \\
\vdots & \vdots & \vdots & \ddots & \vdots \\
0 & 0 & 0 & \dots  & 0
\end{bmatrix}</math>

সহজ কথায় এর অর্থ হলো, প্রতিটি টোকেন কেবল নিজের ওপর এবং তার আগের টোকেনগুলোর ওপর মনোযোগ (attention) দিতে পারে, কিন্তু পরের কোনো টোকেনের ওপর নয়। একটি মাস্কহীন অ্যাটেনশন মডিউলকে এমন একটি মাস্কড অ্যাটেনশন মডিউল হিসেবে কল্পনা করা যেতে পারে যেখানে মাস্কের সমস্ত এন্ট্রি শূন্য। মাস্ক ম্যাট্রিক্সের একটি ব্যতিক্রমী ব্যবহারের উদাহরণ হিসেবে [[XLNet]]-এর কথা বলা যায়, যা <math>P M_{\text{causal}} P^{-1}</math> আকারের সমস্ত মাস্ক বিবেচনা করে, যেখানে <math>P</math> হলো একটি র্যান্ডম [[পারমুটেশন ম্যাট্রিক্স]] (permutation matrix)।

=== এনকোডার===

একটি এনকোডার একটি এমবেডিং লেয়ার এবং তার পরবর্তী একাধিক এনকোডার লেয়ারের সমন্বয়ে গঠিত।

প্রতিটি এনকোডার লেয়ার দুটি প্রধান উপাদান নিয়ে গঠিত: একটি সেলফ-অ্যাটেনশন মেকানিজম এবং একটি ফিড-ফরওয়ার্ড লেয়ার। পরিকল্পিতভাবে (Schematically):

ধরি ইনপুট ভেক্টরগুলো হলো <math>h_0, h_1, \dots</math>। সেগুলোকে একটি ম্যাট্রিক্স <math>H</math>-এ একত্রিত করলে পাই: 
<math display="block">H = \begin{bmatrix} h_0 \\ h_1 \\ \vdots \end{bmatrix}</math>
প্রতিটি লেয়ারের ক্রিয়াকলাপকে এভাবে প্রকাশ করা যায়:
<math display="block">\text{EncoderLayer}(H) = \text{FFN}(\text{MultiheadAttention}(H, H, H))</math>
এখানে একটি অন্তর্নিহিত নিয়ম হলো যে, ফিড-ফরওয়ার্ড নেটওয়ার্ক বা <math>\text{FFN}</math> ম্যাট্রিক্সের প্রতিটি সারির ওপর আলাদাভাবে প্রয়োগ করা হয়।

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

যেহেতু এনকোডার সম্পূর্ণ ইনপুট একসাথে প্রসেস করে, তাই প্রতিটি টোকেন অন্য প্রতিটি টোকেনকে অ্যাটেন্ড করতে পারে (all-to-all attention), ফলে এখানে কজাল মাস্কিং-এর প্রয়োজন হয় না।

=== ডিকোডার (Decoder) ===

একটি ডিকোডার একটি এমবেডিং লেয়ার, তার পরবর্তী একাধিক ডিকোডার লেয়ার এবং সবশেষে একটি আন-এমবেডিং লেয়ারের সমন্বয়ে গঠিত।

প্রতিটি ডিকোডার তিনটি প্রধান উপাদান নিয়ে গঠিত: একটি কজালি মাস্কড (causally masked) সেলফ-অ্যাটেনশন মেকানিজম, একটি ক্রস-অ্যাটেনশন মেকানিজম এবং একটি ফিড-ফরওয়ার্ড নিউরাল নেটওয়ার্ক। ডিকোডার এনকোডারের মতোই কাজ করে, তবে এখানে একটি অতিরিক্ত অ্যাটেনশন মেকানিজম যুক্ত করা হয় যা এনকোডার থেকে প্রাপ্ত এনকোডিংগুলো থেকে প্রাসঙ্গিক তথ্য সংগ্রহ করে। এই মেকানিজমটিকে ''এনকোডার-ডিকোডার অ্যাটেনশন''-ও (encoder–decoder attention) বলা যেতে পারে।

প্রথম এনকোডারের মতো, প্রথম ডিকোডারটি ইনপুট হিসেবে এনকোডিং-এর পরিবর্তে আউটপুট সিকোয়েন্সের পজিশনাল ইনফরমেশন এবং এমবেডিং গ্রহণ করে। ট্রান্সফরমারকে অবশ্যই আউটপুট প্রেডিক্ট করার জন্য বর্তমান বা ভবিষ্যতের আউটপুট ব্যবহার করা থেকে বিরত থাকতে হবে, তাই তথ্যের এই বিপরীত প্রবাহ রোধ করতে আউটপুট সিকোয়েন্সটিকে আংশিকভাবে মাস্ক (mask) করতে হবে। এটি [[অটোরেগ্রেসিভ মডেল|অটোরেগ্রেসিভ]] টেক্সট জেনারেশনে সাহায্য করে। ডিকোডিং-এর জন্য 'অল-টু-অল' অ্যাটেনশন অনুপযুক্ত, কারণ একটি টোকেন এমন টোকেনকে অ্যাটেন্ড করতে পারে না যা এখনও তৈরিই হয়নি। তাই ডিকোডারের সেলফ-অ্যাটেনশন মডিউলটি কজালি মাস্কড থাকে।



বিপরীতভাবে, ক্রস-অ্যাটেনশন মেকানিজম এনকোডারের আউটপুট ভেক্টরগুলোকে অ্যাটেন্ড করে, যা ডিকোডার ডিকোডিং শুরু করার আগেই গণনা করা হয়। ফলস্বরূপ, ক্রস-অ্যাটেনশন মেকানিজমে মাস্কিং-এর কোনো প্রয়োজন হয় না।

পরিকল্পিতভাবে:
$$\begin{aligned}
H' &= \text{MaskedMultiheadAttention}(H, H, H) \\
\text{DecoderLayer}(H) &=\text{FFN}(\text{MultiheadAttention}(H', H^E, H^E))
\end{aligned}$$
যেখানে $H^E$ হলো এমন একটি ম্যাট্রিক্স যার সারিগুলো এনকোডার থেকে প্রাপ্ত আউটপুট ভেক্টর।

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

== পূর্ণাঙ্গ ট্রান্সফরমার আর্কিটেকচার ==

=== সাব-লেয়ার (Sublayers) ===


প্রতিটি এনকোডার লেয়ারে ২টি সাব-লেয়ার থাকে: সেলফ-অ্যাটেনশন এবং ফিডফরওয়ার্ড নেটওয়ার্ক। প্রতিটি ডিকোডার লেয়ারে ৩টি সাব-লেয়ার থাকে: কজালি মাস্কড সেলফ-অ্যাটেনশন, ক্রস-অ্যাটেনশন এবং ফিডফরওয়ার্ড নেটওয়ার্ক।






আর্কিটেকচারের শেষ বিস্তারিত পয়েন্টগুলো হলো [[রেসিডুয়াল নিউরাল নেটওয়ার্ক|রেসিডুয়াল কানেকশন]] (residual connections) এবং [[লেয়ার নরমালাইজেশন]] (layer normalization - যা সংক্ষেপে "LayerNorm" বা "LN" বলা হয়)। যদিও তাত্ত্বিকভাবে এগুলো অপরিহার্য নয়, তবে গাণিতিক স্থিতিশীলতা (numerical stability) এবং কনভারজেন্সের (convergence) জন্য এগুলো অত্যন্ত প্রয়োজনীয়।



রেসিডুয়াল কানেকশন, যা ভ্যানিশিং গ্র্যাডিয়েন্ট (vanishing gradient) সমস্যা এড়াতে এবং প্রশিক্ষণ প্রক্রিয়াকে স্থিতিশীল করতে প্রবর্তন করা হয়েছে, তাকে এভাবে প্রকাশ করা যেতে পারে: $y = F(x) + x$। এই সমীকরণটি নির্দেশ করে যে, একটি আউটপুট $y$ হলো ইনপুট $x$-এর রূপান্তর ($F(x)$) এবং ইনপুটটির ($x$) নিজের যোগফল। ইনপুট $x$ যোগ করার মাধ্যমে ইনপুটের তথ্য সংরক্ষিত থাকে এবং যখন $F(x)$-এর গ্র্যাডিয়েন্ট শূন্যের কাছাকাছি থাকে, তখন উদ্ভূত সমস্যাগুলো এড়ানো যায়।

ফিডফরওয়ার্ড নেটওয়ার্ক মডিউলগুলো যেভাবে প্রতিটি ভেক্টরের ওপর আলাদাভাবে প্রয়োগ করা হয়, ঠিক একইভাবে LayerNorm-ও প্রতিটি ভেক্টরের ওপর আলাদাভাবে প্রয়োগ করা হয়।

বর্তমানে দুটি সাধারণ নিয়ম বা কনভেনশন প্রচলিত আছে: ''পোস্ট-এলএন'' (post-LN) এবং ''প্রি-এলএন'' (pre-LN)। পোস্ট-এলএন নিয়মে প্রতিটি সাব-লেয়ারের আউটপুট হলো:
$$\mathrm{LayerNorm}(x + \mathrm{Sublayer}(x))$$
যেখানে $\mathrm{Sublayer}(x)$ হলো সাব-লেয়ার দ্বারা সম্পাদিত ফাংশন।

প্রি-এলএন নিয়মে প্রতিটি সাব-লেয়ারের আউটপুট হলো:
$$x + \mathrm{Sublayer}(\mathrm{LayerNorm}(x))$$

২০১৭ সালের মূল ট্রান্সফরমার মডেলে পোস্ট-এলএন নিয়ম ব্যবহার করা হয়েছিল। এটি প্রশিক্ষণ দেওয়া কঠিন ছিল এবং এর জন্য সতর্কতার সাথে হাইপারপ্যারামিটার টিউনিং এবং লার্নিং রেটের একটি "ওয়ার্ম-আপ" (warm-up) প্রয়োজন হতো, যেখানে লার্নিং রেট ছোট থেকে শুরু হয়ে ধীরে ধীরে বৃদ্ধি পায়। ২০১৮ সালে বেশ কয়েকবার প্রস্তাবিত প্রি-এলএন নিয়মটি প্রশিক্ষণ দেওয়া সহজ বলে প্রমাণিত হয়েছে; এতে কোনো ওয়ার্ম-আপের প্রয়োজন হয় না এবং এটি দ্রুত কনভারজেন্স নিশ্চিত করে।

=== সিউডোকোড===
নিচে একটি স্ট্যান্ডার্ড প্রি-এলএন (Pre-LN) এনকোডার–ডিকোডার ট্রান্সফরমারের সিউডোকোড দেওয়া হলো, যা ''ফর্মাল অ্যালগরিদম ফর ট্রান্সফরমারস'' (Formal Algorithms for Transformers) থেকে অভিযোজিত:

<syntaxhighlight lang="python">
# ইনপুট: এনকোডার ইনপুট te, ডিকোডার ইনপুট td
# আউটপুট: প্রোবাবিলিটি ডিস্ট্রিবিউশন-এর অ্যারে

/* এনকোডার (Encoder) */
ze = encoder.tokenizer(te)

for t in 1:length(ze):
    ze[t] = encoder.embedding(ze[t]) + encoder.positional_embedding(t)

for l in 1:length(encoder.layers):
    layer = encoder.layers[l]

    # প্রথম সাব-লেয়ার (Self-Attention)
    ze_copy = copy(ze)
    for t in 1:length(ze):
        ze[t] = layer.layer_norm(ze[t])
    ze = layer.multihead_attention(ze, ze, ze)
    for t in 1:length(ze):
        ze[t] = ze[t] + ze_copy[t]

    # দ্বিতীয় সাব-লেয়ার (Feedforward)
    ze_copy = copy(ze)
    for t in 1:length(ze):
        ze[t] = layer.layer_norm(ze[t])
    ze = layer.feedforward(ze)
    for t in 1:length(ze):
        ze[t] = ze[t] + ze_copy[t]

for t in 1:length(ze):
    ze[t] = encoder.final_layer_norm(ze[t])


/* ডিকোডার (Decoder) */
zd = decoder.tokenizer(td)

for t in 1:length(zd):
    zd[t] = decoder.embedding(zd[t]) + decoder.positional_embedding(t)

for l in 1:length(decoder.layers):
    layer = decoder.layers[l]

    # প্রথম সাব-লেয়ার (Masked Self-Attention)
    zd_copy = copy(zd)
    for t in 1:length(zd):
        zd[t] = layer.layer_norm(zd[t])
    zd = layer.masked_multihead_attention(zd, zd, zd)
    for t in 1:length(zd):
        zd[t] = zd[t] + zd_copy[t]

    # দ্বিতীয় সাব-লেয়ার (Encoder-Decoder Cross-Attention)
    zd_copy = copy(zd)
    for t in 1:length(zd):
        zd[t] = layer.layer_norm(zd[t])
    zd = layer.multihead_attention(zd, ze, ze) 
    for t in 1:length(zd):
        zd[t] = zd[t] + zd_copy[t]

    # তৃতীয় সাব-লেয়ার (Feedforward)
    zd_copy = copy(zd)
    for t in 1:length(zd):
        zd[t] = layer.layer_norm(zd[t])
    zd = layer.feedforward(zd)
    for t in 1:length(zd):
        zd[t] = zd[t] + zd_copy[t]

zd = decoder.final_layer_norm(zd)

output_distributions = []
for t in 1:length(zd):
    output_distributions.append(decoder.unembed(zd[t]))

return output_distributions
</syntaxhighlight>

=== পরিভাষা ===
ট্রান্সফরমার আর্কিটেকচারটি মডুলার হওয়ার কারণে এতে বিভিন্ন ধরনের পরিবর্তন বা বৈচিত্র্য আনা সম্ভব। বেশ কিছু সাধারণ বৈচিত্র্য এখানে বর্ণনা করা হলো।

একটি "এনকোডার-অনলি" ট্রান্সফরমার ইনপুট টেক্সটকে ভেক্টরের একটি সিকোয়েন্সে রূপান্তর করতে এনকোডার প্রয়োগ করে। এটি সাধারণত টেক্সট এমবেডিং এবং পরবর্তী অ্যাপ্লিকেশনের জন্য [[ফিচার লার্নিং|রিপ্রেজেন্টেশন লার্নিং]]-এর ক্ষেত্রে ব্যবহৃত হয়। [[BERT (language model)|BERT]] হলো এনকোডার-অনলি মডেল। বর্তমানে এগুলো অপেক্ষাকৃত কম ব্যবহৃত হয়, কারণ দেখা গেছে যে এগুলো একটি পূর্ণাঙ্গ এনকোডার–ডিকোডার ট্রান্সফরমার প্রশিক্ষণ দিয়ে শুধু এনকোডার অংশটি নেওয়ার চেয়ে খুব বেশি কার্যকর নয়। এগুলোকে "অল-টু-অল" বা "বার্ট-লাইক" মডেলও বলা হয়।

একটি "ডিকোডার-অনলি" ট্রান্সফরমার আক্ষরিক অর্থে কেবল ডিকোডার নয়; কারণ এনকোডার ছাড়া ক্রস-অ্যাটেনশন মেকানিজমের অ্যাটেন্ড করার মতো কিছু থাকে না। ফলে, ডিকোডার-অনলি ট্রান্সফরমারে ডিকোডার লেয়ারগুলো কেবল দুটি সাব-লেয়ার নিয়ে গঠিত: কজালি মাস্কড সেলফ-অ্যাটেনশন এবং ফিডফরওয়ার্ড নেটওয়ার্ক। এটি সাধারণত [[প্রাকৃতিক ভাষা উৎপাদন|টেক্সট জেনারেশন]] এবং ইনস্ট্রাকশন ফলোয়িং-এর জন্য ব্যবহৃত হয়। [[জেনারেটিভ প্রি-ট্রেইনড ট্রান্সফরমার|জিবিটি (GPT)]] এবং চিঞ্চিলা সিরিজের মডেলগুলো ডিকোডার-অনলি। এগুলোকে "অটোরেগ্রেসিভ" বা "কজাল" মডেলও বলা হয়।

একটি "এনকোডার–ডিকোডার" ট্রান্সফরমার সাধারণত মূল ট্রান্সফরমারের মতোই, যেখানে প্রতি এনকোডার লেয়ারে ২ টি সাব-লেয়ার এবং প্রতি ডিকোডার লেয়ারে ৩ টি সাব-লেয়ার থাকে। এগুলোতে সামান্য আর্কিটেকচারাল উন্নতি থাকতে পারে, যেমন [[#Alternative activation functions|বিকল্প অ্যাক্টিভেশন ফাংশন]], [[#pre-LN|নরমালাইজেশনের অবস্থান পরিবর্তন]] ইত্যাদি। এটিও সাধারণত টেক্সট জেনারেশন এবং ইনস্ট্রাকশন ফলোয়িং-এর জন্য ব্যবহৃত হয়। [[T5 (language model)|T5 সিরিজের]] মডেলগুলো এনকোডার–ডিকোডার প্রকৃতির।

একটি "প্রিফিক্সএলএম" (prefixLM বা prefix language model) হলো একটি ডিকোডার-অনলি আর্কিটেকচার, তবে এতে কজাল মাস্কিংয়ের পরিবর্তে "প্রিফিক্স মাস্কিং" ব্যবহৃত হয়। সুনির্দিষ্টভাবে, এর মাস্কিংয়ের রূপটি এমন হয়:
$$M_{\text{prefixLM}} = \begin{bmatrix}
\mathbf{0} &  -\infty \\
\mathbf{0} & M_{\text{causal}} 
\end{bmatrix}$$
যেখানে প্রথম কলামগুলো "প্রিফিক্স" (prefix) নির্দেশ করে এবং পরবর্তী কলামগুলো সেই প্রিফিক্সের ওপর ভিত্তি করে অটোরেগ্রেসিভ পদ্ধতিতে তৈরি করা টেক্সট নির্দেশ করে। এগুলো দেখতে এনকোডার–ডিকোডার মডেলের মতো হলেও এতে "স্পার্সিটি" (sparsity) কম থাকে। এ ধরনের মডেলগুলো খুব কমই ব্যবহৃত হয়, তবে তাত্ত্বিক সম্ভাবনা এবং তুলনামূলক বেঞ্চমার্ক হিসেবে এগুলো প্রায়ই উদ্ধৃত করা হয়।

এছাড়াও কিছু মিশ্র seq2seq মডেল বিদ্যমান। উদাহরণস্বরূপ, ২০২০ সালে গুগল ট্রান্সলেট (Google Translate) তাদের পূর্ববর্তী RNN-encoder–RNN-decoder মডেলটিকে একটি ট্রান্সফরমার-এনকোডার–RNN-ডিকোডার (transformer-encoder–RNN-decoder) মডেল দ্বারা প্রতিস্থাপন করেছে। কারণ এনকোডারের ক্ষেত্রে ট্রান্সফরমার গুণগত মান উল্লেখযোগ্যভাবে বৃদ্ধি করলেও ডিকোদারের ক্ষেত্রে তা খুব বেশি কার্যকর হয়নি, যেখানে RNN ডিকোডার অনেক দ্রুত কাজ করত।

== পরবর্তী কাজ ==
=== বিকল্প অ্যাক্টিভেশন ফাংশন ===
মূল ট্রান্সফরমার মডেলে [[ReLU]] [[অ্যাক্টিভেশন ফাংশন]] ব্যবহার করা হয়েছিল। পরবর্তীতে অন্যান্য অ্যাক্টিভেশন ফাংশন তৈরি করা হয়েছে। [[Llama (language model)|লামা (Llama) সিরিজ]] এবং [[PaLM]]-এ SwiGLU ব্যবহার করা হয়েছে; অন্যদিকে GPT-1 এবং BERT উভয় ক্ষেত্রেই GELU ব্যবহার করা হয়েছে।

ফিডফরওয়ার্ড মডিউলে প্রায়ই [[গেটেড লিনিয়ার ইউনিট]] (Gated Linear Units)-এর সাথে সমন্বয় করে এই বিকল্প অ্যাক্টিভেশন ফাংশনগুলো ব্যবহার করা হয়।

=== বিকল্প নরমালাইজেশন ===
ট্রান্সফরমারে ব্যবহৃত নরমালাইজেশন পদ্ধতি LayerNorm থেকে ভিন্ন হতে পারে। একটি উদাহরণ হলো [[RMSNorm]], যা [[Llama (language model)|লামা (Llama) সিরিজে]] ব্যবহৃত হয়েছে। অন্যান্য উদাহরণের মধ্যে রয়েছে CapsuleNorm, ScaleNorm, অথবা FixNorm।

=== বিকল্প পজিশনাল এনকোডিং (Alternative positional encodings) ===
ট্রান্সফরমারগুলো সাইনুসয়ডাল (sinusoidal) পদ্ধতি ছাড়াও অন্যান্য পজিশনাল এনকোডিং পদ্ধতি ব্যবহার করতে পারে।

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

==== RoPE ====
**RoPE** (রোটারি পজিশনাল এমবেডিং/Rotary positional embedding), বোঝার সবচেয়ে সহজ উপায় হলো ২-মাত্রিক (2-dimensional) ভেক্টরের একটি তালিকা বিবেচনা করা: <math>[(x^{(1)}_1, x^{(2)}_1), (x^{(1)}_2, x^{(2)}_2), (x^{(1)}_3, x^{(2)}_3), ...]</math>। এখন একটি কোণ (angle) <math>\theta</math> বেছে নিন। সেক্ষেত্রে RoPE এনকোডিং হবে:
<math display="block">\text{RoPE}\big(x^{(1)}_m, x^{(2)}_m, m\big) =
\begin{pmatrix}    \cos m \theta & - \sin m \theta \\
\sin m \theta & \cos m \theta    \end{pmatrix}
\begin{pmatrix}    x^{(1)}_m \\    x^{(2)}_m \\    \end{pmatrix}  =    \begin{pmatrix}    x^{(1)}_m \cos m\theta - x^{(2)}_m \sin m \theta \\    x^{(2)}_m \cos m\theta + x^{(1)}_m \sin m \theta \\    \end{pmatrix}
</math>

সমতুল্যভাবে, যদি আমরা ২-মাত্রিক ভেক্টরগুলোকে জটিল সংখ্যা (complex numbers) <math>z_m := x^{(1)}_m + i x^{(2)}_m</math> হিসেবে লিখি, তবে RoPE এনকোডিং হলো কেবল একটি কোণ দ্বারা গুণফল:
<math display="block">\text{RoPE}\big(z_m, m\big) = e^{i m\theta} z_m
</math>

একটি <math>2n</math>-মাত্রিক ভেক্টরের তালিকার জন্য, একটি RoPE এনকোডার কোণের একটি অনুক্রম <math>\theta^{(1)}, ..., \theta^{(n)}</math> দ্বারা সংজ্ঞায়িত করা হয়। এরপর প্রতিটি স্থানাঙ্ক জোড়ার (pair of coordinates) ওপর RoPE এনকোডিং প্রয়োগ করা হয়।



RoPE-এর সুবিধা হলো যে দুটি ভেক্টরের মধ্যকার ডট-প্রোডাক্ট (dot-product) কেবল তাদের আপেক্ষিক অবস্থানের (relative location) ওপর নির্ভর করে:
<math display="block">
\text{RoPE}\big(x, m\big)^T\text{RoPE}\big(y, n\big)
=
\text{RoPE}\big(x, m+k\big)^T\text{RoPE}\big(y, n+k\big)
</math>
যেকোনো পূর্ণসংখ্যা <math>k</math>-এর জন্য এটি সত্য।

==== ALiBi ====
**ALiBi** (অ্যাটেনশন উইথ লিনিয়ার বায়াসেস/Attention with Linear Biases) মূল ট্রান্সফরমারে থাকা পজিশনাল এনকোডারের কোনো ''বিকল্প'' নয়। বরং, এটি একটি ''অতিরিক্ত'' পজিশনাল এনকোডার যা সরাসরি অ্যাটেনশন মেকানিজমের (attention mechanism) সাথে যুক্ত করা হয়। সুনির্দিষ্টভাবে বলতে গেলে, ALiBi অ্যাটেনশন মেকানিজম হলো:
<math display="block">\begin{align}
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\mathrm{T}}{\sqrt{d_k}} + s B\right)V
\end{align}</math>

এখানে, <math>s</math> একটি বাস্তব সংখ্যা ("স্কেলার"), এবং <math>B</math> হলো ''লিনিয়ার বায়াস'' (linear bias) ম্যাট্রিক্স যা এভাবে সংজ্ঞায়িত:
<math display="block}B = \begin{pmatrix}
0 & 1 & 2 & 3 & \cdots \\
-1 & 0 & 1 & 2 & \cdots \\
-2 & -1 & 0 & 1 & \cdots \\
-3 & -2 & -1 & 0 & \cdots \\
\vdots & \vdots & \vdots & \vdots & \ddots \\
\end{pmatrix}
</math>
অন্য কথায়, <math>B_{i, j} = j - i</math>। এখানে মূল ধারণাটি হলো লিনিয়ার বায়াস ম্যাট্রিক্স একটি সফট মাস্ক (softened mask) হিসেবে কাজ করে। ঠিক যেমন <math>0</math> পূর্ণ মনোযোগ (attention) প্রদান নির্দেশ করে এবং <math>-\infty</math> কোনো মনোযোগ না দেওয়া নির্দেশ করে, লিনিয়ার বায়াস ম্যাট্রিক্সটি এক অভিমুখে মনোযোগ বাড়ায় এবং অন্য অভিমুখে মনোযোগ কমিয়ে দেয়।

ALiBi স্বল্প কনটেক্সট উইন্ডোতে (context windows) প্রি-ট্রেনিং এবং পরবর্তীতে দীর্ঘ কনটেক্সট উইন্ডোতে ফাইন-টিউনিং করার সুবিধা দেয়। যেহেতু এটি সরাসরি অ্যাটেনশন মেকানিজমের সাথে যুক্ত, তাই এটিকে নেটওয়ার্কের একদম নিচে (bottom) থাকা যেকোনো পজিশনাল এনকোডারের সাথে ব্যবহার করা সম্ভব (যেখানে মূল ট্রান্সফরমারের সাইনুসয়ডাল এনকোডার, RoPE এবং অন্যান্য অনেক এনকোডার অবস্থান করে)।

==== রিলেটিভ পজিশন এনকোডিংস ====
**রিলেটিভ পজিশন এনকোডিংস** (Relative Position Encodings) অনেকটা ALiBi-এর মতোই, তবে এটি আরও বেশি সাধারণ বা জেনেরিক (generic):
<math display="block">\begin{align}
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\mathrm{T}}{\sqrt{d_k}} + B\right)V
\end{align}</math>
এখানে <math>B</math> হলো একটি [[টোয়েপ্লিটজ ম্যাট্রিক্স]] (Toeplitz matrix), অর্থাৎ যখনই <math>i-j = i'-j'</math> হয়, তখন <math>B_{i, j} = B_{i', j'}</math> হবে। এটিকে মূল সাইনুসয়ডাল পজিশনাল এনকোডিংয়ের বিপরীতে "অ্যাবসোলিউট পজিশনাল এনকোডিং" (absolute positional encoding) হিসেবে গণ্য করা হয়।

=== দক্ষ বাস্তবায়ন ===
ট্রান্সফরমার মডেলটি বর্তমানে আদর্শ ডিপ লার্নিং [[Framework (computer science)|ফ্রেমওয়ার্ক]] যেমন [[TensorFlow|টেনসরফ্লো]] এবং [[PyTorch|পাইটর্চ]]-এ বাস্তবায়িত হয়েছে। ''ট্রান্সফরমার্স'' (Transformers) হলো [[Hugging Face|হাগিং ফেস]] দ্বারা তৈরি একটি লাইব্রেরি যা ট্রান্সফরমার-ভিত্তিক আর্কিটেকচার এবং প্রাক-প্রশিক্ষিত (pretrained) মডেল সরবরাহ করে।

==== KV ক্যাশিং ====
যখন কোনো অটোরেগ্রেসিভ ট্রান্সফরমার ইনফারেন্সের (inference) জন্য ব্যবহার করা হয় (যেমন টেক্সট জেনারেশন বা লেখা তৈরি করা), তখন প্রতি ধাপে কুয়েরি (query) ভেক্টর পরিবর্তিত হয়, কিন্তু আগে থেকে গণনা করা কী (key) এবং ভ্যালু (value) ভেক্টরগুলো সবসময় একই থাকে। **KV ক্যাশিং** (KV caching) পদ্ধতি প্রতিটি অ্যাটেনশন ব্লকে গণনা করা কী এবং ভ্যালু ভেক্টরগুলো সংরক্ষণ করে রাখে, যাতে প্রতিবার নতুন টোকেন তৈরির সময় এগুলো পুনরায় গণনা করতে না হয়। 



**পজডঅ্যাটেনশন** (PagedAttention) পদ্ধতি KV ক্যাশিংয়ের ক্ষেত্রে [[Memory paging|মেমোরি পেজিং]] ধারণাটি প্রয়োগ করে।

যদি একটি ট্রান্সফরমারে কোনো স্থায়ী প্রম্পট (baked-in prompt) ব্যবহার করা হয়, যেমন ["আপনি একজন কাস্টমার সাপোর্ট এজেন্ট..."], তবে সেই প্রম্পটের জন্য কী (key) এবং ভ্যালু (value) ভেক্টরগুলো একবার গণনা করে ডিস্কে সংরক্ষণ করা যেতে পারে। যখন মডেলটি অনেকগুলো ছোট ছোট রিয়েল-টাইম ইন্টারঅ্যাকশনে (যেমন অনলাইন চ্যাটবট) ব্যবহৃত হয়, তখন এই পদ্ধতি কম্পিউটেশন বা গণনার খরচ উল্লেখযোগ্যভাবে কমিয়ে দেয়।

==== FlashAttention ====
**FlashAttention** (ফ্ল্যাশ-অ্যাটেনশন) হলো এমন একটি অ্যালগরিদম যা [[Graphics processing unit|জিপিইউ]] (GPU)-তে ট্রান্সফরমার অ্যাটেনশন মেকানিজমকে অত্যন্ত দক্ষতার সাথে কার্যকর করে। এটি একটি 'কমিউনিকেশন-অ্যাভয়েডিং' (communication-avoiding) অ্যালগরিদম যা [[Block matrix#Block matrix operations|ম্যাট্রিক্স গুণন ব্লক আকারে]] সম্পাদন করে, যাতে প্রতিটি ব্লক জিপিইউ-এর [[Cache (computing)|ক্যাশে]] মেমরির মধ্যে এঁটে যায়। ব্লকগুলোর সতর্ক ব্যবস্থাপনার মাধ্যমে এটি জিপিইউ ক্যাশেগুলোর মধ্যে ডেটা কপি করার পরিমাণ কমিয়ে আনে (যেহেতু ডেটা স্থানান্তর বা মুভমেন্ট ধীরগতির হয়ে থাকে)। বিস্তারিত জানার জন্য [[Softmax function#Numerical algorithms|সফটম্যাক্স]] সংক্রান্ত পাতাটি দেখুন।



দীর্ঘ কনটেক্সট লেন্থ (context length) হ্যান্ডেল করতে সক্ষম ল্যাঙ্গুয়েজ মডেলগুলোর ক্রমবর্ধমান চাহিদা মেটাতে এর একটি উন্নত সংস্করণ, **FlashAttention-2**, তৈরি করা হয়েছে। এটি ওয়ার্ক পার্টিশনিং এবং প্যারালেলিজমের ক্ষেত্রে বিশেষ উন্নতি প্রদান করে, যার ফলে এটি [[Nvidia A100|A100]] জিপিইউ-তে ([[FP16]]/[[BF16]]) ২৩০ TFLOPs/s পর্যন্ত গতি অর্জন করতে পারে, যা মূল FlashAttention-এর তুলনায় ২ গুণ দ্রুত।

FlashAttention-2-এর প্রধান অগ্রগতির মধ্যে রয়েছে নন-ম্যাটমুল (non-matmul) FLOPs কমানো, সিকোয়েন্স লেন্থ ডাইমেনশনে উন্নত প্যারালেলিজম, জিপিইউ ওয়ার্পগুলোর (GPU warps) মধ্যে উন্নত ওয়ার্ক পার্টিশনিং এবং ২৫৬ পর্যন্ত হেড ডাইমেনশনের পাশাপাশি মাল্টি-কুয়েরি অ্যাটেনশন (MQA) ও গ্রুপড-কুয়েরি অ্যাটেনশন (GQA)-এর সমর্থন।
বেঞ্চমার্ক অনুযায়ী, FlashAttention-2 মূল FlashAttention-এর চেয়ে ২ গুণ এবং পাইটর্চ-এর স্ট্যান্ডার্ড অ্যাটেনশন ইমপ্লিমেন্টেশনের চেয়ে ৯ গুণ পর্যন্ত দ্রুততর। ভবিষ্যতের উন্নয়নের মধ্যে [[Nvidia H100|H100]] জিপিইউ-এর মতো নতুন হার্ডওয়্যার এবং [[Floating-point arithmetic|FP8]]-এর মতো নতুন ডেটা টাইপের জন্য অপ্টিমাইজেশন অন্তর্ভুক্ত রয়েছে।

FlashAttention-4 মূলত ইন্সট্রাকশন থ্রুপুট (instruction throughput) বাড়াতে [[Pipeline (Unix)|পাইপলাইনিং]]-এর ওপর গুরুত্ব দেয় এবং এটি বিশেষভাবে [[Blackwell (microarchitecture)|ব্ল্যাকওয়েল জিপিইউ]] (Blackwell GPUs)-তে ভালো পারফর্ম করার জন্য তৈরি করা হয়েছে।

==== মাল্টি-কুয়েরি অ্যাটেনশন ====


**মাল্টি-কুয়েরি অ্যাটেনশন** (Multi-Query Attention বা MQA) মাল্টি-হেড অ্যাটেনশন মেকানিজমকে কিছুটা পরিবর্তন করে। সাধারণত যেখানে প্রতিটি হেডের জন্য আলাদা কী এবং ভ্যালু থাকে:

<math display="block">\text{MultiheadAttention}(Q, K, V) = \text{Concat}_{i \in [n_{\text{heads}}]}\left(\text{Attention}(XW^Q_i, XW^K_i, XW^V_i)\right) W^O</math>

সেখানে মাল্টি-কুয়েরি অ্যাটেনশনে কেবল একটি <math>W^K, W^V</math> থাকে, অর্থাৎ:

<math display="block">\text{MultiQueryAttention}(Q, K, V) = \text{Concat}_{i \in [n_{\text{heads}}]}\left(\text{Attention}(XW^Q_i, XW^K, XW^V)\right) W^O</math>

মডেলের গুণমান এবং প্রশিক্ষণের গতির ওপর এর প্রভাব নিরপেক্ষ হলেও, এটি ইনফারেন্সের (inference) গতি বৃদ্ধি করে।

আরও সাধারণভাবে বলতে গেলে, **গ্রুপড-কুয়েরি অ্যাটেনশন** (Grouped-Query Attention বা GQA) অ্যাটেনশন হেডগুলোকে কয়েকটি গ্রুপে ভাগ করে, যার প্রতিটি গ্রুপ একটি সাধারণ 'কী-ভ্যালু' (KV) পেয়ার শেয়ার করে। MQA হলো আসলে একটি মাত্র গ্রুপ বিশিষ্ট GQA, অন্যদিকে স্ট্যান্ডার্ড মাল্টি-হেড অ্যাটেনশন হলো সর্বোচ্চ সংখ্যক গ্রুপ বিশিষ্ট GQA।



**মাল্টি-হেড ল্যাটেন্ট অ্যাটেনশন** (Multihead Latent Attention বা MLA) হলো স্ট্যান্ডার্ড MHA-এর একটি [[Low-rank approximation|লো-র‍্যাঙ্ক অ্যাপ্রক্সিমেশন]]। সুনির্দিষ্টভাবে, প্রতিটি হিডেন ভেক্টর (hidden vector) অ্যাটেনশন মেকানিজমে প্রবেশের আগে প্রথমে দুটি স্বল্প-মাত্রার স্থানে ("ল্যাটেন্ট স্পেস") প্রক্ষিপ্ত (projected) হয়—একটি কুয়েরির জন্য এবং অন্যটি কী-ভ্যালুর (KV vector) জন্য। এই নকশাটি KV ক্যাশকে সর্বনিম্ন পর্যায়ে নিয়ে আসে, কারণ এক্ষেত্রে কেবল স্বল্প-মাত্রার KV ভেক্টরটি ক্যাশ করার প্রয়োজন হয়।
==== স্পেকুলেটিভ ডিকোডিং ====
**স্পেকুলেটিভ ডিকোডিং** (Speculative decoding) হলো টোকেন ডিকোডিং প্রক্রিয়াকে দ্রুততর করার একটি পদ্ধতি। সিপিপিইউ (CPU)-এর [[Speculative execution|স্পেকুলেটিভ এক্সিকিউশন]]-এর মতোই, এখানেও ভবিষ্যতের টোকেনগুলো দ্রুত গণনা করা হয় এবং পরে সেগুলো যাচাই করা হয়। যদি দ্রুত গণনা করা টোকেনগুলো ভুল প্রমাণিত হয়, তবে সেগুলো বাতিল করে পুনরায় ধীরগতিতে (সঠিকভাবে) গণনা করা হয়।



স্পেকুলেটিভ ডিকোডিংয়ের মূল ভিত্তি হলো এই যে, একটি ট্রান্সফরমার ডিকোডার টোকেন ডিকোড করার চেয়ে অনেক দ্রুত সেগুলো যাচাই (verify) করতে পারে।

ধরা যাক, আমাদের কাছে GPT-3 এবং GPT-3-small নামে দুটি ট্রান্সফরমার মডেল আছে এবং উভয়ের 'কনটেক্সট উইন্ডো' আকার ৫১২। গ্রিডি ডিকোডিং (greedy decoding) পদ্ধতিতে GPT-3 ব্যবহার করে একটি পুরো কনটেক্সট উইন্ডো অটোরেগ্রেসিভ উপায়ে তৈরি করতে হলে মডেলটিকে ৫১২ বার চালাতে হবে, যেখানে প্রতিবার একটি করে টোকেন <math>x_1, x_2, ..., x_{512}</math> তৈরি হবে। এতে মোট সময় লাগবে <math>512 T_{\text{GPT-3}}</math>। তবে, আমাদের কাছে যদি এই টোকেনগুলোর মান সম্পর্কে কোনো আগাম ধারণা থাকে, তবে আমরা মডেলটির মাত্র একটি রান (run)-এর মাধ্যমেই সমান্তরালভাবে (in parallel) সবগুলো যাচাই করতে পারি। এর জন্য প্রতিটি <math>x_t</math> টোকেনটি <math>t</math>-তম আউটপুটে সর্বোচ্চ লগ-লাইকলিহুড (log-likelihood) বিশিষ্ট কি না তা পরীক্ষা করলেই হয়।

স্পেকুলেটিভ ডিকোডিংয়ে, একটি ছোট মডেল বা অন্য কোনো সহজ হিউরিস্টিক (heuristic) ব্যবহার করে কয়েকটি 'স্পেকুলেটিভ টোকেন' তৈরি করা হয়, যা পরবর্তীতে বড় মডেল দ্বারা যাচাই করা হয়। উদাহরণস্বরূপ, যদি আমরা GPT-3-small ব্যবহার করে চারটি স্পেকুলেটিভ টোকেন <math>\tilde{x}_1, \tilde{x}_2, \tilde{x}_3, \tilde{x}_4</math> তৈরি করি, তবে এতে সময় লাগবে মাত্র <math>4 T_{\text{GPT-3-small}}</math>। এরপর এই টোকেনগুলো বড় GPT-3 মডেলের মধ্য দিয়ে একসাথে চালানো হয়। যদি GPT-3 যাচাই করে দেখে যে <math>\tilde{x}_1</math> এবং <math>\tilde{x}_2</math> সঠিক, তবে সেগুলো রাখা হয়। কিন্তু যদি <math>\tilde{x}_3</math> সঠিক না হয়, তবে <math>\tilde{x}_3, \tilde{x}_4</math> বাতিল করা হয় এবং GPT-3 ব্যবহার করে সেগুলো পুনরায় তৈরি করা হয়। এতে মোট সময় লাগবে <math>4 T_{\text{GPT-3-small}} + 3 T_{\text{GPT-3}}</math>, যা <math>4 T_{\text{GPT-3}}</math> এর চেয়ে কম হতে পারে।

নন-গ্রিডি ডিকোডিংয়ের ক্ষেত্রেও একই ধারণা প্রযোজ্য, তবে সেক্ষেত্রে স্পেকুলেটিভ টোকেনগুলো স্টোকাস্টিক (stochastic) বা দৈব চয়ন পদ্ধতিতে গ্রহণ বা বর্জন করা হয়, যা নিশ্চিত করে যে চূড়ান্ত আউটপুট ডিস্ট্রিবিউশন স্পেকুলেটিভ ডিকোডিং ব্যবহার না করলে যা হতো হুবহু তাই থাকে।


**মাল্টি-টোকেন প্রেডিকশন** (Multi-Token Prediction)-এ একটি মাত্র ফরোয়ার্ড পাসের মাধ্যমে একটি চূড়ান্ত এমবেডিং ভেক্টর তৈরি করা হয়, যা পরে টোকেন প্রবাবিলিটিতে রূপান্তরিত হয়। তবে, সেই ভেক্টরটিকে পরবর্তী ট্রান্সফরমার ব্লক দ্বারা প্রক্রিয়া করে ''পরবর্তী'' (next) টোকেন প্রেডিক্ট করা যায় এবং এভাবে ভবিষ্যতের অনেকগুলো ধাপ পর্যন্ত গণনা করা সম্ভব। এটি গতির বিনিময়ে নির্ভুলতার কিছুটা আপস (trade-off) করে, কারণ প্রতিটি নতুন টোকেনের জন্য পুরো স্ট্যাকের বদলে কেবল একটি অতিরিক্ত ট্রান্সফরমার ব্লকের প্রয়োজন হয়।
=== সাব-কোয়াড্রাটিক ট্রান্সফরমার ===
ট্রান্সফরমার-ভিত্তিক আর্কিটেকচারগুলোর প্রশিক্ষণ বেশ ব্যয়বহুল হতে পারে, বিশেষ করে দীর্ঘ ইনপুটের ক্ষেত্রে। এই সমস্যা সমাধানের জন্য অনেক পদ্ধতি উদ্ভাবিত হয়েছে। ছবির ক্ষেত্রে (image domain), 'সুইন ট্রান্সফরমার' (Swin transformer) একটি দক্ষ আর্কিটেকচার যা শিফটিং উইন্ডোর (shifting windows) মধ্যে অ্যাটেনশন প্রক্রিয়া সম্পন্ন করে। অডিওর ক্ষেত্রে, SepTr সময় এবং ফ্রিকোয়েন্সি ডোমেইনের অ্যাটেনশনকে পৃথক (decouple) করে ফেলে। দীর্ঘ ইনপুটের ওপর বিভিন্ন ট্রান্সফরমার আর্কিটেকচারের কার্যকারিতা তুলনা করার জন্য 'লং রেঞ্জ অ্যারেনা' (Long Range Arena, ২০২০) একটি আদর্শ বেঞ্চমার্ক হিসেবে ব্যবহৃত হয়।

==== বিকল্প অ্যাটেনশন গ্রাফ ====
প্রমিত বা স্ট্যান্ডার্ড অ্যাটেনশন গ্রাফগুলো হয় 'অল-টু-অল' (all-to-all) অথবা 'কজাল' (causal) প্রকৃতির হয়। এই উভয় ক্ষেত্রেই গণনার জটিলতা বা স্কেলিং <math>O(N^2)</math> হারে বৃদ্ধি পায়, যেখানে <math>N</math> হলো একটি সিকোয়েন্সের টোকেন সংখ্যা।



রিফর্মার (Reformer, ২০২০) লোকালিটি-সেনসিটিভ হ্যাশিং (locality-sensitive hashing) এবং রিভার্সিবল লেয়ার (reversible layers) ব্যবহারের মাধ্যমে এই কম্পিউটেশনাল লোড <math>O(N^2)</math> থেকে কমিয়ে <math>O(N\ln N)</math>-এ নিয়ে আসে।
**স্পার্স অ্যাটেনশন** (Sparse attention) এমন অ্যাটেনশন গ্রাফ ব্যবহার করে যা <math>O(N^2)</math>-এর চেয়ে ধীরগতিতে বৃদ্ধি পায়। উদাহরণস্বরূপ, বিগবার্ড (BigBird, ২০২০) র‍্যান্ডম [[Small-world network|স্মল-ওয়ার্ল্ড নেটওয়ার্ক]] ব্যবহার করে যা <math>O(N)</math> হারে বৃদ্ধি পায়।



সাধারণ ট্রান্সফরমারে মেমোরির প্রয়োজনীয়তা কনটেক্সট উইন্ডোর আকারের বর্গ অনুপাতে (quadratic) বৃদ্ধি পায়। অ্যাটেনশন-ফ্রি ট্রান্সফরমারগুলো (Attention-free transformers) কী (key) এবং ভ্যালু (value)-কে সংযুক্ত করার মাধ্যমে ট্রান্সফরমারের সুবিধাগুলো বজায় রেখেও এই মেমোরি নির্ভরতাকে রৈখিক (linear) পর্যায়ে নামিয়ে আনে।

==== র‍্যান্ডম ফিচার অ্যাটেনশন ====
**র‍্যান্ডম ফিচার অ্যাটেনশন** (Random Feature Attention, ২০২১) ফুরিয়ার র‍্যান্ডম ফিচার (Fourier random features) ব্যবহার করে:
<math display="block">\varphi(x) = \frac{1}{\sqrt D}[\cos\langle w_1, x\rangle, \sin\langle w_1, x\rangle, \cdots \cos\langle w_D, x\rangle, \sin\langle w_D, x\rangle]^T</math>
যেখানে <math>w_1, ..., w_D</math> হলো নরমাল ডিস্ট্রিবিউশন <math>N(0, \sigma^2 I)</math> থেকে নেওয়া স্বাধীন নমুনা। প্যারামিটারের এই পছন্দটি <math>\mathbb E[\langle \varphi(x), \varphi(y)\rangle] = e^{-\frac{\|x-y\|^2}{2\sigma^2}}</math> শর্ত পূরণ করে, অথবা:
<math display="block">e^{\langle x, y\rangle/\sigma^2} = \mathbb E[\langle e^{\|x\|^2/2\sigma^2} \varphi(x), e^{\|y\|^2/2\sigma^2}\varphi(y)\rangle] \approx \langle e^{\|x\|^2/2\sigma^2} \varphi(x), e^{\|y\|^2/2\sigma^2}\varphi(y)\rangle </math>

ফলস্বরূপ, একটি কুয়েরি বিশিষ্ট ওয়ান-হেডেড অ্যাটেনশনকে এভাবে লেখা যায়:
<math display="block">
\text{Attention}(q, K, V) = \text{softmax}\left(\frac{qK^\mathrm{T}}{\sqrt{d_k}}\right)V

\approx \frac{\varphi(q)^T \sum_i e^{\|k_i\|^2/2\sigma^2}\varphi(k_i) v_i^T}{\varphi(q)^T \sum_i e^{\|k_i\|^2/2\sigma^2}\varphi(k_i)}</math>
যেখানে <math>\sigma = d_K^{1/4}</math>। মাল্টিপল কুয়েরি এবং মাল্টি-হেড অ্যাটেনশনের জন্যও একই নিয়ম প্রযোজ্য।

এই অ্যাপ্রক্সিমেশনটি রৈখিক সময়ে (linear time) গণনা করা সম্ভব, কারণ আমরা প্রথমে <math>\varphi(k_i) v_i^T</math> ম্যাট্রিক্সটি গণনা করে পরে সেটিকে কুয়েরি দিয়ে গুণ করতে পারি। মূলত, আমরা নিচের সমীকরণটির একটি অধিকতর নির্ভুল সংস্করণ পেতে সক্ষম হয়েছি:
<math display="block">\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\mathrm{T}}{\sqrt{d_k}}\right)V \approx Q(K^TV/\sqrt{d_k})
</math>

পারফর্মার (Performer, ২০২২) একই র‍্যান্ডম ফিচার অ্যাটেনশন ব্যবহার করে, তবে এক্ষেত্রে <math>w_1, ..., w_D</math> নমুনাগুলোকে প্রথমে নরমাল ডিস্ট্রিবিউশন <math>N(0, \sigma^2 I)</math> থেকে স্বাধীনভাবে সংগ্রহ করা হয় এবং পরে সেগুলোকে [[Gram–Schmidt process|গ্রাম-স্মিট প্রক্রিয়ার]] মাধ্যমে প্রসেস করা হয়।
=== মাল্টিমোডালিটি ===
ট্রান্সফরমারগুলো কেবল টেক্সট বা পাঠ্যের বাইরেও অন্যান্য মোডালিটির (ইনপুট বা আউটপুট) জন্য ব্যবহার বা অভিযোজন করা যেতে পারে; সাধারণত উক্ত মোডালিটিকে "টোকেনাইজ" করার কোনো উপায় খুঁজে বের করার মাধ্যমে এটি করা হয়।

মাল্টিমোডাল মডেলগুলো হয় একদম শুরু (scratch) থেকে প্রশিক্ষণ দেওয়া যেতে পারে, অথবা ফাইন-টিউনিংয়ের মাধ্যমে তৈরি করা যেতে পারে। ২০২২ সালের একটি গবেষণায় দেখা গেছে যে, শুধুমাত্র প্রাকৃতিক ভাষার ওপর প্রাক-প্রশিক্ষিত ট্রান্সফরমারগুলোর মাত্র ০.০৩% প্যারামিটার ফাইন-টিউন করে বিভিন্ন যৌক্তিক এবং চাক্ষুষ (visual) কাজে [[LSTM|এলএসটিএম (LSTMs)]]-এর সাথে প্রতিযোগিতামূলক পারফরম্যান্স পাওয়া সম্ভব, যা এর [[Transfer learning|স্থানান্তর শিখন (transfer learning)]] ক্ষমতা প্রদর্শন করে। LLaVA ছিল একটি ভিশন-ল্যাঙ্গুয়েজ মডেল যা একটি ল্যাঙ্গুয়েজ মডেল (Vicuna-13B) এবং একটি ভিশন মডেলের ([[Vision transformer|ViT]]-L/14) সমন্বয়ে গঠিত ছিল, যা একটি লিনিয়ার লেয়ার দ্বারা সংযুক্ত। এক্ষেত্রে শুধুমাত্র লিনিয়ার লেয়ারটি ফাইন-টিউন করা হয়।

**ভিশন ট্রান্সফরমার** ইনপুট ছবিগুলোকে প্যাচের একটি সিরিজ হিসেবে ভেঙে ফেলে সেগুলোকে ভেক্টরে রূপান্তর করে। এরপর একটি সাধারণ ট্রান্সফরমারে টোকেন এমবেডিং ভেক্টরের মতো করে এগুলোকে প্রসেস করার মাধ্যমে কম্পিউটার ভিশনের উপযোগী করে তোলা হয়।



কন্ফর্মার (Conformer) এবং পরবর্তীকালে তৈরি হওয়া **হুইস্পার (Whisper)** স্পিচ রিকগনিশন বা কণ্ঠস্বর শনাক্তকরণের জন্য একই প্যাটার্ন অনুসরণ করে। প্রথমে স্পিচ সিগন্যালকে একটি [[Spectrogram|স্পেকট্রোগ্রামে]] রূপান্তরিত করা হয়, যা পরে ছবির মতো করে প্যাচে বিভক্ত করা হয় এবং ভেক্টরে রূপান্তরিত করে সাধারণ ট্রান্সফরমারে ইনপুট হিসেবে দেওয়া হয়।

**পার্সিভার (Perceiver)''' হলো মাল্টিমোডালিটির জন্য ডিজাইন করা ট্রান্সফরমারের একটি বিশেষ সংস্করণ।

ছবি তৈরির (image generation) ক্ষেত্রে উল্লেখযোগ্য আর্কিটেকচারগুলো হলো DALL-E 1 (২০২১), Parti (২০২২), Phenaki (২০২৩), এবং Muse (২০২৩)। পরবর্তী মডেলগুলোর বিপরীতে, DALL-E কোনো ডিফিউশন মডেল নয়। বরং এটি একটি ডিকোডার-অনলি ট্রান্সফরমার ব্যবহার করে যা অটোরেগ্রেসিভ পদ্ধতিতে টেক্সট এবং পরবর্তীতে ছবির একটি টোকেন রিপ্রেজেন্টেশন তৈরি করে, যা শেষে একটি ভেরিয়েশনাল অটোএনকোডার দ্বারা ছবিতে রূপান্তরিত হয়। Parti হলো একটি এনকোডার-ডিকোডার ট্রান্সফরমার, যেখানে এনকোডার টেক্সট প্রম্পট প্রসেস করে এবং ডিকোডার ছবির টোকেন রিপ্রেজেন্টেশন তৈরি করে। Muse হলো এনকোডার-অনলি ট্রান্সফরমার যা মাস্কড (masked) ইমেজ টোকেন থেকে আনমাস্কড ইমেজ টোকেন প্রেডিক্ট করতে প্রশিক্ষিত। তৈরির সময় সব ইনপুট টোকেন মাস্ক করা থাকে এবং সর্বোচ্চ আত্মবিশ্বাসী প্রেডিকশনগুলো পরবর্তী ইটারেশনে অন্তর্ভুক্ত করা হয়, যতক্ষণ না সব টোকেন প্রেডিক্ট করা হয়। Phenaki একটি টেক্সট-টু-ভিডিও মডেল যা পূর্ব-গণনাকৃত টেক্সট টোকেনের ওপর ভিত্তি করে একটি দ্বিমুখী (bidirectional) মাস্কড ট্রান্সফরমার হিসেবে কাজ করে। তৈরি করা টোকেনগুলো পরবর্তীতে ভিডিওতে ডিকোড করা হয়।

## প্রয়োগসমূহ
প্রাকৃতিক ভাষা প্রক্রিয়াকরণ (NLP)-এর ক্ষেত্রে ট্রান্সফরমার ব্যাপক সাফল্য অর্জন করেছে। GPT-2, GPT-3, GPT-4, জেমিনি, AlbertAGPT, ক্লদ, বার্ট (BERT), গ্রক, XLNet, RoBERTa এবং চ্যাটজিপিটি-এর মতো অনেক বৃহৎ ভাষা মডেল (LLM) এনএলপি-সংক্রান্ত বিভিন্ন উপ-কাজ এবং বাস্তবমুখী প্রয়োগে ট্রান্সফরমারের সক্ষমতা প্রমাণ করেছে, যার মধ্যে রয়েছে:

* যান্ত্রিক অনুবাদ
* টাইম সিরিজ বা সময়ক্রমিক পূর্বাভাস
* নথি সংক্ষেপণ (Document summarization)
* নথি তৈরি (Document generation)
* নামকরণকৃত সত্তা শনাক্তকরণ (NER)
* প্রাকৃতিক ভাষায় বর্ণিত প্রয়োজনীয়তার ওপর ভিত্তি করে কম্পিউটার কোড লেখা।
* কণ্ঠস্বর থেকে পাঠ্যে রূপান্তর (Speech-to-text)

প্রথাগত এনএলপি-র বাইরেও ট্রান্সফরমার আর্কিটেকচার অন্যান্য ক্ষেত্রে সফলভাবে ব্যবহৃত হচ্ছে, যেমন:

* জৈবিক সিকোয়েন্স বিশ্লেষণ
* ভিডিও অনুধাবন (Video understanding)
* প্রোটিন ফোল্ডিং (যেমন আলফাফোল্ড)
* দাবা বোর্ডের অবস্থান মূল্যায়ন করা। কোনো ধরনের মিনিম্যাক্স সার্চ ছাড়াই কেবল স্ট্যাটিক মূল্যায়নের মাধ্যমে ট্রান্সফরমার ২৮৯৫ ইলো (Elo) রেটিং অর্জন করেছে, যা এটিকে গ্র্যান্ডমাস্টার পর্যায়ে উন্নীত করেছে।

## তথ্যসূত্র

## আরও পড়ুন

* আলেকজান্ডার রাশ, দ্য অ্যানোটেটেড ট্রান্সফরমার , হার্ভার্ড এনএলপি গ্রুপ, ৩ এপ্রিল ২০১৮
* 
* 
* 
* 

বিষয়শ্রেণী:গুগল সফটওয়্যার
বিষয়শ্রেণী:কৃত্রিম বুদ্ধিমত্তা