نرم (Norm) چیست؟ — به زبان ساده

۱۲۷۴۵ بازدید
آخرین به‌روزرسانی: ۱۷ اردیبهشت ۱۴۰۲
زمان مطالعه: ۱۰ دقیقه
نرم (Norm) چیست؟ — به زبان ساده

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

نرم چیست؟

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

  1. نرم‌ها مقادیری نامنفی هستند. اگر نرم‌ها را به عنوان طول در نظر بگیریم، می‌توان به سادگی دید که چرا نمی‌توانند منفی شوند.
  2. نرم‌ها صفر هستند، اگر و فقط اگر بردار صفر باشد.
  3. نرم‌ها از نامساوی مثلثی تبعیت می‌کنند.
  4. نرم یک بردار ضرب در یک اسکالر، برابر با ضرب قدر مطلق این اسکالر در نرم بردار است: $$ | | \mathbf{k\cdot u } || = |\mathbf { k } | \cdot || \mathbf{u} | | $$.

نرم $$ \mathbf { x } $$ را معمولاً با نماد $$ || \mathbf{x} || $$ نشان می‌دهند.

اما نامساوی مثلثی چیست؟ نامساوی مثلثی بیان می‌کند که نرم مجموع چند بردار، کوچک‌تر یا مساوی با مجموع نرم‌های این بردارها است.

$$ \large ||{ \mathbf { u } + \mathbf { v } } || \leq || { \mathbf { u } }|| + || { \mathbf { v } } || $$

مثال ۱

بردارهای $$ \mathbf { u } = \begin {bmatrix} 1 & 6 \end {bmatrix} $$ و $$ \mathbf { v } = \begin {bmatrix} 4 & 2 \end {bmatrix} $$ را در نظر بگیرید.

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

$$ \large || { \mathbf { u } + \mathbf { v } } || = \sqrt { ( 1 + 4 ) ^ 2 + ( 6 + 2 ) ^ 2 } = \sqrt { 8 9 } \approx 9 . 4 3 $$

$$ \large || { \mathbf { u } } || + || { \mathbf { v } } || = \sqrt { 1 ^ 2 + 6 ^ 2 } + \sqrt { 4 ^ 2 + 2^ 2 } = \sqrt { 3 7 } + \sqrt { 2 0 } \approx 1 0 . 5 5 $$

این نتایج را در پایتون نیز بررسی می‌کنیم:

1u = np.array([1, 6])
2u
array([1, 6])
1v = np.array([4, 2])
2v
array([4, 2])
1u+v
array([5, 8])
1np.linalg.norm(u+v)
9.4339811320566032
1np.linalg.norm(u)+np.linalg.norm(v)
10.554898485297798
1u = [0,0,1,6]
2v = [0,0,4,2]
3u_bis = [1,6,v[2],v[3]]
4w = [0,0,5,8]
5plt.quiver([u[0], u_bis[0], w[0]],
6           [u[1], u_bis[1], w[1]],
7           [u[2], u_bis[2], w[2]],
8           [u[3], u_bis[3], w[3]],
9           angles='xy', scale_units='xy', scale=1, color=sns.color_palette())
10# plt.rc('text', usetex=True)
11plt.xlim(-2, 6)
12plt.ylim(-2, 9)
13plt.axvline(x=0, color='grey')
14plt.axhline(y=0, color='grey')
15
16plt.text(-1, 3.5, r'$||\vec{u}||$', color=sns.color_palette()[0], size=20)
17plt.text(2.5, 7.5, r'$||\vec{v}||$', color=sns.color_palette()[1], size=20)
18plt.text(2, 2, r'$||\vec{u}+\vec{v}||$', color=sns.color_palette()[2], size=20)
19
20plt.show()
21plt.close()
نمایش برداری نامساوی مثلثی
نمایش برداری نامساوی مثلثی

محاسبه نرم p

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

  1. قدر مطلق هر درایه را حساب کنید.
  2. مقادیر به دست آمده را به توان $$p$$ برسانید.
  3. همه قدر مطلق‌های به توان $$p$$ رسیده را با هم جمع کنید.
  4. نتیجه نهایی را به توان $$ 1 / p $$ برسانید.

