VNOI Interview - Nguyễn Xuân Khánh

VNOI Interview - Nguyễn Xuân Khánh

Hẳn mọi người đã từng giải quyết một loạt bài tập trên VNOJ có những chiếc cầu dừa thơ mộng cùng anh chàng Pirate. Tác giả những bài đó là anh Nguyễn Xuân Khánh, một trong những Admin đóng góp rất nhiều đường lối quan trọng trong việc phát triển của VNOI.

Anh Khánh là cựu học sinh trường Phổ thông Năng Khiếu, anh đạt được Huy chương đồng IOI năm 2009. Sau khi kết thúc 12 năm học ở Việt Nam, anh đã sang University of Massachusetts, Amherst và sau đó anh tiếp tục theo học PhD ngành Machine learning tại Đại học Maryland, College Park. Tại đây anh nghiên cứu về Machine learning và Natural language processing.

Anh Khánh cũng từng đi thực tập ở Google trong 3 năm 2014, 2015 và 2016 ở nhiều team khác nhau, có nhiều kinh nghiệm với các project khủng về Machine Learning và Deep Learning.

Anh Khánh nổi tiếng với những bài viết trên VNOI wiki như bài viết “Tôi đã học tin thế nào" gồm 2 phần:

Anh còn kỳ công viết một cuốn sách Machine learning cơ bản bằng tiếng Việt: https://ml-book-vn.khanhxnguyen.com/

1 vài của anh Khánh trên VNOJ:

Trả lời nhanh

1. Có một bài viết của giáo sư John Martinis nhận định rằng: “Các thuật toán học máy (machine learning) thực ra khá là ngớ ngẩn và chúng cần không biết bao nhiêu ví dụ để máy tính học được một điều cơ bản”. Anh nghĩ sao về điều này?

Mình có Google thực sự xem ông giáo sư này nguyên văn nói gì và trong văn cảnh như thế nào. Nếu chúng ta trích dẫn câu nói này một cách đơn lẻ dễ gây hiểu lầm. Ý muốn nói đến của câu này tức là về khả năng "tổng quát hóa" của các thuật toán machine learning vẫn còn xa mới bằng được con người. Điều này đúng. Các model machine learning thường chỉ được huấn luyện để giải quyết một bài toán riêng biệt. Chúng thiếu đi khả năng liên kết và suy luận giữa các bài toán như ở con người. Con người có khả năng học với rất ít ví dụ là do chúng ta có thể tổng hợp kiến thức từ nhiều nguồn. Vì dụ như ta đọc một đoạn văn tả một con đường thì trong đầu lại có thể mường tượng được hình ảnh của nó, thậm chí có thể vẽ ra được. Hoặc nhìn thấy con đường thật thì nhớ lại con đường trong văn thơ. Các thuật toán machine learning hiện giờ vẫn chưa giỏi trong việc kết hợp nhiều dạng dữ liệu khác nhau.

Tuy nhiên, nói là machine learning học chậm chạp cũng không đúng. Thực tế là Google có thể huấn luyện được một model dịch thuật Anh-Pháp từ level không biết gì đến level làm hài lòng con người trong vòng vài tuần. Liệu bạn có thể làm được điều đó với một đứa bé chưa biết nói hoặc kể cả một người lớn? Machine learning, đặc biệt là deep learning cần rất nhiều dữ liệu, đó vừa là nhược điểm nhưng vừa là ưu điểm. Trong khi sức học của con người là có giới hạn, sức học của machine learning là không biết mệt mỏi và vô hạn trên lý thuyết. Mặt khác, nói machine learning cần nhiều dữ liệu cũng chưa hoàn toàn chính xác vì con người, để có được khả năng tổng quá hóa cao, cũng phải có rất nhiều trải nghiệm. Nhiều kinh nghiệm của một người được để lại từ đời ông đời cha, trải qua hàng trăm năm mới tích lũy được. Chỉ là vì con người có thể sử dụng kiến thức dùng làm việc A để làm việc B, nên trông có vẻ như là học rất ít về việc B để làm được việc. Tương lai của machine learning cũng sẽ hướng đến điều đó.

2. Ý tưởng sử dụng machine learning trong thực tế điên rồ nhất anh từng nghĩ ra là gì?

Mình có một ý tưởng khá hay nhưng mà khó quá chưa làm được đó là xây dựng các model để dạy lại cho các model khác. Bây giờ đa phần các model đều mô phỏng một "learner" học trực tiếp từ chỉ dạy của con người. Tuy nhiên, thì cách học của con người mà máy lại khác nhau. Mình muốn xây dựng một model trung gian, hiểu cách học của hai bên để giúp các model learner học nhanh hơn.

3. Theo anh thì điều gì là quan trọng nhất anh học được ở đại học? Và anh nghĩ sao về việc đi du học?

Khi ở đại học, mình học được chữ "nhẫn". Khi mới vào năm đầu mình buồn rất nhiều. Mình may mắn được học trong một trường trung học đầy nhân tài ở Việt Nam, trường PTNK. Nhưng mà đó cũng là áp lực rất lớn, vì phải nỗ lực rất nhiều để không cảm thấy thua kém bạn bè. Năm ấy, bạn bè mình đậu vào những trường top rất nhiều còn mình thì lại không thành công lắm trong việc apply. Mùa hè, các bạn đi thực tập ở những công ty lớn còn mình thì lại phải lủi thủi về Việt Nam. Khi mình viết cái resume đầu tiên trong đời thì cảm thấy rất xấu hổ vì không có gì để viết. Tuy nhiên, mình học được cách chắt chiu từng cơ hội và quý trọng bản thân. Mình nhận ra là nếu có xuất phát điểm thấp, thì không thể bước một bước tới trời được mà phải bước từng bước nhỏ. Dù nhỏ nhưng vẫn phải bước, vì không bước thì sẽ chẳng đi đến đâu cả. Thay đổi trong tư tưởng bắt đầu từ việc viết resume. Suy nghĩ của nhiều người khi viết resume lần đầu đó là "mình thấy mình chẳng có thành tích để ghi vào cả. Mình tòan làm những thứ vớ vẩn thôi". Tuy nhiên, đó là suy nghĩ cần nên được vượt qua, nhất là khi bạn ở Mỹ. Người Mỹ rất giỏi trong việc nâng tầm những việc tưởng chừng như rất bình thường của họ. Đó không phải là ba hoa, mà thể hiện sự trân trọng và tự hào về bản thân. Khi mình trân trọng bản thân thì mới làm cho người khác cũng trân trọng mình được. Năm thứ hai, mình đi thực tập ở một công ty không phải là quá lớn để lấy kinh nghiệm, đồng thời cũng apply thử một lớp học kéo dài chỉ có một tuần ở Google. Không ngờ sau đó mình đậu. Lớp học này sau đó lại được ghi vào resume, giúp hồ sơ của mình thân thiện hơn với người tuyển dụng ở Google. Cho nên, mình cũng có lời khuyên với các bạn muốn làm ở các công ty tốt là hãy cố gắng săn lùng và tham gia các hoạt động của các công ty này tổ chức (Hackathon, Summer School, …), vì các công ty rất thích tuyển "người quen".

Sau khi học đại học, tư tưởng của mình thoáng hơn nhiều. Bây giờ mình có tới sơ sơ chục người bạn dạng thân từ cấp 3 học ở Stanford, MIT và Harvard. Mình cũng chẳng phải học Ph.D. ở trường top. Thế nên, mình không câu nệ việc học trường lớn trường nhỏ nữa vì nghĩ nhiều chỉ khổ mình thôi. Mình cũng rất mong xã hội sẽ thoáng hơn khi nghĩ về việc này. Việc anh học trường nào có thể làm bệ phóng rất tốt cho tương lai. Nhưng năm mười năm sau, người ta chỉ nghĩ đến việc anh làm, chứ chẳng ai nhớ anh đã học trường gì. Mình nói như vậy không phải để bớt tủi thân khi không học trường top, mà nói với trải nghiệm của một người học trường "không top" và thấy được cái lợi của nó. Malcolm Gladwell có một bài thuyết giảng rất hay về chuyện này với luận điểm tóm tắt là: người đứng top ở các trường mới thực sự thành công chứ không phải người đứng ở trường top. Cho nên hãy chọn trường phù hợp với khả năng để có cơ hội cao đứng top.

Câu hỏi chính

1. Theo em biết thì anh đã từng làm intern Google research về Machine Learning, Anh có thể cho biết quá trình phỏng vấn khác thế nào so với phỏng vấn Software Engineering ko ạ?

Internship của mình vẫn là Engineer internship dù mình làm trong một team thuộc Google Research. Cho nên quá trình phỏng vấn của giống như các chia sẻ của các bạn khác trên VNOI đã làm ở Google. Google research thực ra là rất rộng. Có rất nhiều team trong đó, dù toàn là Ph.D., nhưng chỉ có nhiệm vụ chính là engineer. Còn nói về phỏng vấn để làm Research Scientist ở Google thì mình không rõ lắm.

Năm nay thì mình có một Research Internship thật sự ở Microsoft. Quá trình phỏng vấn cũng khá đơn giản gồm 2 cuộc phỏng vấn. Một cuộc là về research interest, một cuộc là về coding ability.

2. Việc học thuật toán hồi cấp 3 để luyện thi Quốc gia, Quốc tế có giúp ích nhiều cho anh không?

Giúp ích rất nhiều! Khả năng code và thói quen thích code là một lợi thế. Ví dụ trong việc phỏng vấn chẳng hạn thì rõ ràng những tay chuyên luyện algorithm sẽ trả lời các câu hỏi coding một cách khá trơn tru. Trong việc nghiên cứu, khả năng đọc code và sửa code có thể giúp ta tự chủ và tiết kiệm thời gian hơn.

Tuy nhiên, lợi thế đó chỉ là tương đối và cần phải biết cách khai phá. Tương đối tức là không phải mình biết code thì mình sẽ hơn hẳn người khác. Người có xuất thân học toán có lợi thế của họ, người xuất thân học ngôn ngữ có lợi thế của họ. Ai cũng có lợi thế nào đó, quan trọng là có biết nhìn ra và khai phá hay không. Khai phá không đúng cách thì lợi thế sẽ biến thành bất lợi. Ví dụ, những người đi luyện thi như mình thì quen với kiểu thi thố, code nhanh, cấu trúc không quan trọng miễn là ra được kết quả đúng. Đặc biệt, vì thời gian chạy code ngắn nên code sai thì lại sửa, chủ yếu là nhanh hoàn thành. Tuy nhiên, trong nghiên cứu thì đòi hỏi phải code chuẩn mực. Code chạy là phải đúng vì thậm chí thời gian compile code cũng đã rất lâu. Học deep learning thì càng phải chú ý; như mình sai một bug là mất luôn 2 tiếng chạy chương trình. Code phải được cấu trúc rõ ràng để có thể sau này mở rộng dễ dàng, sử dụng cho nhiều mục đích khác nhau. Đặc biệt là khi nghiên cứu với tập thể, code dễ hiểu sáng sủa phải được đề cao. Cho nên, mình luôn giữ tâm thế mở, sẵn sàng thay đổi tư duy tùy theo hoàn cảnh và chỉ giữ lại những cái bản sắc thật cốt lõi thôi.

3. Anh có định hướng lộ trình phát triển nào cho học sinh muốn theo con đường làm PhD Computer Science không ạ? Và anh có so sánh gì về làm research với làm software engineering không?

Muốn làm Ph.D. thì đầu tiên bạn phải hiểu về nó đã. Sau khi biết nó là gì thì bạn suy nghĩ xem là bạn có thực sự cần nó hay không. Bản thân mình không xem việc học Ph.D. là một cái học vị và không có tư tưởng "học Ph.D. để mở mày mở mặt với làng xóm". Mình xem Ph.D. là một sở thích, cũng giống như ra trường tìm một công việc để làm vậy thôi. Mình học Ph.D. là vì mình có đam mê nghiên cứu, cũng giống như một người có đam mê về ẩm thực tốt nghiệp mở quán bán phở thế thôi. Chứ mình không nghĩ Ph.D. là thông minh hơn người ta. Mình cũng mong xã hội hiểu về Ph.D. như một công việc, một sở thích chứ không phải là một học vị nên mặc định là mấy ông tiến sĩ này biết hết mọi thứ để chê trách khi họ không làm được việc gì đó.

Nếu bạn không có một đam mê nghiên cứu thì Ph.D. là một sự lãng phí thời gian. Cho nên muốn bắt đầu học Ph.D. bạn phải xác định được đam mê của mình là gì. Sau khi xác định được bạn tìm lấy một giáo sư trong trường có ngành nghiên cứu bạn có hứng thú và xin ông ta giao một việc gì đó cho bạn. Có một số giáo sư khó bạn sẽ không thuyết phục ông ấy trong lần đầu tiên. Nếu thế thì hãy học một lớp mà ông ta dạy rồi cố gắng làm ông ấy ấn tượng bằng cách đặt các câu hỏi thông minh, nói chuyện nhiều với ông ấy. Sau khi kết thúc đại học, ông thầy bạn làm cùng sẽ là người viết thư giới thiệu cho bạn. Thường thì bạn sẽ cần tới 3 lá thư giới thiệu, nhưng chỉ một lá thư viết thật tốt là được rồi. Để được một lá thư giới thiệu thật tốt, tối ưu là bạn nên ra được một paper với ông thầy của bạn. Nếu không có paper cũng đừng hoảng, chỉ cần nghiên cứu của bạn đang trên hướng tốt là được. Mối quan hệ xã hội của ông thầy bạn sẽ quyết định rằng bạn sẽ đi học Ph.D. ở đâu. Cho nên, bạn nên chọn làm với những thầy có tiếng tăm tốt hoặc có paper gây tiếng vang trong thời gian gần đây. Hồi mình nộp Ph.D., mình không có paper nào cả nhưng vẫn đậu được Master của CMU, là do thầy mình là cựu Ph.D. CMU mới tốt nghiệp ra làm giáo sư. Tuy nói vậy nhưng cuối cùng vẫn là do năng lực của bạn thôi. Tưởng tượng bạn làm với một ông giáo sư trùm nhưng mà lại biểu hiện rất tệ thì lại phản tác dụng.

Với việc so sánh giữa Ph.D. và software engineer thì mình nghĩ không nên so sánh như vậy. Tại vì đa số Ph.D. ra trường là đi làm software engineer cả. Vấn đề chỉ làm trước hay làm sau mà thôi. Nếu nói thế thì học Ph.D. được lợi gì? Thứ nhất, tuy mình không coi Ph.D. là một cái Ph.D. là một cái học vị nhưng một số nơi sẽ coi nó như một tiêu chuẩn tuyển dụng luôn. Không phải Ph.D. không cho vào. Những nơi này thường công việc rất cao cấp và thú vị. Thứ hai, là học Ph.D. giúp bạn có thời gian để tích lũy kiến thức sâu sắc về một lĩnh vực nào đó. Thứ ba, học Ph.D. giúp bạn luyện khả năng về viết, nói và khả năng suy nghĩ giải quyết vấn đề.

Thật ra, theo kinh nghiệm thì mình thấy môi trường Ph.D. với software engineer cũng không khác mấy lắm đâu. Có khác ở đây là học Ph.D. có nhiều tự do hơn nhưng mà áp lực với bản thân nhiều hơn. Còn làm engineer áp lực đến từ cấp trên, mục tiêu bị giới hạn vào mục tiêu của công ty, và được trả nhiều tiền hơn.

4. Dành cho những bạn muốn tự học machine learning, anh có gợi ý gì về hướng tiếp cận cũng như lộ trình để có thể tự phát triển không ạ?

