Chuyên đề: Tiêu biến gradient trong mạng MLP
Thực hành với PyTorch
← tất cả bài học
Hoạt hoạ
Video
Mạng sâu hơn chưa chắc học tốt hơn
một mạng bảy tầng ẩn, 100 epoch, và một con số
0:00 / 32:25
Phụ đề: bật
Mục 1/12 · Giới thiệu
s00
Mạng sâu hơn chưa chắc học tốt hơn
1/69
Người ta thường nghĩ rằng muốn mô hình tốt hơn thì cần thêm tham số, thêm tầng.
Điều đó không phải lúc nào cũng đúng.
Tới một độ sâu nào đó, mạng gặp hiện tượng tiêu biến gradient, hay vanishing gradient.
Trong bài này, một mạng bảy tầng ẩn huấn luyện suốt 100 epoch mà chỉ đạt đúng 10 %, tức là đoán ngẫu nhiên giữa mười lớp.
Bài học dựng mạng đó, đo xem gradient biến đi đâu, rồi thử chín cách sửa.
Cả mười lăm lần chạy trong bài đều thực hiện trên CPU, với cùng hạt giống 42, nên mỗi con số đều lặp lại được.
Danh sách cảnh (12 mục, 69 cảnh)
Mục 1
Giới thiệu
7 cảnh · 4 phút
0:00
s00
Mạng sâu hơn chưa chắc học tốt hơn
0:00
s01
Trò chơi chuyền nước
0:32
s02
Dấu hiệu nhận biết
1:13
s03
Quy tắc dây chuyền nhân dồn
1:36
s04
Sáu hướng khắc phục
2:16
s05
Thêm ba kỹ thuật nâng cao
2:57
s06
Lộ trình của bài
3:18
Mục 2
Cài đặt chương trình
21 cảnh · 9 phút
3:38
s07
Thư viện cần thiết
3:38
s08
Phần cứng và hạt giống ngẫu nhiên
4:00
s09
Bộ dữ liệu Fashion-MNIST
4:33
s10
Tải dữ liệu
4:55
s11
Chia tập huấn luyện, kiểm định và kiểm tra
5:11
s12
Kiến trúc của mô hình cơ sở
5:40
s13
Lớp MLP: phần khai báo
6:07
s14
Lớp MLP: lượt truyền xuôi
6:41
s15
Hàm mất mát và bộ tối ưu
6:58
s16
Vòng lặp huấn luyện: cập nhật trọng số
7:23
s17
Vòng lặp huấn luyện: lượt kiểm định
8:03
s18
Vẽ biểu đồ huấn luyện
8:28
s19
Đánh giá trên tập kiểm tra
8:41
s20
Kết quả: đúng mười phần trăm
9:01
s21
Dòng gradient: dự đoán
9:29
s22
Dòng gradient: kết quả đo
9:54
s23
Bản đồ nhiệt qua 100 epoch
10:32
s24
Vì sao hệ số là 0.14
10:55
s25
Không chỉ gradient, cả tín hiệu xuôi
11:40
s26
Ghi chú: bão hoà đạo hàm
12:16
s27
Cách đọc phần cải tiến
12:38
Mục 3
Khởi tạo trọng số lớn hơn
6 cảnh · 2 phút
12:57
s28
Ý tưởng: tăng độ lệch chuẩn
12:57
s29
Mã: khởi tạo với std bằng 1.0
13:27
s30
Mã: std bằng 10.0
13:51
s31
Kết quả: std 1.0 học được
14:00
s32
Kết quả: std 10.0 bão hoà
14:28
s33
Bài học của khởi tạo
15:00
Mục 4
Hàm kích hoạt tốt hơn
3 cảnh · 1 phút
15:23
s34
Từ sigmoid sang ReLU
15:23
s35
Mã: thay sigmoid bằng ReLU
15:47
s36
Kết quả: ReLU học chậm rồi tăng tốc
16:07
Mục 5
Bộ tối ưu tốt hơn
3 cảnh · 1 phút
16:43
s37
Vì sao bộ tối ưu giúp được
16:43
s38
Mã: dùng Adam
17:13
s39
Kết quả: Adam vượt baseline
17:27
Mục 6
Chuẩn hoá bên trong mạng
4 cảnh · 2 phút
17:53
s40
Dịch chuyển hiệp biến bên trong
17:53
s41
Mã: BatchNorm1d sau mỗi Linear
18:27
s42
Mã: lớp chuẩn hoá tự viết
18:56
s43
Kết quả: chuẩn hoá hiệu quả nhất
19:21
Mục 7
Kết nối tắt
3 cảnh · 1 phút
19:58
s44
Đường tắt cho gradient
19:58
s45
Mã: hai kết nối tắt
20:19
s46
Kết quả: kết nối tắt giúp một phần
20:46
Mục 8
Huấn luyện từng phần
7 cảnh · 3 phút
21:18
s47
Ý tưởng: chia để huấn luyện
21:18
s48
Mã: hai module con
21:39
s49
Mã: bốn instance
22:05
s50
Quy trình bảy giai đoạn
22:21
s51
Mã: giai đoạn 1 tới 3
22:43
s52
Mã: giai đoạn 4 tới 7
23:13
s53
Kết quả: thắng giai đoạn 1, thua giai đoạn 2
23:38
Mục 9
Chuẩn hoá gradient
3 cảnh · 1 phút
24:18
s54
Ý tưởng: chuẩn hoá chính gradient
24:18
s55
Mã: hàm autograd tự định nghĩa
24:33
s56
Kết quả: gradient lớn, mạng bão hoà
25:02
Mục 10
Shortcut Back
6 cảnh · 3 phút
25:40
s57
Phương pháp trong bài báo gốc
25:40
s58
Cái mã thực sự làm
26:12
s59
Mã: lớp ShortcutBackLayer
26:32
s60
Mã: lớp ShortcutBackMLP
27:11
s61
Mô hình đối chứng: bỏ hook
27:47
s62
Kết quả: hook không thêm gì
28:08
Mục 11
Huấn luyện tăng dần
4 cảnh · 2 phút
28:45
s63
Ý tưởng: mạng lớn dần
28:45
s64
Mã: lớp ProgressiveMLP
29:16
s65
Mã: lớp ProgressiveTrainer
29:52
s66
Kết quả: phụ thuộc vào bộ tối ưu
30:39
Mục 12
Tổng kết
2 cảnh · 1 phút
31:15
s67
Mười lăm lần chạy
31:15
s68
Ba bài học
31:53
📓 Sổ tay thực hành (Colab)