COVER_compressed

وزن در نورون مصنوعی چیست؟ آموزش مفهوم، انواع و محاسبه با پایتون

1. وزن‌ها: چگونه نورون میزان تأثیر هر ورودی را تعیین می‌کند؟

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

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

آیا افزایش دما باید امتیاز خروجی را افزایش دهد؟ یا آیا کاهش سرعت چرخش همیشه نشانه نامطلوبی است؟ آیا شدت ارتعاش باید همان تأثیری را داشته باشد که دما دارد؟ چگونه می‌توان اثر یک ویژگی را افزایش داد، اثر ویژگی دیگری را کاهش داد یا بعضی ویژگی‌ها را از محاسبه حذف کرد؟

مفهوم وزن (Weight)  پاسخی ریاضی به این پرسش‌ها ارائه می‌دهد.

وزن یکی از بنیادی‌ترین پارامترهای نورون مصنوعی است. بدون درک دقیق آن، فهم موضوعاتی مانند یادگیری پرسپترون، آموزش شبکه‌های چندلایه، بهینه‌سازی و پس‌انتشار خطا دشوار خواهد بود. وزن‌ها در مدل‌های عصبی صرفاً ضرایبی برای انجام ضرب نیستند؛ آن‌ها بخشی از ساختار پارامتری مدل هستند و تعیین می‌کنند تغییرات ورودی‌ها چگونه بر مقدار محاسبه‌شده اثر بگذارند (Haykin, 2009; Goodfellow et al., 2016).

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

1.۱. چرا ورودی‌های مختلف نباید الزاماً تأثیر یکسانی داشته باشند؟

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

اگر این ویژگی‌ها بدون هیچ ضریبی با یکدیگر جمع شوند، مدل به‌طور ضمنی فرض می‌کند که افزایش یک واحد در هر ویژگی، اثر عددی یکسانی بر مجموع دارد.

به بیان ساده، در چنین مدلی افزایش یک واحد دما از نظر محاسباتی دقیقاً همان تغییری را ایجاد می‌کند که افزایش یک واحد ارتعاش یا جریان الکتریکی ایجاد می‌کند.

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

برای مثال، در یک دستگاه مشخص، تغییرات ارتعاش ممکن است از نظر تشخیص یک الگوی معین اطلاعات بیشتری فراهم کند، درحالی‌که تغییرات دما در همان محدوده عملیاتی تأثیر کمتری داشته باشند. در دستگاه یا شرایط دیگری، این رابطه می‌تواند متفاوت باشد.

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

1.۱.۱. از جمع ساده به جمع وزن‌دار

فرض کنید نورونی سه ورودی عددی دارد:

x1=2,x2=5,x3=3x_1=2,\quad x_2=5,\quad x_3=3

اگر این مقادیر را بدون وزن‌دهی جمع کنیم، مقدار زیر به دست می‌آید:

s=2+5+3=10s=2+5+3=10

اکنون فرض کنید می‌خواهیم تأثیر ورودی نخست دو برابر، تأثیر ورودی دوم نصف و تأثیر ورودی سوم برابر مقدار اولیه باشد.

برای انجام این کار، ضرایب زیر را انتخاب می‌کنیم:

w1=2,w2=0.5,w3=1w_1=2,\quad w_2=0.5,\quad w_3=1

در نتیجه، رابطه محاسباتی جدید چنین خواهد بود:

s=2(2)+0.5(5)+1(3)=9.5s=2(2)+0.5(5)+1(3)=9.5

تفاوت میان مقدار ۱۰ و ۹٫۵ تنها ناشی از نحوه وزن‌دهی به ورودی‌هاست. هیچ‌یک از مقادیر ورودی تغییر نکرده‌اند.

اما اهمیت اصلی وزن‌دهی صرفاً تغییر عدد نهایی نیست. وزن‌ها به ما امکان می‌دهند میزان پاسخ محاسبه به تغییر هر ویژگی را به‌طور مستقل تنظیم کنیم.

در مثال حاضر، با افزایش یک واحد در ورودی نخست، مقدار مجموع وزن‌دار دو واحد افزایش می‌یابد. افزایش یک واحد در ورودی دوم، مجموع را فقط ۰٫۵ واحد تغییر می‌دهد. در مقابل، افزایش یک واحد در ورودی سوم باعث افزایش یک واحدی مجموع می‌شود.

این ویژگی، اساس تحلیل حساسیت یک نورون خطی را تشکیل می‌دهد.

مثال: وزن‌دهی به معیارهای ارزیابی یک خدمت

صورت مسئله

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

برای یک نمونه مشخص داریم:

𝐱=[0.8,0.6,0.9]T\mathbf{x}=[0.8,0.6,0.9]^{T}

در ابتدا فرض می‌کنیم هر سه شاخص اثر یکسانی داشته باشند. میانگین ساده برابر است با:

sequal=0.8+0.6+0.93≈0.767s_{\text{equal}}=\frac{0.8+0.6+0.9}{3}\approx0.767

اما اگر بخواهیم در این مدل فرضی، به دقت انجام کار وزن بیشتری بدهیم، می‌توانیم ضرایب را به شکل زیر انتخاب کنیم:

𝐰=[0.2,0.5,0.3]T\mathbf{w}=[0.2,0.5,0.3]^{T}

در این صورت:

s=0.2(0.8)+0.5(0.6)+0.3(0.9)=0.73s=0.2(0.8)+0.5(0.6)+0.3(0.9)=0.73

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

کد پایتون

import numpy as np

features = np.array([0.8, 0.6, 0.9])
weights = np.array([0.2, 0.5, 0.3])

equal_score = features.mean()
weighted_score = np.dot(features, weights)

print(f"Equal score: {equal_score:.3f}")
print(f"Weighted score: {weighted_score:.3f}")
print("Contributions:", np.round(features * weights, 2))

خروجی:

Equal score: 0.767
Weighted score: 0.730
Contributions: [0.16 0.30 0.27]

تفسیر

شاخص دوم با مقدار ۰٫۶، از نظر عددی کوچک‌تر از دو شاخص دیگر است؛ اما چون وزن بیشتری دارد، سهم آن در مجموع وزن‌دار برابر ۰٫۳۰ و از سهم سایر ویژگی‌ها بیشتر است.

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

1.۲. تعریف ریاضی وزن و نقش آن در محاسبه نورون

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

اگر نورونی دارای (d) ورودی باشد، برای هر ورودی یک وزن در نظر می‌گیریم. در این صورت، بخش وزن‌دار محاسبه نورون به شکل زیر نوشته می‌شود:

s=∑i=1dwixi\boxed{s=\sum_{i=1}^{d}w_ix_i}

معادله 1.۱ — مجموع وزن‌دار ورودی‌های یک نورون مصنوعی

در معادله 1.۱، (d) تعداد ورودی‌ها، (xi) مقدار ویژگی شماره (i)، (wi) وزن متناظر آن ویژگی و (s) مجموع وزن‌دار ورودی‌هاست. در این مرحله همه ورودی‌ها و وزن‌ها اعداد حقیقی فرض می‌شوند.

برای جلوگیری از تداخل مفاهیم، در این بخش از نماد (s) برای مجموع وزن‌دار پیش از افزودن بایاس استفاده می‌کنیم. در بخش پنجم، با معرفی بایاس، مقدار پیش‌فعال‌سازی را به‌صورت (z=s+b) تعریف خواهیم کرد.

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

اگر تعداد ورودی‌ها چهار باشد، رابطه به شکل زیر درمی‌آید:

s=w1x1+w2x2+w3x3+w4x4s=w_1x_1+w_2x_2+w_3x_3+w_4x_4

این رابطه از نظر ساختاری بسیار ساده است، اما رفتارهای مختلفی ایجاد می‌کند. علامت وزن مشخص می‌کند افزایش یک ورودی، با ثابت بودن سایر ورودی‌ها، مجموع را در چه جهتی تغییر می‌دهد. اندازه قدرمطلق وزن نیز نرخ این تغییر را تعیین می‌کند.

در مثال‌های بعدی، برای جدا کردن نقش وزن‌ها از نقش تابع فعال‌سازی، ابتدا فقط مقدار (s) را بررسی می‌کنیم. بعداً نشان خواهیم داد که تغییرات (s) چگونه می‌توانند بر خروجی نهایی نورون اثر بگذارند.

مثال — محاسبه سهم هر ورودی

فرض کنید یک نورون دارای چهار ورودی باشد:

𝐱=[24−13]\mathbf{x}=\begin{bmatrix}2\\4\\-1\\3\end{bmatrix}

وزن‌های متناظر عبارت‌اند از:

𝐰=[0.5−231]\mathbf{w}=\begin{bmatrix}0.5\\-2\\3\\1\end{bmatrix}

برای محاسبه مجموع وزن‌دار، ابتدا حاصل‌ضرب هر ورودی در وزن متناظر آن را محاسبه می‌کنیم.

  ورودیمقدار ورودیوزنسهم در مجموع
اول۲۰٫۵۱
دوم۴۲−۸−
سوم۱−۳۳−
چهارم۳۱۳

