شبکه ویژن ترنسفورمر
شبکه ویژن ترنسفورمر (Vision Transformer) یا ViT یک شبکه عصبی مبتنی بر مدل ترنسفورمر هست که برای حوزه بینایی کامپیوتر و کار با داده تصویر طراحی شده است. شبکه ویژن ترنسفورمر یکی از اولین مدلهای ترنسفورمری است که در حوزه کامپیوتر ویژن جواب داد و جربانساز شد. در این آموزش میخواهم به تشریح شبکه ViT بپردازم. با من و هوسم همراه باشید…
شبکه ویژن ترنسفورمر چیست؟
شبکه ویژن ترنسفورمر (Vision Transformer) یا ViT یک شبکه عصبی مبتنی بر مدل ترنسفورمر هست که با تقسیم تصویر به بخشهای کوچک و پردازش آنها بهصورت توکن، تصاویر را طبقهبندی میکند. شبکه ViT توسط تیمی از محققان گوگل در سال 2020 معرفی در مقالهای با عنوان زیر ارائه شد:
An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale
بیایید کمی عنوان مقاله را بررسی کنیم:
- از شبکه ترنسفورمر در بینایی کامپیوتر استفاده کرده است؛ شبکه ترنسفورمر، یک شبکه عصبی مدرن هست که در سال 2017 توسط گوگل متولد شد. این شبکه مدرن، از زمان تولدش سروصدای زیادی ایجاد کرده است! تعداد ارجاعات مقاله شبکه ترنسفورمر (حدود 137 هزار ارجاع تا الان!) به خوبی میزان اثرگذاری آن در هوش مصنوعی را نشان میدهد. ابتدا تحولی اساسی در پردازش زبان طبیعی (NLP) ایجاد کرد. سپس، وارد سایر شاخههای هوش مصنوعی شد و عملکردی قابل توجه از خود برجای گذاشت. ChatGPT را میتوان خفنترین آورده شبکه عصبی ترنسفورمر دانست.
- ویژن ترنسفورمر به عنوان روشی مبتنی بر معماری ترنسفورمر برای بازشناسی تصویر (Image Recognition) معرفی شده است. منظور از بازشناسی تصویر، همان طبقهبندی تصویر هست. درحالیکه، پیش از این مقاله، انتخاب اول در بینایی کامپیوتر شبکه کانولوشنی بود!
- در عنوان مقاله عبارت مهم 16×16 Words دیده میشود. در شبکه ویژن ترنسفورمر، هر تصویر به تکههای با سایز 16×16 پیکسل تقسیم میشود. شکل زیر، نحوه تکه شدن تصویر ورودی و سپس ورود تکه تصاویر به شبکه ترنسفورمر را نشان میدهد.
شبکه ویژن ترنسفورمر و شبکه رزنت
این دنیا به کسی وفا نکرده! حتی به شما ResNet عزیز! 😥 شبکه رزنت سالها پادشاه بلامنازع حوزه بینایی کامپیوتر بود و انتخاب اول در مقالات و تسکهای مختلف بود. الان که این متن را مینویسم، مقاله رزنت بیش از 239 هزار ارجاع دارد! این عددِ بسیار بسیار بسیار بزرگی هست. فکر میکنم، مقاله رزنت نه فقط در حوزه بینایی کامپیوتر، بلکه در کل علوم، یکی از پرارجاعترین مقالات تاریخ محسوب میشود! 😯
اما، حالا نمودار زیر از سایت paperswithcode را نگاه کنید. تا قبل 2022، شبکه رزنت با اختلاف پراستفادهترین شبکه بود. اما در سال 2020 شبکه ViT پیشنهاد شد، بهصورت انفجاری رشد کرد و اوایل 2022 به سطح شبکه رزنت رسید و سپس جایگاه اولی را از او گرفت! اینجاست که یاد شعر قدیمی میافتیم که:
رزنت که بالا بودی همه عمر، دیدی که چگونه ویژن ترنسفورمر رزنت گرفت؟!
ترنسفورمر یک شبکه عصبی همهمنظوره!
شبکه ترنسفورمر یک ویژگی خاص دارد! بدون هرگونه تغییر در معماری شبکه، میتواند دادههای مختلف مانند تصویر، متن، صوت و غیره را پردازش کند. بنابراین، ساختار داخلی شبکه ویژن ترنسفورمر هیچ تفاوتی با شبکه ترنسفورمر در متن ندارد. دقیقا همان شبکه هست. پس چگونه شبکه ترنسفورمری که برای داده متن طراحی شده، میتواند روی داده تصویر کارآیی داشته باشد؟ کافی است که روی تصویر پیش پردازش انجام دهیم. همین! شکل زیر نشان میدهد که ابتدا باید داده (متن، صوت، تصویر و غیره) پیشپردازش شود، سپس وارد شبکه ترنسفورمر با معماری یکسان شود.
بسیار خب! تا اینجا متوجه شدید که شبکه ترنسفورمر برای همه نوع دادهها یکی هست. اما، پیشپردازش برای دادههای مختلف متفاوت است. در ادامه، بیشتر درباره شبکه ترنسفورمر در NLP و بینایی کامپیوتر و پیشپردازش آنها صحبت میکنم.
شبکه ترنسفورمر در NLP
قبلا، در آموزش شبکه ترنسفورمر درباره نحوه دادن ورودی متن (Text) به شبکه ترنسفورمر صحبت کردم. پیشنهاد میکنم، آن را مطالعه کنید. متن باید از طریق یکسری عملیات پیش پردازش به عدد تبدیل شود. کاری که معمولا در پیش پردازش متن انجام میشود، این هست:
- Tokenization: توکنایز کردن متن
- Vectorization: تبدیل هر توکن به یک بردار یکتا (همان لایه Embedding)
بنابراین، متن نمونه ما تبدیل به یک مجموعه عدد میشود که میتوانیم آنها را در اختیار شبکه ترنسفورمر قرار دهیم. طبق شکل زیر مشاهده میکنید که ابتدا داده متن با توکنایزیشن به 20 توکن تبدیل شد. سپس، از طریق وکتوریزیشن برای هر توکن یک بردار به طول 50 ساخته شد. بنابراین، کلا به یک تنسور به ابعاد 50×20 رسیدیم. یعنی، 20 تنسور به طول 50 (معادل 20 توکن).
حالا میخواهم خروجی پیش پردازش متن برای شبکه ترنسفورمر را فرموله کنم؛ بهصورت کلی، خروجی پیش پردازش متن، برای هر نمونه داده، تنسوری دوبعدی به ابعاد LxF هست. L نشاندهنده تعداد توکنهای نمونه داده و F بردار امبدینگ هر نمونه داده هست. برای مثال بالا، L و F بهترتیب برابر با 20 و 50 بودند.
شبکه ویژن ترنسفورمر (ViT)
در NLP بهصورت مستقیم متن را در اختیار شبکه ترنسفورمر قرار ندادیم و به پیش پردازش نیاز بود. پیش پردازش هم شامل دو عملیات Tokenization و Vectorization بود. حالا، مشابه با متن، باید روی تصویر هم دقیقا همین عملیات پیش پردازش را انجام دهیم! یعنی، عملیات توکنایز کردن و وکتوریزیشن تصویر! 🙃 درادامه، بهصورت جداگانه درمورد این دو مرحله ساده توضیح دادهام.
توکنایزیشن تصویر
توکنایزیشن در دنیای پردازش تصویر، معادل با پچبندی تصویر (Patching) هست! یا به قول گزارشگر ورزشیمون: پاتسچ! 😁 پچ کردن تصویر، به معنی سلولبندی تصویر در راستای سطرها و ستونهاست. به شکل زیر نگاه کنید؛ تصویر ورودی به 9 پچ مساوی (3 تا در راستای سطر و 3 تا در راستای ستون) تقسیم شده است.
تصویر ورودی شبکه ویژن ترنسفورمر 224×224 است. با پچ سایز 16×16 تصویر پچبندی شده است. یادتان میآید عنوان مقاله ویژن ترنسفورمر چه بود؟ یک عبارت 16×16 Words داشتیم. حالا معنی این عبارت را درک میکنید؛ هریک از پچهای ما 16×16 هست. تصویر 224×224 و سایز هریک از پچها 16×16 هست. حالا شما بگویید، کلا چند تا پچ داریم؟ خبببببببببببببب، 196 تا پچ! 14 پچ در راستای سطرها و 14 پج در راستای ستونها…
وکتوریزیشن تصویر
مرحله وکتوریزیشن تصویر، معادل با همان امبدینگ در متن هست.. در این مرحله، باید پچها را تبدیل به بردار کنیم و از یک لایه فولیکانکتد عبور دهیم. تعداد نورونهای لایه فولیکانکتد را ما تعیین میکنیم. طبق توضیحات بالا، اگر سایز هر پچ 16×16 باشد، هر پچ تبدیل به برداری به طول 256 میشود. سپس، بردارها از یک لایه فولی کانکتد با مثلا 768 نورون عبور میکنند. بنابراین، بعد از این دو مرحله، ما به تنسوری به شکل LxF رسیدیم. L معادل با تعداد توکنها (196) و F طول ویژگی (768) است.
توجه به شکل بالا دقت کنید؛ ما 9 تا پچ نمادین به لایه فولی کانکتد دادیم، اما در خروجی 10 بردار توکن میبینیم. تکلیف 9 تا که مشخص هست. یک بردار اضافه داریم که بردار توکن طبقهبندی نام دارد. به این دلیل اضافه کردیم که بعدا در خروجی شبکه ترنسفورمر، همین بردار توکن 0 را به طبقهبند (لایه کلاسیفایر) بدهیم.
امبدینگ مکانی یا Position Embedding
امبدینگ مکانی یا Positional Embedding در مدلهای ترنسفورمر به هر توکن در ورودی یک موقعیت مکانی اضافه میکند تا ترتیب کلمات در جمله حفظ شود. چون ترنسفورمرها بهصورت موازی و بدون توجه به ترتیب توکنها کار میکنند. قاعدتا، اگر شبکه ترنسفورمر را بلد باشید، این قضیه را میدانید. بههرصورت، در انیمیشن زیر این اضافه شدن بردار پوزیشن امبدینگ به توکنها نشان داده شده است. دقت کنید، دقیقا بردار توکن و بردار پوزیشن امبدینگ همسایز هستند و درایه به درایه با هم جمع میشوند.
شبکه ویژن ترنسفورمر
بعد از آماده شدن تنسور دوبعدی LxF و اضافه کردن اطلاعات موقعیت، وقت آن رسیده که داده را به شبکه ویژن ترنسفورمر بدهیم. از این به بعد نیازی به توضیح ندارد! چون اگر با شبکه ترنسفورمر آشنا باشید، میدانید که یک تعداد لایه انکدر داریم که بعد از انجام محاسبات، توکنها بهدست میآید. سپس، توکن 0 را به یک لایه فولی کانکتد (به عنوان طبقهبند) متصل میکنیم. تامام!
البته، یک راه دیگر هم برای پیشپردازش تصویر وجود دارد. بعدا، درباره این راه دوم و جالب هم صحبت میکنم. فعلا تمــــــــــام!
مطالب زیر را حتما مطالعه کنید
مدل nanoGPT
شگفتانگیزترین ایده هوش مصنوعی از نظر Andrej Karpathy
شبکه اتوانکدر
شبکه عصبی mlp
شبکه ترنسفورمر
مدل MobileLLM
7 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
مثل همیشه بی نظیر
عاااالی بود
خدا خیرتون بده
ممنون 🌹😊
سلام لطفا درباره اون بردار صفر توضیح می دید؟؟
نفهمیدم چرا باید باشه؟؟/
سلام، بردار صفر در ویژن ترنسفورمر به عنوان کلاس توکن (class token) استفاده میشه. این بردار به مدل این امکان رو میده که اطلاعات کلی تصویر رو جمعآوری کنه تا برای طبقهبندی نهایی استفاده بشه. پس، این بردار حین اجرای لایههای ترنسفورمر، در تعامل با توکنهای دیگه (بخشهای مختلف تصویر) هست و اطلاعاتی در اون ذخیره میشه. از اول این بردار رو صفر تعریف میکنیم، چون میخواهیم شامل هیچ اطلاعاتی نباشه.
عالی بود ممنون, فقط من متوجه نشدم که چرا بعداز اینکه پچ ها از فولی کانکتد عبور کرد به ابعاد 196در 768تبدیل شدند؟
سلام
اگه یک تصویر 224×244 رو به پچهای 16×16 تقسیم کنیم، کلا 196 تا پچ بهدست میاد. چطوری؟ 224 تقسیم بر 16 میشه 14؛ یعنی در راستای سطرها 14 تا پچ و در راستای ستونها هم 14 تا پچ. حالا 14 در 14 برابر میشه با 196. پس تا اینجا شد 196 تا پچ به سایز 16×16. خب این 16×16-ها رو فلت میکنیم و نتیجه میشه 196 تا بردار به سایز 256؛ یا اینکه میگیم 196 توکن به ابعاد 256. حالا این 196 توکن رو به یک فولی کانکتد با 768 نورون میدیم؛ خروجی میشه 196 توکن به ابعاد 768.
ممنون 🌹😊
ممنون از پاسخگویی