Neural Network With Matlab #7: Huấn luyện mạng và hạn chế của Perceptron

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

Chia sẻ trang này

Lượt xem: 1,833

  1. Cu Bo

    By:Cu Boin: 26 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 #7:
    Huấn luyện mạng và hạn chế của Perceptron



    [​IMG]

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

    Nếu sim 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.

    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 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ử.

    [​IMG]
    Đâ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.
    [​IMG]
    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)b(0).
    [​IMG]
    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:
    [​IMG]
    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.
    [​IMG]
    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:
    [​IMG]
    Với vector đầu vào tiếp theo p2 được đưa vào. Giá trị đầu ra:
    [​IMG]
    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] 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]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);

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

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

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

    [​IMG]
    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.
     
    Last edited: 27 Tháng bảy 2016
    Lu ROm thích bài này.