احسان تصمیم دارد به منظور اجرای مدل برت فارسی (*[HooshvareLab/bert-fa-zwnj-base](https://huggingface.co/HooshvareLab/bert-fa-zwnj-base)*) یکی از روشهای هرس کردن یا گسستهسازی را به کار بگیرد. او حدس میزند که برخی از لایهها یا هدهای مدل برت نقش زیادی در تولید خروجی ندارند.
احسان از درس یادگیری ماشین متوجه شده که ویژگیهایی که در نمونههایی با برچسبهای متفاوت، مقدار یکسانی دارند، احتمالا ویژگی مناسبی برای طراحی یک مدل طبقهبند (*Classifier*) نیستند. و با توجه به این موضوع تصمیم گرفته است، یک آزمایش طراحی و لایهها و هدها را براساس میزان اهمیتشان در تولید خروجی دستهبندی کند.
برای پیادهسازی این آزمایش به احسان کمک کنید:
## بخش اول
به ازاء تک تک توکنهایی که در *Tokenizer* برت موجود است، بردار *Embedding* مربوط به همان یک توکن را در هر **لایه** رمزگذار (*Encoder*) محاسبه کنید و سپس مقدار *IQR* مربوط به پراکندگی ماکزیمم قدرمطلق (*MaxAbs*) درایههای آن بردار را برای کل توکنها بدست آورید.
<details class="violet">
<summary>**توضیح بیشتر**</summary>
تک تک توکنها را بعد از عبور دادن از لایه *Embedding* به اولین لایه رمزگذار بدهید و بردار *Embedding* مربوط به همان توکن را گرفته و ماکزیمم قدرمطلق درایههای آن را در نظر بگیرید، سپس برای این مقادیر بهدست آمده برای تک تک توکنها مقدار `IQR` را محاسبه کنید و برای هر لایه در یک فایل `CSV` در ستون اول شماره لایه از صفر تا ۱۱ و در ستون دوم مقدار `IQR` مربوط به آن لایه را گزارش کنید.
</details>
### نمونه خروجی بخش اول
برای خروجی این بخش شما باید یک فایل با نام `result_1.csv` که شامل دو ستون با نامهای `layer_num` و `IQR` میباشد را مطابق خواسته مسئله بارگذاری کنید. جدول زیر چند سطر اولیه از نمونهی خروجی میباشد. (دقت داشته باشید که این اعداد برای نمونه هستند و الزامی به درستی آنها نیست)
|layer_num|IQR|
|:-:|:-:|
|0|2.102|
|1|3.253|
|2|1.098|
## بخش دوم
احسان پس از انجام مرحلهی اول آزمایش، یک مرحله جدیدی را طراحی کرده است، در این مرحله شما باید **دقیقا مشابه کاری که در قسمت قبل انجام شده** را برای هر کدام از **هدها** در هر لایه انجام دهید و در یک فایل `CSV` در ستون اول شماره لایه از صفر تا ۱۱ و در ستون دوم شماره هد از صفر تا ۱۱ و در ستون سوم نیز مقدار `IQR` مربوط به آن هد را گزارش کنید.
### نمونه خروجی بخش دوم
برای خروجی این بخش شما باید یک فایل با نام `result_2.csv` که شامل سه ستون با نامهای `layer_num`، `head_num` و `IQR` میباشد را مطابق خواسته مسئله بارگذاری کنید. جدول زیر چند سطر اولیه از نمونهی خروجی میباشد. (دقت داشته باشید که این اعداد برای نمونه هستند و الزامی به درستی آنها نیست)
<details class="red">
<summary>**توجه!**</summary>
ترتیب ردیفهای جدول ابتدا باید براساس ستون `layer_num` و سپس براساس ستون `head_num` (هردو) بهصورت صعودی، باشد.
</details>
|layer_num|head_num|IQR|
|:-:|:-:|:-:|
|0|0|2.102|
|0|1|3.253|
|0|2|1.098|
## بخش سوم
وزنهای لایه `word_embedding`، هرکدام یک امبدینگ برای توکن های توکنایزر هستند. با توجه به این بردارهای امبدینگ، برای **هر دو** توکن داده شده، میانگین بردارهای امبدینگ را محاسبه کنید و سپس یکبار با استفاده از معیار **فاصله اقلیدسی (Euclidean Distance)** و بار دیگر با استفاده از معیار **شباهت کسینوسی (Cosine Similiraty)** توکنی که بردار مربوط به آن کمترین فاصله را از میانگین این دو توکن دارد بدست آورید:
1. شهر ، روستا
2. تهران ، ایران
3. مرد ، زن
خروجی این مرحله را به صورت یک فایل با نام `result_3.csv` که در ستون اول شماره سوال و در ستون دوم نزدیکترین توکن از نظر فاصله اقلیدسی و در ستون سوم نزدیکترین توکن از نظر شباهت کسینوسی درج شده است، ارسال نمایید.
### نمونه خروجی بخش سوم
نمونه خروجی این بخش به این صورت خواهد بود: (دقت داشته باشید که این اعداد برای نمونه هستند و الزامی به درستی آنها نیست)
|q_id|euclidean|cosine|
|:-:|:-:|:-:|
|1|لندن|پاریس|
|2|پسر|مرد|
## خروجی نهایی
در نهایت برای ارسال پاسخ این سوال سه فایل `result_1.csv` , `result_2.csv` و `result_3.csv` را فشرده (`zip`) کنید و با نام `result.zip` ارسال کنید.