Sau đây là kết quả thử nghiệm đối với hàm F2 ở trên: Hình 4.21- Xấp xỉ hàm F2 bằng thuật toán TT1 với 50 mẫu Hình 4.22- Xấp xỉ hàm F2 bằng thuật toán TT1 với 150 mẫu Hình 4.23- Xấp xỉ hàm F2 bằng thuật toán TT2 với 50 mẫu Hình 4.24- Xấp xỉ hàm F2 bằng thuật toán TT2 với 150 mẫu 4.4.3. Thử nghiệm đối với hàm F3
Hàm F3 gọi là hàm Bohachevsky, có 2 biến vào và có nhiều cực trị như hình vẽ sau, giới hạn trong đoạn [-1,1].
Hình 4.25- Hàm Bohachevsky trên đoạn [-1,1]
Với trường hợp tập dữ liệu huấn luyện có 50 mẫu, tập mẫu được làm nhiễu với hệ số nhiễu là 0.1, và
mạng nơron có 20 nơron trong lớp ẩn ta có kết quả số nơron trong lớp ẩn không thay đổi như hình sau:
Hình 4.26- Xấp xỉ hàm Bohachevsky bằng thuật toán TT1 với 50 mẫu
Với trường hợp tập huấn luyện có 150 mẫu, kết quả sẽ tốt hơn như hình vẽ sau, số nơron trong lớp ẩn còn lại 19.
Hình 4.27- Xấp xỉ hàm Bohachevsky bằng thuật toán TT1 với 150 mẫu
Đối với thuật toán TT2 và trường hợp tập dữ liệu có 50 mẫu ta có kết quả sau đây.
Hình 4.29- Xấp xỉ hàm Bohachevsky bằng thuật toán TT2 với 150 mẫu
Kết quả hàm xấp xỉ của thuật toán TT1 và TT2 với tập dữ liệu có 150 mẫu sẽ cho kết quả tốt hơn. Tuy nhiên với thuật toán TT1 nếu ta xuất phát với số nơron quá lớn sẽ dẫn đến tình trạng thuật toán dừng quá sớm, cho kết quả sai số nhỏ trên tập dữ liệu huấn luyện nhưng rất nhạy cảm (thay đổi bất
thường) với các dữ liệu ngoài tập huấn luyện. Thuật toán TT2 sẽ luôn dừng lại ở một cấu hình mạng
nơron mà cho kết quả sai số đủ tốt và đối với các dữ liệu ngoài tập học.
4.5. Phụ lục - đoạn chương trình chính của thuật toán TT2
4.5.1. Thuật toán TT1
% ================================================= %
% =========== BEGIN OF DESTRUCTIVE LEARNING =============== % % ================================================= %
function varargout = destructive_learning() main_fig = figure;
pos = get(main_fig,'Position'); scr = get(0,'ScreenSize');
pos(3) = scr(3)*0.98; pos(4) = scr(4)*0.82;
pos(1) = (scr(3)-pos(3))/2; pos(2) = (scr(4)-pos(4))/3; set(main_fig,'Position',pos);
net_fig = figure;
pos = get(net_fig,'Position'); scr = get(0,'ScreenSize');
pos(1) = (scr(3)-pos(3))/2; pos(2) = (scr(4)-pos(4))/3; set(net_fig,'Position',pos);
strTitle = 'Destructive learning algorithm - DLA';
%Nhap so diem lay mau, gioi han min,max cua X
%indlg = inputdlg({'Number of data samples : ','Min of X1 data samples : ','Max of X data samples :',... % 'X Min to show : ','X Max to show : ','File name to save data samples : '},...
% strTitle,1,{'150','-10','10','-12','12','bohachevsky150.txt'}); fileName = 'bohachevsky50.txt';%indlg{6}; Sodiem = 150; %str2num(indlg{1}); XMin = -1; %str2num(indlg{2}); XMax = 1; %str2num(indlg{3}); XMinVe = -1.2; %str2num(indlg{4}); XMaxVe = 1.2; %str2num(indlg{5}); if (XMinVe > XMin), XMinVe = XMin; end if (XMaxVe < XMax), XMaxVe = XMax; end
%Ve ham so can tiem can d = 0.03;
X=XMin:d:XMax; Y=XMin:d:XMax; XY=[X ; Y];
Z = theFunction( MX , MY );
set(main_fig,'Visible','on');
handleFunction = surfc(MX,MY,Z);
title('Ham Bohachevsky trong doan [-1,1]');waitforbuttonpress;
%Sinh ra cac mau du lieu ngau nhien va lam nhieu cac mau do, sau do in ra cac mau Saiso_nhieu = 0.1; PX = XMin + (XMax-XMin)*rand(1,Sodiem); PY = XMin + (XMax-XMin)*rand(1,Sodiem); P = [PX ; PY]; T = theFunction(PX,PY); for i=1:1:Sodiem if (rand(1,1)>0.5)
T(i) = T(i) + Saiso_nhieu; else
T(i) = T(i) - Saiso_nhieu; end
end
DS=[PX' PY' T'];
%Tao mot mang neuron co so neuron trong lop an toi da, so neuron vao la 1 theNET = newff([XMin XMax;XMin XMax],[20 1],{'tansig','purelin'},'trainlm'); theNET.trainparam.min_grad = 1.0e-30;
%In ra ket qua cua mang vua tao ban dau set(net_fig,'Visible','on'); Z = net_output_meshgrid(theNET , MX , MY); handleNetwork = surfc(MX,MY,Z); title('Created Network'); waitforbuttonpress
%Huan luyen mang cho den khi sai so lan sau khong nho hon lan truoc voi mot Heso Heso_giam = 0.9; EE = SError(theNET , DS); while 1 oldNet = theNET; theNET = train(theNET , P , T ); e = SError(theNET , DS);
if ( e < EE * Heso_giam ) %sai so lan sau nho hon lan truoc thi chap nhan %In ra ket qua cua mang sau khi huan luyen ban dau - 1 neuron an if ((gcf ~= main_fig) & (gcf ~= net_fig)), delete(gcf); end
set(net_fig,'Visible','on');
Z = net_output_meshgrid(theNET , MX , MY); handleNetwork = surfc(MX,MY,Z);
title(sprintf('Training begin network - Hidden neurons=%d. Error is %0.6f. Press any button',... theNET.layers{1}.size,SError(theNET , DS)),'color','r');
EE = e; else
theNET = oldNet; break;
end end
%In ra ket qua cua mang sau khi huan luyen ban dau - 1 neuron an if ((gcf ~= main_fig) & (gcf ~= net_fig)), delete(gcf); end
set(net_fig,'Visible','on');
Z = net_output_meshgrid(theNET , MX , MY); handleNetwork = surfc(MX,MY,Z);
title(sprintf('Trained begin network - Hidden neurons=%d. Error is %0.6f. Press any button',... theNET.layers{1}.size,SError(theNET , DS)),'color','r');
waitforbuttonpress;
%Hai buoc chinh cua thuat toan DESTRUCTIVE LEARNING anpha = 0.5;
ET = SError( theNET , DS ); ETbest = ET;
%Loai bo cac nut an du thua while 1
if (theNET.layers{1,1}.size==1), break; end oldNET = theNET;
%Tinh cac ETi ETi=[];
H = theNET.layers{1,1}.size; for i=1:1:H
w = theNET.LW{2,1}(1,i); theNET.LW{2,1}(1,i) = 0; e = SError( theNET , DS ); ETi = [ETi , e];
theNET.LW{2,1}(1,i) = w; end
%Tim h sao cho ETi(h)=min(ETi) h = 1;
for i=2:1:H
if (ETi(i)<ETi(h)), h=i; end end %Thu bo nut an h for i=h:1:H-1 theNET.IW{1,1}(i,1) = theNET.IW{1,1}(i+1,1); theNET.LW{2,1}(1,i) = theNET.LW{2,1}(1,i+1); end theNET.layers{1,1}.size = H-1;
%Va huan luyen lai mang cho den khi sai so lan sau khong nho hon lan truoc ET = SError(theNET , DS);
while 1
NN = theNET;
theNET = train(theNET , P , T );
%In ra ket qua cua mang sau khi huan luyen ban dau - 1 neuron an if ((gcf ~= main_fig) & (gcf ~= net_fig)), delete(gcf); end
set(net_fig,'Visible','on');
Z = net_output_meshgrid(theNET , MX , MY); handleNetwork = surfc(MX,MY,Z);
title(sprintf('Destructing network - Hidden neurons=%d. Error is %0.6f. Press any button',... theNET.layers{1}.size,SError(theNET , DS)),'color','r'); ET = SError(theNET , DS ); else theNET = NN; break end end
%Kiem tra xem co thoa dieu kiem loai bo khong? ET = SError(theNET,DS);
if ((ET <= (1+anpha)*ETbest)) ETbest = min(ET,ETbest);
%In ra ket qua cua mang sau moi lan loai neuron if ((gcf ~= main_fig) & (gcf ~= net_fig)), delete(gcf); end set(net_fig,'Visible','on');
Z = net_output_meshgrid(theNET , MX , MY); handleNetwork = surfc(MX,MY,Z);
title(sprintf('Bohachevsky - Current destructing network : hidden neurons=%d. Total error is %0.6f',...
else
theNET = oldNET; break
end end
if ((gcf ~= main_fig) & (gcf ~= net_fig)), delete(gcf); end set(net_fig,'Visible','on');
Z = net_output_meshgrid(theNET , MX , MY); handleNetwork = surfc(MX,MY,Z);
title(sprintf('Network after destructive has %d neurons, Error=%d',theNET.layers{1,1}.size,ETbest),'Color','r'); return
% ============ END OF DESTRUCTIVE LEARNING ================ %
function out = SError( net , data ) %DSample chua cot 1 la Input va cot 2 la Target N = length(data(:,1));
Y = sim(net,[data(:,1)' ; data(:,2)']); Y = (Y-data(:,3)');
out = 1/N * sum(Y .* Y); %END
function out = net_output_meshgrid( net , X , Y) out = [];
n = length(X(:,1)); for i=1:1:n
a = sim( net, [X(i,:) ; Y(i,:)]); out = [out;a]; end %END 4.5.2. Thuật toán TT2 %============================================= %
%============= BEGIN OF CONSTRUCTIVE LEARNING ======== % %============================================= %
function varargout = constructive_learning() main_fig = figure;
pos = get(main_fig,'Position'); scr = get(0,'ScreenSize');
pos(3) = scr(3)*0.98; pos(4) = scr(4)*0.82;
pos(1) = (scr(3)-pos(3))/2; pos(2) = (scr(4)-pos(4))/3; set(main_fig,'Position',pos);
strTitle = 'Constructive learning algorithm - CLA';
%Nhap so diem lay mau, gioi han min,max cua X
indlg = inputdlg({'Number of data samples : ','Min of X data samples : ', ... 'Max of X data samples :','X Min to show : ','X Max to show : ', ... 'File name to save data samples : '},...
strTitle,1,{'150','-10','10','-12','12','data_sin1.txt'}); fileName = indlg{6};
Sodiem = str2num(indlg{1}); XMin = str2num(indlg{2}); XMax = str2num(indlg{3}); XMinVe = str2num(indlg{4}); XMaxVe = str2num(indlg{5});
if (XMinVe > XMin), XMinVe = XMin; end if (XMaxVe < XMax), XMaxVe = XMax; end
%Ve ham so can tiem can
X = [XMinVe : .1 : XMaxVe]; myXData = X; Y = theFunction( X );
xlim(minmax(X)); ylim(minmax(Y));
handleFunction = plot(X,Y,'-r','linewidth',2); hold on;
%Sinh ra cac mau du lieu ngau nhien va lam nhieu cac mau do, sau do in ra cac mau Saiso_nhieu = 0.2;
P = XMin + (XMax-XMin)*rand(1,Sodiem); P = sort(P);
T = theFunction(P); T = T + (0.5-rand(1,Sodiem)) * Saiso_nhieu; DS = [P' , T']; handleDatasample = plot(P,T,'kx');
%Ghi du lieu mau vao tep fid = fopen(fileName,'w'); fprintf(fid,'%d',Sodiem); for i=1:1:Sodiem fprintf(fid,'\n %0.6f %0.6f',DS(i,1),DS(i,2)); end fclose(fid);
theNET = newff([XMinVe XMaxVe],[1 1],{'tansig','purelin'},'trainlm'); theNET.trainparam.min_grad = 1.0e-30;
theNET.trainparam.mu_max = 1.0e+30; %In ra ket qua cua mang vua tao ban dau Y = sim(theNET , X);
handleNetwork = plot(X,Y,'-m');
title(sprintf('Created network. Error is %0.6f. Press any button',SError(theNET , DS))); waitforbuttonpress; title('');
%Huan luyen mang cho den khi sai so lan sau khong nho hon lan truoc voi mot Heso Heso_giam = 0.95; EE = SError(theNET , DS); mySTOP=0; while 1 oldNet = theNET; theNET = train(theNET , P , T ); e = SError(theNET , DS);
if ( e < EE * Heso_giam ) %sai so lan sau nho hon lan truoc thi chap nhan if (mySTOP==1), break; end
EE = e; else theNET = oldNet; break; end end
%In ra ket qua cua mang sau khi huan luyen ban dau - 1 neuron an if (gcf ~= main_fig), delete(gcf); end
delete(handleNetwork); Y = sim(theNET , X);
handleNetwork = plot(X,Y,'-m');
title(sprintf('Trained begining network - Hidden neurons=%d. Error is %0.6f. Press any button',... theNET.layers{1}.size,SError(theNET , DS)),'color','r');
waitforbuttonpress;
%Them cac neuron cho den khi sai so dat duoc khong giam sau moi lan them mySTOP = 0; myFirstWeight = 0.1;
oldError = SError(theNET, DS); Heso_giam_khi_them = 1; while 1
if (mySTOP==1), break; end %Luu mang truoc khi them oldNET = theNET;
%Them mot neuron an va dat gia tri trong so ban dau la myFirstWeight H = theNET.layers{1}.size + 1;
theNET.layers{1}.size = H;
theNET.IW{1}(H) = myFirstWeight; theNET.LW{2,1}(H) = myFirstWeight; %Huan luyen lai mang sau khi them oldEE = SError(theNET , DS);
while 1
oldNN = theNET; theNET = train(theNET, P , T); e = SError(theNET,DS); if (e < oldEE * Heso_giam) oldEE = e; else theNET = oldNN; break; end end e = SError(theNET,DS); if (e < oldError * Heso_giam_khi_them) oldError = e;
%In ra ket qua cua mang sau moi lan them neuron if (gcf ~= main_fig), delete(gcf); end
delete(handleNetwork); Y = sim(theNET , X);
handleNetwork = plot(X,Y,'-m');
title(sprintf('SIN - Current network : hidden neurons=%d. Total error is %0.6f',... theNET.layers{1}.size,SError(theNET , DS)),'color','k'); else theNET = oldNET; break; end end
%In ra ket qua cua mang sau khi huan luyen ban dau - 1 neuron an if (gcf ~= main_fig), delete(gcf); end
delete(handleNetwork); Y = sim(theNET , X);
handleNetwork = plot(X,Y,'-m');
title(sprintf('Constructed network - Hidden neurons=%d. Error is %0.6f. Press any button',... theNET.layers{1}.size,SError(theNET , DS)),'color','r');
waitforbuttonpress;
closereq
KẾT LUẬN
Trong bản luận văn này, chúng tôi đã phân tích những cơ sở toán học đảm bảo cho việc luyện tham số mạng nơron. Sau đó giới thiệu một số cấu trúc mạng nơron thường được sử dụng hiện nay cùng với một số thuật toán huấn luyện. Ứng dụng cho vấn đề xấp xỉ hàm mà chúng tôi đã chọn để thực hiện là một trong rất nhiều ứng dụng của mạng nơron hiện nay.
Tuy nhiên thực tế có nhiều vấn đề rất khó hoặc không thể thu thập được thông tin đầy đủ để thiết kế một cấu trúc mạng hợp lý, do vậy xu hướng nghiên cứu là phải điều chỉnh lại cấu trúc trong quá trình luyện mạng. Và chúng tôi đã trình bày hai tiếp cận cho việc xây dựng một cấu trúc mạng nơron để giải quyết vấn đề trên, và đã đề xuất một phương pháp mới là sự kết hợp giữa hai phương pháp trên.
Trên đây mới chỉ là một vài tiếp cận để xây dựng mạng nơron cho một bài toán ứng dụng xấp xỉ hàm. Trong thực tế có rất nhiều vấn đề đang chờ đợi các kết quả nghiên cứu của mạng nơron, và đó sẽ là các phương pháp luyện cấu trúc cùng với luyện tham số sẽ đem lại những kết quả tốt hơn cho việc ứng dụng.
TÀI LIỆU THAM KHẢO Tài liệu tiếng Việt
1. Bùi Công Cường, Nguyễn Doãn Phước (2001), Hệ mờ, mạng nơron
và ứng dụng, Nhà xuất bản Khoa học kỹ thuật.
2. Bùi Công Cường, Dương Thăng Long, Lê Quang Phúc (2003), Mấy
quy trình phân lớp và rút tỉa các luật bằng công cụ mạng nơron, Báo cáo hội thảo "Nghiên cứu cơ bản và ứng dụng Công nghệ thông tin" tháng 10/2003.
Tài liệu tiếng Anh
3. Martin T.Hagan, Howard B. Demuth, Mark Beale (1996), Neural
Network Design, PWS Publishing Company.
4. Chin-Teng Lin, C.S. George Lee, Neural Fuzzy Systems, Prentice- Hall International, Inc.
5. James C.Bezdek, Didier Dubois, Henri Prade (1999), Fuzzy sets in approximate reasoning and information systems, Kluwer Academic Publishers.
6. Nguyen Hoang Phuong, Koichi Yamada (2001), Proceedings of the Second Vietnam-Japan Sysposium on Fuzzy Systems and Applications, Institute of Information Technology (IOIT).
7. Robert J. Schalkoff (1997), Artifical Neural Networks, McGraw-hill International Editions.
8. Rudy Setiono, Wee Kheng Leow, Jacek M. Zurada,
9. Proceedings of the Ninteenth Annual SAS Users Group International Conference (1994), Neural Networks and Statistical Models, Warren S. Sarle, SAS Institute Inc.
10. Pero J. Radonja (2001), Neural network based model of a highly nonlinear process, Telekomunikacioni Forum Telfor'2001.
11. Kar-Ann Toh, Juwei Lu, Wei-Yun Yau, Global Feedforward Neural
Network Learning for Classification and Regression, Centre for Signal Processing School of Electrical & Electronic Engineering Nanvang Technological Univertsity.
12. Tin-Yau Kwok, Dit-Yan Yeung (1997), Consructive Algortihms for
Structure Learning in Feedforward Neural Networks for Regression Problems, IEEE Transaction on Neural Network.
13. Clin Campell, Constructive Learing Techniques for Designing
Neural Network Systems, Advanced Computing Research Centre -University of Bristol, England.