Nơ-ron và lan truyền xuôi
Nơ-ron và lan truyền xuôi
Trượt đầu vào và trọng số, rồi theo đúng một con số chảy từ đầu vào tới đầu ra qua hai lớp.
Bài vector và tích vô hướng đã chỉ ra tích vô hướng chính là phép tính của một nơ-ron, và bài hàm kích hoạt đã mổ bốn hàm kích hoạt cùng đạo hàm của chúng. Bài này không làm lại hai chỗ đó. Nó lắp chúng vào một mạng chạy được rồi hỏi ba câu mà từng mảnh rời không trả lời được: bias để làm gì, một lớp khác một nơ-ron ở chỗ nào, và một con số cụ thể biến thành cái gì sau khi đi qua hai lớp.
Mạng trong sim là 2 đầu vào, 2 nơ-ron ẩn, 1 đầu ra. Bảy trong chín tham số của nó là hằng số của bài, hai thanh kéo cuối chạm được đúng 2 tham số còn lại. Trượt thử rồi đọc từng số một.
Ở trạng thái mở bài, sim đang nói gì
Hai đầu vào là x₁ = 1.00 và x₂ = 0.50. Hai trọng số bạn điều khiển là 1.20 và 1.00. Hàm kích hoạt đang là sigmoid.
Lớp ẩn dùng trọng số cố định: h₁ lấy 1 nhân x₁ cộng -1 nhân x₂, h₂ lấy 1 nhân cả hai. Bias của chúng là 0 và -0.5, còn bias của nơ-ron ra là -0.3.
Vậy hai nơ-ron ẩn đang tính:
h₁: tổng có trọng sốz = 0 + 1·1.0 + (-1)·0.5, tức đúng0.5, rồisigmoid(0.5)cho0.6224593312018546, màn hình in0.62.h₂:z = -0.5 + 1·1.0 + 1·0.5, tức đúng1, rồisigmoid(1)cho0.7310585786300049, in0.73.
Nơ-ron ra cộng ba số: bias -0.3, rồi 1.2 nhân 0.6224593312018546 bằng 0.7469511974422255, rồi 1.0 nhân 0.7310585786300049 bằng chính nó. Tổng là 1.1780097760722303, in ra z = 1.18, và sigmoid của nó là 0.7645897675287274, in 0.76.
Đổi hàm kích hoạt sang ReLU thì hai tổng có trọng số của lớp ẩn không đổi một chút nào, vẫn 0.5 và 1, nhưng a của chúng thành 0.5 và 1, nên tổng ở nơ-ron ra thành đúng 1.3 và đầu ra in 1.30. Đây là trạng thái duy nhất của sim mà cả đường tính không có một phép làm tròn nào: -0.3 + 1.2·0.5 + 1·1 đúng bằng 1.3 trên số thực 64 bit.
Một nơ-ron làm đúng hai việc, và bạn tính lại được bằng tay
Việc thứ nhất là tổng có trọng số cộng bias, gọi là z. Việc thứ hai là đưa z qua hàm kích hoạt để ra a. Không có việc thứ ba.
Hãy tính lại h₁ bằng bút: 1 nhân 1.0 là 1, -1 nhân 0.5 là -0.5, cộng bias 0 được 0.5. Sim in z = 0.50 ở dưới ô h₁, khớp. Rồi h₂: 1 cộng 0.5 cộng bias -0.5 được 1, và sim in z = 1.00. Hai con số này là toàn bộ phần bạn phải nhớ về một nơ-ron.
Chỗ mọi người hay lẫn là thứ tự. Nếu cho từng đầu vào qua hàm kích hoạt trước rồi mới cộng thì h₁ sẽ ra sigmoid(1.0) - sigmoid(0.5), tức 0.1085992474281503, khác hẳn 0.6224593312018546. Cộng trước rồi ép sau, không bao giờ ngược lại.
Điều cần chú ý: trong sim, z của nơ-ron ra không dùng x₁ và x₂. Nó dùng 0.6224593312018546 và 0.7310585786300049, tức hai giá trị a của lớp ẩn. Đó chính là chữ "xuôi" trong lan truyền xuôi: đầu ra của lớp này là đầu vào của lớp sau, và hai đầu vào gốc không còn xuất hiện trực tiếp ở đâu nữa.
bias làm được gì mà trọng số không làm được
Trọng số quyết định nơ-ron nhạy với đầu vào tới mức nào. Bias quyết định nó bắt đầu kêu từ đâu. Hai chuyện khác nhau, và tách được bằng số.
Lấy đúng hàng của h₂, tức trọng số 1 và 1, giữ x₂ = 0.5. Nếu bỏ bias đi thì tổng có trọng số bằng 0 tại x₁ = -0.5. Cho bias -0.5 vào thì mốc đó dịch sang x₁ = 0, tức dịch đúng 0.5, và 0.5 chính là -b/w. Trong khi đó mỗi bước thanh kéo vẫn làm tổng dịch đúng như trước: quét cả 1640 bước của x₁ trên 41 giá trị của x₂, hàng có bias và hàng không có bias dịch cùng một lượng.
Cần một dấu sao ở đây, và cổng kiểm là chỗ tìm ra nó. "Cùng một lượng" đúng trong đại số nhưng không đúng tới từng bit: hai lượng dịch khớp bit y nguyên ở 1099 trong 1640 bước, và chỗ lệch nhiều nhất là 8.881784197001252e-16, đúng bốn đơn vị cuối tại 1. Nghĩa là bias không làm đổi độ nhạy, sai khác duy nhất là làm tròn, và bài này viết ngưỡng chứ không viết dấu bằng.
Còn hai nơ-ron ẩn của sim thì không phải phép thử tách bạch đó, và đây là chỗ dễ kết luận sai. Mốc của h₁ ở x₁ = 0.5, mốc của h₂ ở x₁ = 0, cách nhau 0.5. Nhưng 0.5 đó không phải công của bias: bias kéo mốc đi -0.5 còn trọng số khác dấu trên x₂ đẩy mốc đi +1, cộng lại mới thành +0.5. Muốn nói về bias thì phải giữ nguyên hàng trọng số, như đoạn trên.
Muốn thấy trọng số làm việc khác thật: nhân đôi cả hàng của h₁ thành 2 và -2 thì mỗi bước thanh kéo làm tổng dịch khoảng 0.2 thay vì khoảng 0.1, còn mốc vẫn nằm y nguyên ở chỗ x₁ = x₂. Trọng số đổi độ dốc mà không đổi mốc, bias đổi mốc mà không đổi độ dốc.
Một lớp là nhiều nơ-ron dùng chung đầu vào
Hai nơ-ron ẩn nhận cùng một vector [x₁, x₂]. Chúng khác nhau đúng ở hàng trọng số của mình: [1, -1] và [1, 1]. Vì vậy ở trạng thái mở bài chúng cho hai số khác nhau, 0.5 và 1, dù đọc chung một đầu vào.
Xếp hai hàng đó thành một bảng 2 nhân 2 thì phép tính của cả lớp là một phép nhân ma trận với vector, cộng vector bias. Không phải một cách nói cho oai: cổng kiểm chạy phép nhân ma trận của engine và một vòng lặp từng nơ-ron viết riêng trong cổng, đối chiếu trên 3362 tổng của lớp ẩn và trên cả 5651522 trạng thái bấm tới được, và hai đường cho kết quả khớp tới từng bit ở mọi chỗ.
Giá của lớp ẩn ở trạng thái mở bài là 4 phép nhân và 4 phép cộng: một phép nhân cho mỗi trọng số, và bộ cộng dồn bắt đầu ngay từ bias nên bias không tốn thêm phép cộng nào. Lớp ra 2 nhân 1 tốn 2 và 2. Cả lượt lan truyền xuôi vì thế là 6 phép nhân, 6 phép cộng và 3 lần gọi hàm kích hoạt. Toàn bộ mạng này rẻ tới mức đó, và mọi mạng lớn cũng chỉ là con số ấy nhân lên.
Đường đi của một con số qua hai lớp
Theo dõi đúng x₁ = 1.00 từ lúc vào tới lúc ra. Sáu chặng, và hai trong số đó là số hạng trung gian mà sim không in ra: số hạng của x₁ ở chặng 1 và số hạng sau khi nhân trọng số ở chặng 4.
x₁ = 1.00đi vàoh₁với trọng số1, nên số hạng của nó là1. Nó đi vàoh₂cũng với trọng số1, số hạng cũng là1. Một con số vào một lớp thì đi vào mọi nơ-ron của lớp đó cùng lúc.h₁cộng bias0và hai số hạng thành0.5, in raz = 0.50.sigmoidbiến0.5thành0.6224593312018546, in0.62.- Trọng số
1.2biến nó thành0.7469511974422255. Trên hình đây là dây dày nhất của mạng, vì nó là trọng số lớn nhất. - Nơ-ron ra cộng số hạng đó với
0.7310585786300049từh₂và bias-0.3, được1.1780097760722303, inz = 1.18. sigmoidcho0.7645897675287274, in0.76, và đó là số trong ô đọc kết quả.
Ảnh hưởng của một con số co lại trên đường đi, và điều đó đo được: đẩy x₁ lên một bước thành 1.1 thì đầu ra chỉ nhích 0.008360858502519442, tức đầu vào dịch 0.1 mà đầu ra dịch chưa tới một phần mười lượng đó. Trên màn hình bạn thấy 0.76 thành 0.77. Chuỗi số nhân dồn ấy chính là chỗ bài lan truyền ngược đi vào, chỉ theo chiều ngược lại.
Mốc kích hoạt: chỗ tổng có trọng số bằng đúng 0
Với h₁, tổng có trọng số là x₁ - x₂, nên giải một dòng ra ngay: nó bằng 0 tại x₁ = x₂. Ở x₂ = 0.50 mặc định thì mốc là x₁ = 0.5, và mốc đó nằm đúng trên lưới thanh kéo nên bạn ngồi lên được.
Kéo tới x₁ = 0.5 thì z của h₁ bằng đúng 0 và a bằng đúng 0.5, không phải xấp xỉ: sigmoid(0) = 1/(1+1). Lùi một bước sang 0.4 thì z là -0.09999999999999998 và a là 0.47502081252106, in 0.48. Tiến một bước sang 0.6 thì z là 0.09999999999999998 và a là 0.5249791874789399, in 0.52.
Hai chi tiết đáng dừng lại. Thứ nhất, z một bước dưới mốc không phải số -0.1: một bước lưới của thanh kéo không cho ra một hiệu tròn trịa. Thứ hai, mỗi bước làm a dịch khoảng 0.0249791874789399, tức số in ra dịch 0.02, gấp đôi độ chia 0.01 của màn hình. Nhờ vậy ba trạng thái cho ba chuỗi khác nhau và mốc nhìn thấy được. Nếu bước thử nhỏ hơn độ chia thì phép thử này chẳng chứng minh được gì, và đó là lý do phải đo con số 0.02 chứ không đoán.
Nơ-ron ra cũng có mốc của nó, nhưng nó rơi vào chỗ không bấm tới được. Giữ nguyên mọi thứ khác, tổng ở nơ-ron ra bằng 0 tại wo₁ = -0.6925088227012518, nằm giữa hai bước lưới -0.7 và -0.6. Ở -0.7 tổng là -0.004662953211293286, còn ở -0.6 là 0.05758297990889216, tức dấu đã đổi giữa hai bước. Và ở -0.7 màn hình in z = -0.00 cùng a = 0.50: cả hai đều là làm tròn, không phải 0 và không phải một nửa. Đọc -0.00 thì hiểu là "âm nhưng bé", đừng hiểu là "bằng không".
Đặt hết trọng số về 0 là bế tắc
Kéo cả hai trọng số bạn điều khiển về 0 rồi trượt hai đầu vào khắp nơi. Đầu ra không nhúc nhích: quét cả 1681 cặp đầu vào, sigmoid cho đúng một số 0.425557483188341 ở mọi cặp, in 0.43, còn ReLU cho đúng 0, in 0.00. Tổng ở nơ-ron ra bằng đúng bias -0.3 không lệch một bit, vì 0 nhân bất cứ gì cũng không thêm gì vào bộ cộng dồn. Cả lớp ẩn, cả hai đầu vào, đã mất đường tới đầu ra.
Câu chuyện thường được kể tiếp là: khởi tạo mọi trọng số bằng 0 thì mọi nơ-ron trong một lớp tính ra cùng một số nên chúng không bao giờ phân hoá. Câu đó thiếu một điều kiện, và sim này là phản ví dụ. Đặt hết trọng số của lớp ẩn về 0 mà giữ nguyên bias 0 và -0.5 thì hai nơ-ron ẩn lệch nhau đúng 0.5 ở cả 1681 cặp đầu vào và không bằng nhau ở một cặp nào. Chỉ khi zero cả bias nữa thì chúng mới bằng nhau ở cả 1681 cặp, và lúc đó lớp mới thật sự là một nơ-ron đội hai mũ: đầu vào hết ý nghĩa, mọi hàng đều trả về bias.
Vậy phát biểu đúng là: bế tắc cần trọng số giống nhau và bias giống nhau. Sim chỉ dựng được nửa đầu ra của chuyện này, vì bias của lớp ẩn là hằng số và không thanh kéo nào chạm tới; nửa còn lại là phép đo trong cổng kiểm, không phải thứ bạn bấm ra được trên màn hình. Bài khởi tạo trọng số đi vào chuyện chọn số ban đầu như thế nào cho tín hiệu không tóp cũng không bùng.
Số tham số của một lớp
Công thức ngắn: số vào × số ra + số ra. Phần đầu là một trọng số cho mỗi cặp vào ra, phần sau là một bias cho mỗi nơ-ron ra.
Mạng trong sim: lớp ẩn 2 × 2 + 2 = 6, lớp ra 2 × 1 + 1 = 3, tổng 9 tham số. Trong 9 số đó, hai thanh kéo cuối chạm được 2, còn 7 là hằng số của bài.
Con số này lớn rất nhanh, và nó lớn theo chiều rộng:
| lớp | số tham số |
|---|---|
2 vào, 2 ra, tức lớp ẩn của sim | 6 |
784 vào, 128 ra, tức ảnh 28 × 28 vào một lớp ẩn | 100480 |
1024 vào, 1024 ra | 1049600 |
4096 vào, 4096 ra | 16781312 |
Nhân đôi cả hai chiều thì số tham số gấp 15.99 lần, tức gần bốn lần bình phương, vì phần trọng số là một tích. Còn bias là phần rẻ tới mức gần như không đáng kể: 128 trong 100480 số của lớp 784 vào 128 ra, đúng một trên 785.
Chỗ màn hình nói dối, và một chuyện về thứ tự cộng
Trước hết là một chuyện về số thực mà bài này không giấu. Phép cộng dấu phẩy động không cho cùng kết quả khi bạn đổi thứ tự cộng dồn. Engine cộng từ bias rồi lần lượt từng số hạng từ trái sang phải. Cổng kiểm cộng đúng các số hạng ấy theo thứ tự ngược lại và so từng bit trên cả 5651522 trạng thái: 4506161 trạng thái cho kết quả khớp y nguyên, còn 1145361 trạng thái, tức 20.3 phần trăm, cho hai số khác nhau. Khe lệch tệ nhất là 8.881784197001252e-16 ở cả lớp ẩn lẫn lớp ra. Nhỏ, nhưng khác 0, nên "cộng theo thứ tự nào cũng thế" là một câu sai; câu đúng là "lệch không quá bốn đơn vị cuối tại 1".
Rồi tới màn hình. Nó in hai chữ số thập phân, và ba chỗ sau đây là chỗ nó nói không hết:
- Trong
1681cặp trọng số bấm tới được, có3cặp làm một ô in ra-0.00. Cả ba đều là tổng ở nơ-ron ra vừa lọt xuống dưới0, thật sự âm, chỉ là quá bé để hiện. - Có
4trong1681cặp đầu vào mà chuyển giữasigmoidvàReLUkhông đổi một chữ nào trên ô đọc kết quả. Ví dụx₁ = 0.7vớix₂ = 0:sigmoidcho0.7410934075940002,ReLUcho0.74, cả hai in0.74. Ở1677cặp còn lại thì nó đổi. Một bộ quét núm chết chỉ đọc chữ trên màn hình, nếu xuất phát từ đúng bốn trạng thái đó, sẽ báo cái ô chọn này chết, và nó sai. - Cả không gian
5651522trạng thái chỉ in ra680chuỗi khác nhau, tức trung bình khoảng8311trạng thái dùng chung một chuỗi. Sim chính xác hơn ô đọc kết quả của nó rất nhiều.
Cuối cùng là chỗ bài này không chứng minh gì. Trong sim không có dữ liệu, không có hàm mất mát, không có huấn luyện, nên không câu nào ở đây nói bộ trọng số 1, -1, 1, 1 là bộ tốt. Cổng kiểm chỉ canh được: với cấu hình này thì từng con số phải bằng đây. Chuyện trọng số nào tốt thuộc về phần huấn luyện, và ở đó chiều đi là chiều ngược.
Một nơ-ron làm hai việc: tổng có trọng số cộng bias, rồi hàm kích hoạt. Ở trạng thái mở bài h₁ cho z = 0.5 rồi a = 0.62, h₂ cho z = 1 rồi a = 0.73, và nơ-ron ra cộng -0.3 với 0.7469511974422255 và 0.7310585786300049 thành 1.1780097760722303 rồi in 0.76. Bias không đổi độ nhạy, nó dịch mốc kích hoạt đi -b/w, đo được là 0.5 khi thêm bias -0.5 vào một hàng trọng số 1. Một lớp là nhiều nơ-ron dùng chung đầu vào và khác nhau ở hàng trọng số, nên phép tính của cả lớp là một phép nhân ma trận: lớp ẩn ở đây tốn 4 phép nhân và 4 phép cộng, cả mạng tốn 6 và 6. Đặt hai trọng số ra về 0 thì đầu ra dính chặt ở sigmoid(-0.3) = 0.425557483188341 với mọi đầu vào; còn bế tắc "mọi nơ-ron ra cùng một số" cần trọng số giống nhau và bias giống nhau, vì zero trọng số mà giữ bias 0 và -0.5 thì hai nơ-ron ẩn vẫn lệch đúng 0.5 ở cả 1681 cặp. Số tham số của một lớp là số vào × số ra + số ra, 9 cho cả mạng này và 16781312 cho một lớp 4096 vào 4096 ra.
- 1Ở trạng thái mở bài, nơ-ron ẩn h₁ có z = 0.5 và a = 0.62, còn h₂ có z = 1 và a = 0.73. Nơ-ron ra cộng có trọng số những số nào?
- 2Giữ nguyên hàng trọng số 1 và 1 của một nơ-ron với x₂ = 0.5, rồi thêm bias -0.5. Cái gì đổi và cái gì không?
- 3Kéo cả hai trọng số vào nơ-ron ra về 0. Vì sao đó là một trạng thái bế tắc, và phát biểu "trọng số 0 làm mọi nơ-ron trong một lớp giống nhau" cần thêm điều kiện gì?