شعار زيفيرنت

نصائح PyTorch لتعزيز إنتاجيتك – KDnuggets

التاريخ:

نصائح PyTorch لتعزيز إنتاجيتك
صورة المؤلف
 

هل سبق لك أن قضيت ساعات في تصحيح أخطاء نموذج التعلم الآلي ولكن لا يبدو أنك تجد سببًا لعدم تحسن الدقة؟ هل شعرت يومًا أن كل شيء يجب أن يعمل بشكل مثالي ولكن لسبب غامض لا تحصل على نتائج مثالية؟

حسنا لا أكثر. قد يكون استكشاف PyTorch كمبتدئ أمرًا شاقًا. في هذه المقالة ، تستكشف تدفقات العمل التي تم تجربتها واختبارها والتي ستعمل بالتأكيد على تحسين نتائجك وتعزيز أداء نموذجك.

هل سبق أن قمت بتدريب نموذج لساعات على مجموعة بيانات كبيرة فقط لتجد أن الخسارة لا تتناقص وأن الدقة تتسطح فقط؟ حسنًا، قم بالتحقق من سلامة العقل أولاً.

قد يستغرق التدريب والتقييم على مجموعة كبيرة من البيانات وقتًا طويلاً، ومن الأسهل تصحيح أخطاء النماذج أولاً على مجموعة فرعية صغيرة من البيانات. بمجرد التأكد من أن النموذج يعمل، يمكننا بسهولة توسيع نطاق التدريب ليشمل مجموعة البيانات الكاملة.

بدلاً من التدريب على مجموعة البيانات بأكملها، تدرب دائمًا على دفعة واحدة لإجراء فحص سلامة.

batch = next(iter(train_dataloader)) # Get a single batch # For all epochs, keep training on the single batch.
for epoch in range(num_epochs): inputs, targets = batch predictions = model.train(inputs)

 

ضع في اعتبارك مقتطف الكود أعلاه. لنفترض أن لدينا بالفعل أداة تحميل بيانات التدريب ونموذجًا. بدلاً من التكرار على مجموعة البيانات الكاملة، يمكننا بسهولة جلب الدفعة الأولى من مجموعة البيانات. يمكننا بعد ذلك التدريب على دفعة واحدة للتحقق مما إذا كان النموذج يمكنه تعلم الأنماط والتباين ضمن هذا الجزء الصغير من البيانات.

إذا انخفضت الخسارة إلى قيمة صغيرة جدًا، فإننا نعلم أن النموذج يمكنه تجاوز هذه البيانات ويمكنه التأكد من أنه يتعلم في وقت قصير. يمكننا بعد ذلك تدريب ذلك على مجموعة البيانات الكاملة بمجرد تغيير سطر واحد على النحو التالي:

# For all epochs, iterate over all batches of data.
for epoch in range(num_epochs): for batch in iter(dataloader): inputs, targets = batch predictions = model.train(inputs)

 

إذا كان النموذج قادرًا على تجاوز دفعة واحدة، فيجب أن يكون قادرًا على تعلم الأنماط الموجودة في مجموعة البيانات الكاملة. تعمل طريقة الدفعات المتراكبة هذه على تمكين تصحيح الأخطاء بشكل أسهل. إذا لم يتمكن النموذج من تجاوز دفعة واحدة، فيمكننا التأكد من وجود مشكلة في تنفيذ النموذج وليس في مجموعة البيانات.

بالنسبة لمجموعات البيانات التي لا يكون فيها تسلسل البيانات مهمًا، فمن المفيد خلط البيانات عشوائيًا. على سبيل المثال ، بالنسبة لمهام تصنيف الصور ، سوف يلائم النموذج البيانات بشكل أفضل إذا تم تغذيتها بصور من فئات مختلفة داخل دفعة واحدة. وبتمرير البيانات بنفس التسلسل، فإننا نخاطر بتعلم النموذج للأنماط بناءً على تسلسل البيانات التي تم تمريرها، بدلاً من تعلم التباين الجوهري داخل البيانات. لذلك، من الأفضل تمرير البيانات المختلطة. لهذا، يمكننا ببساطة استخدام كائن DataLoader الذي توفره PyTorch وضبط التبديل العشوائي على True.

from torch.utils.data import DataLoader dataset = # Loading Data
dataloder = DataLoader(dataset, shuffle=True)

 

علاوة على ذلك ، من المهم تطبيع البيانات عند استخدام نماذج التعلم الآلي. إنه ضروري عندما يكون هناك تباين كبير في بياناتنا ، ومعلمة معينة لها قيم أعلى من جميع السمات الأخرى في مجموعة البيانات. يمكن أن يتسبب هذا في سيطرة إحدى المعلمات على جميع المعلمات الأخرى ، مما يؤدي إلى انخفاض الدقة. نريد أن تقع جميع معلمات الإدخال ضمن نفس النطاق، ومن الأفضل أن يكون متوسطها 0 وتباينها 1.0. لهذا، يتعين علينا تحويل مجموعة البيانات لدينا. بمعرفة متوسط ​​وتباين مجموعة البيانات ، يمكننا ببساطة استخدام الدالة torchvision.transforms.Normalize.

import torchvision.transforms as transforms image_transforms = transforms.Compose([ transforms.ToTensor(), # Normalize the values in our data transforms.Normalize(mean=(0.5,), std=(0.5))
])

 

يمكننا تمرير الوسط الحسابي لكل قناة والانحراف المعياري في التحويلات. وظيفة التسوية ، وستقوم تلقائيًا بتحويل البيانات التي تحتوي على متوسط ​​0 وانحراف معياري قدره 1.

يعد انفجار التدرج مشكلة معروفة في RNNs وLSTMs. ومع ذلك، فإنه لا يقتصر فقط على هذه البنى. يمكن أن يعاني أي نموذج ذو طبقات عميقة من التدرجات المتفجرة. يمكن أن يؤدي الانتشار العكسي على التدرجات العالية إلى التباعد بدلاً من الانخفاض التدريجي في الخسارة.

خذ بعين الاعتبار مقتطف التعليمات البرمجية أدناه.

for epoch in range(num_epochs): for batch in iter(train_dataloader): inputs, targets = batch predictions = model(inputs) optimizer.zero_grad() # Remove all previous gradients loss = criterion(targets, predictions) loss.backward() # Computes Gradients for model weights # Clip the gradients of model weights to a specified max_norm value. torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1) # Optimize the model weights AFTER CLIPPING optimizer.step()

 

لحل مشكلة التدرج اللوني المتفجر ، نستخدم تقنية القطع المتدرج التي تقطع قيم التدرج ضمن نطاق محدد. على سبيل المثال ، إذا استخدمنا 1 كقيمة قص أو معيارية كما هو مذكور أعلاه ، فسيتم قص جميع التدرجات اللونية في النطاق [-1 ، 1]. إذا كانت قيمة التدرج اللوني المتفجر هي 50 ، فسيتم قصها إلى 1. وبالتالي ، يعمل قص التدرج على حل مشكلة التدرج المتفجر مما يسمح بتحسين بطيء للنموذج نحو التقارب.

سيؤدي هذا السطر الفردي من الكود إلى زيادة دقة اختبار نموذجك بالتأكيد. دائمًا ما يستخدم نموذج التعلم العميق طبقات التسرب والتطبيع. هذه مطلوبة فقط للتدريب المستقر والتأكد من أن النموذج لا يتفوق أو يتباعد بسبب التباين في البيانات. توفر الطبقات مثل BatchNorm و Dropout تنظيمًا لمعلمات النموذج أثناء التدريب. ومع ذلك، بمجرد تدريبهم لا تكون هناك حاجة إليها. يؤدي تغيير النموذج إلى وضع التقييم إلى تعطيل الطبقات المطلوبة للتدريب فقط ويتم استخدام معلمات النموذج الكاملة للتنبؤ.

للحصول على فهم أفضل، فكر في مقتطف الشفرة هذا.

for epoch in range(num_epochs): # Using training Mode when iterating over training dataset model.train() for batch in iter(train_dataloader): # Training Code and Loss Optimization # Using Evaluation Mode when checking accuarcy on validation dataset model.eval() for batch in iter(val_dataloader): # Only predictions and Loss Calculations. No backpropogation # No Optimzer Step so we do can omit unrequired layers.

 

عند التقييم، لا نحتاج إلى إجراء أي تحسين لمعلمات النموذج. نحن لا نحسب أي تدرجات أثناء خطوات التحقق من الصحة. للحصول على تقييم أفضل، يمكننا بعد ذلك حذف طبقات التسرب وطبقات التسوية الأخرى. على سبيل المثال، سيتم تمكين جميع معلمات النموذج بدلاً من مجموعة فرعية من الأوزان فقط كما هو الحال في طبقة التسرب. سيؤدي هذا إلى زيادة دقة النموذج بشكل كبير حيث ستتمكن من استخدام النموذج الكامل.

عادةً ما يرث نموذج PyTorch من الفئة الأساسية torch.nn.Module. وفقا للوثائق:

سيتم تسجيل الوحدات الفرعية المعينة بهذه الطريقة وسيتم تحويل معلماتها أيضًا عند الاتصال ل()، الخ.

ما تسمح به فئة قاعدة الوحدة النمطية هو تسجيل كل طبقة داخل النموذج. يمكننا بعد ذلك استخدام model.to () والوظائف المماثلة مثل model.train () و model.eval () وسيتم تطبيقها على كل طبقة داخل النموذج. لن يؤدي عدم القيام بذلك إلى تغيير الجهاز أو وضع التدريب لكل طبقة مضمنة في النموذج. سيكون عليك القيام بذلك يدويًا. ستقوم فئة الوحدة الأساسية بإجراء التحويلات تلقائيًا نيابةً عنك بمجرد استخدام وظيفة على كائن النموذج.

علاوة على ذلك، تحتوي بعض النماذج على طبقات متسلسلة مماثلة يمكن تهيئتها بسهولة باستخدام حلقة for ومضمنة في قائمة. وهذا يبسط الكود. ومع ذلك، فإنه يسبب نفس المشكلة المذكورة أعلاه، حيث لا يتم تسجيل الوحدات الموجودة في قائمة Python البسيطة تلقائيًا داخل النموذج. يجب علينا استخدام ModuleList لاحتواء الطبقات المتسلسلة المماثلة داخل النموذج.

import torch
import torch.nn as nn # Inherit from the Module Base Class
class Model(nn.Module): def __init__(self, input_size, output_size): # Initialize the Module Parent Class super().__init__() self.dense_layers = nn.ModuleList() # Add 5 Linear Layers and contain them within a Modulelist for i in range(5): self.dense_layers.append( nn.Linear(input_size, 512) ) self.output_layer = nn.Linear(512, output_size) def forward(self, x): # Simplifies Foward Propogation. # Instead of repeating a single line for each layer, use a loop for layer in range(len(self.dense_layers)): x = layer(x) return self.output_layer(x)

 

يوضح مقتطف الشفرة أعلاه الطريقة الصحيحة لإنشاء النموذج والطبقات الفرعية مع النموذج. يساعد استخدام الوحدة النمطية وقائمة الوحدة النمطية في تجنب الأخطاء غير المتوقعة عند تدريب النموذج وتقييمه.

الطرق المذكورة أعلاه هي أفضل الممارسات لإطار التعلم الآلي PyTorch. يتم استخدامها على نطاق واسع وتوصي بها وثائق PyTorch. يجب أن يكون استخدام مثل هذه الأساليب هو الطريقة الأساسية لتدفق تعليمات برمجية للتعلم الآلي، ومن المؤكد أنه سيؤدي إلى تحسين نتائجك.
 
 
محمد ارهم مهندس التعلم العميق يعمل في رؤية الكمبيوتر ومعالجة اللغة الطبيعية. لقد عمل على نشر وتحسين العديد من تطبيقات الذكاء الاصطناعي التي وصلت إلى أعلى المخططات العالمية في Vyro.AI. إنه مهتم ببناء وتحسين نماذج التعلم الآلي للأنظمة الذكية ويؤمن بالتحسين المستمر.
 

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة