تست کردن سیستمهایی که یک پاسخ را بازگشت نمیدهند، نیازمند تعاریف و رویکردهای جدید است.
تست نرمافزار، در تئوری یک فعالیت نسبتا ساده است. برای هر ورودی، یک خروجیِ تعریف شده یا شناخته شده وجود دارد. ما مقادیر را وارد کرده، Selectionها ارا ایجاد کرده، یا یک اپلیکیشن را Navigate میکنیم، و در آخر نتایج واقعی را با نتیجهای که از آن انتظار میرود مقایسه مینماییم. اگر آنها با هم متناسب باشند، ما از آن میگذریم، و در صورتیکه مطابق نباشند، احتمالا دچار یک باگ شدهایم.
فرض بر این است که گاهی اوقات یک خروجی به خوبی تعریف نشده است(و باعث و بانی برخی از ابهامات میشود) و یا اینکه شما را در این مورد که آیا یک نتیجه خاص نشان دهنده یک باگ است و یا چیز دیگری را بیان میدارد، گیج میکند. اما به طور کلی، ما میدانیم که چه خروجیهایی را متصور هستیم.
با این حال نوعی از نرمافزار هست که در آن داشتن یک خروجیِ تعریف شده مقداری پیچ و تاب دارد، که این موضوع در سیستمهای Machine Learning صادق است.
اکثر سیستمهای Machine Learning مبتنی بر Neural Networkها(شبکههای عصبی) یا مجموعهای از الگوریتمهای لایه لایه(که متغیرها میتوانند از طریق یک Learning Process(فرآیند یادگیری) تنظیم شوند) هستند. فرآیند Learning(یادگیری) مشتمل بر استفاده از ورودیهای دادهایِ شناخته شده برای ایجاد خروجیهاییست که پس از آن با نتایج شناخته شده مقایسه میشوند. به عنوان مثال، ممکن است شما اپلیکیشنی داشته باشید که سعی خود را روی تعیین یک زمان رفت و آمد بر اساس وضعیت آب و هوا، معطوف کرده است. ممکن است ورودیها اینها باشند: دمای هوا، احتمال بارش، و تاریخ. در حالیکه خروجی شما، زمان رفت و آمد برای یک اندازه مشخص است.
هنگامیکه الگوریتمها، درجه مطلوبی از دقتِ نتایجِ شناخته شده را منعکس میکنند، ضرایب جبری ثابت و Production Code تولید میشود. امروزه، این موضوع بسیاری از چیزهایی که ما به عنوان هوش مصنوعی درک کردهایم را میسازد.
این نوع از نرمافزار به طور فزایندهای در حال عمومی شدن است، آنچنانکه در موضوعاتی مانند تجارت الکترونیک(E-Commerce)، حمل و نقل عمومی، صنعت خودروسازی، مالی، و شبکههای کامپیوتری مورد استفاده قرار میگیرد. سیستمهای Machine Learning پتانسیل تصمیمگیری روی اهداف و دادههای ورودی که به خوبی تعریف شدهاند را به اندازه کافی دار میباشند. به طور دقیق، شما نیازمند دادههای کمی هستید. ورودیها و خروجیهای مورد نظر باید امکان ارزیابی بر مبنای ریاضی را دارا بوده و در یک سری از معادلات دستکاری شوند.
در برخی از موارد، این اپلیکیشنها که ظاهرا در اندازه صلاحیت کاربر انسانی یا اوپراتور تصمیمگیری میکنند، به عنوان هوش مصنوعی توصیف میشوند.
این نوع از سیستمها، یک نتیجه دقیق تولید نمیکنند. در حقیقت، آنها گاهی اوقات میتوانند یک نتیجه نادرست بدیهی تولید کنند. اما آنها در برخی وضعیتها، و هنگامیکه دادهها از قبل روی نسبت میان ورودیهای ضبط شده و نتایج مورد نظر موجود هستند، به شدت مفید میباشند.
به عنوان نمونه، سالها پیش یک شبکه عصبی را به عنوان بخشی از یک سنسور الکترونیکیِ باد ارائه دادم. خنک کنندۀ بادی این محصول مبتنی بر کاهش دقیق در درجه حرارت در سرعت و جهت خاص(از باد در حال وزش) کار میکرد. من برای این کار یک شبکه عصبی ساخته بودم که دارای سه لایه معادلات جبری بود که هر یک با چهار یا پنج معادله مجزا در Nodeهای منفرد، برای پردازش موازی وارد عمل میشدند. آنها از متغیرهای آغازین استفاده کرده، و سپس بر اساس مقایسه میان خروجی الگوریتمیک و پاسخ واقعی سنجیده میشدند.
سپس من آموزش به این سیستم آغاز کردم. من بیش از پانصد Data Point در ارتباط با سرعتها و جهتهای شناخته شده باد داشتم. شبکهای که من ساخته بودم هر ورودی را از طریق لایههای چندگانه به معادله خود ارسال کرده و یک پاسخ تولید میکرد. در ابتدا، ممکن بود پاسخ دریافتی از شبکه نزدیک به پاسخ شناخته شده نباشد. اما الگوریتم قادر بود خود را بر اساس پاسخ واقعی تنظیم نماید. پس از چند بار تکرار با دادههای تمرینی، مقادیر باید به تدریج روی نتایج دقیق و سازگار مستقر میشدند.
شما چگونه چنین چیزی را تست میکنید؟ شما اکنون میدانید چه پاسخی را باید فرض کرد، چرا که شما خودتان شبکه را با Test Data ساختهاید. اما باید بدانید بسیار نادر است که در همه اوقات پاسخ صحیح دریافت کنید.
در واقع این محصول در طول فرآیند آموزش(آموزشی که به محصول داده میشود) مورد تست قرار میگیرد. آموزش به سیستم یا منجر به همگرایی برای نتایج دقیق میشود، و یا واگرایی به ارمغان میآورد. سوال این است که شما چگونه کیفیت شبکه را ارزیابی میکنید. در اینجا دستورالعملی را میبینید که من استفاده میکنم:
- معیاری برای پذیرشِ هدف داشته باشید. باید میزان Errorهایی که شما و کاربرانتان مایل به پذیرش آنها هستید را بدانید.
- تست با دادههای جدید. هنگامیکه شما شبکه را آموزش میدهید، و معماری و متغیرها را ثابت نگاه میدارید، به منظور بررسی دقت آنها از ورودیها و خروجیهای جدید استفاده نمایید.
- همه نتایج، را به عنوان نتجه دقیق حساب نکنید. این ذات یادگیریست. در حالیکه معادلات جبری معمولا پیچیده نیستند، بسیاری از آنها در شبکه استفاده میشوند، که گاهی اوقات نتایج حیرتآوری به ارمغان میآورند. شما نمیتوانید آنرا با پیروی از منطق پاسخ دهید، بنابراین شما باید تست را انجام داده و گاه گاه به همراه نتایج خوب یک نتیجه بد هم بدست آورید. اگر این روال به اندازه کافی خوب نیست، ممکن است توصیه این باشد که کل شبکه را کنار بگذارید، و مجددا شروع کنید.
- معماری شبکه را به عنوان قسمتی از فرآیند تست درک کنید. تعداد اندکی از تسترها(آن هم اگر وجود داشته باشند) واقعا قادر به دنبال کردن مجموعهای از ورودیها از طریق شبکه الگوریتمها هستند، اما درک این موضوع که شبکه چگونه ساخته شده است، در تعیین اینکه آیا ممکن است معماری دیگری نتایج بهتری تولید کند، به تسترها کمک خواهد کرد.
- سطح اعتمادی که شما در نتایج دارید با مدیریت و کاربران ارتباط برقرار میکند. Machine Learning Systemها فرصت منحصر به فردی را در اختیار شما قرار میدهند تا همچنان که از آنها استفاده میکنید، سطح اعتماد را از نظر آماری بیان کنید.
یکی از مهمترین مسائلی که باید مورد توجه واقع شود این است که دادههای آموزشی(Training Data) خود میتوانند حاوی اشتباهات باشند. در این مورد، به دلیل خطای اندازهگیری، سرعت و جهت بادِ ثبت شده میتواند نامشخص و یا مبهم باشد. در موارد دیگر، خنک کنندۀ Filament(رشته)، به احتمال زیاد دارای خطاهایی در اندازهگیری است.
در اینجا برخی ملاحظات مهم دیگر عبارتند از:
- شما باید سناریوها را تست کنید. سه حالت میتواند کافی باشد، تا بهترین حالت، حالت متوسط و بدترین حالت مورد انتظار را نمایش دهد.
- شما نمیتوانید به بهبود بر مبنای ریاضی نائل شوید. ما پس از همه با الگوریتمهایی که تقریبها(و نه نتایج دقیق) را تولید میکنند، کار میکنیم. تعیین کنید که چه سطحی از نتایج برای هر سناریو قابل قبول است.
- برای دستیابی به اهداف اپلیکیشن، نواقص در ناتوانیِ مدل منعکس شوند.
توجه کنید در انواع این اپلیکیشنها، معیار پذیرش از نظر تعداد، نوع، یا شدت نواقص بیان نمیشود. در حقیقت در اکثر موارد معیار پذیرش از نظر احتمالِ آماریای که در آینده حادث میشود، بیان میگردد. ارزیابی کیفیت و ریسک، برای اکثر پروژههای تست و توسعه یک جز اصلی نیست، بنابراین ممکن است تسترها برای در نظر گرفتن آن آماده نباشند.
تسترها چگونه میتوانند بازخورد بهتری از تلاشهایشان روی این دست از اپلیکیشنها ارائه دهند؟ ابتدا اپلیکیشن را بر اساس معیار پذیرش ارزیابی کنید. دوم، برای پشتیبانی از این معیارها(از منظر آماری)، آماده باشید؛ برای نمونه ۹۵ درصد به اینکه اپلیکیشن یک پاسخ در محدوده مورد نظر ارائه خواهد کرد، اعتماد وجود دارد. در آخر، یک درک سطح بالا، از پایههای اپلیکیشن داشته باشید، آنچنانکه بتوان با اطمینان، هر کمبودی را به یک کامپوننت از اپلیکیشن نسبت داد.
به منظور همساز کردن اپلیکیشنهایی که رفتار یکسان ندارند، هم شیوههای تست و هم نتایج تست باید تغییر کنند. اگر شما خودتان موضوعی را روی یادگیری ماشین یافتید، ممکن است یک شروع خوب در این جهت باشد.