Table of Contents Lời tựa
1.1
Machine learning là gì?
1.2
Supervised Learning
1.3
Các khái niệm cơ bản
1.3.1
Hai góc nhìn về supervised learning
1.3.2
Objective function
1.3.3
Overfitting
1.3.4
Regularized Loss Minimization
1.3.5
Tinh chỉnh các hyperparameter
1.3.6
Thuật toán supervised learning tổng quát
1.3.7
Hàm mất mát
1.3.8
1
Lời tựa
Lời tựa Xin chào, mình là Nguyễn Xuân Khánh, một người đang học và nghiên cứu về machine learning. Lĩnh vực mình chuyên sâu cho đến bây giờ là natural language processing (gọi tắt là NLP), tức là làm cho máy tính có khả năng hiểu được ngôn ngữ của con người. Mình không phải là một chuyên gia nghiên cứu, kinh nghiệm còn khá non nếu so với các giáo sư và kỹ sư đầu ngành nhưng mình rất muốn đem bộ môn này về giới thiệu với mọi người, nhất là các bạn còn đang loay hoay tìm câu trả lời cho câu hỏi: học Tin học sau này có thể làm được gì? Cuốn sách này được viết nhằm đưa ra một trong rất nhiều câu trả lời cho câu hỏi trên. Nội dung chủ yếu giới thiệu về một lĩnh vực thu hút rất nhiều sự chú ý trong vài năm gần đây, machine learning. Cuốn sách tập trung vào các khái niệm và ứng dụng cơ bản trong lĩnh vực này, nhằm giúp người đọc có đọc nền tảng học thuật vững chắc trước khi đi sâu hơn vào nghiên cứu và sáng chế. Ngày 20/7/2016
2
Machine learning là gì?
Machine learning là gì? Machine learning gây nên cơn sốt công nghệ trên toàn thế giới trong vài năm nay. Trong giới học thuật, mỗi năm có hàng ngàn bài báo khoa học về đề tài này. Trong giới công nghiệp, từ các công ty lớn như Google, Facebook, Microsoft đến các công ty khởi nghiệp đều đầu tư vào machine learning. Hàng loạt các ứng dụng sử dụng machine learning ra đời trên mọi linh vực của cuộc sống, từ khoa học máy tính đến những ngành ít liên quan hơn như vật lý, hóa học, y học, chính trị. AlphaGo, cỗ máy AI với khả năng tính toán trong một không gian có số lượng phần tử còn nhiều hơn số lượng hạt trong vũ trụ, tối ưu hơn bất kì đại kì thủ cờ vây nào, là một trong rất nhiều ví dụ hùng hồn cho sự vượt trội của machine learning so với các phương pháp cổ điển. Vậy thực chất, machine learning là gì? Để giới thiệu về machine learning, mình xin dựa vào mối quan hệ của nó với ba khái niệm sau: 1. Machine learning và trí tuệ nhân tạo (Artificial Intelligence hay AI) 2. Machine learning và Big Data. 3. Machine learning và dự đoán tương lai. Trí tuệ nhân tạo, AI, một cụm từ vừa gần gũi vừa xa lạ đối với chúng ta. Gần gũi bởi vì thế giới đang phát sốt với những công nghệ được dán nhãn AI. Xa lạ bởi vì một AI thực thụ vẫn còn nằm ngoài tầm với của chúng ta. Nói đến AI, hẳn mỗi người sẽ liên tưởng đến một hình ảnh khác nhau. Các bạn có để ý rằng vài thập niên gần đây có một sự thay đổi về diện mạo của AI trong các bộ phim quốc tế. Trước đây, các nhà sản xuất phim thường xuyên đưa hình ảnh robot vào phim (như Terminator), nhằm gieo vào đầu người xem suy nghĩ rằng trí tuệ nhân tạo là một phương thức nhân bản con người bằng máy móc. Tuy nhiên, trong những bộ phim gần hơn về đề tài này, ví dụ như Transcendence do Johny Depp vào vai chính, ta không thấy hình ảnh của một con robot nào cả. Thay vào đó là một bộ não điện toán khổng lồ chỉ huy hàng vạn con Nanobot, được gọi là Singularity. Tất nhiên cả hai hình ảnh đều là hư cấu và giả tưởng, nhưng sự thay đổi như vậy cũng một phần nào phản ánh sự thay đổi ý niệm của con người về AI. AI bây giờ được xem như vô hình vô dạng, hay nói cách khác có thể mang bất cứ hình dạng nào. Vì nói về AI là nói về một bộ não, chứ không phải nói về một cơ thể. Trong giới hàn lâm, theo hiểu biết chung, AI là một ngành khoa học được sinh ra với mục đích làm cho máy tính có được trí thông minh. Mục tiêu này vẫn khá mơ hồ vì không phải ai cũng đồng ý với một định nghĩa thống nhất về trí thông minh. Thế nên các nhà khoa học phải định nghĩa một số mục tiêu cụ thể hơn, một trong số đó là việc làm cho máy tính lừa
3
Machine learning là gì?
được Turing Test. Turing Test được tạo ra bởi Alan Turing (1912-1954), người được xem là cha đẻ của ngành khoa học máy tính hiện đại, nhằm phân biệt xem người đối diện có phải là người hay không. 1 AI thể hiện một mục tiêu của con người. Machine learning là một phương tiện được kỳ vọng sẽ giúp con người đạt được mục tiêu đó. Và thực tế thì machine learning đã mang nhân loại đi rất xa trên quãng đường chinh phục AI. Nhưng vẫn còn một quãng đường xa hơn rất nhiều cần phải đi. Machine learning và AI có mối quan hệ chặt chẽ với nhau nhưng không hẳn là trùng khớp vì một bên là mục tiêu (AI), một bên là phương tiện (machine learning). Chinh phục AI mặc dù vẫn là mục đích tối thượng của machine learning, nhưng hiện tại machine learning tập trung vào những mục tiêu ngắn hạn hơn như: 1. Làm cho máy tính có những khả năng nhận thức cơ bản của con người như nghe, nhìn, hiểu được ngôn ngữ, giải toán, lập trình, … và 1. Hỗ trợ con người trong việc xử lý một khối lượng thông tin khổng lồ mà chúng ta phải đối mặt hàng ngày, hay còn gọi là Big Data. Big Data thực chất không phải là một ngành khoa học chính thống. Đó là một cụm từ dân gian và được giới truyền thông tung hô để ám chỉ thời kì bùng nổ của dữ liệu hiện nay. Nó cũng không khác gì với những cụm từ như "cách mạng công nghiệp", "kỉ nguyên phần mềm". Big Data là một hệ quả tất yếu của việc mạng Internet ngày càng có nhiều kết nối. Với sự ra đời của các mạng xã hội nhưng Facebook, Instagram, Twitter, nhu cầu chia sẻ thông của con người tăng trưởng một cách chóng mặt. Youtube cũng có thể được xem là một mạng xã hội, nơi mọi người chia sẻ video và comment về nội dung của video. Để hiểu được quy mô của Big Data, hãy xem qua những con số sau đây: Khoảng 300 giờ video được upload trên youtube trong mỗi phút (theo https://www.youtube.com/yt/press/statistics.html) Hơn 900 triệu người thật sự sử dụng Facebook mỗi ngày, 82.8% trong số đó ở ngoài Mỹ và Canada (theo http://newsroom.fb.com/company-info/) Nhu cầu chia sẻ tăng đi đôi với việc nhu cầu tìm kiếm thông tin cũng tăng. Google phải xử lý _100 tỉ lượt tìm kiếm _mỗi tháng, tức là 3,3 tỉ lượt mỗi ngày và 38.000 lượt mỗi giây (theo http://www.internetlivestats.com/google-search-statistics/). Và những con số này đang tăng lên theo từng giây! Bùng nổ thông tin không phải là lý do duy nhất dẫn đến sự ra đời của cụm từ Big Data. Nên nhớ rằng Big Data xuất hiện mới từ vài năm gần đây nhưng khối lượng dữ liệu tích tụ kể từ khi mạng Internet xuất hiện vào cuối thế kỉ trước cũng không phải là nhỏ. Thế nhưng, lúc ấy con người ngồi quanh một đống dữ liệu và không biết làm gì với chúng ngoài lưu trữ và sao chép. Cho đến một ngày, các nhà khoa học nhận ra rằng trong đống dữ liệu ấy thực ra chứa
4
Machine learning là gì?
một khối lượng tri thức khổng lồ. Những tri thức ấy có thể giúp cho ta hiểu thêm về con người và xã hội. Từ danh sách bộ phim yêu thích của một cá nhân chúng ta có thể rút ra được sở thích của người đó và giới thiệu những bộ phim người ấy chưa từng xem, nhưng phù hợp với sở thích. Từ danh sách tìm kiếm của cộng đồng mạng chúng ta sẽ biết được vấn đề nóng hổi nhất đang được quan tâm và sẽ tập trung đăng tải nhiều tin tức hơn về vấn đề đó. Big Data chỉ thực sự bắt đầu từ khi chúng ta hiểu được gía trị của thông tin ẩn chứa trong dữ liệu, và có đủ tài nguyên cũng như công nghệ để có thể khai thác chúng trên quy mô khổng lồ. Và không có gì ngạc nhiên khi machine learning chính là thành phần mấu chốt của công nghệ đó. Ở đây ta có một quan hệ hỗ tương giữa machine Learning và Big Data: machine learning phát triển hơn nhờ sự gia tăng của khối lượng dữ liệu của Big Data; ngược lại, thành công của Big Data phụ thuộc vào khả năng khai thác tri thức từ dữ liệu của machine learning. Ngược dòng lịch sử, machine learning đã xuất hiện từ rất lâu trước khi mạng Internet ra đời. Một trong những thuật toán machine learning đầu tiên là thuật toán perceptron được phát minh ra bởi Frank Rosenblatt vào năm 1957. Đây là một thuật toán kinh điển dùng để phân loại hai khái niệm. Một ví dụ đơn gỉan là phân loại thư rác (tam gíac) và thư bình thường (vuông). Chắc các bạn sẽ khó hình dung ra được làm thế nào để làm được điều đó. Đối với perceptron, điều này không khác gì với việc vẽ một đường thẳng trên mặt phẳng để phân chia hai tập điểm:
Những điểm tam giác và vuông đại diện cho những email chúng ta đã biết nhãn trước. Chúng được dùng để "huấn luyện" (train) perceptron. Sau khi vẽ đường thẳng chia hai tập
5
Machine learning là gì?
điểm, ta nhận thêm các điểm chưa được dán nhãn, đại diện cho các email cần được phân loại (điểm tròn). Ta dán nhãn của một điểm theo nhãn của các điểm cùng nửa mặt phẳng với điểm đó. Sơ lược quy trình phân loại thư được mô tả sau. Trước hết, ta cần một thuật toán để chuyển email thành những điểm dữ liệu. Công đoạn này rất rất quan trọng vì nếu chúng ta chọn được biểu diễn phù hợp, công việc của perceptron sẽ nhẹ nhàng hơn rất nhiều. Tiếp theo, perceptron sẽ đọc tọa độ của từng điểm và sử dụng thông tin này để cập nhật tham số của đường thẳng cần tìm. Các bạn có thể xem qua demo của perceptron (điểm xanh lá cây là điểm perceptron đang xử lý):
Vì là một thuật toán khá đơn giản, có rất nhiều vấn đề có thể nảy sinh với perceptron, ví dụ như điểm cần phân loại nằm ngay trên đường thẳng phân chia. Hoặc tệ hơn là với một tập dữ liệu phức tạp hơn, đường thẳng phân chia không tồn tại:
6
Machine learning là gì?
Lúc này, ta cần các loại đường phân chia "không thẳng". Nhưng đó lại là một câu chuyện khác. Perceptron là một thuật toán supervised learning: ta đưa cho máy tính hàng loạt các ví dụ cùng câu trả lời mẫu với hy vọng máy tính sẽ tìm được những đặc điểm cần thiết để đưa ra dự đoán cho những ví dụ khác chưa có câu trả lời trong tương lai. Ngoài ra, cũng có những thuật toán machine learning không cần câu trả lời mẫu, được gọi là unsupervised learning. Trong trường hợp này, máy tính cố gắng khai thác ra cấu trúc ẩn của một tập dữ liệu mà không cần câu trả lời mẫu. Một loại machine learning khác được gọi là reinforcement learning. Trong dạng này, cũng không hề có câu trả lời mẫu, nhưng thay vì đó máy tính nhận được phản hồi cho mỗi hành động. Dựa vào phản hồi tích cực hay tiêu cực mà máy tính sẽ điều chỉnh hoạt động cho phù hợp. Sau đây là một ví dụ minh họa:
7
Machine learning là gì?
Mục tiêu của chiếc xe là leo lên được đỉnh đồi và lấy được ngôi sao. Chiếc xe có hai chuyển động tới và lui. Bằng cách thử các chuyển động và nhận được phản hồi là độ cao đạt được và thời gian để lấy được ngôi sao, chiếc xe dần trở nên thuần thục hơn trong việc leo đồi lấy sao. Machine learning có mối quan hệ rất mật thiết đối với statistics (thống kê). Machine learning sử dụng các mô hình thống kê để "ghi nhớ" lại sự phân bố của dữ liệu. Tuy nhiên, không đơn thuần là ghi nhớ, machine learning phải có khả năng tổng quát hóa những gì đã được nhìn thấy và đưa ra dự đoán cho những trường hợp chưa được nhìn thấy. Bạn có thể hình dung một mô hình machine learning không có khả năng tổng quát như một đứa trẻ học vẹt: chỉ trả lời được những câu trả lời mà nó đã học thuộc lòng đáp án. Khả năng tổng quát là một khả năng tự nhiên và kì diệu của con người: bạn không thể nhìn thấy tất cả các khuôn mặt người trên thế giới nhưng bạn có thể nhận biết được một thứ có phải là khuôn mặt người hay không với xác suất đúng gần như tuyệt đối. Đỉnh cao của machine learning sẽ là mô phỏng được khả năng tổng quát hóa và suy luận này của con người. Như ta đã thấy, nói đến machine learning là nói đến "dự đoán": từ việc dự đoán nhãn phân loại đến dự đoán hành động cần thực hiện trong bước tiếp theo. Vậy machine learning có thể dự đoán tương lai hay không? Có thể có hoặc có thể không: machine learning có thể dự đoán được tương lai, nhưng chỉ khi tương lai có mối liên hệ mật thiết với hiện tại. Để kết thúc, mình muốn cùng các bạn xem xét một ví dụ đơn giản sau. Giả sử bạn được đưa cho một đồng xu, rồi được yêu cầu tung đồng xu một số lần. Vấn đề đặt ra là: dựa vào những lần tung đồng xu đó, bạn hãy tiên đoán ra kết quả lần tung tiếp theo. Chỉ cần dựa vào tỉ lệ sấp/ngửa của những lần tung trước đó, bạn có thể đưa ra một dự đoán khá tốt. Nhưng nếu mỗi lần tung, người ta đưa cho bạn một đồng xu khác nhau thì mọi chuyện sẽ hoàn toàn khác. Các đồng xu khác nhau có xác suất sấp ngửa khác nhau. Lúc này việc dự
8
Machine learning là gì?
đoán gần như không thể vì xác suất sấp ngửa của lần tung sau không hề liên quan gì đến lần tung trước. Điều tương tự cũng xảy ra với việc dự đoán tương lai bằng machine learning, nếu ta xem như mỗi ngày có một "đồng xu" được tung ra để xem một sự kiện có diễn ra hay không. Nếu "đồng xu" của ngày mai được chọn một cách tùy ý không theo phân bố nào cả thì machine learning sẽ thất bại. Rất may là trong nhiều trường hợp điều đó không hoàn toàn đúng, thế giới hoạt động theo những quy luật nhất định và machine learning có thể nhận ra những quy luật đó. Nhưng nói cho cùng, machine learning hoàn toàn không phải là một bà phủ thủy với quả cầu tiên tri mà cũng giống như chúng ta: phán đoán bằng cách tổng quát hóa những kinh nghiệm, những gì đã được học từ dữ liệu. 1. Xem phim The Imitation Game về nhân vật này, nhưng đừng tin hết những gì trong phim. ↩
9
Supervised Learning
Chương 1: Supervised Learning Supervised learning là một hướng tiếp cận của machine learning để làm cho máy tính có khả năng "học". Trong hướng tiếp cận này, người ta "huấn luyện" máy tính dựa trên những quan sát có dán nhãn. Ta có thể hình dung những quan sát này như là những câu hỏi, và nhãn của chúng là những câu trả lời. Ý tưởng của supervised learning là: bằng việc ghi nhớ và tổng quát hóa một số quy tắc từ một tập câu hỏi có đáp án trước, máy tính sẽ có thể trả lời được những câu hỏi dù chưa từng gặp phải, nhưng có mối liên quan. Điều này mô phỏng việc con người học bằng cách đưa ra dự đoán của mình cho một câu hỏi, sau đó đối chiếu với đáp án. Sau đó chúng ta rút ra phương pháp để trả lời đúng không chỉ câu hỏi đó, mà cho những câu hỏi có dạng tương tự. Trong supervised learning, các quan sát bắt buộc phải được dán nhãn trước. Đây chính là một trong những nhược điểm của phương pháp này, bởi vì không phải lúc nào việc dán nhãn chính xác cho quan sát cũng dễ dàng. Ví dụ như trong dịch thuật, từ một câu của ngôn ngữ gốc có thể dịch thành rất nhiều phiên bản khác nhau trong ngôn ngữ được dịch. Tuy nhiên, việc quan sát được dán nhãn cũng lại chính là ưu điểm của supervised learning bởi vì một khi đã thu thập được một bộ dữ liệu lớn được dán nhãn chuẩn xác, thì việc huấn luyện trở nên dễ dàng hơn rất nhiều so với khi dữ liệu không được dán nhãn. Trong chương này, chúng ta sẽ đưa supervised learning về một phương trình toán học đơn giản, thậm chí có thể giải được bằng kiến thức phổ thông. Tuy nhiên, ta sẽ chỉ ra những điểm bất cập khi sử dụng các phương pháp thông thường để tìm lời giải và đưa ra những phương pháp để hạn chế những bất cập đó. Tổng hợp những phương pháp này, ta xây dựng được một thuật toán supervised learning tổng quát.
10
Các khái niệm cơ bản
Các khái niệm cơ bản Observation: kí hiệu là x, input trong các bài toán. Observation thường có dạng một vector x = (x1 , x2 , ..., xn ), gọi là feature vector. Mỗi xi gọi là một feature. Label: kí hiệu là y, output của bài toán. Mỗi observation sẽ có một label tương ứng (ví dụ mỗi khuôn mặt sẽ có một cái tên). Label có thể mang nhiều dạng nhưng đều có thể chuyển đổi thành một số thực hoặc một vector. Trong chương này chủ yếu làm việc với label là số thực. Model: trong chương này các bạn hiểu là nó là một hàm số f (x), nhận vào một observation x và trả về một label y = f (x). Parameter: mọi thứ của model được sử dụng để tính toán ra output. Ví dụ model là một hàm đa thức bậc hai: f (x) = ax21 + bx2 + c thì parameter của nó là bộ ba (a, b, c). Tuy nhiên, còn một loại parameter đặc biệt nữa gọi là hyperparameter. Hyperparameter là một khái niệm mang tính tương đối và quy ước, thường chỉ các parameter có tính chất hơi mặc định. Đối với hàm đa thức thì bậc của đa thức có thể được xem là một hyperparameter. Để ngắn gọn, người ta thường gom tất cả parameter của một model lại thành một vector, thường được kí hiệu là w. Trong f (x) vừa rồi thì w = (a, b, c). Kí hiệu fw (x) được dùng để chỉ một model đã được xác định tham số. Trong trường hợp cấu trúc model đã được xác định (ví dụ đã biết được nó là đa thức bậc 2), thì có thể dùng w để chỉ model thay cho fw (x) luôn.
11
Hai góc nhìn về supervised learning
Hai góc nhìn về Supervised Learning Ở bài này mình đưa ra một định nghĩa sơ lược. Định nghĩa này không hoàn toàn chính xác nhưng nó giúp ta hiểu một cách khái quát nhất về supervised learning. Dần dần trong các bài học sau chúng ta sẽ cải tiến để hoàn chỉnh định nghĩa này. Tiếp cận supervised learning thực chất không đòi hỏi quá nhiều kiến thức cao siêu. Nó có thể được quy về thành một bài toán tối thiểu hàm số cơ bản trong toán học.
Góc nhìn thứ nhất: ước lượng hàm số Bạn hãy tưởng tượng rằng đang chơi một trò chơi với thiên nhiên (là một sức mạnh vô hình điều khiển mọi sự việc của vũ trụ). Đầu tiên, thiên nhiên viết ra một hàm bí ẩn f ∗ nào đó. Sau đó thiên nhiên đưa vào hàm số này một loạt các observation x(1) , ⋯ , x(N ) để tạo ra một loạt các label y(1) , ⋯ , y(N ) tương ứng. Sau đó, thiên nhiên đem giấu hàm f ∗ đi và chỉ chừa lại các cặp observation-label (x(i) , y(i) ) cho chúng ta nhìn thấy. Nhiệm vụ của chúng ta là khôi phục lại được hàm f ∗ bằng một model fw một cách chính xác nhất có thể. Ta gọi đây là trò chơi supervised learning. Mọi bài toán supervised learning đều có thể được định nghĩa theo cách này. Ví dụ trong bài toán phân loại văn bản, observation x có thể là một văn bản, label y là chủ đề của văn bản đó, còn f ∗ là một chuyên gia đọc văn bản và tìm ra chủ đề của chúng. Mục tiêu của machine learning là tạo ra một chương trình máy tính fw để làm công việc này tốt như là chuyên gia f ∗ kia. Q1: Giả sử bằng cách nào đó ta biết được rằng x = (x1 , x2 ) (một vector 2 chiều) và y = f ∗ (x) = ax21 + bx2 + c. Cần bao nhiêu cặp dữ liệu (x, y) để có thể tìm ra parameter (a, b, c)? A1: Với mỗi cặp (x, y) ta xây dựng được một phương trình y = ax21 + bx2 + c. Vì có 3 ẩn nên ta cần chỉ cần 3 phương trình là giải ra được tham số (nếu tồn tại). Tức là cần 3 điểm dữ liệu.
12
Hai góc nhìn về supervised learning
Trong thực tế thì mọi chuyện không đơn giản như vậy. Supervised learning đối mặt với nghịch lý sau đây: vì ta không thể nào giao tiếp được với tự nhiên, nên sẽ không bao giờ biết được f ∗ có dạng như thế nào. Vì thế, dù ta có đưa ra một model fw để ước lượng f ∗ , cũng không ai biết f ∗ là gì để cho biết là ta đang đúng hay sai. Nói cách khác, supervised learning là một trò chơi dự đoán mà không ai biết đáp án đúng là gì. Đọc đến đây các bạn đừng nản lòng. Tuy là nghe có phần không tưởng, nhưng không riêng gì machine learning, các ngành khoa học cơ bản khác cũng chơi những trò chơi tương tự. Các bạn có nghĩ rằng Einstein nằm mơ thấy thiên nhiên thì thầm vào tai mình công thức E = mc2 ? Cho đến giờ, người ta vẫn phải làm thí nghiệm trong thực tế để kiểm chứng lại các lý thuyết của Einstein cho đến khi nó sai thì thôi. Trong supervised learning, ta cũng làm một điều tương tự như vậy: kiểm chứng sự đúng đắn của một model bằng thực nghiệm. Cho dù không biết hình dạng của f ∗ ra sao, thì vẫn còn đó các cặp observation-label sinh ra từ hàm này. Ta sẽ đánh giá độ tốt của một model trên các dữ liệu thực tế này. Ví dụ, nếu nhận được 100 cặp observation-label, ta chỉ dùng khoảng 80 cặp để xây dựng ra fw . Còn lại 20 cặp, ta giấu không cho model nhìn thấy lúc nó học. Sau khi model học xong, ta sẽ cho các observation vào model để tạo ra các label dự đoán, rồi so sánh chúng với các label thật do f ∗ sinh ra. 80 cặp được dùng để xây dựng ra model gọi là training set (tập huấn luyện), còn 20 cặp dùng để đánh giá model gọi là test set (tập kiểm tra). Tương ứng, supervised learning cũng được chia thành hai quá trình: train (lúc model học) và test (lúc đánh giá model).
13
Hai góc nhìn về supervised learning
Q2: Tại sao không dùng tất cả dữ liệu để train rồi test trên đó luôn? A2: Trong machine learning, có một nguyên tắc vô cùng, vô cùng quan trọng cần nhớ: đó là quá trình train và test phải độc lập với nhau! Dữ liệu được dùng để test model phải không được model nhìn thấy lúc train. Có rất nhiều cách để vi phạm nguyên tắc này, và điều dẫn đến một hậu quả "thảm khốc", overfitting. Mình sẽ giải thích về hiện tượng này trong một dịp khác. Nói nôm na là model của bạn sẽ biến thành một con vẹt, chẳng học được gì khác ngoài việc lặp lại những gì nó đã nhìn thấy. Vì thế, bạn phải chia dữ liệu ra thành training set và test set, và phải làm điều này trước khi train model. Tỉ lệ 80:20 ở ví dụ trên là tỉ lệ train:test thường được áp dụng. Tuy đã làm cho trò chơi supervised learning trở nên hợp lệ, ta vẫn chưa thể chơi được. Có hai vấn đề phát sinh, đó là: 1. Thế nào là một model "tốt" trên test set? 2. Làm sao để tìm ra được một model "tốt" từ training set? Để giải quyết hai vấn đề này, ta cần đến góc nhìn thứ hai.
Góc nhìn thứ hai: tối ưu hàm số Đầu tiên, ta tập trung vào vấn đề thứ nhất: giả sử đã tìm được một model fw , làm thế nào để đo độ tốt của nó trên test set bằng một con số cụ thể? Một trong những cách đơn giản nhất đó là đếm xem nó đoán sai bao nhiêu label thật trên test set. Ta giả sử model bị phạt 1 điểm với mỗi lần label dự đoán khác với label thật. Số điểm bị phạt trung bình được gọi là error rate (độ sai sót) của model. Error rate là một số
14
Hai góc nhìn về supervised learning
thực trong đoạn [0, 1]. Theo ngôn ngữ toán học, error rate trên một test set Dtest của model fw được tính như sau: e Dtest =
1 ∣Dtest∣
∑
I{f w(x) ≠ y}
(x,y)∈Dtest
trong đó: ∣Dtest∣ số lượng các cặp (x, y) của test set (kí hiệu |S| nghĩa là lực lượng của tập hợp S). I{.} sẽ trả về 1 nếu logic trong dấu ngoặc nhọn là đúng, 0 nếu sai. Nếu lập trình, pseudocode sẽ như thế này: N = |D_{test}| error_rate = 0 for i = 0 .. N - 1 if (f(x[i]) != y[i]) error_rate += 1 error_rate = error_rate / N
Độ sai sót càng thấp, thì model càng tốt. Nếu đoán đúng hết tất cả cặp dữ liệu, ta đạt được độ sai sót "trong mơ", 0%. Nhưng nên nhớ đấy là kết quả được đo trên một test set hữu hạn. Kết quả này chỉ đưa ra được một chặn trên và chặn dưới cho kết quả trên tập vô hạn (muốn biết rõ, xem thêm về central limit theorem). Nói cách khác, nếu tự nhiên có gửi đến một test set mới để đánh giá fw , thì chưa chắc ta có thể lặp lại được độ sai sót giống như trên test set cũ. Độ sai sót được đánh giá trên test set càng lớn thì càng đáng tin cậy. Ta có thể định nghĩa độ tốt theo rất nhiều cách khác nữa. Tổng quát, độ tốt của model được xác định dựa trên giá trị của evaluation function trên test set: LDtest (fw ) =
1 ∑ ∣Dtest∣ (x,y)∈D
L (fw (x), y ) test
trong đó fw là model được test, hàm L là một loss function. Error rate là một dạng evaluation function thường dùng với loss function là L (fw (x), y ) ≡ I{f (x) ≠ y} (kí hiệu ≡ đọc là "được định nghĩa bằng nhau"). Đến đây, ta tạm thời sẵn sàng chơi trò chơi supervised learning dưới góc nhìn như một bài toán tối ưu hàm số. Hãy quay lại trả lời 2 câu hỏi trong phần trước:
15
Hai góc nhìn về supervised learning
1. Thế nào là một model "tốt" trên test set? → model cho giá trị của evaluation function trên test set càng nhỏ thì càng tốt. 2. Làm sao để tìm ra được một model tốt từ training set? → tìm model cực tiểu hóa giá trị của evaluation function trên training set. Cụ thể hơn, sau khi chọn được evaluation function, supervised learning có thể được gói gọn trong 2 bước sau: 1. Train (huấn luyện): tìm model fw tối thiểu hóa giá trị của evaluation function trên training set. 2. Test (kiểm tra): thông báo độ tốt của fw là gía trị của evaluation function trên test set.
16
Objective function
Objective function Trong hai quá trình của supervised learning, train và test, thì quá trình test đơn giản hơn vì bạn chỉ việc đưa observation vào model, nhận về label dự đoán, và tính giá trị của evaluation function trên test set. Quá trình train phức tạp hơn vì nó phải đảm bảo rằng model phải có khả năng dự đoán tốt trên test set (là dữ liệu không được model nhìn thấy lúc train). Bài viết giải thích tại sao không thể sử dụng các evaluation function như error rate để train model, và giới thiệu về khái niệm objective function.
Mục tiêu tối thượng của supervised learning Khi nói đến việc "giải" một bài toán supervised learning tức là ta đang nói đến việc tìm một phương pháp huấn luyện trên training set sao cho model dự đoán tốt trên test set. Người ta thường ít quan tâm đến độ tốt của model trên training set bởi vì nó thường rất cao (nhất là với các model cực mạnh của deep learning). Độ tốt trên training set chỉ thể hiện được khả năng ghi nhớ của model về những gì đã nhìn thấy. Với một trí thông minh thật sự, ta cần thêm khả năng tổng quát hóa, chính là việc dự đoán tốt trên dữ liệu chưa hề được nhìn thấy.
Objective function Để dự đoán tốt nhất trên test set, cách đơn giản nhất là tìm model dự đoán tốt nhất trên training set, và hy vọng rằng nó cũng sẽ dự đoán tốt trên test set. Vì thế, ở bài trước ta phát biểu rằng: 1. Train: tìm model fw tối thiểu hóa giá trị của evaluation function trên training set. 2. Test: thông báo độ tốt của fw là gía trị của evaluation trên test set. Tuy nhiên, cách làm này trong thực tế vừa rất khó thực hiện được vừa không hiệu quả. Ta sẽ tìm ra 2 vấn đề trong phát biểu trên và thay đổi để làm nó thực tế và hiệu quả hơn. Thứ nhất, khi train model ta chỉ muốn tìm ra model dự đoán "khá" chính xác trên training set mà thôi. Vì sao là "khá" chính xác mà không phải là chính xác hoàn toàn? Không có điều gì đảm bảo model dự đoán hoàn chính xác trên train set cũng dự đoán tốt trên test set cả. Thậm chí nó có thể dự đoán rất tệ nếu test set rất khác với train set. Điều giống như việc bạn bị "trật tủ" khi đi vậy (ôn một đằng đề ra một kiểu). Thường trong các bài toán, bạn có một khối dữ liệu lớn từ một nguồn nào đó rồi chia ra 80% để train và 20% để test. Vì thế mà train set và test set sẽ có cùng một nguồn, nói chính xác hơn là cùng một phân bố xác suất. Nhưng mà dù có gần giống nhau như vậy, hai set này cũng vẫn có những 17
Objective function
khác biệt nhất định. Ta phải đánh đổi giữa khả năng ghi nhớ và khả năng tổng quát hóa của model. Model muốn ghi nhớ càng tốt thì lại càng phải xử lý nhiều trường hợp ngoại lệ. Có khi một observation x được label là y theo một logic rất kì lạ và hiếm gặp. Lúc này, model phải đặt ra ngoại lệ, những quy luật mà chỉ đúng với mỗi observation đó hoặc số ít khác. Việc đặt ra quá nhiều ngoại lệ làm model bớt tính tổng quát. Để hạn chế những ngoại lệ này, ta chỉ cần model đoán "khá" chính xác trên train set mà thôi. Bù lại model sẽ tổng quát hơn và đoán chính xác hơn trên test set. Suy cho cùng, độ tốt trên test set mới là thứ ta quan tâm sau cùng. Thứ hai, trong phát biểu trên ta dùng cùng một loss function cho cả train và test. Đây là một trường hợp rất lý tưởng và hiếm gặp trong thực tiễn. Trong đa số trường hợp, loss function được sử dụng lúc train và lúc test không giống nhau. Kì lạ đúng không? Tại sao chúng ta "dạy" một đằng, nhưng mà lại "ra đề" một nẻo? Evaluation function thường dùng thường rất khó để tối thiểu hóa bằng các phương pháp toán học (sẽ giải thích ngay sau phần này). Lý do khái quát là do các evaluation function này thường là tổng của của các loss function có dạng 0-1 loss, tức là chỉ trả về 0 hoặc 1 và phải trùng hoàn toàn với label thật thì mới nhận được 0. Error rate là một ví dụ điển hình của 0-1 loss. Đối với những hàm như vậy, nếu model đoán sai thì không biết sửa chữa theo hướng nào để tiến bộ hơn. Khi train, ta cần một loss function cho partial credit, tức là đúng tới đâu cho điểm tới đó và dự đoán thế nào cũng có điểm. Model có thể tận dụng điều này để thay đổi câu trả lời một chút xem điểm tăng hay giảm, dần dần tìm ra câu trả lời đúng. Một trong những loss function thường được sử dụng nhất là negative log-likelihood. Khi sử dụng loss function này, model của chúng ta thay vì đưa ra một đáp án cụ thể, thì sẽ đưa ra xác suất observation x mang label y, tức là fw (x) ≡ Pw (y ∣ x). Negative log-likelihood được định nghĩa như sau: L(fw (x), y) ≡ − log Pw (y ∣ x) Ta thấy là nếu model đưa xác suất 100% cho label thật y, thì loss function sẽ có giá trị log 1 = 0 và model không bị phạt. Hơn nữa, cho dù model đưa ra xác suất thế nào thì cũng đều nhận được loss tương ứng với độ sai. Ta gọi hàm được model tối ưu lúc train là objective function để phân biệt với evaluation function lúc test. Objective function thường có dạng như sau: objective = average_loss + regularizer Giống như evaluation function, objective function cũng gồm giá trị trung bình của loss function (lưu ý, loss function này khác với loss function của evaluation function). Objective function còn có thêm regularizer. Tác dụng của regularizer chính là để giải quyết vấn đề
18
Objective function
đầu tiên ta nhắc đến, làm cho model chỉ dự đoán "khá" chính xác training set mà thôi. Giống với evaluation function, nếu không có regularizer, objective function cũng đảm bảo tính chất tối ưu: model nhận được giá trị 0 khi và chỉ khi dự đoán hoàn hảo training set. Vì thế, ta cần thêm regularizer vào objective function để điều này không xảy ra. Bài viết sau sẽ nói rõ hơn về điều này. Đến đây ta phát biểu lại về hai quá trình của supervised learning: 1. Train: tìm fw tối thiểu hóa objective function LDtrain (fw ). 2. Test: đo độ tốt của fw bằng LDtest (fw ). Ở đây ta sử dụng LDtrain để chỉ objective function và LDtest để chỉ evaluation function.
Đọc thêm: vì sao không dùng error rate để train model? Như ta đã biết, quá trình train model về bản chất là tối ưu một hàm số. Từ kiến thức đã học từ cấp 3, ta cũng biết rằng việc tối ưu hàm số có liên quan đến đạo hàm (ví dụ như đạo hàm ở điểm cực tiểu của một hàm số bằng 0). Cụ thể hơn, trong supervised learning, ta thường tối ưu hàm số bằng gradient descent, tức là dùng gradient (đạo hàm nhiều biến) để dẫn lối cho ta đi đến điểm cực tiểu. Phương pháp này sẽ được giới thiệu chi tiết trong một bài khác. Để dễ hiểu, bạn có thể hình dung tối ưu hàm số như là đi tìm thung lũng thấp nhất trong một vùng núi non. Cách đơn giản nhất là bạn cứ thả mình lăn xuống dốc cho đến khi nào dừng lại. Gradient giống nhưng tổng lực của lực hấp dẫn và phản lực của mặt đất, sẽ kéo bạn lăn về nơi thấp hơn cho đến khi mặt đất không còn dốc nữa. Khi nhìn lại một evaluation function như là error rate: eD =
1 ∑ I{fw (x) ≠ y} ∣D∣ (x,y)∈D
ta thấy I{fw (x) ≠ y} không có gradient liên tục. Ta có thể tưởng tượng việc không có gradient liên tục giống như hàm số bị "gãy" ở một số điểm nào đó. Trong trường hợp này, khi ta cho fw (x) đi từ −∞ đến +∞, hàm I{fw (x) ≠ y} hầu hết mang giá trị 1. Chỉ đến điểm mà fw (x) = y, hàm này độ nhiên giảm xuống giá trị 0. Hơn nữa, ở những điểm mà hàm này có gradient, thì gradient lại vô dụng bởi vì nó bằng 0. Hình vẽ này sẽ giúp bạn dễ hình dung hơn,
19
Objective function
Ở đây model của chúng ta đang được giả định là chỉ có 1 parameter (ví dụ như y = f (x) = ax với tham số là a). Đường ngang thể hiện cho đồ thị với trục ngang là tham số, trục dọc là giá trị error rate ứng với tham số. Việc đi sang trái/phải thể hiện cho việc tăng/giảm tham số. Gỉa sử model đang lạc ở vùng mà error rate đang có giá trị là 1. Xung quanh gần đó hoàn toàn là một vùng bằng phẳng (gradient bằng 0). Model không thể nhìn rất xa nên không thể nào biết được là đi thêm về bên phải một đoạn đạt được error rate thấp hơn là 0. Trong thực tế, model có rất nhiều parameter ta phải ra quyết định tăng hay giảm cho từng parameter.
20
Overfitting
Overfitting Trong bài này, ta sẽ tìm hiểu kỹ hơn về quá trình train một model. Tại sao chỉ cần tìm model dự đoán "khá" chính xác trên training set? Tại sao một model dự đoán "hoàn toàn" chính xác trên training set lại có thể dự đoán rất tồi trên test set? Khi nói đến train model, không thể quên objective function. Ở bài trước, nói rằng objective function thường có dạng: objective = average_loss + regularizer Theo ngôn ngữ toán học: L Dtrain (f w) =
1 ∣Dtrain ∣
∑
L(f w(x), y) + λR(f w)
(x,y)∈Dtrain
1 với ∣D train ∣ ∑ (x,y)∈Dtrain L(fw (x), y) là trung bình loss function trên training set, R(fw ) là
regularizer, λ là regularization constant. Để rút gọn ký hiệu, khi model có dạng xác định, ta có thể sử dụng w để chỉ cả model và parameter của model. Mục tiêu của training là tìm ra model tối thiểu hóa objective function: w = arg min LDtrain (w ′ ) ′ w
Kí hiệu arg minx f (x) trả về giá trị của x để hàm f (x) đạt được giá trị cực tiểu. Ví dụ, arg minx x2 + 1 = 0 bởi vì x2 + 1 đạt giá trị cực tiểu (bằng 1) tại x = 0. Các bạn sẽ nhìn thấy phương trình này trong đa số các paper (bài báo khoa học) về machine learning. Khi ta nói muốn tìm model dự đoán chính xác hoàn toàn trên training set, tức là nói đến việc sử dụng một objective function mà không có regularizer: LERM Dtrain (fw ) =
1 ∣Dtrain∣
∑
L(fw (x), y)
(x,y)∈Dtrain
Đây được gọi là quy tắc empirical risk minimization (ERM). Ta sẽ giải thích vì sao nó được gọi như vậy. Loss function còn được gọi là risk function (hàm rủi ro). Chữ empirical được thêm vào bởi vì risk function này được tính trung bình trên một tập dữ liệu hữu hạn. Vậy empirical risk minimization tức là tối thiểu hóa rủi ro trên một tập dữ liệu hữu hạn.
21
Overfitting
Như đã nhấn mạnh nhiều lần, nếu ta ngây thơ áp dụng ERM thì sẽ thường không thu được model có độ tốt cao trên tập kiểm tra. Bài viết này giới thiệu những kiến thức cần thiết để ta đưa ra được một thuật toán supervised learning tốt hơn ERM. Ta sẽ nói kỹ về vấn đề lớn nhất thường gặp phải khi sử dụng ERM, overfitting, và cách khắc phục nó. Overfitting là một trong những khái niệm quan trọng bậc nhất trong machine learning, là "bóng ma ám lấy machine learning".
Occam's razor Albert Einstein từng có một câu nói nổi tiếng là: Everything should be made as simple as possible, but no simpler. Nghĩa là "mọi thứ nên được tối giản hóa hết mức có thể, nhưng không nên quá mức có thể". Trong machine learning, người ta thường nhắc đến một nguyên tắc gần tương tự gọi là Occam's razor: Entities must not be multiplied beyond necessity. (Wikipedia) Áp dụng vào machine learning, nguyên tắc này được hiểu là: Trong tất cả các giả thiết có thể giải thích được một hiện tượng, ta nên chọn giả thiết đơn giản nhất. Hoặc thậm chí đơn giản hơn: Trong tất cả các model "đúng", chọn model đơn giản nhất. Lưu ý là ở đây có đến hai điều kiện cần được đảm bảo: giả thiết phải đơn giản nhất nhưng vẫn phải giải thích được hiện tượng. Rất dễ để áp dụng Occam's razor một cách sai lầm. Ta xét bài toán phân loại thư vào hai loại, spam và không spam. Model đơn giản nhất có thể nghĩ ra đó là random một trong hai lựa chọn với mỗi bức thư. Model này dù tối giản nhưng lại vô dụng và vi phạm Occam's razor vì nó không thể giải thích tính chất spam (độ chính xác chỉ là 50%). Trong một ví dụ khác như trong hình sau,
22
Overfitting
Chọn một đa thức bậc cao phức tạp để "giải thích" (đi qua hết) các điểm màu đen cũng vi phạm Occam's razor bởi vì giả thiết được chọn không phải đơn giản nhất. Thực chất ta chỉ cần một đa thức bậc một đơn giản (đường thẳng đỏ) để đi qua mọi điểm.
Noise Với mỗi bài toán supervised learning, cho dù có tồn tại một hàm bí ẩn f ∗ sao cho mối quan hệ giữa label và observation là y = f ∗ (x), thì dữ liệu trong thực tế cũng không bao giờ phản ánh chính xác được mối quan hệ này. Nguyên nhân gây ra điều này có thể là do sai số trong dụng cụ đo, hoặc đơn giản là do tự nhiên mang tính ngẫu nhiên. Bạn rất thích ăn thịt, nhưng hôm nay bạn đến thăm nhà hàng xóm được đãi cá; vì thế, dữ liệu thu thập về bữa ăn của bạn không phải ngày nào cũng là thịt. Ví dụ minh họa cho thấy thay vì thu được dữ liệu tuyến tính hoàn hảo (y = ax) như hình bên trái thì thường tọa độ của các điểm dữ liệu sẽ bị sai lệch như hình bên phải.
Với một cặp dữ liệu (x, y), ta có thể mô tả quá trình biến dạng của nó như sau: ~ = x + ϵx x
23
Overfitting
~) + ϵy y~ = f (x ~, y~), phiên Cuối cùng, dữ liệu thật sự ta nhận được để huấn luyện và kiểm tra model là (x bản lỗi của (x, y). ϵx và ϵy được gọi là noise của x và y. Noise thường được xem là một biến số ngẫu nhiên (random variable), thay đổi tùy theo từng cặp (x, y). Sự xuất hiện của noise làm cho mối quan hệ giữa observation và label trở nên phức tạp hơn quan hệ thực sự giữa chúng. Đối với ví dụ ở trên, thì noise đã biến một quan hệ tuyến tính thành một quan hệ phức tạp hơn (đường xanh dương) mà một đa thức tuyến tính (bậc một) không thể giải thích nổi nữa mà cần đến một đa thức bậc cao hơn:
Noise không trực tiếp gây ra overfitting nhưng nó lại làm cho overfitting trở nên gây hại. Về bản chất, overfitting là việc model cố gắng giải thích tất cả các điểm dữ liệu nhìn thấy. Điều này không gì khác chính là tuân theo ERM một cách tuyệt đối để dự đoán đúng tất cả các observation của training set. Nếu làm thế, trong quá hình huấn luyện, noise sẽ "lừa" model học một hàm số hoàn toàn sai so với bản chất của dữ liệu. Khi các điểm dữ liệu của test set xuất hiện, vì noise thường không quá lớn, các điểm mới này cũng vẫn thể hiện phần lớn quan hệ tuyến tính và chỉ hơi lệch với đường thẳng đỏ mà thôi.
Trong trường hợp này, nếu áp dụng ERM ta sẽ chọn đường xanh dương thay vì đường thẳng đỏ vì đường thẳng xanh dương cho sai số thấp hơn trên các điểm dữ liệu của training set (các điểm đen). Nhưng một model phức tạp như đường thẳng xanh dương lại cho sai sót rất lớn trên các điểm dữ liệu của test set (ta thấy các điểm xanh lá cây nằm rất xa so với đường xanh dương). Vì sai sót trên tập kiểm tra mới là thứ ta quan tâm sau cùng nên điều này rất tệ. Ngược lại, nếu chọn model đơn giản như hơn đường thẳng đỏ và chấp nhận sai sót một ít trên tập huấn luyện, sai sót trên tập kiểm tra sẽ nhỏ hơn nhiều.
24
Overfitting
Qua ví dụ này, ta thấy là khi áp dụng Occam's razor vào machine learning, ta không thể tuân thủ nó quá một cách chặt chẽ. Sự xuất hiện của noise làm cho hai tiêu chuẩn của Occam's razor rất khó được bảo toàn: để giải thích được đúng hơn tập huấn luyện vốn chứa noise, ta buộc phải tăng độ phức tạp của model, và ngược lại. Vì thế, điều ta cần làm là cân bằng giữa hai điều kiện, đưa model gần với Occam's razor nhất có thể: chọn một model đơn giản vừa phải và giải thích được tập huấn luyện tương đối đúng, nhằm đạt được sai số nhỏ trên tập kiểm tra.
Overfitting Qua phân tích ở phần trên, chắc các bạn cũng hiểu nôm na overfitting là khi ta quá cố gắng tối thiểu hóa objective function L Dtrain (w) nhưng điều đó lại làm cho evaluation function LDtest (w) lớn. Trong phần này, mình sẽ giới thiệu định nghĩa về overfitting mà mình quen thuộc nhất. Nhưng trước hết, ta cần một định nghĩa về evaluation function trên một tập dữ liệu vô hạn: LD (w) = E(x,y)∼D [L (fw (x), y )] = ∑ L (fw (x), y ) D(x, y) (x,y)
D ở đây không phải là một tập dữ liệu mà là một phân bố xác suất lên các cặp dữ liệu (x, y), với D(x, y) là xác suất xuất hiện của cặp (x, y). Khi nói về một tập dữ liệu "vô hạn", ta ám chỉ đến việc liên tục lấy các mẫu (x, y) từ phân bố D. Với các bạn chưa quen thuộc khái niệm này, mình sẽ minh họa bằng ví dụ đơn giản sau: Giả sử ta có một phân bố xác suất về sấp ngửa của một đồng xu như sau: 60% ngửa và 40% sấp. Muốn lấy một mẫu từ phân bố này, ta ngẫu nhiên chọn một số thực trong đoạn $[0, 1)$, tạm gọi là r. Nếu r ≤ 0.6, ta chọn mẫu là ngửa, ngược lại ta chọn mẫu là sấp. Lặp lại quá trình này vô hạn lần, ta được một tập dữ liệu vô hạn gồm các mẫu sấp/ngửa. Ký hiệu Ex∼P [f (x)] được gọi là kỳ vọng (expectation) của hàm f (x) với x được lấy mẫu từ phân bố P . Kỳ vọng đơn giản là phép tính trung bình cộng trên tập vô hạn. Ta thấy là định nghĩa evaluation function trên tập vô hạn thật ra không khác gì mấy so với định nghĩa evaluation function trên tập hữu hạn; ta chỉ thay phép trung bình cộng trên tập hữu hạn thành kỳ vọng. Giảm thiểu LD (w) là mục đích tối thượng của supervised learning. Ta dùng LDtest (w) để ước lượng LD (w) vì trong thực tế ta không thể nào có nguồn dữ liệu vô hạn. Đến đây, ta định nghĩa overfitting là khi:
25
Overfitting
Model quá tập trung vào việc đoán đúng hết tất cả các điểm dữ liệu của training set, nhưng việc đó lại làm giảm khả năng dự đoán của nó trên test set. Nói cách khác, overfitting là khi LDtrain (w) nhỏ nhưng LD (w) − LDtrain (w) lớn.
Chuẩn đoán overfitting Trong định nghĩa trên, thế nào được xem là "lớn" thì tùy thuộc vào từng ứng dụng khác nhau. Hơn nữa, ta cũng không thể nào tính được LD nên cũng không thể dựa vào định nghĩa đó để chuẩn đoán xem model có bị overfitting hay không. Trong thực tế, ta dùng LDtest thay cho LD . Để phát hiện overfitting, ta cần theo dõi learning curve, một biểu đồ thể hiện sự biến động của LDtrain và LDtest trong suốt thời gian huấn luyện. Cứ sau một khoảng thời gian, ta ghi lại giá trị của LDtrain và LDtest và vẽ biểu đồ của chúng theo thời gian, ta được learning curve.
Hình ở trên minh hoạ learning curve khi xuất hiện overfitting. Có vài điểm đáng chú ý sau: 1. Nếu ta áp dụng một phương pháp tối ưu hàm số hiệu quả, LDtrain (đường đỏ) sẽ giảm theo thời gian. 2. Ngược lại, LDtest (đường xanh) không phải lúc nào cũng giảm. Nếu model bị overfitting,
26
Overfitting
đến một lúc nào đó, gía trị này bắt đầu tăng trở lại. 3. Thời điểm mà LDtest bắt đầu có xu hướng tăng được xem thời điểm bắt đầu overfitting. Vì sao? Vì sau đó, việc huấn luyện sẽ làm model dự đoán ngày càng tốt hơn trên training set, nhưng lại cho sai sót ngày càng nhiều trên test set. Cách chuẩn đoán này cũng gợi ý cho ta cách làm đơn giản nhất để giảm thiểu overfitting, đó là dừng huấn luyện ngay tại thời điểm bắt đầu overfitting. Phương pháp này được gọi là early stopping (dừng sớm). Early stopping có tác dụng ngăn không cho khoảng cách giữa L Dtrain và LDtest tăng lên thêm. Để rút ngắn khoảng cách này hơn nữa, ta cần sử dụng regularizer, sẽ được nói đến ở bài sau. Mình muốn kết thúc phần này bằng việc nhấn mạnh lại tầm quan trọng của overfitting: nếu không có overfitting thì machine learning không thể được xem như một ngành nghiên cứu riêng biệt, bởi vì khi đó ta chỉ cần vận dụng hết mọi công cụ tối ưu hàm số của toán học để giảm empirical risk về mức tối đa. Overfitting thể hiện trở ngại khi ta cố gắng bắt máy tính mô phỏng khả năng của con người: làm thế nào mà một người có thể tổng quát được những kiến thức đã học và áp dụng để xử lý tình huống chưa từng gặp, thậm chí là còn sáng tạo ra những thứ chưa hề tồn tại?
27
Regularized Loss Minimization
Regularized Loss Minimization Chúng ta sẽ hoàn tất những hiểu biết về overfitting và đưa ra một thuật toán supervised learning hiệu quả hơn ERM để chống lại overfitting. Nhưng trước khi đó ta cùng ôn lại những gì đã học ở phần trước bằng một số câu hỏi ngắn như sau: Q1 : Overfitting là gì? A1 : Là khi model không có khả năng tổng quát từ những gì đã học được: độ sai sót trên training set nhỏ, trên test set to. Q2 : Tại sao overfitting lại có hại? A2 : Vì dữ liệu lúc nào cũng chứa noise. Noise làm cho model tìm được phức tạp quá mức cần thiết. Q3 : Làm sao để biết được model có bị overfitting hay không? A3 : Theo dõi learning curve. Q4 : Làm sao để không bị overfitting? A4 : Nếu bạn đang nói về chuyện làm sao để LDtrain trùng với LD thì câu trả lời là không thể, trừ phi có vô hạn dữ liệu. Đây không phải là một câu hỏi đúng vì overfitting là một khái niệm tương đối, tùy theo "cảm giác" của bạn. Làm sao để giảm thiểu overfitting mới là câu hỏi đúng!
Nguyên nhân gây ra overfitting Như chúng ta đã biết, noise không phải là nguyên nhân trực tiếp gây ra overfitting. Vậy những yếu tố nào gây ra overfitting? Overfitting là sản phẩm của sự cộng hưởng giữa các yếu tố sau: 1. Áp dụng ERM. Thay vì thực sự tối thiểu hóa LD , một điều không thể, ta chỉ có thể tối thiểu hóa xấp xỉ của đại lượng này trên một tập dữ liệu giới hạn, LDtrain . LDtest cũng là xấp xỉ của đại lượng đó, nhưng lại được tính trên một tập dữ liệu khác. Điều này dẫn đến sự khác biệt giữa đại lượng ta muốn tối thiểu vào lúc train và lúc test.
28
Regularized Loss Minimization
2. Giới hạn về dữ liệu: khi có thêm các cặp observation-label, hiển nhiên ta có thêm thông tin về mối quan hệ giữa chúng. Cụ thể hơn, ta thấy rằng LDtrain sẽ hội tụ về LD khi số lượng phần tử của Dtrain tiến đến vô cùng. Khi hai đại lượng này trùng nhau thì overfitting hoàn toàn biến mất (theo định nghĩa). Vì thế, càng có nhiều dữ liệu huấn luyện thì càng ít bị overfitting. 3. Model quá "mạnh": một model quá mạnh là khi nó có khả năng mô phỏng rất nhiều mối quan hệ phức tạp giữa observation và label (cũng tức là mô phỏng được rất nhiều dạng hàm số). Ví dụ nếu fw là một đa thức bậc một, nó có thể mô phỏng tất cả các đa thức bậc một (có dạng y = fw (x) = w1x + w 2 ). Dù có vô số đa thức bậc một, nhưng mà đây được xem như một model "yếu" bởi vì quan hệ tuyến tính được xem như một quan hệ rất đơn giản. Neural network được xem là những model mạnh bởi vì chúng mô phỏng được những quan hệ phi tuyến tính. Độ mạnh của model còn phụ thuộc vào cấu trúc và số lượng parameter. Vì bản chất machine learning là ước lượng hàm số, sử dụng một tập model mạnh hơn, thậm chí có khả năng mô phỏng tất cả dạng hàm số tưởng chừng như là một ý hay. Nhưng thực tế đây lại là một ý tưởng này rất tồi. Vì sao?
Vì sao dùng model quá mạnh lại không tốt? Giả sử có một cuộc thi trong đó ta yêu cầu mỗi thí sinh phải vẽ được một đường đi qua nhiều nhất các điểm cho trước. Thí sinh tham dự có 2 người: một người là họa sĩ, anh ta rất khéo tay và có thể vẽ tất cả các loại đường cong thẳng; người còn lại là một anh chàng vụng về với cây thước kẻ, anh ta chỉ có thể vẽ đường thẳng. Dĩ nhiên là anh họa sĩ sẽ thắng trong trò chơi này. Nhưng hãy xem xét phản xạ của hai thí sinh trong tình huống sau đây: ta cho đề bài ban đầu là các điểm trên một đường thẳng; sau khi hai người vẽ xong, ta chỉ dịch chuyển một điểm lệch ra khỏi đường thẳng một đoạn nhỏ. Hiển nhiên là ban đầu cả hai người đều vẽ được một đường thẳng đi qua tất cả các điểm. Nhưng sau khi một điểm bị dịch chuyển, anh họa sĩ sẽ vẽ ra một đường hoàn toàn khác với đường thẳng ban đầu để cố đi qua mọi điểm. Ngược lại, anh vụng về thì sẽ vẫn giữ nguyên đáp áp vì đó là đáp án tốt nhất anh có thể vẽ. Điều ta thấy được ở đây đó là anh họa sĩ, vì quá tài hoa, nên anh rất nhạy cảm với những thay đổi nhỏ trong các điểm dữ liệu. Còn anh vụng về, vì năng lực của anh có hạn, nên thường anh sẽ ít bị ảnh hưởng hơn. Nếu như đây không phải là một cuộc thi vẽ qua nhiều điểm mà là một bài toán machine learning, có lẽ anh họa sĩ đã thua rồi. Bởi vì điểm bị dịch chuyển có thể là do tác động của noise để hòng đánh lừa anh. Anh họa sĩ đại diện cho một tập model cực mạnh, có khả năng
29
Regularized Loss Minimization
mô phỏng mọi hàm số. Một tập model mạnh như vậy rất nhạy cảm với noise và dễ dàng bị overfitting.
Sự kết hợp giữa các yếu tố gây overfitting Các yếu tố gây ra overfitting phải phối hợp với nhau thì mới đủ điều kiện cho nó xuất hiện. Ta xem xét hai tình huống thường gặp sau: 1. Có nhiều dữ liệu: ta có thể vô tư dùng ERM, tập model mạnh mà không lo về overfitting. Đây chính là lý do mà thế giới hân hoan khi Big Data xuất hiện. 2. Làm việc với model yếu: các model thường bị một hội chứng chị em ngược lại với overfitting, gọi là underfitting. Đây là khi model quá đơn giản so với quan hệ cần tìm. Lúc này, dù có tăng thêm dữ liệu cũng không giúp cho model chính xác thêm. Điều cần làm đó là tăng sức mạnh (tăng số lượng tham số hoặc thay đổi dạng) của model. Mình cũng xin dành ra vài dòng để nói về hiện tượng "cuồng" deep learning và áp dụng deep learning lên mọi bài toán. Các model của deep learning là các neural network cực mạnh nên cần rất nhiều dữ liệu để không bị overfitting. Đó là lý do mà dù các model deep learning này không mới, thậm chí là những model đầu tiên của machine learning, nhưng phải chờ đến kỷ nguyên Big Data hiện tại chúng mới phát huy sức mạnh. Nếu không am hiểu về overfitting và áp dụng deep learning vô tội vạ lên những tập dữ liệu chỉ có vài trăm cặp dữ liệu thì thường đạt đượt kết quả không cao. Khi gặp những điều kiện dữ liệu eo hẹp như vậy, nên bắt đầu từ những model đơn giản như linear model trước. Trong machine learning có một định lý nổi tiếng gọi là "no free lunch" nói rằng không có một model nào tốt nhất cho tất cả các loại dữ liệu. Vì thế, tùy vào bài toán, vào tính chất và số lượng dữ liệu sẵn có, ta mới xác định được model phù hợp.
Regularized loss minimization Trong bài trước, ta đã biết được một phương pháp để giảm thiểu overfitting, early stopping. Ba yếu tố gây ra overfitting cũng gợi ý cho chúng ta những cách khác để khắc phục vấn đề này. Trong đó, yếu tố thứ hai đưa ra giải pháp đơn giản nhất: tăng kích thước tập huấn luyện. Sau đây, mình sẽ giới thiệu một phương pháp nhằm loại trừ đi yếu tố thứ nhất và thứ ba, được gọi là regularization. Phổ biến nhất, phương pháp này sẽ thêm vào objective function một regularizer nhằm hạn chế sức mạnh của model. Giả sử rằng đã lỡ tay chọn một model quá mạnh. Thì không cần phải thay đổi dạng model, ta vẫn có thể hạn chế sức mạnh của nó đi bằng cách giới hạn parameter space (không gian của tham số) của model. Xét hai tập model A = {fw : w ∈ X} và B = {fw′ : w′ ∈ Y } (ký hiệu
30
Regularized Loss Minimization
S = {s : c} đọc là "tập S gồm các phần tử s sao cho điều kiện c thỏa mãn). X hoặc Y được gọi là không gian tham số của tập model A hoặc B. Giả sử thêm là hai tập model chỉ khác nhau về parameter space thôi. Trong trường hợp này, nếu X ⊂ Y thì rõ ràng tập model B biểu diễn được mọi hàm số tập model A biểu diễn được, tức là B mạnh hơn A. Nếu parameter w là một vector số thực có d chiều, tập hợp các giá trị w có thể nhận, hay còn gọi là parameter space của w, là tập tất cả các vector có d chiều số thực, ký hiệu là Rd . Trong không gian này, mỗi chiều của w đều được tự do bay nhảy trong khoảng (−∞, ∞). Muốn thu nhỏ lại không gian này, ta cần một cơ chế để thu hẹp miền giá trị của mỗi chiều. Để làm được điều đó, ý tưởng ở đây là định nghĩa một đại lượng để khái quát được "độ lớn" của vector w và cố gắng tối thiểu nó. Đại lượng này sẽ được dùng làm regularizer, ký hiệu là R(w) như ta đã biết, là một hàm số phụ thuộc vào w. Objective function của chúng ta được định nghĩa lại như sau: LDtrain (fw ) = LERM Dtrain + λR(fw ) Tối thiểu hóa objective function này được gọi là quy tắc regularized loss minimization (RLM). Chú ý đối với RLM, không nhất thiết là LERM Dtrain phải đạt giá trị tối thiểu để cho objective function trở nên tối thiểu. Nếu một model tối thiểu hóa LERM Dtrain nhưng lại làm cho R đạt giá trị lớn thì vẫn có cơ hội để chọn một model khác, dù có LERM Dtrain lớn hơn nhưng lại cho giá trị của R nhỏ hơn nhiều. Nói cách khác, ta có thể lựa chọn được một model đơn giản, dù nó không dự đoán hoàn hảo tập huấn luyện. RLM đang đưa model đi gần đến Occam's razor hết mức có thể, chấp nhận hy sinh độ chính xác trên tập huấn luyện để giảm độ phức tạp của model. Hằng số λ trong hàm mục tiêu được gọi là rgularization constant, là một hyperparameter của model. Sự xuất hiện của λ trong hàm mục tiêu làm cho vai trò của LERM Dtrain và R trở nên bất đối xứng: nếu ta tăng LERM Dtrain lên 1 đơn vị thì hàm mục tiêu tăng lên 1 đơn vị; trong khi đó nếu tăng R lên 1 đơn vị thì hàm mục tiêu tăng lên thêm λ đơn vị. Tức là 1 đơn vị của LERM Dtrain có giá trị bằng 1/λ đơn vị của R. Thông thường, ta thường đặt λ rất nhỏ, ví dụ λ = 10−6 . 6 Lúc này, 1 đơn vị của LERM Dtrain bằng đến 10 đơn vị của R. Điều này thể hiện rằng ta muốn ưu
tiên vào tối thiểu hóa LERM Dtrain hơn là R.
Các regularizer thường gặp
31
Regularized Loss Minimization
R(w) thường gặp nhất là norm của vector. Có rất nhiều loại norm, mình sẽ giới thiệu hai loại norm phổ biến nhất. 1-norm (L1-norm): R(w) = ∣∣w∣∣1 = ∑di=1 ∣wi ∣ tức là tổng của trị tuyệt đối của các thành phần. 1-norm đặc biệt ở chỗ là, khi đưa vào hàm mục tiêu, nó sẽ thường cho ra model thưa, tức là model có parameter chứa nhiều chiều bằng 0. Model thưa rất có lợi thế trong tính toán và lưu trữ vì ta chỉ cần làm việc trên các chiều khác 0. squared 2-norm (L2-norm): R(w) = ∣∣w∣∣ 22 = ∑ di=1 wi2 cũng còn biết đến với cái tên weight decay, chính là bình phương độ dài của vector w. Sở dĩ ta phải bình phương là để giúp cho việc tính đạo hàm được dễ hơn khi tối ưu hàm mục tiêu. Lưu ý, đây không thực sự là norm, căn bậc hai của nó mới là norm.
32
Tinh chỉnh các hyperparameter
Tinh chỉnh các hyperparameter Khi bình thường hoá tham số xuất hiện trong hàm mục tiêu, vấn đề đặt ra là ta không nhất thiết phải đặt giá trị của hằng số bình thường hoá λ giống nhau cho mọi bài toán. Hơn nữa, ngoài λ, còn có nhiều hyperparameter khác ta cần phải lựa chọn (như bậc của đa thức). Làm sao để chọn được tập giá trị tối ưu cho các hyperparameter với từng bài toán?
Tập phát triển Để tinh chỉnh các hyperparameter, ta có thể là như sau: chọn một tập giá trị của các hyperparameter, huấn luyện để tìm ra một model rồi đo độ tốt của nó trên tập kiểm tra. Ta tiếp tục lặp lại quá trình này với nhiều tập giá trị hyperparameter khác nhau. Sau nhiều lần thử chọn như vậy, ta chọn tập giá trị nào cho độ sai sót thấp nhất trên tập kiểm tra. Cẩn thận! Khi dùng tập kiểm tra để xác định hyperparameter, ta đã vi phạm nguyên tắc train-test độc lập đã nêu ra ở đầu chương. Nói một cách đơn giản là ta đã sử dụng tập kiểm tra để chọn model. Để khắc phục điều này, ta cần đến một "tập kiểm tra thứ hai", chỉ chuyên dùng để tinh chỉnh các hyperparameter và không dùng để đưa thông báo cuối cùng về độ tốt của model. Ta gọi đấy là tập phát triển (development set). Trong bài viết trước, vì chưa nhắc giới thiệu khái niệm tập phát triển nên định nghĩa early stopping của mình cũng đã vi phạm quy tắc train-test độc lập. Cụ thể, vì thời điểm dừng huấn luyện phụ thuộc vào độ sai sót trên tập kiểm tra, mà model cuối cùng nhận được lại phụ thuộc vào thời điểm dừng huấn luyện, suy ra tập kiểm tra đã gián tiếp chỉ định model cuối cùng. Sau khi biết đến tập phát triển, để áp dụng early stopping một cách đúng đắn, thì ta chỉ việc thay learning curve trên tập kiểm tra bằng learning curve trên tập phát triển.
33
Tinh chỉnh các hyperparameter
Trong nghiên cứu, tỉ lệ train:dev:test thường được dùng đó là 7:1:2. Tức là nếu có 100 điểm dữ liệu, thì lấy 70 điểm để huấn luyện, 10 điểm để phát triển, và 20 điểm để kiểm tra.
34
Thuật toán supervised learning tổng quát
Thuật toán supervised learning tổng quát 1. Sử dụng tập phát triển để tinh chỉnh hyperameter của model: với mỗi tập giá trị của các hyperparameter (bao gồm cả λ): a. Huấn luyện: tìm w để tối thiểu hóa L Dtrain (w) + λR(w) trên tập huấn luyện. Trong quá trình huấn luyện, theo dõi learning curve để áp dụng early stopping. b. Đánh giá trên tập phát triển: thông báo độ tốt trên tập phát triển là LDdev (w). 2. Đánh giá trên tập kiểm tra: với model w ∗ cho kết quả tốt nhất ở bước 1, thông báo độ tốt cuối cùng trên tập kiểm tra là LDtest (w ∗ ).
35
Hàm mất mát
Hàm mất mát Ở các phần trước, ta đã bỏ rất nhiều công sức để xây dựng được một công thức tổng quát để tìm ra một model từ một tập dữ liệu. Đó hàm mục tiêu của regularized loss minimization (RLM): w = arg min LDtrain (w ′ ) + λR(w′ ) ′ w
Nhưng suy đi nghĩ lại thì công thức này khá là "vô dụng" vì nó tổng quát nhưng không cụ thể. Ta chẳng thể dùng nó để luyện ra model nào bởi ta không biết L có dạng thế nào để mà tìm giá trị cực tiểu. Vậy tại sao chúng ta lại bỏ thời gian ra "vô ích" như vậy?
Tại sao chúng ta lại cần một công thức tổng quát? Câu trả lời rất đơn giản, tiết kiệm năng lượng. Không riêng gì machine learning, trong mỗi ngành nghề đều tồn tại những công việc cần phải lặp đi lặp lại nhiều lần. Trong xây nhà thì đó là việc đổ móng, xây tường, lợp mái. Trong võ thuật thì đó là việc đứng tấn, đấm và đá. Những việc đó vô cùng nhàm chán và ta muốn dành thật ít năng lượng và suy nghĩ khi làm chúng! Ta thích làm những việc vui hơn, tự do hơn, sáng tạo hơn, như thiết kế hay trang trí một căn nhà, hoặc ngẫm ra một thế võ độc tôn. Nhưng hãy tưởng tượng rằng nếu bức tường ta xây cứ ba ngày lại đổ một lần. Cứ xây đi xây lại như thế thì cả đời ta cũng không thể có cơ hội để trang trí một căn nhà. Tương tự, nếu chân đứng còn chưa vững thì nói gì đến việc sáng chế chiêu thức. Thế nên, muốn làm việc cao cấp vui vẻ thì trước hết phải làm những việc cơ bản nhàm chán thành thục trước đã. Machine learning cũng như vậy. Ta bỏ nhiều công sức ra để xây dựng nên RLM là bởi nguyên tắc này được sử dụng trong hầu hết mọi model. Nếu bạn nắm kỹ RLM, thì tốc độ học của bạn sẽ được đẩy lên rất nhiều. Vì sao? Hãy nhìn vào công thức RLM, mảnh ghép còn thiếu cuối cùng chỉ là dạng của L. Cho nên, mỗi lần gặp một dạng model mới và nhận ra được bóng dáng của RLM trong đó thì gần như là "game over". Công việc của bạn lúc đó chỉ là nhìn ra dạng của L với từng model khác nhau. Thậm chí tạo ra một model mới cũng không phải là việc quá khó khăn. Bạn đã có RLM làm nền, công việc của bạn chỉ là ngồi sáng tạo ra các biến thể của L để lắp vào. Nhẹ nhàng nhưng đầy trí tuệ, vui đấy chứ? Bây giờ ta sẽ đi nghiên cứu một số biến thể thông dụng nhất nhé!
Hàm mất mát
36
Hàm mất mát
Đầu tiên chúng ta cần nhớ lại xem hàm mất mát là gì? Hàm mất mát (loss function), kí hiệu là L, là thành phần cốt lõi của hàm rủi ro L. Hàm rủi ro thực chất là trung bình cộng của hàm mất mát tính trên một tập dữ liệu. Cụ thể, trong công thức: LD (fw ) =
1 ∑ L (fw (x), y ) ∣D∣ (x,y)∈D
Thì hàm L chính là hàm mất mát. Hàm mất mát trả về một số thực không âm thể hiện sự chênh lệch giữa hai đại lượng: y^, label được dự đoán và y, label đúng. Hàm mất mát giống như một hình thức để bắt model đóng phạt mỗi lần nó dự đoán sai, và số mức phạt này tỉ lệ thuận với độ trầm trọng của sai sót. Trong mọi bài toán supervised learning, mục tiêu của ta luôn bao gồm giảm thiểu tổng mức phạt phải đóng. Trong trường hợp lý tưởng, tức là khi y^ = y, hàm mất mát sẽ trả về giá trị cực tiểu, bằng 0.
Hai dạng bài supervised learning cơ bản Ta phân chia các dạng bài supervised learning dựa vào tính chất của y. Ta xét bài các bài toán mà y là một số thực. Khi y có thể tự do dao động trong khoảng (−∞, ∞), ta được một bài toán regression. Ví dụ như ta cần tiên đoán giá cổ phiếu, giá xăng, giá vàng vào ngày mai. Khi y là một đại lượng rời rạc chỉ nhận giá trị trong một tập label hữu hạn rời rạc nào đó, ta được bài toán classification. Ví dụ, khi ta cần nhận dạng tên một người từ một tấm ảnh chân dung, cho dù có hàng tỉ cái tên trên thế giới thì tập hợp này vẫn là rời rạc hữu hạn. Vì thế, bài toán này vẫn được quy vào dạng classification. Để đơn giản các công thức, bài viết này chỉ đề cập đến binary classification, tức là khi tập các label chỉ có hai phần tử ("có" hoặc "không", "đúng" hoặc "sai", "positive" hoặc "negative", ...). Để tiện cho việc tính toán, trong binary classification, ta chuyển đổi tập label thành tập {−1, +1} (ví dụ như -1 nghĩa là "không", +1 nghĩa là "có"). Lưu ý rằng ta đang nói đến label thật y chứ không phải label dự đoán y^ = fw (x). Thông thường, đối với cả regression và binary classification, ta đều thiết kế để model fw (x) trả về một số thực y^ ∈ (−∞, ∞). Với regression, y^ dĩ nhiên mang ý nghĩa là giá trị được dự đoán. Với binary classification, y^ là điểm số thể hiện model ưa thích label nào hơn trong hai label. Nếu y^ < 0 tức là model thích phương án -1 hơn và ngược lại, nếu y^ ≥ 0 tức là model nghiêng về phương án +1 hơn. Giá trị tuyệt đối của y^ thể hiện sự tự tin (sự chắc chắn) của model đối với lựa chọn của mình.
37
Hàm mất mát
Cách xây dựng hàm mất mát Vì hàm mất mát đo đạc chênh lệch giữa y và y^, nên không lạ gì nếu ta nghĩ ngay đến việc lấy hiệu giữa chúng: L(y^, y) = y^ − y Tuy nhiên hàm này lại không thỏa mãn tính chất không âm của một hàm mất mát. Ta có thể sửa nó lại một chút để thỏa mãn tính chất này. Ví dụ như lấy giá trị tuyệt đối của hiệu: L( y^, y) = ∣ y^ − y∣ Hàm mất mát này không âm nhưng lại không thuận tiện trong việc cực tiểu hóa, bởi vì đạo hàm của nó không liên tục (nhớ là đạo hàm của f (x) = ∣x∣ bị đứt quãng tại x = 0) và thường các phương pháp cực tiểu hóa hàm số thông dụng đòi hỏi phải tính được đạo hàm. Một cách khác đó là lấy bình phương của hiệu: L( y^, y) = Khi tính đạo hàm theo y^, ta được ∇L =
1 2
1 (y^ − y)2 2
× 2 × (y^ − y) = y^ − y. Các bạn có thể thấy rằng
hằng số 12 được thêm vào chỉ để cho công thức đạo hàm được đẹp hơn, không có hằng số phụ. Hàm mất mát này được gọi là square loss. Square loss có thể được sử dụng cho cả regression và classification, nhưng thực tế thì nó thường được dùng cho regression hơn. Đối với binary classification, ta có một cách tiếp cận khác để xây dựng hàm mất mát. Nhắc lại là đối với dạng bài này, thì nếu model trả về y^ < 0 tức là thích đáp án -1 hơn, trả về y^ ≥ 0 tức là thích đáp án +1 hơn. Một cách rất tự nhiên, ta thấy rằng hàm mất mát của binary classification cần phải đạt được một số tiêu chí sau: 1. Ta cần phải phạt model nhiều hơn khi dự đoán sai hơn là khi dự đoán đúng. Vì thế, tiêu chí đầu tiên của ta là khi model dự đoán sai (y khác dấu với y^), hàm mất mát phải trả về giá trị lớn hơn so với khi model dự đoán đúng (y cùng dấu với y^). 2. Nếu y^ cùng đấu với y thì ta nên phạt model thế nào? Cụ thể là nếu có hai đáp án y^1 và y^2 đều cùng dấu với y thì ta nên phạt đáp án nào nhiều hơn? Như đã nói, giá trị tuyệt đối ∣ y^∣ thể hiện "độ tự tin" của model đối với một phương án. Giá trị này càng lớn thì
38
Hàm mất mát
model càng "thích" một phương án. Trong trường hợp y^ cùng dấu với y, phương án được thích là phương án đúng, do đó, model càng thích thì ta phải càng khuyến khích và phạt ít đi. Cũng với lập luận như vậy, nếu y^ khác dấu với y, vì phương án được thích là phương án sai nên model càng thích thì ta phải càng phạt nặng để model không tái phạm nữa. Một cách tổng quát, đối với binary classification thì các hàm mất mát thường có dạng như sau: L(y^, y) = f (y ⋅ y^) trong đó f là một hàm không âm và không tăng. Q1: Giải thích tại sao hàm g( y^, y) = −y ⋅ y^ lại thỏa mãn hai tiêu chí đã nêu ở trên. Q2: Giải thích tại sao hàm g( y^, y) = −y ⋅ y^ lại không thỏa điều kiện của một hàm mất mát (lưu ý tính chất của hàm mất mát và f).
Các hàm mất mát cơ bản dành cho binary classification Hàm 0-1 loss: Hàm này rất đơn giản: trả về 1 nếu y ⋅ y^ < 0, trả về 0 nếu ngược lại. Việc này tương đương với việc đếm số câu trả lời sai của model. 0-1 loss thường chỉ được dùng để tính error rate của model, chứ không dùng để huấn luyện model vì đạo hàm của nó không xác định ở điểm 0.
Hàm perceptron loss: Lperceptron (y^, y) = max(0, −y ⋅ y^) Ta thấy rằng hàm perceptron loss là một cách đơn giản nhất để sửa sao cho hàm g ở câu hỏi trên trở thành không âm (thỏa điều kiện của một hàm mát). Đối với perceptron loss, khi model đoán đúng ( y^ cùng dấu với y), −y ⋅ y^ sẽ mang dấu âm. Tức là, khi đó Lperceptron (y^, y) = max(0, negative) = 0. Nói cách khác, perceptron loss không phân biệt gì giữa các dự đoán đúng. Chúng đều không bị phạt. Đối với các dự đoán sai, thì perceptron vẫn tuân thủ theo nguyên tắc là model càng thích thì phạt càng nặng. Perceptron loss là hàm mất mát của perceptron model.
39
Hàm mất mát
Hàm hinge loss Lhinge (y^, y) = max(0, 1 − y ⋅ y^) Hinge loss chẳng qua chỉ là một biến thể từ perceptron loss. Ta chỉ thêm 1 đơn vị vào đại lượng −y ⋅ y^. Số 1 này có một ý nghĩa rất đặt biệt, được gọi là margin (lề). Các bạn sẽ thấy là hinge loss hoạt động gần như tương tự như perceptron loss chỉ trừ các dự đoán mà y ⋅ y^ nằm trong khoảng [0, 1]. Chú ý là các dự đoán mà y ⋅ y^ rơi vào khoảng này thì đều đúng. Hinge loss phân biệt các dự đoán đúng này theo nguyên tắc là model càng thích thì càng phạt nhẹ. Còn khi y ⋅ y^ vượt quá 1 thì hinge loss lại không phân biệt nữa. Vì sao lại làm như vậy? Những dự đoán ở trong margin [0, 1] là những dự đoán gần ranh giới, là những lúc mà model lưỡng lự. Ý tưởng của hinge loss là muốn model phải thật rõ ràng và tự tin với những quyết định của mình. Do khi vẫn còn trong margin thì model vẫn bị phạt, nên model sẽ được khuyến khích để đưa ra những quyết định đúng và có tính chắc chắn cao, nằm ngoài margin để không bị phạt nữa. Đây chính là ý tưởng của support vector machines model.
Hàm logistic loss (hay log loss): Llog (y^, y) = log2 (1 + exp(−y ⋅ y^)) Trong công thức trên, hàm exp(⋅) là hàm lũy thừa theo cơ số tự nhiên e. Thoạt nhìn log loss trông có vẻ khá phức tạp, và trông không có vẻ gì là họ hàng của hai hàm còn lại. Tuy nhiên, khi nhìn vào đồ thị của hàm số này, ta lại thấy rất dễ hiểu bởi vì nó thỏa tất cả mọi tính chất của hàm mất mát mà ta đã nói ở phần trước. Đây là một hàm liên tục, không âm và không tăng. Không những không tăng, log loss còn luôn giảm, có nghĩa là nó luôn phân biệt giữa các dự đoán có độ tự tin khác nhau bất kể đúng hay sai. Đây là điểm khác biệt chính của log loss với perceptron loss và hinge loss. Một điểm khác biệt nữa là hàm này có một độ cong nhất định, tức là nó không giảm với tốc độ như nhau ở mọi điểm. Trong khi đó, thì một phần của perceptron loss hoặc hinge loss chỉ là một đường tuyến tính, với tốc độ giảm là một hằng số. Log loss chính là nền tảng của logistic regression model. Vậy có phải log loss là một hàm mất mát hoàn hảo? Chưa hẳn, điều này phụ thuộc vào bài toán. Tuy log loss đưa ra nhiều tiêu chí hấp dẫn, nhưng vấn đề model liệu có thể thỏa mãn những tiêu chí được những tiêu chí đó không. Hay chúng ta đang đòi quá nhiều ở model? Việc model phân biệt giữa một đáp đúng với độ chắn chắn thấp và một đáp án đúng với độ chắc chắn cao mang lại lợi ích gì cho ta? Có đôi khi, ta không quan tâm, đáp án nào cũng
40
Hàm mất mát
đều đúng. Có đôi khi, ta lại cần model phải rạch ròi. Có đôi khi, ta chỉ muốn tránh những đáp án có độ chắc chắn thấp; Lúc đó, hinge loss lại là sự lựa chọn tốt hơn. Tất cả đều tùy vào dữ liệu và ứng dụng. Cuối cùng, để kết thúc bài viết, xin tặng các bạn một tấm hình minh họa các hàm mất mát từ trang scikit-learn:
41