جدول 1.۱ — تجزیه مجموع وزن‌دار به سهم عددی چهار ورودی

بنابراین:

s=1−8−3+3=−7s=1-8-3+3=-7

نتیجه منفی به معنای آن است که در این نمونه، مجموع سهم‌های منفی از مجموع سهم‌های مثبت بزرگ‌تر بوده است.

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

1.۳. وزن مثبت، منفی و صفر چه معنایی دارند؟

یکی از نخستین ویژگی‌های وزن که باید به‌درستی درک شود، علامت آن است.

علامت وزن نشان می‌دهد تغییر ورودی متناظر، در صورت ثابت بودن سایر مؤلفه‌ها، چگونه بر مجموع وزن‌دار تأثیر می‌گذارد.

برای بررسی دقیق‌تر، نورونی با یک ورودی را در نظر می‌گیریم:

معادله 1.۲ — مدل وزن‌دار تک‌ورودی

s=wxs=wx

در این معادله، (x) ورودی، (w) وزن و (s) خروجی محاسبه خطی است. چون فقط یک ورودی داریم، بررسی رابطه میان علامت وزن و تغییرات خروجی بسیار ساده‌تر خواهد بود.

1.۳.۱. وزن مثبت: افزایش ورودی و افزایش مجموع وزن‌دار

فرض کنید وزن برابر ۲ باشد:

s=2xs=2x

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

بنابراین، یک وزن مثبت باعث می‌شود افزایش ورودی، با ثابت بودن سایر عوامل، مجموع وزن‌دار را افزایش دهد.

در شکل 1.۱، خط صعودی متناظر با وزن مثبت است. با حرکت به سمت مقادیر بزرگ‌تر (x)، مقدار (s) نیز افزایش می‌یابد.

توجه داشته باشید که وزن مثبت الزاماً به معنای مطلوب یا نامطلوب بودن یک ویژگی نیست. اگر (s) امتیاز ریسک باشد، افزایش آن ممکن است معنایی متفاوت از حالتی داشته باشد که (s) امتیاز عملکرد باشد.

1.۳.۲. وزن منفی: افزایش ورودی و کاهش مجموع وزن‌دار

حال فرض کنید وزن برابر ۲− باشد:

s=−2xs=-2x

اگر مقدار ورودی از یک به دو افزایش یابد، خروجی از ۲− به ۴− تغییر می‌کند. بنابراین، مقدار خروجی کاهش یافته است.

وزن منفی به این معناست که افزایش ورودی، با ثابت بودن سایر ورودی‌ها، مقدار مجموع وزن‌دار را کاهش می‌دهد.

این موضوع را نباید با منفی بودن خود ورودی اشتباه گرفت.

اگر وزن منفی و ورودی نیز منفی باشد، حاصل‌ضرب آن‌ها مثبت می‌شود. برای مثال:

(−2)(−3)=6(-2)(-3)=6

پس وزن منفی لزوماً سهم عددی منفی ایجاد نمی‌کند. علامت حاصل‌ضرب به علامت هر دو عامل بستگی دارد.

این نکته به‌ویژه در شبکه‌هایی که ورودی‌ها می‌توانند مثبت و منفی باشند اهمیت دارد؛ مانند ورودی‌هایی که میانگین آن‌ها از داده کم شده است.

1.۳.۳. وزن صفر: حذف سهم مستقیم یک ورودی

اگر وزن یک ویژگی برابر صفر باشد، سهم آن ویژگی در مجموع وزن‌دار نیز صفر خواهد بود:

0×x=00\times x=0

در یک نورون با ساختار جمع وزن‌دار، این وضعیت به معنای آن است که تغییر مقدار آن ویژگی، در صورت ثابت بودن سایر ورودی‌ها، تأثیر مستقیمی بر مقدار (s) ندارد.

برای مثال:

s=2x1+0x2−3x3s=2x_1+0x_2-3x_3

از نظر محاسباتی با رابطه زیر برابر است:

s=2x1−3x3s=2x_1-3x_3

بنابراین، ویژگی دوم در این محاسبه مشارکت مستقیم ندارد.

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

در نتیجه، حذف سهم محاسباتی یک ورودی با اثبات بی‌اهمیت بودن علمی آن تفاوت دارد.

جدول 1.۲ — تفسیر وزن‌های مثبت، منفی و صفر

وضعیت وزناثر افزایش ورودی بر (s)تفسیر ریاضی
(w>0)افزایشرابطه مستقیم با مجموع وزن‌دار
(w<0)کاهشرابطه معکوس با مجموع وزن‌دار
(w=0)بدون تغییر مستقیمسهم خطی ورودی حذف می‌شود

این جدول فقط رفتار بخش خطی نورون را نشان می‌دهد. پس از افزودن تابع فعال‌سازی، رابطه میان تغییر ورودی و خروجی نهایی باید با توجه به ویژگی‌های همان تابع بررسی شود.

مثال: وزن مثبت، منفی و صفر در یک مدل آموزشی

صورت مسئله

فرض کنید یک مدل امتیازدهی آموزشی برای بررسی وضعیت یک سفر، سه ویژگی مقیاس‌بندی‌شده را دریافت می‌کند:

  • کیفیت مسیر: ۰٫۸
  • میزان تأخیر: ۰٫۶
  • تعداد توقف‌های ثبت‌شده: ۰٫۴

برای نشان دادن سه نوع وزن، ضرایب زیر را انتخاب می‌کنیم:

𝐰=[2,−1.5,0]T\mathbf{w}=[2,-1.5,0]^{T}

مجموع وزن‌دار:

s=2(0.8)−1.5(0.6)+0(0.4)=0.7s=2(0.8)-1.5(0.6)+0(0.4)=0.7

کد پایتون

import numpy as np

x = np.array([0.8, 0.6, 0.4])
w = np.array([2.0, -1.5, 0.0])

contributions = x * w

print("Contributions:", contributions)
print("Weighted sum:", round(contributions.sum(), 2))

خروجی

Contributions: [ 1.6 -0.9  0. ]
Weighted sum: 0.7

تفسیر

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

اما نباید نتیجه گرفت تعداد توقف‌ها در واقعیت بی‌اهمیت است. ممکن است در مدل دیگری یا در کنار ویژگی‌های دیگر اطلاعات مفیدی داشته باشد.

1.۴. اندازه وزن چگونه حساسیت نورون را تغییر می‌دهد؟

علامت وزن جهت تغییر را تعیین می‌کند، اما اندازه قدرمطلق آن مشخص می‌کند تغییرات ورودی تا چه اندازه بر مجموع وزن‌دار اثر بگذارند.

برای یک نورون تک‌ورودی با رابطه (s=wx)، اگر وزن برابر ۰٫۲ باشد، افزایش یک واحد در ورودی باعث افزایش ۰٫۲ واحدی در مجموع می‌شود.

اگر وزن برابر ۵ باشد، همان افزایش یک واحدی در ورودی باعث افزایش پنج واحدی مجموع خواهد شد.

پس هرچه قدرمطلق وزن بزرگ‌تر باشد، حساسیت بخش خطی نورون به تغییرات مطلق همان ورودی بیشتر خواهد بود.

این نتیجه را می‌توان دقیق‌تر بیان کرد.

فرض کنید مقدار ورودی از x به x+Δx تغییر کند. مقدار جدید مجموع وزن‌دار برابر خواهد بود با:

snew=w(x+Δx)s_{\text{new}}=w(x+\Delta x)

با باز کردن پرانتز:

snew=wx+wΔxs_{\text{new}}=wx+w\Delta x

از آنجا که مقدار اولیه s_old = wx بوده است، اختلاف دو مقدار چنین می‌شود:

معادله 1.۳ — رابطه دقیق تغییر ورودی و تغییر مجموع وزن‌دار در نورون تک‌ورودی

Δs=wΔx\boxed{\Delta s=w\Delta x}

در معادله 1.۳، (Δx) تغییر مقدار ورودی و (Δs) تغییر مجموع وزن‌دار است. فرض می‌کنیم وزن در طول این تغییر ثابت بماند.

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

مثال — مقایسه سه وزن

فرض کنید ورودی در هر سه مدل از ۲ به ۳ افزایش یابد؛ بنابراین (Δx=1).

وزنمقدار اولیه (s)مقدار جدید (s)تغییر
۰٫۲۰٫۴۰٫۶۰٫۲
۲۴۶۲
۵−۱۰−۱۵−۵−

جدول 1.۳ — اثر اندازه و علامت وزن بر پاسخ مدل به تغییر یکسان ورودی

نتایج جدول 1.۳ با معادله 1.۳ سازگارند. برای وزن مثبت، مقدار (s) افزایش می‌یابد؛ برای وزن منفی، کاهش پیدا می‌کند. همچنین قدرمطلق تغییر خروجی با قدرمطلق وزن متناسب است.

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

مثال :تحلیل حساسیت خروجی در برابر تغییر ورودی

صورت مسئله

فرض کنید نورونی دارای یک ورودی با وزن ثابت ۲٫۵ است. اگر مقدار ورودی از ۰٫۴ به ۰٫۷ افزایش یابد، مقدار مجموع وزن‌دار چه تغییری خواهد کرد؟

رابطه اصلی:

s=wxs=wx

تغییر ورودی:

Δx=0.7−0.4=0.3\Delta x=0.7-0.4=0.3

در نتیجه:

Δs=wΔx=2.5(0.3)=0.75 Δ s=wΔ x=2.5(0.3) =0.75

کد پایتون

weight = 2.5
x_old = 0.4
x_new = 0.7

s_old = weight * x_old
s_new = weight * x_new

print("Old score:", s_old)
print("New score:", s_new)
print("Score change:", round(s_new - s_old, 2))

خروجی

Old score: 1.0
New score: 1.75
Score change: 0.75

تفسیر

برای یک وزن ثابت، اثر تغییر ورودی را می‌توان مستقیماً با رابطه (Δ s=wΔ x) به دست آورد. این رابطه در بخش خطی نورون دقیق است و نیاز به محاسبه مجدد سایر ورودی‌ها ندارد.

اگر وزن منفی بود، افزایش همین ورودی باعث کاهش مجموع وزن‌دار می‌شد.

1.۵. چرا وزن بزرگ‌تر همیشه به معنای اهمیت بیشتر یک ویژگی نیست؟

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

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

برای نمونه‌ای مشخص داریم:

x1=80,x2=3000x_1=80,\qquad x_2=3000

فرض می‌کنیم وزن‌های متناظر عبارت باشند از:

w1=0.5,w2=0.01w_1=0.5,\qquad w_2=0.01

اگر صرفاً وزن‌ها را مقایسه کنیم، وزن دما پنجاه برابر وزن سرعت چرخش است. ممکن است در نگاه نخست نتیجه بگیریم که دما تأثیر بسیار بیشتری در محاسبه دارد.

اما محاسبه واقعی چنین است:

s=0.5(80)+0.01(3000)=70 s=0.5(80)+0.01(3000)=70

سهم عددی دما برابر ۴۰ و سهم عددی سرعت برابر ۳۰ است. در این نمونه، تفاوت سهم‌ها بسیار کمتر از نسبت پنجاه‌برابری وزن‌هاست.

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

بااین‌حال، حتی مقایسه این سهم‌ها نیز به‌تنهایی معیار کاملی برای اهمیت علمی یا پیش‌بینی یک ویژگی نیست. این سهم‌ها به نمونه مورد بررسی وابسته‌اند. افزون بر آن، هم‌بستگی میان ویژگی‌ها، نوع مسئله، توزیع داده‌ها و روش تفسیر مدل نیز اهمیت دارند (Molnar, 2022).

1.۵.۱. تأثیر واحد اندازه‌گیری بر مقدار وزن

فرض کنید طول قطعه‌ای صنعتی برحسب متر اندازه‌گیری شده است. مقدار آن برای یک نمونه برابر ۲ متر است و در مدلی ساده با وزن ۳ وارد محاسبه می‌شود:

s=3(2)=6 s=3(2)=6

اکنون همان طول را برحسب سانتی‌متر بیان می‌کنیم. مقدار ورودی به ۲۰۰ تغییر می‌کند.
اگر بخواهیم مقدار محاسبه ثابت بماند، باید وزن جدید را متناسب با تغییر واحد تنظیم کنیم:

s=0.03(200)=6s=0.03(200)=6

در مدل نخست وزن برابر ۳ و در مدل دوم برابر ۰٫۰۳ است؛ یعنی وزن نخست صد برابر بزرگ‌تر است. بااین‌حال، هر دو مدل دقیقاً محاسبه یکسانی را برای همان کمیت فیزیکی انجام می‌دهند.

این موضوع را می‌توان به‌صورت عمومی توضیح داد.

فرض کنید یک ویژگی بر اثر تغییر واحد، در ضریب ثابت و غیرصفر (c) ضرب شود:

x′=cxx’=cx

برای حفظ سهم عددی ویژگی، وزن جدید باید چنین انتخاب شود:

w′=wcw’=\frac{w}{c}

در معادله 1.۴، (x’) مقدار ویژگی در نمایش جدید، (c) ضریب تغییر مقیاس و (w’) وزن متناسب با نمایش جدید است.

با جای‌گذاری، خواهیم داشت:

w′x′=wc(cx)=wxw’x’=\frac{w}{c}(cx)=wx

بنابراین، اگر تغییر مقیاس و اصلاح وزن به‌صورت سازگار انجام شوند، سهم ویژگی در محاسبه حفظ خواهد شد.

این نتیجه یک خاصیت جبری دقیق است، نه صرفاً مشاهده‌ای تجربی.

مثال : چرا با تغییر واحد اندازه‌گیری باید وزن اصلاح شود؟

صورت مسئله

فرض کنید طول یک قطعه صنعتی ابتدا برحسب متر اندازه‌گیری شده است. طول قطعه ۲٫۵ متر و وزن متناظر این ویژگی در مدل برابر ۴ است.

s=4(2.5)=10s=4(2.5)=10

حال همان طول را برحسب سانتی‌متر نمایش می‌دهیم:

x′=250x’=250

اگر وزن ۴ را بدون تغییر نگه داریم، مقدار مجموع وزن‌دار به ۱۰۰۰ می‌رسد. درحالی‌که کمیت فیزیکی اصلاً تغییر نکرده است.

برای حفظ همان مقدار اولیه باید وزن را بر ۱۰۰ تقسیم کنیم:

w′=4100=0.04w’=\frac{4}{100}=0.04

بنابراین:

s′=0.04(250)=10s’=0.04(250)=10

کد پایتون

length_m = 2.5
weight_m = 4.0

length_cm = length_m * 100

wrong_score = weight_m * length_cm

weight_cm = weight_m / 100
correct_score = weight_cm * length_cm

print("Original score:", weight_m * length_m)
print("Without correction:", wrong_score)
print("With correction:", correct_score)

خروجی:

Original score: 10.0
Without correction: 1000.0
With correction: 10.0

تفسیر

این مثال ثابت می‌کند که مقدار یک وزن بدون شناخت واحد اندازه‌گیری ویژگی، معنای کاملی ندارد.

دو وزن بسیار متفاوت، مانند ۴ و ۰٫۰۴، می‌توانند دقیقاً یک اثر عددی یکسان ایجاد کنند؛ مشروط بر اینکه تعریف و مقیاس ورودی‌ها نیز متناسب تغییر کرده باشند.

این نتیجه مخصوص تبدیل‌های ضربی واحدهاست. تبدیل‌هایی که شامل یک جمله ثابت هستند، مانند سلسیوس به فارنهایت، برای حفظ کامل خروجی ممکن است به اصلاح بایاس نیز نیاز داشته باشند.

1.۵.۲. آیا باید همه ویژگی‌ها را مقیاس‌بندی کنیم؟

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

بااین‌حال، تصمیم درباره مقیاس‌بندی باید بر اساس ماهیت مسئله و الگوریتم مورد استفاده اتخاذ شود.

در یک نورون با وزن‌های ثابت، تغییر مقیاس ورودی بدون اصلاح وزن‌ها می‌تواند خروجی را تغییر دهد. در یک مدل یادگیرنده نیز مقیاس ویژگی‌ها ممکن است بر مسیر و سرعت آموزش تأثیر بگذارد. اما از این واقعیت نمی‌توان نتیجه گرفت که هر نوع مقیاس‌بندی برای هر الگوریتم و هر داده‌ای ضروری یا مفید است (Géron, 2022; Bishop & Bishop, 2024).

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

1.۶. بردار وزن: نمایش منظم پارامترهای یک نورون

در بخش سوم، ورودی‌های یک نمونه را به‌صورت یک بردار ستونی نمایش دادیم. اکنون می‌توانیم وزن‌های متناظر را نیز در یک بردار قرار دهیم.

اگر نورونی (d) ورودی داشته باشد، بردار وزن آن چنین تعریف می‌شود:

𝐰=[w1w2⋮wd]∈ℝd\mathbf{w}= \begin{bmatrix} w_1\\ w_2\\ \vdots\\ w_d \end{bmatrix} \in\mathbb{R}^d

معادله 1.۵ — نمایش برداری وزن‌های یک نورون با (d) ورودی

بردار 𝐰 دارای همان تعداد مؤلفه‌ای است که بردار ورودی 𝐱 دارد. این موضوع تصادفی نیست؛ زیرا هر ورودی باید وزن متناظر خود را داشته باشد.

برای مثال، اگر بردار ورودی دارای چهار مؤلفه باشد، بردار وزن نیز باید چهار مؤلفه داشته باشد.

اکنون می‌توان رابطه مجموع وزن‌دار را به شکلی فشرده نوشت:

s=𝐰T𝐱\boxed{s=\mathbf{w}^{T}\mathbf{x}}

معادله 1.۶ — نمایش مجموع وزن‌دار با استفاده از ضرب داخلی دو بردار

نماد T به معنای ترانهاده (Transpose) است. چون در قرارداد کتاب، بردار وزن یک بردار ستونی d×1 است، ترانهاده آن به یک بردار سطری 1×d تبدیل می‌شود.

بنابراین، از نظر ابعاد داریم:

(1×d)(d×1)=(1×1)(1\times d)(d\times 1)=(1\times 1)

نتیجه این ضرب یک مقدار اسکالر است.

1.۶.۱. ضرب داخلی چگونه محاسبه می‌شود؟

ضرب داخلی (Dot Product) دو بردار حقیقی هم‌اندازه با ضرب مؤلفه‌های متناظر و جمع حاصل‌ضرب‌ها محاسبه می‌شود.

اگر:

𝐱=[234],𝐰=[1−20.5]\mathbf{x}= \begin{bmatrix} 2\\ 3\\ 4 \end{bmatrix} ,\quad \mathbf{w}= \begin{bmatrix} 1\\ -2\\ 0.5 \end{bmatrix}

آنگاه:

𝐰T𝐱=1(2)−2(3)+0.5(4)=−2\mathbf{w}^{T}\mathbf{x}=1(2)-2(3)+0.5(4)=-2

محاسبه به این معناست که سهم سه ورودی به‌ترتیب ۲، ۶− و ۲ بوده و مجموع آن‌ها برابر ۲− شده است.

این مثال نشان می‌دهد که رابطه برداری هیچ عملیات جدیدی فراتر از جمع وزن‌دار معرفی نمی‌کند. تنها روش نوشتن و سازمان‌دهی محاسبات را تغییر می‌دهد.

اهمیت اصلی این نمایش در آن است که برای نورون‌های دارای تعداد زیاد ورودی و همچنین برای محاسبات شبکه‌های چندلایه مناسب‌تر است.

1.۶.۲. تفاوت ضرب داخلی با ضرب مؤلفه‌به‌مؤلفه

در برنامه‌نویسی، به‌ویژه با NumPy، باید میان ضرب داخلی و ضرب مؤلفه‌به‌مؤلفه (Element-wise Multiplication) تمایز قائل شویم.

اگر دو بردار زیر را داشته باشیم:

import numpy as np

x = np.array([2.0, 3.0, 4.0])
w = np.array([1.0, -2.0, 0.5])

elementwise = x * w
dot_product = np.dot(x, w)

print(elementwise)
print(dot_product)

خروجی:

[ 2. -6.  2.]
-2.0

دستور  x * w  سه حاصل‌ضرب جداگانه را تولید می‌کند و خروجی آن یک آرایه سه‌مؤلفه‌ای است.

در مقابل، دستور np.dot(x, w)  حاصل‌ضرب‌های متناظر را جمع می‌کند و یک عدد اسکالر برمی‌گرداند.

می‌توان رابطه میان این دو عملیات را چنین نوشت:

dot_product = np.sum(x * w)

این عبارت نیز مقدار ۲− تولید می‌کند.

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

مثال:محاسبه هم‌زمان مجموع وزن‌دار چند نمونه

صورت مسئله

فرض کنید سه نمونه با سه ویژگی عددی در اختیار داریم:

X=[123214321]X= \begin{bmatrix} 1&2&3\\ 2&1&4\\ 3&2&1 \end{bmatrix}

بردار وزن مشترک:

𝐰=[0.5−12]\mathbf{w}= \begin{bmatrix} 0.5\\ -1\\ 2 \end{bmatrix}

مجموع وزن‌دار هر نمونه را می‌توان جداگانه محاسبه کرد. اما روش منظم‌تر استفاده از ضرب ماتریسی است:

𝐬=X𝐰\mathbf{s}=X\mathbf{w}

محاسبات دستی:

s1=0.5(1)−1(2)+2(3)=4.5s2=0.5(2)−1(1)+2(4)=8s3=0.5(3)−1(2)+2(1)=1.5\begin{aligned} s_1&=0.5(1)-1(2)+2(3)=4.5\\ s_2&=0.5(2)-1(1)+2(4)=8\\ s_3&=0.5(3)-1(2)+2(1)=1.5 \end{aligned}

کد پایتون

import numpy as np

X = np.array([
    [1, 2, 3],
    [2, 1, 4],
    [3, 2, 1]
], dtype=float)

w = np.array([0.5, -1.0, 2.0])

scores = X @ w

print("Matrix shape:", X.shape)
print("Weight shape:", w.shape)
print("Scores:", scores)

خروجی

Matrix shape: (3, 3)
Weight shape: (3,)
Scores: [4.5 8.  1.5]

تفسیر

وزن‌ها برای تمام نمونه‌ها ثابت بوده‌اند، اما چون بردار ورودی هر نمونه متفاوت است، مجموع وزن‌دار آن‌ها نیز تفاوت دارد.

عملیات X @ w سه ضرب داخلی را به‌صورت یک محاسبه برداری اجرا می‌کند. نتیجه، سه عدد است که هرکدام به یک نمونه تعلق دارند.

این تفاوت خروجی‌ها به معنای یادگیری نورون نیست؛ هیچ وزنی در طول اجرای برنامه تغییر نکرده است.

1.۷. تفسیر هندسی وزن‌ها: از ضرایب عددی تا جهت‌گیری در فضا

تا اینجا وزن‌ها را با عملیات ضرب و جمع بررسی کردیم. اما وزن‌ها معنای هندسی مهمی نیز دارند که برای فهم مرز تصمیم پرسپترون ضروری است.

فرض کنید نورونی دارای دو ورودی باشد:

𝐱=[x1x2]\mathbf{x}= \begin{bmatrix} x_1\\ x_2 \end{bmatrix}

بردار وزن نیز به شکل زیر تعریف شده باشد:

𝐰=[w1w2]\mathbf{w}= \begin{bmatrix} w_1\\ w_2 \end{bmatrix}

در این حالت:

s=w1x1+w2x2s=w_1x_1+w_2x_2

اکنون به‌جای آنکه ورودی‌ها را صرفاً دو عدد مستقل در نظر بگیریم، هر نمونه را نقطه‌ای روی صفحه مختصات تصور می‌کنیم. محور افقی مقدار (x1) و محور عمودی مقدار (x2) را نمایش می‌دهد.

بردار وزن نیز برداری در همین فضاست.

در جبر خطی، ضرب داخلی دو بردار را می‌توان بر اساس اندازه بردارها و زاویه میان آن‌ها بیان کرد:

𝐰T𝐱=‖𝐰‖2‖𝐱‖2cos⁡θ(1.7)\begin{equation} \boxed{\mathbf{w}^{T}\mathbf{x}=\|\mathbf{w}\|_2\|\mathbf{x}\|_2\cos\theta} \tag{1.7} \end{equation}

معادله ۱.۷ — رابطه ضرب داخلی با اندازه بردارها و زاویه میان آن‌ها

در معادله ۱.۷، ‖𝐰‖₂ اندازه اقلیدسی بردار وزن، ‖𝐱‖₂ اندازه اقلیدسی بردار ورودی و θ زاویه میان دو بردار غیرصفر است.

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

اگر زاویه میان بردارها کمتر از ۹۰ درجه باشد، ضرب داخلی مثبت است. پس اگر زاویه دقیقاً ۹۰ درجه باشد، ضرب داخلی صفر خواهد بود. اگر زاویه از ۹۰ درجه بیشتر باشد، ضرب داخلی منفی می‌شود.

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

1.۷.۱. بردار وزن چه نقشی در جهت‌گیری محاسبه دارد؟

برای درک این موضوع، بردار وزن زیر را در نظر می‌گیریم:

𝐰=[21]\mathbf{w}= \begin{bmatrix} 2\\ 1 \end{bmatrix}

اکنون نقاطی را بررسی می‌کنیم که برای آن‌ها مجموع وزن‌دار برابر صفر است:

2x1+x2=02x_1+x_2=0

با مرتب کردن رابطه داریم:

x2=−2x1x_2=-2x_1

این معادله خطی را در صفحه مشخص می‌کند که از مبدأ مختصات عبور می‌کند.

بردار وزن بر این خط عمود است. برای اثبات این موضوع، می‌توان برداری هم‌جهت با خط، مانند ((1,-2))، انتخاب کرد. حاصل ضرب داخلی آن با بردار وزن برابر است با:

2(1)+1(−2)=02(1)+1(-2)=0

صفر شدن ضرب داخلی نشان می‌دهد این دو بردار عمودند.

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

در فضای دوبعدی، این مجموعه یک خط است. سپس در فضای سه‌بعدی، برای بردار وزن غیرصفر، یک صفحه به دست می‌آید. در ابعاد بالاتر، ساختاری مشابه به نام ابرصفحه (Hyperplane) تشکیل می‌شود.

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

تحلیل هندسی کامل نورون، از جمله تأثیر بایاس بر جابه‌جایی خط، در بخش نهم توسعه خواهد یافت.

1.۸. تحلیل حساسیت نورون نسبت به تغییر وزن‌ها

تا اینجا بررسی کردیم که تغییر ورودی چگونه بر مجموع وزن‌دار اثر می‌گذارد. اکنون مسئله را از جهت دیگری بررسی می‌کنیم: اگر ورودی‌ها ثابت باشند و وزن‌ها تغییر کنند، چه اتفاقی می‌افتد؟

