آموزش پردازش زبان طبیعی با اکوسیستم هاگینگ فیس ؛ بررسی جامع پایپ لاین (قسمت دوم فصل دوم)
در این قسمت قرار است بررسی جامعی از پایپ لاین داشته باشیم؛ اما محتوای این بخش قدری با سایر بخشها فرق دارد. بیایید در ابتدای کار این مثال را بررسی کنیم. در زیر خواهید دید که با اجرای کد زیر چه اتفاقی رخ میدهد from transformers import pipeline classifier = pip…
خلاصه تحلیلی خبر
در این قسمت قرار است بررسی جامعی از پایپ لاین داشته باشیم؛ اما محتوای این بخش قدری با سایر بخشها فرق دارد. بیایید در ابتدای کار این مثال را بررسی کنیم. در زیر خواهید دید که با اجرای کد زیر چه اتفاقی رخ میدهد from transformers import pipeline classifier = pip…
موضوعات اصلی: پشتیبانی شبکه، مدل، ورودی، خروجی، زیر، داده
در این قسمت قرار است بررسی جامعی ازپایپ لاینداشته باشیم؛ اما محتوای این بخش قدری با سایر بخشها فرق دارد. بیایید در ابتدای کار این مثال را بررسی کنیم. در زیر خواهید دید که با اجرای کد زیر چه اتفاقی رخ میدهد
from transformers import pipeline classifier = pipeline("sentiment-analysis") classifier([ "I've been waiting for a HuggingFace course my whole life.", "I hate this so much!", ])نتیجه به صورت زیر قابل نمایش میباشد
[{'label': 'POSITIVE', 'score': 0.9598047137260437}, {'label': 'NEGATIVE', 'score': 0.9994558095932007}]همانطور که در فصل 1 (لینک مربوط به قسمتهای دیگر در پایان مطلب قرار داده شده است) ملاحظه کردید، این تابع شامل سه مرحله میباشد: پیشپردازش، درج ورودیها در مدل و پسپردازش. این مراحل به طور جامع توضیح داده خواهند شد.
پیشپردازش با توکنکننده
مدلهای ترنسفورمر به مانند سایر شبکههای عصبی قادر به پردازش مستقیم متن خام نیستند؛ بنابراین، باید در اولین گام ورودیهای متنی را به اعدادی تبدیل کرد تا مدل بتواند با آنها کار کند.توکنکنندهtokenizerبهترین ابزار برای انجام این کار است و مسئولیت انجام کارهای زیر را بر عهده دارد
- تقسیم ورودیها به واژه، زیرواژه یا علائم نگارشی که توکن نامیده میشوند.
- نگاشت هر توکن به یک عدد صحیح
- افزودن ورودیهای بیشتر که ممکن است برای مدل مفید باشد.
کل مرحله پیشپردازش باید با همان رویکردی انجام گیرد که در هنگام پیشآموزشِ مدل اتخاذ شد. لذا، باید اطلاعات لازم را ازModel Hubدانلود کرد. این کار با کلاسAutoTokenizerانجام میپذیرد. در این میان، از روش پیشآموزش یافته نیز کمک گرفته میشود. این ابزار میتواند دادههای مرتبط با توکنکنندهی مدل را به صورت خودکار گردآوری و ذخیره کند. بنابراین، تنها زمانی دانلود میشود که برای اولین بار کد زیر را اجرا کنید.
از آنجا که چکپوینت پیشفرضِپایپ لاین«تحلیل احساساتSentiment analysis» عبارت است ازdistilbert-base-uncased-finetuned-sst-2-englishباید کد زیر را اجرا کرد
from transformers import AutoTokenizer checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" tokenizer = AutoTokenizer.from_pretrained(checkpoint)
حال که توکنکنند موجود میباشد، میتوان به طور مستقیم جملات را به آن برای توکن کردن پاس داد. در این صورت، یک دیکشنری خواهیم داشت که ورودی مدل میباشد. تنها کاری که باقی مانده، این است که لیستشناسههای ورودیinput IDsرا به تنسور تبدیل کنیم. بدون اینکه نگران این موضوع باشید که کدام چارچوب یادگیری ماشین به عنوان بکاِند مورد استفاده قرار میگیرد، از ترنسفورمرها استفاده کنید. ممکن است مدل مد نظرتان پایتورچ، تنسورفلو یا فلکس باشد. مدلهای ترنسفورمر فقط تنسورها را به عنوان ورودی میپذیرند. اگر عبارت «تنسور» برای نخستین بار به گوشتان میخورَد، میتوانید آنها را به عنوان آرایههای NumPy در نظر بگیرید. آرایه NumPy میتواند اسکالر، بردار یا ماتریس باشد و یا دو بُعد بیشتر داشته باشد؛ مطمئناً یک تنسور به حساب میآید. تنسورهای سایر چارچوبهای یادگیری ماشین رفتار مشابهی دارند. از آرگومانreturn_tensorsبرای تعیین نوع تنسورهای مورد نیاز استفاده میشود
raw_inputs = [ "I've been waiting for a HuggingFace course my whole life.", "I hate this so much!", ] inputs = tokenizer(raw_inputs, padding=True, truncation=True, return_tensors="tf") print(inputs)
نگران حاشیهپدpaddingوبرشtruncationدادگان نباشید. این مفاهیم در بخشهای بعدی توضیح داده خواهند شد. باید این موضوع را به خاطر بسپارید که میتوانید جمله یا لیستی از جملات را به توکنکننده پاس بدهید؛ و نوع تنسورهایی را که میخواهید به دست آورید، مشخص کنید(توجه کنید اگر نوع تنوسر مشخص نشود به صورت پیشفرض لیستی از لیستها در نظر
گرفته میشود). در بخش زیر، نتایج مربوط به تنسورهای TensorFlow نشان داده شده است
{ 'input_ids': , 'attention_mask': } خروجی یک نوع دیکشنری است که حاوی دو کلیدinput_idsوattention_maskمیباشد.input_idsدو سطر اعداد صحیح دارد که شناساگر منحصربهفردِ هر توکن در هر جمله میباشند.attention_maskدر بخشهای بعدیِ این فصل توضیح داده خواهد شد.
[irp posts=”12270″]بررسی مدل
به همان شیوهای که در توکنکننده عمل شد، میتوان مدل پیشآموزش داده شده را نیز دانلود کرد. ترنسفورمرها کلاسی به نامTFAutoModelارائه میکنند که ازfrom_pretrainedبهره میبرد.
from transformers import TFAutoModel checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" model = TFAutoModel.from_pretrained(checkpoint)
در این قطعه کد، همان چکپوینتی دانلود شده است که پیشتر درپایپ لاینبه کار گرفته شد. این معماری فقط حاوی ماژول پایه ترنسفورمر است. اگر چند ورودی در اختیارش قرار دهیمحالات پنهانHidden statesیاویژگیهاFeaturesرا به عنوان خروجی ارائه میدهد. در ازای هر ورودی مدل، یک بازنمایی چندبعدی که دارایاطلاعات و دانش مفهوم و محتوای ورودی ترنسفورمرمیباشد. اگر متوجه نشدید، نگران نباشید. توضیحات بیشتر در بخشهای بعدی فصل ارائه خواهد شد.
این حالات پنهان میتوانند به تنهایی مفید واقع شوند، اما معمولاً ورودیِ بخش دیگری از مدل (موسوم به head) هستند. در فصل 1، امکان انجام کارهای مختلف با معماری یکسان وجود داشته است، اما هر کدام از این کارها دارای head متفاوتی خواهند بود.
بردار چندبعدیA high-dimensional vector
خروجی مدل با ماژول ترنسفورمر معمولاً بزرگ است و عموماً دارای سه بُعد میباشد
- اندازه دستهBatch sizeتعداد توالیهای پردازش شده در یک سری.
- طول توالیSequence lengthطول بازنماییهای عددیِ توالی.
- اندازه پنهانHidden sizeبُعد برداریِ هر ورودی مدل.
دلیل انتخاب چنین نامی برای بردار یاد شده، مقدار بعد آخر آن(اندازه پنهان)است. اندازه پنهان میتواند بسیار بزرگ باشد. اگر ورودیهای پیشپردازش شده به مدل اضافه شوند، موضوع فوق به روشنی توضیح داده میشود
outputs = model(inputs) print(outputs.last_hidden_state.shape) . (2, 16, 768)
توجه داشته باشید که خروجی مدلهای ترنسفورمر رفتاری مانندnamedtuples یا دیشکنری دارند. دسترسی به خروجی به شکل (outputs[“last_hidden_state”]) نیز قابل دسترس هستند.
سرهای مدل
سرheadمدل یک بردار با ابعاد بالای حالات پنهان را به عنوان ورودی به کار برده و آنها را در بُعد متفاوتی بازتاب میدهند. سر های مدل معمولاً از یک یاچند لایه خطیlinearتشکیل یافتهاند. خروجی مدل ترنسفورمر به طور مستقیم به سر مدل ارسال میشود تا عمل پردازش بر روی آن صورت گیرد. در این نمودار، مدل با لایه embeddings و لایههای بعدی نمایش داده میشود.
لایه embeddings هر یک از شناسههای ورودی را به برداری تبدیل میکند توکن مربوطه را به نمایش میگذارد. لایههای بعدی آن بردارها را با استفاده از مکانیسم توجه دستکاری میکنند تا بازنمایی نهایی از جملات ایجاد شود. معماریهای بسیار متفاوتی در ترنسفورمرها وجود دارد که هر کدام برای عمل خاصی طراحی شدهاند. به لیست زیر توجه نمایید
- *Model(retrieve the hidden states)
- *ForCausalLM
- *ForMaskedLM
- *ForMultipleChoice
- *ForQuestionAnswering
- *ForSequenceClassification
- *ForTokenClassification
- و دیگر موارد…
برای مثال به مدلی باسر دستهبندی توالیsequence classification headنیاز داریم. بنابراین، امکان دستهبندی توالیها در قالب مثبت یا منفی فراهم میشود. پس بهتر است ازTFAutoModelForSequenceClassificationاستفاده کنیم
from transformers import TFAutoModelForSequenceClassification checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint) outputs = model(inputs)
اکنون اگر نگاهی به شکلِ ورودیهایمان بیندازیم، میبینیم بعد خروجی کاهش یافته است.
سر مدل، بردار با ابعاد بالا را به عنوان ورودی به کار میگیرد و بردار حاوی دو مقدار را به عنوان خروجی میدهد
print(outputs.logits.shape)
.
(2, 2)
چون فقط دو جمله و دو برچسب داریم، نتیجه حاصل از مدل به شکل خواهد بود.
[irp posts=”7889″]پسپردازش خروجی
در این مرحله ازپایپ لاینمقادیری که در قالب خروجی از مدل به دست میآیند، به تنهایی معنای چندانی ندارند. بیایید دقیقتر بررسی کنیم
print(outputs.logits)
.
مدلِ ما[1.56071.6123]را برای اولین جمله و[4.16923.3464]را برای دومین جمله پیشبینی کرد. اینها احتمال نیستند، بلکه ارقام خام و نرمالسازی نشدهای هستند که لایه آخرِ مدل از آنها خروجی گرفته است. آنها برای اینکه به احتمال تبدیل شوند، باید از لایهسافتمکسsoftmaxعبور کنند.
import tensorflow as tf predictions = tf.math.softmax(outputs.logits, axis=-1) print(predictions)
.
tf.Tensor( [[4.01951671e-02 9.59804833e-01] [9.9945587e-01 5.4418424e-04]], shape=(2, 2), dtype=float32)
اینک، میبینیم که مدل توانسته[0.0402, 0.9598]را برای جمله اول و[0.9995, 0.0005]را برای جمله دوم پیشبینی کند. این ارقام احتمال قابل درک هستند. برای به دست آوردن برچسب متناظر با هر خروجی، میتوان ویژگی ازid2labelاستفاده کرد
model.config.id2label
.
{0: 'NEGATIVE', 1: 'POSITIVE'}اکنون، میتوان این چنین نتیجه گرفت که مدل نتایج زیر را پیشبینی کرده است
جمله اول: منفی: 0402/0، مثبت: 9598/0
جمله دوم: منفی: 9995/0، مثبت: 0005/0
هر سه مرحلهپایپ لاین(پیشپردازش با توکنکنندهها، درج ورودیها در مدل و پسپردازش) با موفقیت به انجام رسید.
از طریق لینک زیر میتوانید به دیگر قسمتهای دوره آموزشی پردازش زبان طبیعی دسترسی داشته باشید
[button href=”https://XNET.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]
برای ارزیابی پایداری، امنیت و نگهداری این زیرساخت، راهنمای پشتیبانی شبکه را نیز مطالعه کنید.