سلام! جعفر هستم و این اولین نوشتهام توی وبلاگ کرم های کامپیوتره 🙂
حالا قراره درباره چی حرف بزنم؟ یک چند وقتی درگیر این بودم که لیبرهترنسلیت که یک مترجم آزاده(این) رو برای زبان فارسی بهبود بدم. یعنی کاری کنم که ترجمه بهتری برای زبان فارسی داشته باشه.
قبلش بگم که لیبره ترنسلیت چیه؟
لیبره ترنسلیت یک نرمافزار ترجمه ماشینی آزاده که بر پایه کتابخانههای آرگوز ترنسلیت(argos-translate) توسعه داده شده که با یک رابط تحت وب به صورت سرویس ترجمه ماشینی نامتمرکز در دسترسه. مثلا نمونهای که توسط توسعهدهندگانش مدیریت میشه اینه:
درباره نحوه کارکرد و زبانهایی که پشتیبانی میکنه میتونید توی صفحه گیتهابشون بخونید.
حالا من میخواستم چیکار کنم؟
با توجه به اینکه لیبره ترنسلیت یک مدل هوشمصنوعی ترجمه ماشینی(البته نه دقیقا یک مدل) هستش ساختار کلیاش اینه که با یک حجم بالایی داده ترجمه به دو زبان(مبدا مثلا فارسی و مقصد مثلا انگلیسی که دوتا مدل آموزش میبینه یکی مبدا به مقصد و یکی برعکسش) نیاز داره، که اینجا هدفمون فارسی بود. اولین کار این بود که ببینیم مشکل این کیفیت پایین ترجمه چیه. رفتم یک دوری زدم و به داده هایی که مدل فارسی باهاش آموزش دیده رسیدم. حدود پنج میلیون خط ترجمه که کیفیت جالبی هم نداشت.
راهکار این بود که داده های بهتری جمع کنیم و مدل جدید آموزش بدیم. این کار رو کردیم و دوستانی هم کمک بسیاری کردند در این مسیر و حدود ۲ میلیون خط ترجمه جمع شد(عموما سر هم کردن دیتاست های آزاد دیگه). یک دوست عزیز دیگهای لطف کردند سخت افزارشون رو برای آموزش مدل در اختیار من گذاشتن(برای آموزش اینجور مدلها به سخت افزار قوی از جمله GPU قوی نیازه که من ندارم :) و مدل رو با حدود پنج ساعت پردازش آموزش دادیم، اما خروجی از مدل لیبره ترنسلیت هم بدتر بود!
با عیبیابی به این نتیجه رسیدیم که هم کیفیت این دادهها کافی نیست و هم حجمشون. مشکل دیگه این بود که بخش قابل توجهی از دادهها ترجمه واژهنامهوار (و نه جمله در برابر جمله) بود که کار رو خراب میکرد.
یک مدتی گذشت در همین موضوع من یک برنامه ای چیدم برای حلش و یک ارائهای در دورهمیهای کرمهای کامپیوتر دادم. با این موضوع که که چه کنیم که مشکل رو حل کنیم. دوستان لطف کردن کمک کردن و همچنین حمایت بیشتر :))
خواستیم شروع کنیم من یک مقدار اسکریپت برای خودکار کردن استخراج داده، از اینترنت و تبدیلشون به ترجمه با گوگل ترنسلیت، نوشتم و یکم داده جمع شد، بعد از چند روز که داشتم توی اینترنت چرخ میزدم به این لینک رسیدم:
https://opus.nlpl.eu/NLLB/en&fa/v1/NLLB
همینجا بود که فهمیدیم این همه کار به قولی الکی بوده :/ یعنی چی؟ یعنی ما برنامه داشتیم با کلی پردازش و بازبینی انسانی ۵ میلیون خط ترجمه خوب جمع کنیم اما اینجا حجم بسیار بزرگی یعنی ۲۵ میلیون خط ترجمه انگلیسی به فارسی به حجم ۴۷ گیگابایت خوابیده بود!
حالا چرا پیگیر آموزش مدل نشدم؟
اول اینکه من سخت افزار لازم رو برای آموزش نداشتم، و اینکه اگه کسی مثل دفعه قبل زحمت آموزش رو میکشید مثلا با اون سختافزار قبل (یعنی گرافیک با ۱۲ گیگابایت حافظه ویدئویی) و اگه زمان آموزش رو خطی فرض کنیم ۶۲.۵ ساعت نیاز بود که گرافیک جون بکنه که با این حجم داده مدل رو آموزش بده! و این از توان من خارجه.
و باید چیکار کرد؟
این کار متاسفانه خارج از توان منه. اما اگر کسی بخواد این کار رو انجام بده نیاز داره به کارت گرافیک قوی و زمان برای آموزش یا اگه اینها رو نداره میشه دو سه روزی یک سرور GPU دار اجاره کنه و این کار رو انجام بده، البته کمک دیگهای برای این کار نیاز باشه من میتونم همین چند خط تجربهای که سر این موضوع کسب کردم در اختیارش بذارم 🙂
حدود ۴ سال پیش با پروژهٔ آواهای مشترک موزیلا آشنا شدم. آن زمان مجموعه دادهٔ (Dataset) فارسی پروژه تنها حدود ۲ گیگابایت بود. الآن زبان فارسی تقریبا ۱۰ گیگابایت مجموعه داده دارد. در این مطلب راجع به پروژه و اهمیت آن برای پروژههای یادگیری ماشینی و هوش مصنوعی توضیح میدهم. البته موضوع دورهمی نهم کرمهای کامپیوتر هم در همین مورد بود.