فاز 7 · درس 6

آموزش BERT و مدل‌سازی زبان پوشانده‌شده (MLM)

نوع
ساختنی
زمان
حدود 45 دقیقه
زبان‌ها
Python
پیش‌نیاز
فاز 7 · 05 (ترنسفورمر کامل)، فاز 5 · 02 (بازنمایی متن)
یک پازل کلمات با چند قطعه خالی پنهان‌شده که نور از هر دو جهت به جای خالی آن‌ها می‌تابد
فهرست مطالب
  1. صورت‌مسئله
  2. مفهوم
  3. سیگنال آموزش
  4. قواعد ماسک‌گذاری BERT
  5. پیش‌بینی جمله‌ی بعدی (NSP) — و علت کنار گذاشتن آن
  6. چه چیزی در سال 2026 تغییر کرد: ModernBERT
  7. تسک‌هایی که هنوز هم در سال 2026 سراغ انکودر می‌روند
  8. ساخت از صفر
  9. مرحله‌ی 1: منطق ماسک‌گذاری
  10. مرحله‌ی 2: اجرای پیش‌بینی MLM روی یک پیکره‌ی کوچک
  11. مرحله‌ی 3: مقایسه‌ی انواع ماسک
  12. مرحله‌ی 4: فاین‌تیون سربرگ
  13. استفاده‌ی عملی
  14. پیاده‌سازی نهایی
  15. تمرین‌ها
  16. اصطلاحات کلیدی
  17. برای مطالعه‌ی بیشتر

در روزگاری که مدل‌های زبانی بزرگ تولید متن (مانند خانواده‌ی GPT) همه‌ی توجه‌ها را به خود جلب کرده‌اند، پیاده‌سازی تسک‌هایی مثل دسته‌بندی، استخراج موجودیت‌ها و بازرتبه‌بندی در خطوط بازیابی اطلاعات (RAG) به ابزاری سبک‌تر، سریع‌تر و دقیق‌تر نیاز دارد. مدل BERT با تکیه بر سازوکار توجه دوطرفه و مدل‌سازی زبان پوشانده‌شده (MLM)، همچنان زیربنای بخش عمده‌ای از سیستم‌های مدرن بازنمایی و جستجوی معنایی است.

این درس به شما نشان می‌دهد که چرا نیازی نیست برای هر پردازش متنی هزینه‌ی سنگین مدل‌های دیکودر را بپردازید و چگونه با فهم سازوکار ماسک‌گذاری و انکودر، مدل‌های بسیار سریع‌تر و پایدارتر بسازید. پیاده‌سازی گام‌به‌گام منطق MLM و درک تحولات اخیر تا ModernBERT به شما امکان می‌دهد سیستم‌های طبقه‌بندی و امبدینگ اختصاصی خود را به‌شکل بهینه پیاده‌سازی و مستقر کنید.

مدل GPT کلمه‌ی بعدی را پیش‌بینی می‌کند؛ BERT کلمه‌ی جاافتاده را. تفاوت در حد یک جمله است، اما همین تفاوت مسیر نیمی از یک دهه نوآوری در حوزه‌ی امبدینگ را رقم زد.

صورت‌مسئله

در سال 2018 برای هر تسک پردازش زبان طبیعی (NLP) مثل تحلیل احساسات، بازشناسی موجودیت‌های نام‌دار (NER)، پاسخ به سوالات یا استلزام معنایی، باید مدلی جداگانه از صفر و روی داده‌های برچسب‌دار خودش آموزش می‌دید. هیچ چک‌پوینت از‌پیش‌آموزش‌دیده‌ای برای «درک زبان انگلیسی» وجود نداشت که بتوانید آن را فاین‌تیون کنید. مدل ELMo (2018) نشان داد که می‌توان امبدینگ‌های وابسته به متن را با یک LSTM دوطرفه پیش‌آموزش داد؛ مفید بود، ولی تعمیم‌پذیری بالایی نداشت.

BERT (دولین و همکاران، 2018) این پرسش را مطرح کرد: چه می‌شود اگر یک انکودر ترنسفورمر را با تک‌تک جملات اینترنت آموزش دهیم و وادارش کنیم کلمات جاافتاده را با تکیه بر بافتِ هر دو طرف پیش‌بینی کند؟ سپس فقط یک سربرگ را برای تسک پایین‌دستی‌تان فاین‌تیون می‌کنید. بهره‌وری پارامتری آن مثل یک معجزه بود.

نتیجه چه شد؟ ظرف 18 ماه، BERT و مشتقاتش (مانند RoBERTa ،ALBERT و ELECTRA) صدر تمام لیدربوردهای NLP دنیا را تصاحب کردند. تا سال 2020، در قلب هر موتور جستجو، پایپ‌لاین بررسی محتوا و سامانه‌ی جستجوی معنایی روی کره‌ی زمین ردی از BERT دیده می‌شد.

در سال 2026، مدل‌های مبتنی بر انکودر (Encoder-only) هنوز هم ابزار مناسب برای دسته‌بندی، بازیابی و استخراج ساختاریافته‌اند؛ سرعت اجرای آن‌ها به‌ازای هر توکن 5 تا 10 برابر دیکودرهاست و امبدینگ‌هایشان بک‌بون تمام استک‌های مدرن بازیابی اطلاعات است. مدل ModernBERT (دسامبر 2024) با ترکیب Flash Attention و RoPE و GeGLU طول بافت (context) این معماری را به 8K رساند.

مفهوم

مدل‌سازی زبان پوشانده‌شده: انتخاب توکن‌ها، ماسک کردن آن‌ها و پیش‌بینی موارد اصلی

سیگنال آموزش

این جمله را در نظر بگیرید: the quick brown fox jumps over the lazy dog.

15% از توکن‌ها را به‌شکل تصادفی ماسک کنید:

input:  the [MASK] brown fox jumps [MASK] the lazy dog
target: the  quick brown fox jumps  over  the lazy dog

مدل را آموزش دهید تا توکن‌های اصلی را در موقعیت‌های ماسک‌شده پیش‌بینی کند. از آنجا که انکودر دوطرفه است، پیش‌بینی [MASK] در موقعیت 1 می‌تواند از brown fox jumps در موقعیت‌های 2 به بعد استفاده کند؛ کاری که GPT از انجامش ناتوان است.

قواعد ماسک‌گذاری BERT

از میان 15% توکنِ انتخاب‌شده برای پیش‌بینی:

  • 80% با توکن [MASK] جایگزین می‌شوند.
  • 10% با یک توکن تصادفی جایگزین می‌شوند.
  • 10% بدون تغییر باقی می‌مانند.

چرا همیشه [MASK] نباشد؟ چون در زمان استنتاج هیچ‌وقت [MASK] ظاهر نمی‌شود. اگر مدل را طوری آموزش دهید که در 100% جایگاه‌های ماسک‌شده انتظار [MASK] داشته باشد، بین مرحله‌ی پیش‌آموزش و فاین‌تیونینگ ناهماهنگی در توزیع داده‌ها (distribution shift) پیش می‌آید. آن 10% تصادفی و 10% بدون تغییر مدل را واقع‌بین نگه می‌دارند.

پیش‌بینی جمله‌ی بعدی (NSP) — و علت کنار گذاشتن آن

نسخه‌ی اولیه‌ی BERT روی NSP هم آموزش می‌دید: با دریافت دو جمله‌ی A و B، پیش‌بینی کند آیا B ادامه‌ی A است یا نه. RoBERTa (2019) با آزمایش ابلیشن (حذف این بخش) نشان داد که NSP به عملکرد مدل آسیب می‌زند، نه کمک. انکودرهای امروزی از آن صرف‌نظر می‌کنند.

چه چیزی در سال 2026 تغییر کرد: ModernBERT

مقاله‌ی سال 2024 ModernBERT این بلاک ساختاری را با المان‌های پایه‌ی سال 2026 از نو ساخت:

بخش BERT اولیه (2018) ModernBERT (2024)
جایگاه‌گذاری (Positional) مطلقِ یادگیری‌شده RoPE
تابع فعال‌ساز GELU GeGLU
نرمال‌سازی LayerNorm Pre-norm RMSNorm
اتنشن کاملاً چگال (Dense) ترکیب متناوب محلی (128) + سراسری
طول پنجره‌ی بافت 512 8192
توکنایزر WordPiece BPE

علاوه بر این، برخلاف ساختار سال 2018، این نسخه به‌شکل نیتیو از Flash Attention پشتیبانی می‌کند. سرعت استنتاج آن در طول توالی 8K حدود 2 تا 3 برابر DeBERTa-v3 است و امتیازهای بهتری هم در بنچمارک GLUE می‌گیرد.

تسک‌هایی که هنوز هم در سال 2026 سراغ انکودر می‌روند

تسک چرا انکودر از دیکودر بهتر عمل می‌کند؟
امبدینگ‌های بازیابی / جستجوی معنایی بافت دوطرفه = کیفیت امبدینگ بهتر به‌ازای هر توکن
دسته‌بندی (احساسات، نیت، سمیت محتوا) یک گذر رو به جلو؛ بدون سربار تولید متن
NER / برچسب‌گذاری توکن‌ها خروجی به‌ازای هر موقعیت، ذاتاً دوطرفه
استلزام معنایی زیروشات (NLI) سربرگ دسته‌بند روی انکودر
بازرتبه‌بند (Reranker) در معماری RAG امتیازدهی کراس‌ان‌کودر، 10 برابر سریع‌تر از بازرتبه‌بندهای مبتنی بر LLM
بلاک ترنسفورمرتغییر وضعیت اتصال مانده (residual)
TRANSFORMER BLOCKA transformer block is two sublayers: self-attention, then a feed-forward network, each wrapped in add-and-norm. The dashed lines are the residual skips that carry the input x forward and add it back after each sublayer. Those skips are what let hundreds of blocks stack without the gradient dying on the way down.self-attentionadd & normFFNadd & normx inx out
یک بلاک ترنسفورمر از دو زیرلایه تشکیل شده است: خود‌اتنشن (self-attention) و سپس یک شبکه پیش‌خور (feed-forward)، که هر دو با عملیات جمع و نرمال‌سازی (add-and-norm) احاطه شده‌اند. خطوط چین‌چین، اتصالات مانده (residual skips) هستند که ورودی x را به جلو منتقل کرده و پس از هر زیرلایه مجدداً با آن جمع می‌کنند. همین اتصالات هستند که امکان روی هم قرار گرفتن صدها بلاک را بدون محو شدن گرادیان در مسیر برگشت فراهم می‌کنند.

ساخت از صفر

مرحله‌ی 1: منطق ماسک‌گذاری

فایل code/main.py را ببینید. تابع create_mlm_batch فهرستی از شناسه‌های توکن، اندازه‌ی دایره‌ی واژگان (vocab size) و احتمال ماسک‌گذاری را می‌گیرد. این تابع شناسه‌های ورودی (با ماسک‌های اِعمال‌شده) و لیبل‌ها را برمی‌گرداند؛ لیبل‌ها فقط در موقعیت‌های ماسک‌شده مقدار دارند و در بقیه‌ی جاها طبق قرارداد PyTorch برای نادیده‌گرفتن ایندکس، برابر با 100- هستند.

def create_mlm_batch(tokens, vocab_size, mask_prob=0.15, rng=None):
    input_ids = list(tokens)
    labels = [-100] * len(tokens)
    for i, t in enumerate(tokens):
        if rng.random() < mask_prob:
            labels[i] = t
            r = rng.random()
            if r < 0.8:
                input_ids[i] = MASK_ID
            elif r < 0.9:
                input_ids[i] = rng.randrange(vocab_size)
            # در غیر این صورت: حالت اصلی حفظ شود
    return input_ids, labels

مرحله‌ی 2: اجرای پیش‌بینی MLM روی یک پیکره‌ی کوچک

یک انکودر 2 لایه را به‌همراه سربرگ MLM روی واژگانی با 20 کلمه و 200 جمله آموزش دهید. بدون گرادیان — فقط صحت گذر رو به جلو را بررسی می‌کنیم. آموزش کامل به PyTorch نیاز دارد.

مرحله‌ی 3: مقایسه‌ی انواع ماسک

نشان دهید که قاعده‌ی سه‌گانه چگونه مدل را بدون [MASK] هم کاربردی نگه می‌دارد. پیش‌بینی را یک بار روی جمله‌ای بدون ماسک و بار دیگر روی جمله‌ی ماسک‌دار انجام دهید. هر دو حالت باید توزیع‌های معقولی از توکن‌ها بسازند؛ چون مدل در زمان آموزش هر دو الگو را دیده است.

مرحله‌ی 4: فاین‌تیون سربرگ

سربرگ MLM را با یک سربرگ دسته‌بندی روی یک مجموعه‌داده‌ی اسباب‌بازی تحلیل احساسات جایگزین کنید. فقط سربرگ آموزش می‌بیند؛ انکودر فریز است. تمام کاربردهای BERT از همین الگو پیروی می‌کنند.

استفاده‌ی عملی

from transformers import AutoModel, AutoTokenizer

tok = AutoTokenizer.from_pretrained("answerdotai/ModernBERT-base")
model = AutoModel.from_pretrained("answerdotai/ModernBERT-base")

text = "Attention is all you need."
inputs = tok(text, return_tensors="pt")
out = model(**inputs).last_hidden_state   # (1, N, 768)

مدل‌های امبدینگ همان BERT فاین‌تیون‌شده هستند. مدل‌های کتابخانه‌ی sentence-transformers مثل all-MiniLM-L6-v2 در واقع مدل‌های BERT هستند که با تابع زیان کنتراستیو آموزش دیده‌اند. انکودر همان است؛ تابع زیان تغییر کرده است.

بازرتبه‌بندهای کراس‌ان‌کودر هم BERTهای فاین‌تیون‌شده‌اند. دسته‌بندی جفتی روی ساختار [CLS] query [SEP] doc [SEP]. اتنشن دوطرفه میان پرس‌وجو (query) و سند (doc) دقیقاً همان چیزی است که به کراس‌ان‌کودرها برتری کیفی نسبت به بای‌انکودرها می‌دهد.

چه زمانی در سال 2026 سراغ BERT نرویم؟ هر تسک تولیدی (generative). انکودر هیچ روش معقولی برای تولید توکن‌ها به‌شکل خودبازگشتی (autoregressive) ندارد. همچنین: در مدل‌های زیر 1 میلیارد پارامتر که یک دیکودر کوچک می‌تواند همان کیفیت را با انعطاف‌پذیری بیشتری تحویل دهد (مانند Phi-3-Mini یا Qwen2-1.5B).

پیاده‌سازی نهایی

فایل outputs/skill-bert-finetuner.md را ببینید. این مهارت، دامنه‌ی کار فاین‌تیونینگ BERT را برای یک تسک جدید دسته‌بندی یا استخراج تعیین می‌کند (انتخاب بک‌بون، مشخصات سربرگ، داده‌ها، ارزیابی و توقف آموزش).

تمرین‌ها

  1. ساده. اسکریپت code/main.py را اجرا کنید و توزیع ماسک را روی 10,000 توکن نمایش دهید. مطمئن شوید حدود 15% از توکن‌ها انتخاب شده‌اند و از میان آن‌ها نزدیک به 80% تبدیل به [MASK] می‌شوند.
  2. متوسط. ماسک‌گذاری کل کلمه (Whole-word masking) را پیاده کنید: اگر کلمه‌ای به چند زیرکلمه شکسته شده است، تمام زیرکلمه‌های آن را با هم ماسک کنید یا هیچ‌کدام را ماسک نکنید. بررسی کنید آیا این کار دقت MLM را روی یک مجموعه‌داده‌ی 500 جمله‌ای بهبود می‌دهد یا خیر.
  3. سخت. یک مدل BERT بسیار کوچک (2 لایه، d=64) را روی 10,000 جمله از یک مجموعه‌داده‌ی عمومی آموزش دهید. سپس توکن [CLS] را برای تحلیل احساسات SST-2 فاین‌تیون کنید. عملکرد آن را با یک بیس‌لاینِ صرفاً دیکودر (decoder-only) با تعداد پارامتر برابر مقایسه کنید — کدام‌یک برنده می‌شود؟

اصطلاحات کلیدی

اصطلاح آنچه می‌گویند معنای واقعی آن
MLM «مدل‌سازی زبان پوشانده‌شده» سیگنال آموزش: جایگزینی تصادفی 15% از توکن‌ها با [MASK] و پیش‌بینی موارد اصلی.
Bidirectional «به هر دو طرف نگاه می‌کند» اتنشن انکودر هیچ ماسک علیتی ندارد — هر جایگاه همه‌ی موقعیت‌های دیگر را می‌بیند.
[CLS] «توکن پولر» توکن خاصی که اول هر توالی قرار می‌گیرد؛ امبدینگ نهایی آن به‌عنوان بازنمایی سطح جمله استفاده می‌شود.
[SEP] «جداکننده‌ی سگمنت» جفت توالی‌ها را از هم جدا می‌کند (مثلاً پرس‌وجو/سند، جمله‌ی A/B).
NSP «پیش‌بینی جمله‌ی بعدی» تسک دوم پیش‌آموزش BERT؛ نشان داده شد که در RoBERTa بی‌فایده است و پس از سال 2019 کنار گذاشته شد.
Fine-tuning «سازگار کردن با یک تسک» ثابت نگه داشتن بخش اعظم انکودر؛ آموزش یک سربرگ کوچک روی آن برای تسک پایین‌دستی.
Cross-encoder «یک بازرتبه‌بند» مدلی از جنس BERT که پرس‌وجو و سند را با هم به‌عنوان ورودی می‌گیرد و یک امتیاز مرتبط بودن تحویل می‌دهد.
ModernBERT «بازنگری 2024» بازسازی انکودر با RoPE ،RMSNorm ،GeGLU، اتنشن متناوب محلی/سراسری و طول بافت 8K.

برای مطالعه‌ی بیشتر

سؤالات متداول

تفاوت اصلی روش یادگیری BERT با مدل‌های GPT چیست؟

مدل‌های خانواده GPT کلمه‌ی بعدی را به‌صورت علیتی پیش‌بینی می‌کنند، در حالی که BERT کلمات پنهان‌شده (ماسک‌شده) را با نگاه هم‌زمان به کلمات قبل و بعد (بافت دوطرفه) حدس می‌زند.

چرا در BERT تمام 15 درصد توکن‌ها با [MASK] جایگزین نمی‌شوند؟

چون در زمان استنتاج توکن [MASK] وجود ندارد. برای جلوگیری از جابه‌جایی توزیع (Distribution Shift)، 80 درصد به [MASK]، 10 درصد به توکن تصادفی و 10 درصد بدون تغییر می‌مانند.

چه تسک‌هایی هنوز در سال 2026 به‌جای دیکودر باید با انکودر BERT اجرا شوند؟

تسک‌هایی مثل دسته‌بندی متن، جستجوی معنایی و امبدینگ‌ها، بازشناسی موجودیت‌های نام‌دار (NER) و بازرتبه‌بندی (Reranking) در معماری RAG به دلیل سرعت 5 تا 10 برابری و کیفیت بافت دوطرفه با انکودر بسیار بهینه‌ترند.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.