در یادگیری ماشینی و همینطور در کل بحث هوش مصنوعی اصطلاحی داریم به نام Overfitting یا «بیش از حد». منظور کلی این است که نباید بیش از حدِ لازم به برنامهای که مبتنی بر هوش مصنوعی نوشتهاید داده اولیه یا داده آموزشی بدهید. حالا این داده در برنامههای مختلف، تفسیرهای مختلفی پیدا میکند؛ مثلاً در برنامهای که قرار است بفهمد داخل یک عکس چه چیزی قرار دارد، داده بیش از حد این است که بیاییم میلیونها عکس که ضرورتی ندارد به برنامه بدهیم که تحلیل کند و از آنها چیز یاد بگیرد...
این دادههای اضافه باعث میشود خلاقیت برنامه مبتنی بر هوش مصنوعی کاهش یابد و همین کاهش خلاقیت در مواردی باعث عملکرد اشتباه برنامه میشود. مثلاً اگر بیش از حد عکس گربه از حالات مختلف را به برنامه بدهیم، از یک جایی به بعد مثلاً عکس یک صخره را هم گربه تشخیص میدهد.
توضیحات علمی و بیشتر را در دوره هوش مصنوعی دانشگاه هاروارد ببینید که من در کلاسهای هوش مصنوعیام اخیراً مباحث همین دوره را به دانشجوها تدریس میکنم.
اما در برنامه فارسا که اخیراً منتشر کردیم من به این Overfitting برخوردم و خواستم که یک نمونه کاربردیاش را اینجا داشته باشیم:
در این برنامه وقتی یک کلمه قرار است غلطیابی شود، ابتدا چک میشود که در دیکشنریای که برنامه دارد آن کلمه وجود دارد یا خیر؟ اگر وجود داشت که آن را غلط اعلام نمیکند اما اگر وجود نداشت، پردازشهای فراوانی روی آن انجام میشود تا بالاخره ببیند آن کلمه غلط است یا خیر. اصول علمی میگوید که دیکشنری ما فقط حاوی اسمها (nouns) و صفات (Adjectives) و حروف اضافه (Prepositions) باشد و در مورد افعال (Verbs)، فقط بن ماضی و مضارع افعال در دیکشنری باشد (مثلاً در مورد فعل «مینماییم» فقط «نما» و «نمود» باید در دیکشنری باشد) و بقیه صیغههای فعل را برنامه خودش صرف کند و تشخیص دهد...
حالا من آمدم برای اینکه عملکرد برنامه بهتر باشد، تمام واژگانی که خودم در سایت آفتابگردان طی ۲۰ سال تایپ کرده بودم را هم به دیکشنری اضافه کردم. و این دقیقاً باعث مشکل Overfitting شد! و بسیاری از کلمات را که قبلاً درست تشخیص میداد، به اشتباه اعلام میکرد که غلط است!
چرا؟
بیایید با فعل «نپرسیی» مثال را پیش ببریم: قبل از اضافه شدن کلمات اضافه به دیکشنری، برنامه ابتدا ی را از انتهای این کلمه حذف میکرد و «نپرسی» را در دیکشنری جستجو میکرد، چون وجود نداشت، یک مرحله جلوتر میرفت، ن را از ابتدای آن حذف میکرد، «پرسی» میماند؛ پرسی را در دیکشنری جستجو میکرد، چون در دیکشنری وجود نداشت، به درستی اعلام میکرد که این کلمه غلط است. اما وقتی بیش از حد، آموزش داده شد، یعنی واژگان مختلفی در دیکشنریاش اضافه شد، یکی از کلمات که من احتمالاً تایپ کرده بودم «پرسی» بود که به دیکشنری اضافه شده بود. حالا برنامه ی را از انتها و ن را از ابتدا حذف میکند، «پرسی» میماند، آن را جستجو میکند و میبیند که موجود است؛ پس اعلام میکند که «نپرسیی» صحیح است!
حالا این یک چالش در فارسا است! الان فارسا تا این لحظه کلماتی مانند «ننمایییم» و «نپرسیی» را اشتباهاً درست تشخیص میدهد و من باید فکری به حال این معضل کنم.
میدانید چه چیزی در مورد این Overfitting جالب است؟
وقتی این را خوب فهمیدی، حالا میفهمی که چرا بچههایی که فقیرتر هستند معمولاً خلاقتر هستند! بچههایی که در ناز و نعمت بزرگ شدهاند و هر چه خواستهاند سریع و به آسانی برایشان فراهم بوده، دیگر خلاقیت خود را به کار نمیگیرند و همین کار را خراب میکند.
موفق باشید؛
حمید رضا نیرومند
یاد این مطلب در سال ۹۸ افتادم: «اگر در زندگی یک Oracle نداشته باشیم، چه میشود؟ (نتیجه آزمایش کوتاهترین مسیر)»