تجربه شرکت در یکی از چالش‌‌های کگل (Kaggle)

نوشته‌شده توسط عاطفه ولی‌پور، المیرا قربانی، نفیسه داوری، مینا جی‌رودی، امیرمحمد قریشی و محمدحسن ستاریان

کگل (Kaggle) یکی از بزرگترین جامعه‌های مهندسان، محصلان و حتی شرکت‌های حوزه داده و یادگیری ماشین و یادگیری عمیق است که اصلی‌ترین و معروف‌ترین فعالیت آن بسترسازی برای برگزاری چالش‌های مختلف یادگیری ماشین است که در آن‌ها شرکت‌ها و موسسات مختلف این حوزه باهدف برطرف کردن مسائل مختلف، چالش‌هایی را تعریف می‌کنند و با در اختیار گذاشتن اطلاعات مربوط به مسئله، جوایزی را برای نفرات برتر حل‌کننده آن چالش‌ها انتخاب می‌کنند. از اقدامات دیگر کگل می‌توان به ارائه سرویس‌های محاسباتی ابری (کرنل کگل)، مجموعه داده‌های عمومی (Public Datasets) و آموزش‌های یادگیری ماشین هستند.

در این مقاله، تجربه شرکت در چالش طبقه‌بندی سوالات غیرعملی Quora را به اشتراک می‌گذاریم.

مقدمه

برگزار کننده این چالش سرویس کورا (Quora) پلتفرمی برای پاسخ و جواب است که در آن هرکسی می تواند سوالات خود را در موضوعات مختلف بپرسد. از آنجایی که روزانه تعداد زیادی سوال در این سایت در زمینه‌های مختلف با اهداف متفاوت ثبت می‌شود و جامعه مخاطب این سایت تمامی اقشار جامعه را شامل می‌شود، بررسی این اطلاعات اهمیت دارد.

طبقه‌بندی سوالات غیرعلمی Quora؛ با خواندن عنوان چالش این سوال پیش می‌آید که معیار علمی بودن چیست؟ در پاسخ به این سوال باید اشاره کرد که عنوان اصلی چالش Insincere Questions Classification است که در عنوان از واژه Insincere برای توصیف سوالاتی که نیاز به شناسایی دارند استفاده شده است. معنی این واژه بی‌صداقت یا دورو است. در واقع هدف اصلی این چالش شناسایی انواع حالت‌هایی است که شخص ممکن است به صورتی غیرمستقیم یا به اصطلاح دوپهلو منظوری نامناسب را در سوال خود پرسیده باشد و یا هدفی خارج از صرف پرسش داشته باشد. از دشواری‌های این چالش همین مسئله است که هدف چالش پیدا کردن سوالات تبعیض‌آمیز در زمینه‌ای خاص نبوده و می‌خواهد انواع مختلف تبعیض، بی‌احترامی، توهین و تفرقه‌اندازی را  پوشش دهد.

تعدادی از ویژگی‌های یک سوال غیرعلمی به صورت زیر است:

  • استفاده از لحن غیرطبیعی
    • استفاده از لحنی اغراق‌آمیز برای برجسته‌کردن نکته‌ای درباره گروهی از مردم
    • یک استفهام انکاری بودن پرسش باهدف اشاره به نکته‌ای درباره گروهی از مردم
  • سرکوب کننده و یا التهاب‌آمیز بودن
    • نشردهنده یک تفکر تبعیض‌آمیز و یا تایید کلیشه‌ای درباره گروهی از مردم باشد
    • شامل حمله و یا توهین سرکوب کننده به شخص یا گروهی از اشخاص باشد
    • بی‌اعتبار و براساس فرضیات نادرست بودن
  • استفاده از محتوای جنسی باهدفی خارج از یافتن پاسخ

 

توضیحات

مسئله

مسئله‌ای که با آن روبرو بودیم، مسئله‌ای دوکلاسه از نوع طبقه‌بندی برروی داده متنی بدین صورت بود که یک سوال یا غیرعلمی است و یا نیست. از آنجایی که ذات مسئله پردازش متن است و اجزای جملات در متن کنار یکدیگر معنا پیدا می‌کنند، برای درک درستی از آن نیاز داریم تا مدل، حافظه‌ای از کلماتی که پیش از این دیده داشته باشد. بنابراین در این مسئله از شبکه‌های RNN استفاده می‌کنیم که در آن‌ها ترتیب زمانی داده‌ها نیز اهمیت دارند.

چالش

چالش طبقه‌بندی سوالات کورا، یک چالش Kernel Only بود. بدین معنی که مدل باید تنها توسط کرنلی که خود کورا در اختیار شرکت کنندگان قرار می‌دهد توسعه داده می‌شد و امکان توسعه مدل توسط شرکت کنندگان و سپس آپلود آن وجود نداشت. درواقع توسعه مدل از نظر منابع مورد استفاده و زمان، محدود به شرایط کرنل کگل بود که امکان تا ۶ ساعت پردازش CPU و تا ۲ ساعت پردازش روی GPU را به کاربران می‌داد.

از مزایای این شرایط این بود که تمامی شرکت کنندگان با شرایط یکسانی در چالش شرکت می‌کردند و افرادی که دسترسی به منابع وسیعتری داشتند برتری‌ای به دیگر شرکت کنندگان نداشتند و همچنین داده‌های مسئله درون کرنل دردسترس بوده و نیازی به دریافت دوباره آن‌ها نبود. اما از معایب آن این بود که از آنجایی که با تنها چندثانیه قطع اتصال به کرنل، تمامی دیتا‌ها و پروسس‌های تا آن لحظه پاک شده و از دست می‌رفت و شرایط مناسبی برای اتصال مهیا نبود و ما گاهی برای تست یک تغییر در کد مجبور به اجرای چندباره یک کرنل از ابتدا می‌شدیم که سرعت توسعه و تست و بررسی را به شدت کاهش می‌داد.

همین شرایط برای داده‌های مسئله نیز برقرار بود، یعنی برای این چالش امکان استفاده از داده‌های بیرونی وجود نداشت و امکان استفاده از ورد امبدینگ‌هایی (Word Embedding) خارج از آن‌هایی که همراه دیتاست دردسترس بودند نبود.

 

دیتاست

دیتاستی که در اختیار گذاشته شده بود ۶ گیگ شامل ۴ ورد امبدینگ زیر و داده‌های تست (Test)‌ و ترین (Train) بود.

داده‌های تست و ترین به صورت فایل‌های CSV بودند که در آن‌ها ID هر سوال به همراه متن سوال و لیبل آن که آیا این سوال غیرعلمی هست یا خیر آمده بود. با بررسی داده‌های ترین و تست می‌توان به وضوح دید که تعداد سوالات علمی (لیبل ۰) از سوالات غیرعلمی (لیبل ۱) بیشتر بوده و درواقع داده‌های مسئله نامتعادل (Unbalance) بودند. همین امر نشان می‌داد برای بررسی میزان صحت خروجی مدل از معیار صحت (Accuracy) استفاده نشده -که اگر اینگونه بود با لیبل زدن تمامی دیتا‌های تست با صفر به درصدی بالا می‌رسیدیم- و بلکه باید از معیاری به نام F Measure استفاده کرد.

accuracy

کسری از پیش‌بینی‌هاست که مدل به درستی تشخیص داده‌است. درواقع معیاری توصیفی از خطاهای ذاتی (سیستماتیک) اندازه گیری است که خود نشان دهنده‌ی تمایل ذاتی داده ها است.

f measure

در واقع F measure یک نوع میانگین بین پارامتر p (دقت) و پارامتر r (یادآوری) است. p دقت سیستم در میان دادهای پیش بینی شده است. r نسبت تعداد داده های پیش بینی شده، به تعداد کل داده های مورد انتظار برای پیش بینی است.

{\displaystyle F_{1}=2\cdot {\frac {\mathrm {precision} \cdot \mathrm {recall} }{\mathrm {precision} +\mathrm {recall} ))}

 

روش آموزش مدل

برای آموزش مدل روش‌های مختلفی را تست و استفاده کردیم که در ادامه بررسی می‌کنیم. این روش‌ها متاثر از گفتگوهای بخش بحث و گفتگو (Discussion) این چالش و همچنین کرنل‌هایی است که افراد مختلف به صورت عمومی منتشر کرده بودند و هرکس می‌توانست کد نوشته شده توسط آن‌ها را بررسی کند.

روش‌هایی ناموفق

یکی از روش‌هایی که تست کردیم استفاده از یک مدل از پیش پیاده‌سازی و آموزش داده‌شده بر اساس این مقاله در مورد شناسایی اخبار جعلی بود. برای ترین این مدل قبلا از یک سیستم با منابع مناسب و همچنین پیش‌پردازش روی دیتا به صورتی که دیتا متعادل شود استفاده شده بود و لیبل‌های دیتای تست را که با استفاده از API کگل بدست آورده بودیم نیز ذخیره کرده بودیم. درواقع تنها نیاز داشتیم دیتای تست لیبل خورده را وارد کرنل کرده و Submit کنیم. برای اینکار از آنجایی که چالش یک چالش Kernel Only بود داده‌ها را به صورت دستی درون کرنل کپی کرده و ثبت کردیم. نتیجه این مدل از حد انتظار پایین‌تر بوده و چیزی در حدود ۵۰ درصد بود. همچنین اقدام به پیاده‌سازی مدل با استفاده از فریم‌ورک FastAi کردیم که از آنجایی که امکان استفاده از منابع خارجی در کرنل نبود با مشکل مواجه شد.

پس از بررسی کرنل‌های پابلیک متوجه شدیم که تعدادی از افراد از لایه‌های شبکه Attention در مدل خود استفاده کرده بودند. برای بررسی میزان تاثیر این مورد، شبکه‌هایی از LSTM و GRU با و بدون لایه Attention  پیاده‌سازی کرده و بررسی کردیم. همچنین استفاده از شبکه‌های مختلف با ورد امبدینگ‌های مختلف و سپس استفاده از ترکیب نتایج آن‌ها هم از روش‌های مورد استفاده بعضی بود. برای بررسی تاثیر این مورد نیز، شبکه‌ای ساده با تنها استفاده از ورد امبدینگ Glove و لایه GRU پیاده‌سازی و بررسی شد که نتایج حاصله در حد انتظار مطلوب نبودند.

روش اصلی

روشی که در نهایت استفاده کردیم، انزمبلی (Ensemble) از شبکه‌های LSTM و GRU دوطرفه (Bidirectional) به همراه یک کانولوشن دو بعدی و یک شبکه Attention است. در ادامه به صورت خلاصه نحوه پیاده‌سازی را بررسی می‌کنیم:

پیاده‌سازی

برای پیاده‌سازی از کتابخانه کراس (Keras) استفاده می‌کنیم. در ابتدا تعدادی از علائم و کاراکترهایی که تاثیری در سوال نداشتند را مشخص کردیم تا بعدا با حذف آن‌ها داده اضافی کمتری داشته باشیم. که همینکار باعث بهبود در کارایی مدل شد. بعد از آن داده‌های تست و ترین که به صورت CSV ذخیره شده بودند را با استفاده از کتابخانه Pandas لود کرده و تمامی حروف را به صورت Lower Case تبدیل می‌کنیم همچنین برروی تمامی متن‌ها تابعی اعمال می‌کنیم تا کاراکترهایی که اضافی تلقی می‌شدند را حذف کند. در میان یک ملیون و چهارصد سوالی که در دسترس داشتیم تعدادی سوال خالی موجود بودند. برای مدیریت این شرایط این سوالات را با کاراکتری مانند # با کمک تابع fillna از کتابخانه Pandas پر میکردیم. سپس پس از جدا کردن ست ولیدیشن (Validation)‌ از داده‌های ترین، با استفاده از تابع Tokenizer از کلاس توابع پیش‌پرداش متن کراس، یک توکنایزر  ساخته و روی داده‌های ترین و تست و ولیدیشن اعمال کردیم، همینطور با اعمال تابع pad_sequences تمامی ست‌ها را به طول یکسان در آورده و داده‌های ترین و ولیدیشن را شافل کردیم.

در ادامه ورد امبدینگ‌های گلاو (glove)، فست تکست (fasttext) و پاراگرام (paragram) را لود کرده و برای هرکدام، ضرایب هر فیچر را ذخیره می‌کنیم. سپس با محاسبه میانگین و واریانس تمامی فیچر‌های امبدینگ، امبدینگ ماتریسی ساخته و بر میگردانیم تا در ادامه استفاده شود.

سپس یک شبکه CNN دوبعدی مطابق این توضیحات و یک لایه Attention که اینجا توضیح داده‌شده نیز ساختیم. همچنین شبکه‌های دوطرفه LSTM و GRU با  optimizer آدام با ترکیبات مختلفی از تعداد لایه‌های LSTM، داشتن یا نداشتن لایه Attention یا Pooling نیز ساختیم. در این شبکه‌ها از لایه‌های CuDNNLSTM و CuDNNGRU استفاده کردیم تا با پردازش پروسه توسط GPU سرعت آموزش مدل بیشتر شود.

در نهایت با بررسی ترکیب اعمال انواع ورد امبدینگ‌ها به مدل‌هایی که ساخته بودیم، سعی کردیم بهترین ترکیب‌ها را پیدا کنیم و نتایج هرکدام را ذخیره کردیم. پس با استفاده از ورد امبدینگ‌های گلاو و پاراگرام به عنوان ورودی شبکه‌هایی که ساخته بودیم در طول ۳ ایپاک خروجی هر شبکه را مشخص و سپس خروجی‌های حاصله را با نسبت دقت هر کدام از شبکه‌ها جمع کرده و با اعمال یک آستانه (Threshold) مناسب خروجی مدل را تعیین کردیم.

فوتر سایت

اسلایدر سایدبار

درباره ما

درباره ما

ما گروهی از دانشجویان رشته کامپیوتر دانشگاه شهید رجایی هستیم که به راهنمایی و تدریس استاد علی‌رضا اخوان‌پور به دنیای یادگیری عمیق پا گذاشتیم و دوست داریم چیزهایی که در این مسیر یادمی‌گیریم رو به اشتراک بذاریم.

شبکه های اجتماعی

مطالب اخیر