نویسنده (ها): دکتر روری برنر
در ابتدا منتشر شده در به سمت هوش مصنوعیبشر
Backpropagation سوراخ شده یک تکنیک بهینه سازی است که از نوع جدیدی از نورون مصنوعی استفاده می کند و یک به روزرسانی طولانی مدت به مدل فعلی بر اساس علوم اعصاب 1943 ارائه می دهد. نورون جدید مفهوم دندریت های مصنوعی را فوری می کند ، و موازی با قدرت محاسبه دندریت ها به سلولهای عصبی در سیستم های بیولوژیکی می افزاید. برای اطلاعات بیشتر در مورد نحوه کار نورون جدید ، اولین مقاله من را بررسی کنید در اینجابشر این مقاله یک راهنمای گام به گام از طریق فرآیند کوتاه برای اضافه کردن این ابزار به خط لوله آموزش Pytorch شما با استفاده از پایه است مثال مانیست از مخزن رسمی Pytorch.
مرحله 1
اولین قدم فقط نصب بسته است. این کار را می توان از طریق PYPI با PIP انجام داد:
pip install perforatedai
مرحله 2
مرحله دوم ، به همین ترتیب ساده ، اضافه کردن واردات به بالای اسکریپت آموزش شما است:
from perforatedai import pb_globals as PBG
from perforatedai import pb_models as PBM
from perforatedai import pb_utils as PBU
مرحله 3
مرحله بعدی تبدیل ماژول ها در مدل شما است که به روشی پیچیده می شوند که به آنها امکان اضافه کردن دندریت های مصنوعی را می دهد. این مرحله فقط شامل یک خط کد پس از ایجاد مدل است.
model = Net().to(device)
model = PBU.initializePB(model)
مرحله 4
مرحله چهارم اولین قدم است که به کدگذاری کمی بیشتر نیاز دارد. در پشت صحنه ، عملکردهای دندریتیک توسط یک شیء ردیاب پشتیبان سوراخ شده انجام می شود. این شیء سوابق پیشرفت های آموزشی را حفظ می کند و تصمیم می گیرد که چه زمان افزودن دندریت ها به ماژول های شبکه. برای بهترین عملکرد ، ردیاب همچنین بهینه ساز و برنامه ریزی را حفظ می کند. این بدان معنی است که هنگام تنظیم آنها باید تغییر زیر انجام شود.
# Original:
optimizer = optim.Adadelta(model.parameters(), lr=args.lr)
scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma)# New Format:
PBG.pbTracker.setOptimizer(optim.Adadelta)
PBG.pbTracker.setScheduler(StepLR)
optimArgs = {'params':model.parameters(),'lr':args.lr}
schedArgs = {'step_size':1, 'gamma': args.gamma}
optimizer, scheduler = PBG.pbTracker.setupOptimizer(model, optimArgs, schedArgs)
این همان بهینه ساز و برنامه ریز را با همان تنظیمات ایجاد می کند ، اما ردیاب نیز یک اشاره گر برای آنها دارد. علاوه بر این ، Optimizer.Step () باید باقی بماند ، اما Scheduler.step () باید از حلقه آموزش خارج شود.
مرحله 5
تغییر نهایی که باید انجام شود ، عبور از ردیاب نمرات اعتبار سنجی شما هر بار که چرخه اعتبار سنجی اجرا می شود. برای مثال MNIST ، این کار با اضافه کردن بلوک کد زیر به عملکرد آزمون انجام می شود:
model, restructured, trainingComplete = PBG.pbTracker.addValidationScore(100. * correct / len(test_loader.dataset),
model)
model.to(device)
if(restructured):
optimArgs = {'params':model.parameters(),'lr':args.lr}
schedArgs = {'step_size':1, 'gamma': args.gamma}
optimizer, scheduler = PBG.pbTracker.setupOptimizer(model, optimArgs, schedArgs)
return model, optimizer, scheduler, trainingComplete
اگر دندریت ها اضافه شده اند مدل یک معماری مدل جدید با همان وزنهای غیر از ماژول های جدید دندریت خواهد بود. اگر این اتفاق تازه افتاده است ، پس بازسازی شده درست خواهد بود در این دوره ها بهینه ساز و برنامه ریز باید دوباره تنظیم شوند تا به پارامترهای مدل جدید اشاره کنند. سومین خروجی عملکرد AddValidationsCore است TrainingComplete. این متغیر هنگامی صادق خواهد بود که ردیاب تصمیم بگیرد که دندریت های اضافی عملکرد را بهبود نمی بخشد. سرانجام ، تمام متغیرها باید از عملکرد آزمون برگردانده شوند تا برای دوره آموزش بعدی در دسترس باشند. از آنجا که اکنون این متغیرها برگردانده شده اند ، دو تغییر زیر نیز لازم است:
# Original test Definition:
def test(model, device, test_loader):
# New Format
def test(model, device, test_loader, optimizer, scheduler, args):# Original training loop
for epoch in range(1, args.epochs + 1):
train(args, model, device, train_loader, optimizer, epoch)
test(model, device, test_loader)
scheduler.step()
# New Format
for epoch in range(1, args.epochs + 1):
train(args, model, device, train_loader, optimizer, epoch)
model, optimizer, scheduler, trainingComplete = test(model, device, test_loader, optimizer, scheduler, args)
if(trainingComplete):
break
اولین آزمایش خود را اجرا کنید
با این کار ، شما اکنون آماده اجرای اولین آزمایش خود هستید. پس از انجام این تغییرات ، سیستم سه دندریت را اضافه می کند و سپس به شما اطلاع می دهد که هیچ مشکلی تشخیص داده نشده است. این مرحله همیشه بهتر است که ابتدا انجام شود تا اطمینان حاصل شود که هیچ مشکلی در اجرای آن ایجاد نشده است. پس از دریافت پیام موفقیت ، خط زیر را اضافه کنید تا یک آزمایش کامل انجام شود:
PBG.testingDendriteCapacity = False
با این کار ، اکنون می توانید دوباره اجرا کنید و نتایج زیر را بازتولید کنید و نشان دهنده کاهش 29 ٪ در خطای باقی مانده از مدل MNIST است.
استفاده از دندریت ها برای فشرده سازی
همانطور که ممکن است حدس زده باشید ، اضافه کردن دندریت ها به یک مدل باعث افزایش تعداد پارامتر می شود. بنابراین سوالی که من اغلب دریافت می کنم این است که آیا افزایش دقت با افزایش پارامترها به راحتی توضیح داده می شود. این طور نیست. نوع جدید نورون ها با کمک دندریت های آنها از نظر محاسباتی نسبت به همتایان منسوخ کارآمدتر هستند. این بدان معنی است که اضافه کردن دندریت ها نیز می تواند برای فشرده سازی مدل استفاده شود.
برای ساخت مدل های کاهش یافته با اضافه کردن پارامترها ، مرحله ضروری نیز با یک مدل کوچکتر از اصل شروع می شود. برای مثال MNIST این را می توان با اضافه کردن یک پارامتر عرض به تعریف مدل خود به شرح زیر انجام داد:
class Net(nn.Module):
def __init__(self, num_classes, width):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, int(32*width), 3, 1)
self.conv2 = nn.Conv2d(int(32*width), int(64*width), 3, 1)
self.dropout1 = nn.Dropout(0.25)
self.dropout2 = nn.Dropout(0.5)
self.fc1 = nn.Linear(144*int(64*width), int(128*width))
self.fc2 = nn.Linear(int(128*width), num_classes)
پس از افزودن پارامتر عرض ، می توانید تنظیمات مختلف عرض را امتحان کنید. نمودار زیر با مقدار عرض 0.61 پس از افزودن یک دندریت به مدل اصلی تولید شد:
همانطور که نمودار نشان می دهد ، مدل کاهش یافته در داده های MNIST بدتر عمل می کند ، اما همچنین کاهش عرض یک مدل با لایه های کاملاً متصل باعث کاهش درجه دوم در تعداد پارامترها می شود. اضافه کردن دندریت ها فقط با افزایش خطی همراه است. این همان چیزی است که امکان افزودن یک دندریت به هر نورون در مدل را فراهم می کند تا با دقت اصلی روبرو شود ، در حالی که مدل نهایی 44 ٪ کوچکتر از تنظیمات اصلی است.
نتیجه گیری و فراخوانی به عمل
بازگرداندن سوراخ سوراخ شده می تواند در هر سیستم مبتنی بر Pytorch برای آزمایش ادغام شود و در حال حاضر در طول آزمایش بتا رایگان است. از این سیستم می توان برای فشرده سازی مدل ها استفاده کرد (NLPبا طبقه بندی زیست فناوریبا پیش بینی سری زمانیبا چشم انداز کامپیوتر لبه) و افزایش دقت (پیش بینی سهامبا با لورابا چشم انداز کامپیوتر) تقریباً در تمام قالب های داده ای که ما آن را امتحان کرده ایم. اگر مدل شما از 40 ٪ افزایش دقت یا فشرده سازی مدل 90 ٪ با تنها دقیقه کدگذاری بهره مند می شود ، ثبت نام کنید تا یک تستر بتا باشد در اینجابشر
منتشر شده از طریق به سمت هوش مصنوعی