جلال بعد از مشاهده نتایج آزمایشهایی که احسان در سوال اول روی مدل برت *[(HooshvareLab/bert-fa-zwnj-base)](https://huggingface.co/HooshvareLab/bert-fa-zwnj-base)* انجام داده بود این ایده به ذهنش رسید که برخی از بلوکهای مدل را حذف کند تا مدل کوچکتر و سریعتر شود، اما طبیعی است که با این کار مدل به درستی کار نخواهد کرد و نیاز به تنظیمدقیق (fine-tuning) مجدد دارد. برای اینکار جلال فقط ایدهی پردازی کرده است و از شما میخواهد پیادهسازی ایدههایش را انجام دهید.
جلال از شما میخواهد، از مدل پایه فقط لایههای شماره صفر، ۴، ۸ و ۱۱ را نگهدارید و بقیه را حذف کنید. جالب است که در نهایت جلال اسم این مدل را «جلالبرت» گذاشت!
ابتدا به عنوان **مدل پایه (baseline)** تصمیم به ارزیابی «جلالبرت» گرفت و برای این کار به ازاء تمام توکنهایی که در *Tokenizer* مدل وجود داشت خروجی **لایه آخر** را با خروجی **لایه آخر مدل هوشواره** مقایسه کرد و میانگین تابع هزینه را بر اساس تابع **Kullback-Leibler Divergence** و **MSE** به طور جداگانه محاسبه کرد.
سپس تصمیم به تنظیمدقیق مدل گرفت.این تنظیم دقیق به صورت **لایه به لایه (layer-wise)** انجام میشود. توجه کنید که تناظر زیر بین لایه های مدل هوشواره و «جلالبرت» وجود دارد:
| شماره لایه در برت هوشواره | شماره لایه در «جلالبرت» |
|:-:|:-:|
| لایه صفر| لایه صفر|
| لایه چهارم| لایه اول|
| لایه هشتم| لایه دوم|
| لایه یازدهم| لایه سوم|
برای سادگی و کاهش هزینه در این مرحله، ورودی مدل برای تنظیم دقیق، همان توکنهای موجود در *Tokenizer* مدل هستند.
برای تنظیمدقیق لایه $i$ام از «جلالبرت» که $i=1,2,3,4$ است، ابتدا وزن لایههای قبل را ثابت نگه میداریم (**freeze**) و سپس **تابع هزینه (loss)** را بین خروجی این لایه و لایه متناظرش در مدل برت هوشواره محاسبه و با فرایند **انتشار رو به عقب (backpropagation)** وزنهای آن لایه را بهروزرسانی میکنیم. این کار را از $i=1$ شروع میکنیم و تا $i=4$ ادامه میدهیم. مجدداً توجه شود که در حین تنظیمدقیق یک لایه باید وزن تمام لایههای قبل از آن ثابت نگه داشته شوند.
تمام این مراحل را یکبار با تابع هزینه **میانگین مربعات خطا (MSE)** و بار دیگر با تابع هزینه **Kullback-leibler Divergence** انجام میدهیم.
برای تنظیم دقیق با استفاده از تابع هزینه **Kullback-leibler Divergence** در صورت استفاده از تابع هزینه کتابخانه `pytorch` برچسبها (*labels*) را از تابع `softmax` و پیش بینیها (*predictions*) را از تابع `log_softmax` عبور دهید. در کتابخانههای دیگر طبق مستندات کتابخانه مشابه این کار را انجام دهید.
برای تنظیم دقیق هر لایه از تنظیمات زیر استفاده کنید:
```python
Num_epoch = 10
Optimizer = Adam
Learning_rate = 2e-5
Batch_size = 32
```
## خروجی نهایی
بعد از انجام تنظیمدقیق، یک پوشه به نام `model` بسازید و دو پوشه `kld` و `mse` داخل آن ایجاد کرده و هر کدام از مدلها را در پوشه مربوط به خود قرار دهید و بعد از فشرده کردن پوشه آن را با نام `model.zip` در گوگل درایو خود آپلود کنید (جهت سهولت ارسال)، سپس لینک اشتراک فایل را (فراموش نکنید که دسترسی اشتراک لینک به صورت view داشته باشد) در یک فایل solution.txt قرار دهید و این فایل را برای داوری ارسال کنید.
یعنی تنها ارسال شما یک فایل solution.txt خواهد بود که لینک فایل `model.zip` آپلود شده در گوگل درایو را در خود دارد.
حجم هر مدل ارسالی حداکثر ۲۷۰ مگابایت باید باشد و با قطعه کد زیر قابل بارگذاری و استفاده باشد:
```python
from transformers import AutoModel
model = AutoModel.from_pretrained(“path/to/your/model/folder”)
output = model(input_ids=input_ids, attention_mask=attention_mask, token_type_ids= token_type_ids)
```
ضمناً خروجی لایه صفر و ۱ و ۲ و ۳ مدل برت ۴ لایه شما به ترتیب به صورت زیر برای محاسبه تابع هزینه باید قابل دسترسی باشد:
```python
output_of_layer_i = output.hidden_states[i+1]
```
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.