MatlabTips
895 subscribers
461 photos
72 videos
54 files
299 links
آموزش MATLAB با "استفاده از ویدئو و متن" در سطوح مبتدی تا پیشرفته
پاسخ به سوالات تخصصی:
@roholazandie
Download Telegram
🔵چند نکته در مورد خواندن مقالات هوش مصنوعی قسمت اول: اسکالر، بردار، ماتریس و تانسور🔵

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

۱- پیش از هر چیزی باید توجه کنید که ریاضیات هوش مصنوعی اساسا ریاضیاتی بر اساس حساب برداری و تانسور است. توجه نکردن به این موضوع باعث می شود تمام فرمول ها غیر قابل فهم بنظر برسند. برای همین هر گاه یک فرمول می بینید اولین چیزی که باید از خود بپرسید این است که هر متغیر در اینجا چیست؟ (به زبان برنامه نویسی تایپ آن چیست). این تایپ می تواند اسکالر (عدد های عادی که تقریبا تمام ریاضیات دبیرستان است)، بردار، ماتریس یا تانسور باشد. این موضوع بسیار مهم است به همین خاطر هر فرمولی که می نویسید باید سایز آن را زیرش (به صورت اندیس) بنویسید و مطمئن شوید که سایز هر متغیر با بقیه هماهنگی دارد.
بیایید به یک مثال توجه کنیم: یکی از مهمترین عملیات در هوش مصنوعی جدید بخصوص در مدل های زبانی عملگر attention است. فرمول آن به صورت زیر است
این تابعی از سه متغیر است: Q یا کوئری (Query) K یا کلید (Key) و V یا مقدار (value). طرف دیگر معادله یک d_k را داریم که اندازه ی بعد کلید است. اما بیایید دقیق تر شویم. در اینجا Q یک ماتریس است که اندازه ی آن nxd_k است. که در آن n طول ورودی (تعداد توکن ها یه کلمه ها)اندازه ی ماتریس K برابر nxd_k و در نهایت اندازه V برابر است با n x d_v که در آن d_v اندازه تعداد کلمات دیکشنری است. در نهایت d_k یک اسکالر است که در اینجا رادیکال آن حساب شده است. حالا وقت آن است که این اندازه ها را بر روی فرمول بگذاریم و ببینیم که آیا اندازه ها با هم همخوانی دارند یا نه:
اگر از داخل تابع سافتمکس شروع کنیم متوجه می شویم که چون اول ترانهاده ی ماتریس K را حساب میکنیم تعداد ستون های Q و تعداد سطر های K با هم هماهنگی دارند. بنابراین نتیجه یک ماتریس nxn است. حالا اگر این ماتریس را بر جذر d_k تقیسم کنیم (تقسیم کردن بر روی هر کدام از درایه های ماتریس) و در نهایت تابع سافتمکس را بر روی هر داریه اعمال کنیم نتیجه همچنان یک ماتریس nxn باقی می ماند. به این ترتیب می بینیم که مشکلی در ضرب در V هم وجود ندارد چون باز هم تعداد ستون های نتیجه n و سطر های V با هم هماهنگ هستند. بنابراین کل نتیجه ی سمت راست معادله بالا می شود n x d_v

با این حال وقتی کد مربوط به حساب کردن attention را می بینید موضوع کمی پیچیده تر می شود. در عمل ما به جای کار کردن با فقط یک ورودی با یک batch کار میکنیم. دلیل این کار این است که با استفاده ازین روش می توانیم از محاسبات تانسوری که بر روی کارت های گرافیک مدرن تعبیه شده اند بهره ببریم. در عمل منطق کار هیچ تفاوتی نمی کند به جز اینکه به جای یک ماتریس شما B ماتریس را بر روی هم قرار می دهید و سپس ضرب ها را انجام می دهید. بنابراین سایز ها به صورت زیر می شوند
در اینجا باید به چند نکته دقت کنیم. اول اینکه وقتی بحث از تانسور می شود شما عملا با ماتریس های با بعد بالاتر کار میکنید (در بیشتر کاربردهای هوش مصنوعی معمولا این بعد ها بیشتر از ۴ نمی شوند). در ریاضیات و به‌ویژه در برنامه‌نویسی برای یادگیری ماشین (مانند PyTorch یا TensorFlow)، تانسور (tensor) ساختاری کلی‌تر از ماتریس است:

عدد (scalar): تانسور مرتبه ۰ (rank-0)

بردار (vector): تانسور مرتبه ۱ (rank-1)

ماتریس (matrix): تانسور مرتبه ۲ (rank-2)

تانسور مرتبه ۳ یا بیشتر: آرایه‌هایی با ابعاد بیشتر، مانند (batch,time,height,width)

