بعد حديثنا عن شبكات واسترسين الخصمية التوليدية في المقال السابق ، نتحدث اليوم عن إمتداد لهذه الشبكات يسمى شبكة واسرستين الخصمية التوليدية مع عقوبة الإشتقاق يعد إطار (Wasserstein GAN–Gradient Penalty ) أو بإختصار WGAN-GP
شبكة واسرستين الخصمية التوليدية مع عقوبة الإشتقاق
يتم تعريف مولد WGAN-GP وتجميعه بنفس الطريقة تمامًا مثل مولد WGAN. إن تعريف وتجميع الناقد (critic) فقط هو ما نحتاج إلى تغييره.
بإختصار ، هناك ثلاثة تغييرات نحتاج إلى إجرائها على ناقد WGAN لدينا لتحويله إلى ناقد WGAN-GP:
- تضمين مصطلح عقوبة الإشتقاق في دالة خسارة النقد.
- لن نقوم بقص أوزان الناقد.
- لا نستخدم طبقات تسوية الحزم (batch normalization) في الناقد.
لنبدأ برؤية كيف يمكننا بناء مصطلح عقوبة الإشتقاق في دالة الخسارة لدينا. في الورقة البحثية التي تقدم هذا المتغير ، اقترح المؤلفون طريقة بديلة لفرض قيود Lipschitz على الناقد. بدلاً من قص أوزان الناقد ، فإنهم يوضحون كيف يمكن فرض القيد مباشرةً من خلال تضمين مصطلح في دالة الخسارة يعاقب النموذج إذا انحرف معيار الإشتقاق للناقد عن 1. هذه طريقة إنسيابية أكثر لتحقيق القيد و إعطاء نتائج كثر استقرارًا في عملية تدريب .
خسارة عقوبة الإشتقاق
الشكل التالي هو رسم تخطيطي لعملية تدريب الناقد.
إذا قارنا هذا بعملية تدريب المميز الأصلية في شبكات الخصومة التوليديه ، الموضحه أدناه
يمكننا أن نرى أن الإضافة الرئيسية هي خسارة عقوبة الإشتقاق المتضمنة كجزء من دالة الخسارة الكلية ، جنبًا إلى جنب مع خسارة Wasserstein من الصور الحقيقية والمزيفة.
تقيس خسارة عقوبة الإشتقاق الفرق التربيعي بين معيار الإشتقاق للتنبؤات فيما يتعلق بالصور المدخلة و 1. يميل النموذج بشكل رئيسي للعثور على الأوزان التي تضمن تقليل مدة عقوبة الإشتقاق ، وبالتالي تشجيع النموذج على التوافق لقيد Lipschitz.
من الصعب حساب هذا الإشتقاق في كل مكان أثناء عملية التدريب ، لذا بدلاً من ذلك ، يقوم WGAN-GP بتقييم الإشتقاق عند عدد قليل من النقاط فقط. لضمان مزيج متوازن ، نستخدم مجموعة من الصور المتداخلة (interpolated images) التي تقع في نقاط مختارة عشوائيًا على طول الخطوط التي تربط مجموعة الصور الحقيقية بمجموعة الصور المزيفة بشكل زوجي ، كما هو موضح في الصورة أدناه .
تدريب wgan-GP
في Keras ، يمكننا إنشاء طبقة المتوسط الموزون العشوائي ( RandomWeightedAverage ) لإجراء عملية التداخل هذه ، عن طريق الإستعانه بطبقة _Merge:
class RandomWeightedAverage(_Merge): def __init__(self, batch_size): super().__init__() self.batch_size = batch_size def _merge_function(self, inputs): alpha = K.random_uniform((self.batch_size, 1, 1, 1)) #1 return (alpha * inputs[0]) + ((1 - alpha) * inputs[1]) #2
1- تحصل كل صورة في الحزمة على رقم عشوائي ، بين 0 و 1 ، يتم تخزينه على هيئة المتجه ألفا.
2- تقوم الطبقة بإرجاع مجموعة الصور المتداخلة والتي تقع على طول الخطوط التي تربط الصور الحقيقية (المدخلات [0]) بالصور المزيفة (المدخلات [1]) ، زوجيًا ، موزوونه بقيمة alpha لكل زوج.
ترجع الدالة gradient_penalty_loss الموضحة أدناه الفرق التربيعي بين االإشتقاق المحسوب في النقاط المتداخلة و 1.
def gradient_penalty_loss(y_true, y_pred, interpolated_samples): gradients = K.gradients(y_pred, interpolated_samples)[0] #1 gradient_l2_norm = K.sqrt( K.sum( K.square(gradients), axis=[1:len(gradients.shape)] ) ) ) #2 gradient_penalty = K.square(1 - gradient_l2_norm) return K.mean(gradient_penalty) #3
1- تحسب دالة gradients إشتقاقات تنبؤات الصور المتاخلة (y_pred) بالنسبة للمدخل (interpolated_sample).
2- نحسب معيار L2 لهذا المتجه (أي طوله الإقليدي (Euclidean length) ).
3- ترجع الدالة المسافة التربيعية بين L2 و 1.
الآن بعد أن أصبح لدينا طبقة RandomWeightedAverage التي يمكنها إنشاء تداخلات بين صورتين ودالة الخسارة gradient_penalty_loss التي يمكنها حساب خسارة الإشتقاق للصور المتداخلة ، يمكننا استخدام كلاهما في تجميع النموذج للناقد.
تجميع ناقد WGAN_GP
في حالة WGAN ، قمنا بتجميع الناقد مباشرةً ، للتنبؤ بما إذا كانت صورة معينة حقيقية أم مزيفة. لتجميع ناقد WGAN-GP ، نحتاج إلى استخدام الصور المتداخلة في دالة الخسارة – ومع ذلك ، لا يسمح Keras إلا بدالة خسارة مخصصة بمعييارين ، التنبؤات (predictions) و التصنيفات الحقيقية (true labels). للتغلب على هذه المشكلة ، نستخدم أحد دوال بايثون المسماة partial .
from functools import partial ### COMPILE CRITIC MODEL self.generator.trainable = False #1 real_img = Input(shape=self.input_dim) #2 z_disc = Input(shape=(self.z_dim,)) fake_img = self.generator(z_disc) fake = self.critic(fake_img) #3 valid = self.critic(real_img) interpolated_img = RandomWeightedAverage(self.batch_size)([real_img, fake_img]) #4 validity_interpolated = self.critic(interpolated_img) partial_gp_loss = partial(self.gradient_penalty_loss, interpolated_samples = interpolated_img) #5 partial_gp_loss.__name__ = 'gradient_penalty' #6 self.critic_model = Model(inputs=[real_img, z_disc], outputs=[valid, fake, validity_interpolated])#7 self.critic_model.compile( loss=[self.wasserstein,self.wasserstein, partial_gp_loss] ,optimizer=Adam(lr=self.critic_learning_rate, beta_1=0.5) ,loss_weights=[1, 1, self.grad_weight] ) #8
1- قمنا بتجميد أوزان المولد. يشكل المولد جزءًا من النموذج الذي نستخدمه لتدريب الناقد ، حيث أن الصور المتداخلة تشارك الآن بفعالية في دالة الخسارة ، لذلك هذا مطلوب.
2- هناك نوعان من المدخلات في النموذج: مجموعة الصور الحقيقية ومجموعة من الأرقام التي يتم إنشاؤها عشوائيًا والتي تُستخدم لإنشاء مجموعة الصور المزيفة.
3- الصور الحقيقية والمزيفة تمرر من خلال الناقد لحساب خسارة واسرستين.
4- تُنشئ طبقة RandomWeightedAverage الصور المتداخلة ، والتي يتم تمريرها أيضًا من خلال الناقد.
5- يتوقع Keras دالة خسارة مع مدخلين فقط – التنبؤات واو التصنيفات الحقيقية – لذلك نحدد وظيفة خسارة مخصصة ، partial_gp_loss ، باستخدام دالة partial لتمرير الصور المتداخلة من خلال دالة gradient_penalty_loss الخاصة بنا.
6- يتطلب Keras تسمية الدالة .
7- يتم تعريف النموذج الذي يدرب الناقد على أنه يحتوي على مدخلين: مجموعة الصور الحقيقية والمدخل العشوائي الذي سيولد مجموعة الصور المزيفة. يحتوي النموذج على ثلاثة مخرجات: 1 للصور الحقيقية ، و -1 للصور المزيفة ، والمتجه الوهمي 0 ، والذي لا يتم استخدامه فعليًا ولكن مطلوب من قبل Keras حيث يجب تعيين كل دالة خسارة لمخرج. لذلك ، قمنا بإنشاء المتجه الوهمي 0 لتعيين وظيفة partial_gp_loss.
8- نقوم بتجميع الناقد بثلاث وظائف خسارة: خسارتي واسرستين للصور الحقيقية والمزيفة ، وخسارة عقوبة الإشتقاق . الخسارة الإجمالية هي مجموع الخسائر الثلاثة ، مع ترجيح خسارة اللإشتقاق بمعامل 10 ، تمشيا مع التوصيات الواردة في الورقة الأصلية. نحن نستخدم مُحسِّن Adam ، والذي يُعتبر عمومًا أفضل مُحسِّن لنماذج WGAN-GP.
تحليل WGAN-GP
قمنا بإستخدام النموذج على مجموعة بيانات CelebA
أولاً ، دعنا نلقي نظرة على بعض مخرجات الأمثلة من المولد ، بعد 3000 حزمة تدريب.
من الواضح أن النموذج قد تعلم السمات المهمة عالية المستوى للوجه ، ولا توجد علامة على انهيار الوضع.
يمكننا أيضًا أن نرى كيف تتطور دالة الخسارة في النموذج بمرور الوقت. سنرى بأم دالتي الخسارة لكل من المميّز والمولد مستقرة للغاية ومتقاربة.
إذا قارنا إخراج WGAN-GP بإخراج شبكات الترميز التلقائي المتغيرة VAE ، يمكننا أن نرى أن صور GAN أكثر وضوحًا بشكل عام – لا سيما التعريف بين الشعر والخلفية. بشكل عام. تميل VAEs إلى إنتاج صور أكثر نعومة تشوش حدود الألوان ، بينما من المعروف أن GANs تنتج صورًا أكثر وضوحًا وأكثر تحديدًا.
من الصحيح أيضًا أن تدريب شبكات GAN بشكل عام أكثر صعوبة من تدريب VAEs وتستغرق وقتًا أطول للوصول إلى جودة مرضية. ومع ذلك ، فإن معظم النماذج التوليدية الحديثة اليوم تعتمد على GAN ،لأن النتيجة النهائية تستحق كل هذا العناء .
رابط الدفتر على غيتهاب
إضافة تعليق