تولید متن (Text Generating) با تنسورفلو – به زبان ساده
انتشار «تنسورفلو ۲.۰» (TensorFlow 2.0) برای فعالان حوزه «یادگیری ماشین» (Machine Learning) بسیار جالب توجه بود. برای آشنایی با این کتابخانه قدرتمند و آگاهی از تغییراتی که در نسخه ۲.۰ داشته است، مطالعه مطلب «تنسورفلو (TensorFlow) — از صفر تا صد» توصیه میشود. در این مطلب، از کتابخانه تنسورفلو برای کار با نوع داده متنی و تولید متن استفاده شده است. متن استفاده شده در این مطلب از مخزن «پروژه گوتنبرگ» (Project Gutenberg) برداشته شده است و کلیه کدهای لازم برای پیادهسازی در مطلب آورده شدهاند. با توجه به اینکه در ادامه از یک «شبکه عصبی بازگشتی» (Recurrent Neural Network) نیز استفاده شده، به علاقهمندان پیشنهاد میشود برای درک بهتر مفهوم این مطلب، به این منبع [+] مراجعه کنند و با این نوع از «شبکههای عصبی» (Neural Networks) بیشتر آشنا شوند. اما در ادامه، به روش تولید متن (Text Generating) که جزئی از حوزه پردازش زبان طبیعی (NLP) است با تنسورفلو میپردازیم.
راهاندازی
ابتدا باید موارد مورد نیاز برای انجام این پروژه را دانلود کرد؛ با توجه به اینکه از تنسورفلو GPU در ادامه استفاده خواهد شد، در کد زیر از دستور !pip install tensorflow-gpu==2.0.0-alpha0 استفاده شده است.
بنابراین، طی فرایند نصب، نیاز است که GPUهای موجود را تایید کرد (برای انجام این پروژه حقیقتا نیاز به GPU است، زیرا استفاده از آن منجر به صرفهجویی قابل توجهی در زمان میشود).
اگر همه چیز به ترتیب خوبی پیش رفته باشد، کاربر می تواند مشاهده کند که در حال استفاده از TensforFlow 2.0.0-alpha0 است و اگر کد بالا را روی Google’s Colab اجرا کند، بخش جذابی از دستگاه GPU که Tesla T4 نامیده میشود مورد استفاده قرار میگیرد. بهتر است کاربر لیست دستگاهها را به ویژه در Colab بررسی کند، زیرا گاهی فراموش میکند تا نوع «سیستم زمان اجرا» ( Runtime System) را تغییر دهد؛ بنابراین، چک کردن لیست دستگاهها به این کار کمک کرده و به نوعی یادآوری آن است.
در این مثال، Colab با توجه به اینکه tensorflow-gpu دانلود و نصب شده، از GPU برای انجام کارها استفاده میکند؛ در غیر این صورت، پیشفرض آن CPU است. برای اجرای کد در Google Colab [+]، یا باید نوتبوک را به طور مستقیم از طریق منو File > Upload Notebook روی سایت Colab آپلود و یا به سادگی روی آیکون مربوطه در سمت چپ بالای نوتبوک کلیک کرد. برای دانلود متن در Colab، میتوان از قطعه کد زیر استفاده کرد:
قطعه کدهای موجود در Colab منابع خوبی برای راهکارهای کوچک هستند. فایل متنی بارگذاری شده، در سربرگ فایل خواهد بود؛ حتی نیاز نیست که کاربر خودش بررسی کند که فایل در آنجا قرار دارد یا نه، زیرا پس از آپلود شدن فایل، به کاربر در این رابطه اطلاعرسانی میشود.
کارها و فایلهای کاربران در Colab کوتاه مدت هستند و بار بعدی که فرد وارد حساب کاربری خود میشود، از بین رفتهاند. بنابراین ذخیره کردن کارها در جای دیگر پیش از خروج از Colab، الزامی است.
طول متن باید ۸۸۶,۸۰۹ کاراکتر باشد، بنابراین نمونه بزرگی نیست. از روی کنجکاوی، میتوان تعداد کلمات را نیز بررسی کرد:
باید ۱۵۳۲۶۰ کلمه در متن وجود داشته باشد؛ بنابراین آنقدرها هم که به نظر میرسید متن طولانی نیست. فقط برای حصول اطمینان از اینکه متن آنچه را بدان داده شده میخواند، سرعت ۱۰۰ کلمه ابتدایی متن بررسی میشود.
آمادهسازی متن
برای آمادهسازی متن، باید یک بردار از کاراکترهای یکتای مرتب ساخت. در این متن، ۳۴ مورد از آنها باید وجود داشته باشد.
در ادامه، نگاهی به نمونه نگاشت شده برای مشاهده ارائههای عددی از این متن انداخته میشود:
دادههای آموزش و اعتبارسنجی از متن ساخته میشوند (باید اطمینان حاصل کردد که بخش آموزش قابل تقسیم به اندازه دسته باشد؛ که در اینجا ۶۴ است) و سپس بررسی میشود که آیا شکلها همانطور که انتظار میرفت هستند یا خیر.
ساخت مدل تولید متن (Text Generating) با تنسورفلو
در اینجا سعی شده تا کلیه موارد قابل تنظیم در یک جا قرار بگیرند تا دسترسی به آنها هنگامی که نیاز به انجام چندین تغییر است، آسان شود.
اکنون، باید مجموعه دادههای آموزش و اعتبارسنجی را آماده و سپس شکل آنها را بررسی کرد.
در نهایت، مدل ساخته میشود. در اینجا، از دو لایه LSTM استفاده میشود.
اگر این مدل در «پلتفرم گوگل کلود» (Google Cloud Platform | GCP) تنظیم شود، امکان دارد که کاربر با پیغام خطای زیر مواجه شود.
<tensorflow.python.keras.layers.recurrent.UnifiedLSTM object …>: Note that this layer is not optimized for performance. Please use tf.keras.layers.CuDNNLSTM for better performance on GPU.
اگرچه، CuDNNLSTM موجود نیست، امکان دارد این خطا به خاطر استفاده از نسخه قبلی تنسورفلو باشد؛ زیرا LSTM در حال حاضر برای کارایی در نسخه ۲.۰ بهینه شده است؛ دلیل دیگر وقوع این خطا ممکن است در دسترس قرار نگرفتن CuDNNLSTM باشد.
اجرای مدل
در ادامه، کد مربوط به بررسی شکل خروجی و مدل، و تعریف «زیان» (Loss) آمده است.
اکنون از بهینهساز «آدام» (Adam Optimizer) استفاده میشود و آموزش پس از ۱۰ دوره، هنگامی که خطای اعتبارسنجی بهبود پیدا نکرد، متوقف میشود.
اکنون، باید برای ذخیرهسازی چکپوینتها (Checkpoints) و اجرای برنامه، پوشه ساخت.
در این مثال، آموزش روی «دوره» (Epoch) بیست و پنج متوقف میشود. این یعنی آخرین باری که خطای اعتبارسنجی بهبود پیدا کرده، دوره 25 بوده است. نمودار زیر، آنچه به وقوع پیوسته را به تصویر میکشد؛ در واقع، در ابتدا خطای اعتبارسنجی حتی بهتر از خطای آموزش بوده است (زیان اعتبارسنجی برای یک دوره با استفاده از بهبود مدل آموزش محاسبه میشود، زیرا در پایان دوره و جایی که زیان آموزش با استفاده از میانگین زیانها در همه دستهها در دسترس است و در آغاز آن، ممکن است منجر به کمتر بودن خطای اعتبارسنجی شود).
اما در طول زمان، خطای مجموعههای آموزش و اعتبارسنجی واگرا میشوند و خطای آموزش شروع به پایین رفتن میکند، در حالیکه خطای اعتبارسنجی ابتدا ثابت میماند و پس از مدتی بیشتر میشود.
تولید متن
اکنون، باید وزنها را از آخرین چکپوینتها به روز رسانی کرد (یا خط load.weights را در چکپوینت دیگری تنظیم کرد) و یک متن هزار کاراکتری تولید کرد.
خروجی دریافتی به صورت زیر است.
این خروجی، برای ۱۰ دقیقه پردازش با یک GPU تنها و با استفاده از متن نمونه کمتر از یک میلیون کاراکتر، نسبتا خوب محسوب میشود.
اگر مطلب بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- آموزش پردازش زبانهای طبیعی (NLP) در پایتون (Python) با پلتفرم NLTK
- مجموعه آموزشهای هوش مصنوعی
- زبان برنامهنویسی پایتون (Python) — از صفر تا صد
- یادگیری ماشین با پایتون — به زبان ساده
- آموزش پردازش زبان طبیعی پروژه محور — راهنمای کاربردی
- پردازش زبان طبیعی (NLP) با پایتون — راهنمای جامع
- مدل زبانی چیست؟ – Language Model در AI به زبان ساده
^^
این قسمت رو نفهمیدم:
«دادههای آموزش و اعتبارسنجی از متن ساخته میشوند (باید اطمینان حاصل کردد که بخش آموزش قابل تقسیم به اندازه دسته باشد؛ که در اینجا ۶۴ است) و سپس بررسی میشود که آیا شکلها همانطور که انتظار میرفت هستند یا خیر.»
عدد 64 از کجا آمد؟
و توی این سه خط عدد 704000 از کجا ؟
tr_text = text_as_int[:704000]
val_text = text_as_int[704000:]
print(text_as_int.shape, tr_text.shape, val_text.shape)
از این قسمت به بعد توضیحات بسیار کم است و پیچیدگی بسیار زیاد. اما این چیزی از ارزش های شما کم نمی کند.
با سلام و احترام خدمت شما؛
از ارائه بازخوردتون راجع به این نوشتار سپاسگزاریم.
منظور از «متن» در این جمله، به دیتاست شبکه عصبی اشاره داره و به بیان دیگه این دادهها (متن) برای آموزش و ارزیابی شبکه استفاده میشه.
با مراجعه به ریپوزیتوری «+» میتونید به کدها و همینطور «متن» پاکسازی شده از پروژه گوتنبرگ دسترسی داشته باشید.
«اندازه بسته» یا همون «batch_size»، یکی از هایپرپارامترهای شبکه هستش و به تعداد نمونههای آموزشی در یک دسته، که بهطور همزمان بهعنوان ورودی وارد شبکه میشه، اشاره داره و میزان اون میتونه روی دقت نتیجه تأثیر بذاره (میتونید اعداد دیگه رو با شرطی که گفته امتحان کنید).
از اونجاییکه نمیتونیم کل دیتامون رو یکباره وارد حافظه کنیم (بخاطر هزینهبر بودن)، بنابراین اونها رو در قالب batch_size دسته دسته میکنیم و شبکه هر بار یکی از دستهها رو برای بهروزرسانی خودش استفاده میکنه.
قسمتی از دیتا یا «متن» رو در tr_text بهعنوان «دادههای آموزشی» و قسمتی رو در val_text برای «ارزیابی» قرار دادیم.
از همراهی شما با مجله فرادرس بسیار خوشنودیم.
مطلب نسبتا خوب بود. ممنون
اگر لینک داده هایی که از پروژه گوتبرگ هم گرفتید میگذاشتید خیلی خوب میشد.
با سلام؛
منبع تمامی مطالب مجله فرادرس اگر ترجمه باشند در انتهای مطلب و پیش از نام نویسنده آورده شدهاند.
با تشکر از همراهی شما با مجله فرادرس