به عنوان مثال:
‍‍‍‍‍‍x = torch.randn(32, 64, 128)  # یک تانسور 3-بعدی (rank-3) با شکل (batch_size, sequence_length, embedding_dim)
اما وقتی با تانسورهایی با بیش از دو بعد کار می‌کنیم، دیگر "سطر" و "ستون" معنا ندارد چون ابعاد بیشتر شده‌اند. مثلاً در یک تانسور با شکل (B,T,D) نمی‌توان به‌سادگی گفت کدام "سطر" است و کدام "ستون" — بنابراین به‌جای transpose، از تابعی به‌نام permute یا transpose(dim1, dim2) استفاده می‌شود.

x = torch.randn(32, 64, 128)  # shape: (B, T, D)
x_t = x.transpose(1, 2) # shape: (B, D, T)


ترتیب‌دهی مجدد کامل ابعاد تانسور:
x = torch.randn(32, 64, 128)
x_perm = x.permute(2, 0, 1) # shape: (128, 32, 64)


در attention ما معمولاً کاری مثل این انجام می‌دهیم:
Q @ K.transpose(-2, -1)


اگر دقت کنید ما فقط نیاز داریم که دو محور آخر را جابجا کنیم (با محور اول که برای batch ست کاری نداریم). حتما کد های بالا را اجرا کنید تا متوجه تفاوت بشوید
یکی از کارهایی که می توانید انجام دهید تا تصویر بهتری داشته باشید این است که عملا شکل تانسور ها را بکشید! یک نمونه از معماری ترنسفورمر را در این شکل میبنید. اما حتما شکل بکشید تا تصویر شخصی از آن پیدا کنید
طول خط ساحلی بریتانیا به خط کشی که استفاده می کنید بستگی دارد!!
🔵بعد بریتانیا چقدر است؟🔵

لوئیس فرای ریچاردسون (Lewis Fry Richardson) در نیمه ی قرن بیستم به مطالعه ی طول خط ساحلی کشور ها مشغول شد. او در حال بررسی این بود که آیا می‌توان احتمال درگیری بین کشورها را بر اساس طول مرز مشترکشان پیش‌بینی کرد یا نه. اما در این مسیر متوجه پدیده‌ای عجیب شد: منابع مختلف، طول بسیار متفاوتی برای یک مرز یا خط ساحلی یکسان گزارش می‌کردند. به‌ویژه برای کشورهایی مانند بریتانیا.

مثلاً یک منبع می‌گفت طول خط ساحلی بریتانیا حدود ۲۴۰۰ کیلومتر است، دیگری ۳۴۰۰ کیلومتر و حتی منابعی بودند که ۱۲۰۰۰ کیلومتر گزارش می‌دادند! چرا این‌همه تفاوت؟

واقعیت این است که طول خط ساحلی به مقیاس اندازه‌گیری بستگی دارد!‌ اگر با خط‌کشی به طول ۱۰۰ کیلومتر اندازه بگیرید، از بسیاری از خلیج‌ها، بریدگی‌ها و پیچ‌وخم‌های کوچک عبور می‌کنید. اما اگر خط‌کش شما فقط ۱ کیلومتر باشد، جزئیات بیشتری را ثبت می‌کنید. و اگر به اندازه ۱ متر یا حتی کوچک‌تر برسید، حتی فرورفتگی‌های کوچک، سنگ‌ریزه‌ها و دانه‌های شن را هم لحاظ خواهید کرد. هرچه واحد اندازه‌گیری کوچکتر باشد، طول خط ساحلی بیشتر می‌شود.

این مشاهدۀ عجیب همان پارادوکس خط ساحلی است:

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

این وضعیت معنای «طول» به صورت کلاسیک آن را بی استفاده می کند!‌ پس باید چه کرد؟
این پارادوکس توجه بنوآ مندلبرو (Benoit Mandelbrot) ، ریاضی‌دان فرانسوی را جلب کرد. او در سال ۱۹۶۷ مقاله‌ای معروف با عنوان «خط ساحلی بریتانیا چقدر طول دارد؟ خودشباهتی آماری و بُعد کسری» منتشر کرد. اون دریافت که اشکال طبیعی مانند خط ساحلی، طول دقیقی در معنای کلاسیک ندارند. این اشکال دارای خودشباهتی هستند؛ یعنی الگوهای مشابهی در مقیاس‌های مختلف ظاهر می‌شوند. مندلبرو مفهوم بُعد فرکتالی را برای اندازه‌گیری این پیچیدگی معرفی کرد.

برای یک خط صاف (یک بعدی)، بُعد آن برابر با ۱ است.
برای یک صفحه (دو بعدی)، بُعد آن ۲ است.

اما بعد خط ساحلی بریتانیا بین خط و صفحه است!! مقدار اندازه گیری شده ۱.۳۳ است. اما یافتن بعد فقط محدود به چنین موجودیت های جغرافیایی نمی شود. هر چیزی اطراف ما یک بعد دارد حتی زبان! در قسمت های بعدی در مورد بعد «ماشین ها» و «ساختار های اطلاعاتی» بیشتر صحبت می کنیم!
🔵عصر ماشین های با ابعاد فراکتالی!🔵

آن که پرنقش زد این دایره مینایی کس ندانست که در گردش پرگار چه کرد (حافظ)


در بخش پیشین از «بعد» سخن گفتیم از فراکتال‌ها، این سایه‌های اسرارآمیز در مرز میان نظم و آشوب. اما اکنون، بیایید فراتر رویم. «بعد»، میتواند از دیدگاهی عمومی تر هم دیده شود. بگذارید آن را در دل پویایی ببینیم: در ماشین‌هایی که نه تنها می‌اندیشند، بلکه انتخاب می‌کنند.

فرض کنید جهانی را داریم که در آن هر لحظه، آینده ی دقیقاً مشخص دارد؛ آینده‌ای که با بی‌رحمی ریاضی تعیین شده است. در چنین جهانی، شما آزادی ندارید. تنها یک مسیر است که باید آن را پیمود. این همان دنیای ماشین‌های متعین (deterministic automata) است، اتومات‌هایی که بدون تردید و بدون رؤیا، از یک وضعیت به وضعیت بعدی می‌خزند. شما قفل شده‌اید. در اسارت علیت. شکل زیر یک مثال از چنین حالتی است:
اما در جهانی دیگر، در ساختاری دیگر از ماشین‌ها، «آزادی» (انتخاب آزاد) از تارهای علیت سر برمی‌کشد. در اینجا، در هر نقطه می‌توانید بایستید یا حرکت کنید، انتخاب کنید یا نکنید. این همان آزادی است: جایی که امکان معنا می‌یابد. ساده ترین مثال آن شکل زیر است: در اینجا زبان ما فقط دو نماد ۰ و ۱ دارد و دو حالت برای حرکت بین آن ها:
و آنگاه، نوعی میانجی، میان این دو جهان می‌زاید: اتوماتای جابجایی با نسبت طلایی.(golden mean shift automata) نه کاملاً آزاد، نه کاملاً مقید. گاه انتخاب دارید، گاه ندارید. چیزی شبیه به ساحت وجود ما، در مرز میان تقدیر و اراده. در شکل زیر ساده ترین نمونه ی اتوماتای طلایی را می بنید (که قبلا هم آن را بررسی کردیم)
اگر مسیرهای ممکن را بُعد بنامیم، پس ماشین‌های متعین بُعدشان یک است: یک مسیر، یک انتخاب. اتومات دومی که بررسی کردیم بُعدش دو است: در آن هر حالت دو مسیر پیش روی شماست: در هر حالت هم می توانید در آنجا بمانید یا به حالت دیگر بروید. اما در اتوماتای نسبت طلایی، در یک حالت شما دو انتخاب دارید اما در حالت دیگر حرکت کاملا متعین است: «بُعد» (یا درجه ی انتخاب) در میان یک و دو است یک مقدار کسری یا به زبان دیگر فراکتالی. برای محاسبه «بعد» باید پرسید: در هر تغییر بر روی اتومات ها فضای حالت ها به چه نرخی رشد می کند! نرخ این رشد از قضا برابر با اولین مقدار ویژه (eigenvalue) ماتریس جابجایی اتومات (transition matrix) است.و این نرخ همان عدد طلایی‌ست. ۱.۶۱۸۰. بنابراین بعد چنین ماشینی عدد طلایی است!

در حقیقت، آنچه ما «بُعد» می‌نامیم، چیزی نیست جز آنتروپی؛ میزان آزادی، میزان پیچیدگی یا نسبت تقدیر و اراده: نسبت آزادی و اسارت. و همان‌گونه که پیش‌تر گفتیم، آنتروپی صرفاً بی‌نظمی نیست. آنتروپی، هندسه‌ی آزادی‌ست. نقشه‌ی مرموزی‌ست که نشان می‌دهد در کجا می‌توان بود و در کجا نه.

زبان ماشین‌ها نیز، زبان همین هندسه است. ما در نظریه‌ی زبان‌ها و اتوماتا، زبان‌هایی را تعریف می کنیم که اساس تمامی زبان های برنامه نویسی و ماشینی است. شما به یاد دارید که می توان ماشین هایی ساخت که زبان های ساده ای مانند (01)* یا تکرار 01 را ایجاد کنند ( regular expressions). در این نوع زبان ها احتمال رفتن از یک نماد به دیگری شکل های پیچیده تری را هم می سازند (زبان های حافظه دار و در نهایت ماشین تورینگ). در دسته ی زبان هایی که حرکت بین نماد های آن (در مثال بالا 0 , 1) احتمالاتی است ما با توالی های مختلفی مواجه هستیم که برخی از بقیه محتمل ترند. اگر حتی کلی تر به این موضوع نگاه کنید می توانید زبان های انسانی را هم توالی احتمالاتی از کلمات بدانید!
امروزه، مدل‌هایی در دل سیلیکون به نام ترنسفورمر (Transformers) ساخته‌ایم که وقتی به آن‌ها کلمه‌ای داده می‌شود، می‌توانند توزیع احتمال کلمه‌ی بعدی را با دقتی شگرف پیش‌بینی کنند.در مدل های زبانی امروزی وقتی یک کلمه به عنوان ورودی داده می شود مدل با دقت بسیار بالایی توزیع احتمال کلمه ی بعدی را پیش بینی می کند. به این ترتیب می توانیم یک نمونه از توزیع کلمه ی بعدی برداریم و همینطور کلمات بعدی و بعدی را بسازیم تا جملات و پاراگراف های طولانی ایجاد کنیم.

اینجا هم یک فضا وجود دارد از کلماتی که پشت سر هم می آیند و برخی از دنباله ها قابل قبول هستند (مثلا «او به بازار رفت» ) و برخی غیر قابل قبول (مثلا «بازار او رفت» ) یا حتی بهتر: چه دنباله هایی با احتمال بیشتری یا کمتری می آیند (احتمال بیشتر مانند «در کتاب نوشتم» و احتمال کمتر «کتاب پرواز کرد»). آنتروپی یا «بعد» چنین ماشینی تمام آن چیزی است که شکل آن را تعیین می کند. شاید الان بهتر متوجه شده باشید که چرا در مدل های زبانی آنتروپی را مینیمم می کنیم. چیزی که یک شبکه ی عصبی مانند مدل های ترنسفورمر یاد میگیرند تابع آنتروپی هر کلمه به شرط کلمات قبلی است. این آنتروپی فضای بسیار پیچیده و تو در توی زبان را با دقتی بالا تخمین می زند. کاری که حتی تا چند سال پیش غیر ممکن بنظر می رسید.


اما آیا راهی وجود دارد که این را حتی شهودی تر درک کرد؟ برای این منظور فرض کنید شما در یک اتاق هستید که اجسامی در آن وجود دارند. در این حالت هر درجه ی آزادی محدودیت هایی برایش ایجاد می شود. مثلا ممکن است شما براحتی نتوانید به چپ حرکت کنید چون تخت در سمت چپ شماست. اما اگر روی تخت بروید (یعنی در جهت بالا-پایین کمی بالا رفتید اید) می توانید کمی به چپ تر بروید. در اینجا ما با ابعاد فراکتالی روبرو هستیم. اینجا دیگر «بعد» فضا ۳ نیست بلکه بستگی به جایی دارد که قرار گرفته اید، بعضی جاها سه و بعضی جاها کمتر! «بعد» به روشی برعکس مشخص می کند که چه اجسام و اشیایی در فضای اتاق وجود دارند! اگر شما چشم هایتان را ببندید و فقط به صورت تصادفی در اتاق حرکت کنید (فرض کنید حتی می توان بالا پایین هم رفت) در عمل می توانید تمام اتاق را «اسکن» کنید. حتی می توانید این را با دقت بیشتری هم انجام دهید. اگر یک پهپاد به اندازه ی یه زنبور را داخل بفرستید می توانید حتی لیوان توی اتاق رو هم تشخیص بدهید.

مدل های زبانی به همین شکل فضای حرکت بین کلمات را «می روبند»، در ابتدا برخی از ویژگی های کلی به راحتی قابل تشخیص می شوند: مثلا درفارسی فاعل و بعد مفعول و بعد فعل می آید. این دقیقا مانند آن است که در اتاق شما اشیای بزرگ مثل مبل و شومینه را تشخیص دهید. اما اگر با دقت بیشتری نگاه کنید الگو های ریز تری دیده می شود. مثلا اینکه در انگلیسی صفت قبل از موصوف می آید. با ادامه دادن افزایش دقت می توان به جایی رسید که ترتیب کلمات «the capital of france is به درستی کلمه paris را به عنوان کلمه بعدی پیدا کند. اینجا جایی است که شما از مولکول ها برای اسکن کردن «شکل داخل اتاق» استفاده می کنید.

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

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

(معماری مسجد شیخ لطف الله، اصفهان)