Nhập môn Trí tuệ Nhân tạo·Neural Networks - Mạng neural

Chế độ xem

Training Neural Networks - loss, gradient descent và backpropagation

Bài này trả lời hai câu hỏi đi cùng nhau: trọng số của một mạng neural từ đâu ra, và một loss đang giảm có nghĩa là mô hình đang đúng hay mới chỉ đúng trên phép tính vừa làm. Huấn luyện, hay training, ở đây là vòng lặp sửa tham số để một hàm loss nhỏ đi. Loss là một số đo độ sai của dự đoán so với nhãn.

Bạn có thể đọc bài này khi mới nhớ rằng một neuron tính tổng có trọng số, cộng bias, rồi đưa qua hàm kích hoạt. Phần tính tay dùng một loss bậc hai trên một trọng số, với tốc độ học 0.10.1, rồi một mạng hai tầng với các số giả định. Bài không dạy mạng nhìn ảnh, không dạy mạng đọc chuỗi, và không hướng dẫn viết một thư viện tối ưu.

Một loss giảm trên ví dụ vừa tính cho thấy bước đó đã đi xuống theo đúng công thức đã chọn. Nó chưa cho thấy mạng sẽ đúng trên dữ liệu chưa gặp. Phần thất bại tính một bước nhảy quá đà, nơi loss tăng từ 99 lên 12.9612.96, và nói gradient biến mất hoặc bùng bằng các tích lập lại.

Đường đọc nhanh: mục 1, mục 2, mục 3, mục 4, mục Khi cách này thất bại, mục 5, rồi phần Mang đi. Các mục Đào sâu nằm ngoài đường đó.

1. Vòng lặp nhìn từ ngoài

Một mạng đã có trọng số thì chỉ cần đi xuôi: đầu vào thành dự đoán. Người ta gọi đó là forward pass, lượt đi tới. Huấn luyện thêm ba việc. So dự đoán với nhãn để ra loss. Tính xem mỗi tham số đang đẩy loss lên hay xuống. Rồi đổi tham số một bước nhỏ theo hướng làm loss giảm, trên chính công thức đang dùng.

data
  -> forward pass
  -> prediction
  -> loss
  -> backpropagation
  -> update parameters
  -> lặp lại

Backpropagation, thường gọi tắt là backprop, là cách tính các đạo hàm riêng của loss theo từng tham số, đi từ loss ngược về các tầng trước. Gradient descent là cách dùng các đạo hàm đó để cập nhật tham số. Hai việc nối nhau trong vòng lặp, và vẫn là hai việc: một việc tính độ dốc, một việc bước theo độ dốc. Optimizer là quy tắc bước, trong đó gradient descent là dạng đơn giản nhất.

Tham số, ký hiệu gộp là θ\theta, gồm các ma trận trọng số và các bias. Kết luận của bài toán huấn luyện, viết cho một loss đã chọn, là tìm một bộ tham số làm loss đó nhỏ:

θ∗=arg⁡min⁡θL(θ)\theta^{*} = \arg\min_{\theta} L(\theta)

Không gian này có thể có rất nhiều chiều. Ta không thử hết các bộ trọng số. Ta đi từng bước, mỗi bước dùng độ dốc tại chỗ đứng.

Siêu tham số là số người thiết kế đặt trước khi vòng lặp chạy, hoặc chọn bằng một phép tìm bên ngoài: tốc độ học, cỡ batch, số vòng qua dữ liệu, số tầng. Bản thân vòng lặp không “học” tốc độ học theo cùng cách nó học trọng số, trừ khi ta dựng thêm một vòng ngoài. Giữ khác biệt này giúp đọc một báo cáo: weight là kết quả, learning rate là lựa chọn.

2. Loss biến độ sai thành một số

Nhãn và dự đoán phải cùng đơn vị thì hiệu mới có nghĩa. Với hồi quy, nhãn yy và dự đoán y^\hat{y} là số thực. Một loss đơn giản trên NN mẫu là trung bình các bình phương sai số, gọi là mean squared error. Kết luận của phép bình phương là sai số lớn bị phạt nặng hơn sai số nhỏ, trên cùng một mẫu:

L=1N∑i=1N(yi−y^i)2L = \frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y}_i)^2

Lấy hai tình huống giả định về giá thuê, đơn vị triệu. Giá ghi nhận 4.54.5. Dự đoán 4.14.1 thì hiệu là 4.5−4.1=0.44.5 - 4.1 = 0.4, bình phương là 0.160.16. Dự đoán 2.52.5 thì hiệu là 4.5−2.5=2.04.5 - 2.5 = 2.0, bình phương là 4.004.00. Tỉ số các hiệu tuyệt đối là 2.0/0.4=52.0 / 0.4 = 5. Tỉ số các bình phương là 4.00/0.16=254.00 / 0.16 = 25. Phép tính cho thấy, trên hai cặp số này, việc bình phương làm độ phạt của sai số lớn gấp 2525 lần độ phạt của sai số nhỏ, trong khi bản thân các hiệu chỉ gấp 55 lần. Nó không cho thấy bình phương là loss đúng cho mọi bài giá thuê.

Với phân loại hai lớp, nhãn yy là 00 hoặc 11 và dự đoán y^\hat{y} là một số trong khoảng mở từ 00 đến 11, cross-entropy nhị phân đọc độ bất ngờ của nhãn dưới dự đoán đó. Kết luận của công thức là dự đoán càng tự tin vào phía sai thì loss càng lớn:

L=−[yln⁡(y^)+(1−y)ln⁡(1−y^)]L = -\left[y \ln(\hat{y}) + (1-y)\ln(1-\hat{y})\right]

Khi nhãn y=1y = 1, biểu thức rút thành −ln⁡(y^)-\ln(\hat{y}). Làm tròn nửa lên tới bốn chữ số thập phân từ logarit tự nhiên: −ln⁡(0.9)=0.1054-\ln(0.9) = 0.1054 và −ln⁡(0.01)=4.6052-\ln(0.01) = 4.6052. Trên hai dự đoán này, một xác suất 0.010.01 cho lớp đúng cho loss lớn hơn nhiều so với một xác suất 0.90.9. Các số là giá trị đã làm tròn của đúng biểu thức, không phải accuracy của một mô hình.

Accuracy, tức tỉ lệ mẫu gắn đúng nhãn, là một metric để báo cáo. Metric trả lời “kết quả có hữu ích không”. Loss trả lời “bước tối ưu đang theo số nào”. Hai câu khác nhau. F1, một metric cân bằng precision và recall, hữu ích khi lớp lệch, và thường không phải hàm mà ta lấy gradient trực tiếp trong vòng lặp chuẩn. Vì vậy một bài có thể huấn luyện bằng cross-entropy rồi báo cáo F1.

3. Ví dụ tính tay: một loss bậc hai và một bước cập nhật

Chỉ còn một trọng số ww. Loss giả định là một parabol có đáy tại 33:

L(w)=(w−3)2L(w) = (w - 3)^2

Đạo hàm theo ww là độ dốc của parabol tại điểm đang đứng. Kết luận của phép đạo hàm này là độ dốc bằng không tại w=3w = 3, âm khi ww còn nhỏ hơn 33, và dương khi ww đã lớn hơn 33:

dLdw=2(w−3)\frac{dL}{dw} = 2(w - 3)

Bắt đầu tại w=0w = 0. Loss là (0−3)2=9(0 - 3)^2 = 9. Đạo hàm là 2(0−3)=2⋅(−3)=−62(0 - 3) = 2 \cdot (-3) = -6. Độ dốc âm nghĩa là, ngay quanh w=0w = 0, tăng ww một chút thì LL giảm.

Tốc độ học η\eta là hệ số nhân vào độ dốc trước khi trừ khỏi tham số. Kết luận của một bước gradient descent là đi ngược độ dốc, với bước dài tỉ lệ với η\eta:

w←w−ηdLdww \leftarrow w - \eta \frac{dL}{dw}

Chọn η=0.1\eta = 0.1. Độ dốc đang là −6-6, nên lượng trừ là 0.1⋅(−6)=−0.60.1 \cdot (-6) = -0.6. Trừ một số âm là cộng: ww mới bằng 0−(−0.6)=0.60 - (-0.6) = 0.6. Viết đủ theo công thức: 0−0.1⋅(−6)=0.60 - 0.1 \cdot (-6) = 0.6.

Loss tại w=0.6w = 0.6 là (0.6−3)2=(−2.4)2(0.6 - 3)^2 = (-2.4)^2. Và 2.4⋅2.4=5.762.4 \cdot 2.4 = 5.76. Loss đi từ 99 xuống 5.765.76 trên bước này. Phép tính cho thấy, với parabol này và η=0.1\eta = 0.1, một bước từ 00 tới 0.60.6 làm loss giảm 9−5.76=3.249 - 5.76 = 3.24. Nó không cho thấy mọi mạng neural sẽ giảm loss sau một bước.

Bước thứ hai, vẫn η=0.1\eta = 0.1, để thấy quy tắc lặp lại chứ không đổi công thức. Đạo hàm tại 0.60.6 là 2(0.6−3)=2⋅(−2.4)=−4.82(0.6 - 3) = 2 \cdot (-2.4) = -4.8. Lượng trừ là 0.1⋅(−4.8)=−0.480.1 \cdot (-4.8) = -0.48. Trọng số mới là 0.6−(−0.48)=1.080.6 - (-0.48) = 1.08. Loss tại 1.081.08 là (1.08−3)2=(−1.92)2(1.08 - 3)^2 = (-1.92)^2. Tính 1922192^2 rồi chia 1000010000: (200−8)2=40000−2⋅200⋅8+82=40000−3200+64=36864(200 - 8)^2 = 40000 - 2 \cdot 200 \cdot 8 + 8^2 = 40000 - 3200 + 64 = 36864, nên 36864/10000=3.686436864 / 10000 = 3.6864. Loss đi từ 5.765.76 xuống 3.68643.6864. Hai bước đều tiến về phía 33, và cả hai đều giảm loss trên hàm này. Đáy vẫn còn ở 33; 1.081.08 chưa phải điểm dừng.

4. Backpropagation qua hai tầng, bằng lời và bằng số

Parabol một biến cho thấy bước cập nhật. Mạng thật có nhiều tầng, và loss chỉ được tính ở cuối. Backprop trả lời: nếu tăng rất ít một trọng số ở tầng trước, loss cuối đổi bao nhiêu. Câu trả lời là một tích các đạo hàm dọc theo đường tính, tức quy tắc dây chuyền. Phần này tính trọn một mạng nhỏ, số giả định, không phải một mô hình đã học trên sinh viên thật.

Đầu vào x=2x = 2. Tầng ẩn có một trọng số w1=0.5w_1 = 0.5 và bias b1=0b_1 = 0. Tổng trước kích hoạt là z1=0.5⋅2+0=1z_1 = 0.5 \cdot 2 + 0 = 1. Hàm kích hoạt là ReLU, tức lấy max⁡(0,z1)\max(0, z_1). Vì 1>01 > 0, đầu ra ẩn là h=1h = 1.

Tầng ra tuyến tính, không uốn thêm: w2=1.5w_2 = 1.5, b2=−0.5b_2 = -0.5. Dự đoán y^=z2=1.5⋅1+(−0.5)=1\hat{y} = z_2 = 1.5 \cdot 1 + (-0.5) = 1. Nhãn giả định y=0y = 0. Loss bậc hai trên một mẫu là (y^−y)2=(1−0)2=1(\hat{y} - y)^2 = (1 - 0)^2 = 1.

Quy tắc dây chuyền nói bằng lời, từ trọng số tầng ra: w2w_2 làm đổi z2z_2 theo hệ số bằng hh, z2z_2 chính là y^\hat{y} nên hệ số sang dự đoán là 11, và dự đoán làm đổi loss theo 2(y^−y)2(\hat{y} - y). Nhân ba hệ số đó được đạo hàm của loss theo w2w_2.

Tính số. Đạo hàm của loss theo dự đoán là 2(1−0)=22(1 - 0) = 2. Đạo hàm của z2z_2 theo w2w_2 là h=1h = 1. Vậy đạo hàm của loss theo w2w_2 là 2⋅1⋅1=22 \cdot 1 \cdot 1 = 2. Đạo hàm theo b2b_2 là 2⋅1=22 \cdot 1 = 2, vì bias cộng vào z2z_2 với hệ số 11.

Sang tầng ẩn, vẫn bằng lời: loss phụ thuộc hh thông qua z2z_2, với hệ số w2w_2; hh phụ thuộc z1z_1 với độ dốc ReLU; z1z_1 phụ thuộc w1w_1 với hệ số xx. Vì z1=1>0z_1 = 1 > 0, độ dốc ReLU bằng 11, không phải 00.

Đạo hàm của loss theo hh là 2⋅w2=2⋅1.5=32 \cdot w_2 = 2 \cdot 1.5 = 3. Nhân độ dốc ReLU: 3⋅1=33 \cdot 1 = 3, đó là đạo hàm theo z1z_1. Nhân x=2x = 2: đạo hàm theo w1w_1 là 3⋅2=63 \cdot 2 = 6. Đạo hàm theo b1b_1 là 33, vì bias đi vào z1z_1 với hệ số 11.

Cập nhật với cùng η=0.1\eta = 0.1, trừ η\eta lần đạo hàm.

Trọng số ẩn mới: 0.5−0.1⋅6=0.5−0.6=−0.10.5 - 0.1 \cdot 6 = 0.5 - 0.6 = -0.1. Bias ẩn mới: 0−0.1⋅3=−0.30 - 0.1 \cdot 3 = -0.3. Trọng số ra mới: 1.5−0.1⋅2=1.5−0.2=1.31.5 - 0.1 \cdot 2 = 1.5 - 0.2 = 1.3. Bias ra mới: −0.5−0.1⋅2=−0.5−0.2=−0.7-0.5 - 0.1 \cdot 2 = -0.5 - 0.2 = -0.7.

Chạy lại forward trên cùng x=2x = 2 và cùng nhãn 00, để xem loss của mẫu này đổi ra sao, không phải để tuyên bố mạng đã học xong. Tổng ẩn: z1=−0.1⋅2+(−0.3)=−0.2−0.3=−0.5z_1 = -0.1 \cdot 2 + (-0.3) = -0.2 - 0.3 = -0.5. ReLU của −0.5-0.5 là 00, nên h=0h = 0. Dự đoán: 1.3⋅0+(−0.7)=−0.71.3 \cdot 0 + (-0.7) = -0.7. Loss: (−0.7−0)2=0.49(-0.7 - 0)^2 = 0.49.

Loss trên mẫu này đi từ 11 xuống 0.490.49. Đồng thời z1z_1 từ 11 thành −0.5-0.5, nên đơn vị ẩn tắt trên đúng đầu vào x=2x = 2. Phép tính cho thấy cả hai sự kiện sau một bước với η=0.1\eta = 0.1. Nó không cho thấy bước tiếp theo sẽ tiếp tục giảm loss, vì lần sau độ dốc ReLU tại mẫu này bằng 00 và tín hiệu về w1w_1 từ mẫu này tắt theo.

Đây là hình của backprop trên hai tầng: lỗi ở đầu ra được đổi đơn vị thành độ dốc của hh, rồi độ dốc đó được đổi đơn vị thành độ dốc của w1w_1, miễn là hàm kích hoạt còn độ dốc khác không. Thêm tầng thứ ba thì thêm một khúc nhân nữa. Mục thất bại xét chuyện tích những khúc đó trở nên rất nhỏ hoặc rất lớn.

Khi cách này thất bại

Bước gradient descent giả định một bước đủ ngắn để độ dốc tại chỗ xuất phát còn nói đúng hướng trong cả bước. Trên parabol L(w)=(w−3)2L(w) = (w - 3)^2, điều đó phụ thuộc η\eta.

Giữ điểm xuất phát w=0w = 0, đạo hàm −6-6, nhưng đặt η=1\eta = 1. Trọng số mới là 0−1⋅(−6)=60 - 1 \cdot (-6) = 6. Loss tại 66 là (6−3)2=9(6 - 3)^2 = 9. Loss không tăng, và cũng không giảm: nó bằng đúng loss ban đầu. Điểm 66 và điểm 00 cách đáy 33 cùng một khoảng 33. Bước dài 66 đã nhảy sang phía bên kia, đối xứng qua đáy. Phép tính cho thấy với η=1\eta = 1 trên hàm này, một bước từ 00 không tiến gần hơn tới 33 về mặt loss.

Đặt η=1.1\eta = 1.1, vẫn từ w=0w = 0. Lượng trừ là 1.1⋅(−6)=−6.61.1 \cdot (-6) = -6.6. Trọng số mới là 0−(−6.6)=6.60 - (-6.6) = 6.6. Hiệu tới đáy là 6.6−3=3.66.6 - 3 = 3.6. Loss là 3.62=12.963.6^2 = 12.96. So với loss ban đầu 99, bước này tăng 12.96−9=3.9612.96 - 9 = 3.96. Phép tính cho thấy một tốc độ học quá lớn, trên đúng parabol này, làm loss tăng sau một bước. Nó không cho một ngưỡng η\eta an toàn cho mọi mạng.

Độ dốc tại điểm đáp 6.66.6, để đọc chứ không dùng cho bước vừa rồi, là 2(6.6−3)=2⋅3.6=7.22(6.6 - 3) = 2 \cdot 3.6 = 7.2. Dấu đã đảo so với −6-6 tại điểm xuất phát. Bước tiếp theo, nếu vẫn dùng η=1.1\eta = 1.1, sẽ trừ một số dương lớn và có thể phóng sang phía kia. Hiện tượng loss dao động hoặc tăng dần khi bước quá dài được gọi là phân kỳ trên hàm đang tối ưu. Dấu hiệu thực hành là đường loss huấn luyện nhảy lên thay vì đi xuống sau khi tăng tốc độ học.

Thất bại thứ hai nằm ở tích các độ dốc khi mạng dày hoặc khi cùng một trọng số được dùng lại nhiều lần. Giả sử mỗi tầng nhân tín hiệu ngược với hệ số 0.50.5, và mọi hàm kích hoạt đang ở đoạn có độ dốc đó. Mười tầng thì tín hiệu bị nhân 0.50.5 mười lần, tức 1/10241/1024. Nếu độ dốc tại loss là 22, độ dốc tới tầng đầu của chuỗi mười tầng đó là 2/1024=1/5122/1024 = 1/512. Hai mươi lần nhân 0.50.5 ra 1/10485761/1048576. Một tín hiệu xuất phát bằng 11 còn lại một phần triệu bậc này, nhỏ hơn 1/10000001/1000000. Trọng số ở xa gần như không được sửa bởi mẫu đó. Người ta gọi đây là gradient biến mất. Hệ số 0.50.5 ở đây là một giả định để thấy tích, không phải đạo hàm đo được của mạng mục 4. Trong mục 4, một ReLU tắt còn mạnh hơn: hệ số là 00, và cả nhánh phía trước nhận 00 từ mẫu đó.

Chiều ngược lại, giả sử mỗi tầng nhân 1.51.5. Tính lũy thừa bằng cách nhân đôi số mũ. 1.52=2.251.5^2 = 2.25. Bình phương tiếp: 2.25⋅2=4.52.25 \cdot 2 = 4.5 và 2.25⋅0.25=0.56252.25 \cdot 0.25 = 0.5625, nên 1.54=4.5+0.5625=5.06251.5^4 = 4.5 + 0.5625 = 5.0625. Tiếp theo 1.58=5.062521.5^8 = 5.0625^2. Tách 5.0625=5+0.06255.0625 = 5 + 0.0625: bình phương là 25+2⋅5⋅0.0625+0.06252=25+0.625+0.00390625=25.6289062525 + 2 \cdot 5 \cdot 0.0625 + 0.0625^2 = 25 + 0.625 + 0.00390625 = 25.62890625. Nhân thêm 1.52=2.251.5^2 = 2.25 để được 1.5101.5^{10}: 25.62890625⋅2=51.257812525.62890625 \cdot 2 = 51.2578125 và 25.62890625⋅0.25=6.407226562525.62890625 \cdot 0.25 = 6.4072265625, cộng lại 57.665039062557.6650390625. Dạng phân số của cùng số này là (3/2)10=59049/1024(3/2)^{10} = 59049/1024. Nếu độ dốc tại loss là 22, mười tầng hệ số 1.51.5 đưa tín hiệu tới 2⋅57.6650390625=115.3300781252 \cdot 57.6650390625 = 115.330078125. Cập nhật trừ η\eta lần một số lớn sẽ nhảy rất xa. Người ta gọi đây là gradient bùng. Trên máy tính, số còn có thể tràn thành giá trị không dùng được.

Hai thất bại này giải thích vì sao “thêm tầng” và “tăng tốc độ học” không phải hai núm luôn có lợi. Tầng nhiều giúp biểu diễn, như bài neuron đã tách XOR bằng một tầng ẩn, và cũng tạo một chuỗi nhân dài cho gradient. Tốc độ học 0.10.1 đã giảm loss trên parabol; tốc độ học 1.11.1 đã tăng loss trên cùng parabol. Chỗ đọc thực hành là vẽ loss theo bước, và dừng để giảm η\eta khi đường đi lên, chứ không thêm epoch với cùng một bước đang phân kỳ.

5. Batch, epoch, và dấu hiệu học quá

Đạo hàm trong mục 3 lấy trên một hàm của một trọng số. Trên một tập dữ liệu, loss thường là trung bình trên nhiều mẫu, nên đạo hàm cũng là trung bình, hoặc tổng, các đạo hàm từng mẫu. Ba cách lấy trung bình đó có tên riêng.

Batch gradient descent tính đạo hàm trên toàn bộ tập huấn luyện rồi mới cập nhật một lần. Hướng ít bị một mẫu cá biệt kéo lệch, và mỗi lần cập nhật phải đọc hết dữ liệu.

Stochastic gradient descent, viết tắt SGD trong cách dùng gốc, lấy một mẫu, tính đạo hàm, cập nhật ngay. Bước rẻ và nhiễu. Nhiễu đôi khi làm quỹ đạo rời một vùng loss phẳng kém; nó cũng làm đường loss giật.

Mini-batch lấy một nhóm nhỏ, ví dụ vài chục hoặc vài trăm mẫu, tính đạo hàm trung bình trên nhóm, rồi cập nhật. Đây là cách gặp thường xuyên khi dữ liệu không vừa một lần tính và khi máy tính vector hóa theo nhóm. Cỡ nhóm là siêu tham số.

CáchMẫu cho một lần cập nhậtĐộ dốcViệc mỗi lần cập nhật phải đọc
Batchcả tập huấn luyệnít nhiễu hơnnhiều
SGD một mẫu11 mẫunhiễu nhiềuít
Mini-batchmột nhómở giữavừa

Một epoch là một lượt mà mọi mẫu huấn luyện đã được dùng đúng một lần, theo cách chia batch đang chọn. Tập 1000010000 mẫu, cỡ batch 100100, thì số lần cập nhật trong một epoch là 10000/100=10010000 / 100 = 100. Tập 1280012800 mẫu, cỡ batch 128128: vì 128⋅100=12800128 \cdot 100 = 12800, một epoch có 100100 lần cập nhật. Hai mươi epoch nghĩa là mỗi mẫu có hai mươi lần góp vào một bước, nếu nó luôn nằm trong tập huấn luyện. Số epoch lớn hơn không kéo theo loss trên dữ liệu mới nhỏ hơn.

Overfitting, học quá khớp, là tình huống loss trên tập đang dùng để sửa trọng số tiếp tục giảm trong khi loss trên một tập giữ lại để theo dõi bắt đầu tăng. Tập giữ lại đó gọi là validation, tách khỏi tập huấn luyện trước khi nhìn các quyết định sửa mô hình. Tập test, nếu có, dành cho một lần đánh giá sau khi các lựa chọn đã chốt. Nhìn test rồi sửa mô hình theo test biến test thành validation dưới một tên khác.

Một bảng minh họa, các ô là số giả định để tập đọc dấu hiệu, không phải log của một lần chạy thật:

EpochLoss huấn luyệnLoss validation
110.820.820.860.86
550.430.430.490.49
10100.250.250.380.38
20200.110.110.520.52

Từ epoch 1010 sang epoch 2020, loss huấn luyện đổi 0.25−0.11=0.140.25 - 0.11 = 0.14, tức giảm. Loss validation đổi 0.52−0.38=0.140.52 - 0.38 = 0.14, tức tăng cùng một lượng 0.140.14 trên các số đã ghi. Dấu hai phía ngược nhau. Trên bảng này, epoch 2020 có loss validation cao hơn epoch 1010. Giữ bộ trọng số của epoch 2020 chỉ vì nó là vòng cuối sẽ chọn điểm validation tệ hơn trong chính bảng minh họa. Early stopping là quy tắc dừng hoặc hoàn nguyên về vòng validation còn tốt, ở đây là vòng 1010 nếu chỉ so bốn dòng đã viết.

Dropout là một cách làm mạng đỡ dựa vào một đơn vị. Trong lúc huấn luyện, một số đơn vị bị tắt ngẫu nhiên theo một xác suất đã chọn, và mạng phải tạo dự đoán bằng các đơn vị còn bật. Hình dưới đây minh họa các đơn vị bị gạch trong một lượt.

Dropout tạm thời loại bỏ một số unit

Khi dự đoán trên dữ liệu mới, ta không tiếp tục tắt ngẫu nhiên theo kiểu lúc huấn luyện. Mạng dùng đầy đủ các đơn vị, với một phép co giãn mà thư viện thường gắn vào lúc tắt ở pha huấn luyện hoặc lúc suy ra. Nhầm hai pha này làm đầu ra lúc báo cáo không còn là đầu ra đã tối ưu.

Các cách khác cùng mục đích giảm học quá: thêm dữ liệu, biến đổi dữ liệu mà nhãn vẫn đúng, phạt độ lớn trọng số, giảm số tầng hoặc số đơn vị, và dừng sớm như bảng trên. Không có cách nào trong số đó thay cho một tập validation tách bạch.

Đào sâu: tham số, siêu tham số, và những gì một bước chưa nói

Trở lại mạng mục 4. Các số w1,b1,w2,b2w_1, b_1, w_2, b_2 sau cập nhật là tham số. Số η=0.1\eta = 0.1 là siêu tham số: nó không có một đạo hàm trong phép tính vừa rồi, dù người ta có thể thử vài giá trị và so loss validation. Số đơn vị ẩn, ở ví dụ là một, cũng là lựa chọn kiến trúc. Kiến trúc là cách các phép tính nối nhau. Tham số là số nằm trên các mũi tên đó. Siêu tham số là núm của quá trình học và của kích thước khung.

Gradient descent thuần trừ η\eta lần đạo hàm. Các optimizer hay gặp thêm một vận tốc: hướng các bước trước được cộng dồn, để một vùng đạo hàm nhỏ nhưng đều vẫn trôi về một phía, và để một đạo hàm đổi dấu liên tục bị vận tốc làm dịu. Bài này không tính một bước có vận tốc. Điều cần nhận ra là tên optimizer trên một dòng lệnh không thay đổi nghĩa của loss, và không thay việc phải có tập validation.

Mini-batch làm đạo hàm thành một ước lượng nhiễu của đạo hàm trên cả tập. Với cùng một η\eta, một batch nhỏ cho bước giật hơn một batch lớn. Tăng cỡ batch rồi giữ nguyên η\eta đổi cả độ nhiễu lẫn độ lớn hiệu quả của bước, vì trung bình trên nhiều mẫu có thang khác một mẫu. Đó là lý do người ta không sao chép một bộ siêu tham số từ bài toán khác rồi kết luận kiến trúc mới kém: có thể bước đang quá dài, như η=1.1\eta = 1.1 trên parabol, trong khi hàm loss của mạng còn khó hơn parabol rất nhiều.

Loss giảm cũng có thể đến từ một lỗi dữ liệu. Nếu nhãn bị sao chép từ một cột đã nằm trong đầu vào, forward pass sẽ tìm ra mối nối tắt đó, backprop sẽ tăng các trọng số tương ứng, và loss huấn luyện xuống rất thấp. Validation, nếu được cắt từ cùng một bảng đã rò, cũng đẹp. Đây vẫn là một vòng lặp huấn luyện đúng công thức, trên một câu hỏi sai. Đọc loss mà không đọc nguồn từng cột là đọc nhầm một phép tối ưu thành một kết luận về sinh viên, bệnh, hay giá.

Chuẩn hóa đầu vào đổi thang của đạo hàm. Nếu một đặc trưng nằm trong khoảng 00 đến 11 và đặc trưng kia nằm trong khoảng 00 đến 10001000, cùng một η\eta là bước rất khác nhau theo hai trọng số. Parabol mục 3 chỉ có một biến, nên không thấy chuyện này. Trên mạng mục 4, x=2x = 2 đi thẳng vào đạo hàm theo w1w_1, hệ số 66 có mặt xx trong đó. Đổi xx thành 200200 mà giữ mọi thứ khác sẽ đổi đạo hàm đó, và có thể biến bước η=0.1\eta = 0.1 thành một bước quá đà kiểu mục thất bại. Co các đầu vào về một thang gần nhau là phần chuẩn bị, trước khi so kiến trúc.

Tự kiểm tra

  1. Tại w=0w = 0 với L(w)=(w−3)2L(w) = (w - 3)^2 và η=0.1\eta = 0.1, trọng số mới bằng bao nhiêu, và loss mới bằng bao nhiêu?
  2. Với η=1.1\eta = 1.1 từ cùng điểm w=0w = 0, vì sao loss thành 12.9612.96?
  3. Trong mạng hai tầng, đạo hàm của loss theo w1w_1 bằng 66 đến từ tích nào?
  4. Sau một bước, z1=−0.5z_1 = -0.5. ReLU cho hh bằng bao nhiêu trên mẫu x=2x = 2?
  5. Tập 1280012800 mẫu, batch 128128, một epoch có bao nhiêu lần cập nhật?
  6. Trên bảng loss minh họa, vì sao bộ trọng số epoch 2020 kém hơn epoch 1010 nếu tiêu chí là loss validation?

Mang đi

Huấn luyện là lặp: đi xuôi để có dự đoán, tính loss, tính đạo hàm bằng backprop, rồi cập nhật tham số. Trên L(w)=(w−3)2L(w) = (w - 3)^2, từ w=0w = 0 với η=0.1\eta = 0.1, một bước tới w=0.6w = 0.6 và loss từ 99 xuống 5.765.76; bước tiếp tới w=1.08w = 1.08 và loss 3.68643.6864. Cùng parabol với η=1.1\eta = 1.1 nhảy tới w=6.6w = 6.6 và loss 12.9612.96, tức là tăng. Trên mạng hai tầng với x=2x = 2, loss một mẫu đi từ 11 xuống 0.490.49 sau một bước η=0.1\eta = 0.1, đồng thời ReLU của tầng ẩn tắt vì z1=−0.5z_1 = -0.5. Nhân lặp lại hệ số 0.50.5 qua hai mươi tầng còn 1/10485761/1048576; nhân lặp lại 1.51.5 qua mười tầng ra 57.665039062557.6650390625. Loss trên tập đang sửa trọng số có thể giảm trong khi loss validation tăng, như bảng minh họa từ epoch 1010 sang epoch 2020.

Bài sau hỏi vì sao không trải một ảnh thành một vector dài rồi nối đầy đủ mọi pixel, và tính trọn một kernel 3×33 \times 3 đang có trên trang đó.

Nguồn tham khảo

  • CS50 AI, Lecture 5 - Neural Networks: https://cs50.harvard.edu/ai/notes/5/
  • Rumelhart, D. E., Hinton, G. E., Williams, R. J. (1986), Learning representations by back-propagating errors, Nature, DOI: 10.1038/323533a0.