Neural Network With Matlab #6: Luật học nơ-ron Perceptron

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

Chia sẻ trang này

Lượt xem: 1,271

  1. Cu Bo

    By:Cu Boin: 23 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 #6:
    Luật học nơ-ron Perceptron



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

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