HI xin chào ae hôm nay mình sẽ trình bày một số khái niệm cơ bản về Resnet.
|
Resnet vs Plain Network |
Resnet là một model CNN rất nổi tiếng mà bất kì ae nào tìm hiểu về deeplearning cũng đã đọc qua ít nhất đôi lần nào đó. Resnet chỉ với một biến đổi đơn giản nhưng đã tỏ ra hiệu quả vượt trội so với những model trước đó. Bây giờ Resnet được ứng dụng rất nhiều trong các model khác nhau, từ classification, object detection , segmentation,.. Và resnet ngày càng có nhiều phiên bản hoàn thiện hơn như wide resnet,... hoặc những model mới được tạo ra dựa trên ý tưởng skip connection trong Resnet (tí mình sẽ nói sau) như Densnet,... Oke vì vậy hôm nay mình sẽ cùng ae tìm hiểu những khái niệm cơ bản về resnet xem nó là cái chi chi mà nó lại xịn con nhà bà sò vậy ✌
1. Vấn đề với mạng CNN truyền thống.
Oke đầu tiên mình sẽ nói qua về những vấn đề của mạng CNN thông thường, nó có vấn đề gì mà người ta lại nghĩ ra ông Resnet.
|
Model VGG16
|
Như ae có thể thấy hình bên trên chính là model VGG16 rất nổi tiếng rồi nhưng các mạng truyền thống này đều có một điểm chung là sự khó khăn khi mà ta muốn tăng thêm số layer. Như ae đã biết thì một model có càng nhiều lớp thì khả năng biểu diễn của nó phải mạnh mẽ, do đó theo suy nghĩ thông thường thì mình sẽ thêm càng nhiều lớp thì mình sẽ càng có một mô hình "hủy diệt". Nhưng thực tế thì nó lại ko phải như vậy. Giống như các cụ ngày sưa đã có câu "Hồng nhan bạc phận " ý chỉ gái đẹp vừa thôi chứ đẹp quá thì dễ toang 😀😅. Ae sẽ cùng xem hình bên dưới.
|
Vanishing gradient
|
Nhìn hình bên tay phải mình sẽ thấy rằng khi tăng số lượng layer của model lên thì test error bị tăng lên. Why ?.. điều này có thể giải thích là do hiện tượng overfiting khi mình tăng số lượng layer của model lên thì mô hình đã quá khớp với data training và nhiễu của nó mà ko có tính tổng quát hóa trên tập test. Nhưng nhìn thêm hình bên trái thì mình lại thấy rằng cho training error của model 56 layer lại tăng so với 20 layer. Điều này khá bất thường nhỉ ! Bình thường thì khi tăng số lượng layer thì tăng khả năng biểu diễn của model dẫn đến mô hình khớp với data training hơn dẫn đến training error phải giảm xuống chứ nhỉ, nhưng trong tình huống này thì nó training error của nó lại tăng. Why ? Vanishing gradient chính là một trong số những thủ phạm chính của nó.
2. Vanishing gradient.
Vanishing gradient chính là hiện tượng gradient bị nhỏ dần (gần tới 0) đặc biệt là ở những layer đầu tiên. Mà khi mình huấn luyện model thì một thông số quan trọng nhất chính là gradient, cho dù dùng thuật toán tối ưu nào đi chăng nữa như SGD, Adam, AdamW,... thì đều phải có gradient để tiếp hành update parameters. Để đơn giản thì mình sẽ lấy một ví dụ một model có n layer thì mình sẽ cập nhật gradient cho layer đầu tiên. Theo quy tắc chuỗi thì mình sẽ có công thức dưới đây (tất nhiên công thức tính gradient trong các model sẽ phức tạp hơn nhiều nhưng để dễ minh họa thì mình đơn giản nó theo công thức chuỗi dưới đây).
Như ae có thể thấy thì gradient của layer đầy tiên sẽ là tích của các gradient của các layer phía sau của nó ( lan truyên ngược backward). Điều j sẽ xảy ra nếu như các đạo hàm của các layer phái sau nó là các matrix có giá trị nhỏ hơn 1. Đễ thấy việc nhiều giá trị nhỏ hơn 1 nhân với nhau sẽ dẫn đến một số rất nhỏ tiến tới 0 (vd 0.5^n với n =100). Và người ta đã thực hiện các thí nghiệm để thấy được gradient của các layer càng về phía đầu có giá trị đúng là rất nhỏ gần với 0. Do đó gradient mà nhỏ vậy thì hiển nhiên quá trình học của các layer đầu tiên sẽ bị dừng lại dẫn đến hiệu suất tổng thể của mạng bị giảm.
3. Lớp hàm số.
Như bên trên thì mình đã giải thích lý do vanishing gradient theo quy tắc chuỗi do quá trình lan truyền ngược (backward) tạo nên còn ở phần này thì mình sẽ giải thích theo kiểu lớp hàm số nó trìu tượng hơn một chút nhưng rất hay mọi người nên đọc. Đây là giải thích mình đọc trong quấn sách dive into deep leaning mình sẽ để nó ở phần tham khảo ở cuối bài viết. Bây giờ mình sẽ giải thích và minh họa một cách đơn giản và dễ hiểu nhất có thể. Giả sử với một kiến trúc nhất định (có số layer là cố định), việc ta thay đổi các siêu tham số của mô hình như learning rate, optimizer, epoch,… sẽ tạo ra một tập các hàm F có thể. Giả sử gọi f* là hàm ánh xạ tốt nhất có thể đối data mà ta có (model lý tưởng mà ta mong muốn có). Theo lẽ hiển nhiên nếu f* mà ở trong tập hàm F của ta thì quá oke rồi, mình chỉ cần thực hiện nhiều thí nghiệm, thử nhiều siêu tham số khác nhau thì kiểu j cũng tìm được một model lý tưởng. Ví dụ như có một quả bóng ở trong một căn phòng và ae bịt mắt lại rồi tìm nó trong phòng ấy thì kiểu j ae chả tìm đk vấn đề chỉ là lâu hay chậm thôi. Nhưng thực tế đời đâu như là mơ hàm f* đâu dễ j ở trong F nên mình sẽ chỉ tìm f' trong F mà nó cho kết quả tốt nhất thôi. Theo suy nghĩ tự nhiên nếu mở rộng tập F thành F' lớn hơn thì có thể tăng khả năng tìm kiếm được một hàm f' tốt nhất có thể (ae phân biệt việc tốt nhất có thể f' và lý tưởng f* nhé) . Nhưng điều này chỉ đúng nếu tập F' chứa tập F thì điều đó mới đúng do vậy đối với model thì khi thêm các layer mới vào thì cần phải thêm một ánh xạ đồng nhất thì model lúc sau mới có thể tốt ít nhất là bằng model ban đầu chưa thêm layer. Ae xem hình minh họa bên dưới.
|
Lớp hàm số |
Như ae có thể thấy phía bên tay trái khi ta mở rộng thành tập F' thì ta thấy rằng tập các hàm của nó không lồng nhau và ngày càng khác nhau dẫn đến càng xa hàm lý tưởng f* còn hình bên phải là hình tập các hàm lồng nhau nên khi mở rộng thành tập F' chứa tập F thì nó có khả năng cao tiến lại được gần hơn với f*. Ví dụ vui như sau cho ae dễ hiểu giả sử ở một làng nọ có một anh chàng đang đi kiếm vợ, mong muốn của anh ta là có được một cô vợ tuyệt vời hệ mặt trời đáp ứng mọi tiêu chí của anh ta. Lúc đầu thì anh ta chỉ tìm ở quanh làng của anh ta thôi thì khả năng anh ta kiếm được cô vợ này có vẻ hơi khoai rồi, khả năng cao là anh ta phải tìm kiếm nơi khác. Bây giờ có hai lựa chọn tìm kiếm cho anh ta. Một là anh ta sẽ mở rộng phạm vi tìm kiếm bằng cách phạm vi tìm kiếm lúc sau sẽ ko bỏ sót phạm vi tìm kiếm lúc trước có nghĩa là anh ta sẽ tìm khắp huyện sau đó là tìm khắp cả tỉnh thậm chí là tìm khắp cả nước. Như thế thì phạm vi tìm kiếm lúc sau của anh ta luôn chứa phạm vi tìm kiếm lúc trước (tỉnh bao huyện, huyện bao làng) nên khả năng tìm được vợ của anh ta là khá cao. Nhưng nếu anh ta lại nôn nóng tìm ở làng mình không được anh ta quyết định sang hẳn tỉnh khác to hơn hay bay sang hẳn nước ngoài để tìm cho máu thì khả năng anh ta ko tìm được lại khá cao. Vì có thể người mà anh ta cần tìm lại có thể ở trong tỉnh của anh ta. Đấy từ câu chuyện mình chém vừa rồi ae có thể liên tưởng tới lớp hàm mà mình đã trình bày, coi như f* là cô vợ mà anh thanh niên đang tìm kiếm còn F như tỉnh hoặc huyện.
4. Exploding gradient.
Trái ngược với vanishing gradient chính là hiện tượng exploding gradient. Nếu vanishing gradient dẫn đến các gradient có giá trị nhỏ gần 0 thì exploding gradient dẫn đến các giá trị gradient có giá trị rất hơn có thể là bùng nổ thành số nan. Việc gradient bùng nổ như vậy cũng gây bất lợi cho quá trình training nó làm cho việc cập nhật bị dao động lớn hoặc đổi hướng và mạng khó có thể hội tụ. Nhưng exploding gradient có thể dễ dàng giải quyết hơn thằng vanishing gradient bằng cách cắt ngưỡng gradient, khi gradient cao hơn một ngưỡng T hoặc nhỏ hơn ngưỡng L nào đó thì mình sẽ set nó bằng T hoặc L. Nhưng chung quy lại là mình vẫn cần phải can thiệp.
5. Residual block
Phần trên là giải thích một vài lý do cho sự ra đời của ông resnet. Phần này thì mình sẽ nói về một khối cơ bản trong thằng resnet là residual bock. Thực chất thì resnet nó được cấu tạo từ nhiều thằng này mà thôi nên mình chỉ cần tìm hiểu một khối. Như ae có thể thấy thì residual block nó gồm 2 phần chính là F(x) (residual function) và x (identity function). Thằng F(x) thì nó chỉ đơn giản là các lớp CNN kết hợp với activation như relu và batch normalization mà thôi nhưng sự khác biệt so với các mạng trước đó như VGG hay Alexnet là nó có thêm phần identity x được cộng thêm vào đầu ra để tạo thành một output mới là H(x) = F(x) + x. Nhìn qua công thức của output một chút thì ta có thể thấy luôn về mặt trực quan rằng đầu ra của nó thì thông tin luôn rich hơn sơ với mạng thường vì ngoài F(x) nó còn x nữa và nếu như giả sử model vì một lý do nào đó nó ko muốn học qua layer này thì model nó chỉ cần ép weight và bias của F(x) về 0 để được luôn đầu ra H(x) = x, đây cũng chính là ánh xạ đồng nhất mà mình nói ở phần lớp hàm phía trên và cũng là một trong những lý do để nó có tên là skip connection.
6. CodeĐọc lý thuyết đôi khi khá trìu tượng nên xem code của model này sẽ là một cách để hiểu nó rõ hơn. Vì vậy mình sẽ để link github code các version Resnet bằng pytorch cho các bạn tham khảo. Đây là repo của phương pháp MixUp trong đó ngoài model Resnet còn có các model khác như vgg, lenet, mobilenet,..
Link repo.
Cảm mọi người đã xem bài viết này của mình. Hãy để lại ý kiến của các bạn phía dưới comment nhé. Thanks..
References
[1] https://arxiv.org/abs/1512.03385
[2] https://d2l.ai/chapter_convolutional-modern/resnet.html
Nhận xét
Đăng nhận xét