Một mạng nơron nhân tạo được tạo ra nhằm phục vụ cho một ứng dụng cụ thể (nhận dạng mẫu, phân loại dữ liệu,…) thông qua một quá trình học từ tập các mẫu học. Về bản chất, học chính là quá trình hiệu chỉnh trọng số liên kết giữa các nơron.
Do việc học hỏi trong mạng nơron dựa trên những kích thích bên ngoài nên trước khi cho mạng nơron hoạt động, ta cần phải có một tập dữ liệu để dạy cho nó. Sau quá trình này, mạng nơron đã sẵn sàng hoạt động và không học nữa để đảm bảo cho mạng nơron không rơi vào trạng thái bất ổn định.
Định luật Hebb: Gia tăng trọng số của kích thích nếu muốn đầu ra của nơron trở nên tác động đối với kích thích. Ngược lại, giảm trọng số của kích thích nếu không muốn đầu ra của nơron tác động đối với kích thích đó.
Định luật Hebb này là tiền đề cho tất cả các giải thuật học sau này. Hầu hết các giải thuật học đều dựa trên sai lệch giữa các kết quả thực hiện bởi mạng nơ ron với kết quả mong muốn. Đó là một quá trình sửa sai theo giải thuật tổng quát gọi là
lan truyền ngược sai lệch.
Trong quá trình học, giá trị đầu vào được đưa vào mạng và theo dòng chảy trong mạng tạo thành giá trị ở đầu ra. Tiếp theo là quá trình so sánh giá trị tạo ra bởi mạng nơ ron với giá trị ra mong muốn. Nếu hai giá trị này giống nhau thì không thay đổi gì cả. Tuy nhiên nếu có một sai lệch giữa hai giá trị này thì đi ngược mạng từ đầu ra về đầu vào để thay đổi một số kết nối. Đây là một quá trình lặp liên tục và có thể không dừng khi không thể tìm các giá trị w sao cho đầu ra tạo bởi mạng nơ ron bằng đúng đầu ra mong muốn. Do đó trong thực tế người ta phải thiết lập tiêu chuẩn dừng dựa trên một giá trị sai số nào đó của hai giá trị này, hay dựa trên một số lần lặp xác định.
Các phương pháp học gồm có học giám sát và học không giám sát. 2.2.2. Thuật toán
Thuật toán 1:
Các hoạt động của nơron được lưu trữ trong dãy nơron [N] và các trọng số liên kết trong weight [N]. Thuật toán học và dự đoán đơn giản là:
while (1) {
1.Đọc đầu vào:
if (getch() ==’1’) input = 1; else input = -1; runs++;
2.Tính thế:
for (h=0., i=0; i<N; i++) h+=weight[i]*neuron[i];
3.Đếm số các dự đoán đúng:
if (h*input > 0) correct++;
4.Học:
if (h*input < 0 for (i=0; i<N; i++)
weight[i] +=input*neuron[i]/(float)N;
5.Dịch cửa sổ:
for (i=N-1; i>0; i--) neuron[i] = neuron[i-1]; neuron[0] = input;
Thuật toán 2:
Bây giờ ta muốn lấy các đầu vào là 1 và 0 từ một file nào đó cho trước thì tệp này được mở ra cho việc tiếp cận đọc được thực hiện bởi các câu lệnh:
FILE*fp; char str[100];
if (argc ==1) {printf(“Input file name?”); scanf(“%s”, str);