مشکل Over fitting
یکی از چالشهای رایج در آموزش و استفاده از شبکههای عصبی مصنوعی، گیر افتادن در مشکل بیشبرازش (Overfitting) است. در واقع، ریشه مشکل به اینجا برمیگردد که شبکه عصبی بیش از حد بر دادههای آموزش فیت شده به طوری که در تخمین دادههای آموزش دقت بالایی را از خود نشان میدهد. اما وقتی به سراغ تخمین دادههای دیگر با استفاده از شبکه عصبی میرویم، متوجه میشویم که دقت پایینی داشته و تخمین نامناسبی ارائه میگردد.
برای برطرف کردن مشکل بیشبرازش، روشهای مختلفی ارائه شده است که از جمله آنها میتوان به Dropout، BatchNormalization و Regularization اشاره نمود (برای آشنایی با این روش ها شما را به شرکت در این دوره دعوت می کنیم.) منتها در این پست آموزشی، قصد داریم تا قدری در رابطه با روش دیگری تحت عنوان آموزش چندگانه (Multiple Training) که کمتر به آن پرداخته شده است صحبت کنیم.
آشنایی با روش آموزش چند گانه
کاری که در روش آموزش چند گانه انجام می گردد این است که به جای تنها یک بار آموزش شبکه عصبی و استفاده از آن برای پیش بینی داده ها، پروسه آموزش چند بار تکرار می گردد و پس از هر بار آموزش، شبکه آموزش دیده شده ذخیره گردد. بدین ترتیب برداری از شبکه های عصبی آموزش دیده شده حاصل می گردد که از تک تک آنها می توان برای پیش بینی استفاده نمود. این پروسه به صورت شماتیک در شکل 1 نمایش داده شده است.
چنین فرآیندی ابزاری را در اختیار کاربر میگذارد که به واسطه آن می توان برای هر داده ست جدید به تعداد شبکه های عصبی موجود خروجی گرفت. سپس خروجی نهایی را می توان از میانگین پیش بینی های بدست آمده محاسبه نمود. این کار باعث می گردد که تعمیم پذیری مدل به مقدار قابل توجهی افزایش یابد، به خصوص زمانی که مشکل ناشی از وجود نویز در داده ها یا تعداد کم داده های آموزش باشد.
پیاده سازی روش آموزش چندگانه در محیط متلب
برای تشریح روش آموزش چند گانه مثالی را در محیط متلب مطرح می کنیم. فرض کنید می خواهیم از یک شبکه عصبی پیشخور (feedforward neural network) برای تخمین داده استفاده نماییم. برای اینکار از یکی از داده ست های پیش فرض متلب تحت عنوان bodyfat dataset استفاده می کنیم. برای وارد کردن این داده ست در محیط متلب ی توانید از دستور زیر استفاده نمایید:
[x,y] = bodyfat_dataset;
این داده ست شامل 13 متغیر ورودی و یک متغیر خروجی می باشد که 252 نمونه داده از آنها موجود است. تعداد نمونه داده های موجود را می توان به شکل زیر محاسبه نمود:
DataNum = size(x,2);
در ادامه با استفاده از دستور randperm می توان داده ها را به صورت تصادفی به دو دسته آموزش و تست دسته بندی نمود:
TrNum = floor(0.9*DataNum);
TsNum = DataNum - TrNum;
R = randperm(DataNum);
trIndex = R(1:TrNum);
tsIndex = R(1+TrNum:end);
xtr = x(:,trIndex);
ytr = y(:,trIndex);
xts = x(:,tsIndex);
yts = y(:,tsIndex);
در ادامه به تعریف معماری یک شبکه عصبی پیشخور پرداخته و سپس در یک حلقه for پانزده بار آن را آموزش داده و نتایج را در یک cell ذخیره می کنیم:
net = feedforwardnet(10);
numANN = 15;
nets = cell(1,numANN);
for i = 1:numANN
fprintf('Training %d/%d\n',i,numANN)
nets{i} = train(net,xtr,ytr);
end
حالا کافیست که از همه این پانزده شبکه عصبی برای تخمین داده های تست استفاده کرده، و خروجی نهایی را با استفاده از میانگین گیری از همه داده ها محاسبه نمود. برای این کار می توان از دستورات زیر استفاده نمود:
perfs = zeros(1,numANN);
y2Total = 0;
for i = 1:numANN
neti = nets{i};
y2 = neti(xts);
perfs(i) = mse(neti,yts,y2);
y2Total = y2Total + y2;
end
y2Ave = y2Total/numANN;
perAve = mse(nets{1},yts,y2Ave);
بدین ترتیب به جای استفاده از خروجی بدست آمده از یک شبکه عصبی تنها، از میانگین نتایج حاصل از پانزده شبکه عصبی به عنوان خروجی نهایی استفاده می کنیم که می تواند نسبت به قبل قابل اعتمادتر باشد.
توضیحات روش از زبان استاد
توضیحات مربوط به این پست از زبان استاد را می توانید در لینک های زیر مشاهده بفرمایید: