دسترسی به GPT-2 – تولید متن و تنظیم دقیق
تولید زبان طبیعی (NLG) موضوعی است که به خوبی در میان جامعه NLP مورد تحقیق قرار گرفته است. با رشد روش های یادگیری عمیق، NLG بهتر و بهتر می شود. اخیرا، OpenAI با انتشار GPT-2، یک مدل مبتنی بر ترانسفورماتور که توکن بعدی را در هر فضای زمانی پیشبینی میکند، مرزها را جابجا کرد.
امروزه استفاده از این مدل ها بسیار آسان است – نیازی نیست خودتان کد را پیاده سازی کنید یا با استفاده از منابع گران قیمت مدل ها را آموزش دهید. به عنوان مثال، HuggingFace یک API منتشر کرده است که دسترسی به GPT-2 از پیش آموزش دیده منتشر شده توسط OpenAI را آسان می کند. برخی از ویژگی های آن عبارتند از تولید متن، و همچنین تنظیم دقیق مدل در مجموعه داده های خود – تغییر توزیع آموخته شده به طوری که مدل متن را از یک دامنه جدید تولید می کند.
انجام همه این کارها آسان است – فقط یک پیپ نصب بسته های مربوطه و اجرای یک اسکریپت پایتون است. با این حال، برای جلوگیری از دردسر، میتوانید از یکی از پلتفرمهای موجود مانند Spell استفاده کنید – فقط مشخص کنید که چه چیزی را میخواهید اجرا کنید و اسپل بقیه کارها را انجام میدهد (دانلود کد، نصب بستهها، تخصیص منابع محاسباتی، مدیریت نتایج).
اگرچه من از طرفداران املا نیستم (حتی دیگر ویژگی های پلتفرم را امتحان نکرده ام، یا اصلاً پلتفرم های دیگر را امتحان نکرده ام)، فکر کردم یک آموزشی بنویسم که جزئیات فرآیندی را که توضیح دادم بنویسم. برای کسب اطلاعات بیشتر، می توانید آموزش را اینجا بیابید.
اگر شما هم از بازی کردن با متنهای تولید شده توسط ماشین لذت میبرید، با متنهای جالبی که دریافت کردهاید نظر بدهید. 🙂
به روز رسانی: به نظر می رسد آموزش دیگر در لینک بالا موجود نیست. اگرچه کمی قدیمی است (API facehugger از آن زمان تا کنون بسیار تغییر کرده است)، در اینجا متن کامل آمده است:
تولید زبان طبیعی (NLG) موضوعی است که به خوبی در میان جامعه NLP مورد تحقیق قرار گرفته است. یکی از رویکردها برای چالش تولید متن، فاکتورگیری احتمال وجود دنباله ای از نشانه ها (مانند کلمات یا رمزگذاری جفت بایت) است. \(P(x_1، \ldots، x_n)\) در ضرب احتمال به دست آوردن هر یک از نشانه ها \(x_1\)…، \(x_n\) مشروط به واژگان قبل از آن: \(\prod_t=1^nP(x_t|x_. با توجه به مجموعه ای از داده های آموزشی، می توان چنین مدلی را برای به حداکثر رساندن احتمال توکن بعدی در هر مرحله زمانی آموزش داد. هنگامی که مدل آموزش داده شد، می توانید متن را با نمونه برداری از توزیع یک توکن در یک زمان تولید کنید. آسان مانند نسیم.
با رشد روش های یادگیری عمیق، NLG بهتر و بهتر می شود. OpenAI اخیراً با انتشار GPT-2 مرزها را جابجا کرد. این مدل از معماری شناخته شده Transformers استفاده می کند: برای محاسبه تخصیص روی توکن بعدی، مدل به طور همزمان از نشانه های قبلی با استفاده از مکانیزم خود ارجاع استفاده می کند.
HuggingFace اخیرا یک API منتشر کرده است که دسترسی به GPT-2 را تسهیل می کند. یکی از عملکردهای آن تولید متن با استفاده از یک مدل از پیش آموزش دیده است:
spell run --github-url https://github.com/huggingface/transformers.git \
--pip tqdm \
--pip boto3 \
--pip requests \
--pip regex \
--pip sacremoses \
"python examples/run_generation.py \
--model_type=gpt2 \
--length=70 \
--prompt=' ' \
--model_name_or_path=gpt2"
💫 Casting spell #1…
✨ Stop viewing logs with ^C
✨ Machine_Requested… done
✨ Building… done
✨ Run is running
…
…
…
$۵٫۳۰-$۱۰٫۰۰
FREE SHIPPING
Items without a shipping address will be delivered to your confirmation email when you purchase your product.
Use "POOL" when ordering; deliveries to POOL addresses are completely separate from shipping.<|endoftext|>Earth's spin to new low the closer Earth takes to the Sun's
✨ Saving… done
✨ Pushing… done
🎉 Total run time: 1m7.057677s
🎉 Run 1 complete
این آسان بود! OpenAI از داده های مختلف موجود در وب برای آموزش مدل استفاده می کند، بنابراین متن تولید شده می تواند تقریباً هر متنی طبیعی باشد. اما اگر به جای تنوع بخواهیم نوع خاصی از متن تولید کنیم چه؟ بیایید سعی کنیم جوک تولید کنیم! برای انجام این کار، باید مدل را با استفاده از مجموعه داده جوک آموزش دهیم. متأسفانه، به دست آوردن چنین مجموعه داده ای بسیار دشوار خواهد بود! برای آموزش GPT-2، که دارای ۱۲۴ میلیون وزن برای یادگیری است (و این فقط نسخه کوچکتر معماری است)، به حجم عظیمی از داده نیاز داریم! اما چگونه می توانیم این همه شوخی داشته باشیم؟ پاسخ کوتاه این است: ما این کار را نمی کنیم.
یادگیری ایجاد جوک شامل یادگیری نحوه تولید متن طبیعی و همچنین اطمینان از خنده دار بودن متن است. بخش اول جایی است که بیشتر یادگیری در آن اتفاق می افتد. با استفاده از نسخه از پیش آموزشدیدهشده GPT-2 بهعنوان نقطه شروع، مدل نیازی به یادگیری نحوه تولید متن طبیعی از ابتدا نخواهد داشت. تنها چیزی که او باید بیاموزد این است که پخش را روی متنی متمرکز کند که سرگرم کننده است. یک مجموعه داده نسبتاً کوچک این کار را انجام خواهد داد.
اشتباه نکنید، مجموعه داده ای که استفاده خواهیم کرد به اندازه کافی بزرگ نیست که بتوان چیز مفیدی را یاد گرفت. علاوه بر این، آموزش مدلی برای تعمیم مفهوم شوخ طبعی مشکلی دشوار است. با این حال، برای هدف این پست – یادگیری نحوه استفاده و تنظیم دقیق مدلی مانند GPT-2 – این کار انجام می شود: ما شاهد خواهیم بود که چگونه مجموعه داده توزیع مدل را به متنی که تا حدودی شبیه به شوخی است تغییر می دهد.
برای تنظیم دقیق GPT-2 از جوکهای تک خطی از مجموعه دادههای جوک کوتاه استفاده میکنیم. از آنجایی که آنها کوتاهتر از جوک متوسط هستند، یادگیری توزیع آنها برای مدل آسانتر خواهد بود. بنابراین، ابتدا اجازه دهید داده ها را بدست آوریم:
spell run "wget -O data.csv https://raw.githubusercontent.com/amoudgl/short-jokes-dataset/master/data/onelinefun.csv && python -c \"import csv; f_in = open('data.csv', 'r'); f_out = open('data.txt', 'w'); f_out.write('\n'.join(row['Joke'] for row in csv.DictReader(f_in)))\""
💫 Casting spell #2…
✨ Stop viewing logs with ^C
✨ Building… done
✨ Machine_Requested… done
✨ Run is running
--۲۰۱۹-۱۱-۰۹ ۲۱:۳۶:۱۴-- https://raw.githubusercontent.com/amoudgl/short-jokes-dataset/master/data/onelinefun.csv
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 253462 (248K) [text/plain]
Saving to: ‘data.csv’
۰K .......... .......... .......... .......... .......... 20% 3.34M 0s
۵۰K .......... .......... .......... .......... .......... 40% 6.72M 0s
۱۰۰K .......... .......... .......... .......... .......... 60% 167M 0s
۱۵۰K .......... .......... .......... .......... .......... 80% 122M 0s
۲۰۰K .......... .......... .......... .......... ....... 100% 6.55M=0.03s
۲۰۱۹-۱۱-۰۹ ۲۱:۳۶:۱۴ (۸٫۱۴ MB/s) - ‘data.csv’ saved [253462/253462]
✨ Saving… done
✨ Pushing… done
🎉 Total run time: 13.07418s
🎉 Run 2 complete
HuggingFace قبلاً یک اسکریپت برای تنظیم دقیق GPT-2 در اختیار ما قرار داده است:
spell run --github-url https://github.com/huggingface/transformers.git \
--pip tqdm \
--pip boto3 \
--pip requests \
--pip regex \
--pip sacremoses \
-m runs/2/data.txt \
"python examples/run_lm_finetuning.py \
--output_dir=output \
--model_type=gpt2 \
--model_name_or_path=gpt2 \
--per_gpu_train_batch_size=2 \
--num_train_epochs=10 \
--do_train \
--train_data_file=data.txt"
💫 Casting spell #3…
✨ Stop viewing logs with ^C
✨ Machine_Requested… done
✨ Building… done
✨ Mounting… done
✨ Run is running
…
…
…
🎉 Total run time: 44h36m34.553059s
🎉 Run 3 complete
توجه داشته باشید که داده های دانلود شده از اجرای قبلی با استفاده از -m پرچم اگرچه ما از یک مجموعه داده کوچک (۳K نمونه) استفاده کردیم، اجرای ۱۰ دوره CPU حدود ۴۴ ساعت طول کشید. این فقط نشان می دهد که مدل چقدر بزرگ است. بنابراین، اگر میخواهید از مجموعه دادههای بزرگتری استفاده کنید یا آزمایشهای زیادی را اجرا کنید (مثلاً تنظیم hyperparameter) باید از GPU استفاده کنید.
بیایید سعی کنیم پس از تطبیق نتیجه اجرای قبلی، یک جوک ایجاد کنیم:
spell run --github-url https://github.com/huggingface/transformers.git \
--pip tqdm \
--pip boto3 \
--pip requests \
--pip regex \
--pip sacremoses \
-m runs/3/output \
"python examples/run_generation.py \
--model_type=gpt2 \
--length=70 \
--prompt=' ' \
--model_name_or_path=output"
💫 Casting spell #4…
✨ Stop viewing logs with ^C
✨ Machine_Requested… done
✨ Building… done
✨ Run is running
…
…
…
"I've got seven fingers! But I don't have those!"
Your childhood might be difficult, but at least it doesn't taste like your grandfather's.
Funny things never happen, in life.
Friends, We've met on the beach. What's wrong with you?
If I'm speaking honestly, I could use some
✨ Saving… done
✨ Pushing… done
🎉 Total run time: 51.047054s
🎉 Run 4 complete
مدل یاد گرفته است که جملات کوتاه تولید کند، که برای مجموعه دادههای ما معمول است. این آمار نسبتاً آسان برای درک داده ها به خوبی آموخته شد! در مورد اینکه مدل چقدر سرگرم کننده است – خوب … من این را به شما واگذار می کنم!

