هنگام مطالعهی مقالات پیشرفتهی یادگیری عمیق، پردازش صدا و پردازش زبان طبیعی، خیلی زود به نمادهای اعداد مختلط و توابع سینوسی و کسینوسی با فرکانسهای گوناگون برمیخورید. اغلب مهندسان، اعداد مختلط را صرفاً مبحثی دانشگاهی و انتزاعی در نظر میگیرند؛ اما واقعیت این است که در معماریهای مدرن نظیر ترنسفورمرها و کدگذاریهای مکانی چرخشی (RoPE)، محاسبات مختلط طبیعیترین ابزار برای مدلسازی چرخش و فاز هستند.
درک سازوکار داخلی تبدیلهای فوریه (مانند DFT و FFT) و همچنین نحوهی عملکرد لایههای اتنشن در مدلهای زبانی امروزی، بدون تسلط بر جبر مختلط و هندسهی فرمول اویلر عملاً ناممکن است. این درس پایههای نظری اعداد مختلط را به تصویر و هندسه متصل میکند تا درک کنید چرا ضرب در واحد موهومی معادل با یک چرخش 90 درجه است و چطور این مفهوم ساده ستون فقرات مدلهای مدرن را تشکیل میدهد.
تمام کدهای این درس با پایتون خالص و محاسبات پایه پیادهسازی میشوند؛ بنابراین اجرای آنها کاملاً سبک بوده و به هیچگونه کارت گرافیک یا ابزار ابری وابسته نیست و روی CPU کامپیوتر شخصیتان بدون مشکل اجرا میشود.
ریشهی دوم 1- موهومی نیست؛ بلکه کلید چرخشها، فرکانسها و نیمی از پردازش سیگنال است.
اهداف یادگیری
- انجام محاسبات اعداد مختلط (جمع، ضرب، تقسیم و مزدوجگیری) در هر دو شکل دکارتی و قطبی
- بهکارگیری فرمول اویلر (Euler's formula) برای تبدیل توابع نمایی مختلط و توابع مثلثاتی به یکدیگر
- پیادهسازی تبدیل فوریهی گسسته (Discrete Fourier Transform یا DFT) با استفاده از ریشههای مختلط واحد
- توضیح اینکه چگونه چرخشهای مختلط، زیربنای RoPE و کدگذاریهای مکانی سینوسی در ترنسفورمرها را میسازند
صورت مسئله
مقالهای دربارهی تبدیلهای فوریه باز میکنید و همهجا i میبینید. به کدگذاریهای مکانی ترنسفورمر نگاه میاندازید و sin و cos را در فرکانسهای مختلف مشاهده میکنید؛ یعنی همان بخشهای حقیقی و موهومی توابع نمایی مختلط. دربارهی محاسبات کوانتومی مطالعه میکنید و میبینید همهچیز در فضاهای برداری مختلط بیان شده است.
اعداد مختلط در نگاه اول انتزاعی به نظر میرسند. دستگاه اعدادی که بر پایهی ریشهی دوم 1- بنا شده باشد، بیشتر شبیه یک ترفند ریاضی است؛ اما اصلاً ترفند نیست، بلکه زبان طبیعی چرخشها و نوسانهاست. هر زمان چیزی بچرخد، بلرزد یا نوسان کند، اعداد مختلط ابزار دقیق آن کار هستند.
بدون درک اعداد مختلط، تبدیل فوریهی گسسته (DFT) را نمیفهمید؛ تبدیل سریع فوریه (Fast Fourier Transform یا FFT) را متوجه نمیشوید؛ سازوکار RoPE (امبدینگ مکانی چرخشی یا Rotary Position Embedding) در مدلهای زبانی امروزی برایتان مبهم میماند؛ و سر در نمیآورید که چرا کدگذاریهای مکانی سینوسی در مقالهی اصلی ترنسفورمر از چنین فرکانسهایی استفاده میکنند.
در این درس، محاسبات مختلط را از پایه میسازیم، آن را به هندسه پیوند میزنیم و دقیقاً نشان میدهیم اعداد مختلط در کجای یادگیری ماشین حضور دارند.
مفاهیم پایه
عدد مختلط چیست؟
یک عدد مختلط از دو بخش تشکیل شده است: بخش حقیقی و بخش موهومی.
z = a + bi
where:
a is the real part
b is the imaginary part
i is the imaginary unit, defined by i^2 = -1
همین و بس. شما محور اعداد را تا یک صفحه گسترش میدهید. اعداد حقیقی روی یک محور مینشینند و اعداد موهومی روی محور دیگر. هر عدد مختلط، نقطهای در این صفحه است.
محاسبات اعداد مختلط
جمع. بخشهای حقیقی را با هم و بخشهای موهومی را با هم جمع کنید.
ضرب. از خاصیت توزیعپذیری استفاده کنید و یادتان باشد که .
مزدوج. علامت بخش موهومی را برعکس کنید.
حاصلضرب یک عدد مختلط در مزدوجش همیشه عددی حقیقی است:
تقسیم. صورت و مخرج را در مزدوج مخرج ضرب کنید.
این کار بخش موهومی را از مخرج حذف میکند و یک عدد مختلط شستهرفته تحویلتان میدهد.
صفحهی مختلط
صفحهی مختلط هر عدد مختلط را به یک نقطهی دوبعدی نگاشت میکند. محور افقی، محور حقیقی و محور عمودی، محور موهومی است.
z = 3 + 2i corresponds to the point (3, 2)
z = -1 + 0i corresponds to the point (-1, 0) on the real axis
z = 0 + 4i corresponds to the point (0, 4) on the imaginary axis
یک عدد مختلط همزمان هم یک نقطه است و هم یک بردار که از مبدأ شروع میشود. همین نگاه دوگانه است که اعداد مختلط را در هندسه اینقدر کاربردی میکند.
فرم قطبی
هر نقطه در صفحه را میتوان با فاصلهاش از مبدأ و زاویهاش با محور مثبت حقیقی توصیف کرد.
فرم دکارتی برای جمع مناسب است؛ فرم قطبی برای ضرب عالی است.
ضرب در فرم قطبی. اندازهها را در هم ضرب کنید و زاویهها را با هم جمع کنید.
به همین دلیل اعداد مختلط برای چرخشها فوقالعادهاند. ضرب در یک عدد مختلط با اندازهی 1، یک چرخش خالص است.
فرمول اویلر
پل ارتباطی میان توابع نمایی مختلط و مثلثات:
این مهمترین رابطهی این درس است. وقتی باشد:
پنج ثابت بنیادین ریاضی (، ، ، 1 و 0) در یک معادله به هم گره میخورند.
چرا فرمول اویلر برای یادگیری ماشین مهم است؟
فرمول اویلر میگوید با تغییر ، عبارت دایرهی واحد را رسم میکند. در ، در نقطهی هستید. در ، به میرسید. در ، در نقطهی قرار دارید. در ، به بازمیگردید. یک دور چرخش کامل برابر با است.
این یعنی توابع نمایی مختلط، خودِ چرخش هستند؛ و چرخشها همهجای پردازش سیگنال و یادگیری ماشین حضور دارند.
ارتباط با چرخشهای دوبعدی
ضرب عدد مختلط در ، نقطهی را به اندازهی زاویهی حول مبدأ میچرخاند.
هر دو روش نتیجهی یکسانی تولید میکنند. ضرب مختلط دقیقاً همان چرخش دوبعدی است. ماتریس دوران، چیزی جز همان ضرب مختلط با نمادگذاری ماتریسی نیست.
فازورها و سیگنالهای چرخشی
یک تابع نمایی مختلط نقطهای است که با بسامد زاویهای روی دایرهی واحد میچرخد. با افزایش ، این نقطه مسیر دایره را طی میکند.
بخش حقیقی این نقطهی در حال چرخش است و بخش موهومی آن . یک سیگنال سینوسی، سایهی یک عدد مختلطِ در حال چرخش است.
این همان نمایش فازور (phasor) است. بهجای دنبال کردن یک موج سینوسی با نوسانات پیدرپی، یک فلش چرخان و نرم را دنبال میکنید. تغییرات فاز به جابهجایی زاویه، تغییرات دامنه به تغییرات اندازه، و جمع سیگنالها به جمع برداری تبدیل میشوند.
ریشههای واحد
ریشههای ام واحد، نقطه با فاصلههای یکسان روی دایرهی واحد هستند:
برای ، ریشهها عبارتند از: (چهار جهت اصلی قطبنما). برای ، چهار جهت اصلی بههمراه چهار جهت قطری را به دست میآورید.
ریشههای واحد، سنگ بنای تبدیل فوریهی گسسته هستند. تبدیل DFT یک سیگنال را به مؤلفههایی در همین فرکانس با فواصل مساوی تجزیه میکند.
ارتباط با DFT
تبدیل فوریهی گسستهی یک سیگنال به این صورت تعریف میشود:
هر اندازه میگیرد که سیگنال تا چه حد با ریشهی ام واحد همبستگی دارد؛ یعنی با یک موج سینوسی مختلط در فرکانس . تبدیل DFT یک سیگنال را به فازور چرخان میشکند و دامنه و فاز هرکدام را به شما میدهد.
چرا i موهومی نیست؟
واژهی «موهومی» (imaginary) یک خطای تاریخی است. دکارت با لحنی تحقیرآمیز آن را به کار برد. اما اصلاً موهومیتر از اعداد منفی در زمان مقاومت اولیه در برابر آنها نیست. اعداد منفی پاسخ به این پرسش بودند که «اگر 5 را از 3 کم کنیم به چه میرسیم؟»؛ واحد موهومی هم پاسخی است به اینکه «چه عددی را به توان 2 برسانیم تا 1- شود؟»
اگر کاربردیتر نگاه کنیم: یک عملگر چرخش 90 درجه است. اگر یک عدد حقیقی را یک بار در ضرب کنید، 90 درجه میچرخد و به محور موهومی میرسد. اگر دوباره آن را در ضرب کنید ()، 90 درجهی دیگر میچرخد؛ حالا رو به سمت منفی محور حقیقی ایستادهاید. به همین دلیل است که . هیچ رمزورازی در کار نیست؛ فقط یک نیمدور است که از دو چرخش ربعدایرهای ساخته شده.
علت کاربرد فراگیر اعداد مختلط در مهندسی همین است. هر پدیدهای که بچرخد — امواج الکترومغناطیسی، حالتهای کوانتومی، نوسانات سیگنال یا کدگذاریهای مکانی — بهطبیعیترین شکل با اعداد مختلط توصیف میشود.
مقایسهی توابع نمایی مختلط و توابع مثلثاتی
پیش از فرمول اویلر، مهندسان سیگنالها را بهصورت مینوشتند: دامنهی ، فرکانس و فاز . این روش کار میکرد اما محاسبات را طاقتفرسا میساخت؛ چرا که جمع دو موج کسینوسی با فازهای متفاوت به اتحادهای مثلثاتی نیاز داشت.
با توابع نمایی مختلط، همان سیگنال بهشکل درمیآید. جمع دو سیگنال صرفاً جمع دو عدد مختلط است. ضرب (مدولاسیون) هم فقط ضرب اندازهها و جمع زاویههاست. تغییر فاز به جمع زاویه و جابهجایی فرکانسی به ضرب در فازورها تبدیل میشود.
کل حوزهی پردازش سیگنال به نمادگذاری نمایی مختلط روی آورد، چون ریاضیاتش بسیار سرراستتر است. «سیگنال واقعی» همیشه همان بخش حقیقیِ نمایش مختلط است. بخش موهومی هم مثل ثبت دفتری در محاسبات همراه آن کشیده میشود تا تمام عملیات جبری روان و طبیعی پیش بروند.
ارتباط با ترنسفورمرها
کدگذاریهای مکانی سینوسی (مقالهی اصلی ترنسفورمر):
جفتهای sin و cos، بخشهای حقیقی و موهومی نماییهای مختلط در فرکانسهای گوناگون هستند. هر فرکانس، تفکیکپذیری یا «وضوح» (resolution) متفاوتی برای کدگذاری موقعیت فراهم میکند. فرکانسهای پایین بهکندی تغییر میکنند (موقعیت کلی یا coarse) و فرکانسهای بالا بهسرعت جابهجا میشوند (موقعیت دقیق یا fine). اینها در کنار هم به هر موقعیت، یک ردپای فرکانسیِ یکتا میبخشند.
امبدینگ RoPE (Rotary Position Embedding) پا را از این هم فراتر میگذارد. این روش بردارهای query و key را صراحتاً در ماتریسهای دوران مختلط ضرب میکند. فاصلهی نسبیِ میان دو توکن به یک زاویهی چرخش تبدیل میشود. اتنشن بر اساس این بردارهای چرخاندهشده محاسبه میشود و به لطف ضرب مختلط، مدل نسبت به موقعیت نسبی حساسیت پیدا میکند.
| عملیات | فرم جبری | مفهوم هندسی |
|---|---|---|
| جمع | جمع برداری در صفحه | |
| ضرب | چرخش و مقیاسبندی | |
| مزدوج | بازتاب نسبت به محور حقیقی | |
| اندازه | فاصله از مبدأ | |
| فاز | زاویه نسبت به محور مثبت حقیقی | |
| تقسیم | ضرب در مزدوج | چرخش معکوس و تغییر مقیاس |
| توان | بار چرخش، تغییر مقیاس با ضریب |
پیادهسازی گامبهگام
گام 1: کلاس Complex
یک کلاس عدد مختلط (Complex) بسازید که از اعمال جبری، اندازه، فاز و تبدیل بین فرمهای دکارتی و قطبی پشتیبانی کند.
import math
class Complex:
def __init__(self, real, imag=0.0):
self.real = real
self.imag = imag
def __add__(self, other):
return Complex(self.real + other.real, self.imag + other.imag)
def __mul__(self, other):
r = self.real * other.real - self.imag * other.imag
i = self.real * other.imag + self.imag * other.real
return Complex(r, i)
def __truediv__(self, other):
denom = other.real ** 2 + other.imag ** 2
r = (self.real * other.real + self.imag * other.imag) / denom
i = (self.imag * other.real - self.real * other.imag) / denom
return Complex(r, i)
def magnitude(self):
return math.sqrt(self.real ** 2 + self.imag ** 2)
def phase(self):
return math.atan2(self.imag, self.real)
def conjugate(self):
return Complex(self.real, -self.imag)
گام 2: تبدیل قطبی و فرمول اویلر
def to_polar(z):
return z.magnitude(), z.phase()
def from_polar(r, theta):
return Complex(r * math.cos(theta), r * math.sin(theta))
def euler(theta):
return Complex(math.cos(theta), math.sin(theta))
بررسی صحت: خروجی euler(theta).magnitude() همیشه باید 1.0 باشد. خروجی euler(0) باید (1, 0) و خروجی euler(pi) باید (-1, 0) شود.
گام 3: چرخش
چرخاندن نقطهی با زاویهی تنها با یک ضرب مختلط انجام میشود:
point = Complex(3, 4)
rotated = point * euler(math.pi / 4)
اندازه تغییری نمیکند؛ تنها چیزی که عوض میشود زاویه است.
گام 4: پیادهسازی DFT با محاسبات مختلط
def dft(signal):
N = len(signal)
result = []
for k in range(N):
total = Complex(0, 0)
for n in range(N):
angle = -2 * math.pi * k * n / N
total = total + Complex(signal[n], 0) * euler(angle)
result.append(total)
return result
این همان DFT با مرتبهی است. هر خروجی ، حاصل جمع نمونههای سیگنال است که در ریشههای واحد ضرب شدهاند.
گام 5: تبدیل DFT معکوس
تبدیل DFT معکوس، سیگنال اصلی را از روی طیف آن بازسازی میکند. تنها تفاوتهای آن با DFT مستقیم این است: علامت نما قرینه میشود و خروجی بر تقسیم میگردد.
def idft(spectrum):
N = len(spectrum)
result = []
for n in range(N):
total = Complex(0, 0)
for k in range(N):
angle = 2 * math.pi * k * n / N
total = total + spectrum[k] * euler(angle)
result.append(Complex(total.real / N, total.imag / N))
return result
این کار یک بازسازی بینقص انجام میدهد. تبدیل DFT و سپس IDFT را اجرا کنید تا سیگنال اصلی تا دقت محاسبات ماشین بازیابی شود. هیچ اطلاعاتی از دست نمیرود.
گام 6: ریشههای واحد
def roots_of_unity(N):
return [euler(2 * math.pi * k / N) for k in range(N)]
این دو ویژگی را بیازمایید:
- اندازهی هر ریشه دقیقاً برابر با 1 است.
- مجموع تمام ریشه برابر با صفر است (به دلیل تقارن یکدیگر را خنثی میکنند).
همین ویژگیها هستند که DFT را بازگشتپذیر میکنند. ریشههای واحد یک پایهی متعامد برای دامنهی فرکانس میسازند.
استفادهی عملی
زبان Python بهطور درونساخته از اعداد مختلط پشتیبانی میکند. حرف j نشاندهندهی واحد موهومی است.
z = 3 + 2j
w = 1 + 4j
print(z + w)
print(z * w)
print(abs(z))
import cmath
print(cmath.phase(z))
print(cmath.exp(1j * cmath.pi))
در کار با آرایهها، کتابخانهی numpy اعداد مختلط را مستقیماً مدیریت میکند:
import numpy as np
z = np.array([1+2j, 3+4j, 5+6j])
print(np.abs(z))
print(np.angle(z))
print(np.conj(z))
print(np.real(z))
print(np.imag(z))
signal = np.sin(2 * np.pi * 5 * np.linspace(0, 1, 128))
spectrum = np.fft.fft(signal)
freqs = np.fft.fftfreq(128, d=1/128)
خروجی
فایل code/complex_numbers.py را اجرا کنید تا سند outputs/skill-complex-arithmetic.md ساخته شود.
تمرینها
-
محاسبات دستی با اعداد مختلط. مقدار را دستی حساب کنید و با کد تطبیق دهید. سپس مقدار را به دست آورید. هر دو نتیجه را در صفحهی مختلط رسم کنید و ببینید که عمل ضرب چطور عدد اول را چرخانده و مقیاس آن را تغییر داده است.
-
دنبالهی چرخش. از نقطهی شروع کنید. 12 بار آن را در ضرب کنید. مطمئن شوید که پس از 12 بار ضرب، دوباره به بازمیگردید. مختصات را در هر مرحله چاپ کنید و ببینید که چطور یک 12ضلعی منتظم رسم میشود.
-
تبدیل DFT یک سیگنال مشخص. سیگنالی بسازید که حاصلجمع و با نمونهبرداری در 32 نقطه باشد. تابع DFT خود را روی آن اجرا کنید. بررسی کنید که در طیف اندازه، قلههایی در فرکانسهای 3 و 7 شکل بگیرد و ارتفاع قله در فرکانس 7 نصف ارتفاع قله در فرکانس 3 باشد.
-
مصورسازی ریشههای واحد. ریشههای هشتم واحد را محاسبه کنید. بررسی کنید که مجموع آنها برابر با صفر شود. همچنین بررسی کنید که با ضرب هر ریشه در ریشهی اولیه ، ریشهی بعدی حاصل شود.
-
همارزی ماتریس دوران. به ازای 10 زاویهی تصادفی و 10 نقطهی تصادفی، بررسی کنید که ضرب مختلط نتیجهای کاملاً یکسان با ضرب ماتریس در بردار (با ماتریس دوران 2x2) تولید میکند. بیشترین اختلاف عددی را چاپ کنید.
راهنماییها
تمرین 1. ضرب را با شرط بسط دهید؛ سپس برای تقسیم، صورت و مخرج را در مزدوجِ مخرج ضرب کنید. حاصلضرب را با Complex(2, 3) * Complex(4, -1) بیازمایید: مقدار magnitude() آن باید با حاصلضرب دو اندازه، و phase() آن با مجموع دو فاز برابر باشد.
تمرین 2. گام چرخش را با euler(math.pi / 6) بسازید و 12 بار ضرب را تکرار کنید. در هر مرحله مطمئن شوید که اندازه برابر با 1 باقی میماند و زاویه 30 درجه زیاد میشود. نقطهی نهایی باید حداکثر به اندازهی 1e-12 با (1, 0) فاصله داشته باشد.
تمرین 3. نقاط زمانی را با تولید کرده و dft را فراخوانی کنید. فقط بازههای 0 تا 15 را تحلیل کنید، چون نیمهی بالایی آینهی نیمهی اول است. اندازهی طیف در بازهی برای یک موج سینوسی با دامنهی برابر با است؛ بنابراین انتظار مقداری نزدیک به 16 در بازهی 3 و نزدیک به 8 در بازهی 7 داشته باشید.
تمرین 4. تابع roots_of_unity(8) را فراخوانی کرده و ریشهها را با هم جمع کنید: اندازهی این مجموع باید بسیار نزدیک به 0 باشد. هر ریشه را بر ریشهی قبلی تقسیم کنید و بررسی کنید که مقدار همهی آنها برابر با euler(2 * math.pi / 8) باشد.
تمرین 5. ماتریس دوران بهصورت [[cos t, -sin t], [sin t, cos t]] است. برای هر زاویه و نقطه، حاصل euler(t) * Complex(x, y) و حاصلضرب ماتریسی را حساب کنید؛ سپس بیشترین اختلاف قدرمطلق را یادداشت کنید. باید به عددی نزدیک به برسید.
اصطلاحات کلیدی
| اصطلاح | مفهوم |
|---|---|
| عدد مختلط (Complex number) | عددی بهشکل که در آن بخش حقیقی، بخش موهومی و است |
| واحد موهومی (Imaginary unit) | عدد که با رابطهی تعریف میشود. از دیدگاه ریاضی یک موجودیت ناممکن نیست، بلکه یک عملگر چرخش است |
| صفحهی مختلط (Complex plane) | صفحهای دوبعدی که در آن محور x حقیقی و محور y موهومی است؛ به آن صفحهی آرگاند (Argand plane) هم میگویند |
| اندازه / قدر مطلق (Magnitude / modulus) | فاصله از مبدأ مختصات: . بهصورت نوشته میشود |
| فاز / آرگومان (Phase / argument) | زاویه نسبت به محور مثبت حقیقی: . بهصورت نوشته میشود |
| مزدوج (Conjugate) | تصویر آینهای نسبت به محور حقیقی: مزدوج برابر با است |
| فرم قطبی (Polar form) | نمایش بهصورت بهجای که محاسبات ضرب را ساده میکند |
| فرمول اویلر (Euler's formula) | رابطهی که توابع نمایی را به مثلثات پیوند میزند |
| فازور (Phasor) | یک عدد مختلط در حال چرخش که سیگنالی سینوسی را نمایش میدهد |
| ریشههای واحد (Roots of unity) | تعداد عدد مختلط بهشکل بهازای تا ؛ یعنی نقطهی متساویالفاصله روی دایرهی واحد |
| DFT | تبدیل فوریهی گسسته (Discrete Fourier Transform)؛ سیگنال را با استفاده از ریشههای واحد به مؤلفههای سینوسی مختلط تجزیه میکند |
| RoPE | امبدینگ مکانی چرخشی (Rotary Position Embedding)؛ استفاده از ضرب مختلط برای کدگذاری موقعیت نسبی در مکانیزم اتنشن ترنسفورمر |
برای مطالعهی بیشتر
- آشنایی تصویری با فرمول اویلر - درک شهودی هندسه بدون درگیر شدن با نمادگذاریهای پیچیده
- مقالهی سو و همکاران: RoFormer (2021) - مقالهای که امبدینگ مکانی چرخشی (RoPE) را بر پایهی چرخشهای مختلط معرفی کرد
- مقالهی واسوانی و همکاران: Attention Is All You Need (2017) - مقالهی بنیادین ترنسفورمر با معرفی کدگذاریهای مکانی سینوسی
- کانال 3Blue1Brown: فرمول اویلر با مقدمهای بر نظریه گروهها - تبیین شهودی اینکه چرا برقرار است
- نیدهم: Visual Complex Analysis - برترین اثر در ارائهی شهود تصویری و هندسی از دنیای اعداد مختلط
- استرنگ: Introduction to Linear Algebra، فصل 10 - بررسی اعداد مختلط در چارچوب جبر خطی و مقادیر ویژه
