سپاسگزاری
حتی در خیال هم تصور نمیکردم ویرایشهای اول و دوم این کتاب چنین مخاطبان گستردهای پیدا کنند. پیامهای بسیار زیادی از خوانندگان دریافت کردم؛ بسیاری پرسش میکردند، برخی با لطف خود خطاها را یادآوری میکردند و بیشترشان پیامهای دلگرمکننده میفرستادند. نمیتوانم میزان قدردانی خود را از همهٔ این خوانندگان بابت حمایت فوقالعادهشان بیان کنم. از همهٔ شما صمیمانه سپاسگزارم. اگر در مثالهای کد خطایی پیدا کردید، یا حتی فقط پرسشی داشتید، در GitHub مسئلهای ثبت کنید؛ و اگر در متن کتاب خطایی یافتید، اصلاحیه ارسال کنید. برخی خوانندگان نیز توضیح دادند که این کتاب چگونه به آنان برای یافتن نخستین شغلشان کمک کرده یا چگونه در حل مسئلهای واقعی که روی آن کار میکردند مفید بوده است. چنین بازخوردهایی برای من فوقالعاده انگیزهبخشاند. اگر این کتاب برایتان مفید بوده، خوشحال میشوم داستان خود را، خصوصی مانند LinkedIn یا عمومی مانند پیام در Twitter به @aureliengeron یا نوشتن نظر در Amazon، با من در میان بگذارید.
همچنین از همهٔ افراد فوقالعادهای که زمان و تخصص خود را برای بازبینی ویرایش سوم اختصاص دادند، خطاها را اصلاح کردند و پیشنهادهای بیشماری ارائه دادند، بسیار سپاسگزارم. این ویرایش به لطف آنان بسیار بهتر شده است: Olzhas Akpambetov، George Bonner، François Chollet، Siddha Gangju، Sam Goodman، Matt Harrison، Sasha Sobran، Lewis Tunstall، Leandro von Werra و برادر عزیزم Sylvain. شما همگی فوقالعادهاید.
از افراد زیادی که در طول مسیر با پاسخ به پرسشها، پیشنهاد بهبودها و مشارکت در کدهای GitHub از من پشتیبانی کردند نیز بسیار ممنونم؛ بهویژه Yannick Assogba، Ian Beauregard، Ulf Bissbort، Rick Chao، Peretz Cohen، Kyle Gallatin، Hannes Hapke، Victor Khaustov، Soonson Kwon، Eric Lebigot، Jason Mayes، Laurence Moroney، Sara Robinson، Joaquín Ruales و Yuefeng Zhou.
این کتاب بدون کارکنان فوقالعادهٔ O’Reilly وجود نداشت؛ بهخصوص Nicole Taché که بازخوردهای دقیق و ارزشمند ارائه میکرد و همیشه شاد، دلگرمکننده و کمکرسان بود؛ نمیتوانستم ویراستاری بهتر از او آرزو کنم. از Michele Cronin نیز بسیار سپاسگزارم که در فصلهای پایانی مرا تشویق کرد و کمک کرد از خط پایان عبور کنم. از تمام تیم تولید، بهویژه Elizabeth Kelly و Kristen Brown، ممنونم. از Kim Cofer برای ویرایش دقیق متن و از Johnny O’Toole که ارتباط با Amazon را مدیریت کرد و به بسیاری از پرسشهایم پاسخ داد نیز سپاسگزارم. از Kate Dullea برای بهبود چشمگیر تصویرسازیها، و از Marie Beaugureau، Ben Lorica، Mike Loukides و Laurel Ruma برای باور به این پروژه و کمک به تعریف دامنهٔ آن ممنونم. همچنین از Matt Hacker و تمام اعضای تیم Atlas برای پاسخ به پرسشهای فنی من دربارهٔ قالببندی، AsciiDoc، MathML و LaTeX، و از Nick Adams، Rebecca Demarest، Rachel Head، Judith McConville، Helen Monroe، Karen Montgomery، Rachel Roumeliotis و همهٔ افراد دیگر O’Reilly که در شکلگیری این کتاب نقش داشتند سپاسگزارم.
هرگز افراد فوقالعادهای را که در ویرایشهای اول و دوم به من کمک کردند فراموش نمیکنم؛ دوستان، همکاران و متخصصان، از جمله بسیاری از اعضای تیم TensorFlow. فهرست طولانی است: Olzhas Akpambetov، Karmel Allison، Martin Andrews، David Andrzejewski، Paige Bailey، Lukas Biewald، Eugene Brevdo، William Chargin، François Chollet، Clément Courbet، Robert Crowe، Mark Daoust، Daniel “Wolff” Dobson، Julien Dubois، Mathias Kende، Daniel Kitachewsky، Nick Felt، Bruce Fontaine، Justin Francis، Goldie Gadde، Irene Giannoumis، Ingrid von Glehn، Vincent Guilbeau، Sandeep Gupta، Priya Gupta، Kevin Haas، Eddy Hung، Konstantinos Katsiapis، Viacheslav Kovalevskyi، Jon Krohn، Allen Lavoie، Karim Matrah، Grégoire Mesnil، Clemens Mewald، Dan Moldovan، Dominic Monn، Sean Morgan، Tom O’Malley، James Pack، Alexander Pak، Haesun Park، Alexandre Passos، Ankur Patel، Josh Patterson، André Susano Pinto، Anthony Platanios، Anosh Raj، Oscar Ramirez، Anna Revinskaya، Saurabh Saxena، Salim Sémaoune، Ryan Sepassi، Vitor Sessak، Jiri Simsa، Iain Smears، Xiaodan Song، Christina Sorokin، Michel Tessier، Wiktor Tomczak، Dustin Tran، Todd Wang، Pete Warden، Rich Washington، Martin Wicke، Edd Wilder-James، Sam Witteveen، Jason Zaman، Yuefeng Zhou و برادرم Sylvain.
و در پایان، بینهایت از همسر عزیزم Emmanuelle و سه فرزند فوقالعادهمان Alexandre، Rémi و Gabrielle سپاسگزارم که مرا به تلاش زیاد برای این کتاب تشویق کردند. کنجکاوی سیریناپذیر آنان ارزشی وصفناشدنی داشت: توضیح برخی از دشوارترین مفاهیم کتاب برای همسر و فرزندانم باعث شد افکارم روشنتر شود و بسیاری از بخشهای کتاب مستقیماً بهتر شوند. تازه، آنها مرتب برایم شیرینی و قهوه هم میآورند؛ دیگر چه میتوان خواست؟
بخش اول
مبانی یادگیری ماشین
فصل ۱ - چشمانداز یادگیری ماشین
تا همین چندی پیش، اگر تلفن خود را برمیداشتید و از آن مسیر خانه را میپرسیدید، شما را نادیده میگرفت و اطرافیان احتمالاً دربارهٔ سلامت عقلتان تردید میکردند. اما یادگیری ماشین دیگر داستان علمیتخیلی نیست: میلیاردها نفر هر روز از آن استفاده میکنند. واقعیت این است که این فناوری دهههاست در برخی کاربردهای تخصصی، مانند تشخیص نوری نویسهها (OCR)، وجود دارد. نخستین کاربرد یادگیری ماشین که واقعاً فراگیر شد و زندگی صدها میلیون نفر را بهتر کرد، در دههٔ ۱۹۹۰ جهان را فراگرفت: فیلتر هرزنامه. این سامانه دقیقاً یک ربات خودآگاه نیست، اما از نظر فنی کاملاً در تعریف یادگیری ماشین میگنجد؛ آنقدر خوب یاد گرفته است که اکنون بهندرت لازم است خودتان یک رایانامه را هرزنامه علامت بزنید. پس از آن، صدها کاربرد یادگیری ماشین پدید آمد که امروز در سکوت، صدها محصول و قابلیتی را که مرتب استفاده میکنید توانمند میسازند: فرمانهای صوتی، ترجمهٔ خودکار، جستوجوی تصویر، پیشنهاد محصول و بسیاری موارد دیگر.
یادگیری ماشین از کجا آغاز میشود و کجا پایان مییابد؟ دقیقاً «یادگرفتن» برای یک ماشین چه معنایی دارد؟ اگر نسخهای از تمام مقالههای Wikipedia را دانلود کنم، آیا رایانهٔ من واقعاً چیزی آموخته است؟ آیا ناگهان باهوشتر شده است؟ در این فصل ابتدا روشن میکنیم یادگیری ماشین چیست و چرا ممکن است بخواهید از آن استفاده کنید.
سپس پیش از آنکه برای کاوش قارهٔ یادگیری ماشین راه بیفتیم، نگاهی به نقشه میاندازیم و با نواحی اصلی و نشانههای مهم آن آشنا میشویم: یادگیری نظارتشده در برابر یادگیری بدون نظارت و گونههای آنها، یادگیری برخط در برابر یادگیری دستهای، و یادگیری نمونهمحور در برابر یادگیری مدلمحور. بعد از آن، جریان کاری یک پروژهٔ معمول یادگیری ماشین را بررسی میکنیم، چالشهای اصلی را مرور میکنیم و روش ارزیابی و تنظیم دقیق یک سامانهٔ یادگیری ماشین را توضیح میدهیم.
این فصل مفاهیم بنیادی و اصطلاحات زیادی را معرفی میکند که هر دانشمند داده باید آنها را بهخوبی بداند. مطالب در سطح کلی ارائه میشوند و این تنها فصل کتاب است که کد چندانی ندارد. همهٔ مفاهیم نسبتاً سادهاند، اما هدف این است که پیش از ورود به ادامهٔ کتاب، همهچیز برایتان کاملاً روشن باشد. پس یک فنجان قهوه بردارید و شروع کنیم.
یادگیری ماشین چیست؟
یادگیری ماشین علم و هنر برنامهنویسی رایانهها بهگونهای است که بتوانند از داده یاد بگیرند.
تعریفی کمی کلیتر:
«[یادگیری ماشین] حوزهای از مطالعه است که به رایانهها توانایی یادگیری بدون برنامهریزی صریح را میدهد.»
و تعریفی با جهتگیری مهندسی:
«گفته میشود یک برنامهٔ رایانهای نسبت به وظیفهٔ T و معیار کارایی P از تجربهٔ E یاد میگیرد، اگر کارایی آن در انجام T، هنگامی که با P سنجیده میشود، با تجربهٔ E بهبود پیدا کند.»
فیلتر هرزنامهٔ شما یک برنامهٔ یادگیری ماشین است که با دریافت نمونههایی از رایانامههای هرزنامه، که کاربران آنها را علامتگذاری کردهاند، و نمونههایی از رایانامههای معمولی، که «ham» نیز نامیده میشوند، میآموزد هرزنامه را تشخیص دهد. نمونههایی که سامانه برای یادگیری بهکار میبرد «مجموعهٔ آموزشی» نام دارند. هر نمونهٔ آموزشی یک «نمونهٔ آموزش» یا «نمونه» است. بخشی از سامانهٔ یادگیری ماشین که یاد میگیرد و پیشبینی انجام میدهد «مدل» نامیده میشود. شبکههای عصبی و جنگلهای تصادفی نمونههایی از مدل هستند.
در این مثال، وظیفهٔ T تشخیص هرزنامه برای رایانامههای جدید است، تجربهٔ E دادههای آموزشی است و معیار کارایی P باید تعریف شود؛ برای نمونه میتوان نسبت رایانامههایی را که درست طبقهبندی شدهاند سنجید. این معیار خاص «دقت (Accuracy)» نام دارد و در مسائل طبقهبندی بسیار استفاده میشود.
اگر فقط نسخهای از تمام مقالههای Wikipedia را دانلود کنید، رایانهٔ شما دادهٔ بسیار بیشتری خواهد داشت، اما ناگهان در انجام هیچ وظیفهای بهتر نمیشود. این یادگیری ماشین نیست.
چرا از یادگیری ماشین استفاده کنیم؟
در نظر بگیرید بخواهید با روشهای سنتی برنامهنویسی یک فیلتر هرزنامه بنویسید. فرایند میتواند چنین باشد:
- ابتدا بررسی میکنید هرزنامه معمولاً چه شکلی دارد. ممکن است متوجه شوید واژهها یا عبارتهایی مانند “4U”، «کارت اعتباری»، «رایگان» و «شگفتانگیز» در عنوان پیام زیاد ظاهر میشوند. شاید الگوهای دیگری نیز در نام فرستنده، بدنهٔ رایانامه و قسمتهای دیگر پیدا کنید.
- برای هر الگویی که دیدهاید یک الگوریتم تشخیص مینویسید و اگر چند مورد از این الگوها در پیام دیده شود، برنامه آن رایانامه را هرزنامه علامت میزند.
- برنامه را آزمایش میکنید و مراحل ۱ و ۲ را آنقدر تکرار میکنید تا کیفیت برای انتشار کافی شود.
شکل ۱-۱. رویکرد سنتی
از آنجا که مسئله دشوار است، برنامهٔ شما احتمالاً به فهرستی بلند از قواعد پیچیده تبدیل میشود که نگهداری آن بسیار سخت است.
در مقابل، فیلتر هرزنامهای که بر پایهٔ روشهای یادگیری ماشین ساخته شده باشد، با مقایسهٔ نمونههای هرزنامه و پیامهای عادی، خودش تشخیص میدهد چه واژهها و عبارتهایی پیشبینیکنندههای خوبی برای هرزنامه هستند؛ یعنی الگوهایی را پیدا میکند که در هرزنامهها با فراوانی غیرعادی ظاهر میشوند. برنامه کوتاهتر، نگهداری آن سادهتر و به احتمال زیاد دقیقتر خواهد بود.
شکل ۱-۲. رویکرد یادگیری ماشین
حال فرض کنید ارسالکنندگان هرزنامه متوجه شوند همهٔ رایانامههای دارای عبارت “4U” مسدود میشوند و بهجای آن شروع به نوشتن “For U” کنند. فیلتر سنتی باید بهروزرسانی شود تا این عبارت تازه را نیز شناسایی کند؛ و اگر ارسالکنندگان هرزنامه پیوسته راههای جدیدی برای دورزدن فیلتر پیدا کنند، شما باید بیپایان قواعد جدید بنویسید.
در مقابل، فیلتر مبتنی بر یادگیری ماشین بهطور خودکار متوجه میشود عبارت “For U” در پیامهایی که کاربران هرزنامه علامت زدهاند، بهطور غیرعادی پرتکرار شده است و بدون دخالت شما شروع به علامتگذاری آنها میکند.
شکل ۱-۳. سازگاری خودکار با تغییر
حوزهٔ دیگری که یادگیری ماشین در آن میدرخشد، مسائلی است که برای رویکردهای سنتی بیش از حد پیچیدهاند یا الگوریتم شناختهشدهای برایشان وجود ندارد. برای مثال تشخیص گفتار را در نظر بگیرید. فرض کنید بخواهید از مسئلهای ساده آغاز کنید و برنامهای بنویسید که دو واژهٔ «one» و «two» را از هم تشخیص دهد. شاید متوجه شوید «two» با صدایی زیرتر، یعنی “T”، شروع میشود و الگوریتمی ثابت برای سنجش شدت صدای زیر بنویسید. اما روشن است که این روش برای هزاران واژهای که میلیونها انسان متفاوت، در محیطهای پرسروصدا و به دهها زبان بیان میکنند مقیاسپذیر نیست. بهترین راهحل، دستکم با فناوری امروز، نوشتن الگوریتمی است که با دریافت تعداد زیادی نمونهٔ ضبطشده برای هر واژه، خودش یاد بگیرد.
در نهایت، یادگیری ماشین میتواند به خود انسان نیز برای یادگیری کمک کند. میتوان مدلها را بررسی کرد و دید چه چیزی آموختهاند، هرچند این کار برای برخی مدلها دشوار است. برای نمونه، پس از آنکه یک فیلتر هرزنامه با تعداد کافی پیام آموزش ببیند، میتوان آن را بررسی کرد تا فهرست واژهها و ترکیبهایی را که بهترین پیشبینیکنندهٔ هرزنامه میداند نشان دهد. گاهی این بررسی همبستگیهای غیرمنتظره یا روندهای تازهای را آشکار میکند و درک بهتری از مسئله به دست میدهد. کاوش حجمهای بزرگ داده برای کشف الگوهای پنهان «دادهکاوی» نام دارد و یادگیری ماشین در آن بسیار توانمند است.
شکل ۱-۴. یادگیری ماشین میتواند به انسان کمک کند یاد بگیرد.
در مجموع، یادگیری ماشین برای این موقعیتها بسیار مناسب است:
- مسائلی که راهحلهای موجودشان به تنظیم فراوان یا فهرستهای طولانی قواعد نیاز دارد؛ یک مدل یادگیری ماشین اغلب میتواند کد را سادهتر کند و بهتر از رویکرد سنتی عمل کند.
- مسائل پیچیدهای که رویکرد سنتی برای آنها راهحل خوبی به دست نمیدهد؛ بهترین روشهای یادگیری ماشین شاید بتوانند راهی پیدا کنند.
- محیطهای متغیر؛ سامانهٔ یادگیری ماشین را میتوان بهسادگی با دادهٔ تازه دوباره آموزش داد تا همواره بهروز بماند.
- بهدستآوردن بینش از مسائل پیچیده و حجمهای بزرگ داده.