این پرسش اهمیت ویژه‌ای دارد؛ زیرا در الگوریتم‌های یادگیری، معمولاً داده‌های آموزشی ارائه می‌شوند و پارامترهای مدل برای تولید خروجی مطلوب تنظیم می‌شوند.

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

فرض کنید نورون زیر را داریم:

s=w1x1+w2x2+w3x3s=w_1x_1+w_2x_2+w_3x_3

اگر فقط وزن دوم به اندازه (Δw2) تغییر کند و سایر وزن‌ها و ورودی‌ها ثابت باشند، تغییر مجموع وزن‌دار برابر خواهد بود با:

Δs=x2Δw2\boxed{\Delta s=x_2\Delta w_2}

معادله 1.۸ — اثر تغییر یک وزن بر مجموع وزن‌دار با ورودی‌های ثابت

در این رابطه، (x2) مقدار ثابت ورودی دوم، (Δw2) تغییر وزن دوم و (Δs) تغییر مجموع وزن‌دار است.

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

اما از این مشاهده نباید نتیجه گرفت که وزن دوم برای همه نمونه‌ها بی‌اثر است. ممکن است ورودی دوم فقط در نمونه حاضر صفر باشد و در نمونه‌های دیگر مقدار غیرصفر داشته باشد.

مثال — چرا یک وزن روی نمونه‌های مختلف اثر متفاوت دارد؟

فرض کنید دو نمونه داریم:

𝐱(1)=[12],𝐱(2)=[15]\mathbf{x}^{(1)}= \begin{bmatrix} 1\\ 2 \end{bmatrix} ,\quad \mathbf{x}^{(2)}= \begin{bmatrix} 1\\ 5 \end{bmatrix}

وزن دوم را به‌اندازه ۰٫۵ افزایش می‌دهیم.

برای نمونه نخست:

Δs(1)=2(0.5)=1\Delta s^{(1)}=2(0.5)=1

برای نمونه دوم:

Δs(2)=5(0.5)=2.5\Delta s^{(2)}=5(0.5)=2.5

بنابراین، اصلاح یکسان وزن دوم، مقدار محاسبه‌شده دو نمونه را به یک اندازه تغییر نمی‌دهد.

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

1.۹. آزمایش‌های عملی با پایتون: رفتار وزن‌ها را مشاهده کنیم

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

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

آزمایش 1.۱ — اثر وزن مثبت، منفی و صفر

پرسش علمی: آیا تغییر علامت وزن می‌تواند جهت رابطه میان ورودی و مجموع وزن‌دار را تغییر دهد؟

در این آزمایش، سه وزن (2)، (−2) و (0) را انتخاب می‌کنیم. ورودی‌ها در تمام حالت‌ها یکسان‌اند و از منفی سه تا مثبت سه تغییر می‌کنند.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 121)

weights = {
    "Positive weight": 2.0,
    "Negative weight": -2.0,
    "Zero weight": 0.0
}

for label, w in weights.items():
    s = w * x
    plt.plot(x, s, label=f"{label}: w={w}")

plt.axhline(0, linewidth=0.8)
plt.axvline(0, linewidth=0.8)

plt.xlabel("Input x")
plt.ylabel("Weighted sum s")
plt.title("Effect of Weight Sign")
plt.legend()
plt.grid(alpha=0.25)
plt.show()

نتیجه مورد انتظار

منحنی مربوط به وزن مثبت یک خط صعودی، منحنی وزن منفی یک خط نزولی و منحنی وزن صفر خطی افقی بر مقدار صفر خواهد بود.

این آزمایش نشان می‌دهد که برای یک نورون تک‌ورودی با وزن ثابت، علامت وزن جهت تغییر مجموع وزن‌دار و قدرمطلق وزن میزان تغییر آن را مشخص می‌کند.

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

آزمایش 1.۲ — حساسیت مجموع وزن‌دار به تغییر یک وزن

پرسش علمی: اگر ورودی‌ها ثابت باشند، تغییر یک وزن چگونه مقدار محاسبه نورون را تحت تأثیر قرار می‌دهد؟

بردار ورودی و وزن را به شکل زیر انتخاب می‌کنیم:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([2.0, 4.0, 1.0])
w = np.array([0.5, -1.0, 2.0])

tested_weights = np.linspace(-3, 3, 121)
scores = []

for value in tested_weights:
    current_w = w.copy()
    current_w[1] = value

    score = np.dot(current_w, x)
    scores.append(score)

plt.plot(tested_weights, scores)

plt.xlabel("Second weight")
plt.ylabel("Weighted sum")
plt.title("Sensitivity to the Second Weight")
plt.grid(alpha=0.25)
plt.show()

در این برنامه، فقط وزن دوم تغییر می‌کند. دو وزن دیگر و تمام ورودی‌ها ثابت می‌مانند.

از نظر ریاضی، مجموع وزن‌دار برابر است با:

s=0.5(2)+w2(4)+2(1)s=0.5(2)+w_2(4)+2(1)

بنابراین:

s=3+4w2s=3+4w_2

این رابطه نشان می‌دهد نمودار مجموع وزن‌دار نسبت به وزن دوم، خطی با شیب ۴ خواهد بود.

پس اگر وزن دوم یک واحد افزایش یابد، مجموع وزن‌دار چهار واحد افزایش پیدا می‌کند.

تفسیر: تغییر یک وزن، برای ورودی‌های ثابت، رابطه‌ای خطی با مجموع وزن‌دار دارد و ضریب این رابطه برابر مقدار ورودی متناظر است.

محدودیت: این نتیجه درباره مقدار پیش‌فعال‌سازی معتبر است و الزاماً به معنای تغییر خطی خروجی نهایی پس از تابع فعال‌سازی نیست.

آزمایش 1.۳ — تأثیر تغییر مقیاس ویژگی

پرسش علمی: آیا می‌توان مقدار یک ویژگی را تغییر مقیاس داد، بدون آنکه سهم آن در محاسبه تغییر کند؟

در این آزمایش، یک ویژگی را ابتدا برحسب متر و سپس برحسب سانتی‌متر نمایش می‌دهیم.

length_m = 2.0
weight_m = 3.0

score_m = weight_m * length_m

length_cm = 200.0
weight_cm = weight_m / 100.0

score_cm = weight_cm * length_cm

print("Meters:", score_m)
print("Centimeters:", score_cm)

assert score_m == score_cm

خروجی:

Meters: 6.0
Centimeters: 6.0

نتیجه نشان می‌دهد اگر مقدار ویژگی در یک ضریب ضرب شود و وزن متناظر بر همان ضریب تقسیم شود، سهم عددی ویژگی ثابت می‌ماند.

این آزمایش، رابطه 1.۴ را به‌صورت محاسباتی تأیید می‌کند.

محدودیت: این آزمایش درباره تبدیل ضربی واحدهاست. تبدیل‌هایی مانند سلسیوس به فارنهایت، علاوه بر ضریب مقیاس شامل جمله ثابت نیز هستند. برای حفظ کامل مقدار پیش‌فعال‌سازی در چنین تبدیل‌هایی، ممکن است بایاس نیز نیازمند اصلاح باشد.

1.۱۰. خطاهای رایج در درک و پیاده‌سازی وزن‌ها

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

1.۱۰.۱. اشتباه گرفتن وزن با مقدار ورودی

ورودی و وزن هر دو ممکن است عدد حقیقی باشند، اما نقش یکسانی ندارند.

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

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

تنها هنگامی که یک الگوریتم یادگیری یا روش تنظیم پارامتر اجرا شود، وزن‌ها ممکن است تغییر کنند.

1.۱۰.۲. فرض اینکه وزن بزرگ‌تر همیشه ویژگی مهم‌تری را نشان می‌دهد

چنین استنتاجی بدون بررسی واحدها، مقیاس ویژگی‌ها، توزیع داده‌ها و ساختار مدل قابل دفاع نیست.

برای مثال، وزن ۰٫۰۱ برای ویژگی‌ای که مقادیر آن در حدود چند هزار است، ممکن است اثر عددی بیشتری از وزن ۲ برای ویژگی‌ای داشته باشد که مقادیر آن نزدیک صفر هستند.

حتی پس از مقیاس‌بندی ویژگی‌ها نیز تفسیر وزن‌ها به هم‌بستگی میان متغیرها و ساختار مدل وابسته است.

1.۱۰.۳. فرض اینکه وزن منفی همیشه خروجی نهایی را کاهش می‌دهد

وزن منفی بیانگر رابطه معکوس میان تغییر ورودی و بخش خطی محاسبه است. اما خروجی نهایی نورون به تابع فعال‌سازی نیز وابسته خواهد بود.

همچنین اگر مقدار ورودی منفی باشد، حاصل‌ضرب وزن منفی در آن می‌تواند مثبت شود.

بنابراین، باید میان علامت وزن، علامت سهم عددی یک ورودی و رفتار خروجی نهایی تمایز قائل شویم.

1.۱۰.۴. نادیده گرفتن سازگاری ابعاد

اگر بردار ورودی دارای پنج مؤلفه باشد، بردار وزن نورون نیز باید پنج مؤلفه داشته باشد.

برای مثال، کد زیر از نظر ابعاد ناسازگار است:

import numpy as np

