آموزش پردازش زبان طبیعی با اکوسیستم هاگینگ فیس ؛ مدل ها (قسمت سوم فصل دوم)
ساخت و استفاده از مدل در این بخش به طور جامع توضیح داده خواهد شد. در این راستا، از کلاس TFAutoModel استفاده خواهیم کرد. هر گاه تصمیم به نمایش یک مدل از چکپوینت موجود داشته باشید، کلاس فوق میتواند مفید واقع شود. اگر با نوع مدلی که قصد استفاده از آن را دارید به خوبی آشنا باشید، میتوانید از کلاسی استفاده کنید که معماریاش را به طور مستقیم تعریف میکند. بگذارید نحوهی عمل این روش را در مدل برت بررسی کنیم.
ایجاد ترنسفورمر
اولین اقدام برای راهاندازی مدل برت این است که یک شیء از کانفیگ configuration object بارگذاری کنیم:
from transformers import BertConfig, TFBertModel # Building the config config = BertConfig() # Building the model from the config model = TFBertModel(config)
این کانفیگ حاوی ویژگیهای بسیاری است که برای ساخت مدل استفاده میشوند:
print(config)
.
BertConfig { [...] "hidden_size": 768, "intermediate_size": 3072, "max_position_embeddings": 512, "num_attention_heads": 12, "num_hidden_layers": 12, [...] }
چون تا بدینجای کار نمیدانید که این ویژگیها چه کارکردی دارند، باید برخی از آنها را بشناسید. ویژگی «hidden_size» اندازه بردار «hidden_states» را تعریف میکند، اما «num_hidden_layers» تعداد لایههای مدل ترنسفورمر را تعریف میکند.
[irp posts=”20237″]روشهای بارگذاری مختلف
ساخت مدل از پیکربندی پیشفرض آن را با مقادیر تصادفی راه میاندازد:
from transformers import BertConfig, TFBertModel config = BertConfig() model = TFBertModel(config) # Model is randomly initialized!
مدل میتواند در این حالت استفاده شود، اما خروجی مناسبی نخواهد داشت. در ابتدا باید آموزشهای لازم را ببیند. امکان آموزش مدل از همان نقطهی اول نیز وجود دارد. اما آنطور که در فصل اول ملاحظه کردید (لینک دسترسی به همه قسمتهای این دوره آموزشی در انتهای مطلب قرار دارد)، این کار به زمان و دادههای بسیاری نیاز دارد. برای اینکه از کارهای تکراری و غیرضروری پرهیز کنیم، باید مدلهای آموزش دیده را به اشتراک گذاشته و مجدداً از آنها استفاده کنیم. بارگذاری مدل ترنسفورمری که از پیش آموزش دیده، کار آسانی است. این کار با روش from_pretrained قابل انجام است:
from transformers import TFBertModel model = TFBertModel.from_pretrained("bert-base-cased")
همانطور که پیشتر مشاهده کردید، امکان جایگزینسازی TFBertModel با کلاس TFAutoModel وجود دارد. از این به بعد باید این اقدام را در دستور کارمان قرار دهیم. اگر کدتان برای یک چکپوینت در نظر گرفته شده است، باید با چکپوینت دیگر نیز بدون مشکل عمل کند. حتی در صورتی که معماری متفاوت باشد، این عمل موثر واقع میشود (البته در صورتی که چکپوینت برای کار مشابهی آموزش دیده باشد؛ مثلاً عمل تحلیل احساسات).
در نمونه کد بالا، از BertConfig استفاده نشد؛ بلکه یک مدلِ از پیش آموزش یافته با استفاده از bert-base-cased بارگذاری شد. این یک چکپوینت نمونه است که به دست نویسندگان برت آموزش یافته است. جزئیات بیشتر در کارت مدل قرار داده شده است. این مدل با تمامی وزنهای چکپوینت به اجرا درمیآید و امکان استفاده مستقیم از آن برای نتیجهگیری وجود دارد. همچنین، در کارهای جدید نیز به طور دقیق تنظیم Fine-tune میشود. زمانی میتوان به نتایج خوبی دست پیدا کرد که از وزنهایِ از پیش آموزش یافته برای پیادهسازی عمل آموزش استفاده کنیم.
وزنها دانلود شده و در پوشه «cache» ذخیره شدهاند. میتوانید پوشه اختصاصی خودتان را با تنظیم متغیر محیط HF_HOME ایجاد کنید. نام استفاده شده برای بارگذاری مدل میتواند نام هر مدلی در Model Hub باشد؛ به شرطی که با معماری برت سازگار باشد. کل لیست چکپوینتهای برت در این لینک قرار داده شده است.
روشهای ذخیرهسازی
ذخیرهسازی مدل نیز مثل بارگذاری آن ساده است. باید از روش save_pretrained برای انجام این کار استفاده کرد که شباهت بسیاری به روش from_pretrained دارد:
model.save_pretrained("directory_on_my_computer")
این کار باعث ذخیرهسازی دو فایل در دیسک میشود:
ls directory_on_my_computer config.json tf_model.h5
اگر به فایل config.json نگاه کنید، با ویژگیهای لازم برای ساخت معماری مدل آشنا خواهید شد. این فایل حاوی متاداده نیز میباشد؛ برای نمونه، منشاء چکپوینت و نسخه ترنسفورمر مورد استفاده در هنگام ذخیره چکپوینت آخر از جمله این دادهها هستند. فایل tf_model.h5 با عنوان state dictionary شناخته میشود و دربرگیرندهی کلیه وزنهای مدل است. این دو فایل بارها و بارها به کار برده میشوند. این نوع پیکربندی برای شناخت معماری مدل ضروری است، اما وزنهای مدل پارامترهای مدل شما هستند.
استفاده از مدل ترنسفورمر برای استنباط
حال که با نحوهی بارگذاری و دخیرهی مدل آشنا شدهاید، زمان استفاده از آن برای انجام پیشبینی فرا رسیده است. مدلهای ترنسفورمر فقط قادر به پردازش اعداد هستند؛ اعدادی که توکنکننده تولید میکند. اما پیش از آنکه درباره توکنکنندهها بحث کنیم، بیایید ببینیم مدل چه نوع ورودیهایی را میپذیرد. توکنکنندهها میتوانند ورودیها را در اختیار تنسورهای چارچوب مناسب قرار دهند. برای اینکه درک عمیقتری درباره این موضوع به دست آورید، باید ببینیم انجام چه کاری پیش از ارسال ورودی به مدل ضرورت دارد. فرض کنید چند توالی داریم:
sequences = [ "Hello!", "Cool.", "Nice!" ]
توکنکننده اینها را به شاخصهای واژگانی تبدیل میکند که معمولاً input Ids نام دارند. هر توالی لیستی از اعداد است. خروجی نهایی به ترتیب زیر است:
encoded_sequences = [ [ 101, 7592, 999, 102], [ 101, 4658, 1012, 102], [ 101, 3835, 999, 102] ]
لیستی از توالیهای رمزگذاری شده در زیر آورده شده است. تنسورها فقط اَشکال مستطیلی (ماتریسی فکر کنید!) را میپذیرند. آرایه بالا شکل مستطیلی دارد؛ بنابراین، تبدیل آن به تنسور کار آسانی است:
import tensorflow as tf model_inputs = tf.constant(encoded_sequences)
استفاده از تنسورها به عنوان ورودی مدل
تنسورها به آسانی در مدلها به کار برده میشوند. مدل با ورودیهای آن فراخوانی میشود:
output = model(model_inputs)
مدل پذیرایِ آرگومانهای بسیار متفاوتی است، اما فقط input IDها ضرورت دارند. در فصول بعد به توضیح کارکرد سایر آرگومانها و زمان نیاز به آنها خواهیم پرداخت. اما در ابتدا باید نگاه دقیقتری به توکنکنندهها بیندازیم.
از طریق لینک زیر میتوانید به قسمتهای دیگر دوره آموزشی پردازش زبان طبیعی دسترسی داشته باشید:
[button href=”https://hooshio.com/%D8%B1%D8%B3%D8%A7%D9%86%D9%87-%D9%87%D8%A7/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B7%D8%A8%DB%8C%D8%B9%DB%8C/” type=”btn-default” size=”btn-lg”]آموزش پردازش زبان طبیعی[/button]