رمزگشایی از شبکههای عصبی بازگشتی (2): آموزش پیادهسازی یک مدل موّلد شعر با کمک gru
poetry generator in farsi using gru
مقدمه
در پست قبلی در مورد شبکههای عصبی بازگشتی و جزئیات آن صحبت کردیم. در این پست میخواهیم با استفاده از شبکههای عصبی بازگشتی یک مدل بسازیم که شعر تولید کند. برای انجام این کار، از GRU کمک میگیریم و برنامهای را در زبان پایتون و در فریمورک تنسورفلو پیادهسازی میکنیم.
آموزش مدل تولید شعر
در این بخش توضیح میدهیم که چگونه میتوان یک مدل بر اساس GRU بر روی مجموعه اشعار فارسی 48 شاعر فارسی زبان آموزش داد که بتواند در خروجی شعر تولید کند. برای انجام این کار، از کتابخانههای زیر در پایتون استفاده میکنیم:ی

شکل 1: کتابخانههای مورد استفاده.
سپس مجموعهداده موردنظر را دانلود میکنیم:

شکل 2: دانلود مجموعهداده اشعار.
در مرحله بعد، دادههای این مجموعهداده را از فایل میخوانیم و بر روی آنها پیشپردازش انجام میدهیم:

شکل 3: خواندن دادهها از فایل و پیشپردازش آنها.
پس از انجام پیشپردازش، دادههای ما به شکل زیر درمیآیند:

شکل 4: نمونهای از دادههای پیشپردازش شده.
مدلی که میخواهیم آموزش دهیم در سطح کاراکتر است. به این معنی که مدل در هر گام زمانی یک کاراکتر را تولید میکند؛ بنابراین با استفاده از قطعه کد زیر، تمام کاراکترهای منحصربهفرد در مجموعهداده را به دست میآوریم:

شکل 5: پیدا کردن کاراکترهای منحصربهفرد در مجموعهداده.
خروجی قطعه کد به شکل زیر است که نشان میدهد مجموعهداده انتخابی شامل 37 کاراکتر است:
37 chars ['\n', ' ', 'آ', 'ا', 'ب', 'ت', 'ث', 'ج', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ل', 'م', 'ن', 'ه', 'و', 'ى', 'پ', 'چ', 'ژ', 'ک', 'گ', 'ی', 'ە',]
در مرحله بعد بهمنظور ورودی دادن کاراکترها به مدل، از تابع StringLookup در تنسورفلو استفاده میکنیم و کاراکترها را به یک عدد تبدیل میکنیم. همچنین عملیات برعکس آن یعنی تبدیل عدد به کاراکتر را انجام میدهیم تا بتوانیم خروجی مدل را بهصورت کاراکترهای قابلفهم نمایش دهیم:

شکل 6: تبدیل کاراکتر به عدد و برعکس.
علاوه بر این تابع text_from_ids را پیادهسازی میکنیم تا کاراکترهای بهدستآمده از خروجی مدل را بهصورت یکرشته یکپارچه نشان دهیم:

شکل 7: تبدیل اعداد به کاراکتر و سپس به رشته برای نشان دادن خروجی مدل.
در مرحله بعد کل کاراکترهای مجموعهداده را به عدد تبدیل میکنیم و سپس یک دیتاست در تنسورفلو ایجاد میکنیم و دنبالههایی با طول ۱۰۰۰ از دادهها در این دیتاست به وجود میآوریم:

شکل 8: تبدیل کاراکترهای کل داده به عدد و ایجاد دنبالههای 1000تایی.
در گام بعدی، داده ورودی و خروجی مدل را میسازیم. برای ساختن داده خروجی، دنباله ورودی را به اندازه یک کاراکتر به سمت راست شیفت میدهیم. با این کار مدل میتواند در هر گام زمانی، کاراکتر بعدی را باتوجهبه کاراکترهای قبلی تولید کند:

شکل 9: ساختن دنباله ورودی و خروجی.
سپس مجموعهداده نهایی برای ورودی دادن به مدل را با شافلکردن دیتا و ایجاد دستههای ۶۴تایی میسازیم:

شکل 10: ساختن مجموعه داده نهایی.
مدلی که میخواهیم از آن برای تولید شعر استفاده کنیم دارای 3 لایه است: لایه تعبیه، لایه GRU، لایه خروجی. لایه تعبیه دنباله ورودی را به بردارهای تعبیه 256تایی نگاشت میکند. در لایه دوم، از یک لایه GRU با 1024 گام زمانی استفاده میکنیم. لایه خروجی یک لایه Dense به تعداد کل کاراکترها است و مشخص میکند که خروجی لایه GRU کدام کاراکتر را تولید کرده است:

شکل 11: مدل تولید شعر.

شکل 12: ساخت مدل تولید شعر.
خلاصه مدل و پارامترهای هر لایه آن بهصورت زیر است:

شکل 13: خلاصه مدل.
برای آموزش این مدل از تابع ضرر SparseCategoricalCrossentropy و بهینهساز Adam استفاده میکنیم و مدل را بر روی مجموعهداده برای 20 دور آموزش میدهیم:

شکل 14: آموزش مدل.

شکل 15: نتیجه آموزش مدل.
برای تولید شعر در خروجی، ابتدا یک رشته از کاراکترها را در ورودی دریافت میکنیم و آنها را به عدد تبدیل میکنیم و سپس لیست این اعداد را به مدل آموزشدیده میدهیم تا باتوجهبه ورودی ادامه شعر را در خروجی تولید کند:

شکل 16: تولید خروجی از مدل.
برای مثال، عبارت «که ایران چو باغیست خرم بهار» را بهعنوان ورودی به مدل میدهیم تا باتوجهبه آن یک شعر در خروجی تولید کند و نتیجه به صورت زیر خواهد بود:

شکل 17: یک نمونه از خروجی تولید شده توسط مدل.
نتیجهگیری
در این پست نشان دادیم که چگونه میتوان با استفاده از GRU در خروجی شعر تولید کرد. شما میتوانید با تغییر این کد مانند استفادهکردن LSTM بهجای GRU یا اضافهکردن تعداد لایههای بیشتر RNN در مدل، خروجی مدل را بهبود دهید. حتی میتوانید این مدل را بر روی مجموعهدادههای دیگری آموزش دهید و متنهای مختلفی تولید کنید. نتایج بهدستآمده نشان میدهد که هنوز مدل ما نتوانسته است وزن و ساختار شعر را به درستی یاد بگیرد و اشعار معناداری را تولید کند. در پستهای آینده خواهیم دید که چگونه میتوانیم این کار را با استفاده از مدلهای قدرتمندتر دیگری مانند GPT انجام داد.
نظرات