آموزش پردازش زبان طبیعی با اکوسیستم هاگینگفیس؛جمعبندی فصل دوم (قسمتششم فصلدوم)
در این قسمت از آموزش پردازش زبان طبیعی با اکوسیستم هاگینگ فیس به جمعبندی فصل دوم خواهیم پرداخت. در چند بخش گذشته، بخش اعظم کارها به صورت دستی انجام شد. نحوه کارکرد توکنکنندهها، فرایند توکنسازی Tokenization، تبدیل به شناسههای ورودی input IDs، پَدینگ، کوتاهسازی Truncation و ماسکهای توجه Attention masks نیز به طور جامع توضیح داده شدند. آنطور که در بخش 2 ملاحظه کردید، API ترنسفورمر میتواند با تابع مناسبی کلیه این کارها را مدیریت کند. اگر توکنکننده را به طور مستقیم در جمله فراخوانی کنید، ورودیهایی به دست میآورید که آمادهی انتقال به مدل هستند:
from transformers import AutoTokenizer checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" tokenizer = AutoTokenizer.from_pretrained(checkpoint) sequence = "I've been waiting for a HuggingFace course my whole life." model_inputs = tokenizer(sequence)
در اینجا، متغیر model_inputs محتوای لازم برای عملکرد مناسب مدل را دارای میباشد. DistilBERT نیز دربردارندهی شناسههای ورودی و ماسک توجه است. سایر مدلهایی که ورودیهای بیشتری میپذیرند، با شیء توکنکننده tokenizer به این خروجی دست خواهند یافت. در مثالهای زیر خواهید دید که این روش از توان بالایی برخوردار است. اول اینکه، امکان توکنسازی یک توالی با این روش وجود دارد:
sequence = "I've been waiting for a HuggingFace course my whole life." model_inputs = tokenizer(sequence)
در این روش، چندین توالی به یکباره و بدون تغییرِ API مدیریت میشوند:
sequences = [ "I've been waiting for a HuggingFace course my whole life.", "So have I!" ] model_inputs = tokenizer(sequences)
در این روش، عمل پَدینگ بر اساس چندین هدف انجام میگیرد:
# توالی ها را به اندازه طولانی ترین توالی پدینگ میکند. model_inputs = tokenizer(sequences, padding="longest") # توالی را تا بالاترین طولی که مدل می تواند پدینگ میکند. # (512 for BERT or DistilBERT) model_inputs = tokenizer(sequences, padding="max_length") # Will pad the sequences up to the specified max length model_inputs = tokenizer(sequences, padding="max_length", max_length=8)
این روش نقش موثری در کوتاهسازی توالیها دارد:
sequences = [ "I've been waiting for a HuggingFace course my whole life.", "So have I!" ] # توالی هایی که طول آن ها از طولی که مدل میتواند مدیریت کند بیشتر هست را برش میدهد. # (512 for BERT or DistilBERT) model_inputs = tokenizer(sequences, truncation=True) # توالی هایی که از مقدار مشخص شده طولانی تر باشند را برش میدهد. model_inputs = tokenizer(sequences, max_length=8, truncation=True)
شیء توکنکننده Tokenizer object میتواند نقش موثری در عمل تبدیل به تنسورهای چارچوب ویژه داشته باشد که بعدها میتواند به طور مستقیم به مدل ارسال شود. برای نمونه، در نمونه کد زیر، از توکنکننده خواسته میشود تا تنسورهایی را از چارچوبهای مختلف به دست آورد؛ “pt” ، “tf” و “np” به ترتیب تنسورهای پایتورچ، تنسورهای تنسورفلو و آرایههای NumPy را به عنوان خروجی ارائه میدهند:
sequences = [ "I've been waiting for a HuggingFace course my whole life.", "So have I!" ] # Returns PyTorch tensors model_inputs = tokenizer(sequences, padding=True, return_tensors="pt") # Returns TensorFlow tensors model_inputs = tokenizer(sequences, padding=True, return_tensors="tf") # Returns NumPy arrays model_inputs = tokenizer(sequences, padding=True, return_tensors="np")
توکنهای ویژه
اگر به شناسههای ورودی به دست آمده با توکنکننده نگاه کنید، میبینید که قدری با آنچه پیشتر به دست آمده بود، فرق دارند:
sequence = "I've been waiting for a HuggingFace course my whole life." model_inputs = tokenizer(sequence) print(model_inputs["input_ids"]) tokens = tokenizer.tokenize(sequence) ids = tokenizer.convert_tokens_to_ids(tokens) print(ids) . [101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012, 102] [1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012]
یک شناسه توکن Token ID در آغاز و یک شناسه در پایان اضافه شده است. بیایید دو توالی شناسه فوق را رمزگشایی کنیم:
print(tokenizer.decode(model_inputs["input_ids"])) print(tokenizer.decode(ids)) "[CLS] i've been waiting for a huggingface course my whole life. [SEP]" "i've been waiting for a huggingface course my whole life."
توکنکننده واژه خاص [CLS] را در آغاز و واژه خاص [SEP] را در انتها اضافه کرده است زیرا مدل با این دو مرحله پیشآموزش را پشت سر گذاشته است. بنابراین، برای اینکه نتایج یکسانی برای عمل استنباط inference به دست آید، باید آنها را نیز اضافه کرد. توجه داشته باشید که برخی مدلها واژههای خاص یا متفاوتی اضافه نمیکنند. ممکن است مدلها این واژهها را فقط در آغاز یا پایان کار اضافه کنند. در هر صورت، توکنکننده میداند که کدام موارد مورد نیاز هستند. بنابراین، تدبیری برای این کار اندیشیده خواهد شد.
از توکنکننده به مدل
حال که تمامی مراحل توکنکننده در زمان کار بر روی متون بررسی شده است، بیایید برای آخرین بار به نحوهی مدیریت چندین توالی بسیار طویل و انواع مختلف تنسورها بپردازیم:
import tensorflow as tf from transformers import AutoTokenizer, TFAutoModelForSequenceClassification checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" tokenizer = AutoTokenizer.from_pretrained(checkpoint) model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint) sequences = [ "I've been waiting for a HuggingFace course my whole life.", "So have I!" ] tokens = tokenizer(sequences, padding=True, truncation=True, return_tensors="tf") output = model(**tokens)
این قسمت از آموزش پردازش زبان طبیعی با محوریت جمعبندی فصل دوم به پایان رسید و شما میتوانید از طریق لینک زیر به دیگر قسمتهای این آموزش دسترسی داشته باشید:
[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]