چگونه یک مدل BERT را از ابتدا آموزش دهیم

گره منبع: 1013329

چگونه یک مدل BERT را از ابتدا آموزش دهیم

با پسر عموی ایتالیایی BERT، FiliBERTo آشنا شوید.


By جیمز بریگز، دانشمند داده



BERT، اما در ایتالیا - تصویر توسط نویسنده

 

بسیاری از مقالات من بر BERT متمرکز شده اند - مدلی که آمد و بر دنیای پردازش زبان طبیعی (NLP) مسلط شد و عصر جدیدی را برای مدل های زبان رقم زد.

برای کسانی از شما که ممکن است قبلا از مدل های ترانسفورماتور استفاده نکرده باشید (مثلا BERT چیست)، این روند کمی شبیه به این است:

  • pip install transformers
  • راه اندازی یک مدل ترانسفورماتور از قبل آموزش دیده - from_pretrained.
  • آن را روی برخی از داده ها تست کنید.
  • شاید مدل را دقیق تنظیم کنید (مقداری دیگر آموزش دهید).

اکنون، این یک رویکرد عالی است، اما اگر فقط این کار را انجام دهیم، درک درستی از ایجاد مدل‌های ترانسفورماتور خود نداریم.

و اگر نتوانیم مدل‌های ترانسفورماتور خودمان را بسازیم - باید به وجود یک مدل از پیش آموزش‌دیده که متناسب با مشکل ما باشد تکیه کنیم، همیشه اینطور نیست:



چند نظر در مورد مدل های غیر انگلیسی BERT پرسیده می شود

 

بنابراین در این مقاله، مراحلی را که باید برای ساخت مدل ترانسفورماتور خودمان انجام دهیم - به ویژه نسخه توسعه‌یافته‌تر BERT به نام RoBERTa را بررسی می‌کنیم.

یک مرور کلی

 
 
چند مرحله برای این فرآیند وجود دارد، بنابراین قبل از اینکه وارد آن شویم، اجازه دهید ابتدا آنچه را که باید انجام دهیم، خلاصه کنیم. در کل، چهار بخش کلیدی وجود دارد:

  • گرفتن داده ها
  • ساخت توکنایزر
  • ایجاد خط لوله ورودی
  • آموزش مدل

وقتی روی هر یک از این بخش‌ها کار کردیم، توکنایزر و مدلی را که ساخته‌ایم می‌گیریم - و هر دو را ذخیره می‌کنیم تا بتوانیم به همان روشی که معمولاً استفاده می‌کنیم از آنها استفاده کنیم. from_pretrained.

دریافت داده ها

 
 
مانند هر پروژه یادگیری ماشینی، ما به داده نیاز داریم. از نظر داده‌ها برای آموزش یک مدل ترانسفورماتور، ما واقعاً برای انتخاب مشکل داریم - تقریباً می‌توانیم از هر داده متنی استفاده کنیم.



راهنمای ویدیویی برای دانلود مجموعه داده OSCAR با استفاده از کتابخانه مجموعه داده HuggingFace

 

و اگر چیزی وجود داشته باشد که در اینترنت به وفور وجود داشته باشد - آن داده های متنی بدون ساختار است.

یکی از بزرگترین مجموعه داده ها در حوزه متن خراشیده شده از اینترنت، مجموعه داده OSCAR است.

مجموعه داده OSCAR دارای تعداد زیادی زبان مختلف است - و یکی از واضح ترین موارد استفاده برای آموزش از ابتدا این است که ما می توانیم BERT را برای برخی از زبان های کمتر مورد استفاده مانند تلوگو یا ناواهو اعمال کنیم.

متأسفانه، تنها زبانی که می‌توانم با هر درجه‌ای از صلاحیت صحبت کنم، انگلیسی است - اما دوست دخترم ایتالیایی است، و بنابراین او - لورا، نتایج مدل BERT ایتالیایی زبان ما - FiliBERTo را ارزیابی خواهد کرد.

بنابراین، برای دانلود بخش ایتالیایی مجموعه داده OSCAR، از HuggingFace استفاده خواهیم کرد datasets کتابخانه - که می توانیم با آن نصب کنیم pip install datasets. سپس ما OSCAR_IT را با:

بیایید نگاهی به dataset هدف - شی.

عالی است، حالا اجازه دهید داده های خود را در قالبی ذخیره کنیم که بتوانیم هنگام ساختن توکنیزر خود از آن استفاده کنیم. ما باید مجموعه‌ای از فایل‌های متن ساده ایجاد کنیم که فقط شامل فایل‌های متنی باشد text ویژگی از مجموعه داده ما، و ما هر کدام را تقسیم می کنیم نمونه با استفاده از خط جدید n.

در ما data/text/oscar_it دایرکتوری را خواهیم یافت:


یک اسکرین شات که پنجره اکسپلورر ویندوز پر از فایل‌های txt را نشان می‌دهد - که نشان دهنده داده‌های OSCAR متن ساده است.
دایرکتوری حاوی فایل های OSCAR متن ساده ما

 

ساخت توکنایزر

 
 
بعدی توکنایزر است! هنگام استفاده از ترانسفورماتور، ما معمولاً یک توکنایزر را در کنار مدل ترانسفورماتور مربوطه بارگذاری می‌کنیم - توکنایزر یک جزء کلیدی در این فرآیند است.



راهنمای تصویری برای ساخت توکنایزر سفارشی ما

 

هنگام ساخت توکنایزر خود، تمام داده‌های OSCAR خود را به آن می‌دهیم، اندازه واژگان خود (تعداد نشانه‌ها در توکنایزر) و هر توکن خاصی را مشخص می‌کنیم.

اکنون، توکن های ویژه RoBERTa به شکل زیر هستند:

بنابراین، ما مطمئن می شویم که آنها را در داخل قرار دهیم special_tokens پارامتر توکنایزر ما train فراخوانی روش

توکنایزر ما اکنون آماده است و می‌توانیم فایل آن را برای استفاده بعدی ذخیره کنیم:

اکنون دو فایل داریم که جدید ما را تعریف می کنند FiliBERTo توکن ساز:

  • merges.txt - نگاشت اولیه متن به نشانه ها را انجام می دهد
  • vocab.json - توکن ها را به شناسه های توکن نگاشت می کند

و با این موارد، می‌توانیم به مقداردهی اولیه توکنایزر خود ادامه دهیم تا بتوانیم از آن مانند سایر موارد استفاده کنیم. from_pretrained توکن ساز

راه اندازی Tokenizer

 
 
ما ابتدا توکنایزر را با استفاده از دو فایلی که قبلا ساختیم - با استفاده از یک فایل ساده، مقداردهی اولیه می کنیم from_pretrained:

اکنون توکنایزر ما آماده است، می توانیم متنی را با آن رمزگذاری کنیم. هنگام رمزگذاری از همان دو روشی که معمولاً استفاده می کنیم استفاده می کنیم. encode و encode_batch.

از شی کدگذاری tokens ما استخراج خواهیم کرد input_ids و attention_mask تانسور برای استفاده با FiliBERTo.

ایجاد خط لوله ورودی

 
 
خط لوله ورودی فرآیند آموزش ما، بخش پیچیده‌تری از کل فرآیند است. این شامل این است که ما داده های آموزشی OSCAR خام خود را می گیریم، آنها را تبدیل می کنیم و در یک بارگذاری می کنیم DataLoader آماده برای آموزش



تصویری از خط لوله ورودی MLM

 

آماده سازی داده ها

 
 
ما با یک نمونه شروع می کنیم و از طریق منطق آماده سازی کار می کنیم.

ابتدا باید فایل خود را باز کنیم - همان فایل هایی که ذخیره کرده ایم کلیپ برد چند منظوره فایل های قبلی هر کدام را بر اساس کاراکترهای خط جدید تقسیم کردیم n همانطور که این نمونه ها را نشان می دهد.

سپس داده های خود را با استفاده از رمزگذاری می کنیم tokenizer - مطمئن شوید که پارامترهای کلیدی مانند max_lengthpaddingو truncation.

و اکنون می‌توانیم به سمت ایجاد تانسورهای خود حرکت کنیم - مدل خود را از طریق مدل‌سازی با زبان نقاب‌دار (MLM) آموزش خواهیم داد. بنابراین، ما به سه تانسور نیاز داریم:

  • input_ids - ما token_ids با 15٪ از توکن ها با استفاده از نشانه ماسک پوشانده شده اند <mask>.
  • توجه_ماسک - یک تانسور از 1و 0s، علامت‌گذاری موقعیت نشانه‌های «واقعی» / نشانه‌های بالشتکی - در محاسبات توجه استفاده می‌شود.
  • برچسب ها - ما token_ids با نه پوشاندن

اگر با MLM آشنایی ندارید، توضیح دادم اینجا کلیک نمایید.

 attention_mask و labels تانسورها به سادگی از ما استخراج می شوند batch.  input_ids با این حال، تانسورها به توجه بیشتری نیاز دارند، برای این تانسور ما 15٪ از نشانه‌ها را پنهان می‌کنیم - شناسه نشانه را به آنها اختصاص می‌دهیم. 3.

در خروجی نهایی، می‌توانیم بخشی از یک کدگذاری شده را ببینیم input_ids تانسور اولین شناسه توکن است 1 - [CLS] نشانه نقاط دور تانسور ما چندین داریم 3 شناسه های رمزی - اینها به تازگی اضافه شده اند [MASK] نشانه ها

ساخت DataLoader

 
 
بعد، ما خود را تعریف می کنیم Dataset کلاس - که ما از آن برای مقداردهی اولیه سه تانسور کدگذاری شده خود به عنوان PyTorch استفاده می کنیم torch.utils.data.Dataset اشیاء.

در نهایت، ما dataset در PyTorch بارگذاری می شود DataLoader شی - که از آن برای بارگذاری داده های خود در مدل خود در طول آموزش استفاده می کنیم.

آموزش مدل

 
 
