You are on page 1of 47

Neural Network With Matlab #1:

Giới thiệu cơ bản về mạng nơ-ron nhân tạo

Mạng nơ-ron nhân tạo là gì?

Mạng nơ-ron nhân tạo hay thường gọi ngắn gọn là mạng nơ-ron là một mô hình toán
học hay mô hình tính toán được xây dựng dựa trên các mạng nơ-ron sinh học. Nó gồm
có một nhóm các nơ-ron nhân tạo (nút) nối với nhau, và xử lý thông tin bằng cách truyền
theo các kết nối và tính giá trị mới tại các nút (cách tiếp cận connectionism đối với tính
toán). Trong nhiều trường hợp, mạng nơ-ron nhân tạo là một hệ thống thích
ứng (adaptive system) tự thay đổi cấu trúc của mình dựa trên các thông tin bên ngoài hay
bên trong chảy qua mạng trong quá trình học.

Mô hình nơ-ron
Nơ-ron đơn giản

Hình 1. Mô hình mạng nơ-ron đơn giản.


a-b
a: nơ-ron không có bias (độ dốc).
b: nơ-ron có bias.
Tín hiệu vào vô hướng p thông qua Weight w (trọng liên kết vô hướng) trở thành wp.
Ở hình 1-a, wp là đối số duy nhất của hàm truyền f, tín hiệu đầu ra là đại lượng vô
hướng a. Ở hình 1-b có thêm bias vô hướng, b. Ta có thể xem b như một phép cộng đơn
giản vào tích wp hoặc như một phép dịch của hàm f ở hình 1-a đi một khoảng b.
Hàm truyền có đầu vào vô hướng là n, là tổng của Weight input wp và bias b. Hàm
truyền f có thể là hàm Hard-Limit, Linear,...

Hình 2. Các hàm truyền thông dụng.


a-b
c-d
a- Hàm truyền Hard-Limit (bước nhảy): f(n) = hardlim(n) = 1 if n>=0; =0 otherwise.
b- Hàm truyền Linear: f(n) = purelin(n) = n.
c- Hàm truyền Log-Sigmoid: f(n) = logsig(n) = 1/(1+exp(-n)).
d- Hàm truyền Tan-Sigmoid: f(n) = tansig(n) = 2/(1+exp(-2*n))-1.

Nơ-ron với nhiều đầu vào (vector input):


Hình 3. Nơ-ron với R đầu vào.

Nơ-ron với vector vào R phần tử được thể hiện trong hình 3. Ở đây ta có một chuỗi các
input p1,p2,p3...pR nhân với các weight tương ứng: w(1,1),w(1,2),...w(1,R). Các
Weight w được biểu diễn bằng ma trận hàng và vector p là ma trận cột. Khi đó, n có giá
trị:
n = w(1,1)*p1+w(1,2)*p2+...+w(1,R)*pR+b.
Trong Matlab ta có thể viết:
MÃ:

p = [p1;p2;p3;...;pR];
W= [w(1,1) w(1,2) ... w(1,R)];
n = W*p+b;
Với numel(W) == numel(p)
Cách biểu diễn trên sẽ rất khó khăn khi mô tả mạng gồm nhiều nơ-ron và có nhiều lớp. Để
đơn giản ta sử dụng ký hiệu như hình 4.

Hình 4. Ký hiệu nơ-ron với R đầu vào.


Trong đó:
 Vector input được biểu diễn bởi thanh đậm bên trái với kích thước là Rx1 (vector
p có R phần tử vào). Các phần tử này được nhân với ma trận W(kích thước 1xR).
 Hằng số 1 được nhân với bias b.
 Hàm truyền f có đầu vào là n, tổng của bias b và tích Wp. Tổng này đi qua hàm
truyền f để đầu ra nơ-ron là a, với a là một đại lượng vô hướng.
 Chú ý: Nếu đầu vào nhiều hơn 1 vector thì đầu ra của mạng sẽ là một vector.

 Neural Network With Matlab #2:

Cấu trúc mạng nơ-ron


Có thể có 2 hoặc nhiều hơn số nơ-ron trong một lớp, và một mạng nơ-ron
có thể có nhiều lớp liên kết với nhau. Đầu tiên hãy đến với một lớp đơn có
nhiều nơ-ron bên trong.

Nhiều nơ-ron trong một lớp

 Ta có một mạng nơ-ron chỉ có 1 lớp với R tín hiệu vào và S nơ-ron.

 Trong mạng này, mỗi phần tử của vector input p được liên kết với đầu vào mỗi nơ-
ron thông qua ma trận weight W. Bộ cộng của nơ-ron thứ i tiếp nhận weight
input Wp và bias b để tạo thành một đầu ra vô hướng n(i). Các phần tử n(i) của
các bộ cộng sẽ tập hợp với nhau tạo thành một vector input n với s phần tử. Cuối
cùng đầu ra của lớp nơ-ron ta thu được một cột vector a.

Chú ý: Số lượng đầu vào có thể khác so với số lượng nơ-ron của một lớp
(S khác R). Trong một lớp, không bắt buộc số lượng đầu vào bằng số nơ-ron của
nó.

Các phần tử của vector input được đưa vào mạng thông qua ma trận Weight W.

 Trong đó: Chỉ số hàng trong các phần tử ma trận W cho biết đích đến nơ-ron của
Weight, và chỉ số cột cho biết nơi xuất phát của các Weight. Ví dụ: w(1,2) cho biết
sự có mặt của phần tử 2, tín hiệu vào và phần tử đó được đưa đến nơ-ron thứ
nhất sau khi tích với Weight w(1,2).

Mạng có S nơ-ron vào R đầu vào có thể được thể hiện như sau:

 Với p là vector input có độ lớn R, W là ma trận Weight có kích thước SxR, a và b


là các vector có độ lớn S. Như chúng ta đã biết, một lớp nơ-ron có ma trận Weight,
toán tử nhân, vector bias b, bộ cộng, và hàm truyền.

Đầu vào và lớp

Để có thể khảo sát mạng nhiều lớp thì chúng ta cần phải đưa ra các ký hiệu quy
ước cho một lớp mạng, giúp ta có thể phân biệt được các phần tử của các lớp
khác nhau.

Ta gọi ma trận weight liên kết với các đầu vào là input weight; và gọi ma trận
weight đến từ đầu ra của lớp là layer weight. Ta dùng các chỉ số mũ để thể hiện
cho nguồn (chỉ số thứ 2) và đích (chỉ số thứ nhất) cho các weight khác nhau và
một số phần tử trong mạng. Để minh họa, ta khảo sát một lớp có nhiều đầu vào:

 Như bạn có thể thấy, ta có nhãn của ma trận weight kết nối với vector đầu vào p
là ma trận Input Weight (IW{1,1}) có nguồn là 1 (chỉ số thứ hai) và đích là 1 (chỉ
số thứ nhất). Đồng thời, các phần tử của lớp 1, như là bias b{1}, đầu vào hàm
truyền n{1}, và đầu ra a{1} thể hiện a,b,n đều có liên kết với lớp thứ 1.

Trong phần sau, chúng ta sẽ sử dụng ma trận Layer Weight (LW) giống như ma
trận Input Weight (IW).

Trong một mạng net cụ thể, các phần tử được thể hiện trong Matlab:

 MÃ:

 net.IW{1,1};
 net.b{1};
 n{1} = net.IW{1,1} + net.b{1};

 Neural Network With Matlab #2.5:

 Cấu trúc mạng nơ-ron (TT)

Mạng đa lớp , đa nơ-ron



Một mạng có thể có nhiều lớp. Mỗi lớp đều có một ma trận weight W, một
vector bias b, và một vector đầu ra a. Để có thể phân biệt giữa các ma trận
weight, vector đầu ra ... của các lớp, ta thêm chỉ số lớp ở phần mũ của các
biến số quan tâm. Ta có thể thấy các ký hiệu cho các lớp được thể hiện
trong hình sau:



Mạng trên thể hiện có R{1} đầu vào, S{1} nơ-ron ở lớp 1. S{2} nơ-ron cho
lớp 2... Điểm khác nhau chung của các lớp chính là số nơ-ron khác nhau.
Chỉ có một đầu vào với mỗi nơ-ron.

Chú ý: Đầu ra của lớp trước sẽ là đầu vào của lớp tiếp theo. Như vậy, lớp
2 có thể được xem như mạng đơn lớp với S{1} đầu vào, S{2} nơ-ron, và
ma trận weight W{2} có kích thước S{2}xS{1}. Đầu vào của lớp 2 là a{1};
đầu ra là a{2}. Lúc này chúng ta đã xác định được các vector và ma trận
của lớp 2, ta có thể xem nó như một mạng đơn lớp. Cách áp dụng này có
thể được dùng cho bất kỳ lớp nào ở trong mạng.

Các lớp của mạng đa lớp có vai trò khác nhau. Lớp cuối là kết quả đầu ra
của mạng được gọi là lớp đầu ra (output layer). Các lớp khác gọi là lớp ẩn
(hidden layers). Mạng 3 lớp ở trên có 1 lớp output (lớp 3) và 2 lớp ẩn (lớp
1 và 2). Một số tác giả sẽ cho rằng đầu vào là một lớp, ở đây chúng ta
không sử dụng quan điểm này.
Xét mạng 3 lớp ở trên, ta có thể vẽ lại một cách ngắn gọn hơn:

 Mạng nhiều lớp rất mạnh.Ví dụ xét 1 mạng 2 lớp, trong đó lớp 1 có hàm
truyền sigmoid và lớp 2 có hàm truyền linear, có thể xấp xỉ một hàm bất kỳ
(với số điểm gián đoạn hạn chế). Loại mạng 2 lớp này sẽ được sử dụng
nhiều ở phần "Mạng lan truyền ngược"(Backpropagation).

Ta có thể giả sử đầu ra của lớp thứ 3 là a{3}, cũng chính là đầu ra của
mạng 3 lớp ở hình trên. Ta ký hiệu đầu ra này của mạng là y. Ta sẽ sử
dụng ký hiệu này cho đầu ra của mạng đa lớp.

Neural Network With Matlab #3:


Cấu trúc dữ liệu của mạng nơ-ron

Giới thiệu

Trong phần này sẽ nói về "các kiểu cấu trúc dữ liệu sẽ ảnh hưởng như thế nào
đến việc mô phỏng mạng. Ta sẽ bắt đầu với mạng tĩnh (static networks) và sau đó
đến mạng động (dynamic networks).

Chúng ta sẽ xét với 2 loại vector đầu vào cơ bản là xuất hiện đồng thời/song song
(xuất hiện cùng một thời điểm) và xuất hiện liên tiếp/nối tiếp theo thời gian. Đối với
vector song song, ta không cần quan tâm đến thứ tự của các phần tử. Đối với
vector nối tiếp, thì thứ tự xuất hiện của các phần tử vector rất quan trọng, nó được
áp dụng cho mạng động.

Mô phỏng với vector đầu vào song song trong mạng

tĩnh

Đối với mạng tĩnh (không delay hoặc trả về), ta không cần quan tâm tới việc có
hay không vector đầu vào xuất hiện trong một chuỗi thời gian cụ thể, nên ta có thể
xem như các đầu vào là đồng thời. Trong phép cộng, ta giải quyết bài toán đơn
giản bẳng tổng của mạng chỉ có một vector vào. Ví dụ, ta có mạng sau:

 Đầu tiên, chúng ta phải tạo mạng 2 đầu vào và 1 đầu ra với lệnh sau:

MÃ:

net = newlin([1 3;1 3]... % giá trị min và max tương ứng với phần tử đầu vào
p1 và p2
,1... % 1 phần tử đầu ra
);
 Tiếp theo ta sẽ set cho weight đầu vào và bias: W = [1 2] và b = 0 bằng các câu
lệnh sau:

MÃ:

net.IW{1,1} = [1 2]; %Weight input


net.b{1} = 0; %bias
 Giả sử ta mô phỏng mạng với Q = 4 vector vào đồng thời:

 Ta mô phỏng mạng bằng các câu lệnh:

MÃ:

P = [1 2 2 3;2 1 3 1];
A = sim(net,P)
A =
5 4 8 5

Một ma trận đơn của vector đồng thời được đưa đến mạng và mạng đưa ra một ma trận
đơn của vector đông thời ở đầu ra. Kết qua tương tự như 4 mạng làm việc song song, mỗi
mạng có một vector vào và một vector ra. Thứ tự vào ra của các vector không quan trọng
vì chúng không ảnh hưởng đến nhau.

Neural Network With Matlab #3.5:


Cấu trúc dữ liệu của mạng nơ-ron
(Mạng động)

Ở bài trước, ta đã biết sơ bộ về vector đầu vào song song (đồng thời), vector đầu vào
nối tiếp (liên tiếp) và mạng tĩnh có vector đầu vào song song. Bài này sẽ nói về mạng
động có vector đầu vào song song và nối tiếp.

Mô phỏng với vector đầu vào nối tiếp trong mạng


động

Khi mạng có trễ (delay), đầu vào của mạng thường sẽ là một chuỗi các vector đầu
vào theo thứ tự thời gian nào đó. Để rõ hơn, ta xét mạng đơn giản chứa một delay.

Ta sẽ thiết lập mạng này với thông số: W = [1 2]; p1 = [1], p2 = [2], p3 = [3], p4 =
[4], bằng những lệnh sau:
MÃ:

net = newlin([-1 1],...

1,...
[0 1]... %đầu vào vector delay.
);
net.biasConnect = 0; %xóa bias
net.IW{1,1} = [1 2];
P = {1 2 3 4}; %vector đầu vào nối tiếp.
A = sim(net,P) %mô phỏng mạng với đầu vào P
A =
[1] [4] [7] [10]

Đầu vào của ta là một mảng (cell array) chứa các đầu vào nối tiếp, và kết quả của
mạng cũng sẽ là một mạng chứa các đầu ra nối tiếp.
Chú ý: Thứ tự các đầu vào rất quan trọng khi hoạt động một cách nối tiếp. Trong
trường hợp này, các giá trị đầu ra thu được phụ thuộc vào giá trị đầu vào trước
đó. Nếu ta thay đổi thứ tự đầu vào thì kết quả của đầu ra sẽ thay đổi theo.

Với trường hợp trên, quá trình khi tính toán trong mạng như sau:
MÃ:

(a = W{1,1}*p1 + W{1,2}*p2 +b
a1 = 1*1+2*0+0 = 1 (giá trị đầu vào 2 là 0)
a2 = 1*2+2*1+0 = 4 (giá trị đầu vào 2 là 1)
a3 = 1*3+2*2+0 = 7 (giá trị đầu vào 2 là 2)
a4 = 1*4+2*3+0 = 10 (giá trị đầu vào 2 là 3)

Mô phỏng với vector đầu vào song song trong mạng

động

Nếu ta thay đổi đầu vào của bài ví dụ phần trước bằng cách thay vector đầu vào
nối tiếp thành vector đầu vào song song thì ta thu được kết quả khác nhau hoàn
toàn. Cùng với ví dụ của phần trước, nếu ta sử dụng đầu vào song song ta sẽ có:
MÃ:

net = newlin([-1 1],...


1,...
[0 1]... %đầu vào vector delay.
);
net.biasConnect = 0; %xóa bias
net.IW{1,1} = [1 2];
P = [1 2 3 4]; %vector đầu vào song song.
A = sim(net,P) %mô phỏng mạng với đầu vào P
A =
1 2 3 4
Kếu quả sẽ riêng rẻ nếu ta áp dụng song song mỗi đầu vào tới một mạng riêng
biệt và tính toán một đầu ra.
Chú ý: Khi ta không set giá trị ban đầu cho mạng có trễ thì chúng được coi là bằng
0. Đối với trường hợp trên thì đầu ra chỉ bằng 1 nhân với đầu vào, vì weight w
nhân với đầu vào là 1.

Trong trường hợp đặc biệt, ta cần phải mô phỏng đáp ứng của mạng với một vài
chuỗi số khác nhau trong cùng một thời gian. Ta cần phải tạo ra mạng có đầu vào
vừa là song song vừa là nối tiếp. Ví dụ, ta có 2 vector đầu vào nối tiếp như sau:

p1(1) = [1], p1(2) = [2], p1(3) = [3], p1(4) = [4].


p2(1) = [4], p2(2) = [3], p2(3) = [2], p2(4) = [1].

Để có thể mô phỏng mạng với 2 vector trên thì chỉ cần nhập các lệnh:
MÃ:

P = {[1 4] [2 3] [3 2] [4 1]};
A = sim(net,P)
A =
{[1 4] [4 11] [7 8] [10 5]}
Quá trình tính toán
MÃ:

A = {[a11 a21] [a12 a22] [a13 a23] [a14 a24]}

a11 = 1*1+2*0 = 1
a21 = 1*4+2*0 = 4

a12 = 1*2+2*1 = 4
a22 = 1*3+2*4 = 11

a13 = 1*3+2*2 = 7
a23 = 1*2+2*3 = 8

a14 = 1*4+2*3 = 10
a24 = 1*1+2*2 = 5
Ta có thể thấy, cột đầu tiên của mỗi ma trận chính là kết quả đầu ra của bài ví dụ
đầu tiên (mạng động với vector đầu vào nối tiếp). Cột thứ hai của mỗi ma trận là
kết quả đầu ra nối tiếp của mạng với vector đầu vào nối tiếp thứ 2. Không có sự
tương tác giữa 2 chuỗi nối tiếp (concurrent sequence). Nó giống như các mạng
được chạy song song với từng chuỗi đầu vào nối tiếp khác nhau.

Sơ đồ sau chỉ ra khuôn dạng chung của đầu vào P đến hàm sim khi ta có chuỗi Q
vào song song qua những bước thời gian Ts. Nó đúng với trường hợp chỉ có 1
vector vào. Mỗi phần tử của mảng là một ma trận của các vector song song tương
ứng với một thời điểm trên mỗi chuỗi. Nếu có nhiều vector vào sẽ có nhiều hàng
của ma trận trong mảng.

Trong phần này, ta đã áp dụng đầu vào song song và nối tiếp vào mạng động.
Trong phần trước, ta đã áp dụng đầu vào song song vào mạng tĩnh. Nó cũng có
thể được áp dụng đầu vào nối tiếp vào mạng tĩnh. Nó sẽ không làm thay đổi kết
quả mô phỏng, nhưng nó có thể ảnh hưởng đến cách thức huấn luyện mạng. Điều
này sẽ được giải quyết ở phần tiếp theo.

Neural Network With Matlab #4:


Huấn luyện mạng nơ-ron
(Incremental Training - Huấn luyện gia tăng)

Giới thiệu các phương pháp huấn luyện

Ở bài này, ta sẽ tìm hiểu về 2 phương pháp huấn luyện khác nhau. Đối với phương
pháp gia tăng (incremental training), weight W và bias b trong mạng sẽ được
update mỗi khi dữ liệu được đưa vào mạng. Đối với phương pháp huấn luyện theo
gói (batch training), weight W và bias chỉ được cập nhật sau khi tất cả các dữ liệu
được đưa vào mạng.
Phương pháp huấn luyện gia tăng (Incremental

Training)

Huấn luyện gia tăng được áp dụng cho cả mạng tĩnh (static network) và mạng
động (dynamic network), tuy nhiên phương pháp được áp dụng chủ yếu cho mạng
động, ví dụ bộ lọc thích nghi. Trong phần này, sẽ nói cho ta biết làm như thế nào
để huấn luyện gia tăng cho mạng tĩnh và mạng động.

Huấn luyện gia tăng cho mạng tĩnh

Xét mạng tĩnh, ta muốn huấn luyện nó gia tăng, sao cho weight W và bias b sẽ
update sau khi đưa từng dữ liệu vào. Trong trường hợp này ta sẽ sử dụng
hàm adapt, và ta coi đầu vào và đích là dữ liệu nối tiếp.

Giả sử ta muốn huấn luyện mạng để tạo ra mạng tuyến tính:

Ta có đầu vào:

Và đầu ra tương ứng:

Đầu tiên, ta sẽ tạo ra một mạng với giá trị 0 ban đầu với cả weight và bias. Ta thiết
lập tốc độ huấn luyện ban đầu là 0, để có thể thấy tác động của huấn luyện gia
tăng.
MÃ:

net = newlin([-1 1;-1 1],...% Giá trị min và max của 2 vector đầu vào
1,...% Số output
0,...% Số vector delay
0... % Tốc độ huấn luyện
);
net.IW{1,1} = [0 0];
net.b{1} = 0;

Để có thể huấn luyện như ý muốn, ta cần phải có đầu vào và kết quả đầu ra tương
ứng:
MÃ:

P = {[1;2] [2;1] [2;3] [3;1]};


T = {4 5 7 7};
Như đã đề cập ở phần mạng tĩnh, kết quả mô phỏng của mạng ở đầu ra có giống
như đầu vào đã được đưa vào như là một ma trận của vector song song hay như
một mảng vector nối tiếp. Điều đó không đúng trong huấn luyện mạng. Tuy nhiên,
khi sử dụng hàm adapt, nếu đầu vào được đưa vào như một mảng vector nối tiếp
thì weight W sẽ được update với mỗi đầu vào được đưa đến (mode gia tăng -
imcremental mode). Ở phần sau, nếu đầu vào được đưa vào như một ma trận của
vector song song thì weight W sẽ được update sau khi tất cả đầu vào được đưa
đến (mode gói - batch mode).

Bây giờ ta sẽ huấn luyện gia tăng bằng hàm adapt


MÃ:

[net,a,e,pf] = adapt(net,P,T);
Trong đó:
a: giá trị đầu ra sau khi huấn luyện
e: giá trị sai số (lỗi) của giá trị đầu ra so với kết quả mong muốn.
P: giá trị đầu vào
T: giá trị kết quả mong muốn
Kết quả đầu ra sau khi huấn luyện vẫn bằng 0, vì trước đó tốc độ huấn luyện bằng
0 nên weight W không được update. Sai số (lỗi) sẽ bằng với kết quả mong muốn:
MÃ:

a = [0] [0] [0] [0]


e = [4] [5] [7] [7]

Nếu ta tăng tốc độ huấn luyện lên 0.1 thì có thể thấy mạng sẽ thiết lập như thế nào với
mỗi giá trị đầu vào được đưa vào:
MÃ:
net.inputWeights{1,1}.learnParam.lr = 0.1;
net.biases{1,1}.learnParam.lr = 0.1;
[net,a,e,pf] = adapt(net,P,T);
a = [0] [2] [6] [5.8]
e = [4] [3] [1] [1.2]
net.b{1} = 0.92
net.IW{1,1} = [1.56 1.52]
Dữ liệu đầu ra đầu tiên bằng 0 với tốc độ huấn luyện bằng 0, do không có sự
update nào cho đến khi dữ liệu đầu vào thứ nhất xuất hiện. Dữ liệu ra thứ 2 sẽ
khác sau khi weight được update. Weight sẽ tiếp tục thay đổi theo mỗi sai số được
tính toán. Nếu mạng có khả năng và tốc độ huấn luyện được thiết lập phù hợp thi
sai số sẽ dần tiến về 0.

Huấn luyện gia tăng cho mạng động

Ta có thể huấn luyện gia tăng cho mạng động (hay được sử dụng nhất). Ta bắt
đầu xét mạng tuyến tính có chứa một delay ở đầu vào.Ta khởi tạo mạng với weight
bằng 0 và tốc độ huấn luyện là 0.1.
MÃ:

net = newlin([-1 1],1,[0 1],0.1);


net.IW{1,1} = [0 0];
net.biasConnect = 0;

Ta sẽ huấn luyện mạng gia tăng khi cho đầu vào và kết quả mong muốn:
MÃ:

Pi = {1};
P = {2 3 4};
T = {3 5 7};
Ở đây ta thử huấn luyện mạng như một phép cộng giá trị hiện tại với giá trị trước
nó (2+1=3, 3+2=5, 4+3=7). Ta sẽ thiết lập giá trị ban đầu là 1. Bây giờ ta đã có thể
huấn luyện bằng hàm adapt.
MÃ:

[net,a,e,pf] = adapt(net,P,T,Pi); %Pi là giá trị ban đầu


a = [0] [2.4] [7.98]
e = [3] [2.6] [-0.98]
net.IW{1,1} = [0.988 0.526]
Giá trị đầu ra đầu tiên bằng 0, do trước đó weight chưa được update. Weight sẽ
được thay đổi tại mỗi bước thời gian kế tiếp.

Ở bài sau ta sẽ tìm hiểu về phương pháp huấn luyện gói (Batch) cho
cả mạng động và mạng tĩnh.

Neural Network With Matlab #4.5:


Huấn luyện mạng nơ-ron
(Batch Training - Huấn luyện gói)

Huấn luyện gói - Batch Training

Huấn luyện theo gói là phương pháp chỉ update weight W và bias b sau khi tất cả
các dữ liệu đầu vào và kết quả mong muốn được đưa vào mạng. Phương pháp
có thể áp dụng cho cả mạng tĩnh và mạng động.

Huấn luyện gói cho mạng tĩnh

Để huấn luyện theo gói, ta có thể sử dụng hàm train hoặc adapt, tuy nhiên
hàm train là sự lựa chọn tốt nhất, vì nó đặc trưng cho sự truy nhập có hiệu quả
hơn của thuật toán huấn luyện. Huấn luyện gia tăng chỉ sử dụng hàm adapt; còn
hàm train chỉ được sử dụng huấn luyện gói.

Ta tiếp tục xét ví dụ dành cho mạng tĩnh với tốc độ huấn luyện 0.01.
MÃ:
net = newlin([-1 1;-1 1],1,0,0.01);
net.IW{1,1} = [0 0];
net.b{1} = 0;

Ta sẽ thử huấn luyện gói với hàm adapt, vector đầu vào phải cần phải là một ma
trận vector song song.
MÃ:

P = [1 2 2 3; 2 1 3 1];
T = [4 5 7 7];
Khi ta gọi hàm adapt, nó sẽ gọi ra hàm train (là hàm điều chỉnh mặc định cho mạng
tuyến tính) và hàm learnwh (là hàm học mặc đinh cho weight W và bias b). Vì
thế, Widrow-Hoff learning (learnwh) đã được sử dụng.
MÃ:

[net,a,e,pf] = adapt(net,P,T);
a = 0 0 0 0
e = 4 5 7 7
Chú ý: đầu ra của mạng đều bằng 0, vì weight W không update cho đến khi tất cả
các dữ kiện được đưa vào huấn luyện. Truy cập vào weight W và bias sẽ tìm thấy
giá trị:
MÃ:

net.IW{1,1} = 0.49 0.41


net.b{1} = 0.23
Đó là sự khác nhau của kết quả ta vừa đạt được với kết quả của huấn luyện gia
tăng.

Bây giờ, ta sẽ huấn luyện gói sử dụng hàm train. Trước đó, quy tắc Widrow-Hoff
có thể được sử dụng cho cả mode gia tăng hoặc mode gói, nó có thể được gọi
bằng hàm adapt hoặc hàm train. Có những thuật toán chỉ có thể sử dụng mode
gói (vd Levenberg-Marquardt), do đó các thuật toán đó chỉ có thể sử dụng
hàm train.
Xét mạng được thiết lập như sau.
MÃ:

net = newlin([-1 1;-1 1],1,0,0.01);

net.IW{1,1} = 0;
net.b{1} = 0;
Trong trường hợp này, vector đầu vào có thể đặt vào ma trận vector song song
hoặc trong mảng vector nối tiếp. Hàm train sẽ chuyển bất kỳ mảng vector nối tiếp
nào sang ma trận vector song song.Do đây là mạng tĩnh, và vì hàm train luôn làm
việc ở mode gói. Mode gia tăng làm việc bất cứ lúc nào, vì nó được Matlab thực
hiện rất hiệu quả.
MÃ:

P = [1 2 2 3; 2 1 3 1];
T = [4 5 7 7];
Bây giờ ta đã sẵn sàng để có thể huấn luyện cho mạng. Ta sẽ chỉ huấn luyện trong
một chu kỳ, vì trước đó ta chỉ sử dụng 1 lần với hàm adapt. Hàm huấn luyện mặc
định cho mạng tuyến tính là trainb, và hàm học mặc định cho weight và bias
là learnwh, nên ta sẽ nhận được kết quả tương tự như sử dụng hàm adapt trong
ví dụ trước, khi ta sử dụng hàm thích nghi mặc định là trains.
MÃ:

net.inputWeights{1,1}.learnParam.lr = 0.01;
net.biases{1}.learnParam.lr = 0.01;
net.trainParam.epochs = 1;
net = train(net,P,T);
Nếu cho hiển thị weight sau một chu kỳ huấn luyện, ta thấy:
MÃ:

net.IW{1,1} = 0.49 0.41


net.b{1} = 0.23
Kết quả thu được giống với kết quả khi sử dụng hàm adapt ở mode gói. Với mạng
tĩnh, hàm adapt có thể được sử dụng cho huấn luyện gia tăng hoặc gói tùy thuộc
vào khuôn dạng dữ liệu vào. Nếu dữ liệu đưa vào là ma trận vector song song thì
huấn luyện gói xuất hiện. Nếu dữ liệu đưa vào là mảng vector nối tiếp thì huấn
luyện gia tăng xuất hiện. Điều đó không đúng với hàm train, nó luôn là huấn luyện
gói cho dù khuôn dạng của đầu vào là gì.

Huấn luyện gói cho mạng động


Huấn luyện mạng tĩnh tương đối đơn giản. nếu ta sử dùng hàm train để huấn luyện mạng
theo mode gói và đầu vào được chuyển thành vector song song (các cột của một ma trận)
cho dù trước đây chúng là vector nối tiếp (các phần tử của mảng). Nếu ta sử dụng hàm
adapt, khuôn dạng đầu vào sẽ quyết định mode huấn luyện.

Với mạng động, huấn luyện gói chỉ được thực hiện với hàm train, đặc biệt nếu chỉ có một
chuỗi huấn luyện tồn tại. Để minh họa, ta lại xét mạng tuyến tính có trễ. Ta có tốc độ huấn
luyện là 0.02. (Khi sử dụng thuật toán giảm độ dốc, ta chọn tốc độ huấn luyện cho mode
gói nhỏ hơn mode gia tăng, vì tất cả các độ dốc riêng biệt sẽ được cộng với nhau trước
khi xác định được sự thay đổi của các weight).
MÃ:

net = newlin([-1 1],1,[0 1],0.02);


net.IW{1,1}=[0 0];
net.biasConnect=0;
net.trainParam.epochs = 1;
Pi = {1};
P = {2 3 4};
T = {3 5 6};

Ta muốn huấn luyện mạng với chuỗi tương tự như đã được sử dụng ở phần huấn
luyện gia tăng trước đây, nhưng thời điểm update weight chỉ sau khi tất cả các đầu
vào được áp dụng (mode gói). Mạng được coi như tuần tự vì đầu vào là một chuỗi,
nhưng weight được update theo mode gói.
MÃ:

net=train(net,P,T,Pi);
net.IW{1,1} = 0.9 0.62
Kết quả này khác với kết quả ta thu được ở huấn luyện gia tăng, ở đó weight được
update 3 lần trong một set huấn luyện. Đối với huấn luyện theo gói, weight chỉ
update một lần trong một chu kỳ huấn luyện.

Neural Network With Matlab #5:


Giới thiệu mạng Perceptrons
Giới thiệu chung

Mạng Perceptron là mạng đơn giản chỉ có một lớp phân loại nhị phân, có nghĩa là
sẽ chia không gian đầu vào bằng một đường ranh giới. Để dễ hiểu, ta quan sát sự
phân loại chó mèo ở hình dưới:
Mạng Perceptron có thể được tạo ra bằng hàm newp. Mạng này có thể được khởi
tạo, mô phỏng và huấn luyện bằng hàm init, sim và train.

Mô hình nơ-ron

Một nơ-ron perceptron, sử dụng hàm truyền hard-limit (hardlim), như sau:

Mỗi đầu vào p{j} có hàm trọng (weighted) với trọng liên kết (appropriate weight)
w{1,j}, và tổng các trọng đầu vào được gửi đến hàm truyền hard-limit, kể cả độ dốc
(bias). Hàm truyền sẽ trả về giá trị 0 hoặc 1.

Kết quả của nơ-ron perceptron là 1 nếu đầu vào của hàm truyền có giá trị lơn hơn
hoặc bằng 0; bằng 0 với các giá trị còn lại.

Hàm truyền hard-limit giúp cho nơ-ron perceptron có khả năng phân loại vector
đầu vào thành 2 phần. Rõ hơn, đầu ra sẽ bằng 0 nếu đầu vào n thấp hơn 0, hoặc
bằng 1 nếu n lớn hơn hoặc bằng 0. Ví dụ ta xét nơ-ron perceptron có 2 đầu vào
với w{1,1} = -1, w{1,2} = 1, b= 1. Ta có:

Hai miền phân loại rõ ràng bằng đường ranh giới L có phương trình Wp+b = 0.
Đường này vuông góc với vector trọng W (weight) và dịch qua một khoảng b.
Vector đầu vào nằm trên hoặc bên trái đường L sẽ có kết quả đầu vào hàm truyền
lớn hơn 0; vì vậy, kết quả trả về của nơ-ron hard-limit sẽ là 1. Ngược lại, vector
đầu vào nằm bên phải đường L sẽ có kết quả về của nơ-fon hard-limit là 0. Đường
phân chia có thể thay đổi hướng bằng cách chọn lại hàm trọng w (weight) và
bias b.

Nơ-ron hard-limit không có bias sẽ luôn có đường phân chia đi qua gốc tọa độ.
Thêm bias vào nơ-ron sẽ giải quyết được vấn đề hai vector đầu vào lại không thể
phân vùng khác nhau. Bias sẽ làm cho đường phân chia được dịch một khoảng
từ gốc tọa độ như đồ thị trên.

Cấu trúc Perceptron

Mạng Perceptron là một mạng đơn lớp của S nơ-ron Perceptron có R đầu vào
xuyên qua hàm trọng w{i,j} như sơ đồ hình dưới. Với i và j chỉ ra w{i,j}là hàm
trọng liên kết đầu vào j với nơ-ron i.
Luật học của Perceptron được miêu tả ngắn gọn là khả năng huấn luyện của chỉ một lớn
đơn. Vì vậy, ta chỉ coi là mạng một lớp. Nó chỉ có khả năng giải quyết những bài toán đơn
giản. Những hạn chế của Perceptron sẽ được đề cập phần sau.

Neural Network With Matlab #6:


Luật học nơ-ron Perceptron

Tạo một Perceptron

Trước khi tìm hiểu về luật học của nơ-ron Perceptron, ta sẽ tạo một mạng
Perceptron bằng lệnh newp.
MÃ:

net = newp(PR,S);
Trong đó:

 PR là một ma trận với 2 phần tử mỗi hàng là giá trị min và max của 1 đầu
vào trong R đầu vào.
 S là số nơ-ron có trong mạng.
Thông thường hàm truyền hardlim được sử dụng cho Perceptron, nên nó là mặc
định khi tạo.

Dòng lệnh bên dưới tạo ra một mạng Perceptron với 1 đầu vào và 1 nơ-ron. Giới
hạn của vector đầu vào đơn là [0 2].
MÃ:

net = newp([0 2],1);


ta có thể thấy mạng đã được thiết lập thế nào bằng cách thực hiện câu lệnh.
MÃ:

net.inputWeights{1,1}

ans =
Neural Network Weight
delays: 0
initFcn: 'initzero'
initSettings: (none)
learn: true
learnFcn: 'learnp'
learnParam: (none)
size: [1 1]
weightFcn: 'dotprod'
weightParam: (none)
userdata: (your custom info)
Chú ý: Hàm học mặc định là learnp. Đầu vào hàm truyền hardlim là dotprod, là
kết quả của vector đầu vào và hàm trọng w và cộng thêm bias b. Hàm khởi tạo
mặc định là initzero, sẽ khởi tạo giá trị của hàm trọng bằng 0.

Tương tự,
MÃ:

net.biases{1}

ans =
Neural Network Bias
initFcn: 'initzero'
learn: true
learnFcn: 'learnp'
learnParam: (none)
size: 1
userdata: (your custom info)
Ta có thể thấy bias sẽ mặc định khởi tạo bằng 0.

Mô phỏng (Sim)

Để có thể thấy rõ sim làm việc như thế nào thì ta sẽ xét ví dụ sau.

Giả sử ta có một Perceptron với một vector đầu vào có 2 phần tử. Ta định nghĩa
một mạng với:
MÃ:

net = newp([-2 2;-2 2],1);


Như ta đã biết ở trên, hàm trọng W và bias b sẽ được thiết lập bằng 0, nếu ta muốn
một giá trị khác 0, ta có thể tạo nó. Ta có thể thiết lập 2 trọng số W và 1 bias lần
lượt là -1,1 và 1 với câu lệnh:
MÃ:

net.IW{1,1} = [-1 1];


net.b{1} = 1;
Ta có đường phân chia làm 2 phần:

Bây giờ ta thấy nếu đưa vào 2 tín hiệu, một trong mỗi cạnh của đường biên giới.
MÃ:

p1 = [1;1];
p2 = [1;-1];

Ta sử dụng hàm mô phỏng sim sẽ có kết quả tương ứng như hình.
MÃ:

a1 = sim(net,p1)
a1 =
1

a2 = sim(net,p2)
a2 =
0
Chắc chắn rằng, sự phân loại của Perceptron với 2 đầu vào trên là đúng.

Chú ý: Ta có thể đưa một lúc 2 đầu vào một chuỗi dữ liệu, khí đó đầu ra nhận
được sẽ là một chuỗi dữ liệu, ví dụ:

MÃ:

p3 = {[1;1] [1;-1]};
a3 = sim(net,p3);
a3 =
[1] [0]

Khởi tạo (init)


Ta có thể sử dụng hàm init để có thể khởi tạo lại trọng số và bias của mạng. Giả
sử, ta bắt đầu với mạng:
MÃ:

net = newp([-2 2;-2 2],1);


Bây giờ ta sẽ kiểm tra trọng số W và bias b ban đầu:
MÃ:

net.IW{1,1}
ans =
0 0
net.b{1}
ans =
0
Bây giờ ta thiết lập giá trị trọng số bằng 3 và 4 và bias sẽ có giá trị là 5.
MÃ:

net.IW{1,1} = [3 4];
net.b{1} = 5;
Ta sử dụng hàm init để reset lại giá trị của trọng số W và bias b về giá trị ban đầu.
MÃ:

net = init(net);
net.IW{1,1}
ans =
0 0
net.b{1}
ans =
0
Ta có thể thay đổi giá trị khởi tạo của hàm init. Ví dụ, ta có thể định nghĩa lại các trọng số
đầu vào và bias initFcn một cách ngẫu nhiên (rands), và khi đó áp dụng hàm init như sau.
MÃ:

net.inputweights{1,1}.initFcn = 'rands';
net.biases{1}.initFcn = 'rands';
net = init(net);
IW = net.IW{1,1}
IW =
-0.0292 0.6006
b = net.b{1}
b =
0.9143
Ta có thể thấy trọng số W và bias b sẽ được khởi tạo một cách ngẫu nhiên.

Neural Network With Matlab #6.5:


Luật học nơ-ron Perceptron

Luật học
Luật học là thủ tục làm thay đổi trọng số w và bias b của mạng (thủ tục này có thể
xem như là một thuật toán huấn luyện). Luật học được áp dụng cho việc huấn
luyện mạng thực hiện một số công việc cụ thể nào đó. Các luật học được phân
làm 2 loại: học có giám sát và học không giám sát.

 Với học có giám sát, luật học được cung cấp cùng với tập các ví dụ (tập
huấn luyện) đặc trưng của mạng

Trong đó P{q} là một đầu vào của mạng, và t{q} là đầu ra (mục tiêu) chính xác
tương ứng. Giống như đầu vào đến mạng, đầu ra của mạng được so sánh với
mục tiêu. Luật học được sử dụng để điều chỉnh trọng số W và bias b của mạng
nhằm làm cho kết quả đầu ra gần giống với mục tiêu mong đợi.
 Với học không giám sát, trọng số và bias được thay đổi tương ứng chỉ với
đầu vào mà không có sẵn đầu ra mong muốn (mục tiêu). Phần lớn các thuật
toán này biểu diễn thành một tập bó. Người ta chia mẫu vào thành con số
cụ thể của hạng (loại). Điều này đặc biệt hữu ích trong các ứng dụng cụ thể
như một vector lượng tử hóa.
Trong bài này ta chỉ tìm hiểu kiểu học có giám giác cho việc huấn luyện mạng
Perceptron.

Luật học Perceptron (learnp)


Perceptron được huấn luyện theo mẫu mong muốn cho trước. Mẫu mong muốn
có thể tập hợp thành một tập các cặp đầu vào, đầu ra:
trong đó p là một đầu vào của mạng và t là kết quả mong muốn (mục tiêu) đạt
được ở đầu ra. Với mục đích làm giảm sự sai lệch (error) e, là sự sai lệch của kết
quả đầu ra a với kết quả mong muốn t; e = t - a. Luật học Perceptron tính toán
thay đổi trọng số và bias với vector đầu vào p và sai lệch e. Vector kết quả mong
muốn t chỉ có giá trị 1 hoặc 0, nên Perceptron (sử dụng hàm truyền hardlim), đầu
chỉ có thể là 1 trong 2 giá trị.

Mỗi lần learnp thực hiện, perceptron có đầu ra ít sự sai lệnh hơn so với kết quả
mong muốn. Luật học Perceptron sẽ hội tụ đến kết quả cuối cùng sau một số hữu
hạn lần lặp nếu như có tồn tại đáp án.

Nếu không sử dụng bias, learnp làm việc để tìm đáp án bằng việc thay đổi vector
trọng số w để chỉ rõ vector thuộc lớp 1 hay lớp 0. Kết quả này dùng để quyết định
đường phân chia là đường trực giao với W, quyết định sự phân chia vector đầu
vào.

Có 3 trường hợp có thể xảy ra với một nơ-ron mỗi khi vector đầu vào p đưa vào
và đáp ứng mạng a được tính toán:

 Trường hợp 1: Nếu đầu vào được đưa vào và có đầu ra của nơ-ron đúng
với kết quả mong muốn (a=t, và e=t-a=0), thì trọng số sẽ không thay đổi.
 Trường hợp 2: Nếu đầu ra nơ-ron bằng 0 và kết quả mong muốn là 1 (a=0,
và t=1, e=t-a=1), vector đầu vào p làm tăng vector trọng w. Điều này làm
cho vector trọng tiến gần với vector vào, dần dần khả năng vector vào sẽ
được phân loại a = 1 trong tương lai.
 Trường hợp 3: Nếu đầu ra nơ-ron bằng 1 và kết quả mong muốn là 0 (a=1,
t=0, e=t-a=-1), vector đầu vào p làm giảm vector trọng w. Điều đó làm cho
vector trọng càng xa vector vào, dần dần vector vào sẽ phân loại a = 0 trong
tương lai.
Luật học perceptron có thể được viết lại ngắn gọn hơn sự sai lệch e=t-a, và sự
thay đổi của vector trọng dw (delta weight):

 Trường hợp 1: nếu e = 0, thì dw = 0.


 Trường hợp 2: Nếu e = 1, thì dw = p{T}.
 Trường hợp 3: Nếu e = -1, thì dw = -p{T}.
Tất cả 3 trường hợp trên có thể viết lại bằng một biểu thức đơn giản:
Ta có thể nhận được biểu thức để thay đổi bias của nơ-ron, với bias chỉ là trọng
số của đầu vào bằng 1:

Đối với trường hợp của một lớp nơ-ron ta có:

Luật học Perceptron có thể tóm tắt như sau:

trong đó e=t-a.
Bây giờ ta thử một bài ví dụ đơn giản. Bắt đầu với một mạng nơ-ron đơn lớp có
vector đầu vào với 2 phần tử.

MÃ:

net = newp([-2 2;-2 2],1);


Để đơn giản ta thiết lập bias bằng 0 và trọng số bằng [1 -0.8]
MÃ:

net.b{1} = 0;
W = [1 -0.8];
net.IW{1,1} = W;
Có đầu vào và kết quả đầu ra mong muốn:
MÃ:

p = [1;2];
t = 1;
Ta có thể tính toán đầu vào và độ sai lệch với
MÃ:

a = sim(net,p)
a =
0
e = t - a
e =
1
và ta sử dụng hàm learnp để tìm sự thay đổi của trọng số.
MÃ:
dw = learnp(w,p,[],[],[],[],e,[],[],[])
dw =
1 2
Trọng số mới thu được:
MÃ:

W = W + dw
W =
2 1.2
Việc tìm kiếm trọng số mới (và bias) được lặp đi nhiều lần đến khi độ sai lệch e
triệt tiêu.

Chú ý: Luật học Perceptron đảm bảo để hội tụ sau một số hữu hạn các bước của
tất cả các bài toán có thể giải quyết bằng perceptron. Nó bao hàm tất cả các bài
toán phân loại "Tách rời tuyến tính" (Linearly separable). Các đối tượng để phân
loại trong mọi trường hợp đều có thể cách ly bằng đường đơn.

Neural Network With Matlab #7:


Huấn luyện mạng và hạn chế của
Perceptron

Huấn luyện mạng (train)

Nếu sim và learnp được sử dụng lặp lại nhiều lần mỗi khi đưa dữ liệu vào
perceptron, và thay đổi trọng số w và bias b tùy theo sự sai lệch e (error),
perceptron sẽ tìm ra giá trị cuối cùng trọng số và bias để có thể giải quyết vấn đề,
giúp cho perceptron ngày càng hoàn thiện hơn. Mỗi đợt huấn luyện đầu vào đến
vector đầu ra mong muốn được gọi là một bước chạy epochs.

Hàm train đưa ra như một vòng lặp tính toán. Mỗi bước của hàm train xuyên suốt
từ đưa dữ liệu đầu vào, tính toán giá trị đầu ra, độ sai lệch và mạng tự điều chỉnh
cho mỗi vector đầu vào trong chuỗi vector đầu vào sẵn có.
Chú ý: Hàm train không đảm bảo kết quả mạng làm đúng công việc mong muốn.
Giá trị mới của W và b cần được kiểm tra bằng việc tính toán đầu ra của mạng với
mỗi vector đầu vào để thấy được sự sai khác so với kết quả mong muốn đạt được.
Nếu một mạng không làm việc hiệu quả thì phải huấn luyện lại bằng cách gọi
hàm train với trọng số và bias mới với nhiều bước chạy hơn nữa, hoặc vấn đề
cần phải được phân tích để thấy được nó có phù hợp cho perceptron. Vấn đề
không thể giải quyết được ở mạng perceptron sẽ được giải đáp trong phần "Hạn
chế và cẩn trọng của mạng Perceptron" tiếp theo.

Để có thể minh họa rõ hơn về thủ tục huấn luyện, ta sẽ làm việc với một vấn đề
đơn giản. Xét một mạng perceptron với một vector đầu vào 2 phần tử.

Đây là một mạng đơn giản đủ để ta có thể tính toán bằng tay nếu muốn. Giả thiết
ta sử dụng mạng để giải quyết bài toán phân loại và hoàn thiện nó với cặp vector
đầu vào và kết quả đầu ra mong muốn.

Sử dụng trọng số và bias ban đầu. Ta thể hiện sự thay đổi tại mỗi bước tính toán
bằng cách sử dụng con số trong ngoặc đơn sau mỗi biến. Như vậy, ta có giá trị
ban đầu là W(0) và b(0).

Ta bắt đầu tính toán đầu ra với vector đầu vào p1, với trọng số và bias ban đầu:
Kết quả đầu ra không đúng với mục tiêu t1, nên ta sử dụng luật perceptron để tìm
ra sự thay đổi của trọng số và bias dựa vào sự sai lệch e=t-a.

Ta có thể tính trọng số và bias mới sử dụng các quy tắc cập nhật Perceptron đã
đề cập ở bài trước:

Với vector đầu vào tiếp theo p2 được đưa vào. Giá trị đầu ra:

Lần này, độ sai lệch bằng 0 (e=t-a=1-1=0). Sẽ không có sự thay đổi của trọng số
và bias, W(2)=W(1)=[-2 2] và b(2)=b(1)=-1.

Ta có thể tiếp tục với các kiểu đầu vào khác, tiếp tục sẽ là p3, tương tụ tính toán
đầu ra và độ sai lệch để từ đó tìm sự thay đổi của trọng số và bias,... Sau một
bước chạy với tất cả 4 vector đầu vào, ta nhận được giá trị W(4) = [-3 -1] và b(4)
= 0. Để có thể xác định rõ kết quả đạt được có thỏa mãn yêu cầu, ta cần thêm một
lượt chạy (pass) nữa với 4 vector đầu vào như trước để có thể thấy được kết quả
đầu ra có giống với kết quả mong muốn hay không. Điều đó không đúng với đầu
vào thứ 4, nhưng thuật toán được hội tụ trong lần thứ 6. Kết quả cuối cùng đạt
được: W(6) = [-2 -3] và b(6) = 1.

Kết thúc việc tính toán bằng tay. Bây giờ ta sẽ sử dụng hàm train để huấn luyện.
Ta định nghĩa lại perceptron với trọng số w = [0 0] và bias b = 0.
MÃ:

net = newp([-2 2;-2 2],1);


Ta xét với chỉ một đầu vào và kết quả mong muốn đạt được.
MÃ:

p = [2;2];
t = 0;
Ta thiết lập epochs bằng 1 (chu kỳ bằng 1), thì hàm train sẽ chỉ hoạt động ở 1 chu kỳ.
MÃ:

net.trainParam.epochs = 1;
net = train(net,p,t);
Ta sẽ có trọng số và bias mới:
MÃ:

net.IW{1,1}
ans =
-2 -2
net.b{1}
ans =
-1
Như vậy, với trọng số và bias ban đầu bằng 0, và sau khi huấn luyện với 1 vector đầu vào,
giá trị của trọng số và bias đã được thay đổi thành [-2 -2] và -1, giống với khi ta tính bằng
tay.

Ta tiếp tục với vector đầu vào p2. Đầu ra là 1, như thế sẽ không có sự thay đổi của trọng
số và bias vì kết quả mong muốn là 1, độ sai lệch sẽ là 0. Ta sẽ tiếp tục đưa vào những
vector đầu vào tiếp theo, bắt đầu với kết quả trước đó và cập nhật đầu vào tiếp theo sau
đó. Nhưng mọi việc đều được tự động với hàm train.

Bây giờ ứng dụng hàm train với một epochs, một lượt chạy với chuỗi là tất cả các vector
đầu vào. Bắt đầu với việc thiết lập mạng.
MÃ:

net = newp([-2 2;-2 2],1);


net.trainParam.epochs = 1;
Các vector đầu vào và kết quả mong muốn:
MÃ:
p = [[2;2] [1;-2] [-2;2] [-1;1]];
t = [0 1 0 1];
Và huấn luyện với

MÃ:

net = train(net,p,t);
Ta sẽ có trọng số và bias mới:
MÃ:

w = net.IW{1,1}
w =
-3 -1
b = net.b{1}
b =
0
Chú ý: kết quả đạt được giống với kết quả khi ta tính bằng tay. Ta thử lại mạng đã được
huấn luyện với mỗi đầu vào.
MÃ:

a = sim(net,p)
a =
0 0 1 1
Kết quả đầu ra không giống với kết quả mong muốn ([0 1 0 1]), ta cần huấn luyện mạng
thêm 1 lần nữa. Ta sẽ thực hiện với 4 epochs.
MÃ:

p = [[2;2] [1;-2] [-2;2] [-1;1]];


t = [0 1 0 1];
net = newp([-2 2;-2 2],1);
net.trainParam.epochs = 4;
net = train(net,p,t);
Ta sẽ nhận được bảng quá trình huấn luyện.
Ở mục Progress/Epoch ta thấy mạng được huấn luyện chỉ với 2 chu kỳ. Ta nhận được
trọng số và bias mới.
MÃ:

w = net.IW{1,1}
w =
-2 -3
b = net.b{1}
b =
1
Kết quả mô phỏng ở đầu ra và độ sai lệch vào riêng biệt là:
MÃ:

a = sim(net,p)
a =
0 1 0 1
e = [a(1)-t(1) a(2)-t(2) a(3)-t(3) a(4)-t(4)]
e =
0 0 0 0
Như vậy, mạng đã được huấn luyện thành công. Mạng hội tụ và đầu ra đúng với mục tiêu
của 4 vector đầu vào.

Chú ý: hàm huấn luyện mặc định của mạng được tạo bởi newp là trainc (Có thể được tìm
thấy trong net.trainFcn). Trong đó, mỗi thành viên của véc tơ vào được áp dụng riêng lẻ
thành chuỗi và sự hiệu chỉnh hàm trọng và độ dốc được tiến hành sau mỗi lần xuất hiện
của 1 véc tơ vào. Vậy huấn luyện perceptron với train sẽ được hội tụ ở một số hữu hạn
các bước ngoại trừ với các bài toán không thể hoàn thiện ở perceptron đơn giản.

Hàm train có để được sử dụng với các phương pháp khác nhau nhưng vẫn cho kết quả
tốt. Để biết rõ hơn, ta viết lệnh 'help train'.

Hạn chế của Perceptron


Mạng Perceptron có thể được huấn luyện bằng hàm adapt, nó đưa lần lượt các
vector đầu vào đến mạng và tiến hành điều chỉnh mạng dựa trên kết quả của mỗi
lần thực hiện. Sử dụng adapt đảm bảo một bài toán độc lập tuyến tính bất kỳ sẽ
được giải quyết trong một số hữu hạn các bước huấn luyện. Perceptron có thể
được huấn luyện với hàm train. Nó sẽ đưa các vector đầu vào đến mạng theo kiểu
gói (batch), và điều chỉnh mạng dựa trên tổng tất cả các hiệu chỉnh thành phần.
Tuy nhiên, đến nay ta chưa chứng minh được sự hội tụ thuật toán huấn luyện của
perceptron.

Mạng perceptron có một vài hạn chế sau:

 Giá trị đầu ra của mạng perceptron chỉ có thể là 2 giá trị 0 hoặc 1.
 Chỉ có thể phân loại tuyến tính. Nếu là đường thẳng hay mặt phẳng ta có
thể vẽ tách rời các vector đầu vào thành các loại chính xác, các vector vào
là độc lập tuyến tính. Nếu không phải là độc lập tuyến tính, việc học sẽ
không bao giờ đạt tới mức các vector được phân loại chính xác. Tuy nhiên,
điều đó cũng chứng minh được nếu các vector độc lập tuyến tính, việc huấn
luyện perceptron sẽ luôn tìm được đáp án trong thời gian hữu hạn.
Ta có thể sử dụng nhiều nơ-ron perceptron để giải quyết những bài toán phức tạp
hơn. Ví dụ, giả sử ta có 4 vector và muốn phân ra thành từng nhóm riêng, ta cần
2 đường phân chia để chia làm 4 phần. Một mạng 2 nơ-ron có thể được thiết
lập sao cho chia các vector đầu vào thành 4 phần khác nhau với các kết quả
tương ứng 00 01 10 11.
Sự bất thường và luật Perceptron mở rộng

Thời gian huấn luyện dài có thể có những vector vào bất thường xuất hiện, chúng
có kích thước quá lớn hoặc quá nhỏ so với các vector vào khác. Việc áp dụng luật
học perceptron bao gồm cộng hoặc trừ đi các vector vào dựa vào trọng số và bias
của đáp ứng từ độ sai lệch. Do đó, một đầu vào với phần tử lớn có thể làm thay
đổi trọng số và bias mất thời gian hơn nhiều lần vector vào nhỏ.

Bằng cách điều chỉnh lại luật học perceptron, thời gian huấn luyện có thể thích hợp
cho các vector vào rất lớn hoặc rất nhỏ.

Luật gốc để cập nhật trọng số là:

Như đã chỉ ra ở trên, độ lớn của vector vào p, có tác động lên vector trọng số W.
Do đó, nếu một vector vào lớn hơn với các vector vào khác, các vector vào nhỏ
chỉ cần một thời gian ngắn để có kết quả.

Để giải quyết nhược điểm này, ta đưa ra luật học mở rộng. Khi đó, tác động của
mỗi vector vào lên trọng số:

trong đó: ||p||: mô đun của vector vào


Luật mở rộng được thực hiện nhờ hàm learnpn. Hàm luật perceptron mở rộng
learnpn làm giảm bớt số thời gian thực hiện, nhưng làm giảm số lần huấn luyện
một cách đáng kể nếu có vector vào bất thường.

Neural Network With Matlab #8:


GUI trong mạng nơ-ron

Giới thiệu về GUI


Giao diện đồ họa (Graphical User Interface - GUI) được thiết kế đơn giản và thân
thiện. Cửa sổ giao diện đồ họa có một vùng làm việc của nó tách rời khỏi các dòng
lệnh của vùng làm việc. Vì vậy khi sử dụng GUI ta cần phải xuất kết quả GUI sang
(dòng lệnh) vùng làm việc. Tương tự ta có thể nhận kết quả từ dòng lệnh làm việc
đển GUI.

Mỗi lần Network/Data Manager được đưa ra và chạy, ta có thể thiết lập mạng,
quan sát, huấn luyện, mô phỏng nó và xuất kết quả cuối cùng vào vùng làm việc.

Tương tự, ta có thể lấy dữ liệu từ vùng làm việc để sử dụng trong GUI.

Ví dụ sau đây với mạng perceptron, ta sẽ đi qua tất cả các bước để thiết lập mạng
và chỉ rõ ra có thể làm gì để được những điều mong muốn.

Thiết lập mạng Perceptron (nntool)

Ta tạo một mạng nơ-ron hoạt động như một cổng logic AND. Nó có 2 vector đầu
vào
p = [0 0 1 1;0 1 0 1] và kết quả t = [0 0 0 1]. Ta gọi mạng tên là ANDnet. Mỗi lần
thiết lập, mạng sẽ được huấn luyện. Sau đó ta có thể lưu mạng, đầu ra,.... bằng
"exporting" trong cửa sổ dòng lệnh.

Để bắt đầu, ta gõ lệnh 'nntool' trên cửa sổ command window. Xuất hiện cửa sổ
sau
Trong đó:
(1) chứa danh sách các đầu vào.
(2) chứa danh sách kết quả mong muốn.
(3) chứa danh sách các đầu vào trễ.
(4) chứa danh sách các mạng nơ-ron.
(5) chứa danh sách các kết quả đầu ra của mạng.
(6) chứa danh sách các độ sai lệch của mạng.
(7) chứa danh sách các trạng thái lớp trễ của mạng có trễ.
(8 ) nhập dữ liệu và mạng từ bên ngoài vào GUI.
(9) tạo mới mạng và dữ liệu.
(10) chọn dữ liệu hoặc mạng để edit.
(11) xuất dữ liệu và mạng ra bên ngoài GUI.
(12) Xóa dữ liệu hoặc mạng được chọn.

Đầu vào và kết quả mong muốn

Đầu tiên, ta cần có một đầu vào mạng gọi là p, và mang giá trị [0 0 1 1;0 1 0 1]. Do đó,
mạng sẽ có 2 phần tử đầu vào và 4 nhóm với 2 phần tử được đưa vào huấn luyện. Để
thiết lập dữ liệu, click New... và ta sẽ có một cửa sổ mới. Đến tab Data, ta nhập tên dữ
liệu ở phần Name và điền giá trị dữ liệu ở phần Value. Ở đây, Name sẽ là p và Value là
[0 0 1 1;0 1 0 1]. Sau đó chọn Inputs và click vào Create để tạo ra đầu vào dữ liệu p.

Tiếp theo ta tạo kết quả mong muốn của mạng. Tương tự cách làm với đầu vào, nhưng
phần Data Type ta chọn Targets, Name : t, Value : [0 0 0 1].
Tạo mạng

Ta sẽ tạo một mạng mới, và gọi nó là ANDnet. Lúc này, ta click vào New..., ở tab Network,
ta điền tên mạng vào phần Name (ANDnet). Ta hiệu chỉnh như trong hình:

Ta có thể thấy được hình dáng của mạng bằng cách click vào View.

Ta có thể thấy mạng được tạo ra với đầu vào 2 phần tử, 1 hàm truyền hard-limit và 1 đầu
ra. Đây chính là mạng perceptron ta muốn.

Huấn luyện Perceptron

Để huấn luyện mạng, ta click vào tên của mạng (ANDnet) ở phần Network (4). Ở đây, ta
có tab Simulate (để mô phỏng mạng), Adapt (Huấn luyện bằng hàm Adapt), Reinitialize
Weights (Thiết lập giới hạn của đầu vào, khởi tạo lại cho mạng), View/Edit Weight (Theo
dõi và edit trọng số và bias của mạng) và Train (Huấn luyện mạng bằng hàm train). Để
huấn luyện mạng, ta chọn tab Train, chọn tiếp tab Training Info để có thể thiết lập đầu
vào và kết quả mong muốn huấn luyện, tab Training Parameters để thiết lập cho quá
trình huấn luyện.

Chú ý: ở mục Outputs và Errors có tên của mạng ở phía trước giúp cho ta dễ dàng phân
biệt được với các mạng khác.

Ta click vào Train Network để huấn luyện mạng perceptron. Ta sẽ thấy kết quả huấn
luyện:
MÃ:

Training with TRAINC.


Calculation mode: MATLAB
Epoch 0/1000, Time 0.064, Performance 0.75/0
Epoch 5/1000, Time 0.219, Performance 0/0
Training with TRAINC completed: Performance goal met.
Sau 5 lượt huấn luyện thì độ sai lệch là bằng 0. Có thể kiểm tra lại lại mạng bằng cách mô
phỏng với các kết quả khác nhau. Để có thể mô phỏng ta click chọn ANDnet và chọn tab
Simulate, đưa giá trị vào p và click vào Simulate Network để có thể mô phỏng (nhớ tên
của đầu ra, ở đây là "ANDnet_outputs").

Ta chọn "ANDnet_outputs" ở phần Output Data để kiểm tra kết quả. Ta nhận được

Chính xác với kết quả ta mong đợi.

Ta có thể tạo lên các mạng cho các cổng logic khác như OR,NOT...

You might also like