موارد بالا را می‌توان با فرمول زیر بیان کرد:

$$ \large || { \mathbf { x } } || _ p = ( \sum _ i | \mathbf { x } _ i | ^ p ) ^ { 1 / p } $$

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

نرم $$ \Large L ^ 0 $$

اگر هر عددی را به توان $$0$$ برسانیم، حاصل آن برابر با $$ 1 $$ خواهد شد (به جز $$ 0 $$ که حاصل آن برابر با صفر است). بنابراین، حاصل این نرم، متناظر با تعداد عناصر غیرصفر در بردار است. البته این مورد، در واقع یک نرم نیست، زیرا اگر بردار را در $$ \alpha $$ ضرب کنیم، عدد تغییری نخواهد کرد (قانون ۴ بالا).

نرم $$ \Large L ^ 1 $$

اگر $$ p = 1 $$، آنگاه نرم برابر با مجموع قدر مطلق‌ها خواهد بود:

$$ \large || { \mathbf { x } } || _ 1 = \sum _ { i } | \mathbf { x } _ i | $$

نرم اقلیدسی (نرم $$ \Large L ^ 2 $$)

نرم اقلیدسی نرم $$p$$ با $$ p = 2 $$ است که به صورت زیر تعریف می‌شود:

$$ \large || { \mathbf { x } } || _ 2 = ( \sum _ i \mathbf { x } _ i ^ 2 ) ^ { 1 / 2 } \Leftrightarrow \sqrt { \sum _ i \mathbf { x } _ i ^ 2 } $$

مثالی از این نرم را بررسی می‌کنیم.

مثال ۲

از نظر گرافیکی، نرم اقلیدسی متناظر با طول بردار از مبداء به نقطه به دست آمده از تبدیل خطی است (مانند اعمال قضیه فیثاغورس).

$$ \large \mathbf { u } = \begin {bmatrix} 3 \\\\ 4 \end {bmatrix} $$

$$ \large \begin {align*} || { \mathbf { u } } || _ 2 & = \sqrt { | 3 | ^ 2 + | 4 | ^ 2 } \\\\ & = \sqrt { 2 5 } \\\\ & = 5 \end {align*} $$

بنابراین، نرم $$ L ^ 2 $$ برابر با $$ 5 $$ است.

نرم $$ L ^ 2 $$  را می‌توان با تابع "linalg.norm" در نام‌پای (NumPy) پایتون محاسبه کرد. می‌توانیم نتیجه را به صورت زیر بررسی کنیم:

1np.linalg.norm([3, 4])
5.0

کد زیر، نمایش گرافیکی بردارها را ارائه می‌کند:

1u = [0,0,3,4]
2
3plt.quiver([u[0]],
4           [u[1]],
5           [u[2]],
6           [u[3]],
7           angles='xy', scale_units='xy', scale=1)
8
9plt.xlim(-2, 4)
10plt.ylim(-2, 5)
11plt.axvline(x=0, color='grey')
12plt.axhline(y=0, color='grey')
13
14plt.annotate('', xy = (3.2, 0), xytext = (3.2, 4),
15             arrowprops=dict(edgecolor='black', arrowstyle = '<->'))
16plt.annotate('', xy = (0, -0.2), xytext = (3, -0.2),
17             arrowprops=dict(edgecolor='black', arrowstyle = '<->'))
18
19plt.text(1, 2.5, r'$\vec{u}$', size=18)
20plt.text(3.3, 2, r'$\vec{u}_y$', size=18)
21plt.text(1.5, -1, r'$\vec{u}_x$', size=18)
22
23plt.show()
24plt.close()
بردارهای مثال ۲
بردارهای مثال ۲

در این حالت، بردار یک فضای دو بعدی است، اما می‌توان آن را برای ابعاد بزرگ‌تر نیز بیان کرد.