ما برای تمرین به دو چیز نیاز داریم DataLoader و یک مدل را DataLoader ما داریم - اما مدل نداریم.



مقداردهی اولیه مدل

 
 
برای آموزش، به یک خام (نه از قبل آموزش دیده) نیاز داریم. BERTLMHeadModel. برای ایجاد آن، ابتدا باید یک شی پیکربندی RoBERTa ایجاد کنیم تا پارامترهایی را که می‌خواهیم FiliBERTo را مقداردهی اولیه کنیم، توصیف کنیم.

سپس، مدل RoBERTa خود را با یک سر مدل سازی زبان (LM) وارد و مقداردهی اولیه می کنیم.

آماده سازی آموزش

 
 
قبل از حرکت به حلقه آموزشی ما باید چند چیز را تنظیم کنیم. ابتدا، استفاده از GPU/CPU را تنظیم می کنیم. سپس حالت آموزش مدل خود را فعال می کنیم - و در نهایت، بهینه ساز خود را مقداردهی اولیه می کنیم.

آموزش

 
 
در نهایت - زمان آموزش! همانطور که معمولاً هنگام آموزش از طریق PyTorch تمرین می کنیم.

اگر به Tensorboard برویم، با گذشت زمان متوجه ضرر خود خواهیم شد - به نظر امیدوارکننده است.



از دست دادن / زمان - چندین جلسه آموزشی در این نمودار با هم ترکیب شده اند

 

تست واقعی

 
 
اکنون زمان آزمایش واقعی است. ما یک خط لوله MLM راه اندازی کردیم - و از لورا می خواهیم نتایج را ارزیابی کند. نقد و بررسی ویدیویی در ساعت 22:44 را می توانید در اینجا مشاهده کنید:



ابتدا a را مقداردهی اولیه می کنیم pipeline شی، با استفاده از 'fill-mask' بحث و جدل. سپس آزمایش مدل خود را مانند این شروع کنید:

"ciao بیا وا؟" پاسخ درست است! این به اندازه ایتالیایی من پیشرفته است - پس بیایید آن را به لورا بسپاریم.

ما شروع میکنیم "بوونجیورنو، بیا و؟" - یا "روز بخیر، چطوری؟":

اولین پاسخ، "بوونگیو، چی وا؟" یعنی "روز بخیر، کی آنجاست؟" - به عنوان مثال مزخرف. اما، پاسخ دوم ما درست است!

بعد، یک عبارت کمی سخت تر، «چیا، کبوتر چی اینکونتریامو اوگی پومریجیو؟» - یا "سلام، امروز بعدازظهر کجا قرار است ملاقات کنیم؟":

و ما نتایج مثبت دیگری را برمی گردانیم:

✅ "hi, where do we see each other this afternoon?"
✅ "hi, where do we meet this afternoon?"
❌ "hi, where here we are this afternoon?"
✅ "hi, where are we meeting this afternoon?"
✅ "hi, where do we meet this afternoon?"

در نهایت، یک جمله دیگر، سخت تر، «کوزا سارببه پیروز به avessimo scelto un altro giorno؟» - یا "اگر روز دیگری را انتخاب می کردیم چه اتفاقی می افتاد؟":

ما در اینجا نیز چند پاسخ خوب خوب دیگر را برمی گردانیم:

✅ "what would have happened if we had chosen another day?"
✅ "what would have happened if I had chosen another day?"
✅ "what would have happened if they had chosen another day?"
✅ "what would have happened if you had chosen another day?"
❌ "what would have happened if another day was chosen?"

به طور کلی، به نظر می رسد مدل ما تست های لورا را گذرانده است - و ما اکنون یک مدل زبان ایتالیایی شایسته به نام FiliBERTo داریم!

این برای این مرحله از آموزش یک مدل BERT از ابتدا!

ما زمینه های زیادی را پوشش داده ایم، از دریافت و قالب بندی داده های خود - تا استفاده از مدل سازی زبان برای آموزش مدل خام BERT.

امیدوارم از این مقاله لذت برده باشید! اگر سوالی دارید، از طریق به من اطلاع دهید توییتر یا در نظرات زیر اگر محتوای بیشتری از این دست می‌خواهید، من پست می‌کنم یوتیوب بیش از حد.

تشکر برای خواندن!

 

70% تخفیف! پردازش زبان طبیعی: NLP با ترانسفورماتور در پایتون

مدل های ترانسفورماتور استاندارد واقعی در NLP مدرن هستند. آنها خود را به عنوان رساترین…
 

*همه تصاویر متعلق به نویسنده هستند، به جز مواردی که خلاف آن ذکر شده باشد

 
بیوگرافی: جیمز بریگز یک دانشمند داده متخصص در پردازش زبان طبیعی و کار در بخش مالی، مستقر در لندن، انگلستان است. او همچنین یک مربی مستقل، نویسنده و تولید کننده محتوا است. می توانید از طریق ایمیل با نویسنده (jamescalam94@gmail.com).

اصلی. مجدداً با اجازه دوباره ارسال شد.

مرتبط:

منبع: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

تمبر زمان:

بیشتر از kdnuggets