منبع اصلی نوشتار زیر در این لینک قرار دارد

راه هایی برای بهبود شبکه مولد رقابتی یا GAN

در این مطلب از وبسایت آموزشی اوپن مایند، برخی از موثرترین راه هایی برای بهبود آموزش و عملکرد Generative Adversarial Network یا همان شبکه های GAN را بررسی می کنیم.

 

مدل های GAN در قیاس با شبکه های دیگر یادگیری عمیق، می توانند به شدت دچار مشکلات و نوسانات شدیدی بشوند. از مشکلات معمول آنها می توان به سه دسته کلی زیر اشاره کرد:

  1. عدم همگرایی به یک نقطه خاص و مشخص
  2. فروپاشی تنوع تولیدات شبکه بخش GENERATOR و تولید نمونه تنها از چند توزیع خاص (mode collapse)
  3. کوچک شدن مقدار مشتقات در طول آموزش و کند شدن روند آموزش

 

ما در این مطلب راه حل هایی را برای بهبود شبکه در صورت بروز مشکلات بالا ارائه می کنیم که می توان راه حل های مذکور را به این شکل خلاصه کرد:

  1. تغییر تابع هزینه برای بهینه سازی تعریف هدف نهایی شبکه
  2. وارد کردن پارامترهای بیشتر در تابع هزینه برای اعمال برخی جریمه ها و محدودیت ها که به آموزش شبکه مسیر مشخص تر و منظم تر بدهد
  3. جلوگیری از overfit شدن شبکه در بخش های مختلف آن
  4. بهینه سازی جداگانه بخش GENERATOR و DISCRIMINATOR از لحاظ معماری
  5. استفاده از برچسب داده ها در محاسبه هزینه و به روز رسانی وزن ها (علاوه بر استفاده از مقدار قضاوت بخش DISCRIMINATOR مبنی بر واقعی یا ساختگی بودن تصویر)

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

اول – Feature Matching

بخش GENERATOR سعی می کند بهترین تصویر را برای گول زدن بخش DISCRIMINATOR پیدا کند. این بهترین تصویر مدام در حال تغییر است چرا که دو بخش مختلف شبکه GAN در حال رقابت هستند و ویژگی های ذخیره شده در آنها به طور مداوم در حال تغییر است.

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

یک راه خوب برای مقابله با این موضوع تغییر تابع هزینه بخش GENERATOR است به صورتی که تنها هدف آن بخش دیگر فقط شکست دادن رقیب نیست و با کمک تابع هزینه ای مبنی بر Feature Matching به دنبال کاهش دادن فاصله و تفاوت آماری میان ویژگی های تصاویر اصلی و ویژگی های تصاویر ساختگی است.

به این ترتیب انجام می شود که از نرم دوم میانگین های بردارهای ویژگی استفاده می کنیم.

 

تابع f(x) بردار ویژگی های یک تصویر را از یک لایه میانی بخش DISCRIMINATOR استخراج می کند.

دقت کنید که آن میانگین ویژگی های تصاویر واقعی برای هر MINIBATCH محاسبه و سپس به روز رسانی وزن ها انجام میشود.

روش تغییر تابع هزینه بر اساس Feature Matching برای زمانی مناسب است که شبکه GAN در حین آموزش بسیار متناوب عمل می کند.

 

دوم – Minibatch discrimination

زمانی که فروپاشی گستردگی در تولیدات یا اصطلاحاً mode collapse اتفاق می افتد همه تصاویر ساختگی شبیه به هم می شوند. برای کاهش شدت این مشکل می توان تصاویر واقعی و ساختگی را در BATCH های و جداگانه به DISCRIMINATOR وارد کرد و با اندکی تغییر در آن بخش از شبکه در لایه های FULLY CONNECTED یک لایه جدید و موازی اضافه شود که وظیفه آن تشخیص شباهت تصویر وارد شده با تصاویر دیگر موجود در آن BATCH است.

این موضوع به این شکل به کمک ما می آید که اگر بخش GENERATOR دچار فروپاشی گستردگی شود و تصاویر مشابه تولید کند، بخش DISCRIMINATOR با دیدن شباهت میان تمام تصاویر یک BATCH به ساختگی بودن آن ها پی می برد.

لایه O(X) که باید به طور موازی در DISCRIMINATOR کار کند با اعمال یک TRANSFORMATION MATRIX کار می کند. شکل بخش تغییر یافته به صورت زیر است.

 

ترتیب محاسبات در آن لایه به صورت زیر است (ماتریس T همان TRANSFORMATION MATRIX است).

 

نحوه پیاده سازی این لایه و محاسبات آن خارج از حوصله این بحث است اما در مقاله زیر به طور کامل توضیح داده شده است.

Improved Techniques for Training GANs (Tim Salimans, Ian Goodfellow, Wojciech Zaremba, Vicki Cheung, Alec Radford, Xi Chen)

همچنین می توانید به منبعی که این مطلب از روی آن ترجمه شده است مراجعه کنید تا اطلاعات را به طور خلاصه تر دریافت کنید و مجبور نباشید تمام مقاله مذکور را مطالعه کنید. منبع ترجمه در انتهای این پُست آمده است.

 

سوم – One-sided label smoothing

 

همانطور که می دانید شبکه های یادگیری عمیق ممکن است دچار OVERFITTNG شوند. این مسئله در GAN ها هم محتمل است و می تواند موجب شود تا بخش GENERATOR  تنها از همان ویژگی های بسیار کم که DISCRIMINATOR برای دسته بندی استفاده می کند در تولید تصاویر بهره ببرد.