$$ \large u= \begin {bmatrix} u _ 1 \\\\ u _ 2 \\\\ \cdots \\\\ u _ n \end {bmatrix} $$

$$ \large | | u | | _ 2 = \sqrt { u _ 1 ^ 2 + u _ 2 ^ 2 + \cdots + u _ n ^ 2 } $$

نرم اقلیدسی مربعی

نرم اقلیدسی مربعی (Squared Euclidean Norm)، نرم مناسبی است، زیرا ریشه مربع را حذف می‌کند و مجموع ساده‌ای از هر کدام از مقدارهای مربع بردار است.

نرم اقلیدسی مربعی استفاده گسترده‌ای در یادگیری ماشین دارد، زیرا می‌توان آن را با عملگر برداری $$ \mathbf{x} ^ T \mathbf{x}$$ محاسبه کرد.

مثال ۳

محاسبات زیر، مربوط به نرم اقلیدسی مربعی است:

$$ \large \mathbf { x } = \begin {bmatrix} 2 \\\\ 5 \\\\ 3 \\\\ 3 \end {bmatrix} $$

$$ \large \mathbf { x } ^ \text {T} = \begin {bmatrix} 2 & 5 & 3 & 3 \end {bmatrix} $$

$$ \large \begin {align*} \mathbf { x } ^ \text {T} \mathbf { x } & = \begin {bmatrix} 2 & 5 & 3 & 3 \end {bmatrix} \times \begin {bmatrix} 2 \\\\ 5 \\\\ 3 \\\\ 3 \end {bmatrix} \\\\ & = 2 \times 2 + 5 \times 5 + 3 \times 3 + 3\times 3 = 47 \end {align*}$$

1x = np.array([[2], [5], [3], [3]])
2x
array([[2],
[5],
[3],
[3]])
1euclideanNorm = x.T.dot(x)
2euclideanNorm
array([[47]])
1np.linalg.norm(x)**2
47.0

مشتق نرم $$ \Large L ^ 2 $$ مربعی

یک مزیت دیگر نرم $$ L^ 2 $$ مربعی این است که مشتق جزئی آن به سادگی محاسبه می‌شود:

$$ \large u = \begin {bmatrix} u _ 1 \\\\ u _ 2 \\\\ \cdots \\\\ u _ n \end {bmatrix} $$

$$ \large || { u } || _ 2 = u _1 ^ 2 + u _ 2 ^ 2 + \cdots + u _ n ^ 2 $$

$$ \large \begin {cases} \dfrac { d || { u }|| _ 2 } { d u _ 1 } = 2 u _ 1 \\\\ \dfrac { d || { u } || _ 2 } { d u _ 2 } = 2 u _ 2 \\\\ \cdots\\\\ \dfrac { d || { u } || _ 2 } { d u _ n } = 2 u _ n \end {cases} $$

مشتق نرم $$ \Large L ^ 2 $$

در حالتی که نرم $$ L ^ 2 $$ داریم، محاسبه مشتق دشوارتر است:

$$ \large || { u } || _ 2 = \sqrt { ( u _ 1 ^ 2 + u _ 2 ^ 2 + \cdots + u _ n ^ 2 ) } = ( u _ 1 ^ 2 +u _ 2 ^ 2+ \cdots + u _ n ^ 2 )^ { \frac { 1 } { 2 } } $$

$$ \large \begin {align*} \dfrac { d || { u } || _ 2 } { d u _ 1 } & = \dfrac { 1 } { 2 }( u _ 1 ^ 2 + u _ 2 ^ 2 + \cdots + u _ n ^ 2 ) ^ { \frac { 1 } { 2 } - 1 } \cdot \dfrac { d } { d u _ 1 }( u _ 1 ^ 2 + u _ 2 ^ 2 + \cdots + u _n ^ 2 ) \\\\ & = \dfrac { 1 } { 2} ( u _ 1 ^ 2 + u _ 2 ^ 2 + \cdots + u _ n ^ 2 ) ^ { - \frac { 1 } { 2 } } \cdot \dfrac { d } { d u _ 1 }( u _ 1 ^ 2+ u _ 2 ^ 2 + \cdots + u _ n ^ 2 ) \\\\ & = \dfrac { 1 } { 2 } \cdot \dfrac { 1 } { ( u _ 1^ 2 + u _ 2 ^ 2 + \cdots + u _ n ^ 2) ^ { \frac { 1 } { 2 } } } \cdot \dfrac { d } { d u _ 1} ( u _ 1 ^ 2 +u _ 2 ^ 2 + \cdots + u _ n ^ 2 ) \\\\ & = \dfrac { 1 } { 2 } \cdot \dfrac { 1 } { ( u _ 1 ^ 2 + u _ 2 ^ 2 + \cdots + u _ n ^ 2) ^ { \frac { 1 } { 2 } } } \cdot 2 \cdot u _ 1 \\\\ & = \dfrac { u _ 1 } { \sqrt { ( u _ 1 ^ 2 + u _ 2 ^ 2 + \cdots + u _ n ^ 2 ) } } \\\\ \end {align*} $$

$$ \large \begin{cases} \dfrac { d || { u } || _ 2 } { d u _ 1 } = \dfrac { u _ 1 } { \sqrt { ( u _ 1 ^ 2 + u _ 2 ^ 2 + \cdots + u _ n ^ 2 ) } } \\\\ \dfrac { d || { u } || _ 2 } { d u _ 2 } = \dfrac { u _ 2 } { \sqrt { ( u _ 1 ^ 2 + u _ 2 ^ 2 + \cdots + u _ n ^ 2 ) } } \\\\ \cdots\\\\ \dfrac { d || { u } || _ 2 } { d u _ n } = \dfrac { u _ n } { \sqrt { ( u _ 1 ^ 2+ u _2 ^ 2 + \cdots + u _ n ^ 2 ) } } \\\\ \end {cases} $$

یکی از معایب نرم $$ L ^ 2 $$ مربعی این است که به سختی بین صفر و مقادیر کوچک تمایز قائل می‌شود، زیرا افزایش تابع آن کند است.

این مورد را می‌توان به صورت گرافیکی و از طریق مقایسه نرم $$ L ^ 2 $$ مربعی و نرم $$ L ^ 2 $$ مشاهده کرد. محور $$ z $$ متناظر با نرم و محورهای $$ x $$ و $$ y $$ متناظر با دو پارامتر هستند. همین مورد برای بیش از دو بعد نیز صدق می‌کند، اما نمایش بصری آن دشوار است.

شکل زیر نرم $$ L ^ 2 $$ را نشان می‌دهد.

نرم $$ L ^ 2 $$
نرم $$ L ^ 2 $$

نرم $$ L ^ 2 $$ مربعی نیز در شکل زیر نشان داده شده است.

نرم $$ L ^ 2 $$ مربعی
نرم $$ L ^ 2 $$ مربعی

و در نهایت، نرم $$ L ^ 1 $$ در شکل زیر به تصویر کشیده شده است.

نرم $$ L ^ 1 $$
نرم $$ L ^ 1 $$

نرم ماکزیمم

نرم ماکزیمم همان نرم $$ L ^ \infty $$ است و قدر مطلق بزرگ‌ترین درایه بردار را مشخص می‌کند.

$$ \large || { \mathbf { x } } || _ \infty = \max \limits _ i | x _ i | $$

نرم ماتریس: فرم فروبنیوس

معادله نرم $$ L ^ 2 $$ یک ماتریس به صورت زیر است:

$$ \large || { \mathbf { A } } || _ F = \sqrt { \sum _ { i , j } A ^ 2 _ { i , j } } $$

از تابع مشابهی برای بردار در نام‌پای می‌توان برای محاسبه نرم ماتریس استفاده کرد:

1A = np.array([[1, 2], [6, 4], [3, 2]])
2A
array([[1, 2],
[6, 4],
[3, 2]])
1np.linalg.norm(A)
8.3666002653407556

توصیف ضرب نقطه‌ای با نرم‌ها

