۱. قبل از شروع
این آزمایشگاه کد به گونهای طراحی شده است که بر اساس نتیجه نهایی آزمایشگاه کد قبلی در این مجموعه برای تشخیص هرزنامه کامنت با استفاده از TensorFlow.js ساخته شود.
در کدلب قبلی، شما یک صفحه وب کاملاً کاربردی برای یک وبلاگ ویدیویی تخیلی ایجاد کردید. شما توانستید نظرات را قبل از ارسال به سرور برای ذخیره سازی یا به سایر کلاینتهای متصل، با استفاده از یک مدل تشخیص هرزنامه از پیش آموزش دیده که توسط TensorFlow.js در مرورگر پشتیبانی میشود، از نظر هرزنامه فیلتر کنید.
نتیجه نهایی آن codelab در زیر نشان داده شده است:

اگرچه این روش خیلی خوب کار کرد، اما موارد حاشیهای وجود دارد که باید بررسی شوند و مشخص شود که مدل قادر به تشخیص آنها نبوده است. میتوانید مدل را دوباره آموزش دهید تا موقعیتهایی را که مدل قادر به مدیریت آنها نبوده است، در نظر بگیرد.
این آزمایشگاه کد بر استفاده از پردازش زبان طبیعی (هنر درک زبان انسان با کامپیوتر) تمرکز دارد و به شما نشان میدهد که چگونه یک برنامه وب موجود را که ایجاد کردهاید تغییر دهید (توصیه میشود که آزمایشگاههای کد را به ترتیب انجام دهید )، تا با مشکل بسیار جدی هرزنامه نظرات مقابله کنید، که بسیاری از توسعهدهندگان وب مطمئناً هنگام کار بر روی یکی از تعداد رو به رشد برنامههای وب محبوب امروزی با آن مواجه میشوند.
در این آزمایشگاه کد، شما یک قدم فراتر خواهید رفت و مدل یادگیری ماشین خود را برای در نظر گرفتن تغییرات در محتوای پیامهای اسپم که ممکن است با گذشت زمان تکامل یابند، بر اساس روندهای فعلی یا موضوعات محبوب مورد بحث، بازآموزی خواهید کرد که به شما امکان میدهد مدل را بهروز نگه دارید و چنین تغییراتی را در نظر بگیرید.
پیشنیازها
- اولین آزمایشگاه کد در این مجموعه را تکمیل کرد.
- آشنایی اولیه با فناوریهای وب شامل HTML، CSS و جاوا اسکریپت.
آنچه خواهید ساخت
شما از وبسایت ساختهشدهی قبلی برای یک وبلاگ ویدیویی ساختگی با بخش نظرات بلادرنگ استفاده مجدد خواهید کرد و آن را ارتقا خواهید داد تا یک نسخه آموزشدیده سفارشی از مدل تشخیص هرزنامه را با استفاده از TensorFlow.js بارگذاری کند، بنابراین در موارد خاص که قبلاً در آنها شکست میخورد، عملکرد بهتری خواهد داشت. البته به عنوان توسعهدهندگان و مهندسان وب، میتوانید این UX فرضی را برای استفاده مجدد در هر وبسایتی که ممکن است در نقشهای روزمره خود روی آن کار کنید، تغییر دهید و راهحل را متناسب با هر مورد استفاده مشتری تطبیق دهید - شاید یک وبلاگ، انجمن یا نوعی CMS، مانند Drupal باشد.
بریم سراغ هک...
آنچه یاد خواهید گرفت
شما:
- موارد حاشیهای که مدل از پیش آموزشدیده در آنها شکست میخورد را شناسایی کنید
- مدل طبقهبندی هرزنامه که با استفاده از Model Maker ایجاد شده بود را مجدداً آموزش دهید.
- این مدل مبتنی بر پایتون را برای استفاده در مرورگرها به فرمت TensorFlow.js صادر کنید.
- مدل میزبانی شده و دیکشنری آن را با مدل تازه آموزش دیده بهروزرسانی کنید و نتایج را بررسی کنید.
آشنایی با HTML5، CSS و جاوا اسکریپت برای این آزمایش فرض شده است. همچنین شما مقداری کد پایتون را از طریق یک نوتبوک «آزمایشگاه مشترک» اجرا خواهید کرد تا مدلی را که با استفاده از Model Maker ایجاد شده است، دوباره آموزش دهید، اما برای انجام این کار نیازی به آشنایی با پایتون نیست.
۲. برای کدنویسی آماده شوید
بار دیگر شما از Glitch.com برای میزبانی و تغییر برنامه وب استفاده خواهید کرد. اگر قبلاً آزمایشگاه کد پیشنیاز را تکمیل نکردهاید، میتوانید نتیجه نهایی را در اینجا به عنوان نقطه شروع خود کپی کنید . اگر در مورد نحوه عملکرد کد سؤالی دارید، اکیداً توصیه میشود که قبل از ادامه، آزمایشگاه کد قبلی را که نحوه ساخت این برنامه وب کارآمد را شرح داده است، تکمیل کنید .
در Glitch، کافیست روی دکمه remix this کلیک کنید تا آن را منشعب کنید و مجموعهای جدید از فایلهایی که میتوانید ویرایش کنید، ایجاد شود.
۳. موارد حاشیهای را در راهحل قبلی کشف کنید
اگر وبسایت تکمیلشدهای را که تازه کپی کردهاید باز کنید و سعی کنید چند نظر تایپ کنید، متوجه خواهید شد که بیشتر اوقات طبق انتظار کار میکند، نظراتی را که شبیه هرزنامه به نظر میرسند، مسدود میکند و به پاسخهای قانونی اجازه عبور میدهد.
با این حال، اگر مهارت پیدا کنید و سعی کنید با عبارات و اصطلاحات، مدل را بشکنید، احتمالاً در مقطعی موفق خواهید شد. با کمی آزمون و خطا میتوانید به صورت دستی مثالهایی مانند نمونههای نشان داده شده در زیر ایجاد کنید. سعی کنید این موارد را در برنامه وب موجود کپی کنید، کنسول را بررسی کنید و احتمالاتی را که برای هرزنامه بودن نظر برمیگردد، ببینید:
نظرات قانونی ارسال شده بدون مشکل (نظرات منفی واقعی):
- «وای، من عاشق این ویدیو هستم، کارت فوقالعادهست.» احتمال اسپم: ۴۷.۹۱۸۵۴٪
- «کاملاً عاشق این دموها شدم! اطلاعات بیشتری دارید؟» احتمال هرزنامه: ۴۷.۱۵۸۹۸٪
- «برای کسب اطلاعات بیشتر به چه وبسایتی میتوانم مراجعه کنم؟» احتمال هرزنامه: ۱۵.۳۲۴۹۵٪
این عالی است، احتمالات برای همه موارد فوق بسیار پایین است و با موفقیت از SPAM_THRESHOLD پیشفرض با احتمال حداقل ۷۵٪ قبل از انجام اقدام (که در کد script.js از codelab قبلی تعریف شده است) عبور میکند.
حالا بیایید سعی کنیم چند کامنت تند و تیز دیگر بنویسیم که به عنوان هرزنامه علامتگذاری میشوند، هرچند که هرزنامه نیستند...
نظرات قانونی که به عنوان هرزنامه علامتگذاری شدهاند (مثبت کاذب):
- «کسی میتونه لینک وبسایت ماسکی که زده رو بده؟» احتمال اسپم: ۹۸.۴۶۴۶۶٪
- «میتوانم این آهنگ را از اسپاتیفای بخرم؟ لطفاً یکی به من اطلاع بدهد!» احتمال هرزنامه: ۹۴.۴۰۹۵۳٪
- «کسی میتونه با من تماس بگیره و جزئیات دانلود TensorFlow.js رو بهم بگه؟» احتمال اسپم: ۸۳.۲۰۰۸۴٪
اوه نه! به نظر میرسد این نظرات معتبر در حالی که باید مجاز باشند، به عنوان هرزنامه علامتگذاری میشوند. چگونه میتوانید این مشکل را حل کنید؟
یک گزینه ساده این است که SPAM_THRESHOLD به بیش از ۹۸.۵٪ اطمینان افزایش دهیم. در این صورت، این نظرات با طبقهبندی نادرست منتشر میشوند. با در نظر گرفتن این نکته، بیایید با سایر نتایج ممکن در زیر ادامه دهیم...
نظرات اسپم علامتگذاری شده به عنوان اسپم (مثبت واقعی):
- «این عالیه، اما لینکهای دانلود وبسایت من رو ببین که بهترن!» احتمال هرزنامه: ۹۹.۷۷۸۷۳٪
- «من افرادی را میشناسم که میتوانند برای شما دارو تهیه کنند، فقط برای جزئیات بیشتر به پروفایل pr0 من مراجعه کنید.» احتمال هرزنامه: ۹۸.۴۶۹۵۵٪
- «برای دانلود ویدیوهای شگفتانگیزتر و حتی بهتر، به پروفایل من مراجعه کنید! http://example.com» احتمال هرزنامه: ۹۶.۲۶۳۸۳٪
خب، این با آستانهی ۷۵٪ اولیهی ما مطابق انتظار کار میکند، اما با توجه به اینکه در مرحلهی قبل SPAM_THRESHOLD به بیش از ۹۸.۵٪ اطمینان تغییر دادید، این به این معنی است که ۲ مثال در اینجا اجازهی عبور خواهند داشت، بنابراین شاید آستانه خیلی بالا باشد. شاید ۹۶٪ بهتر باشد؟ اما اگر این کار را انجام دهید، یکی از نظرات بخش قبلی (مثبتهای کاذب) به عنوان هرزنامه علامتگذاری میشود، در حالی که معتبر بودند، زیرا امتیاز آن ۹۸.۴۶۴۶۶٪ بود.
در این حالت، احتمالاً بهتر است که تمام این نظرات اسپم واقعی را ثبت کنید و به سادگی برای خطاهای بالا دوباره آموزش دهید. با تنظیم آستانه روی ۹۶٪، تمام موارد مثبت واقعی همچنان ثبت میشوند و ۲ مورد از موارد مثبت کاذب بالا را حذف میکنید. برای تغییر فقط یک عدد، خیلی هم بد نیست.
ادامه بدیم...
نظرات اسپمی که اجازه انتشار داشتند (نظرات منفی کاذب):
- «برای دانلود ویدیوهای شگفتانگیزتر و حتی بهتر، به پروفایل من مراجعه کنید!» احتمال هرزنامه: ۷.۵۴۹۲۶٪
- « برای کلاسهای ورزشی ما تخفیف بگیرید. به pr0file مراجعه کنید! » احتمال هرزنامه: ۱۷.۴۹۸۴۹٪
- «وای خدای من، سهام گوگل خیلی بالا رفت! قبل از اینکه خیلی دیر شود، اقدام کنید!» احتمال هرزنامه: 20.42894%
برای این نظرات، با تغییر بیشتر مقدار SPAM_THRESHOLD هیچ کاری نمیتوانید انجام دهید. کاهش آستانه هرزنامه از ۹۶٪ به حدود ۹٪ منجر به علامتگذاری نظرات واقعی به عنوان هرزنامه میشود - یکی از آنها با وجود قانونی بودن، امتیاز ۵۸٪ دارد. تنها راه برای مقابله با نظراتی از این دست، آموزش مجدد مدل با در نظر گرفتن چنین موارد حاشیهای در دادههای آموزشی است تا مدل یاد بگیرد که دیدگاه خود را نسبت به جهان برای تشخیص هرزنامه بودن یا نبودن تنظیم کند.
در حالی که تنها گزینه باقی مانده در حال حاضر آموزش مجدد مدل است، شما همچنین دیدید که چگونه میتوانید آستانه زمانی را که تصمیم میگیرید چیزی را اسپم بنامید، اصلاح کنید تا عملکرد نیز بهبود یابد. به عنوان یک انسان، ۷۵٪ کاملاً مطمئن به نظر میرسد، اما برای این مدل باید به ۸۱.۵٪ نزدیکتر میشدید تا با ورودیهای نمونه مؤثرتر باشد.
هیچ مقدار جادویی واحدی وجود ندارد که در مدلهای مختلف به خوبی کار کند، و این مقدار آستانه باید پس از آزمایش با دادههای دنیای واقعی برای هر مدل، بر اساس آن مدل تعیین شود تا مشخص شود چه چیزی به خوبی کار میکند.
ممکن است در برخی موقعیتها، داشتن یک نتیجه مثبت (یا منفی) کاذب عواقب جدی داشته باشد (مثلاً در صنعت پزشکی)، بنابراین میتوانید آستانه خود را بسیار بالا تنظیم کنید و برای مواردی که به این آستانه نمیرسند، درخواست بررسیهای دستی بیشتری کنید. این انتخاب شما به عنوان یک توسعهدهنده است و نیاز به کمی آزمایش دارد.
۴. مدل تشخیص هرزنامه کامنت را دوباره آموزش دهید
در بخش قبل، تعدادی از موارد حاشیهای را شناسایی کردید که برای مدل با شکست مواجه میشدند و تنها گزینه، آموزش مجدد مدل برای در نظر گرفتن این موقعیتها بود. در یک سیستم عملیاتی، میتوانید این موارد را به مرور زمان پیدا کنید، زیرا افراد به صورت دستی نظری را که اجازه ورود به سیستم را داشته، به عنوان هرزنامه علامتگذاری میکنند یا مدیرانی که نظرات علامتگذاری شده را بررسی میکنند، متوجه میشوند که برخی از آنها در واقع هرزنامه نیستند و میتوانند چنین نظراتی را برای آموزش مجدد علامتگذاری کنند. با فرض اینکه شما مجموعهای از دادههای جدید را برای این موارد حاشیهای جمعآوری کردهاید (برای بهترین نتیجه، در صورت امکان باید تغییراتی در این جملات جدید داشته باشید)، اکنون به شما نشان خواهیم داد که چگونه مدل را با در نظر گرفتن آن موارد حاشیهای، بازآموزی کنید.
خلاصه مدل از پیش ساخته شده
مدل پیشساختهای که شما استفاده کردید، مدلی بود که توسط یک شخص ثالث از طریق Model Maker ایجاد شده بود که از یک مدل «تعبیه کلمه متوسط» برای عملکرد خود استفاده میکند.
از آنجایی که مدل با Model Maker ساخته شده است، برای آموزش مجدد مدل، باید به طور خلاصه به پایتون سوئیچ کنید و سپس مدل ایجاد شده را به فرمت TensorFlow.js خروجی بگیرید تا بتوانید از آن در مرورگر استفاده کنید. خوشبختانه Model Maker استفاده از مدلهای خود را بسیار ساده کرده است، بنابراین دنبال کردن این مراحل باید بسیار آسان باشد و ما شما را در این فرآیند راهنمایی خواهیم کرد، بنابراین اگر قبلاً هرگز از پایتون استفاده نکردهاید، نگران نباشید!
کولابها
از آنجایی که در این آزمایشگاه کد، نگرانی زیادی در مورد راهاندازی یک سرور لینوکس با تمام ابزارهای مختلف پایتون ندارید، میتوانید به سادگی کد را از طریق مرورگر وب با استفاده از "Colab Notebook" اجرا کنید. این نوتبوکها میتوانند به یک "backend" متصل شوند - که به سادگی یک سرور با برخی موارد از پیش نصب شده است، که از طریق آن میتوانید کد دلخواه را در مرورگر وب اجرا کنید و نتایج را ببینید. این برای نمونهسازی سریع یا برای استفاده در آموزشهایی مانند این بسیار مفید است.
کافیست به آدرس colab.research.google.com بروید، صفحه خوشامدگویی مانند تصویر زیر به شما نمایش داده میشود:

حالا روی دکمهی «دفترچهی جدید» در پایین سمت راست پنجرهی بازشو کلیک کنید. باید یک صفحهی خالی مانند تصویر زیر ببینید:

عالی! مرحله بعدی اتصال آزمایشگاه فرانتاند به یک سرور بکاند است تا بتوانید کد پایتونی که خواهید نوشت را اجرا کنید. این کار را با کلیک روی Connect در بالا سمت راست و انتخاب Connect to hosted runtime انجام دهید.

پس از اتصال، باید آیکونهای RAM و Disk را در جای خود، مانند تصویر زیر، مشاهده کنید:

آفرین! حالا میتوانید کدنویسی در پایتون را برای آموزش مجدد مدل Model Maker شروع کنید. کافیست مراحل زیر را دنبال کنید.
مرحله ۱
در اولین سلولی که در حال حاضر خالی است، کد زیر را کپی کنید. این کد، TensorFlow Lite Model Maker را با استفاده از مدیر بسته پایتون به نام "pip" نصب میکند (شبیه به npm است که اکثر خوانندگان این آزمایشگاه کد ممکن است با آن از اکوسیستم JS بیشتر آشنا باشند):
!apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0
!pip install -q tflite-model-maker
با این حال، قرار دادن کد در سلول، آن را اجرا نمیکند. در مرحله بعد، ماوس خود را روی سلول خاکستری که کد بالا را در آن قرار دادهاید، قرار دهید. یک نماد کوچک "پخش" در سمت چپ سلول، همانطور که در زیر هایلایت شده است، ظاهر میشود:
برای اجرای کدی که در سلول تایپ کردهاید، روی دکمهی پخش کلیک کنید.
اکنون خواهید دید که 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')
چیزهای کاملاً استانداردی هستند، حتی اگر با پایتون آشنا نباشید. شما فقط برخی از ابزارها و توابع Model Maker مورد نیاز برای طبقهبندی هرزنامه را وارد میکنید. این همچنین بررسی میکند که آیا TensorFlow 2.x را اجرا میکنید یا خیر، که برای استفاده از Model Maker الزامی است.
در نهایت، درست مانند قبل، با فشردن آیکون «پخش» هنگام قرار دادن ماوس روی سلول، آن را اجرا کنید و سپس یک سلول کد جدید برای مرحله بعدی اضافه کنید.
مرحله ۳
در مرحله بعد، دادهها را از یک سرور راه دور به دستگاه خود دانلود خواهید کرد و متغیر training_data را به عنوان مسیر فایل محلی دانلود شده تنظیم خواهید کرد:
data_file = tf.keras.utils.get_file(fname='comment-spam-extras.csv', origin='https://storage.googleapis.com/jmstore/TensorFlowJS/EdX/code/6.5/jm_blog_comments_extras.csv', extract=False)
مدلساز میتواند مدلها را از فایلهای CSV ساده مانند فایل دانلود شده آموزش دهد. فقط باید مشخص کنید که کدام ستونها متن و کدام ستونها برچسبها را نگه میدارند. نحوه انجام این کار را در مرحله ۵ خواهید دید. در صورت تمایل، میتوانید مستقیماً فایل CSV را دانلود کنید تا ببینید چه چیزی در آن وجود دارد.
اگر تیزبین باشید، متوجه خواهید شد که نام این فایل jm_blog_comments _extras .csv است - این فایل صرفاً دادههای آموزشی اصلی است که ما برای تولید اولین مدل اسپم کامنت استفاده کردیم و با دادههای جدید مربوط به موارد حاشیهای که کشف کردهاید ترکیب شده است، بنابراین همه در یک فایل قرار دارند. شما علاوه بر جملات جدیدی که میخواهید از آنها یاد بگیرید، به دادههای آموزشی اصلی مورد استفاده برای آموزش مدل نیز نیاز دارید.
اختیاری: اگر این فایل CSV را دانلود کنید و چند خط آخر را بررسی کنید، مثالهایی برای موارد حاشیهای که قبلاً به درستی کار نمیکردند، خواهید دید. آنها به تازگی به انتهای دادههای آموزشی موجود که مدل از پیش ساخته شده برای آموزش خود استفاده میکرد، اضافه شدهاند.
این سلول را اجرا کنید، سپس پس از اتمام اجرای آن، یک سلول جدید اضافه کنید و به مرحله ۴ بروید.
مرحله ۴
هنگام استفاده از Model Maker، شما مدلها را از ابتدا نمیسازید. شما معمولاً از مدلهای موجود استفاده میکنید که سپس آنها را مطابق با نیازهای خود سفارشیسازی خواهید کرد.
Model Maker چندین مدل تعبیهشده از پیش آموختهشده را ارائه میدهد که میتوانید از آنها استفاده کنید، اما سادهترین و سریعترین آنها برای شروع average_word_vec است که همان چیزی است که در codelab قبلی برای ساخت وبسایت خود استفاده کردید. کد زیر را مشاهده میکنید:
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
پارامتر
پارامتر wordvec_dim تعداد ابعادی است که میخواهید برای بردار هر کلمه استفاده کنید. این ابعاد اساساً ویژگیهای مختلفی هستند (که توسط الگوریتم یادگیری ماشین هنگام آموزش ایجاد میشوند) که هر کلمه داده شده میتواند اندازهگیری شود و برنامه از آنها برای تلاش و بهترین ارتباط کلماتی که به نوعی معنیدار مشابه هستند، استفاده خواهد کرد.
برای مثال، اگر بُعدی برای میزان «پزشکی» بودن یک کلمه داشته باشید، کلمهای مانند «قرصها» ممکن است در این بُعد امتیاز بالایی کسب کند و با کلمات دیگری مانند «اشعه ایکس» که امتیاز بالایی دارند مرتبط باشد، اما کلمه «گربه» در این بُعد امتیاز پایینی کسب کند. ممکن است معلوم شود که «بُعد پزشکی» برای تعیین هرزنامه هنگام ترکیب با سایر ابعاد بالقوهای که ممکن است تصمیم به استفاده از آنها بگیرد و مهم باشند، مفید است.
در مورد کلماتی که در «بُعد پزشکی» امتیاز بالایی میگیرند، ممکن است به این نتیجه رسید که بُعد دومی که کلمات را به بدن انسان مرتبط میکند، میتواند مفید باشد. کلماتی مانند «پا»، «بازو»، «گردن» ممکن است در اینجا امتیاز بالایی کسب کنند و همچنین در بُعد پزشکی نیز امتیاز نسبتاً بالایی کسب کنند.
این مدل میتواند از این ابعاد استفاده کند تا کلماتی را که احتمال بیشتری دارد با هرزنامه مرتبط باشند، شناسایی کند. شاید ایمیلهای هرزنامه بیشتر احتمال دارد حاوی کلماتی باشند که هم مربوط به پزشکی و هم مربوط به اعضای بدن انسان هستند.
قاعده کلی که از تحقیقات به دست آمده این است که ریشه چهارم تعداد کلمات برای این پارامتر به خوبی کار میکند. بنابراین اگر من از ۲۰۰۰ کلمه استفاده میکنم، نقطه شروع خوب برای این، ۷ بُعد است. اگر تعداد کلمات استفاده شده را تغییر دهید، میتوانید این را نیز تغییر دهید.
درک
seq_len
پارامتر
مدلها معمولاً در مورد مقادیر ورودی بسیار انعطافناپذیر هستند. برای یک مدل زبانی، این بدان معناست که مدل زبانی میتواند جملات با طول خاص و ایستا را طبقهبندی کند. این امر توسط پارامتر seq_len تعیین میشود، که در آن seq_len مخفف 'sequence length' است. وقتی کلمات را به اعداد (یا توکنها) تبدیل میکنید، یک جمله به دنبالهای از این توکنها تبدیل میشود. بنابراین مدل شما (در این مورد) آموزش داده میشود تا جملاتی را که 20 توکن دارند، طبقهبندی و تشخیص دهد. اگر جمله طولانیتر از این باشد، کوتاه میشود. اگر کوتاهتر باشد، اضافه میشود - درست مانند اولین codelab در این مجموعه.
مرحله ۵ - بارگذاری دادههای آموزشی
قبلاً فایل 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 است تا نشان دهد که آیا آن متن به عنوان هرزنامه در نظر گرفته میشود یا خیر. سایر ویژگیها، مشخصات مدلی را که در مرحله ۴ ایجاد کردهاید، به همراه یک کاراکتر جداکننده تنظیم میکنند که در این مورد یک کاما است زیرا فایل با کاما از هم جدا شده است. همچنین یک پارامتر shuffle برای مرتبسازی تصادفی دادههای آموزشی تنظیم میکنید تا مواردی که ممکن است مشابه یا با هم جمعآوری شده باشند، به طور تصادفی در سراسر مجموعه دادهها پخش شوند.
سپس data.split() برای تقسیم دادهها به دادههای آموزشی و آزمایشی استفاده خواهید کرد. عدد ۰.۹ نشان میدهد که ۹۰٪ از مجموعه دادهها برای آموزش و بقیه برای آزمایش استفاده خواهد شد.
مرحله ۶ - ساخت مدل
یک سلول دیگر اضافه کنید که در آن کد لازم برای ساخت مدل را اضافه خواهیم کرد:
model = text_classifier.create(train_data, model_spec=spec, epochs=50)
این یک مدل طبقهبندی متن با Model Maker ایجاد میکند و شما دادههای آموزشی مورد نظر برای استفاده (که در مرحله ۴ تعریف شد)، مشخصات مدل (که آن هم در مرحله ۴ تنظیم شد) و تعدادی دوره (epoch) که در این مورد ۵۰ است را مشخص میکنید.
اصل اساسی یادگیری ماشینی این است که نوعی تطبیق الگو است. در ابتدا، وزنهای از پیش آموزشدیده برای کلمات را بارگذاری میکند و سعی میکند آنها را با یک «پیشبینی» که کدام یک از آنها هنگام گروهبندی، هرزنامه را نشان میدهند و کدام یک نشان نمیدهند، گروهبندی کند. در اولین بار، احتمالاً نزدیک به ۵۰:۵۰ خواهد بود، زیرا مدل همانطور که در زیر نشان داده شده است، تازه شروع به کار کرده است:

سپس نتایج این را اندازهگیری میکند و وزنهای مدل را تغییر میدهد تا پیشبینی خود را اصلاح کند و دوباره امتحان میکند. این یک دوره است. بنابراین، با مشخص کردن دورهها=50، آن «حلقه» را 50 بار طی میکند، همانطور که نشان داده شده است:

بنابراین زمانی که به دوره پنجاهم میرسید، مدل سطح دقت بسیار بالاتری را گزارش خواهد کرد. در این مورد، ۹۹.۱٪ را نشان میدهد!
مرحله 7 - مدل را خروجی بگیرید
پس از اتمام آموزش، میتوانید مدل را خروجی بگیرید. TensorFlow مدل را با فرمت خاص خود آموزش میدهد و این فرمت باید برای استفاده در صفحه وب به TensorFlow.js تبدیل شود. کافیست کد زیر را در یک سلول جدید قرار دهید و آن را اجرا کنید:
model.export(export_dir="/js_export/", export_format=[ExportFormat.TFJS, ExportFormat.LABEL, ExportFormat.VOCAB])
!zip -r /js_export/ModelFiles.zip /js_export/
پس از اجرای این کد، اگر روی آیکون پوشه کوچک در سمت چپ Colab کلیک کنید، میتوانید به پوشهای که در بالا به آن خروجی دادهاید (در دایرکتوری ریشه - ممکن است لازم باشد یک سطح بالاتر بروید) بروید و بسته زیپ فایلهای خروجی موجود در ModelFiles.zip را پیدا کنید.
اکنون این فایل زیپ را روی رایانه خود دانلود کنید، زیرا درست مانند کدلب اول از این فایلها استفاده خواهید کرد:

عالیه! بخش پایتون تمام شد، حالا میتوانید به سرزمین جاوااسکریپت که میشناسید و دوستش دارید برگردید. آخیش!
۵. ارائه مدل جدید یادگیری ماشینی
اکنون تقریباً آماده بارگذاری مدل هستید. اما قبل از انجام این کار، باید فایلهای مدل جدید که قبلاً در codelab دانلود شدهاند را آپلود کنید تا در کد شما میزبانی و قابل استفاده باشند.
ابتدا، اگر قبلاً این کار را نکردهاید، فایلهای مدلی را که از دفترچه یادداشت Model Maker Colab که اجرا کردید، دانلود کردهاید، از حالت فشرده خارج کنید. باید فایلهای زیر را در پوشههای مختلف آن مشاهده کنید:

اینجا چیکار داری؟
-
model.json- این یکی از فایلهایی است که مدل آموزشدیده TensorFlow.js را تشکیل میدهد. شما در کد JS به این فایل خاص ارجاع خواهید داد. -
group1-shard1of1.bin- این یک فایل باینری است که شامل بسیاری از دادههای ذخیره شده برای مدل TensorFlow.js صادر شده است و برای دانلود باید در جایی روی سرور شما، در همان دایرکتوریmodel.jsonبالا، میزبانی شود. -
vocab- این فایل عجیب و غریب بدون پسوند، چیزی از Model Maker است که به ما نشان میدهد چگونه کلمات را در جملات رمزگذاری کنیم تا مدل بفهمد چگونه از آنها استفاده کند. در بخش بعدی بیشتر به این موضوع خواهیم پرداخت. -
labels.txt- این فایل به سادگی شامل نام کلاسهای حاصل شدهای است که مدل پیشبینی خواهد کرد. برای این مدل، اگر این فایل را در ویرایشگر متن خود باز کنید، به سادگی "false" و "true" را نشان میدهد که نشان دهنده "not spam" یا "spam" به عنوان خروجی پیشبینی آن است.
میزبان فایلهای مدل TensorFlow.js باشید
ابتدا فایلهای model.json و *.bin که تولید شدهاند را روی یک وب سرور قرار دهید تا بتوانید از طریق صفحه وب خود به آنها دسترسی داشته باشید.
حذف فایلهای مدل موجود
همانطور که در حال ساخت نتیجه نهایی اولین codelab در این مجموعه هستید، ابتدا باید فایلهای مدل آپلود شده موجود را حذف کنید. اگر از Glitch.com استفاده میکنید، کافیست در پنل فایلها در سمت چپ، model.json و group1-shard1of1.bin را بررسی کنید، روی منوی کشویی ۳ نقطه برای هر فایل کلیک کنید و همانطور که نشان داده شده است، حذف را انتخاب کنید:

آپلود فایلهای جدید در Glitch
عالی! حالا موارد جدید را آپلود کنید:
- پوشه assets را در پنل سمت چپ پروژه Glitch خود باز کنید و در صورت داشتن نامهای مشابه، هرگونه asset قدیمی آپلود شده را حذف کنید.
- روی آپلود یک دارایی کلیک کنید و
group1-shard1of1.binرا انتخاب کنید تا در این پوشه آپلود شود. اکنون پس از آپلود باید به این شکل باشد:

- عالی! حالا همین کار را برای فایل model.json هم انجام دهید تا دو فایل در پوشه assets شما به این شکل باشند:

- اگر روی فایل
group1-shard1of1.binکه آپلود کردهاید کلیک کنید، میتوانید URL را در محل آن کپی کنید. اکنون این مسیر را مطابق شکل زیر کپی کنید:

- حالا در پایین سمت چپ صفحه، روی Tools > Terminal کلیک کنید. منتظر بمانید تا پنجره ترمینال بارگذاری شود.
- پس از بارگذاری، دستور زیر را تایپ کرده و سپس Enter را فشار دهید تا دایرکتوری به پوشه
wwwتغییر کند:
ترمینال:
cd www
- در مرحله بعد، با استفاده از
wgetدو فایلی که آپلود کردهاید را دانلود کنید. برای این کار، آدرسهای اینترنتی زیر را با آدرسهایی که برای فایلهای موجود در پوشه assets در Glitch ایجاد کردهاید، جایگزین کنید (برای مشاهده آدرس اینترنتی سفارشی هر فایل، پوشه assets را بررسی کنید).
به فاصله بین دو URL توجه کنید و اینکه URLهایی که باید استفاده کنید با URLهای نشان داده شده متفاوت هستند اما ظاهری مشابه خواهند داشت:
ترمینال
wget https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fmodel.json?v=1616111344958 https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fgroup1-shard1of1.bin?v=1616017964562
عالی! شما اکنون یک کپی از فایلهای آپلود شده در پوشه www ایجاد کردهاید.
با این حال، در حال حاضر آنها با نامهای عجیب دانلود میشوند. اگر در ترمینال ls را تایپ کنید و Enter را بزنید، چیزی شبیه به این خواهید دید:

- با استفاده از دستور
mv، نام فایلها را تغییر دهید. عبارت زیر را در کنسول تایپ کنید و بعد از هر خط، اینتر را بزنید:
ترمینال:
mv *group1-shard1of1.bin* group1-shard1of1.bin
mv *model.json* model.json
- در نهایت، پروژه Glitch را با تایپ
refreshدر ترمینال و فشردن کلید enter، رفرش کنید:
ترمینال:
refresh
پس از رفرش کردن، اکنون باید model.json و group1-shard1of1.bin را در پوشه www رابط کاربری مشاهده کنید:

عالی! آخرین مرحله، بهروزرسانی فایل dictionary.js است.
- فایل vocab دانلود شده جدید خود را به صورت دستی از طریق ویرایشگر متن یا با استفاده از این ابزار به فرمت JS صحیح تبدیل کنید و خروجی حاصل را با نام
dictionary.jsدر پوشهwwwخود ذخیره کنید. اگر از قبل فایلdictionary.jsدارید، میتوانید به سادگی محتوای جدید را روی آن کپی و پیست کنید و فایل را ذخیره کنید.
هورا! شما با موفقیت تمام فایلهای تغییر یافته را بهروزرسانی کردهاید و اگر اکنون سعی کنید از وبسایت استفاده کنید، متوجه خواهید شد که چگونه مدل آموزش مجدد باید بتواند موارد حاشیهای کشف شده و آموخته شده را همانطور که نشان داده شده است، در نظر بگیرد:

همانطور که میبینید، ۶ مورد اول اکنون به درستی به عنوان غیر اسپم طبقهبندی میشوند و ۶ مورد دوم همگی به عنوان اسپم شناسایی میشوند. عالی!
بیایید چند تغییر را هم امتحان کنیم تا ببینیم آیا به خوبی قابل تعمیم است یا خیر. در ابتدا یک جمله ناقص مانند این وجود داشت:
« خدای من، سهام گوگل همین الان یهویی رفت بالا! قبل از اینکه خیلی دیر بشه، اقدام کنید! »
این الان به درستی به عنوان هرزنامه طبقهبندی شده است، اما اگر آن را به موارد زیر تغییر دهید چه اتفاقی میافتد؟
« پس ارزش سهام XYZ همین الان افزایش یافت! قبل از اینکه خیلی دیر شود، مقداری از آن را بخرید! »
در اینجا پیشبینی میکنید که ۹۸٪ احتمال دارد اسپم باشد که درست است، حتی با اینکه نماد سهام و متن را کمی تغییر دادهاید.
البته اگر واقعاً سعی کنید این مدل جدید را بشکنید، قادر به انجام آن خواهید بود و این به جمعآوری دادههای آموزشی بیشتر بستگی دارد تا بهترین شانس را برای ثبت تغییرات منحصر به فردتر برای موقعیتهای رایجی که احتمالاً به صورت آنلاین با آنها مواجه میشوید، داشته باشید. در یک آزمایشگاه کد آینده، به شما نشان خواهیم داد که چگونه مدل خود را با دادههای زنده، همزمان با علامتگذاری، به طور مداوم بهبود بخشید.
۶. تبریک میگویم!
تبریک میگویم، شما موفق شدید یک مدل یادگیری ماشین موجود را مجدداً آموزش دهید تا خود را بهروزرسانی کند تا برای موارد حاشیهای که پیدا کردهاید کار کند و آن تغییرات را با TensorFlow.js برای یک برنامه دنیای واقعی در مرورگر اعمال کنید.
خلاصه
در این آزمایشگاه کد شما:
- موارد حاشیهای کشف شد که هنگام استفاده از مدل اسپم کامنت از پیش ساخته شده، کار نمیکردند.
- مدل Model Maker را مجدداً آموزش داد تا موارد حاشیهای کشف شده توسط شما را در نظر بگیرد.
- مدل آموزشدیده جدید به فرمت TensorFlow.js اکسپورت شد.
- برنامه وب خود را برای استفاده از فایلهای جدید بهروزرسانی کنید
بعدش چی؟
بنابراین این بهروزرسانی عالی کار میکند، اما مانند هر برنامه وب، تغییرات به مرور زمان اتفاق میافتند. خیلی بهتر میشد اگر برنامه به طور مداوم در طول زمان خود را بهبود میبخشید، نه اینکه مجبور باشیم هر بار این کار را به صورت دستی انجام دهیم. آیا میتوانید فکر کنید که چگونه میتوانستید این مراحل را خودکار کنید تا به طور خودکار یک مدل را پس از اینکه مثلاً ۱۰۰ نظر جدید به عنوان طبقهبندی نادرست علامتگذاری شدند، دوباره آموزش دهید؟ کلاه مهندسی وب معمول خود را به سر بگذارید و احتمالاً میتوانید بفهمید که چگونه یک خط لوله برای انجام خودکار این کار ایجاد کنید. اگر اینطور نیست، نگران نباشید، منتظر آزمایشگاه کد بعدی در این مجموعه باشید که نحوه انجام آن را به شما نشان خواهد داد.
آنچه را که میسازید با ما به اشتراک بگذارید
شما به راحتی میتوانید آنچه را که امروز ساختهاید برای موارد استفاده خلاقانه دیگر نیز گسترش دهید و ما شما را تشویق میکنیم که خارج از چارچوب فکر کنید و به هک کردن ادامه دهید.
فراموش نکنید که برای نمایش پروژهتان در وبلاگ TensorFlow یا حتی رویدادهای آینده، ما را در شبکههای اجتماعی با استفاده از هشتگ #MadeWithTFJS تگ کنید. ما دوست داریم ببینیم چه چیزی میسازید.
آزمایشگاههای کد TensorFlow.js بیشتر برای بررسی عمیقتر
- از میزبانی Firebase برای استقرار و میزبانی یک مدل TensorFlow.js در مقیاس بزرگ استفاده کنید.
- با استفاده از یک مدل تشخیص شیء از پیش ساخته شده با TensorFlow.js، یک وب کم هوشمند بسازید
وبسایتهایی برای بررسی
- وبسایت رسمی TensorFlow.js
- مدلهای از پیش ساخته شده TensorFlow.js
- API تنسورفلو.جیاس
- TensorFlow.js نمایش و نمایش - الهام بگیرید و ببینید دیگران چه ساختهاند.