x = np.array([1.0, 2.0, 3.0])
w = np.array([0.5, 1.0])

# This will raise a ValueError:
# np.dot(x, w)

در این مثال، ورودی سه ویژگی دارد اما فقط دو وزن تعریف شده است.

برای جلوگیری از چنین خطاهایی، بهتر است قبل از محاسبه ضرب داخلی، طول دو بردار بررسی شود.

def weighted_sum(x, w):
    x = np.asarray(x, dtype=float)
    w = np.asarray(w, dtype=float)

    if x.ndim != 1 or w.ndim != 1:
        raise ValueError("Both inputs must be 1D arrays.")

    if x.shape != w.shape:
        raise ValueError(
            "Input and weight dimensions must match."
        )

    if not np.isfinite(x).all():
        raise ValueError("Invalid input values.")

    if not np.isfinite(w).all():
        raise ValueError("Invalid weight values.")

    return float(np.dot(w, x))

 

1.۱۱. پروژه عملی: تحلیل رفتار یک نورون با وزن‌های قابل تنظیم

در پروژه این بخش، یک نورون سه‌ورودی طراحی می‌کنیم که صرفاً مجموع وزن‌دار را محاسبه می‌کند. سپس اثر تغییر هر وزن را به‌صورت جداگانه بررسی خواهیم کرد.

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

1.۱۱.۱. تعریف مسئله و ورودی‌ها

فرض کنید سه ویژگی عددیِ مقیاس‌بندی‌شده از یک سامانه فرضی دریافت می‌کنیم:

𝐱=[0.80.40.6]\mathbf{x}= \begin{bmatrix} 0.8\\ 0.4\\ 0.6 \end{bmatrix}

وزن‌های اولیه عبارت‌اند از:

𝐰=[1.5−0.52]\mathbf{w}= \begin{bmatrix} 1.5\\ -0.5\\ 2 \end{bmatrix}

بنابراین، مجموع وزن‌دار برابر خواهد بود با:

s=1.5(0.8)−0.5(0.4)+2(0.6)s=1.5(0.8)-0.5(0.4)+2(0.6)

و در نتیجه:

s=2.2\boxed{s=2.2}

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

1.۱۱.۲. پیاده‌سازی و ثبت سهم ویژگی‌ها

برای بررسی دقیق‌تر محاسبه، برنامه‌ای می‌نویسیم که علاوه بر مجموع وزن‌دار، سهم عددی هر ورودی را نیز نمایش دهد.

import numpy as np

features = np.array([0.8, 0.4, 0.6])
weights = np.array([1.5, -0.5, 2.0])

contributions = features * weights
score = contributions.sum()

print("Input:", features)
print("Weights:", weights)
print("Contributions:", contributions)
print("Weighted sum:", score)

خروجی

Input: [0.8 0.4 0.6]
Weights: [ 1.5 -0.5  2. ]
Contributions: [ 1.2 -0.2  1.2]
Weighted sum: 2.2

سهم ورودی نخست برابر ۱٫۲، سهم ورودی دوم برابر ۰٫۲− و سهم ورودی سوم برابر ۱٫۲ است.

این نتیجه یک ویژگی مهم را نشان می‌دهد: دو ورودی با مقادیر و وزن‌های متفاوت ممکن است سهم عددی یکسانی در مجموع داشته باشند.

1.۱۱.۳. آزمایش تغییر مستقل وزن‌ها

اکنون هر وزن را به‌صورت جداگانه ۰٫۵ واحد افزایش می‌دهیم و تغییر خروجی را محاسبه می‌کنیم.

base_score = np.dot(weights, features)

for i in range(len(weights)):
    modified_weights = weights.copy()
    modified_weights[i] += 0.5

    new_score = np.dot(
        modified_weights,
        features
    )

    print(
        f"Weight {i+1}: "
        f"new score={new_score:.2f}, "
        f"change={new_score-base_score:.2f}"
    )

خروجی

Weight 1: new score=2.60, change=0.40
Weight 2: new score=2.40, change=0.20
Weight 3: new score=2.50, change=0.30

هر سه وزن به یک اندازه افزایش یافته‌اند، اما تغییرات مجموع وزن‌دار برابر نیستند.

علت آن است که تغییر مجموع وزن‌دار برای هر وزن به مقدار ورودی متناظر وابسته است. چون ورودی اول برابر ۰٫۸ است، افزایش ۰٫۵ واحدی وزن اول باعث افزایش ۰٫۴ واحدی مجموع می‌شود.

در مقابل، چون ورودی دوم برابر ۰٫۴ است، همان تغییر وزن فقط ۰٫۲ واحد مجموع را افزایش می‌دهد.

نتایج پروژه با معادله ۴.۸ کاملاً سازگارند.

1.۱۱.۴. توسعه پروژه برای چند نمونه

در مرحله بعد می‌خواهیم وزن‌های یکسان را روی چند نمونه مختلف اعمال کنیم.

X = np.array([
    [0.8, 0.4, 0.6],
    [0.2, 0.9, 0.3],
    [0.5, 0.5, 0.5],
    [1.0, 0.0, 0.2]
])

weights = np.array([1.5, -0.5, 2.0])

scores = X @ weights

for i, score in enumerate(scores, start=1):
    print(f"Sample {i}: {score:.2f}")

خروجی:

Sample 1: 2.20
Sample 2: 0.45
Sample 3: 1.50
Sample 4: 1.90

در این برنامه، (X) ماتریسی با چهار سطر و سه ستون است. هر سطر یک نمونه و هر ستون یک ویژگی را نمایش می‌دهد.

بردار وزن دارای سه مؤلفه است. عملیات X @ weights ضرب ماتریسی سازگاری را انجام می‌دهد که نتیجه آن چهار مقدار عددی، یکی برای هر نمونه، خواهد بود.

به زبان ریاضی:

معادله 1.۹ — محاسبه مجموعه‌ای از مجموع‌های وزن‌دار با استفاده از یک بردار وزن ثابت

𝐬=X𝐰\boxed{\mathbf{s}=X\mathbf{w}}

در این معادله، X ∈ ℝ^(n×d) ماتریس داده، 𝐰 ∈ ℝ^d بردار وزن و 𝐬 ∈ ℝ^n بردار خروجی‌های محاسباتی برای n نمونه است.

در قرارداد ریاضی کتاب، این بردارها ستونی‌اند. هنگام پیاده‌سازی با NumPy، حاصل ضرب ماتریس دوبعدی در آرایه وزن یک‌بعدی، آرایه‌ای با شکل (n,) تولید می‌کند.

نتیجه آموزشی پروژه: یک نورون با وزن‌های ثابت می‌تواند برای نمونه‌های مختلف خروجی‌های متفاوتی تولید کند. تفاوت خروجی‌ها از تفاوت ورودی‌ها ناشی می‌شود و به معنای آن نیست که نورون در حال یادگیری است.

1.۱۲. تمرین‌های پایان بخش

تمرین‌های این بخش در سه سطح تنظیم شده‌اند: درک مفهومی، تحلیل ریاضی و پیاده‌سازی محاسباتی. پیشنهاد می‌شود ابتدا محاسبات با دست انجام شوند و سپس نتایج با پایتون بررسی شوند.

تمرین‌های مفهومی

تمرین 1.۱ — تفاوت وزن و ورودی

توضیح دهید چرا دو عدد (xi) و (wi)، با وجود شرکت در یک عملیات ضرب، نقش متفاوتی در ساختار نورون دارند. پاسخ خود را با مثال دو نمونه متفاوت که از وزن‌های یکسان استفاده می‌کنند، توضیح دهید.

تمرین 1.۲ — وزن منفی

آیا وزن منفی همیشه باعث ایجاد سهم عددی منفی می‌شود؟ با استفاده از چهار حالت مختلف علامت وزن و ورودی، پاسخ را بررسی کنید.

تمرین 1.۳ — وزن صفر

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

تمرین 1.۴ — مقایسه اهمیت

دو ویژگی با وزن‌های ۱۰ و ۰٫۱ در اختیار دارید. آیا می‌توان فقط از روی این اعداد تشخیص داد کدام ویژگی اثر بیشتری بر خروجی دارد؟ شرایط لازم برای مقایسه معنادار را بیان کنید.

تمرین‌های محاسباتی

تمرین 1.۵ — مجموع وزن‌دار

بردارهای زیر داده شده‌اند:

𝐱=[3;2;4]،𝐰=[2;1;0.5]𝐱 = [3; 2; 4]، 𝐰 = [2; 1; 0.5]

مجموع وزن‌دار را محاسبه کنید و سهم هر ویژگی را جداگانه مشخص کنید.

تمرین 1.۶ — تغییر یک وزن

در یک نورون با سه ورودی، مقدار ورودی دوم برابر ۶ است. اگر وزن دوم ۰٫۳ واحد کاهش یابد و سایر پارامترها ثابت بمانند، مجموع وزن‌دار چه تغییری خواهد کرد؟

تمرین 1.۷ — تعیین وزن مجهول

فرض کنید:

s=2x1+w2x2s=2x_1+w_2x_2

برای ورودی‌های (x1=3) و (x2=4)، می‌خواهیم مقدار (s) برابر ۱۴ باشد. وزن دوم را به دست آورید و نتیجه را با جای‌گذاری بررسی کنید.

تمرین 1.۸ — تغییر مقیاس

وزن یک ویژگی اندازه‌گیری‌شده برحسب متر برابر ۴ است. اگر همان ویژگی برحسب میلی‌متر نمایش داده شود، وزن جدید باید چه مقداری داشته باشد تا سهم عددی آن تغییر نکند؟

تمرین 1.۹ — هندسه بردار وزن

برای بردار وزن 𝐰 = (۳، ۲)^T، معادله مجموعه نقاطی را بنویسید که مجموع وزن‌دار آن‌ها صفر است. سپس دو نقطه متفاوت روی خط پیدا کنید و با محاسبه ضرب داخلی، صحت پاسخ خود را بررسی کنید.

تمرین 1.۱۰ — تحلیل حساسیت

فرض کنید بردار ورودی 𝐱 = (۲، ۵، ۱)^T باشد. اگر هر سه وزن به‌صورت مستقل و هر بار ۰٫۲ واحد افزایش یابند، تغییر مجموع وزن‌دار در هر حالت چقدر خواهد بود؟

تمرین‌های برنامه‌نویسی

تمرین 1.۱۱ — پیاده‌سازی بدون NumPy

تابعی با نام weighted_sum بنویسید که دو فهرست شامل ورودی‌ها و وزن‌ها دریافت کند و با استفاده از حلقه for مجموع وزن‌دار را محاسبه کند. برنامه باید ناسازگاری تعداد ورودی‌ها و وزن‌ها را تشخیص دهد.

تمرین 1.۱۲ — تحلیل سهم ویژگی‌ها

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

تمرین 1.۱۳ — مقایسه دو مجموعه وزن

یک بردار ورودی پنج‌مؤلفه‌ای و دو بردار وزن متفاوت بسازید. خروجی هر دو مدل را محاسبه کنید و تحلیل کنید کدام وزن‌ها بیشترین نقش را در تفاوت خروجی داشته‌اند.

تمرین 1.۱۴ — تغییر وزن در یک بازه

یکی از وزن‌های یک نورون سه‌ورودی را در بازه منفی پنج تا مثبت پنج تغییر دهید و نمودار مجموع وزن‌دار را رسم کنید. سپس شیب نمودار را با مقدار ورودی متناظر مقایسه کنید.

تمرین 1.۱۵ — محاسبات دسته‌ای

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

تمرین‌های تحلیلی پیشرفته‌تر

تمرین 1.۱۶ — چند وزن با یک خروجی

آیا ممکن است دو بردار وزن متفاوت برای یک بردار ورودی مشخص، مجموع وزن‌دار یکسانی تولید کنند؟ یک مثال عددی ارائه دهید و توضیح دهید چرا این موضوع به معنای یکسان بودن رفتار دو مدل روی تمام ورودی‌ها نیست.

تمرین 1.۱۷ — شرط صفر بودن خروجی

فرض کنید بردار ورودی غیرصفر است. آیا می‌توان بردار وزن غیرصفری پیدا کرد که ضرب داخلی آن با ورودی برابر صفر شود؟ مسئله را ابتدا در فضای دوبعدی بررسی کنید و سپس نتیجه را برای ابعاد بالاتر توضیح دهید.

تمرین 1.۱۸ — تحلیل یک ادعای نادرست

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

1.۱۳. مطالعات موردی با مجموعه‌داده‌های واقعی

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

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

مطالعه موردی  ـ تحلیل نقش وزن‌ها در ویژگی‌های شیمیایی نمونه‌های واقعی

۱. معرفی مسئله

در یک آزمایشگاه شیمی تحلیلی، برای هر نمونه تعدادی ویژگی اندازه‌گیری می‌شود. بعضی از این ویژگی‌ها ممکن است دامنه عددی کوچک و برخی دامنه بزرگ‌تری داشته باشند.

اگر بخواهیم یک امتیاز محاسباتی ساده از ترکیب این ویژگی‌ها بسازیم، باید مشخص کنیم هر ویژگی با چه وزنی در محاسبه شرکت کند.

در این مطالعه از داده‌های واقعی Wine استفاده می‌کنیم. هدف، بررسی تأثیر وزن‌ها بر امتیاز نمونه‌های واقعی است، نه تعیین کیفیت محصول یا تشخیص گروه آن.

۲. معرفی دیتاست و منبع

دیتاست Wine در مخزن UCI شامل ۱۷۸ نمونه و ۱۳ ویژگی شیمیایی است که از سه گروه مختلف گردآوری شده‌اند.

لینک مستقیم دیتاست: Wine – UCI Machine Learning Repository

از میان ۱۳ ویژگی، دو مورد را انتخاب می‌کنیم:

ویژگینام در پایتونکاربرد در مطالعه
مقدار الکلalcoholورودی اول
شدت رنگcolor_intensityورودی دوم

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

۳. مشاهده داده‌های واقعی

مقادیر سه نمونه اول:

نمونهالکلشدت رنگ
۱۱۴٫۲۳۵٫۶۴
۲۱۳٫۲۰۴٫۳۸
۳۱۳٫۱۶۵٫۶۸

به دلیل تفاوت دامنه دو ویژگی، ابتدا آن‌ها را با روش Min-Max به بازه صفر تا یک تبدیل می‌کنیم.

۴. محاسبه مقیاس‌بندی

فرمول:

x′=x−xmin⁡xmax⁡−xmin⁡x’=\frac{x-x_{\min}}{x_{\max}-x_{\min}}

در داده واقعی، کمینه و بیشینه دو ویژگی به این شکل است:

ویژگیکمینهبیشینه
الکل۱۱٫۰۳۱۴٫۸۳
شدت رنگ۱٫۲۸۱۳

برای نمونه اول:

x1′=14.23−11.0314.83−11.03≈0.8421x2′=5.64−1.2813−1.28≈0.3720\begin{aligned} x’_1&=\frac{14.23-11.03}{14.83-11.03}\approx0.8421\\ x’_2&=\frac{5.64-1.28}{13-1.28}\approx0.3720 \end{aligned}

بنابراین

𝐱′(1)=[0.8421,0.3720]T\mathbf{x’}^{(1)}=[0.8421,0.3720]^{T}

۵. انتخاب بردار وزن

برای بررسی اثر وزن مثبت و منفی، وزن‌های زیر را به‌صورت آموزشی انتخاب می‌کنیم:

𝐰=[0.6−0.4]\mathbf{w}= \begin{bmatrix} 0.6\\ -0.4 \end{bmatrix}

مجموع وزن‌دار:

s=0.6x1′−0.4x2′s=0.6x’_1-0.4x’_2

برای نخستین نمونه:

s=0.6(0.8421)−0.4(0.3720)≈0.3565s=0.6(0.8421)-0.4(0.3720)\approx0.3565

جدول سهم عددی ویژگی‌ها:

ویژگیورودی مقیاس‌بندی‌شدهوزنسهم در مجموع
الکل۰٫۸۴۲۱۰٫۶۰٫۵۰۵۳
شدت رنگ۰٫۳۷۲۰۰٫۴-۰٫۱۴۸۸-
مجموع——۰٫۳۵۶۵

توجه داشته باشید که امتیاز مثبت ۰٫۳۵۶۵ به معنای مطلوب بودن نمونه نیست. معنای چنین امتیازی فقط زمانی مشخص می‌شود که هدف و معیار معتبری برای مدل تعریف شده باشد.

۶. کد کامل پایتون

برای اجرا، کتابخانه‌های numpy و scikit-learn لازم‌اند:

pip install numpy scikit-learn matplotlib

import numpy as np
from sklearn.datasets import load_wine

# Load the real dataset
data = load_wine()

feature_names = list(data.feature_names)

selected = [
    feature_names.index("alcohol"),
    feature_names.index("color_intensity")
]

X = data.data[:, selected]

# Min-Max scaling for demonstration
minimum = X.min(axis=0)
maximum = X.max(axis=0)

X_scaled = (X - minimum) / (maximum - minimum)

# Manually selected educational weights
weights = np.array([0.6, -0.4])

contributions = X_scaled * weights
scores = X_scaled @ weights

print("Dataset shape:", X.shape)
print("Minimum:", minimum.tolist())
print("Maximum:", maximum.tolist())

print("First scaled sample:",
      np.round(X_scaled[0], 4).tolist())

print("First contributions:",
      np.round(contributions[0], 4).tolist())

print("First five scores:",
      np.round(scores[:5], 4).tolist())

print("First three labels:",
      data.target[:3].tolist())

۷. خروجی محاسبه‌شده


Dataset shape: (178, 2)
Minimum: [11.03, 1.28]
Maximum: [14.83, 13.0]
First scaled sample: [0.8421, 0.372]
First contributions: [0.5053, -0.1488]
First five scores: [0.3565, 0.2368, 0.1861, 0.3048, 0.2452]
First three labels: [0, 0, 0]

۸. تفسیر خروجی‌ها

نتایج نشان می‌دهند که با وجود ثابت بودن وزن‌ها، امتیاز نمونه‌های مختلف متفاوت است.