برای مقابله با این مشکل که جدی است و کیفیت شبکه را به شدت تحت تاثیر قرار می دهد، در بخش DISCRIMINATOR برچسب دادگان واقعی را SMOOTH می کنیم و برای مثال به جای ۱ ، از ۰.۹ استفاده می کنیم. بنابراین مقدار مشتقات هم بر همین اساس محاسبه می شود.

دقت کنید که این کار را برای فقط برای برچسب های دادگان واقعی انجام می دهیم.

به تکه کد زیر دقت کنید و سعی کن طبق توضیحات ما، منطق آن را برای خود توجیه کنید:

p = tf.placeholder(tf.float32, shape=[None, 10])# Use 0.9 instead of 1.0.


feed_dict = {
  p: [[0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0]] # Image with label "3"
}


# logits_real_image is the logits calculated by 
# the discriminator for real images.

d_real_loss = tf.nn.sigmoid_cross_entropy_with_logits(
                    labels=p, logits=logits_real_image)

 

چهارم – Historical averaging

راه حل مناسب و ساده ای برای جلوگیری از تناوب زیاد شبکه، نگه داری میانگینی از وزن ها در طول آموزش در BATCH های قبلی و استفاده از آن در به روز رسانی های بعدی است.

بنابراین با این روش شبکه در صورتی که بخواهد از میانگین وزن های گذشته خود فاصله بیشتری بگیرد، هزینه بیشتری متحمل خواهد شد.

شاید بتوان گفت که مشابه این را قبلاً در افزودن جمله پنالتی در تابع هزینه برای جلوگیری از OVERFIT شدن شبکه و بزرگ شدن وزن ها دیده اید.

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

طبیعتاً تابع هزینه جدید به معنای مشتقات جدید و شکل متفاوت از به روز رسانی شبکه است. پس به محاسبه مشتق از جدید تابع هزینه خود دقت داشته باشید.

مقاله ای که این روش را پیشنهاد داده، تاکید کرده که همین روش ساده در صورتی که شبکه مدام در حال نوسان در حول نقطه نهایی تعادل باشد، کمک بسیاری به همگرایی شبکه می کند.

 

پنجم – Experience replay

یکی از مواردی که باعث نوسان شبکه می شود این است که بخش DISCRIMINATOR به طور حریصانه فقط به آخرین تصاویر ساختگی که به آن وارد شده حساس می شود و در آینده با ورود دسته بعدی از تصاویر دچار نوسان می شود.

راه حل این موضوع آن است که در هر EPOCH تنها تصاویر ساختگی فعلی به DISCRIMINATOR وارد نشود و بخشی یا تمام تصاویر EPOCH قبلی هم به آن داده شود.

به این شکل DISCRIMINATOR روی تصاویر اخیر OVERFITTNG نمی شود.

 

ششم – استفاده از برچسب های دادگان واقعی (مانند شبکه CGAN)

همانطور که می دانید بسیاری از دیتاست ها با برچسب گذاری ارائه می شوند و همه دادگان موجود در آن ها برچسب دارند.

از آنجا که آموزش شبکه های GAN کاری دشوار و پرمشکل است، پس استفاده از هر اطلاعات اضافی برای راهنمایی شبکه می تواند برای آن کمک بزرگی به حساب آید.

در شبکه CGAN ما برای تولید تصاویر ساختگی از برچسب و دسته بندی تصاویر هم کمک می گیریم تا بتوانیم توزیع های آماری دقیقتری در بخش GENERATOR پدید آوریم.

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

تصویر زیر منظور نگارنده را به خوبی به نمایش در آورده است.

 

هفتم – تابع هزینه دقیق و مناسب

لیست تعدادی از توابع هزینه برای مدل های مختلف شبکه های GAN در زیر لیست شده اند. دقت کنید تا علاوه بر پیاده سازی درست، بر اساس معیار FID بهترین تابع هزینه را که با شبکه شما سازگاری دارد انتخاب کنید.

 

در جدول زیر تعدادی FID برای شبکه ای مختلف آورده شده است که معیار خوبی برای انتخاب تابع هزینه است.

 

نکته ۱: مقدار FID کمتر، بهتر است.

نکته ۲: در جدول بالا، MM GAN همان تابع هزینه اصلی در مقاله معرفی GAN است و NS GAN تابع هزینه دیگری از همان مقاله است که برای مقابله با کوچک شدن مشتقات یا اصطلاحاً vanishing gradients معرفی شده است.

 

هشتم – استفاده از BATCH NORMALIZATION

 

در مقاله های معرفی شبکه های GAN مختلف و به خصوص شبکه های جدیدتر، به طور جدی تاکید می شود که حتما از BATCH NORMALIZATION در طی آموزش شبکه استفاده شود و این مورد تاثیر بسیار مناسبی روی FID خواهد داشت.

البته توصیه هایی هم وجود دارد که پس از اتمام آموزش شبکه و برای عملیاتی سازی و استفاده از آن، عملکرد BATCH NORMALIZATION خاموش شود.

 

نهم – یا بخت و یا اقبال!

 

برخی مقادیر تصادفی و SEED هایی که برای تولید آنها به کار می رود گاهی عملکرد شبکه را بهتر می کنند. به جدول زیر دقت کنید:

 

مقادیر گزارش شده در این جدول پس از ۵۰ بار اجرا و اندازه گیری گزارش شده اند. بازه های گزارش شده نشان می دهد که معیار FID می تواند برای اجراهای مختلف تغییراتی در حد و حدود ۵ هم داشته باشد.

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

برای شما آرزوی شانس های بزرگ دارم!

 

 

ترجمه ای از مقاله اینترنتی به آدرس زیر:

GAN — Ways to improve GAN performance : https://towardsdatascience.com/gan-ways-to-improve-gan-performance-acf37f9f59b

نوشته راه هایی برای بهبود شبکه مولد رقابتی یا GAN اولین بار در اوپن مایند. پدیدار شد.