هوش مصنوعی

سفر من از توسعه فول‌استک تا هوش مصنوعی

نویسنده: Hadi ZareZadeh۱۱ خرداد ۱۴۰۵۴۸۲۲ بازدید
سفر من از توسعه فول‌استک تا هوش مصنوعی

بخش بزرگی از دهه بیست زندگی‌ام را به‌عنوان توسعه‌دهنده فول‌استک گذراندم. اپلیکیشن‌های CRUD می‌ساختم، درگاه‌های پرداخت فروشگاهی، داشبوردها و گاهی ویژگی‌های بلادرنگی که شب‌ها بیدار نگهم می‌داشتند. در کارم خوب بودم و دوستش داشتم. برای همین وقتی کسی می‌پرسد چرا «به هوش مصنوعی کوچ کردم»، اغلب انتظار یک داستان دراماتیک دارند — یک اخراج، یک دموی وایرال، یک جرقه ناگهانی. حقیقت خسته‌کننده‌تر و به نظر من مفیدتر است: کنجکاو شدم، فاصله را دست‌کم گرفتم و هفته‌به‌هفته و با زحمت از آن بالا رفتم.

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

از کجا شروع کردم و چرا توسعه وب کمکم کرد

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

این پایه بیشتر از آنچه فکر می‌کردم اهمیت داشت. خیلی از کسانی که وارد یادگیری ماشین می‌شوند مستقیم از دل تئوری می‌آیند و هرگز چیزی را روی محیط واقعی مستقر نکرده‌اند. در مقابل، من می‌توانستم یک مدل آموزش‌دیده را بردارم و در یک بعدازظهر پشت یک API بگذارم. اگر شما هم برنامه‌نویسی هستید که چشمتان به هوش مصنوعی است، این درس دلگرم‌کننده است:

بخش سخت یادگیری ماشین کاربردی به‌ندرت خود مدل است. مسئله، خط لوله داده، ارزیابی و استقرار است — و این‌ها مسائل مهندسی‌ای هستند که شاید همین حالا در آن‌ها خوب باشید.

فاصله‌ای که دست‌کم گرفتم

با این حال، با اعتمادبه‌نفس کاذب وارد شدم و خیلی زود سرجایم نشاندند. توسعه وب شما را عادت می‌دهد به‌شکل قطعی فکر کنید: با این ورودی، این خروجی را برگردان و تستی بنویس که آن را تأیید کند. یادگیری ماشین احتمالاتی است. مدل شما «۷۳٪ مطمئن» است، معیارها با تغییر یک seed تصادفی جابه‌جا می‌شوند و یک سیستم می‌تواند به‌طور میانگین درست باشد اما دقیقاً در مواردی که برایتان مهم است، به‌شدت اشتباه کند.

سه چیز مشخص پایم را لغزاند:

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

نقشه راهی که واقعاً جواب داد

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

مرحله ۱: فقط به اندازه کافی ریاضی

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

مرحله ۲: یادگیری ماشین کلاسیک قبل از یادگیری عمیق

این همان قدمی است که بیشتر مبتدی‌ها از آن می‌پرند و خوشحالم که نپریدم. رگرسیون خطی، رگرسیون لجستیک، درخت تصمیم و کل نظم train/validation/test، گرامر این حوزه را به من یاد دادند. وقتی بیش‌برازش را روی یک دیتاست کوچک با دست خودتان حس کنید، یادگیری عمیق خیلی منطقی‌تر می‌شود.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)

print(classification_report(y_test, model.predict(X_test)))

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

مرحله ۳: یادگیری عمیق، پروژه‌اول

تنها در این مرحله به سراغ شبکه‌های عصبی رفتم و مستقیم با پای‌تورچ و پروژه‌های کوچک و تمام‌شدنی شروع کردم: یک دسته‌بند تصویر، یک مدل احساسات متن، یک سیستم پیشنهاد کوچک. هرکدام مرا مجبور کرد یک مفهوم جدید را درست یاد بگیرم، نه اینکه از روی ده مفهوم سرسری رد شوم.

اشتباهاتی که کردم تا شما نکنید

اشتباه ۱: جهنم آموزش با چاشنی اضافه

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

اشتباه ۲: دویدن خیلی زود به دنبال آخرین دستاوردها

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

اشتباه ۳: نادیده گرفتن داده

با داده‌ها مثل امری مفروض رفتار می‌کردم و تمام انرژی‌ام را روی مدل می‌گذاشتم. در واقعیت، بزرگ‌ترین بردها از نگاه دستی به داده‌ها آمدند — پیدا کردن خطاهای برچسب، نشت داده و عدم توازن کلاس‌ها. حالا برای فهمیدن داده وقت بیشتری می‌گذارم تا برای تنظیم مدل.

اگر مدل شما به‌شکل اسرارآمیزی درخشان است، احتمالاً نشت داده دارید. اگر به‌شکل اسرارآمیزی افتضاح است، احتمالاً در خط لوله‌تان باگ دارید. هر دو شایسته بدبینی‌اند.

چیزی که پیشینه برنامه‌نویسی به من به‌عنوان یک سنگر داد

وقتی از مبانی گذشتم، تجربه مهندسی‌ام به‌جای بار اضافه، به مزیت تبدیل شد. می‌توانستم یک مدل را در یک API تمیز بپیچم، کانتینری‌اش کنم، لاگ و مانیتورینگ اضافه کنم و درباره بودجه تأخیر استدلال کنم. خیلی از آدم‌های «خالص یادگیری ماشین» دقیقاً همان‌جا گیر می‌کنند. این ترکیب — کسی که هم می‌تواند مدل آموزش دهد و هم آن را مسئولانه مستقر کند — بسیار ارزشمندتر از آن بود که در یکی از این دو مهارت کمی بهتر باشم.

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

بهترین توصیه‌هایی که به خودِ گذشته‌ام می‌دادم

  • در ملأ عام یاد بگیر. درباره هر پروژه، حتی شکست‌ها بنویس. نیمی از فرصت‌هایم از یک پست وبلاگ یا یک ریپازیتوری شلوغ گیت‌هاب آمد که کسی به آن برخورد.
  • کارهای کوچک را تمام کن. ده پروژه کوچکِ تمام‌شده بیشتر از یک پروژه جاه‌طلبانه که هرگز منتشرش نکردم به من یاد دادند.
  • دفترچه آزمایشگاه نگه دار. ثبت کن چه امتحان کردی و چه شد. خودِ آینده‌ات یادش نمی‌ماند چرا آن آزمایش شکست خورد.
  • برای یادگیری شغلت را رها نکن. بیش از یک سال در شب‌ها و آخر هفته‌ها یاد گرفتم تا نتیجه داد. آن حاشیه مالی، یادگیری را به‌جای دلهره، لذت‌بخش نگه داشت.

جمع‌بندی

گذر از توسعه فول‌استک به هوش مصنوعی یک جهش نبود؛ یک پلکان طولانی بود و بیشتر پله‌ها هم چیز خاصی نداشتند. اگر برنامه‌نویسی هستید که می‌پرسید آیا پیشینه‌تان در یادگیری ماشین هدر می‌رود، نه — این یک سرآغاز است برای بخش‌هایی که واقعاً به محصول می‌رسند. به اندازه کافی ریاضی یاد بگیرید تا دیگر جا نزنید، زود با داده واقعی دست به کار شوید، پروژه‌های کوچک را تمام کنید و درباره‌شان بنویسید. اینجا کنجکاوی به‌علاوه ثبات، هر بار از استعداد خام جلو می‌زند. همین هفته شروع کنید، دفترچه نگه دارید و بگذارید پروژه‌ها شما را به جلو بکشند.