Mình ngồi gõ những dòng này vào lúc 2h sáng (chính xác là 2h 2 phút), quả là một đêm khó ngủ. Có lẽ vì lúc chiều đã uống cốc nâu đá mà giờ mắt mình tỉnh như sáo, cũng có thể là vì những trăn trở về lý thuyết chồng chất ánh xạ mình đọc ban sáng khiến không tài nào chợp mắt được hoặc cũng có thể do mình đang thức để đợi xem Champion league cũng nên (nghi là cái thứ 3 lắm ) . Trong lúc chờ Cristiano Ronaldo ra sân đêm nay mình cũng tranh thủ ngồi gõ vài dòng về con đường mình đã đi, từ một đứa dốt toán, sợ đại số trở thành một đứa dốt AI. Mình lập ra blog này ngoài chia sẻ kiến thức, cũng mong có chỗ chia sẻ những câu chuyện xàm xí của mình, vì viết nhiều trên facebook thì bạn mình kêu là spam và unfollow nhiều quá nên giờ chuyển spam lên viblo vậy Bài viết này mình chỉ kể câu chuyện của mình thôi, không đưa ra lời khuyên gì cả, chỉ để các bạn đọc cho vui sau một ngày miệt mài với trí tuệ nhân tạo hay học máy với toàn toán với code đau đầu.
Sơ qua một chút về mình, thì mình tên Hiếu, học năm cuối đại học Bách Khoa Hà Nội (sắp thất nghiệper), mình đến với AI có lẽ từ năm cuối năm 2 đầu năm 3 đại học. Từ một đứa sợ toán đến khi trở thành một main author trong 1 paper (ấn phẩm khoa học) về Deep Learning, giờ đây thất nghiệp ngồi ở nhà viết blog dạo và cách 2 tuần gia đình phải gửi thức ăn lên Hà Nội để cứu trợ. Hy vọng câu chuyện mình sắp kể tới đây sẽ giúp mọi người thư giãn và cảm thấy thú vị
Ưm, mình sẽ liệt kê theo trình tự thời gian (time series ) những dấu mốc mình xem như là bước ngoặt trong suốt quãng đường mình đến và nghiên cứu trí tuệ nhân tạo (AI)
Lần đầu thấy có người học AI mà không phải giáo sư, tiến sỹ
Ừm đó là vào hè năm 2018, cuối năm hai của mình. Hôm đó mình vừa đi ăn cơm gà ở quán "Bố Già" (gọi là bố già vì bác chủ quán gặp ai vào ăn cũng gọi là con bất kể nhiều tuổi hơn cả bác ) rồi vội vàng lên lớp học môn Lý thuyết thông tin của thầy Chuyết (mình cũng không nhớ tên thầy là Chuyết hay Truyết, ưmmm mà kệ đi), dưới cái máy lạnh bằng tuổi mình mà mình và hàng trăm sinh viên của khoa mất 460k/ tín tiền học chỉ để duy trì "sự sống" thay vì được thay mới thì mình đã sẵn sàng cho một giấc ngủ trưa đầy bổ ích, tuy nhiên tự dưng ông bạn của mình lấy ra một sấp tài liệu toàn tiếng Anh với toán đập cái bộp lên bàn. Mình ngờ vực hỏi lão coi cái sấp giấy "ma mị" đó gì thì lão trả trời (nguyên văn): "Giáo trình đại số của MIT, tôi đang học AI ông ạ!!". Lúc đó mình thất kinh, lâu nay mình nghĩ chỉ có Giáo sư Tiến sỹ mới học được AI thôi giờ cả thằng bạn mình cũng học được rồi, mình thấy mình tệ thật sự, bị cả thế giới bỏ lại. Đang sợ hãi các thứ thì thầy Chuyết vào lớp, thầy bắt đầu thả chất giọng qua cái micro (có lẽ bằng tuổi cái điều hòa) bằng một tốc độ vô cùng chậm rãi, điềm đạm của một Giáo sư gạo cội, thế là mình quên bẵng nỗi sợ rồi thiếp đi ngay lúc nào không hay .
Khóa lập trình web ở Misa
Nghe có vẻ không liên quan nhưng đây thật sự là một bước ngoặt lớn đối với việc học AI của mình. Với dân công nghệ thông tin, lại thuộc lớp những đứa làng nhàng, trung bình kém trong khoa như mình thì trước nay luôn nghĩ là sau ra trường sẽ làm web hay app gì đó được thôi, AI là thứ rất xa vời. Vì vậy, đến hè năm 2, để tránh 1 mùa hè lãng phí như 19 cái mùa hè trước đó thì mình cùng mấy đứa bạn thân trong lớp đăng ký khóa học lập trình web bằng C# của Misa và may mắn qua vòng test đầu vào. Ở mấy tuần đầu bọn mình học HTML, CSS. Kiểu là một đứa học chuyên tin, lên đại học loanh quanh cũng chỉ code thuật toán, đến khi code HTML mình chả hiểu cái quái gì, mình không hiểu cái gì quy định thế nào là đẹp, màu CSS thế nào là xấu, tại sao ô đăng nhập lại luôn để giữa màn hình ???? Những câu hỏi đó khiến mình sợ hãi vì khả năng định tính của mình rất kém, không có quy luật hay công thức làm mình rất áp lực mỗi khi bị giao bài tập code frontend. Kết quả là bài kiểm tra lúc nào mình cũng kém nhất lớp. Khi đó mình đã thật sự rất khủng hoảng, vì công việc mà mình luôn nghĩ sẽ giúp mình kiếm cơm sau này thì mình lại làm kém nhất.
Trong một đêm khó ngủ vì mải suy nghĩ về công việc sau này thế nào thì mình chợt nhớ đến ông bạn học AI bữa nọ. Hy vọng bỗng lóe lên, vẫn còn một đường thoát cho mình, đó là dấn thân vào AI. Mặc dù biết là rất khó những mình bắt đầu lên Google search AI là gì, học AI từ đâu,vv... đại khái là toàn những câu hỏi ngốc nghếch. Và mình đã tìm được bước ngoặt tiếp theo **Blog Machine Learning cơ bản. **
PS: Đến giờ thì mình vẫn không code được HTML, CSS nên cái mùa hè năm đó cũng được xem như 19 cái mùa hè trước luôn
Quá trình đọc hết blog Machine Learning cơ bản
Mình bắt đầu đọc 2 bài đầu của blog vô cùng nhanh, và chỉ mất 1 buổi chiều là xong. Lý do đơn giản, 2 bài đầu a Tiệp chỉ giới thiệu về AI, machine learning và các dạng thuật toán chứ chưa đưa ra lý thuyết hay thuật toán cụ thể nào cả. Khởi đầu thuận lợi như vậy khiến mình rất tự tin đọc đến bài thứ 3, Linear Regression. Đến bài này thì mình bị sock, dù a Tiệp đã cảnh báo có rất nhiều toán và có thể bỏ qua phần toán. Mình vốn rất sợ Đại số vì cách đó 2 kỳ mình bị dính con D đại số, mức điểm toán thấp nhất từ khi mình biết đếm 1+1=2 đến giờ. Vì vậy ngay khi đập vào mắt là hàng loạt biến đổi đại số, ma trận thì mình đã sock và tận đến...1 tháng sau mình mới dám dồn hết sức đọc kỹ từng biến đổi trong blog. Vậy là sau 1 tháng mình mới hoàn thành bài Linear Regression, một khởi đầu không thể tồi tệ hơn. Một thời gian sau ông bạn học AI của mình rủ mình đi học lớp Deep Learning của viện toán cao cấp tổ chức. Bọn mình học được mấy buổi thì ông bạn mình vì trùng với lịch học đàn nên bỏ dở (bọn mình học miễn phí khóa Deep, mà học đàn thì đắt ), thế là còn mỗi mình đi học. Dù vậy, nhưng mọi người đều rất thoải mái chia sẻ, các anh chị dậy hầu hết là tiến sỹ ở Mỹ (a Thanh, a Đại Bùi), giờ ra chơi được ăn uống miễn phí bánh kẹo, cafe, rất thích. Hồi đó trước mỗi buổi dậy của viện toán, mình sẽ đọc trước kiến thức trong blog của Tiệp, lên lớp thì nghe giảng lại 1 lần, nên mình học khá nhanh, và các kiến thức cũng hiểu kỹ càng hơn mà không mất quá nhiều sức vì các anh giảng rất dễ hiểu.
Mình mất khá nhiều thời gian để đọc và hiểu được toàn bộ kiến thức về tối ưu lồi mà a Tiệp trình bày trong loạt bài về SVM, mình nghĩ đó là loạt bài khó nhất và cũng hay nhất trong blog. Sau đó, việc đọc và hiểu các công thức toán trở nên dần quen và mình không còn sợ việc đọc toán nữa. Thế nhưng, bỗng a Tiệp không ra bài nữa, nguồn học Machine learning duy nhất của mình khi đó bỗng tắc tịt và mình rơi vào cơn khủng hoảng thứ 2. Mình đọc nhiều toán, cũng code lại các thuật toán mà blog miêu tả, nhưng mình mãi chẳng có một ứng dụng gì thực tế, cũng không rõ ứng dụng của những thuật toán này là gì. Trong lúc lướt facebook vô thức, mình bỗng thấy bài đăng của a Nguyễn Thanh Tuấn, và mình tiếp tục ngoặt cái rầm, Blog Deep Learning cơ bản đã cứu mình một pha trông thấy.
Blog Deep Learning cơ bản
Blog Deep Learning thật sự cứu rỗi mình lúc đó. Bài cuối cùng trong blog của a Tiệp là bài Convolution (tích chập) và thật trùng hợp bài đầu tiên mình đọc của a Tuấn là bài mạng tích chập sâu. Blog trình bày rất mạch lạc, văn phong và các biến đổi cũng dễ hiểu, và cái hay ho đó là từ lúc tiếp cận kiến thức đến kết luận vẫn rất logic. Mình vui nhất là lúc mình train và chạy được ví dụ xe tự lái trong bài CNN. Trong blog bài nào cũng có code ví dụ, và mỗi lần chạy các ví dụ trực quan làm mình vô cùng phấn khích. Ví dụ, bài image captioning, mình chạy và lấy ra caption cho cái ảnh thằng bạn mình đang ngồi đánh điện tử, sau đó mình gửi ngay cho mẹ mình để khoe, mẹ mình gửi cái ảnh kèm caption cho mẹ thằng bạn, mẹ nó đánh nó một trận, nó cũng cầm cái ảnh có caption cho mình xem và không quên kèm theo quả đấm cảm ơn. Mặc dù miệng mình khá đau sau quả đấm nhưng mình vẫn khá vui và cố nhoẻn miệng cười. Trong quá trình đọc blog, code có bug, mình nhắn tin hỏi a Tuấn và đều được a giải đáp rất nhiệt tình. Mình rất thần tượng a Tuấn khi đó và nghĩ chắc sau này chỉ có thể biết những người giỏi như a qua mạng mà thôi. Nhưng AI đã cho mình gặp gỡ và trải nghiệm rất nhiều, cho đến giờ nhìn lại mình vẫn không ngờ mình đã trải nghiệm được nhiều điều như vậy.
Thực tập tại Pixta tháng 9/2019
Mặc dù mình chỉ thực tập tại công ty một thời gian ngắn nhưng mình vẫn học được rất nhiều và nghiệm ra cũng rất nhiều điều. Lần đầu mình thấy được quá trình một dự án AI thực hiện: Research, build baseline và improve. Cũng là lần đầu mình được giao đọc paper, các sản phẩm khoa học được những nhà nghiên cứu hàng đầu thế giới đưa ra nhằm giải quyết hoặc cải thiện một bài toán nào đó, mà ở đây là bài toán mà dự án đang thực hiện. Học các note ý chính, rồi thuyết trình lại kiến thức, concept mà paper đề cập. Mình hiểu ra, việc mình tiếp thu kiến thức là 1 chuyện nhưng ngoài ra còn phải biết các truyền tải những kiến thức khó đó cho người nghe một cách thật dễ hình dung và dễ hiểu. Ở lab của công ty có rất nhiều anh chị giỏi, đã dậy mình rất nhiều kiến thức mà chỉ trong thời gian ngắn mình thực tập. Vì lý do lịch học mà mình đã phải xin nghỉ làm, đó thật sự là điều mình nuối tiếc nhất trong năm 2019.
Lên lab, làm nghiên cứu và paper đầu tiên
Đây có lẽ là bước chuyển mình lớn nhất trên con đường AI mình đang theo đuổi. Đầu năm 2019, cô mình từ Nhật về nước, cô muốn xây dựng một lab nghiên cứu về IoT, AI, Data Mining ở Bách Khoa. Tháng 10/2019, cô nhắn tin hỏi mình có muốn tham gia lab của cô không? Và gần như không chút chần chừ, mình đã đồng ý cái rụp. Quyết định vào lab AIOT của cô chắc chắn là quyết định sáng suốt nhất trong những năm đại học của mình, thay đổi toàn bộ định hướng về tương lai mà mình dự định trước đó.
Dự án đầu tiên và idea cho paper
Vào lab, cô giao cho mình dự án OCR (nhận diện ký tự) tiếng Nhật viết tay, khi đó nhóm của mình có 5 người. Bọn mình bắt đầu khá chật vật, trước hết là không có dữ liệu, phải đi xin từ trường đại học bên Nhật, sau đó cô giao cho bọn mình đọc 1 số paper về nhận diện chữ viết, OCR để nghiên cứu, thử cài đặt và trainning với dữ liệu bọn mình thu thập được. Trong quá trình đọc các paper về OCR mình nhận ra hầu hết các mô hình deep learning cho bài toán này đều xoay quanh trục chính_ Mạng CRNN_ kết hợp của một model CNN trích xuất đặc trưng và theo sau là RNN để dự đoán lần lượt các ký tự trong 1 câu text. Hồi còn làm việc ở Pixta, mình có nghiên cứu qua về Attention, và vô cùng hâm mộ kỹ thuật đơn giản nhưng vô cùng hiệu quả này. Thời điểm đó, một mạng neural có chức năng tương tự RNN nhưng cực kỳ mạnh mẽ là Transformer dựa trên kỹ thuật self attention đã ra đời. Và như một lẽ tự nghiên mình bắt đầu đặt ra câu hỏi, sao không thay thế RNN trong mạng CRNN bằng Transformer nhỉ? Cô mình sau khi nghe ý đồ thay thế RNN của mình cũng rất tán đồng, và đề nghị mình đi sâu vào trong mô hình, cải thiện, test thử trên các tập benchmark để kiểm tra tính hiệu quả của model.
Khó khăn trong quá trình thử nghiệm ý tưởng
Mình bắt đầu code idea từ tháng 1/2020, mình code khá nhanh, chỉ khoảng 1 tuần là đã cơ bản xong và có thể trainning rồi. Tuy nhiên, model của mình cho kết quả rất tệ và hàm loss không hề giảm mà tắc lại một ngưỡng nhất định (32). Hồi đó mình nhớ là đang lúc dịch corona, mình ở Hà Nội một mình, hàng quán đóng cửa, bạn bè về quê hết, trong tháng 1 năm đó mình gần như trầm cảm. Ngày nào cũng như ngày nào, sáng ngủ dậy ăn mì tôm, rồi ngồi vào fix bug, cho đến 5h chiều thì ra ngoài chạy bộ một chút, tối ăn xong, tiếp tục ngồi fix đến đêm rồi ngủ, sáng ngày hôm sau lại quay trở lại lịch trình cũ. Cứ như vậy đến đúng ngày 30/1/2020, sau khi đã đọc rất nhiều và thử nghiệm rất nhiều phương án nhưng đều vô dụng mình bắt đầu định bỏ cuộc, thế nhưng đúng lúc đó mình chợt nhớ ra một dòng code đáng ngờ. Mình thử đưa bước chuyển vị tensor ra sau hàm Linear. Và thật bất ngờ, model work một cách kỳ diệu, loss không ngừng giảm vượt qua con số 32 và accuracy model tăng điên cuồng. Mình sướng phát điên, nhảy ngay xuống tiệm tạp hóa mua khô gà với bia để nhậu một mình.
Tuy nhiên, niềm vui vừa đến không được bao lâu, ngay tối hôm đó, mình phát hiện ra idea của mình đã có người làm rồi, một tay Đài Loan đã public một paper về idea trên trước mình chỉ nửa năm tại hội nghị ICDAR, hội nghị cao nhất về các nghiên cứu nhận diện văn bản. Mặc dù rất thất vọng nhưng lúc đó niềm tin của mình lần nữa trội lên, việc có người public paper về idea của mình có nghĩa rằng mình không sai. Sau đó mình họp cùng nhóm và đưa ra quyết định tiếp tục improve model. Bọn mình tiếp tục thêm vào model một mạng neural thứ cấp, mạng này có tác dụng dự đoán các điểm kiểm soát bao bọc vùng text, rồi sử dụng một phép nội suy tuyến tính để dàn phẳng những text bị cong hay biến dạng. Mạng neural thứ cấp này đã được nghiên cứu từ trước nhưng kết hợp cùng transformer để dự đoán các ký tự quang học thì chưa ai làm. Thế là bọn mình lại code, rồi trainning, kết quả ra khá tốt, model của bọn mình cho kết quả vượt trội so với một số các model state of the art trước 2019, tuy nhiên so với thế hệ model được đưa ra năm 2019 thì bọn mình chưa thể vượt qua. Với kết quả đạt được bọn mình khá thành công trong 1 số cuộc thi như giải nhì nghiên cứu khoa học cấp trường, giải nhất sản phẩm sáng tạo cấp Viện và về thứ 3 trong cuộc thi Hackathon do IBM đồng tổ chức cùng HUST. Thế nhưng kết quả như vậy chưa đảm bảo model của bọn mình có thể được chấp nhận tại các hội nghị quốc tế. Sau 2 tháng dậm chân tại chỗ, bọn mình tìm ra thêm 1 điểm có thể improve được. Không phải model mà là về vấn đề thiếu cân bằng dữ liệu của tập train, mình thay thế cross entropy loss bằng focal loss để làm giảm sự ảnh hưởng của các lớp có tần suất xuất hiện cao trong dataset. Và sau nhiều tuần tuning các siêu tham số, model tiếp tục hội tụ và cho ra kết quả cực tốt trên các tập test chuẩn vượt qua 1 loạt các model cộm cán khác.
Xuyên suốt quá trình nghiên cứu, một mình mình không thể đảm nhận hết mọi công việc được. Từ xử lý dữ liệu, fix bug, cài môi trường, xử lý vấn đề server, vv... cần rất nhiều sự giúp đỡ của mọi người. Một phần đóng góp không nhỏ cũng từ một người bạn trong nhóm của mình, đó là Thành_học KSTN, Thành với mình học cùng trường cấp 3 và là một chuyên gia toán thực thụ. Thành giúp mình rất nhiều trong việc hiểu các phép nội suy, cũng đọc rất nhiều paper và đóng góp rất nhiều ý kiến hữu ích vào việc cải thiện model, paper của bọn mình cũng do một tay Thành viết các phần quan trọng. Đến giữa tháng 9/2020, đang ngồi ăn cơm thì mình tiện tay lướt điện thoại check hội nghị bọn mình nộp paper đã công bố kết quả chưa. Đang nhai dở miếng thịt dai như cao su thì từ accepted hiện lên ngay cạnh tên bài báo của nhóm mình, tí nữa mình phun cả miếng thịt ra bàn. Cuối cùng sau 1 năm dài đằng đẵng thì công trình của bọn mình đã được công nhận tại một tổ chức uy tín và khá lớn trong giới nghiên cứu học máy.
Làm nghiên cứu và gặp gỡ những người giỏi
Từ khi bắt đầu đi vào nghiên cứu AI, có lẽ mình là một người vô cùng may mắn. Như đã kể ở trên mình từng nghĩ sẽ không bao giờ gặp được những người giỏi mà chỉ có thể nghe về họ qua sách báo, vì họ ở đẳng cấp quá xa để mình có thể với tới. Như a Tuấn, mình nghĩ sẽ chỉ có thể quen anh qua facebook mà thôi nhưng trời xui đất khiến thế nào anh lại dậy thay thầy Ngọc trong khóa Deep Learning của viện toán cao cấp vài buổi và mình bắt đầu quen anh qua lớp học này. Giờ thì mình đã là thành viên thứ 3 trong công ty AI4E mà anh lập ra, làm trợ giảng cho khóa Math for ML mới mở.
Vào lab mình thậm chí còn được quen và gặp rất nhiều những nhân vật chắc chỉ xuất hiện trong truyền thuyết. Như hiện tại mình đang nghiên cứu cùng cô Lan bên viện nghiên cứu MICA, một trong những chuyên gia giỏi nhất về thị giác máy tính ở Việt Nam. Ngoài ra, mình cũng đang lead nhóm OCR của lab làm dự án cùng NAVER_ một trong những tập đoàn lớn nhất Hàn Quốc, bọn mình thi thoảng thảo luận cùng lab Clova của NAVER, lab sở hữu công trình CRAFT, thuật toán mạnh nhất thế giới hiện tại trong việc phát hiện vị trí văn bản chụp tự nhiên (bọn mình thực sự đã muốn xin chữ ký của mấy lão Hàn Quốc này vì rất hiếm có cơ hội để được gặp mặt các idol xuất sắc như vậy :V). Không những thế mình cũng được gặp và làm việc cùng một nhóm của thầy Minh Đỗ, hiệu phó VinUni, top 2% nhà nghiên cứu ảnh hưởng nhất thế giới. Và không thể thiếu cô mình, cô Phi Lê, huy chương bạc IMO 2000 và từng là sinh viên xuất sắc nhất đại học Tokyo top 32 thế giới. Cô có phong cách làm việc phải gọi là khủng khiếp và là tấm gương làm việc quên mình cho thế hệ trẻ noi theo.
Trong lab mình có hàng loạt các sinh viên vô cùng tài năng, làm việc cũng người giỏi và tài năng như vậy cũng giúp mình nâng cao trình độ và ké fame . Đi làm nghiên cứu cũng không phải chịu rằng buộc thời gian thế này thế kia nên rất thoải mái, mình cũng được thoải mái đưa ra những idea mới, miễn là đừng quá vô lý là được :v
Dự định tương lai
Trước đây , vào năm 3 mình có được nhận một job onsite tại Nhật. Mình từng nghĩ sẽ sang Nhật để đi làm, rảnh rỗi thì đóng phim kiếm thêm thu nhập. Nhưng vào lab mình đã thay đổi hẳn quan điểm. Mình đã suy nghĩ rất lâu và đưa ra quyết dịnh hủy job ở Nhật. Mình muốn học lên và nghiên cứu sâu hơn về AI. Có thể đi du học hoặc học ở Bách Khoa. Như mình đã nói, mình là đứa sinh viên thuộc dạng trung bình kém, profile so với những người đi học cũng rất kém nhưng không vì vậy mà mình sẽ buông bỏ con đường tìm kiếm tri thức mới.
Kể đến đây cũng dài lắm rồi nên hẹn gặp lại các bạn trong 1 bài viết mới. Bật mí trước là bài viết tiếp theo cố gắng diễn giải một vấn đề vô cùng hóc búa trong Deep Learning. Kính mong mọi người đón đọc!!!!
Update 1: Vì dịch nên mình không đi đâu được, qua nước ngoài cũng dính học online, chắc mình sẽ tìm việc ở Việt Nam trong lúc chờ dịch thuyên giảm !!!
Update 2: Mình đã rải CV một vài công ty và chưa có công ty nào phản hồi. Tình hình dịch thế này có vẻ không ai muốn tuyển dụng thêm AI researcher thì phải. CỨU!!!!