ضرب نقطه‌ای دو بردار به صورت زیر بیان می‌شود:

$$ \large \mathbf { x } ^ \text {T}\mathbf { y } = \||{ \mathbf { x } } || _ 2 \cdot || { \mathbf { y } } || _ 2 \cos \theta $$

مثال ۴

ضرب نقطه‌ای دو بردار $$ \mathbf { x } = \begin {bmatrix} 0 \\\\ 2 \end {bmatrix} $$ و $$ \mathbf { y } = \begin {bmatrix} 2 \\\\ 2 \end {bmatrix} $$  به صورت زیر است:

1x = [0,0,0,2]
2y = [0,0,2,2]
3
4plt.xlim(-2, 4)
5plt.ylim(-2, 5)
6plt.axvline(x=0, color='grey', zorder=0)
7plt.axhline(y=0, color='grey', zorder=0)
8
9plt.quiver([x[0], y[0]],
10           [x[1], y[1]],
11           [x[2], y[2]],
12           [x[3], y[3]],
13           angles='xy', scale_units='xy', scale=1)
14
15plt.text(-0.5, 1, r'$\vec{x}$', size=18)
16plt.text(1.5, 0.5, r'$\vec{y}$', size=18)
17
18plt.show()
19plt.close()
نرم ضرب نقطه‌ای
توصیف ضرب نقطه‌ای با نرم

در این مثال ساده می‌بینیم که زاویه $$ \theta $$ برابر با $$ 45 ^ \circ $$ است.

$$ \large \mathbf { x ^ \text {T} y } = \begin {bmatrix} 0 & 2 \end {bmatrix} \cdot \begin {bmatrix} 2 \\\\ 2 \end {bmatrix} = 0 \times 2 + 2 \times 2 = 4 $$

و

$$ \large || { \mathbf { x } }|| _ 2 = \sqrt { 0 ^ 2 + 2 ^ 2 } = \mathbf { 4 } = 2 $$

$$ \large || { \mathbf { y } } || _ 2 = \sqrt { 2 ^ 2 + 2 ^ 2} = \sqrt { 8 } $$

$$ \large 2 \times \sqrt { 8 } \times \cos ( 4 5 ^ \circ) = 4 $$

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

1# Note: np.cos take the angle in radian
2np.cos(np.deg2rad(45))*2*np.sqrt(8)
4.0000000000000009

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

^^

بر اساس رای ۶۴ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
GitHub
۱۵ دیدگاه برای «نرم (Norm) چیست؟ — به زبان ساده»

یک مثال بزنید که نرم ماتریسی نباشد ولی نرم برداری باشد
لطف کنید جواب بدین

با سلام تشکر از سایت خوبتون
نرم ۲ ماتریس مثلثی چطور محاسبه می شود؟

سلام. ببخشید فرق ||x|| ای که در سمت راستش یک دو بالا و یک دو پایین دارد با ||x|| ای تنها یک دو پایین دارد چیست؟

سلام پردیس گرامی.
مورد اول همان نرم ۲ است که به توان ۲ رسیده است.
موفق باشید.

آیا نرم هایی وجود دارد که خاصیت زیر ضربی و سازگاری رو نداشته باشند؟

سلام درچه صورت نرم های ماتریسی خاصیت زیرضربی وسازگاری رو ندارند مثال میشه بزنید ممنون میشم

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

بسیار عالی واقعا لذت بردم

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

عالی واقعا سپاس

آیا نرم هایی وجود دارد که خاصیت زیر ضربی و سازگاری رو نداشته باشند؟

سلام
هم از بنیانگذاران سایت و هم از اساتیدی که وقت گذاشتن خیلی تشکر می کنم.
خدا خیرتون بده

ممنون از لطف شما و وقتی که گذاشتید خدا به علم تون برکت بده و به وجودتون سلامتی و نشاط

سلام
فقط میتونم بگم این سایت محشره‌??
واقعا ممنون بابت تلاش تون‌…???

چرا به ازای یک دوم،نامساوی مثلث برقرار نیست؟؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *