یک مدل یادگیری ماشین هرزنامه نظرات بسازید

۱. قبل از شروع

در این آزمایشگاه کد، کدی را که با استفاده از TensorFlow و TensorFlow Lite Model Maker ایجاد شده است، بررسی خواهید کرد تا با استفاده از یک مجموعه داده مبتنی بر هرزنامه‌های کامنت، مدلی ایجاد کنید. داده‌های اصلی در kaggle موجود است. این داده‌ها در یک CSV واحد جمع‌آوری شده و با حذف متن‌های خراب، نشانه‌گذاری‌ها، کلمات تکراری و موارد دیگر، تمیز شده‌اند. این کار تمرکز روی مدل را به جای متن آسان‌تر می‌کند.

کدی که بررسی خواهید کرد در اینجا ارائه شده است، اما اکیداً توصیه می‌شود که از کد موجود در Google Colab پیروی کنید .

پیش‌نیازها

  • این آزمایشگاه کد برای توسعه‌دهندگان باتجربه‌ای نوشته شده است که در یادگیری ماشین تازه‌کار هستند.
  • این آزمایشگاه کد بخشی از مسیر «شروع به کار با طبقه‌بندی متن برای موبایل» است. اگر هنوز فعالیت‌های قبلی را انجام نداده‌اید، لطفاً همین حالا دست نگه دارید و این کار را انجام دهید.

آنچه یاد خواهید گرفت

  • نحوه نصب مدل‌ساز TensorFlow Lite با استفاده از Google Colab
  • نحوه دانلود داده‌ها از سرور ابری به دستگاه شما
  • نحوه استفاده از یک بارگذار داده
  • نحوه ساخت مدل

آنچه نیاز دارید

۲. نصب مدل‌ساز TensorFlow Lite

آزمایشگاه همکاری را باز کنید. اولین سلول در دفترچه یادداشت، TensorFLow Lite Model Maker را برای شما نصب خواهد کرد:

!pip install -q tflite-model-maker

پس از اتمام، به سلول بعدی بروید.

۳. کد را وارد کنید

سلول بعدی تعدادی ورودی دارد که کد موجود در دفترچه یادداشت باید از آنها استفاده کند:

import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

همچنین بررسی می‌شود که آیا TensorFlow 2.x را اجرا می‌کنید یا خیر، که برای استفاده از Model Maker ضروری است.

۴. داده‌ها را دانلود کنید

در مرحله بعد، داده‌ها را از سرور ابری روی دستگاه خود دانلود می‌کنید و data_file طوری تنظیم می‌کنید که به فایل محلی اشاره کند:

data_file = tf.keras.utils.get_file(fname='comment-spam.csv', 
  origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv', 
  extract=False)

مدل میکر می‌تواند مدل‌ها را از فایل‌های CSV ساده‌ای مانند این آموزش دهد. شما فقط باید مشخص کنید که کدام ستون‌ها متن و کدام‌ها برچسب‌ها را نگه می‌دارند. بعداً در codelab خواهید دید که چگونه این کار را انجام دهید.

۵. جاسازی‌های از پیش آموخته‌شده

معمولاً هنگام استفاده از Model Maker، شما مدل‌ها را از ابتدا نمی‌سازید. شما از مدل‌های موجودی استفاده می‌کنید که آنها را مطابق با نیازهای خود سفارشی می‌کنید.

برای مدل‌های زبانی، مانند این مدل، این شامل استفاده از جاسازی‌های از پیش آموخته شده است. ایده پشت جاسازی این است که کلمات به اعداد تبدیل می‌شوند و به هر کلمه در مجموعه کلی شما یک عدد داده می‌شود. جاسازی یک بردار است که برای تعیین احساسات آن کلمه با ایجاد یک "جهت" برای کلمه استفاده می‌شود. به عنوان مثال، کلماتی که مرتباً در پیام‌های اسپم نظر استفاده می‌شوند، بردارهایشان در جهت مشابهی قرار می‌گیرند و کلماتی که این کار را نمی‌کنند در جهت مخالف قرار می‌گیرند.

با استفاده از جاسازی‌های از پیش آموخته‌شده، می‌توانید با یک مجموعه یا مجموعه‌ای از کلمات که قبلاً احساساتشان از متن‌های زیادی آموخته شده است، شروع کنید. این کار شما را بسیار سریع‌تر از شروع از صفر به راه‌حل می‌رساند.

Model Maker چندین جاسازی از پیش آموخته شده را ارائه می‌دهد که می‌توانید از آنها استفاده کنید، اما ساده‌ترین و سریع‌ترین آنها برای شروع average_word_vec است.

کد به این صورت است:

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

پارامتر num_words

همچنین تعداد کلماتی را که می‌خواهید مدل شما استفاده کند، مشخص خواهید کرد.

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

عدد کوچکتر در اینجا ممکن است مدل کوچکتر و سریعتری ارائه دهد، اما می‌تواند دقت کمتری داشته باشد، زیرا کلمات کمتری را تشخیص می‌دهد. عدد بزرگتر در اینجا مدل بزرگتر و کندتری خواهد داشت. یافتن نقطه بهینه کلیدی است!

پارامتر wordvec_dim

پارامتر wordved_dim تعداد ابعادی است که می‌خواهید برای بردار هر کلمه استفاده کنید. قاعده سرانگشتی که از تحقیق به دست آمده این است که این مقدار، ریشه چهارم تعداد کلمات است. برای مثال، اگر از ۲۰۰۰ کلمه استفاده می‌کنید، نقطه شروع خوب ۷ است. اگر تعداد کلماتی را که استفاده می‌کنید تغییر دهید، می‌توانید این را نیز تغییر دهید.

پارامتر seq_len

مدل‌ها معمولاً در مورد مقادیر ورودی بسیار انعطاف‌ناپذیر هستند. برای یک مدل زبانی، این بدان معناست که مدل زبانی می‌تواند جملات با طول خاص و ایستا را طبقه‌بندی کند. این توسط پارامتر seq_len یا طول توالی تعیین می‌شود.

وقتی کلمات را به اعداد (یا توکن‌ها) تبدیل می‌کنید، یک جمله به دنباله‌ای از این توکن‌ها تبدیل می‌شود. بنابراین مدل شما (در این مورد) آموزش داده می‌شود تا جملاتی را که ۲۰ توکن دارند، طبقه‌بندی و تشخیص دهد. اگر جمله طولانی‌تر از این باشد، کوتاه می‌شود. اگر کوتاه‌تر باشد، اضافه می‌شود. یک توکن اختصاصی <PAD> در مجموعه خواهید دید که برای این کار استفاده خواهد شد.

۶. از یک بارگذار داده استفاده کنید

قبلاً فایل CSV را دانلود کردید. حالا وقت آن است که از یک بارگذار داده برای تبدیل این فایل به داده‌های آموزشی که مدل بتواند تشخیص دهد، استفاده کنید:

data = DataLoader.from_csv(
    filename=data_file,
    text_column='commenttext',
    label_column='spam',
    model_spec=spec,
    delimiter=',',
    shuffle=True,
    is_training=True)

train_data, test_data = data.split(0.9)

اگر فایل CSV را در یک ویرایشگر باز کنید، خواهید دید که هر خط فقط دو مقدار دارد و این مقادیر با متن در خط اول فایل توصیف شده‌اند. معمولاً هر ورودی به عنوان یک ستون در نظر گرفته می‌شود.

خواهید دید که توصیف‌گر ستون اول commenttext است و اولین ورودی در هر خط، متن نظر است. به طور مشابه، توصیف‌گر ستون دوم spam است و خواهید دید که ورودی دوم در هر خط True یا False, است تا مشخص شود که آیا آن متن، نظر اسپم محسوب می‌شود یا خیر. سایر ویژگی‌ها model_spec را که قبلاً ایجاد کرده‌اید، به همراه یک کاراکتر جداکننده تنظیم می‌کنند که در این مورد یک کاما است زیرا فایل با کاما از هم جدا شده است. شما از این داده‌ها برای آموزش مدل استفاده خواهید کرد، بنابراین is_Training روی True تنظیم شده است.

شما می‌خواهید بخشی از داده‌ها را برای آزمایش مدل نگه دارید. داده‌ها را تقسیم کنید، ۹۰٪ آن را برای آموزش و ۱۰٪ دیگر را برای آزمایش/ارزیابی. از آنجا که ما این کار را انجام می‌دهیم، می‌خواهیم مطمئن شویم که داده‌های آزمایش به صورت تصادفی انتخاب می‌شوند و ۱۰٪ «پایین» مجموعه داده‌ها نیستند، بنابراین هنگام بارگذاری داده‌ها shuffle=True برای تصادفی‌سازی آنها استفاده می‌کنید.

۷. مدل را بسازید

سلول بعدی صرفاً برای ساخت مدل است و یک خط کد دارد:

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50, 
                               validation_data=test_data)

این یک مدل طبقه‌بندی متن با Model Maker ایجاد می‌کند و شما داده‌های آموزشی مورد نظر برای استفاده (مطابق تنظیمات مرحله ۴)، مشخصات مدل (مطابق تنظیمات مرحله ۴) و تعداد دوره‌ها، در این مورد ۵۰، را مشخص می‌کنید.

اصل اساسی یادگیری ماشینی این است که نوعی تطبیق الگو است. در ابتدا، وزن‌های از پیش آموزش‌دیده برای کلمات را بارگذاری می‌کند و سعی می‌کند آنها را با پیش‌بینی اینکه کدام یک، وقتی با هم گروه‌بندی می‌شوند، نشان‌دهنده هرزنامه هستند و کدام یک نیستند، گروه‌بندی کند. در اولین بار، احتمالاً نزدیک به ۵۰:۵۰ خواهد بود، زیرا مدل تازه شروع به کار کرده است.

b94b00f0b155db3d.png

سپس نتایج این را اندازه‌گیری می‌کند و کد بهینه‌سازی را برای اصلاح پیش‌بینی خود اجرا می‌کند، سپس دوباره امتحان می‌کند. این یک دوره است. بنابراین، با مشخص کردن دوره‌ها=50، 50 بار از آن "حلقه" عبور می‌کند.

85f1d21c0b64d654.png

زمانی که به دوره پنجاهم می‌رسید، مدل سطح دقت بسیار بالاتری را گزارش خواهد کرد. در این مورد، ۹۹٪ را نشان می‌دهد!

در سمت راست، ارقام دقت اعتبارسنجی را مشاهده خواهید کرد. این ارقام معمولاً کمی کمتر از دقت آموزش خواهند بود، زیرا نشانه‌ای از نحوه طبقه‌بندی داده‌هایی هستند که مدل قبلاً «ندیده» است. این مدل از 10٪ داده‌های آزمایشی که قبلاً کنار گذاشته بودیم، استفاده می‌کند.

5be7967ec70e4302.png

۸. مدل را اکسپورت کنید

پس از اتمام آموزش، می‌توانید مدل را صادر کنید.

TensorFlow یک مدل را با فرمت خاص خود آموزش می‌دهد و این فرمت باید به فرمت TFLITE تبدیل شود تا بتوان از آن در یک برنامه تلفن همراه استفاده کرد. Model Maker این پیچیدگی را برای شما مدیریت می‌کند.

به سادگی مدل را با مشخص کردن یک دایرکتوری، export کنید:

model.export(export_dir='/mm_spam')

درون آن دایرکتوری، یک فایل model.tflite خواهید دید. آن را دانلود کنید. در codelab بعدی، جایی که آن را به برنامه اندروید خود اضافه می‌کنید، به آن نیاز خواهید داشت!

ملاحظات iOS

مدل .tflite که شما صادر کردید برای اندروید به خوبی کار می‌کند، زیرا فراداده‌های مربوط به مدل درون آن تعبیه شده است و اندروید استودیو می‌تواند آن فراداده‌ها را بخواند.

این فراداده بسیار مهم است زیرا شامل یک فرهنگ لغت از توکن‌ها است که کلمات را همانطور که مدل آنها را تشخیص می‌دهد، نشان می‌دهد. به یاد دارید که قبلاً یاد گرفتید که کلمات به توکن تبدیل می‌شوند و سپس به این توکن‌ها بردارهایی برای احساساتشان داده می‌شود؟ برنامه تلفن همراه شما باید این توکن‌ها را بشناسد. به عنوان مثال، اگر "dog" به 42 توکن شده باشد و کاربران شما "dog" را در یک جمله تایپ کنند، برنامه شما باید "dog" را به 42 تبدیل کند تا مدل آن را درک کند. به عنوان یک توسعه‌دهنده اندروید، شما یک "TensorFlow Lite Task Library" خواهید داشت که استفاده از این را آسان‌تر می‌کند، اما در iOS باید واژگان را پردازش کنید، بنابراین باید آن را در دسترس داشته باشید. Model Maker می‌تواند با مشخص کردن پارامتر export_format این را برای شما صادر کند. بنابراین، برای دریافت برچسب‌ها و واژگان مدل خود، می‌توانید از این استفاده کنید:

model.export(export_dir='/mm_spam/', 
             export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

۹. تبریک

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

در کدلاگ بعدی، نحوه ویرایش برنامه اندروید خود را برای استفاده از این مدل خواهید دید تا بتوانید طبقه‌بندی نظرات اسپم را شروع کنید.