Ta sử dụng một số kí hiệu sau: j: nơ-ron thứ j (hay nút thứ j) j: vector đầu vào của nút thứ j : vector trọng số của nút thứ j xji: đầu vào của nút thứ j từ nút thứ i wji: trọng số trên xji
bj: ngưỡng tại nút thứ j
uj = j. j - bj: tổng trọng số trên các đầu vào của nút thứ j oj: đầu ra của nút thứ j (với oj = f(uj))
Downstream(j): Tập tất cả các nút nhận đầu ra của nút thứ j làm một giá trị đầu vào. Outputs: Tập các nút trong tầng ra η: tốc độ học f: hàm truyền với: và:
Ta tìm công thức tính wji , sự thay đổi trọng số trong mỗi lần cập nhật. Δwji
Với:
trong đó E là hàm lỗi.
Do trọng số được cập nhật sau mỗi mẫu huấn luyện, để đơn giản có thể coi tập huấn luyện chỉ gồm một mẫu. Khi đó hàm lỗi được tính như sau:
Theo quy tắc chuỗi ta có:
Mặt khác:
do đó:
Thay lại (1) ta được:
a. Trường hợp 1: j là nơ-ron tầng ra (j Outputs) Đặt:
ta có:
Do tất cả các nút đầu ra k ≠ j là độc lập với , wji ta có thể coi:
Khi đó:
b. Trường hợp 2: j là nơ-ron tầng ẩn Ta có hai nhận xét quan trọng sau:
1. Với mỗi nút k Downstream(j), uk là một hàm của uj
2. Việc tạo ra lỗi của tất cả các nút l ≠ j trong cùng một tầng với j là độc lập với wji
Cũng theo quy tắc chuỗi:
Ta sẽ có:
(chú ý rằng công thức (3) là áp dụng cho các nơ-ron tầng ẩn, công thức (2) ở trên là áp dụng cho các nơ-ron tầng ra).
Mặt khác lại có:
Từ đó:
Như vậy từ (2) và (3) ta thấy rằng trong mọi trường hợp đều có:
Trong đó δj được tính như sau: Với j là nút xuất thì:
Với j là nút ẩn thì:
Thuật toán lan truyền ngược được mô tả như sau:
Input: Mạng feed-forward với ni đầu vào, nh nút ẩn và no đầu ra.
+ Hệ số học η
+ Tập dữ liệu huấn luyện D = {( ) | = (x1, x2, …, xn) là vector đầu vào, | = (t1, t2, …, tn) là vector đầu ra mong muốn}.
Output: Các vector trọng số j
Thuật toán:
Bước 2: Lặp lại cho tới khi thỏa mãn điều kiện kết thúc.
Với mỗi mẫu ( ) D , thực hiện các bước sau: 2.1 Tính đầu ra oj cho mỗi nút j
2.2 Với mỗi nút k thuộc tầng ra, tính δk theo công thức:
2.3 Với mỗi nút h thuộc tầng ẩn, tính δh theo công thức:
2.4. Cập nhật:
wji = wji + Δwji , trong đó Δwji = ηδjxji