Mình có viết một cuốn sách về machine learning cơ bản (https://ml-book-vn.khanhxnguyen.com). Bạn có thể bắt đầu học từ đó hoặc những khóa học cơ bản như của Andrew Ng - Coursera, Richard Socher CS224D, Karpathy CS231n. Nếu mới bắt đầu thì nguyên tắc là bạn vừa học vừa bổ sung kiến thức. Nếu đọc gì bạn không hiểu thì bạn nên dừng lại và bổ sung thêm kiến thức đó. Lý thuyết Machine learning thực chất là không có khó học lắm vì mảng toán không quá nặng. Tuy nhiên, bạn phải hiểu kỹ và có hệ thống một chút. Ví như cuốn sách mình viết với với tư tưởng là không đi sâu vào một dạng model nào hết nhưng mà nếu học theo cách tổng quát như vậy thì gặp dạng model nào cũng thấy quen thuộc.

Một lời khuyên nữa là bạn nên chăm chỉ thực hành chứ không chỉ ngồi nghe bài giảng suông. Lý thuyết machine learning thì dễ nhưng mà thực hành thì rất khó. Nếu nghe bài giảng có bài tập hoặc demo nào thì bạn nên ngồi lấy ra làm thử. Bạn nên tìm lấy một framework ML phổ biến nào đó (Tensorflow, Torch, Chainer) rồi lập trình hoặc chạy thử các model ML trên đó (có thể tìm được trên GitHub).

5. Về xử lý ngôn ngữ tự nhiên (NLP), theo anh thì những challenges của NLP là gì và những người mới học ML cần biết những gì để bắt đầu đi sâu vào lĩnh vực NLP ạ?

Challenge của NLP có rất nhiều. NLP bây giờ tập trung vào deep learning. Cho nên những khó khăn của deep learning cũng là khó khăn của NLP, ví dụ như về làm sao để học với ít dữ liệu hơn, làm sao để chuyển đổi kiến thức giữa các model và giữa các task. Về mặt ngôn ngữ học, thì NLP bây giờ thực chất là ELP (English language processing) nên còn rất nhiều đất để nghiên cứu về các ngôn ngữ khác.

Một thách thức lớn của NLP bây giờ đơn giản là làm sao để tạo ra ngôn ngữ một cách tự nhiên để máy tính thực sự giao tiếp được với con người. Tạo ra một câu nói đúng ngữ pháp thì không khó, nhưng mà làm cho nó có ý nghĩa, và ý nghĩa đó phải điều khiển được theo ý muốn của chúng ta là rất khó. Việc này lại liên quan đến việc làm sao để biểu diễn được "ý nghĩa" chỉ với những con số 0 1 mà máy tính hiểu được

Để đi vào lĩnh vực NLP thì cần có nền tảng ML tốt. Lộ trình học ML mình đã trả lời ở câu trước rồi. Ngoài ra, để làm NLP tốt bạn cần có một chút kiến thức và đam mê về ngôn ngữ học nữa. NLP bây giờ có hai thái cực, một thái cực thiên về ML và một thái cực thiên về ngôn ngữ học. Ở thái cực thiên về ML, bạn tạo ra một model ML tốt và muốn áp dụng nó trên một bài toán về ngôn ngữ để chứng minh là nó tốt. Thái cực này quan trọng là model ML đó giải được những bài toán nào, có phải về ngôn ngữ hay không thì không quan trọng. Ở thái cực khác thiên về ngôn ngữ học, bạn có một bài toán về ngôn ngữ và sử dụng ML như một công cụ để giải. Bạn không quan tâm model nào được sử dụng miễn là bài toán về ngôn ngữ của bạn được giải. Theo mình thì dung hòa giữa hai thái cực này là tốt nhất.

6. Hiện giờ deep learning đang rất hot, nhưng về lâu dài thì anh có dự đoán gì không ạ, liệu nó có phải chỉ là một xu hướng nhất thời hay nó sễ hoàn toàn thay thế các mô hình machine learning truyền thống ạ?

Trong một bài blog gần đây (http://khanhxnguyen.com/deep-learning-1-goc-nhin-giao-duc/), mình có phân tích tại sao deep learning là một sự phát triển tự nhiên và tất yếu từ các model truyền thống. Mình thì thường không phân biệt model theo tên gọi và trường phái. Khi mình nhìn thấy một model, mình chỉ nghĩ đến à, nó có bao nhiêu lớp (layer), kiến trúc của nó là gì, hàm mất mát của nó là gì. Nếu kiến trúc là feed-forward, chỉ có một layer và hàm mất mát là logistic loss thì sẽ được Logistic Regression. Nếu lại đổi sang hinge loss và thêm vào L2-regularization thì ta lại được Support Vector Machine. Đổi Logistic Regression với kiến trúc recurrent thay vì feed-forward ta được Hidden Markov Model hoặc là Conditional Random Fields. Đổi hàm loss của HMM hoặc CRF thành hinge loss ta lại được structured SVM. Tóm lại là nó chỉ vòng vòng thế thôi. Các model đều có bà con với nhau cả.

Cho nên thực chất là không có gì thay thế cái gì cả, model chỉ đang trở nên to lớn hơn thôi. Thế nên mình dự đoán rằng trong tương lai thì các model sẽ còn "deep" hơn nữa. Tuy nhiên, đó không phải là giải pháp cho tất cả. Deep learning hiện giờ phải đi đôi với Big Data. Có rất nhiều nơi mà Big Data không có sẵn, những nơi đó gọi là Small Data. Ví dụ như một model muốn học ý thích của từng cá nhân để phục vụ việc cá nhân hóa (personalization). Vì lượng dữ liệu mà một cá nhân sinh ra không thể dồi dào, các model deep learning sẽ không thể tốt bằng các model truyền thống đơn giản hơn. Thế nên trong tương lai, người ta sẽ phải tìm cách tổng quát hóa kiến thức từ nhiều nguồn và học với ít dữ liệu hơn.

7. Anh có thể chia sẻ những khó khăn trong việc anh viết sách về machine learning bằng tiếng việt, trong khi anh đã học và vận dụng các kiến thức đó bằng tiếng anh không ạ?

Câu hỏi này rất thú vị. Thú thực là mình đã định viết một bài blog, chỉ để nói riêng về chuyện có nên dịch hay không dịch những thuật ngữ tiếng anh. Bạn mình từng đưa cho mình một cuốn sách về machine learning tiếng Việt. Mình đọc thấy chữ "thuật toán xuống thang đạo hàm" mãi mới đoán ra là "gradient descent". Quan điểm của mình là không dịch các thuật ngữ bằng tiếng anh. Trường hợp duy nhất mình thấy nên dịch đó là để phục vụ thẩm mỹ văn học và giữ gìn sự trong sáng của tiếng Việt. Ví dụ như thay vì nói "model này được train bằng thuật toán X", nghe nửa Việt nửa Anh hơi kì, mình sẽ dùng từ "huấn luyện" thay cho "train", dù thực chất "train" là một thuật ngữ của ML. Trong các bài viết ban đầu, mình cũng có dịch những thuật ngữ khác nhưng là để thân thiện hơn với người đọc. Càng về sau, khi bạn đọc quen thuộc hơn với ngành ML, mình sẽ ít dịch đi. Và nếu mình có dịch, mình sẽ ghi kèm theo thuật ngữ tiếng anh tương đương trong dấu ngoặc. Lý lẽ cho rằng nên dịch sang tiếng Việt hết để giữ gìn sự trong sáng của tiếng Việt mình không đồng tình lắm. Ta nên giữ gìn cái gì là của ta tạo ra mà thôi. Còn đối với ML, các thuật ngữ nguyên gốc bằng tiếng Anh. Nếu dùng những cụm từ dị hợm để dịch ra, vô tình chúng ta bôi xấu tiếng Việt, và cũng làm mất đi "trong sáng của ML". Thực tế là có nhiều từ mình cũng chẳng biết dịch thế nào cho sát với môi trường Việt Nam, nhất là các thuật ngữ trong xác suất thống kê.

Mục tiêu tối thượng của cuốn sách mình viết ra không phải để thay thế các tài liệu nước ngoài, mà là làm cầu nối giữa mọi người với các tài liệu nước ngoài. Thế mình không viết hết, mà chỉ muốn viết dạng như một cuốn từ điển các thuật ngữ ML cơ bản. Mình biết là các bạn học ở trong nước sẽ gặp khó khăn với các thuật ngữ này nhưng chúng ta phải chịu khó tra cứu để hội nhập với thế giới thôi. Về lâu về dài, người nghiên cứu ML tất yếu phải đọc được, viết được paper bằng tiếng Anh. Có thế thì vị thế của Việt Nam trong cộng đồng khoa học thế giới mới được nâng cao.