این تفاوت به دلیل تفاوت ویژگی‌های ورودی رخ می‌دهد و به معنای یادگیری مدل نیست.

همچنین مشاهده می‌کنیم که سهم ویژگی اول در نمونه اول مثبت و سهم ویژگی دوم منفی است. علت این موضوع آن است که وزن ویژگی دوم منفی انتخاب شده و ورودی مقیاس‌بندی‌شده آن مثبت است.

۹. آزمایش حساسیت نسبت به تغییر وزن

اکنون فقط وزن اول را از ۰٫۶ به ۰٫۷ افزایش می‌دهیم و وزن دوم را ثابت نگه می‌داریم.

طبق رابطه:

Δs=x1Δw1\Delta s=x_1\Delta w_1

برای نمونه اول:

Δs=0.8421(0.1)≈0.0842\Delta s=0.8421(0.1)\approx0.0842

امتیاز جدید:

snew≈0.4407s_{\text{new}}\approx0.4407

کد آزمایش

new_weights = np.array([0.7, -0.4])

new_scores = X_scaled @ new_weights

print("Original:", np.round(scores[:3], 4))
print("Modified:", np.round(new_scores[:3], 4))
print("Changes:", np.round(new_scores[:3] - scores[:3], 4))

خروجی

Original: [0.3565 0.2368 0.1861]
Modified: [0.4407 0.2939 0.2422]
Changes: [0.0842 0.0571 0.0561]

تفسیر آزمایش

وزن اول برای همه نمونه‌ها ۰٫۱ واحد افزایش پیدا کرده است، ولی تغییر امتیازها متفاوت است. دلیل این تفاوت، یکسان نبودن مقدار ویژگی اول در نمونه‌های مختلف است.

این مشاهده تأییدی عددی بر رابطه (Δs=xiΔwi) است.

۱۰. آزمایش حذف یک ویژگی با وزن صفر

برای بررسی وزن صفر، وزن ویژگی دوم را صفر قرار می‌دهیم:

𝐰=[0.6,0]T\mathbf{w}=[0.6,0]^{T}

کد:

zero_weight = np.array([0.6, 0.0])

zero_scores = X_scaled @ zero_weight

print(np.round(zero_scores[:3], 4))

خروجی

[0.5053 0.3426 0.3363]

با صفر کردن وزن دوم، تأثیر مستقیم شدت رنگ از مجموع وزن‌دار حذف می‌شود. اما این کار نشان نمی‌دهد که شدت رنگ در یک مسئله واقعی بی‌اهمیت است.

۱۱. نمودار سهم دو ویژگی در نمونه‌های واقعی

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine

data = load_wine()
X = data.data[:, [0, 9]]

X = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))

weights = np.array([0.6, -0.4])

parts = X[:5] * weights
scores = parts.sum(axis=1)

gold = "#F5B700"
burgundy = "#800020"
ai_blue = "#35B7F3"
silver = "#C0C0C0"
light_gray = "#F5F6F8"
white = "#FFFFFF"

index = np.arange(5)
width = 0.25

fig, ax = plt.subplots(figsize=(10, 5.5))
fig.patch.set_facecolor(white)
ax.set_facecolor(light_gray)

ax.bar(index - width, parts[:, 0], width,
       label="Alcohol contribution", color=gold)

ax.bar(index, parts[:, 1], width,
       label="Color intensity contribution", color=burgundy)

ax.bar(index + width, scores, width,
       label="Weighted sum", color=ai_blue)

ax.axhline(0, color=silver, linewidth=1)
ax.set_xticks(index)
ax.set_xticklabels([f"Sample {i+1}" for i in index])
ax.set_ylabel("Numerical contribution")
ax.set_title("Contributions of two weighted features")
ax.grid(axis="y", alpha=0.25, color=silver)
ax.set_axisbelow(True)
ax.legend()

plt.tight_layout()
plt.savefig("wine_weights.png", dpi=220)
plt.show()

تفسیر نمودار

در نمودار، ستون طلایی سهم مثبت ویژگی اول و ستون زرشکی سهم منفی ویژگی دوم را نشان می‌دهد. ستون آبی روشن نیز مجموع این دو سهم است.

با وجود ثابت بودن وزن‌ها، ارتفاع ستون‌ها برای نمونه‌های مختلف تغییر می‌کند؛ زیرا مقادیر ویژگی‌ها یکسان نیستند.

۱۲. محدودیت‌های مطالعه

وزن‌های ۰٫۶ و ۰٫۴- دستی انتخاب شده‌اند و مبنای آماری یا شیمیایی تأییدشده‌ای برای تفسیر آن‌ها ارائه نشده است. به همین دلیل، امتیاز محاسبه‌شده نباید معیار کیفیت، خلوص یا منشأ محصول در نظر گرفته شود.

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

۱۳. پرسش‌های تحلیلی

  1. اگر وزن ویژگی اول منفی شود، افزایش مقدار الکل چه اثری بر مجموع وزن‌دار خواهد داشت؟
  2. آیا ممکن است دو نمونه دارای مقادیر متفاوت ویژگی‌ها، امتیاز وزن‌دار یکسانی تولید کنند؟
  3. اگر وزن دوم صفر باشد، آیا می‌توان نتیجه گرفت شدت رنگ در مسئله واقعی بی‌اهمیت است؟
  4. چرا تغییر یکسان وزن اول، امتیاز تمام نمونه‌ها را به یک اندازه تغییر نمی‌دهد؟

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

جمع‌بندی نهایی: نقش وزن‌ها در محاسبات نورون مصنوعی

در این بخش آموختیم که وزن‌ها (Weights) از پارامترهای اساسی نورون مصنوعی هستند و تعیین می‌کنند هر ویژگی ورودی چگونه در محاسبه مجموع وزن‌دار مشارکت داشته باشد. با اختصاص وزن‌های متفاوت به ورودی‌ها، می‌توان میزان و جهت اثرگذاری آن‌ها را بر مقدار محاسبه‌شده تنظیم کرد.

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

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

در ادامه، با مفهوم بردار وزن و ضرب داخلی (Dot Product) آشنا شدیم و نشان دادیم که مجموع وزن‌دار را می‌توان به‌صورت فشرده با رابطه زیر نمایش داد:

s=𝐰T𝐱s=\mathbf{w}^{T}\mathbf{x}

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

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

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

در پایان، دریافتیم که در یک نورون مبتنی بر جمع وزن‌دار، اگر تمام ورودی‌ها صفر باشند، مجموع وزن‌دار نیز صفر خواهد بود. این محدودیت، ضرورت معرفی پارامتر دیگری را آشکار می‌کند. به همین دلیل، در بخش بعدی به مفهوم بایاس (Bias) می‌پردازیم و بررسی خواهیم کرد که چگونه این پارامتر می‌تواند انعطاف‌پذیری محاسبات نورون مصنوعی را افزایش دهد.

Sidebar atefi
دکتر محمدرضا عاطفی

عضو هیئت علمی دانشگاه
رئیس هیئت مدیره گروه ناب
هم بنیان گذار شرکت دانش بنیان
مشاور شرکت ها و سازمان های بزرگ کشور

آنچه می خوانید

COVER compressed 24 300x169
هوش مصنوعی

وزن در نورون مصنوعی چیست؟ آموزش مفهوم، انواع و محاسبه با پایتون

1. وزن‌ها: چگونه نورون میزان تأثیر هر ورودی را تعیین می‌کند؟ در بخش قبلی، آموختیم که اطلاعات یک مسئله واقعی چگونه به ویژگی‌های عددی تبدیل می‌شوند و چگونه می‌توان ویژگی‌های یک نمونه را در قالب یک بردار ورودی نمایش داد. همچنین تفاوت میان نمونه، ویژگی و مجموعه داده را بررسی

توضیحات بیشتر »
COVER compressed 23 300x169
هوش مصنوعی

آماده‌سازی داده برای نورون مصنوعی: آموزش ورودی‌های عددی با پایتون

1. از اطلاعات دنیای واقعی تا ورودی‌های عددی نورون مصنوعی در بخش قبلی، منشأ تاریخی نورون مصنوعی را بررسی کردیم و دیدیم چگونه تلاش برای مدل‌سازی برخی جنبه‌های فعالیت عصبی به پیدایش واحدهای محاسباتی ساده منجر شد. همچنین نشان دادیم که با اختصاص وزن‌های متفاوت به ورودی‌ها و افزودن بایاس،

توضیحات بیشتر »
Cover compressed 22 300x169
هوش مصنوعی

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

درآمد فصل: چگونه می‌توان تصمیم‌گیری را به یک محاسبه تبدیل کرد؟ فرض کنید قرار است سامانه‌ای طراحی کنیم که با دریافت اطلاعات یک دانش‌آموز، احتمال نیاز او به حمایت آموزشی بیشتر را بررسی کند. معلم برای چنین تصمیمی معمولاً به یک عامل اکتفا نمی‌کند. نمره‌های قبلی، میزان مشارکت در کلاس،

توضیحات بیشتر »
error: محتوا غیر قابل انتخاب و کپی است.