Neural Network With Matlab #4: Huấn luyện mạng nơ-ron (Incremental Training - Huấn luyện gia tăng)

Thảo luận trong 'TRÍ TUỆ NHÂN TẠO' bắt đầu bởi Cu Bo, 18 Tháng bảy 2016.

Chia sẻ trang này

Lượt xem: 1,947

  1. Cu Bo

    By:Cu Boin: 18 Tháng bảy 2016
    Cu Bo

    Tham gia ngày:
    25 Tháng bảy 2014
    Bài viết:
    13
    Đã được thích:
    8
    Neural Network With Matlab #4:
    Huấn luyện mạng nơ-ron
    (Incremental Training - Huấn luyện gia tăng)

    [​IMG]
    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:

    [​IMG]
    Ta có đầu vào:
    [​IMG]
    Và đầu ra tương ứng:
    [​IMG]

    Đầ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;
    [​IMG]

    Để 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;

    [​IMG]

    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.