ارزیابی روش‌های پردازش متن بر روی داده‌های آگهی دیوار

مقدمهدر شرکت کافه‌بازار، محققان و دانشمندان کارکشته در زمینه علوم داده با اختصاص بخشی از وقتشان به مطالعه مطالب جدید و به قولی state-of-the-art، پیشران شرکت در زمینه استفاده از علوم و فنون نوظهور هستند. شاید همین باعث شد که بچه‌های تیم‌های دیتا در دیوار به فکر تعریف یک پروژه برای بررسی روش‌های جدید برای پردازش متن آگهی‌ها بیفتند.در این نوشته با بیان مقدمه‌ای از کار بر روی داده‌های متنی در دیوار، فضای مسئله را در شرکت باز می‌کنیم. در قسمت‌های بعدی به تقصیل درباره نتایج روش‌هایی صحبت خواهیم کرد که در برای استفاده در کار متنی در دیوار ارزیابی شدند.در نهایت باید بگویم به عنوان یک کارآموز، کار بر روی این پروژه در نوع خودش منحصر به فرد و پر از تجربه‌های جدیدی بود که در این مقال نمی‌گنجد و اگر برایتان جذاب است، دعوت می‌کنم در نوشته دیگری این تجربه را دنبال کنید (فعلاً نوشته نشده دیگه:)) ).فضای مسئلهدر دیوار داده‌های متنی زیادی وجود دارد مثلاً متن آگهی‌ها، کامنت‌ها و … و برای کار بر روی این داده‌ها نیاز به اطلاع از روش‌های جدید کار با متن به شدت احساس می‌شود.برای اینکه ادامه مطلب و نتایج به دست آمده ملموس‌تر باشد توضیحی درباره کار تیم بررسی آگهی در دیوار می‌دهیم. اکنون که این نوشته را می‌نویسم، آگهی‌ها با نرخ بالایی به سرور ارسال می‌شوند و نیاز است که با دقت و سرعت بالایی بررسی و انطباقشان با قوانین درج آگهی سنجیده شود تا برای نمایش به کاربران آماده شوند. این فرایند توسط تیم بررسی آگهی نظارت می‌شود. تیم داده در بخش بررسی آگهی تلاش دارد با کمک داده‌ای که در اختیار دارد، به خودکارسازی هر چه بیشتر این فرایند کمک کند. مسائل موجود در این تیم کم نیست ولی ما یک مورد را دقیق‌تر شرح می‌دهیم. در اپلیکشن دیوار، برای سهولت استفاده کاربران (و دلایل متعدد دیگر) دسته‌بندی‌هایی برای آگهی‌ها در نظر گرفته شده است. در سطح اول ۱۰ دسته وجود دارد مانند وسایل نقلیه یا املاک.این دسته‌بندی به صورت سلسله‌مراتبی در سه سطح وجود دارد که این سه سطح را به ترتیب cat1 و cat2 و cat3 می‌نامیم. مثلاً دسته وسایل نقلیه خود شامل ۴ دسته است (خودرو، موتور، قایق و لوازم یدکی خودرو). شکل زیر این بخشی از این دسته‌بندی را نشان می‌دهد.سطوح دسته‌بندی آگهی‌ها در دیوارتشخیص خودکار دسته آگهی برای اعمال برخی از قوانین لازم برای درج آگهی به صورت خودکار کمک می‌کند.ما برای ارزیابی روش‌هایی که در ادامه درباره آنها توضیح می‌دهیم، تسک دسته‌بندی آگهی‌ها را انتخاب کردیم و نتایج ثبت شده اغلب مربوط به دقت و سرعت دسته‌بندی آگهی در این دسته‌ها هستند. البته در لابه‌لای این نوشته به کاربرد این روش‌ها در تسک‌های دیگر نیز اشاره خواهیم کرد.دسته‌بندی، به طور خاص در حوزه متن، مسئله شناخته شده‌ای است و روش‌های موجود برای کار بر روی آن کم نیست. می‌توانید در این مقاله به تفصیل با رویکردهای موجود در کار با متن آشنا شوید که البته به دسته‌بندی محدود نمی‌شود.در ادامه متن به بررسی سه روش به نام‌های Fasttext، Character Level CNN و BERT می‌پردازیم و در نهایت نتایج به دست آمده از آنها را کنار هم می‌گذاریم.آنچه آزمایش شددر این بخش نتایج به دست آمده از سه روش به نام های Fasttext، character level cnn و BERT را بررسی می‌کنیم. Fasttext روشی است که هم اکنون در دیوار در حال استفاده است و تاکنون عملکرد قابل قبولی داشته است. اما با افزایش حجم آگهی‌های ارسالی به سرور، نیاز به افزایش دقت در همه تسک‌ها مانند دسته‌بندی احساس می‌شود و هر درصد افزایش دقت برای تسک دسته‌بندی می‌تواند بر روی بیش از ده‌ها هزار آگهی تاثیر داشته باشد و منجر به افزایش سرعت و دقت بررسی آگهی‌ها شود.از همین رو اولاً به سراغ الگوریتم‌هایی با رویکردهای متفاوتی چون استفاده از CNN رفتیم و از طرف دیگر روش‌های state-of-the-art مانند BERT را مورد آزمایش قرار دادیم. البته روش‌های آزمایش شده محدود به آنچه در این نوشته آورده شده نیست و روش‌هایی مانند ULMFit هم آزمایش شدند اما به دلیل نرسیدن به نتایج کافی، هنوز منتشر نشده‌اند.روش Fasttextکتابخانه fasttext که توسط آزمایشگاه تحقیقاتی هوش مصنوعی facebook توسعه داده شده است، روشی برای ایجاد embeddingهای مستقل از متن است (نوعی از embedding که به ازای هر کلمه، مستقل از متنی که در آ‌ن قرار دارد، یکسان است).برای مطالعه بیشتر می‌توانید به مقاله fasttext مراجعه کنید اما دو مزیت مهم fasttext عبارت‌اند از:توجه به n-gram‌های کاراکتری در یافتن embedding که برای حل مشکل کلمات خارج از دایره لغات (مثلاً غلط‌های املایی) کمک می‌کندسرعت بسیار بالا در آموزش و به خصوص استنتاج نتایجدسته‌بندی سطح اولدر جدول زیر نتایج استفاده از Fasttext برای آموزش مدلی برای تشخیص cat1 آگهی‌های دیوار نشان داده شده است.دسته‌بندی آگهی‌ها در سطح اول (۱۰ دسته) به کمک مدل Fasttextمشخصات سخت‌افزار مورد استفاده به شرح زیر است:CPU: 40 core Intel(R) Xeon(R) CPU E5-2660 v2 @ 2.20GHzRAM: 128gb DDR3 1600MHzو چند نکته درباره این نتایج:آموزش به کمک سخت‌افزار مذکور و با موازی‌سازی روی ۴۰ هسته انجام شده است.تست بر روی همین CPU و با یک هسته انجام شده است.میانگین زمان پیشبینی برای این روش، بدون موازی‌سازی، کمتر از ۰.۱ میلی‌ثانیه است.سرعت بسیار بالا و دقت معقول در این نتایج مشهود است و این مسئله که همه این نتایج به وسیله CPU به دست آمده است، خود یک مزیت محسوب می‌شود.دسته‌بندی سطح دومبرای دسته‌بندی cat2 هم روش‌های متفاوتی وجود دارد. روشی که نتایج آن در ادامه گفته می‌شود را روش سلسله‌مراتبی می‌نامیم و به این ترتیب عمل می‌کند که برای هر cat1، یک مدل جداگانه آموزش داده می‌شود. هنگام تشخیص cat2 برای یک آگهی جدید، ابتدا cat1 آن را با یک مدل تشخیص می‌دهیم و متناسب با آن، از مدلی برای تشخیص cat2 استفاده می‌کنیم.شمایی از نحوه انجام دسته‌بندی سلسله‌مراتبیدقت این روش سلسله‌مراتبی برای تشخیص دسته آگهی‌ها ۸۷ درصد است. داده مورد استفاده، آگهی‌های دسته‌بندی شده در محیط عملیاتی در دیوار است و با دادگان دیگری که در بخش‌های دیگر استفاده شده است متفاوت است.راه دیگر آموزش مدل برای cat2، آموزش flat است. یعنی آموزش یک مدل برای کل ۵۹ دسته cat2. مدل flat برای پیشبینی cat2 به کمک Fasttext با یک میلیون آگهی آموزش داده شد که توانست به دقت ۸۹.۸ درصد دست پیدا کند.روش Character Level CNNاین روش مبتنی بر استفاده از شبکه‌های عصبی convolutional در حوزه متن است. CNNها کاربردهای فراوانی در زمینه کار با سیگنال‌هایی چون صوت و تصویر داشته‌اند اما با در نظر گرفتن متن به عنوان یک سیگنال، کارهایی در راستای استفاده از CNN ها در زمینه متن هم انجام شده است. توضیح بیشتر درباره این روش را می‌توانید در این مقاله ببینید.ما برای آزمایش این روش از این پیاده‌سازی استفاده کردیم که نتایج آن در جدول زیر آورده شده است.دسته‌بندی آگهی‌ها در سطح اول(۱۰ دسته) به کمک مدل Character Level CNNمشخصات سخت‌افزار مورد استفاده به شرح زیر است:GPU: GeForce GTX 1060, 1280 NVIDIA CUDA Cores, Pascal ArchitectureGPU RAM: 6 GB, 8 Gbps Memory Speedچند نکته هم درباره این نتایج:آموزش و تست این مدل هر دو بر روی سخت‌افزار مذکور انجام شده است.اندازه مدل به دست آمده از این روش ۱۲ مگابایت است.زمان پیشبینی به وسیله آن بیش از ۲۰ میلی‌ثانیه است.همانطور که دیده می‌شود، نتایج به دست آمده با این روش نسبت به Fasttext بسیار ضعیف‌تر هستند و تلاشی برای ادامه استفاده از این روش در تسک‌های دیگر مانند پیشبینی cat2 انجام نشد.روش BERTالگوریتم BERT که در نوامبر سال ۲۰۱۸ منتشر شد، یک شبکه عصبی مبتنی بر transformer و یکی از روش‌های معرفی شده در مجموعه‌ای از روش‌های state-of-the-art است که در این لینک معرفی شده‌اند.مزیت مهم روش BERT که از آن استفاده هم می‌کنیم، پشتیبانی از transfer learning است و می‌توان با fine-tune کردن مدل برای تسک مورد نظر، سربارهای آموزش را دور زد. جزئیات نحوه عملکرد BERT را در مقاله گوگل و یا به صورت خلاصه‌تر در این لینک می‌توانید بخوانید.گوگل بعد از انتشار این مقاله مدل‌های انگلیسی pretrained را منتشر کرد و در فاصله اندکی پس از‌ آن، مدل چندزبانه‌ای را نیز منتشر کرد که قابلیت استفاده برای بیش از ۱۰۰ زبان را داراست و بر روی صفحات ویکی‌پدیا این زبان‌ها آموزش داده شده است. کد BERT و مدل‌های آموزش داده شده همگی در ریپو گیت‌هاب گوگل قرار داده شده است.جزئیات فنی درباره fine-tune کردن BERT برای استفاده بر روی متن فارسی در این ریپو گیت‌هاب قرار داده شده است. در آنجا نوتبوکی قرار داده شده است که با کمک پلتفرم google colab می‌توانید با قرار دادن دادگان مورد نظر برای دسته‌بندی در گوگل درایو خود، مدل‌های pretrained برای فارسی را fine-tune کنید و دقت نتایج را بر روی داده تست ببینید.دسته‌بندی در سطح اولنتایج زیر برای تسک دسته‌بندی در سطح اول پس از fine-tune کردن مدل چند زبانه multilingual bert بر روی دادگان متنی فارسی دیوار به دست آمده است.نتایج تسک دسته‌بندی سطح اول پس از fine-tune کردن مدل ‌BERTمشخصات سخت‌افزار google colab که آموزش به کمک آن انجام شده به شرح زیر است:GPU: 1xTesla K80 , compute 3.7, having 2496 CUDA cores , 12GB GDDR5 VRAMCPU: 1xsingle core hyper threaded Xeon Processors @2.3Ghz i.e(1 core, 2 threads)RAM: ~12.6 GB AvailableDisk: ~33 GB Availableو اما چند نکته درباره این نتایج:آموزش این مدل‌ها به کمک GPU در google colab انجام شده است و میزان مصرف حافظه در آموزش هر مدل مشخص شده است.تست این مدل‌ها به کمک GPU مطرح شده در بخش قبل انجام شده است.اندازه همه مدل‌های ساخته شده به وسیله BERT حدوداً ۲ گیگابایت است.زمان تقریبی پیشبینی برای مدل BERT بر روی سخت‌افزار تست حدوداً ۶ میلی‌ثانیه است.دسته‌بندی در سطح دومدر مورد دسته‌بندی در سطح دوم، از آنجایی که آموزش مدل‌های سلسله‌مراتبی برای BERT به علت سختی فرایند آموزش، کار معقولی به نظر نمی‌آید، برای ۵۹ دسته در سطح دوم یک دسته‌بند تک سطحی آموزش دادیم تا ببینیم اگر BERT توانایی رقابت در سرعت را ندارد، در دقت می‌تواند از Fasttext پیشی بگیرد یا نه؟ Fasttext موفق شده بود با دسته‌بندی سلسله مراتبی، به دقت ۸۷ درصد برسد ولی BERT به صورت flat در بین ۵۹ دسته توانست به دقت ۹۰ درصد برسد که دقت قابل قبولی به حساب می‌آید. آموزش این دسته‌بند با همان ۵۰۰ هزار داده مورد استفاده در قسمت‌های قبل صورت گرفت که باز هم نسبت به حجم داده مورد استفاده در بخش‌های دیگر کم است.البته سختی‌های آموزش سلسله مراتبی مدل به کمک BERT باعث نشد این کار را، حتی برای مقایسه با Fasttext هم که شده، انجام ندهیم. دقت این مدل‌ها در دسته‌های مختلف سطح یک به شکل زیر است:دقت BERT به صورت سلسله‌مراتبی در دسته‌های مختلفدادگان مورد استفاده در این بخش هم همان ۱ میلیون آگهی مورد استفاده در Fasttext بود، با این تفاوت که برای هر دسته cat1 فقط آگهی‌های متعلق به آن دسته از بین آن ۱ میلیون آگهی برای آموزش آن مدل استفاده شده‌اند (به عبارتی در هنگام پیشبینی دسته سطح دوم، فرض بر این است که دسته سطح اول واقعی را می‌دانیم). تعداد آگهی‌های هر دسته در جدول بالا آمده است.دقت کنید که این اعداد با دقت ۸۷ درصد به دست آمده از Fasttext قابل مقایسه نیست چون در آنجا خطای ناشی از پیش‌بینی اشتباه cat1 هم در پیش‌بینی اشتباه cat2 تاثیر دارد. با در نظر گرفتن خطای ناشی از پیش‌بینی اشتباه در cat1، دقت پیش‌بینی cat2 به روش سلسله مراتبی به کمک BERT برابر ۹۳ درصد است که بهبود قابل قبولی نسبت به BERT دارد.استخراج ویژگی‌هابرای استفاده از BERT، تنها راه حل fine-tune کردن مدل نیست و برای دور زدن مشکلاتی که هنگام fine-tune موجود بود، راه‌های دیگری را هم آزمایش کردیم. اصلی‌ترین راه استخراج ویژگی‌های BERT بدون fine-tune کردن مدل آن و انجام تسک مورد نظر (در اینجا دسته‌بندی) با استفاده از آن‌ها بود. ما از این کتابخانه برای استخراج ویژگی‌ها به وسیله مدل استفاده کردیم که بسیاری از مشکلات فنی مربوط به این کار را رفع کرده است و به عنوان یک نمونه کار مهندسی یادگیری ماشین می‌تواند مفید باشد.در همان ریپو گیت‌هاب به کمک logistic regression و xgboost ویژگی‌های استخراج شده از آگهی‌ها که بردارهایی ۷۶۸ بعدی هستند را دسته‌بندی کردیم ولی دقت هر دو روش از ۸۰ درصد بیشتر نشد.جمع‌بندیدر این نوشته نتایج به دست آمده از سه روش مختلف برای تسک دسته‌بندی بر روی آگهی‌های دیوار را بررسی کردیم. شکل زیر دقت این روش‌ها را بر حسب اندازه دیتاست نشان می‌دهد.مقایسه دقت روش‌های مختلف بر حسب اندازه دیتاستنتایج به دست آمده نشان می‌دهد که BERT توانسته از نظر دقت، به خصوص با دیتای کمتر نتایج بهتری به دست آورد که از نتایج مورد انتظار از transfer learning است و امید برای کسب نتایج بهتر با دادگان و پردازش بیشتر وجود دارد. اما میزان بهبود نسبت به میزان پیچیدگی این شبکه عصبی و سربارهای بالا برای استفاده از آن، کمتر از حد انتظار است.در نگاهی دیگر به نتایج، جدول زیر دقت روشهای مختلف در دسته‌بندی سطح اول را به ازای ۱ میلیون آگهی در کنار هم نشان می‌دهد.نتایج روش‌های مختلف به ازای یک میلیون داده آموزشی در دسته‌بندی سطح اولدر کنار BERT، روش Fasttext نشان داد که با وجود داشتن دقتی کمتر از BERT، دقت و سرعتش برای انجام بسیاری از تسکها، بالا و کافیست و سهولت استفاده از آن برای بسیاری از کارها مزیت به حساب می آید. از طرفی، نتایج ضعیفی که از استخراج ویژگیهای BERT به دست آمد نشان می‌دهد fine-tune کردن شبکه BERT تاثیر مهمی روی language model آن می‌گذارد و نمیتوان از این مرحله به سادگی عبور کرد.نکته ای که وجود دارد این است که شاید تسک دسته‌بندی بهترین تسک برای سنجش میزان کارآمدی BERT نبوده چون طبق چیزی که از BERT می‌دانیم، یکی از خواص مهم آن به دست آوردن درک از محتوای متن است. مثلاً نمونه‌های زیر را در نظر بگیرید:چند نمونه از متون دسته‌بندی شده با سه روش مختلفدر این نمونه‌ها، در حالی که دو الگوریتم دیگر (fasttext و clcnn) همان دسته واقعی را پیشبینی کرده‌اند، اما BERT خلاف هر سه پیشبینی کرده است ولی پیش‌بینی‌اش به نظر معقول می‌آید. مثلاً‌ در نمونه اول با وجود آنکه در متن آگهی اشاره به پرده به عنوان وسیله خانه دارد، از آنجایی که متن آگهی درواقع خدمت نصب پرده هست، دسته این آگهی را خدمات در نظر گرفته است.مسئله این است که تسک دسته‌بندی در دیوار اغلب نیاز به چنین درکی از متن ندارد و شاید با روش‌های موسوم به bag-of-words و تمرکز روی پیش‌پردازش بتوان نتایج نسبتاً خوبی گرفت. شاید استفاده از BERT بر روی تسک‌هایی که نیاز بیشتری به درک محتوای متن دارند برای فهمیدن میزان قدرت BERT بهتر باشد. برای مثال تسکی که در روند آموزش BERT استفاده می‌شود، پیش‌بینی کلمات جاافتاده در متن است که به مراتب سخت‌تر و مفهومی‌تر از دسته‌بندی است.با این حال تجربه کار با BERT برای آشنایی با چالش‌های استفاده از یک روش جدید بسیار مفید بود و فهمیدیم موانع سر راه استفاده از آن چه بود و در چه جهتی می‌توان حرکت کرد.به عنوان چند پیشنهاد برای کارهای آتی می‌توان به صورت خلاصه به موارد زیر اشاره کرد:انجام عملیات fine-tune با دادگان بیشتر و مشاهده نتیجهتهیه موارد مورد نیاز برای آموزش BERT از پایه، که غیر از سخت‌افزار، شامل مواردی چون vocab هم می‌شوددرک عمیق‌تر معماری BERT و استفاده از بخشی از آن به جای همه ۱۲ لایه آن که این کار باعث کم شدن بار آموزش می‌شوداستفاده از BERT در فضای کار متنی برای تسک‌های مفهومی‌تر مانند تحلیل معنایی نظرات و ...