Mình và quá trình khi code một thuật toán Deep Learning
Bài đăng này đã không được cập nhật trong 3 năm
Update 1 chút thì mình đã kiếm được việc rồi ạ, sau đâu đó 10 ngày thất nghiệp Hiện tại mình là AI developer tại Kaopiz Solution nhé mọi người =)))
Đợt vừa qua mình có theo đuổi 1 thuật toán và đến hôm nay trong lúc đợi con AI đang cày mặt học trong 1 chiếc máy chủ chạy ro ro suốt ngày ở góc công ty thì mình tranh thủ viết 1 chút về vài ngày qua vậy. Chuyện là lúc mình vào công ty được 1,2 tuần gì đó thì anh phó giám đốc vứt cho mình 1 bài báo, bảo là "mày đọc rồi code thử xem , anh thấy bài này hay đó". Thì mình cũng vâng dạ rồi ngồi nghiền ngẫm thôi, motivation của bài báo thì hay thật, rất logic và đưa ra được nguyên nhân dẫn đến 1 vấn đề khá học búa đó là làm sao cho Mạng học sâu tập chung vào đúng chỗ nó cần "tập chung". Mình đọc xong đang hý hửng lên github tìm repo của cái paper này thì f*** off, cha tác giả công bố paper tại hội nghị to đùng và không kèm theo code ạ. Thế xong mình vứt paper vào xó và vác mông lên paper with code để đi tìm chân ái. Mãi hơn 1 tháng trở lại đây khi team mình được giao giải quyết 1 bài toán ảo ma vch và lúc visualize bản đồ đặc trưng để fix bug thì cái vấn đề mà paper kia đề cập quay trở lại. Thế là mình mới lôi cái paper cũ ra xem và suy nghĩ đến việc code cái thuật toán của khỉ này với vài cái miêu tả mơ hồ của lão tác giả keo kiệt.
Mình hoàn thành xong thuật toán rồi nối nó vào model hiện tại hết 1 tháng 1 tuần và thật hài là thời gian code chỉ vỏn vẹn có 2 ngày. Mình đã mất 3 tuần suy ngẫm về đúng 1 điều, đó là:" Có nên code hay không". Một câu hỏi thực sự hóc búa ít nhất là với mình, liệu có xứng đáng dành thời gian để code cái thuật toán mơ hồ kia không, mà code xong rồi liệu nó có hoạt động được không ấy chứ, thời gian đó cải thiện dữ liệu thì có phải ngon hơn không,vv.. Vân vân và mây mây các suy nghĩ thiệt hơn lởn vởn trong đầu mình và mình đã dành cả 3 tuần chỉ để xem xét việc có nên viết 1 thuật toán mà đã 4 năm từ lúc nó ra đời chả ai thèm code và public. Shit!!! và mình quyết định code vào tuần thứ 4, lý do đơn giản là nếu mình không code thì ít nhất 1 tuần nữa lại trôi qua một cách vô dụng. Mình dành 3 ngày đầu tiên của tuần đó để hình dung những công việc cần làm, từ chỉnh sửa lại code gen data lâu nay, đến data mới được lan truyền trong code thế nào, hình dung và tính toán chiều các tensor trong thuật toán, vv... done và bắt tay vào code thôi. Ngày thứ 4 mình chỉnh lại code gen dữ liệu và ngày thứ 5, ngày cuối trong tuần làm việc mình viết xong nhánh thuật toán và gắn nó vào model cũ. Ở tuần tiếp theo, mỗi ngày thì mình lại nhận ra 1 bug, bug deep learning nên rất khó lần ra, gần như mỗi bước thuật toán đều phải visualize lên 1 lần. Kết thúc tuần thứ 5 thì mình sure kèo là code không của mình không sai và mới tiến hành huấn luyện.
Sau 2 ngày cuối tuần cho con AI học thuật toán mới, sáng thứ 2 của tuần thứ 6 mình visualize bản đồ đặc trưng lên và BOOM!!!!.... đúng như mình dự đoán luôn, thuật toán mới like shit 😃 Chẳng có cải tiến thần kỳ nào hết, con AI thì lúc ngu lúc thông minh chả đoán được, và bonus thêm nữa là memory cost của model lúc thêm nhánh mới to vch khiến nguyên con GPU 24G Ram out of memory chỉ với batch size 16. Mình tiếp tục chày cối train thêm 1 tuần nữa và kết quả vẫn không suy chuyển. Mình bắt đầu bế tắc, nhưng ngay từ lúc đọc paper mình đã thấy có mùi sai sai trong cách cài đặt lão tác giả, lớp fully connected cuối cùng quá lớn và phép chiếu từ không gian 3 chiều lên cả nghìn chiều là không hơp lý, rất dễ bị stuck trong lúc lan truyền ngược. Thế là mình nảy ra ý định tự viết lại thuật toán theo ý mình, nhưng nên tin vào bản thân-1 thằng sinh viên mới ra trường, non choẹt hay tin cha tác giả- top researcher có paper tại hội nghị cao nhất cho thị giác máy tính đây. Và mình đã chọn bản thân mình, chả vì gì cao siêu cả, đơn giản là mình lâu nay đã mất niềm tin vào giới khoa học cmnr. Mình confirm với anh phó giám đốc thêm 1 lần nữa rồi tiến hành sửa thuật toán, ừm trong 15 phút gì đó, và bắt đầu huấn luyện lại con AI. Đêm qua mình thức đến 3h sáng để chờ đợi model hội tụ đến ngưỡng vừa đủ có thể visualize và đánh giá. Rồi BOOM!!!! .... không như mình nghĩ, thuật toán mới đã hoạt động 😃 Con AI đã chú ý chính xác vào những chỗ nó cần chú ý, ít nhất nó đỡ đỡ ngu hơn trước. Thuật toán mới chả tăng thêm tí RAM nào cả và tốc độ tính toán gần như giữ nguyên.
Thật sự đã rất lâu mình mới thấy 1 cái gì đó kỳ diệu, lần gần nhất là model bọn mình public năm ngoái vượt qua được local minimum nhưng lúc đó chỉ do rùa, mình chả hiểu sao lại thế. Lần này khác, bọn mình có motivation rõ ràng, thấy được nguyên nhân và đã đưa ra cách khắc phục. Kỳ diệu ở chỗ đó là hành trình từ những lý thuyết mơ hồ đến thực tế, cần rất nhiều thử nghiệm và vấp ngã. Có thể cty mình sẽ công bố bài báo , có thể không, nhưng chả làm sao cả, với mình bài báo chưa bao giờ là mục tiêu cả, mục tiêu là những gì mình học hỏi được, bài báo chỉ là cái lợi ích, giá trị thặng dư đi kèm. Lần này mình thấy bản thân đã trưởng thành hơn lần trước, mình ko viết code nhanh hơn, mà là đúng hơn, ít lỗi hơn và đã biết tính toán đường đi nước bước. Toán của mình cũng đã tốt hơn hồi 2 năm trước nhiều.
Trong đời người, sẽ có rất nhiều thời điểm bản thân bị phân vân, sẽ tự hỏi bản thân có nên làm hay không, hay có đủ sức làm không. Nhưng sau cuối muốn biết câu trả lời thì chỉ có thử mới có thể biết được !!!!! PS: Ảnh dưới là tin nhắn của a phó giám đốc ngay sáng hôm sau khi mình sửa thuật toán =)))))
All rights reserved