اگر بتوانید یک پرسپترون ساده را در پایتون پیاده کنید، در واقع اتم سازندهی هر مدل هوش مصنوعی مدرن، از GPT-4 گرفته تا Claude را ساختهاید. در ۸ ژوئن ۲۰۲۶، یک راهنمای عملی در وبسایت ranpara.net به تفصیل توضیح داد که این «کوچکترین مغز ممکن» چگونه تنها با یک وزن، یک بایاس و یک حلقهی تکرار ساده عمل میکند. این ایدهی کوچک، بذر هر شبکهی عصبی است که امروز در جهان در حال اجراست.
بسیاری از مردم به شبکههای عصبی (Neural Network) — شبکهای از سلولهای کوچک، شبیه نقشهٔ مترو، که سیگنال را از ورودی به جواب میرساند — به چشم جعبههای سیاه و نفوذناپذیر نگاه میکنند. اما در واقعیت، این سیستمها فقط میلیونها تصمیمگیرندهی کوچک هستند که روی هم چیده شدهاند. برای درک لایههای پیچیدهی یک مدل زبانی بزرگ (LLM) — مثل کتابخانهداری که میلیاردها صفحه را خوانده و حالا با همان لحن کتابها جواب میدهد — باید ابتدا تکنورونی را بشناسید که یک انتخاب «بله یا خیر» انجام میدهد. این سادهترین مغزی است که میتوانید بسازید: یک عدد وارد میشود و یک پاسخ صفر یا یک خارج میشود.
تصور کنید شخصی به نام «جان» میخواهد تصمیم بگیرد که یک پیشنهاد شغلی را قبول کند یا خیر. جان سکه نمیاندازد، بلکه عوامل را میسنجد. برخی عوامل برای او مهمترند؛ مثلاً اگر «حقوق اضافی» زیاد باشد، اهمیت زیادی دارد. اگر شغل نیاز به «جابجایی شهر» داشته باشد (یعنی نتواند در شهر فعلی بماند)، این عامل هم وزن زیادی در تصمیم او دارد.
جان هر عامل را در میزان اهمیتش ضرب میکند و مجموع آنها را میسنجد. اگر مجموع از یک حد مشخص بالاتر بود، میگوید «بله» و در غیر این صورت «نه». طبق گزارش ranpara.net، این فرآیند انسانی دقیقاً همان روش کار یک پرسپترون است: ورودیها را میگیرد، در وزنها ضرب میکند و مجموع را با یک آستانه مقایسه میکند. در این مثال، عوامل همان ورودیها، میزان اهمیت همان وزن و آن آستانهی «به اندازه کافی بالا»، همان چیزی است که ما به آن بایاس میگوییم.
کالبدشناسی یک تصمیم
در سال ۱۹۵۸، پژوهشگری به نام فرانک روزنبلات ماشینی ساخت که آن را پرسپترون نامید. او از یک سلول مغزی یا نورون الهام گرفته بود. نورون سیگنالها را دریافت میکند و اگر قدرت آنها کافی باشد، شلیک میکند. روزنبلات این ایده را به فرمول ریاضی تبدیل کرد: output = 1 if (w * x + b) > 0 و در غیر این صورت 0.
- ورودی (x): دادهای که ارزیابی میشود (مثلاً نمره امتحان یا میزان افزایش حقوق).
- وزن (w): میزان اهمیتی که ماشین برای آن ورودی خاص قائل است. این پارامتر شیب تصمیم را تعیین میکند.
- بایاس (b): آستانهای که اجازه میدهد مرز تصمیمگیری از نقطه صفر فاصله بگیرد.
بر اساس مستندات فنی، وقتی یک پرسپترون شروع به کار میکند، وزن و بایاس آن فقط اعداد تصادفی هستند. به همین دلیل، ماشین در ابتدا تقریباً به طور قطع اشتباه پیشبینی میکند. اما ماشین با محاسبهی خطای بین پیشبینی و نتیجهی واقعی یاد میگیرد. فرمول این اصلاح به این صورت است: error = result - prediction. اگر ماشین «غلط» (۰) پیشبینی کند اما نتیجه «درست» (۱) باشد، خطا ۱ است. اگر پیشبینی «درست» باشد اما نتیجه «غلط» باشد، خطا ۱- است.
مکانیسم یادگیری
یادگیری از طریق فرآیند «تلنگر زدن» رخ میدهد. وقتی پیشبینی اشتباه است، ماشین وزن و بایاس را در جهت درست تغییر میدهد و از منطق زیر پیروی میکند:
weight += learning_rate * error * valuebias += learning_rate * error
این تنظیم توسط نرخ یادگیری (Learning Rate) کنترل میشود؛ ضریبی که اندازه هر اصلاح را تعیین میکند. معمولاً نرخ ۰.۱ برای پایداری یادگیری استفاده میشود. گامهای کوچک محتاطانه اما کند هستند. گامهای بزرگ سریعاند اما ممکن است از پاسخ درست عبور کرده و به شکلی غیرقابل پیشبینی نوسان کنند.
آموزش در قالب اپوک (Epoch) اندازهگیری میشود. یک اپوک یعنی یک بار عبور کامل از کل مجموعه داده. همانطور که در تحلیلهای قبلی ما دربارهی مبانی یادگیری ماشین اشاره کردیم، مدلها بهندرت در یک مرحله همه چیز را درست میبینند، بنابراین این عبورها — اپوک پس از اپوک — تکرار میشوند تا دقت بالا برود. برای یک مسئله ساده مانند «آیا این عدد مثبت است؟»، ماشین اغلب تقریباً بلافاصله در جای خود تثبیت میشود و مرز تصمیمگیری دقیقاً در اطراف عدد ۰ قرار میگیرد.
چرا بایاس غیرقابل چشمپوشی است؟
بسیاری از مبتدیان تصور میکنند بایاس اختیاری است، اما برای دادههای واقعی حیاتی است. مرز تصمیمگیری، نقطهای است که ماشین از «غلط» به «درست» تغییر وضعیت میدهد. این مرز به صورت زیر محاسبه میشود: decision_boundary = -bias / weight.
مثال نمره امتحان را در نظر بگیرید که نمره ۵۰ یا بالاتر «قبولی» است. در این مورد، مرز تصمیمگیری باید روی ۵۰ باشد، نه روی صفر.
- بدون بایاس: فرمول فقط
weight * scoreاست. چون نمرات امتحان اعداد مثبت هستند، یک وزن مثبت هر دانشجویی را قبول میکند و یک وزن منفی همه را رد میکند. مرز به صفر چسبیده و نمیتواند حرکت کند. دقت معمولاً روی ۵۰٪ متوقف میشود زیرا خطی که مجبور است از صفر بگذرد، نمیتواند «زیر ۵۰» را از «۵۰ و بالاتر» جدا کند. - با بایاس: بایاس مرز را به چپ یا راست میبرد تا بتواند هر جایی که پاسخ واقعی قرار دارد مستقر شود. این کار اجازه میدهد دقت با لغزیدن مرز به سمت عدد ۵۰، به ۱۰۰٪ برسد.
یک جمله برای به خاطر سپردن: وقتی ورودیهای شما دور از صفر هستند، برای انتقال خط به سمت آنها به بایاس نیاز دارید.
نقش نرمالسازی دادهها
یک مشکل خاموش در بهروزرسانی یادگیری وجود دارد: weight += learning_rate * error * value. چون اصلاحات در مقدار ورودی ضرب میشوند، اعداد بزرگ میتوانند مشکلساز شوند. برای نمرات امتحان، مقدار ۱۰۰ میتواند وزن را به مقدار زیادی جابجا کند و باعث شود ماشین بهجای تثبیت آرام، دچار پرش و نوسان شود.
نرمالسازی (Normalization) این مشکل را با کوچک کردن ورودیها به بازهای منظم، مثلاً ۰ تا ۱، حل میکند. سادهترین نسخه این است که هر نمره را بر بیشترین نمره ممکن تقسیم کنید (مثلاً ۱۰۰/۱۰۰ = ۱).
نرمالسازی زمانی ضروری است که ورودیها در مقیاسهای بسیار متفاوتی باشند. در مثال «جان»، حقوق ممکن است به هزاران دلار اندازهگیری شود، در حالی که «ماندن در شهر» فقط ۰ یا ۱ است. بدون نرمالسازی، مقدار دلارها اثر عامل شهر را میبلعد. روشهای رایج عبارتاند از:
- مقیاسبندی ساده: تقسیم بر مقدار حداکثری.
- استانداردسازی: تفریق میانگین و تقسیم بر میزان پراکندگی (انحراف معیار).
پیادهسازی در پایتون
ساخت این مدل از ابتدا نیاز به کتابخانههای سنگین ندارد و فقط با ماژول random امکانپذیر است. برنامه ابتدا وزن و بایاس را با random.uniform(-1, 1) مقداردهی میکند. سپس مجموعهای از ۱۰۰۰ نقطه (۵۰۰ مثبت و ۵۰۰ منفی) را ساخته و آنها را بههم میریزد.
import random
learning_rate = 0.1
EPOCHS = 100
weight = random.uniform(-1, 1)
bias = random.uniform(-1, 1)
# positive numbers are True, negative numbers are False
data = [(i * 0.1, True) for i in range(1, 501)]
data += [(i * 0.1, False) for i in range(-500, 0)]
random.shuffle(data)
for epoch in range(EPOCHS):
for value, result in data:
prediction = (weight * value + bias) > 0
if prediction != result:
error = result - prediction
weight += learning_rate * error * value
bias += learning_rate * error
decision_boundary = -bias / weight
با محاسبهی decision_boundary = -bias / weight توسعهدهندگان میبینند ماشین دقیقاً کجا دادهها را جدا کرده است. در تست «اعداد مثبت»، مرز نزدیک صفر و در تست «قبولی دانشجویان»، مرز نزدیک ۵۰ تثبیت میشود.
از یک نورون تا یک شبکه
یک پرسپترون تنها میتواند یک خط مستقیم بکشد؛ او یک طبقهبندیکننده خطی است. اما قدرت واقعی هوش مصنوعی زمانی ظاهر میشود که این نورونها را در لایههای مختلف روی هم بچینیم.
خروجی یک نورون تبدیل به ورودی نورون بعدی میشود. وقتی هزاران وزن و بایاس ساده با هم تعامل میکنند، شبکه میتواند اشکال و الگوهای پیچیده و درهمتنیدهای را یاد بگیرد که یک خط ساده هرگز قادر به ثبت آنها نیست.
این یعنی هر عملیات در یک مدل عظیم ترنسفورمر، در واقع نسخهای مقیاسشده از همین حلقه ساده پایتون است. پیچیدگی در واحد فردی نیست، بلکه در معماری اتصالات است. هر نورون در یک شبکه عمیق دقیقاً همین کار را میکند: یک وزن، یک بایاس و یک تصمیم.
گام بعدی شما
- کد پایتون بالا را اجرا کنید و مقدار
learning_rateرا به ۰.۹ تغییر دهید تا اثر نوسان در یادگیری را ببینید. - سعی کنید یک مجموعه داده جدید (مثلاً تشخیص میوه بر اساس وزن و اندازه) بسازید و ببینید آیا یک پرسپترون میتواند آن را جدا کند یا خیر.
- برای درک لایههای عمیقتر، مطالعه درباره «توابع فعالساز» (Activation Functions) را شروع کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو