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

یادگیری انتقالی چیست؟
یادگیری انتقالی تکنیکی در یادگیری ماشین هست که در آن یک مدل آموزشدیده روی یک مساله/تسک در یک مساله/تسک دیگر اما مرتبط بازاستفاده میشود. به جای آموزش یک مدل از صفر، یادگیری انتقالی این امکان را میدهد که از دانش مدلهای از پیش آموزشدیده استفاده کنیم و آن را برای یک مساله جدید تنظیم کنیم.

این انتقال دانش در انسان هم وجود دارد؛ تصور کنید، میخواهید زبان فرانسوی را یاد بگیرید. اگر انگلیسی بلد باشید، یادگیری فرانسوی برایتان راحتتر خواهد بود، چون خیلی از کلمات و ساختارهای گرامری شبیه هم هستند. یادگیری انتقالی هم همینطور کار میکند؛ مدلی که روی یک تسک آموزش دیده، میتواند دانش خود را به یک وظیفه مرتبط دیگر منتقل کند.
کاربرد ترنسفر لرنینگ
یادگیری انتقالی تکنیک بسیار محبوبی است. بیایید دو نمونه مثال از کاربرد یادگیری انتقالی را ببینیم:
- حوزه بینایی کامپیوتر: میخواهیم 120 گونه سگ را با شبکه ResNet کلاسبندی کنیم. بجای اینکه شبکه رزنت از صفر با وزنهای تصادفی روی دیتاست گونههای سگ آموزش دهیم، از تکنیک یادگیری انتقالی استفاده میکنیم. کافی است که از شبکه رزنت آموزشدیده روی دیتاست ImageNet بهره ببریم. شبکه با وزنهای آماده را دوباره با دیتاست گونههای سگ آموزش میدهیم.
- حوزه پردازش زبان طبیعی: میخواهیم کامنتهای دیجیکالا را به سه کلاس بد، خنثی و خوب کلاسبندی کنیم. میتوانیم یک مدل زبانی بزرگ مانند GPT یا BERT که روی حجم عظیمی از متن آموزش دیده را روی دیتاست کامنتهای دیجیکالا آموزش دهیم.
چرا یادگیری انتقالی مهم است؟
دلایل زیادی برای اهمیت یادگیری انتقالی میتوان ذکر کرد:
- آموزش سریعتر: از آنجا که مدل قبلا آموزش دیده، آموزش روی یک وظیفه جدید زمان کمتری نیاز دارد. در نمودار شکل زیر مشاهده میکنید که مدل با ترنسفر لرنینگ یادگیری سریعتری دارد.
- عملکرد بهتر: مدل قبلا آموزشدیده، عملکرد بهتری در یادگیری تسک جدید خواهد داشت. در نمودار مشاهده میکنید که درنهایت مدل با یادگیری انتقالی به کارآیی بهتری رسیده است.
- کارایی محاسباتی: تنظیم و بهینهسازی یک مدل از پیش آموزشدیده، توان محاسباتی بسیار کمتری نیاز دارد. در نمودار مشخص است که با تعداد ایپاکهای کمتر به دقت بالاتر رسیدهایم.
- نیاز کمتر به داده: یادگیری انتقالی نیاز به دیتاست با دادههای بابرچسب زیاد را کاهش میدهد.

انواع یادگیری انتقالی
عدهای یادگیری انتقالی را همان فاین تیونینگ (Fine-tuning) میدانند. یادگیری انتقالی تنها به مفهوم فاین تیونینگ محدود نمیشود، بلکه طیف گستردهای از روشها را شامل میشود. در این زمینه تحقیقات گستردهای انجام شده و مقالات و کارهای متنوعی منتشر شده است. ما نمیخواهیم در این آموزش عمیقا وارد مبحث یادگیری انتقالی شویم. اما، مفید است اگر در این بخش نگاهی به روشهای رایج یادگیری انتقالی داشته باشیم.
انواع روش یادگیری انتقالی را به شکلهای مختلفی میتوان دستهبندی کرد. دو دستهبندی رایج آن عبارت است از:
- یادگیری انتقالی براساس نوع تسک (Task-based Transfer Learning)
- یادگیری انتقالی براساس نوع دانش (Knowledge-based Transfer Learning)
در ادامه، میخواهم بهصورت مختصر درباره یادگیری انتقالی براساس “نوع تسک” و “نوع دانش” توضیح بدهم…
توجه مطالعه ادامه بخش انواع یادگیری انتقالی اختیاری است. درصورت عدم تمایل، از روی این بخش بپرید!
Task-based Transfer Learning
این دستهبندی به این موضوع میپردازد که تسکها در مبدا و مقصد یکسان هستند یا متفاوت. دو شکل رایج این دسته عبارت است از:
- یادگیری انتقالی استقرایی (Inductive Transfer Learning)
- یادگیری انتقالی استنتاجی (Transductive Transfer Learning)
یادگیری انتقالی استقرایی (Inductive Transfer Learning)
در این روش، تسک مقصد متفاوت از تسک مبدا است، اما دادههای برچسبدار در دامنه مقصد وجود دارند. به عنوان مثال، یک مدل برای تشخیص چهرهها در تصاویر آموزش دیده است. اکنون برای تشخیص احساسات (شاد، ناراحت، خشمگین) از چهرهها استفاده میشود. تسک مبدا و مقصد بهترتیب تشخیص چهره و تشخیص احساسات هستند که ازهم متفاوتند.
یادگیری انتقالی استنتاجی (Transductive Transfer Learning)
در این روش، تسک در مبدا و مقصد یکسان است، اما ویژگیها یا توزیع دادهها متفاوت هستند. همچنین، دادههای برچسبدار فقط در دامنه مبدا وجود دارند و نه در دامنه مقصد. به عنوان مثال، مدلی برای تشخیص اشیا در تصاویر روز آموزش دیده است. حالا برای تشخیص اشیا در تصاویر گرفتهشده در شب استفاده میشود. تسک تشخیص اشیا یکسان است، اما توزیع دادهها (شرایط نوری) تغییر کرده است.
به همین اندازه بسنده میکنم. اگر نمیخواهید بهصورت تخصصی وارد بحث ترنسفر لرنینگ شوید، ضرورتی ندارد بیشتر بدانید. برویم سراغ دسته یادگیری انتقالی براساس نوع دانش…
Knowledge-based Transfer Learning
این دستهبندی بر اساس نحوه انتقال دانش از دامنه مبدا به دامنه مقصد انجام میشود. سه شکل رایج آن عبارت است از:
- انتقال ویژگی (Feature Transfer)
- انتقال پارامتر (Paramtere Transfer)
- انتقال نمونه (Instance Transfer)
انتقال ویژگی (Feature Transfer)
ویژگیهایی که مدل از دادههای دامنه مبدا یاد گرفته، برای آموزش مدل جدید در دامنه مقصد استفاده میشوند. به عنوان مثال، از مدل از پیش آموزشدیده ResNet برای استخراج ویژگی از تصاویر جدید استفاده کنیم. سپس، این ویژگیهای استخراجی را به یک مدل یا لایه طبقهبندی جدید بدهیم. این روش، بیشتر در بینایی کامپیوتری و پردازش زبان طبیعی استفاده میشود.
انتقال پارامتر (Paramtere Transfer)
پارامترهای مدل از پیشآموزشدیده شده در دامنه مبدا، به عنوان نقطه شروع برای آموزش در دامنه مقصد استفاده میشوند. به عنوان مثال، فاینتیونینگ مدل BERT برای یک کار جدید، مانند تحلیل احساسات یا دستهبندی متن.
انتقال نمونه (Instance Transfer)
نمونههای داده از دامنه مبدا به دامنه مقصد منتقل شده و برای آموزش مدل جدید استفاده میشوند. به عنوان مثال، از مجموعه دادههای مرتبط (مثلا مقالات علمی در زیستشناسی) برای آموزش یک مدل طبقهبندی در حوزه پزشکی استفاده کنیم. این روش زمانی کاربرد دارد که دادههای دامنه مقصد کم هستند و نیاز به دادههای اضافی داریم.
در این بخش، دو دسته یادگیری انتقالی براساس نوع تسک و نوع دانش را به شما توضیح دادم. بالاخره، به بخش مورد علاقه شما رسیدیم! 😊
یادگیری انتقالی چگونه کار میکند؟
چه بخش قبلی را خوانده باشید، چه نخوانده باشید، احتمالا با من همعقیده هستید که تکنیکهای متنوعی در یادگیری انتقالی وجود دارد. اما، دو تکنیک رایج در ترنسفر لرنینگ وجود دارد که میخواهم بهصورت عملی درباره آنها صحبت کنم. این دو تکنیک عبارت است از:
- استخراج ویژگی (Feature Extraction)
- فاین تیون کردن (Fine-tune)
در بخش قبلی، در قالب دو عنوان انتقال ویژگی (Feature Transfer) و انتقال پارامتر (Paramtere Transfer) درباره این دو تکنیک صحبت کردم. اما، اینجا میخواهم با جزئیات بیشتری به آنها بپردازم و نمونه کد هم نشان بدهم.
استخراج ویژگی (Feature Extraction)
استخراج ویژگی یکی از روشهای پرکاربرد در یادگیری انتقالی است. در این روش، از ویژگیهای آموختهشده توسط یک مدل از پیش آموزشدیده استفاده میشود، بدون اینکه کل مدل دوباره آموزش داده شود. در این روش، بخشهای استخراج ویژگی مدل ثابت میمانند (فریز میشوند) و فقط یک لایه جدید (مثلا لایه طبقهبندی) روی آن اضافه میشود تا برای یک کار خاص آموزش ببیند و استفاده شود. در شکل زیر نشان داده شده است که چگونه بخشهای استخراج ویژگی شبکه کانولوشنی کامل فریز شده و قابل آموزش نیست. تنها لایه خروجی (نهایی) قابل آموزش هست.

چگونه استخراج ویژگی انجام میشود؟
مراحل زیر را باید بهترتیب انجام دهیم:
- انتخاب مدل از پیش آموزشدیده: معمولا این مدل روی دیتاست بزرگ و عمومی آموزش دیده است؛ مثل ResNet برای بینایی کامپیوتر یا BERT برای پردازش زبان طبیعی.
- فریز کردن بخش استخراج ویژگی: فریمورکهای پایتورچ و تنسورفلو-کراس، به سادگی امکان فریز کردن مدلها را فراهم کردهاند. بعدا به شما میگویم…
- افزودن لایه خروجی: این لایه میتواند یک طبقهبند جدید باشد که ویژگیهای استخراجشده را برای یک تسک جدید پردازش میکند.
- آموزش مدل: نیازی به آموزش کل مدل نیست؛ فقط لایه اضافهشده را با دیتاست جدید آموزش میدهیم.
فریز کردن مدل در کراس
در تکه کد زیر، یک مدل آموزشدیده فراخوانی شده؛ سپس، تعدادی از لایههای مدل فریز شده؛ نهایتا، یک لایه فولی کانکتد به انتهاب مدل اضافه شده است.
from tensorflow.keras.applications import VGG16 from tensorflow.keras.models import Model from tensorflow.keras.layers import Dense, Flatten # ۱. بارگیری مدل از پیش آموزشدیده با حذف لایهی خروجی اصلی base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) # ۲. فریز کردن تمام لایههای مدل اصلی for layer in base_model.layers: layer.trainable = False # ۳. اضافه کردن لایههای جدید برای طبقهبندی خاص x = Flatten()(base_model.output) # تبدیل خروجی به بردار x = Dense(128, activation='relu')(x) # اضافه کردن یک لایهی متراکم x = Dense(10, activation='softmax')(x) # لایهی خروجی با 2 کلاس
فاین تیون (Fine-tune) چیست؟
فاین تیون یا تنظیم دقیق، روشی در یادگیری انتقالی است که در آن یک مدل از پیش آموزشدیده روی دادههای جدید و خاص یک حوزه تنظیم و بهینهسازی میشود. به جای آموزش مدل از صفر، فاین تیون کردن باعث میشود که مدل از دانش قبلی خود استفاده کند و فقط قسمتهایی از آن را برای انجام بهتر وظیفه جدید تطبیق دهد. دو حالت رایج در فاین تیون وجود دارد:
- فاین تیون کامل (Full Fine-tune): در این حالت، پارامترهای کل مدل در حالت آموزش قرار میگیرد. بنابراین، همه پارامترهای فاین تیون یا تنظیم دقیق میشوند. اگر داده به اندازه کافی وجود دارد (مثلا، حدود 1000 نمونه داده با برچسب)، توصیه میکنم که مدل را فول فاین تیون کنید. نتیجه بهتری نسبت به روش فاین تیون جزئی دارد.
- فاین تیون جزئی: تنها بخشی از پارامترهای مدل در حالت آموزش قرار میگیرند. معمولا، لایههای ابتدایی فریز میشوند و لایههای انتهایی در حالت آموزش قرار میگیرند. لایههای ابتدایی شامل ویژگیهای کلی و سطح پایین هستند. ممکن هست بین مبدا و مقصد مشترک باشند. بنابراین، ممکن هست فاین تیون تاثیر کمی روی عملکرد مدل داشته باشد. اما، لایههای انتهایی شامل ویژگی مهم و اختصاصی هستند. بنابراین، بهتر هست که فاین تیون شوند.

چگونه فاین تیون انجام میشود؟
برای انجام فاین تیون مراحل زیر باید به ترتیب انجام شود:
- انتخاب مدل از پیش آموزشدیده: این مدل معمولا روی یک مجموعه داده بزرگ و عمومی (مثلا ImageNet برای بینایی کامپیوتر یا GPT/BERT برای پردازش زبان طبیعی) آموزش دیده است.
- تغییر لایه آخر مدل: لایه آخر، لایه خروجی نام دارد. بسته به تسکی که داریم، باید لایه آخر را تنظیم کنیم.
- تنظیم میزان پارامترها/لایههای قابل آموزش: درصورت اجرای فاین تیون جزئی، باید تعیین کنیم که چه بخش از مدل قابل آموزش باشد.
- تنظیم هایپرپارامترها: معمولا، مدل آموزشدیده برای آموزش مجدد به نرخ یادگیری کوچکتری نسبت به آموزش از صفر نیاز دارد. به نظرتان دلیلش چیست؟ جوابتان را کامنت کنید!
- آموزش مدل: مدل را با مجموعه داده تسک جدید آموزش میدهیم.
حالا میچسبد که یک مثال کدنویسی هم ببینیم…
فاین تیون با کراس
در نمونه کد زیر، یک تابع برای ساخت مدل نوشته شده که میتوان از وزنهای ارزشمند ImageNet استفاده کرد و همچنین تعدادی از لایهها را فریز کرد.
import tensorflow as tf from tensorflow.keras import layers, models, optimizers from tensorflow.keras.datasets import cifar10 from tensorflow.keras.applications import VGG16 from tensorflow.keras.utils import to_categorical # Load CIFAR-10 dataset (x_train, y_train), (x_test, y_test) = cifar10.load_data() # Normalize pixel values to [0, 1] x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 # Convert labels to one-hot encoding y_train = to_categorical(y_train, 10) y_test = to_categorical(y_test, 10) # Define VGG-16 model with pretrained weights and freezing some layers def build_vgg16(pretrained=True, freeze_layers=True): if pretrained: base_model = VGG16(weights='imagenet', include_top=False, input_shape=(32, 32, 3)) else: base_model = VGG16(weights=None, include_top=False, input_shape=(32, 32, 3)) # Freeze some layers if freeze_layers: for layer in base_model.layers[:10]: # Freeze the first 10 layers layer.trainable = False # Add custom layers for CIFAR-10 model = models.Sequential() model.add(base_model) model.add(layers.GlobalAveragePooling2D()) model.add(layers.Dense(10, activation='softmax')) return model # Build the model with pretrained weights and freeze some layers model = build_vgg16(pretrained=True, freeze_layers=False) # Compile the model model.compile(optimizer=optimizers.Adam(learning_rate=0.001), loss='categorical_crossentropy', metrics=['accuracy']) # Train the model model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.2) # Evaluate the model print("Evaluation on test set:") model.evaluate(x_test, y_test)
این هم خروجی کد بالا که مدل را فول فاین تیون کردهایم:
Epoch 1/10 625/625 ━━━━━━━━━━━━━━━━━━━━ 44s 59ms/step - accuracy: 0.2132 - loss: 2.0185 - val_accuracy: 0.4401 - val_loss: 1.4287 Epoch 2/10 625/625 ━━━━━━━━━━━━━━━━━━━━ 36s 57ms/step - accuracy: 0.5316 - loss: 1.2640 - val_accuracy: 0.6381 - val_loss: 1.0395 Epoch 3/10 625/625 ━━━━━━━━━━━━━━━━━━━━ 36s 57ms/step - accuracy: 0.6740 - loss: 0.9296 - val_accuracy: 0.7212 - val_loss: 0.8037 Epoch 4/10 625/625 ━━━━━━━━━━━━━━━━━━━━ 40s 56ms/step - accuracy: 0.7510 - loss: 0.7362 - val_accuracy: 0.7388 - val_loss: 0.7774 Epoch 5/10 625/625 ━━━━━━━━━━━━━━━━━━━━ 41s 56ms/step - accuracy: 0.7924 - loss: 0.6144 - val_accuracy: 0.7550 - val_loss: 0.7381 Epoch 6/10 625/625 ━━━━━━━━━━━━━━━━━━━━ 35s 56ms/step - accuracy: 0.8291 - loss: 0.5190 - val_accuracy: 0.7721 - val_loss: 0.7172 Epoch 7/10 625/625 ━━━━━━━━━━━━━━━━━━━━ 35s 56ms/step - accuracy: 0.8512 - loss: 0.4469 - val_accuracy: 0.7824 - val_loss: 0.6893 Epoch 8/10 625/625 ━━━━━━━━━━━━━━━━━━━━ 42s 58ms/step - accuracy: 0.8708 - loss: 0.3966 - val_accuracy: 0.7683 - val_loss: 0.7715 Epoch 9/10 625/625 ━━━━━━━━━━━━━━━━━━━━ 41s 58ms/step - accuracy: 0.8916 - loss: 0.3387 - val_accuracy: 0.7821 - val_loss: 0.7328 Epoch 10/10 625/625 ━━━━━━━━━━━━━━━━━━━━ 37s 59ms/step - accuracy: 0.9056 - loss: 0.2904 - val_accuracy: 0.7889 - val_loss: 0.6988 Evaluation on test set: 313/313 ━━━━━━━━━━━━━━━━━━━━ 4s 8ms/step - accuracy: 0.7828 - loss: 0.7348 [0.723657488822937, 0.7824000120162964]
چه موقعی باید از یادگیری انتقالی استفاده کرد؟
در بسیاری از موارد در یادگیری ماشین، دشوار هست قانونی پیدا کنیم که برای همه کاربردها عمومیت داشته باشد. اما در اینجا چند دستورالعمل رایج برای این کار را به شما میگویم. به طور معمول، زمانی از یادگیری انتقالی استفاده میشود که:
- دادههای آموزشیِ برچسبدارِ کافی برای آموزش شبکه از صفر وجود ندارد.
- شبکهای از پیش آموزش دیده برای یک کار مشابه وجود دارد که روی دیتاست بزرگی آموزش دیده است.
در این آموزش به معرفی و بررسی مفهوم یادگیری انتقالی پرداختیم. امیدوارم که از این آموزش خوشتان آمده باشد. همچنین، از طریق کامنتها میتوانید سوال، پیشنهاد یا دیدگاه خود را با ما به اشتراک بگذارید. ممنون. 🤞
مطالب زیر را حتما مطالعه کنید
شبکه VGG
مهندسی پرامپت
مدل nanoGPT
شگفتانگیزترین ایده هوش مصنوعی از نظر Andrej Karpathy
شبکه ویژن ترنسفورمر
شبکه اتوانکدر
6 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
با سلام و عرض ادب
سپاس از اطلاعات عالی شما
ایا امکان این هست که توابع هدف و هزینه این الگوریتم رو هم به صورت ریاضی بفرمایید
چونکه من دارم یه مقاله می نویسم در ارتباط با معرفی و بررسی چند الگوریتم که یکی از انها الگوریتم یادگیر هستش
واقعا عالیه لطفا ادامه بدین
ممنون 🌹🙏
ممنون از زحمات شما
مطالب مفیدبود
خوشحالیم که مطالب برای شما مفید بوده 😊
سلام بسیار عالی
امکانش هست تا لینک منبع رو هم به اشتراک بذارید