3.3.1. Thiết lập và mô phỏng mạng Perceptron trên Matlab
+ Mô hình mạng nơron Perceptron trên Matlab
Hình 3.17. Mô hình mạng nơron Perceptron trên Simulink
+ Thiết lập mạng Perceptron
Để thiết lập mạng nơron perceptron trên Matalb ta dùng lệnh newp với cú pháp:
96 Trong đó PR là ma trận Rx2 vùng các giá trị của tín hiệu vào (min và max), S là số nơron. Perceptron tạo ra với ma trận trọng số và vector phân cực bằng 0.
Lưu ý: Khi dùng lệnh này mà ta không dùng dấu (;) ở cuối câu lệnh thì trên cửa sổ CommandWindow của Matlab sẽ hiển thị đầy đủ thông tin về cấu trúc mạng vừa khởi tạo và các hàm lệnh liên quan. Dưới đây sẽ trình bày một số lệnh đó.
Ví dụ: Tạo perceptron có hai ngõ vào tầm [-2,2] và một nơron:
net=newp([-2 2;-2 2],1)
Muốn đặt trước các trọng số và bias ta dùng lệnh sau:
net.IW{1,1}=[-1 1]; net.b{1}=1;
Muốn tìm đáp ứng ra của mạng net theo ngõ vào P, dùng lệnh sim(net,P)
P1=[1;1]; a1=sim(net,P1)
Kết quả: a1=1
P2=[1;1]; a2=sim(net,P2)
Kết quả: a2=0
Muốn đọc trị số của các trọng số và bias ta viết:
Wts=net.IW{1,1} Kết quả: Wts= -1 1 Bias=net.b{1} Kết quả: Bias=1
Muốn xóa các trị trên về zero dùng lệnh net=init(net)
+ Huấn luyện mạng Perceptron
Thuật toán perceptron được thực hiện nhờ hàm learnp. Quy luật học như sau: Wmới=wcũ +ePT
bmới= bcũ +e; E=T-P
Ví dụ: Trở lại mạng ở trên với trọng số [1 -0.8] và ta muốn huấn luyện mạng để khi
ngõ vào là [1 2] thì ngõ ra là -1. net.b{1}=0; w=[1 -0.8]; net.IW{1,1}=w P=[1;2] %Ngo vao T=[1] %Ngo ra
a=sim(net,P) %Tinh ngõ ra và sai số e=T-a %Kết quả bằng 1
dw=learnp(w,P,[],[],[],[],e,[],[],[],[],[]]) % học và tìm sự thay đổi của trọng số
97 Kết quả: dw= 1 2 w=w+dw %Trọng số mới Kết quả: w= 2.0000 1.20000
+ Hàm huấn luyện mạng train
[NET,TR] = train(NET,X,T)
Hàm huấn luyện cho mạng nơron NET, với tập dữ liệu vào X và dữ liệu ra Ỵ Kết thúc quá trình huấn luyện mạng hàm trả về giá trị là mạng nơron NET đã được huấn luyện và các giá trị huấn luyện TR.
Chú ý: Hàm train huấn luyện mạng theo thuật toán học của mạng nơron được thiết lập
Các tham số cài đặt cơ bản cho hàm train:
net.trainParam.epochs -chu kỳ huấn luyện net.trainParam.goal -sai số huấn luyện net.trainParam.lr -hệ số học
net.trainParam.show -vùng hiển thị trong quá trình huấn luyện
Thay vì dùng hàm learnp nhiều lần ta có thể dùng hàm train, trở lại mạng trên với tập huấn luyện:
{[2;2] .0} ; {[1;-2],1] ; {[2;-2],0] ; {[-1;1],1]
net=newp([-2 2;-2 2],1); %khởi tạo mạng có trọng số và bias 0 net.trainParam.epochs=1; %thử một chu kỳ huấn luyện
P=[[2;2] [1;-2] [-2;2] [-1;1]]; %tập huấn luyện T=[0 1 0 1];
net=train(net,P,T); %huấn luyện 1 bước
a=sim(net,P) % kiểm tra thấy sai tăng lên 3 chu kỳ Kết quả: a=
0 0 1 1
net.trainParam.epochs=3; %thử một chu kỳ huấn luyện net=train(net,P,T); a=sim(net,P) Kết quả: a= 0 1 0 1 w=net.IW{1,1} b=net.b{1}
98 Khi cần xem cấu trúc mạng ta dùng lệnh view(net). Hoặc khi cần truy suất mạng sang mô hình Simulink ta dùng lệnh:
gensim(net,st) trong đó st là thời gian lấy mẫu (mặc định bằng 1), thông thường ở dạng số thực dương. Nếu mạng không có trễ thì giá trị đó là -1.
Kết quả hiện ra cấu trúc mạng Perceptron như sau:
Trong trường hợp trị số vector P chênh lệch nhiều có thể gây khó khăn cho quá trình học, ta có thể dùng thuật toán: Wmới=Wcũ+e(PT||p||) với hàm tương ứng là
learnpn
3.3.2. Thiết lập và mô phỏng mạng Adaline + Mô hình mạng Adaline trên Matlab
Hình 3.18. Mô hình mạng nơron Adaline trên Simulink
+ Thiết lập mạng Adaline
Để thiết lập mạng Adaline trên Matlab ta dùng lệnh newlin. Với cú pháp tương tự như lệnh newp. Ví dụ tạo mạng hai ngõ vào, một nơron:
99 Với trọng số và bias khởi đầu là giá trị 0.
Ta có thể tự tạo mạng thỏa mãn yêu cầu với dữ liệu vào bằng lệnh newlind:
P=[1 2 3]; % dữ liệu vào T=[2.0 4.1 5.9]; % dữ liệu ra
net=newlind(P,T); % tạo mạng theo yêu cầu y=sim(net,P); % kiểm tra
+ Huấn luyện mạng Adaline
Các thông số mạng được tính theo thuật toán cực tiểu trung bình bình phương sai số LMS. Bài toán cực tiểu được giải nhờ thuật toán lặp Widrow – Hoff. Lệnh learnwh tính sự thay đổi của w và b ở mỗi bước. Lệnh train dùng huấn luyện mạng.
Ví dụ: Huấn luyện mạng tuyến tính
P=[2 1 -2 -1;2 -2 2 1]; %tập dữ liệu vào T=[0 1 0 1]; % tập đích mong muốn net=newlin([-2 2;-2 2],1); % tạo mạng net.trainParam.goal=0.001; % sai số tối đa [net,tr]=train(net,P,T); Weight=net.IW{1,1} %đọc thông số mạng Bias=net.b(1)
A=sim(net,P); %Kiểm tra
Err=T- sim(net,P); %Kiểm tra sai lệch
3.3.3. Thiết lập và mô phỏng mạng truyền thẳng nhiều lớp + Mô hình mạng truyền thẳng nhiều lớp trên Matlab
Hình 3.19. Mô hình mạng nơron truyền thẳng nhiều lớp trên Simulink
100 Để thiết lập mạng truyền thẳng nhiều lớp trên Matlab ta dùng lệnh newff, có bốn đối số vào, đầu tiên là ma trận Rx2 cho biết tầm của biến vào, kế đến là các mảng cho biết số lượng nơron mỗi lớp, rồi đến mảng cho biết tên các hàm chuyển đổi dùng trong mỗi lớp, và cuối cùng là tên hàm dùng để huấn luyện mạng.
Ví dụ: Tạo mạng hai lớp, hai đầu vào có tầm [-1 2] và [0 5], lớp một có ba nơron, lớp ra có một nơron, hàm chuyển đổi lớp đầu vào là tan-sigmoid, lớp ra là lớp tuyến tính, hàm huấn luyện là traingd, các thông số của mạng được khởi động theo thuật toán đặt trước.
net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd');
+ Huấn luyện mạng
Việc huấn luyện mạng dùng luật học lan truyền ngược để cập nhật thông số mạng, điểm cơ bản của thuật toán là LMS, việc cập nhật được tiến hành ngược rừ lớp ra lùi lại đến các lớp trước, có nhiều lệnh của Matlab huấn luyện mạng theo thuật toán lan truyền ngược.
traingd - Gradient descent backpropagation
raingdm - Gradient descent with momentum
backpropagation
raingdx - Variable Learning Rate Gradient Descent
trainrp - Resilient Backpropagation
traincgf - Fletcher-Powell Conjugate Gradient
traincgp - Polak-Ribiére Conjugate Gradien
traincgb - Conjugate Gradient with Powell/Beale Restarts
trainscg - Scaled Conjugate Gradient
trainbfg - BFGS Quasi-Newton
trainoss - One Step Secant
trainlm - Levenberg-Marquardt
trainbr - Bayesian Regularization
Ví dụ: Huấn luyện mạng P=[-1 -1 2 2;0 5 0 5]; %tập dữ liệu vào T=[-1 -1 1 1]; % tập đích mong muốn net=newff(minmax(P), [3,1],{'tansig','purelin'},'traingd'); %tạo mạng net.trainParam.show=50; net.trainParam.lr=0.05; %Hệ số học
net.trainParam.epochs=300; %Chu kỳ huấn luyện net.trainParam.goal=1e-5; %Sai so huan luyen [net,tr]=train(net,P,T);
101