Chương 11

- 70 mins

Chương 11: Phương pháp luận thực nghiệm

Để áp dụng thành công các kỹ thuật học sâu, người thực hiện cần nhiều kỹ năng hơn là chỉ đơn thuần hiểu về thuật toán và nguyên tắc hoạt động của chúng. Đối với học máy, một người thực hành giỏi cần biết cách lựa chọn thuật toán phù hợp với mỗi ứng dụng cụ thể, đồng thời biết cách giám sát và điều chỉnh dựa trên kết quả thực nghiệm thu được để cải thiện hệ thống học máy. Trong quá trình phát triển hệ thống học máy, người thực hành cần quyết định khi nào cần: thu thập thêm dữ liệu, tăng hay giảm dung lượng mô hình, thêm hay bớt các đặc trưng kiểm soát, cải thiện thuật toán tối ưu mô hình, cải thiện thuật toán suy luận xấp xỉ mô hình, hay sửa lỗi khi triển khai cài đặt phần mềm cho mô hình. Tất cả những thao tác này ít nhất cũng cần tốn thời gian để thử, vì vậy việc xác định đúng hướng triển khai thay vì suy đoán một cách mù mờ là rất quan trọng.

Phần lớn nội dung cuốn sách này được dành để nói về các mô hình học máy, các thuật toán huấn luyện, và các hàm mục tiêu khác nhau. Điều này có thể khiến cho bạn tưởng rằng yếu tố quan trọng nhất để trở thành một chuyên gia học máy là biết thật nhiều kỹ thuật học máy và giỏi toán. Trong thực tế, người ta thường có thể đạt kết quả tốt hơn nhiều khi áp dụng một thuật toán thông thường một cách đúng đắn, thay vì sử dụng một thuật toán phức tạp mà không hiểu rõ về nó. Áp dụng thuật toán một cách đúng đắn thường chỉ yêu cầu ta làm chủ một số phương pháp khá đơn giản. Nhiều lời khuyên trong chương này được phỏng theo nghiên cứu của Andrew Ng (2015).

Chúng tôi đề xuất quy trình thiết kế trong thực tế như sau:

Để minh họa, ta sử dụng hệ thống phiên mã địa chỉ Street View [Goodfellow et al., 2014d]. Mục đích của ứng dụng này là thêm các toà nhà vào Google Maps. Những ô tô phục vụ chương trình Street View sẽ chụp ảnh các toà nhà và ghi lại tọa độ GPS được ứng với mỗi bức ảnh. Một mạng tích chập được sử dụng để nhận diện số nhà trong mỗi ảnh, cho phép cơ sở dữ liệu của Google Maps thêm địa chỉ đó vào đúng vị trí trên bản đồ. Câu chuyện về quá trình phát triển ứng dụng thương mại này cho ta một ví dụ về việc làm thế nào để tuân thủ phương pháp thiết kế mà chúng tôi vừa đưa ra.

Bây giờ chúng tôi sẽ mô tả từng bước của quá trình này.

11.1 Các thang đo hiệu suất

Xác định các mục tiêu, theo các thang đo sai số mà bạn sẽ sử dụng, là bước cần thiết đầu tiên, bởi thang đo sai số sẽ là kim chỉ nam cho tất cả các thao tác trong tương lai. Bạn cũng nên định hình một mức hiệu suất mà bạn mong muốn đạt được.

Hãy luôn nhớ rằng đối với phần lớn các ứng dụng, việc đạt được giá trị sai số tuyệt đối bằng $0$ là bất khả thi. Sai số Bayes là một giá trị xác định tỷ lệ sai số nhỏ nhất mà bạn có thể kỳ vọng đạt được, ngay cả khi bạn có lượng dữ liệu huấn luyện vô hạn và có thể khôi phục phân phối xác suất thực tế của dữ liệu. Điều này là do các đặc trưng đầu vào của bạn có thể không mang đầy đủ thông tin về biến đầu ra, hoặc bản chất hệ thống vốn mang tính ngẫu nhiên. Bạn cũng sẽ chỉ có một lượng dữ liệu huấn luyện hữu hạn.

Lượng dữ liệu huấn luyện có thể bị giới hạn bởi nhiều lý do. Khi mục đích của bạn là xây dựng sản phẩm hoặc dịch vụ tốt nhất có thể trong thực tế, bạn có thể thu thập nhiều dữ liệu hơn, nhưng cần phải xác định được giá trị sai số giảm đi khi có thêm dữ liệu và cân đối nó với chi phí thu thập dữ liệu. Việc thu thập dữ liệu có thể cần thời gian, tiền bạc, và sức chịu đựng của con người (ví dụ như khi quá trình thu thập dữ liệu bao gồm đến việc thực hiện các xét nghiệm mang tính xâm lấn trong y khoa). Khi mục đích của bạn là xác định xem thuật toán nào sẽ thực hiện tốt hơn trên một bộ dữ liệu tiêu chuẩn cố định, đặc tả của tiêu chuẩn này thường xác định rõ tập dữ liệu huấn luyện và bạn không được phép thu thập thêm dữ liệu.

Làm thế nào để ta xác định được mức hiệu suất kỳ vọng hợp lý? Thông thường, trong giới học thuật, chúng ta có một ước lượng về tỷ lệ sai số có thể đạt được dựa trên những kết quả đã được công bố trước đó. Đối với các ứng dụng thực tế, ta cần đưa ra một ước lượng nào đó về tỷ lệ sai số cần thiết để một ứng dụng được coi là an toàn, hiệu quả về mặt chi phí, hay hấp dẫn với khách hàng. Khi đã xác định được tỷ lệ sai số mong muốn thực tế, những quyết định thiết kế của bạn sẽ đi theo hướng để có thể đạt được tỷ lệ này.

Một điều quan trọng khác cần cân nhắc bên cạnh giá trị hiệu suất cần đạt được là việc lựa chọn sử dụng thang đo nào. Một số thang đo hiệu suất khác nhau có thể được dùng để đo lường hiệu quả của một ứng dụng hoàn chỉnh chứa các thành phần học máy. Những thang đo hiệu suất này thường khác với hàm chi phí được sử dụng để huấn luyện mô hình. Như đã mô tả ở phần 5.1.2, người ta thường đo lường độ chính xác, hay nói cách khác, chính là tỷ lệ sai số của một hệ thống.

Tuy nhiên, có nhiều ứng dụng yêu cầu những thang đo phức tạp hơn để đánh giá hiệu suất.

Đôi khi, mức độ thiệt hại khi gây ra một loại lỗi nào đó sẽ cao hơn nhiều so với khi gây ra các loại lỗi khác. Ví dụ, một hệ thống phát hiện thư rác có thể gặp phải hai loại lỗi: phân loại sai một thư hợp lệ thành thư rác, và cho phép một thư rác xuất hiện trong hộp thư hợp lệ. Có thể thấy việc loại bỏ một thư hợp lệ là điều tồi tệ hơn nhiều so với chấp nhận một tin nhắn đáng ngờ. Vì vậy, thay vì đánh giá tỷ lệ sai số của một bộ phân loại thư rác, ta mong muốn có thể đánh giá một dạng chi phí tổng hợp nào đó, mà chi phí của việc chặn những tin nhắn hợp lệ cao hơn chi phí của việc cho phép những tin rác xuất hiện.

Đôi khi ta cần huấn luyện một bộ phân loại nhị phân, dùng để phát hiện một số sự kiện hiếm hoi. Ví dụ, ta có thể thiết kế một bài kiểm tra y khoa cho một bệnh dịch hiếm. Giả sử rằng trung bình chỉ có một người mắc bệnh này trên mỗi một triệu người. Chúng ta có thể dễ dàng đạt được tỷ lệ phát hiện chính xác $99.9999\%$ bằng cách lập trình cho bộ phân loại luôn báo cáo kết quả là âm tính. Rõ ràng, độ chính xác là một thang đo tồi để đánh giá hiệu quả của một hệ thống như thế này. Một cách để giải quyết vấn đề này là đánh giá độ chính xác (precision) và độ nhạy (recall). Trong đó, độ chính xác là tỷ lệ những phát hiện bởi mô hình mà đúng, độ nhạy là tỷ lệ mà những sự kiện đúng đã được phát hiện. Một bôj phát hiện luôn trả về kết quả âm tính đối với căn bệnh hiếm sẽ đạt được độ chính xác hoàn hảo, nhưng có độ nhạy bằng $0$. Ngược lại, nếu nó chỉ ra tất cả mọi người đều bị bệnh thì sẽ đạt được độ nhạy hoàn hảo, nhưng độ chính xác lại bằng phần trăm số người bị bệnh ($0.0001\%$ trong ví dụ này). Khi sử dụng độ chính xác và độ nhạy, người ta thường biểu diễn một đường cong PR (precision-recall curve), với độ chính xác ứng với trục $y$ và độ nhạy ứng với trục $x$ của hệ trục toạ độ. Bộ phân loại cho ra điểm số cao hơn nếu sự kiện được phát hiện là có xảy ra. Ví dụ, một mạng lan truyền thuận được thiết kế để phát hiện một loại bệnh, với đầu ra $\hat{y} = P(y = 1 | \boldsymbol{x})$ ước lượng xác suất một người với bệnh án được mô tả bằng các đặc trưng $\boldsymbol{x}$ là có bệnh. Chúng ta sẽ báo cáo kết quả dương tính khi điểm số này vượt qua một ngưỡng nào đó. Bằng cách thay đổi ngưỡng cho trước, ta có thể đánh đổi giữa độ chính xác và độ nhạy. Trong nhiều trường hợp, ta hy vọng có thể tổng kết hiệu quả của bộ phân loại bằng một con số cụ thể, thay vì là một đường cong. Để được vậy, ta chuyển độ chính xác $p$ và độ nhạy $r$ thành một điểm số F (F-score) được tính theo công thức:

Ngoài ra, ta cũng có thể xem xét tổng diện tích nằm dưới đường cong PR để đánh giá.

Trong một số ứng dụng, hệ thống học máy còn có thể từ chối đưa ra quyết định. Điều này hữu ích khi thuật toán học máy có khả năng ước lượng độ tự tin của nó khi đưa ra quyết định, đặc biệt là trong những trường hợp mà một quyết định sai có thể gây ra tổn thất lớn và việc ra quyết định có thể được con người tiếp nhận. Hệ thống phiên mã địa chỉ Street View là một ví dụ như vậy. Tác vụ cần thực hiện là phiên mã số nhà từ một hình ảnh để liên kết vị trí thực tế bên ngoài với địa chỉ trên trên bản đồ. Bởi giá trị của bản đồ sẽ giảm đi đáng kể nếu nó không chính xác, nên việc chỉ thêm địa chỉ mới vào hệ thống khi nó khớp với thực tế là rất quan trọng. Nếu hệ thống học máy nghĩ rằng nó không làm được điều đó chính xác như con người thì tốt nhất là để con người làm. Tất nhiên, hệ thống học máy chỉ hữu dụng nếu nó có thể làm giảm đi đáng kể lượng hình ảnh mà con người phải trực tiếp xử lý. Một thang đo hiệu suất tự nhiên được sử dụng trong trường hợp này là độ phủ (coverage). Độ phủ là tỷ lệ các mẫu mà hệ thống học máy có khả năng đưa ra kết quả phân loại. Ta có thể cân nhắc đánh đổi giữa độ phủ và độ chính xác. Một hệ thống có thể đạt $100\%$ độ chính xác bằng cách không xử lý bất cứ ví dụ nào, nhưng điều này đồng nghĩa với việc giảm độ phủ xuống $0\%$. Đối với trường hợp Street View, mục tiêu của dự án là đạt tới độ chính xác ngang với trình độ con người khi duy trì độ phủ ở mức $95\%$. Hiệu suất của con người trong tác vụ này đạt độ chính xác $98\%$.

Ta còn có thể sử dụng nhiều thang đó khác. Ví dụ: đo tỷ lệ nhấp chuột, thu thập khảo sát về mức độ hài lòng của người dùng, v.v. Nhiều ứng dụng chuyên biệt còn có các tiêu chuẩn đặc thù riêng.

Điều quan trọng là xác định thang đo hiệu suất nào cần cải thiện trước tiên, sau đó tập trung vào cải thiện nó. Nếu không xác định mục tiêu rõ ràng, thật khó để nói rằng liệu những thay đổi của hệ thống học máy có tiến bộ hay không.

11.2 Các mô hình cơ sở mặc định

Sau khi lựa chọn thang đo hiệu suất và mục tiêu, bước tiếp theo trong bất kỳ ứng dụng thực tế nào là thiết lập một hệ thống đầu-cuối hợp lý càng sớm càng tốt. Trong mục này, chúng tôi đưa ra các khuyến nghị về việc nên dùng thuật toán nào để làm mô hình cơ sở đầu tiên trong các trường hợp khác nhau. Hãy nhớ rằng các nghiên cứu về học sâu tiến triển rất nhanh, vậy nên một số thuật toán tốt hơn có thể xuất hiện ngay trong lúc chúng tôi viết cuốn sách này.

Tùy thuộc vào độ phức tạp của vấn đề, bạn thậm chí có thể bắt đầu mà không cần sử dụng học sâu. Nếu vấn đề của bạn có thể được giải quyết chỉ bằng cách chọn một vài trọng số tuyến tính hợp lý thì bạn có thể bắt đầu với một mô hình thống kê đơn giản như hồi quy logit.

Nếu bạn thấy vấn đề của mình thuộc nhóm “AI-complete” như nhận dạng đối tượng, nhận dạng giọng nói, dịch máy, v.v. thì nhiều khả năng mọi việc sẽ tiến triển tốt nếu bạn bắt đầu với một mô hình học sâu phù hợp.

Trước tiên, ta lựa chọn dạng mô hình tổng quát dựa trên cấu trúc của dữ liệu. Nếu bạn muốn thực hiện học có giám sát với đầu vào là các vector kích thước cố định, hãy dùng mạng lan truyền thuận với các tầng kết nối đầy đủ. Nếu như đầu vào có cấu trúc topo biết trước (chẳng hạn, đầu vào là hình ảnh), hãy dùng mạng tích chập. Trong những trường hợp này, bạn nên bắt đầu bằng việc sử dụng một số loại đơn vị tuyến tính từng đoạn như ReLUs hoặc các biến thể của chúng như Leaky ReLU, PreLU hoặc maxout. Còn nếu đầu vào hoặc đầu ra là một chuỗi, hãy sử dụng một mạng truy hồi có cổng (LSTM hoặc GRU).

Một lựa chọn hợp lý cho thuật toán tối ưu là SGD có động lượng với tốc độ học suy giảm (các chiến lược suy giảm tốc độ học phổ biến, có thể vận hành tốt hơn hoặc tệ hơn tùy thuộc vào các bài toán khác nhau, bao gồm: suy giảm tuyến tính cho đến khi đạt được tốc độ học cực tiểu định trước, giảm tỷ lệ theo cấp số nhân hoặc giảm tỷ lệ học theo hệ số từ $2$ đến $10$ khi sai số trên tập xác thực tiến đến vùng bão hòa). Một lựa chọn thay thế hợp lý khác là Adam. Chuẩn hóa theo lô (batch normalization) có thể mang lại hiệu quả đáng kể cho hiệu suất tối ưu hóa, đặc biệt là đối với các mạng tích chập và mạng neuron với hàm kích hoạt phi tuyến chữ S. Mặc dù ta có thể bỏ qua việc chuẩn hóa theo lô trong mô hình cơ sở đầu tiên, nhưng ta nên sử dụng chiến lược này ngay khi phát hiện ra quá trình tối ưu hóa có vấn đề.

Nếu tập huấn luyện của bạn không chứa mười triệu mẫu hoặc nhiều hơn, bạn nên thực hiện một số dạng kiểm soát đơn giản ngay từ đầu. Kết thúc sớm nên được sử dụng gần như mọi lúc. Tắt ngẫu nhiên (dropout) là một bộ kiểm soát tuyệt vời, dễ triển khai và tương thích với nhiều mô hình và thuật toán huấn luyện. Chuẩn hoá theo lô đôi khi cũng làm giảm sai số tổng quát hóa và cho phép bỏ qua tắt ngẫu nhiên,do nhiễu xuất hiện trong các ước lượng thống kê sử dụng để chuẩn hoá mỗi biến số.

Nếu bài toán của bạn giống với một bài toán khác đã được nghiên cứu kỹ, có lẽ bạn nên sao chép mô hình và thuật toán mà ta đã biết là thực hiện tốt nhất trên tác vụ đã được nghiên cứu đó. Thậm chí bạn có thể sao chép một mô hình đã được huấn luyện trước cho tác vụ đó. Ví dụ, việc sử dụng các đặc trưng từ một mạng tích chập được huấn luyện trên tập ImageNet để giải quyết các bài toán thị giác máy tính khác là rất thông dụng [Girshick el at., 2015].

Một câu hỏi thường gặp là chúng ta có nên bắt đầu bằng cách sử dụng mô hình học không giám sát, được mô tả trong phần III. Điều này tùy thuộc vào lĩnh vực ta cần giải quyết. Một số lĩnh vực, như xử lý ngôn ngữ tự nhiên, đã hưởng lợi rất nhiều từ các kỹ thuật học không giám sát, chẳng hạn như phép nhúng từ (word embedding) không giám sát. Trong các lĩnh vực khác, như thị giác máy tính, các kỹ thuật học không giám sát hiện tại chưa mang lại lợi ích, ngoại trừ các mô hình bán giám sát, khi số lượng các mẫu đã được gán nhãn là rất nhỏ [Kingma el at., 2014; Rasmus el at., 2015]. Nếu ứng dụng của bạn thuộc lĩnh vực mà việc học không giám sát đã được chứng minh là quan trọng, bạn nên sử dụng nó trong mô hình cơ sở đầu tiên. Nếu không, hãy chỉ sử dụng học không giám sát trong lần thử nghiệm đầu tiên nếu tác vụ bạn muốn giải quyết thuộc dạng không giám sát. Bạn luôn luôn có thể thử bổ sung các mô hình học không giám sát vào sau nếu thấy rằng mô hình cơ sở ban đầu quá khớp.

11.3 Cân nhắc việc thu thập thêm dữ liệu.

Sau khi hệ thống đầu-cuối đầu tiên được thiết lập, đã đến lúc đánh giá hiệu suất của thuật toán và xác định cách cải thiện nó. Nhiều người mới tiếp cận học máy thường nỗ lực cải thiện kết quả bằng cách thử nhiều thuật toán khác nhau. Tuy nhiên, thu thập thêm dữ liệu thường mang lại kết quả tốt hơn so với cải thiện thuật toán.

Nhưng làm thế nào để quyết định khi nào nên thu thập thêm dữ liệu? Đầu tiên, ta cần xác định xem hiệu suất trên tập huấn luyện có là chấp nhận được hay không. Hiệu suất trên tập huấn luyện thấp có nghĩa là thuật toán học tập đã không sử dụng huấn luyện có sẵn, vì vậy không có lý do gì để thu thập thêm dữ liệu. Thay vào đó, hãy thử tăng kích thước của mô hình bằng cách thêm vào nhiều tầng hơn hoặc thêm vào mỗi tầng nhiều đơn vị hơn. Đồng thời thử cải thiện thuật toán học, chẳng hạn, bằng cách điều chỉnh siêu tham số như tỷ lệ học. Nếu các mô hình lớn và các thuật toán tối ưu đã được tinh chỉnh một cách cẩn thận mà vẫn không mang lại kết quả tốt, thì vấn đề có thể là do chất lượng của tập dữ liệu huấn luyện. Dữ liệu có thể có quá nhiều nhiễu hoặc không chứa các đầu vào cần thiết cho việc dự đoán kết quả đầu ra mong muốn. Điều này gợi ý rằng ta bắt đầu lại từ đầu, thu thập dữ liệu ít nhiễu hơn, hoặc thu thập một tập đặc trưng phong phú hơn.

Nếu hiệu suất trên tập huấn luyện là chấp nhận được, ta tiếp tục đánh giá hiệu suất trên tập kiểm thử. Nếu hiệu suất trên tập kiểm thử này cũng là chấp nhận được, ta không cần thực hiện thêm điều gì nữa. Nếu hiệu suất trên tập kiểm thử kém hơn nhiều so với trên tập huấn luyện, thu thập thêm dữ liệu là một trong những giải pháp hữu hiệu nhất. Những yếu tố ta cần quan tâm đặc biệt là chi phí và tính khả thi của việc thu thập thêm dữ liệu, chi phí và tính khả thi của việc giảm sai số kiểm thử bằng các phương pháp khác, lượng dữ liệu được cho là cần thiết để cải thiện hiệu suất trên bộ kiểm thử một cách đáng kể. Ở các công ty internet lớn với hàng triệu hay hàng tỷ người dùng, việc thu thập các tập dữ liệu lớn là khả thi, chi phí cho việc này ít hơn đáng kể so với chi phí của các giải pháp khác, vì thế câu trả lời gần như luôn luôn là thu thập thêm nhiều dữ liệu huấn luyện hơn. Ví dụ, sự phát triển của các tập dữ liệu lớn đã được gán nhãn là một trong những yếu tố quan trọng trong việc giải quyết bài toán nhận dạng đối tượng. Trong các trường hợp khác, chẳng hạn như ứng dụng trong y học, việc thu thập thêm dữ liệu sẽ là rất tốn kém hoặc không khả thi. Một phương pháp thay thế đơn giản hơn đó là giảm kích thước của mô hình hoặc cải thiện cơ chế kiểm soát, bằng cách điều chỉnh các siêu tham số, như các hệ số suy giảm trọng số, hoặc bằng cách thêm các cơ chế kiểm soát như tắt ngẫu nhiên. Nếu bạn nhận thấy cách biệt giữa hiệu suất của tập huấn luyện và tập kiểm thử vẫn là không thể chấp nhận được, kể cả sau khi đã tinh chỉnh các siêu tham số kiểm soát, lời khuyên là hãy thu thập thêm nhiều dữ liệu hơn nữa.

Khi quyết định nên thu thập thêm dữ liệu, việc xác định lượng dữ liệu cần thu thập thêm cũng là rất cần thiết. Ta nên vẽ biểu đồ các đường cong biểu thị mối quan hệ giữa kích thước tập huấn luyện và sai số tổng quát hóa, như trong hình 5.4. Bằng cách ngoại suy các đường cong, ta có thể đoán được lượng dữ liệu huấn luyện cần thêm vào để đạt được mức hiệu suất nhất định nào đó. Thường thì việc thêm một lượng mẫu có tỷ lệ nhỏ so với tổng số lượng mẫu đã có sẽ không ảnh hưởng đáng kể tới sai số tổng quát hóa. Bởi vậy, bạn nên thử nghiệm với kích thước tập huấn luyện theo thang logarit, ví dụ như tăng gấp đôi số lượng mẫu giữa các lần thử nghiệm liên tiếp nhau.

Nếu việc thu thập thêm dữ liệu là không khả thi, cách duy nhất để cải thiện sai số tổng quát hóa là cải thiện chính thuật toán học tập. Chủ đề này thuộc về lĩnh vực nghiên cứu và không phải là lĩnh vực nên lưu tâm đối với những người theo hướng thực hành ứng dụng.

11.4. Lựa chọn siêu tham số

Hầu hết các thuật toán học sâu đều có một bộ siêu tham số đi kèm, giúp điều khiển nhiều khía cạnh trong hành vi của thuật toán. Một vài trong số chúng ảnh hưởng đến chi phí về thời gian và bộ nhớ của quá trình thực thi thuật toán. Một số khác lại ảnh hưởng đến chất lượng mô hình thu được qua giai đoạn huấn luyện và khả năng suy luận kết quả của nó khi được áp dụng trên các đầu vào mới.

Có hai cách tiếp cận cơ bản để lựa chọn các siêu tham số này: chọn thủ công và chọn tự động. Cách chọn các thủ công yêu cầu sự hiểu biết về vai trò của những tham số và cách mô hình học máy đạt được tính tổng quát hóa tốt. Các thuật toán chọn tham số tự động giúp giảm đáng kể yêu cầu hiểu biết về những ý tưởng này, nhưng chi phí tính toán do đó cũng thường lớn hơn nhiều.

11.4.1. Tinh chỉnh thủ công các siêu tham số

Để thiết lập siêu tham số một cách thủ công, ta cần hiểu mối quan hệ giữa các siêu tham số, sai số huấn luyện, sai số tổng quát hóa và tài nguyên tính toán (bộ nhớ và thời gian chạy). Điều này yêu cầu một nền tảng vững chắc về các ý tưởng liên quan đến dung lượng hiệu dụng của một thuật toán học tập, như đã mô tả trong chương 5.

Mục đích của việc tìm kiếm thủ công các siêu tham số thường là để tìm kiếm sai số tổng quát hóa thấp nhất trong giới hạn thời gian chạy và bộ nhớ cho trước. Chúng tôi sẽ không thảo luận về cách xác định ảnh hưởng về mặt bộ nhớ và thời gian chạy của các siêu tham số ở đây, bởi vì điều này phụ thuộc nhiều vào nền tảng phần cứng.

Mục tiêu chính của việc tìm kiếm thủ công siêu tham số là điều chỉnh dung lượng hiệu dụng của mô hình sao cho phù hợp với độ phức tạp của tác vụ. Dung lượng hiệu dụng này bị ràng buộc bởi 3 yếu tố: khả năng biểu diễn của mô hình, khả năng của thuật toán học tập trong việc tối thiểu hóa hàm chi phí được dùng để huấn luyện mô hình, và mức độ mà hàm chi phí và quá trình huấn luyện kiểm soát mô hình. Một mô hình có nhiều tầng và nhiều đơn vị ẩn trên mỗi tầng hơn sẽ có dung lượng biểu diễn lớn hơn - nghĩa là có khả năng biểu diễn được các hàm phức tạp hơn. Mặc dù vậy, trên thực tế, nó có thể không học được tất cả các hàm số, nếu thuật toán huấn luyện không thể khám phá ra các hàm thực thi tốt việc tối thiểu hóa chi phí huấn luyện, hoặc nếu các cơ chế kiểm soát như suy giảm trọng số ngăn cản mô hình học được một vài trong số những hàm này.

Sai số tổng quát hóa thường tuân theo một đường cong chữ $U$ khi được biểu diễn như một hàm của một trong số những siêu tham số, như được minh hoạ trong hình 5.3. Ở một cực của đường cong chữ U, giá trị siêu tham số tương ứng với dung lượng thấp, và sai số tổng quát hóa cao bởi vì sai số huấn luyện cao. Đây là vùng vị khớp. Tương tự, ở cực còn lại, giá trị siêu tham số tương ứng với dung lượng cao, có sai số tổng quát hóa cao bởi vì khoảng cách giữa sai số huấn luyện và sai số kiểm thử là cao. Dung lượng tối ưu nằm đâu đó ở giữa, nơi đạt được sai số tổng quát hóa thấp nhất, bằng cách chấp nhận một lượng sai số huấn luyện vừa đủ.

Với một vài siêu tham số, quá khớp xảy ra khi chúng có giá trị lớn. Số đơn vị ẩn trong một tầng là một ví dụ, vì việc tăng các đơn vị ẩn làm tăng dung lượng của mô hình. Với nhiều siêu tham số khác, quá khớp xảy ra khi chúng có giá trị nhỏ. Ví dụ, hệ số suy giảm trọng số nhỏ nhất có thể là $0$, tương ứng với dung lượng hiệu dụng cực đại của thuật toán học tập.

Cần lưu ý rằng, không phải mọi siêu tham số đều có khả năng khám phá toàn bộ đường cong chữ U. Có nhiều siêu tham số là rời rạc, như số đơn vị trong một tầng hoặc số lượng mảnh tuyến tính trong một đơn vị cực đại đầu ra (maxout), vì vậy nó chỉ có thể chạm đến một vài điểm dọc theo đường cong. Đôi khi ta cũng có những siêu tham số ở dạng nhị phân, thường được dùng làm công tắc để quyết định liệu có sử dụng một số thành phần không bắt buộc nào đó của thuật toán học tập hay không, chẳng hạn như một bước tiền xử lý dùng để chuẩn hóa các đặc trưng đầu vào bằng cách trừ đi trung bình và chia cho độ lệch chuẩn của chúng. Những siêu tham số này có thể chỉ khám phá được $2$ điểm trên đường cong. Các siêu tham số khác có thể có giá trị cực đại hoặc cực tiểu khiến chúng chỉ có thể khám phá phần nào đó của đường cong. Ví dụ, hệ số suy giảm trọng số có giá trị cực tiểu là $0$. Có nghĩa là nếu mô hình bị vị khớp ngay cả khi không suy giảm trong số, ta sẽ không thể tiến vào miền quá khớp bằng cách điều chỉnh hệ số suy giảm trọng số nữa. Nói cách khác, một vài siêu tham số chỉ có thể làm giảm dung lượng của mô hình.

Có lẽ, tốc độ học là siêu tham số quan trọng nhất. Nếu bạn chỉ có thời gian để tinh chỉnh một siêu tham số, hãy tập trung vào tốc độ học. Nó kiểm soát dung lượng hiệu dụng của mô hình theo một cách phức tạp hơn các siêu tham số khác - dung lượng hiệu dụng của mô hình đạt cực đại khi tốc độ học là chuẩn xác cho bài toán tối ưu, chứ không phải khi tốc độ học là đặc biệt lớn hay đặc biệt nhỏ. Tốc độ học có một đường cong chữ U đối với sai số huấn luyện, được mô tả trong hình 11.1. Khi tốc độ học quá lớn, phép trượt gradient có thể làm tăng sai số huấn luyện thay vì giảm nó đi. Trong trường hợp hàm bậc hai lý tưởng hóa, điều này xảy ra nếu tốc độ học lớn hơn ít nhất 2 lần giá trị tối ưu của nó [Lecun et al., 1998s]. Ngược lại, khi tốc độ học quá nhỏ, quá trình huấn luyện không những chậm hơn mà còn có thể bị mắc kẹt vĩnh viễn tại một vùng có sai số huấn luyện cao. Hiện ứng này chúng ta vẫn chưa thực sự hiểu rõ (nó sẽ không xảy ra trong trường hợp hàm mất mát là lồi).

Hình 11.1: Mối quan hệ điển hình giữa tốc độ học và sai số huấn luyện. Lưu ý sự gia tăng mạnh của sai số khi tốc độ học vượt qua giá trị tối ưu. Điều này xảy ra trong một khoảng thời gian huấn luyện cố định, bởi tốc độ học nhỏ hơn đôi khi làm chậm quá trình huấn luyện theo một hệ số tỉ lệ thuận với sự suy giảm tốc độ học. Sai số tổng quát hóa có thể tuân theo đường cong này hoặc trở nên phức tạp hơn do ảnh hưởng của các cơ chế kiểm soát phát sinh khi tỷ lệ học quá lớn hoặc quá nhỏ, bởi vì tối ưu hoá kém, ở một mức độ nào đó, có thể làm giảm hoặc ngăn chặn quá khớp và thậm chí các điểm có sai số huấn luyện tương đương có thể có sai số tổng quát hóa khác nhau.

Việc tinh chỉnh các tham số khác yêu cầu kiểm soát cả sai số huấn luyện và kiểm thử để chẩn đoán xem liệu mô hình của bạn có quá khớp hay vị khớp hay không, sau đó điều chỉnh dung lượng của nó một cách thích hợp.

Nếu sai số trên tập huấn luyện cao hơn tỷ lệ sai số mục tiêu của bạn, cách duy nhất là tăng dung lượng mô hình. Nếu bạn đang không sử dụng cơ chế kiểm soát và tự tin rằng thuật toán tối ưu hóa của mình đang hoạt động một cách chính xác, thì bạn phải thêm nhiều tầng hơn vào hệ thống mạng của bạn hoặc thêm nhiều đơn vị ẩn hơn vào mỗi tầng. Không may là điều này sẽ làm tăng chi phí tình toán của mô hình.

Nếu sai số trên tập kiểm thử cao hơn tỷ lệ sai số mục tiêu của bạn, bạn có hai phương án. Sai số kiểm thử này là tổng của sai số huấn luyện và khoảng cách giữa sai số huấn luyện và sai số kiểm thử. Sai số kiểm thử tối ưu được tìm ra bằng cách đánh đổi giữa các đại lượng này. Các mạng neuron thường thực hiện tốt nhất khi sai số huấn luyện rất thấp (và do đó, dung lượng của mô hình cao) và sai số kiểm thử chủ yếu được quyết định bởi khoảng cách giữa sai số huấn luyện và kiểm thử. Mục tiêu của bạn là làm giảm khoảng cách này sao cho sai số huấn luyện không tăng nhanh hơn so với tốc độ giảm của nó. Để giảm khoảng cách này, hãy thay đổi các siêu tham số kiểm soát để giảm dung lượng hiệu dụng của mô hình, chẳng hạn như bằng cách thêm cơ chế tắt ngẫu nhiên hoặc suy giảm trọng số. Thường thì kết quả tốt nhất đến từ một mô hình lớn đã được kiểm soát tốt, ví dụ bằng cách sử dụng tắt ngẫu nhiên.

Hầu hết siêu tham số có thể được thiết lập bằng cách xét xem liệu chúng làm tăng hay làm giảm dung lượng của mô hình. Một số ví dụ sẽ được mô tả trong Bảng $11.1$.

Siêu tham số Tăng dung lượng khi… Lý do Nhược điểm
Số lượng đơn vị ẩn Tăng lên Tăng số lượng đơn vị ẩn làm tăng dung lượng biểu diễn của mô hình Tăng số lượng đơn vị ẩn làm tăng thời gian và bộ nhớ cần thiết cho mọi phép toán trên mô hình
Tốc độ học Được tinh chỉnh một cách tối ưu Tốc độ học không phù hợp, quá cao hoặc quá thấp, khiến mô hình có dung lượng hiệu dụng thấp vì quá trình tối ưu thất bại  
Chiều rộng của hàm lõi tích chập Tăng lên Tăng chiều rộng của hàm lõi làm tăng số lượng tham số trong mô hình Một hàm lõi rộng hơn dẫn đến sự thu hẹp kích thước của đầu ra, làm giảm độ hiệu quả của mô hình nếu bạn không sử dụng kỹ thuật đệm thêm $0$. Lõi rộng hơn sẽ yêu cầu nhiều bộ nhớ hơn để lưu trữ các tham số, đồng thời làm tăng thời gian chạy. Tuy nhiên, đầu ra nhỏ hơn sẽ giảm bớt chi phí bộ nhớ.
Đệm thêm $0$ Tăng lên Đệm thêm $0$ trước phép tích chập khiến kích thước của biểu diễn giữ ở mức lớn Tăng chi phí thời gian và bộ nhớ của hầu hết các phép toán.
Hệ số suy giảm trọng số Giảm đi Giảm hệ số suy giảm trọng số giải phóng các tham số của mô hình, khiến chúng có thể trở nên lớn hơn  
Tỉ lệ tắt ngẫu nhiên Giảm đi Khi tắt đi ít đơn vị hơn, các đơn vị có nhiều cơ hội “hợp sức” với nhau hơn để khớp với tập huấn luyện  

Bảng 11.1: Ảnh hưởng của các siêu tham số lên độ hiệu quả của mô hình

Khi tinh chỉnh thủ công các siêu tham số, đừng bao giờ quên mục đích cuối cùng của bạn: kết quả tốt trên tập kiểm thử. Thêm các cơ chế kiểm soát chỉ là một trong những cách để đạt được mục tiêu này. Chừng nào sai số trên tập huấn luyện vẫn thấp, thì bạn vẫn luôn có thể giảm sai số tổng quát hóa bằng cách thu thập thêm dữ liệu huấn luyện. Một phương pháp vét cạn để đảm bảo khả năng thành công là liên tục tăng dung lượng mô hình và kích thước tập huấn luyện cho đến khi tác vụ được giải quyết. Cách tiếp cận này dĩ nhiên sẽ làm tăng chi phí tính toán cho quá trình huấn luyện và suy luận, vì vậy nó chỉ khả thi khi thực hiện được cung cấp nguồn lực phù hợp. Về cơ bản, cách tiếp cận này có thể thất bại do khó tối ưu. Tuy nhiên, đối với nhiều bài toán, tối ưu hoá có vẻ không phải là rào cản chính, giả sử mô hình được lựa chọn một cách phù hợp.

11.4.2 Các thuật toán tối ưu hoá siêu tham số tự động

Thuật toán học tập lí tưởng là thuật toán chỉ nhận vào một tập dữ liệu và tạo ra một hàm mà không cần tinh chỉnh thủ công các siêu tham số. Sự phổ biến của một số thuật toán học như hồi quy logit và các máy vector hỗ trợ (SVM) một phần bắt nguồn từ khả năng hoạt động tốt của chúng chỉ với một hoặc hai siêu tham số cần tinh chỉnh. Mạng neuron đôi khi có thể hoạt động tốt với chỉ một lượng nhỏ siêu tham số cần tinh chỉnh, nhưng chúng thường hoạt độngh tốt hơn nhiều khi được tinh chỉnh 40 siêu tham hoặc nhiều hơn. Tinh chỉnh siêu tham số thủ công có thể hữu hiệu khi người dùng có xuất phát điểm tốt, ví dụ như khi các siêu tham số đã được xác định bởi những người từng nghiên cứu trên ứng dụng và kiến trúc tương tự trước đó, hoặc khi người dùng có kinh nghiệm hàng tháng, hàng năm trời trong việc khám phá giá trị của các siêu tham số cho mạng neuron để áp dụng vào các tác vụ giống nhau. Tuy nhiên, trong nhiều ứng dụng, chúng ta thường không có xuất phát điểm tốt như vậy. Đối với những trường hợp này, thuật toán tự động có thể giúp ta tìm ra các siêu tham số hữu dụng.

Khi chúng ta suy nghĩ về cách người dùng thuật toán học tập tìm kiếm những giá trị tốt cho các siêu tham số, một bài toán tối ưu hoá xuất hiện: ta đang cố gắng tìm một giá trị của các siêu tham số có thể tối ưu một hàm mục tiêu nào đó, chẳng hạn như sai số xác thực, đôi khi bị ràng buộc (bởi giới hạn cho thời gian huấn luyện, bộ nhớ hoặc thời gian nhận dạng). Vì vậy, về nguyên tắc, ta có thể phát triển các thuật toán tối ưu hoá siêu tham số, bao bọc một thuật toán học tập để lựa chọn các siêu tham số của thuật toán học tập này, để giấu đi các siêu tham số của thuật toán đó khỏi người dùng. Tuy nhiên, thuật toán tối ưu siêu tham số lại có những siêu tham số của chính nó, chẳng hạn như miền giá trị của các siêu tham số đối với mỗi thuật toán học tập. Tuy nhiên, bộ siêu tham số thứ hai này thường có thể được lựa chọn một cách dễ dàng hơn, theo nghĩa là ta có thể đạt được hiệu suất chấp nhận được trên nhiều tác vụ khác nhau với cùng một bộ siêu tham số thứ hai.

11.4.3 Tìm kiếm theo lưới

Khi cần chọn ít hơn $3$ siêu tham số, phương pháp tìm kiếm theo lưới (grid search) thường được sử dụng. Với mỗi siêu tham số, người dùng chọn một tập nhỏ hữu hạn các giá trị để thử nghiệm. Thuật toán tìm kiếm theo lưới sẽ huấn luyện một mô hình với mọi tổ hợp cấu hình của các siêu tham số trong tích Đề-các của tập các giá trị cho từng siêu tham số. Phép thử nào cho sai số trên tập xác thực tốt nhất sẽ được chọn. Phần bên trái của hình $11.2$ mô tả một lưới các giá trị của các siêu tham số.

Ta nên chọn danh sách các giá trị để thử nghiệm như thế nào? Trong trường hợp các siêu tham số (đã được sắp xếp) có dạng số, phần tử nhỏ nhất và lớn nhất của mỗi danh sách cần được chọn một cách thận trọng, dựa trên kinh nghiệm trước đó ở các thực nghiệm tương tự, để đảm bảo giá trị tối ưu có thể nằm trong miền được chọn. Tìm kiếm theo lưới điển hình thường bao gồm việc chọn các giá trị xấp xỉ trên một thang logarit. Ví dụ, tốc độ học được chọn trong tập {$0.1, 0.01, 10^{-3}, 10^{-4}, 10^{-5}$} hoặc số lượng của các đơn vị ẩn được chọn trong tập {$50, 100, 200, 500, 1000, 2000$}.

Tìm kiếm theo lưới thường có hiệu quả tốt nhất khi được thực hiện lặp lại nhiều lần. Ví dụ, giả sử ta chạy tìm kiếm theo lưới cho một siêu tham số $\alpha$ sử dụng các giá trị là {$-1, 0, 1$}. Nếu giá trị tốt nhất tìm được là $1$, vậy thì chúng ta đã đánh giá thấp miền giá trị mà $\alpha$ tốt nhất có thể thuộc vào và nên chuyển lưới, chạy tìm kiếm giá trị $\alpha$ khác trong tập {$1, 2, 3$}. Nếu $\alpha$ tốt nhất là $0$, ta có thể mong muốn thay đổi ước lượng cũ bằng cách phóng đại lên và chạy tìm kiếm theo lưới trên tập {$-0.1, 0, 0.1$}.

Một vấn đề dễ thấy của tìm kiếm theo lưới là chi phí tính toán của nó tăng theo cấp số mũ của số lượng các siêu tham số. Nếu có $m$ siêu tham số, mỗi tham số có nhiều nhất $n$ giá trị, số lần thử cho huấn luyện và đánh giá có thể đạt tới $O(n^{m})$. Những lần thử có thể chạy song song và khai thác tính song song lỏng lẻo (gần như không cần có sự giao tiếp giữa các máy thực hiện tìm kiếm). Tuy nhiên, vì chi phí theo cấp số mũ của tìm kiếm theo lưới, ngay cả việc song song hoá cũng không cho ta một kích thước tìm kiếm hợp lý.

Hình 11.2: So sánh tìm kiếm theo lưới và tìm kiếm ngẫu nhiên. Với mục đích minh họa, chúng tôi biểu diễn hai siêu tham số, nhưng trên thực tế, chúng ta thường làm việc với số lượng siêu tham số lớn hơn. (Hình trái) Để thực thi tìm kiếm theo lưới, ta cung cấp một tập các giá trị cho mỗi siêu tham số. Thuật toán tìm kiếm thực hiện huấn luyện cho mọi thiết lập siêu tham số đồng thời trong tích Đề-các của các tập giá trị này. (Hình phải) Để thực thi tìm kiếm ngẫu nhiên, chúng ta cung cấp một phân phối xác suất trên các cấu hình siêu tham số đồng thời. Hầu hết những siêu tham số này thường là độc lập với nhau. Các lựa chọn phổ biến cho phân phối của một siêu tham số bao gồm phân phối đều và logarit-đều (để lấy mẫu phân phối logarit-đều, ta lấy hàm mũ của một mẫu từ phân phối đều). Thuật toán tìm kiếm sẽ ngẫu nhiên tạo ra các cấu hình siêu tham số đồng thời và huấn luyện với từng giá trị của chúng. Tìm kiếm theo lưới và tìm kiếm ngẫu nhiên đều đánh giá sai số trên tập xác thực và trả về cấu hình tốt nhất. Hình trên mô tả trường hợp thường gặp, chỉ có một vài siêu tham số có ảnh hưởng lớn đến kết quả. Trong minh họa này, chỉ những siêu tham số trên trục ngang tạo ra ảnh hưởng lớn. Tìm kiếm theo lưới lãng phí chi phí tính toán một lượng theo cấp số mũ của số lượng siêu tham số không có ảnh hưởng, trong khi tìm kiếm ngẫu nhiên chỉ kiểm tra một giá trị duy nhất của mỗi siêu tham số có ảnh hưởng ở hầu hết các lần thử. Hình được vẽ lại với sự cho phép của Bergestra và Bengio, (2012).

11.4.4 Tìm kiếm ngẫu nhiên

May mắn thay, có một thuật toán có thể lập trình dễ dàng, tiện dụng hơn và hội tụ về các giá trị tốt của các siêu tham số nhanh hơn để thay thế cho tìm kiếm theo lưới: tìm kiếm ngẫu nhiên [Bergstra and Bengio, 2012].

Tìm kiếm ngẫu nhiên hoạt động như sau. Đầu tiên, định nghĩa một phân phối biên cho mỗi siêu tham số. Ví dụ, phân phối Bernoulli hoặc mulltinoulli cho các siêu tham số dạng nhị phân hoặc rời rạc, hoặc phân phối đều trên thang logarit cho các giá trị thực dương của các siêu tham số. Ví dụ,

Trong đó, $u(a,b)$ là một mẫu của phân phối đều lấy trong khoảng $(a,b)$. Tương tự, có thể là mẫu lấy từ $u(\log(50), \log(2000))$.

Không giống như phương pháp tìm kiếm theo lưới, ta không nên rời rạc hoá hoặc giới hạn các giá trị của các siêu tham số. Điều này giúp mô hình có thể khám phá một tập có nhiều giá trị hơn và tránh chi phí tính toán bổ sung. Trên thực tế, như đã minh họa trong hình 11.2, tìm kiếm ngẫu nhiên có thể hiệu quả hơn theo cấp số nhân so với tìm kiếm theo lưới, khi có một vài siêu tham số không ảnh hưởng quá nhiều đến độ đo hiệu suất. Điều này đã được nghiên cứu đầy đủ và chi tiết trong [Bergstra and Bengio, 2012], họ phát hiện ra rằng: tìm kiếm ngẫu nhiên giúp giảm sai số trên tập xác thực nhanh hơn nhiều so với tìm kiếm theo lưới, xét theo số lần thử được thực thi bởi mỗi thuật toán.

Giống với tìm kiếm theo lưới, ta thường cần chạy các phiên bản lặp lại của tìm kiếm ngẫu nhiên, để tìm kiếm tốt hơn dựa trên kết quả của lần thực thi đầu.

Lí do chính giải thích vì sao tìm kiếm ngẫu nhiên tìm được những lời giải tốt nhanh hơn tìm kiếm theo lưới là vì nó không lãng phí các lần thử. Không giống với tìm kiếm theo lưới, nó sẽ không phí phạm tài nguyên để thử hai giá trị của một siêu tham số (cho trước các giá trị của các siêu tham số còn lại) cho kết quả tương đương. Đối với tìm kiếm theo lưới, các siêu tham số khác sẽ có cùng giá trị với hai lần chạy này, trong khi với tìm kiếm ngẫu nhiên, chúng thường có các giá trị khác nhau. Vì vậy, nếu thay đổi giữa hai giá trị này không tạo ra nhiều khác biệt về sai số trên tập xác thực, tìm kiếm theo lưới sẽ lặp lại hai lần thử giống nhau một cách không cần thiết, trong khi đó, tìm kiếm ngẫu nhiên vẫn sẽ tạo ra hai lần thử độc lập với các siêu tham số còn lại.

11.4.5 Tối ưu hoá siêu tham số dựa trên mô hình

Quá trình tìm kiếm một bộ siêu tham số tốt có thể được đưa về một bài toán tối ưu hoá. Các biến quyết định là các siêu tham số. Chi phí cần được tối ưu hoá chính là tập sai số xác thực từ quá trình huấn luyện khi sử dụng các siêu tham số này. Trong các trường hợp đơn giản, mà ta có thể tính toán gradient của một thang đo sai số khả vi nào đó trên tập xác thực theo các siêu tham số, ta chỉ cần tối ưu dựa theo gradient này [Bengio et al., 1999; Bengio, 2000; Maclaurin et al.,2015]. Tuy nhiên, trong thực tế, gradient như vậy hầu như không sẵn có, bởi vì việc tính toán yêu cầu chi phí tính toán và bộ nhớ cao, hoặc vì các siêu tham số về bản chất có các tương tác không khả vi với tập sai số xác thực, như trong trường hợp các siêu tham số có giá trị rời rạc.

Để bù đắp cho sự thiếu hụt gradient này, ta có thể xây dựng một mô hình cho sai số trên tập xác thực, sau đó đề xuất các dự đoán cho các siêu tham số mới bằng cách thực hiện tối ưu hoá trong mô hình này. Phần lớn thuật toán tìm kiếm siêu tham số dựa trên mô hình đều sử dụng mô hình hồi quy Bayes để ước lượng giá trị mong muốn cho cả sai số trên tập xác thực cho mỗi siêu tham số lẫn độ biến động của kỳ vọng này. Vì vậy, quá trình tối ưu hoá phải đánh đổi giữa việc khám phá (đề xuất các siêu tham số có độ biến động cao, có thể dẫn đến sự cải thiện lớn nhưng cũng có thể hoạt động kém) và khai thác (gợi ý các siêu tham số mà mô hình tự tin rằng sẽ thực thi tốt, cũng như bất kì siêu tham số nào nó đã gặp trước đây - thường là các siêu tham số rất giống với những siêu tham số nó đã gặp). Các cách tiếp cận hiện thời cho việc tối ưu hoá siêu tham số bao gồm Spearmint [Snoek et al., 2012],TPE [Bergstra et al., 2011] và SMAC [Hutter et al., 2011].

Hiện tại, chúng tôi không thể đề xuất một cách rõ ràng thuật toán tối ưu hoá siêu tham số kiểu Bayes như là một công cụ được xây dựng để đạt những kết quả tốt hơn trong học sâu, hay là để thu được những kết quả này với chi phí thấp hơn. Tối ưu hoá siêu tham số kiểu Bayes có thể sánh ngang với con người, đôi khi tốt hơn, nhưng đôi khi lại thất bại thảm hại trên các bài toán khác. Dù sao đi nữa, cũng đáng để thử xem nó có hoạt động tốt trên một số bài toán cụ thể hay không, nhưng nói chung nó vẫn chưa đáng tin cậy. Dù vậy, tối ưu hoá siêu tham số vẫn là một lĩnh vực nghiên cứu quan trọng, được dẫn dắt chủ yếu bởi nhu cầu của học sâu, có nhiều lợi ích tiềm năng không chỉ trong toàn bộ lĩnh vực học máy mà còn trong phạm vi các ngành kỹ thuật nói chung.

Một nhược điểm thường thấy của hầu hết thuật toán tối ưu hoá siêu tham số phức tạp hơn so với tìm kiếm ngẫu nhiên là chúng yêu cầu một thực nghiệm huấn luyện phải được hoàn thành trước khi chúng có thể trích xuất bất cứ thông tin nào từ đó. Khiến cho chúng trở nên kém hiệu quả hơn nhiều so với tìm kiếm thủ công bởi một chuyên gia, xét trên khía cạnh số lượng thông tin có thể trích xuất được từ một thử nghiệm, bởi vì con người có thể sớm nhận ra nếu một vài tập siêu tham số có tính bất thường. Swersky và cộng sự. (2014) đã giới thiệu phiên bản đầu tiên của một thuật toán duy trì một tập hợp nhiều thử nghiệm. Tại các thời điểm khác nhau, thuật toán tối ưu hoá siêu tham số có thể lựa chọn bắt đầu một thử nghiệm mới, để “đóng băng” một thử nghiệm không có triển vọng đang chạy, hoặc để “rã đông” và phục hồi một thử nghiệm đã bị đóng băng trước đó nhưng có vẻ sẽ cung cấp thêm nhiều thông tin ở thời điểm hiện tại.

11.5 Chiến lược gỡ lỗi

Khi một hệ thống học máy hoạt động kém, thường thì khó có thể nói rằng hiệu năng kém là do bản chất của thuật toán hay do một lỗi nào đó trong quá trình thực thi thuật toán. Vì nhiều lý do, việc gỡ lỗi (debug) trong một hệ thống học máy là không đơn giản.

Trong hầu hết các trường hợp, chúng ta không biết trước về hành vi mong muốn của thuật toán. Trên thực tế, cốt lõi của việc sử dụng học máy đó là nó sẽ khám phá ra hành vi hữu ích mà chúng ta không thể tự xác định được. Nếu chúng ta huấn luyện một mạng neuron trên một nhiệm vụ phân loại mới và đạt được sai số kiểm thử bằng $5%$, chúng ta không có cách thức đơn giản nào để biết được rằng đây là hành vi kỳ vọng hay hành vi cận tối ưu.

Một khó khăn khác nữa là hầu hết các mô hình học máy đều có nhiều phần mà mỗi phần đều có tính chất thích ứng. Nếu một phần bị lỗi, các phần khác có thể thích ứng và vẫn đạt được hiệu suất gần như chấp nhận được. Ví dụ, giả sử chúng ta đang huấn luyện một mạng neuron với một vài tầng được tham số hóa theo ma trận trọng số $\boldsymbol W$ và các hệ số tự do $\boldsymbol b$. Giả sử thêm rằng chúng ta đã thực hiện thủ công phương pháp trượt gradient cho từng tham số riêng biệt, và đã tạo ra một lỗi khi cập nhật cho các hệ số tự do:

trong đó $\alpha$ là tốc độ học. Sai lầm ở đây là ta đã không sử dụng gradient trong phép cập nhật. Nó khiến cho hệ số tự do liên tục giảm giá trị trong suốt quá trình huấn luyện, điều này rõ ràng không phải là một cách thực thi đúng của bất kỳ thuật toán huấn luyện hợp lý nào. Nếu chỉ kiểm tra đầu ra của mô hình, ta khó có thể nhận ra lỗi này một cách rõ ràng. Bởi vì tuỳ thuộc vào phân bố của đầu vào, các trọng số có thể thay đổi để bù đắp cho các hệ số tự do.

Hầu hết các chiến lược gỡ lỗi cho mạng neuron được thiết kế để phát hiện một hoặc cả hai loại khó khăn này. Hoặc là thiết kế một trường hợp rất đơn giản sao cho hành vi đúng đắn là có thể dự đoán được, hoặc là thiết kế một phép thử để kiểm tra một phần của mạng neuron một cách cô lập.

Dưới đây là số phép thử quan trọng để gỡ lỗi mô hình:

Diễn hoạ hoạt động của mô hình: Khi huấn luyện một mô hình phát hiện đối tượng trong hình ảnh, hãy xem một số hình ảnh hiển thị phối cùng với các phát hiện mà mô hình đề xuất. Khi huấn luyện một mô hình sinh hội thoại (generative model of speech), hãy lắng nghe một số mẫu giọng nói mà mô hình tạo ra. Điều này có vẻ hiển nhiên, nhưng rất dễ bị bỏ quên trong thực tiễn khi chỉ nhìn vào các thang đo hiệu suất định lượng như độ chính xác hoặc logarit hàm hợp lý. Trực tiếp quan sát mô hình học máy thực hiện tác vụ của nó sẽ giúp ta xác định xem hiệu suất định lượng mà nó đạt được có hợp lý hay không. Lỗi đánh giá có thể là một trong số những lỗi “huỷ diệt” nhất vì chúng có thể đánh lừa bạn, khiến cho bạn tin rằng hệ thống đang hoạt động tốt trong khi sự thật không như vậy.

Tập trung vào những lỗi tệ nhất: Hầu hết các mô hình đều có thể xuất ra một độ đo tự tin cho tác vụ chúng thực hiện. Ví dụ, bộ phân loại dựa trên tầng softmax đầu ra chỉ định một xác suất cho mỗi lớp. Do đó, xác suất được gán cho lớp có khả năng cao nhất cho ta một ước lượng về độ tự tin của mô hình trong quyết định phân loại của nó. Thông thường, kết quả của quá trình huấn luyện hợp lý cực đại cho những giá trị này là một ước lượng vượt quá xác suất chính xác của của mô hình, nhưng chúng có phần hữu ích theo nghĩa: những mẫu ít có khả năng được gán nhãn chính xác sẽ nhận xác suất nhỏ hơn trong mô hình. Bằng cách xem xét những mẫu huấn luyện khó có thể được mô hình hoá một cách chính xác nhất, người ta thường khám phá ra các vấn đề trong cách mà dữ liệu được tiền xử lý hoặc gán nhãn. Ví dụ, hệ thống phiên mã địa chỉ Street View ban đầu gặp một vấn đề là hệ thống phát hiện số địa chỉ sẽ cắt hình ảnh quá sát và bỏ qua một vài chữ số. Mạng phiên mã sau đó đã gán xác suất rất thấp cho câu trả lời đúng trên những hình ảnh này. Khi sắp xếp những hình ảnh bị phát hiện sai có độ tự tin lớn nhất, chúng tôi thấy rằng có một vấn đề mang tính hệ thống trong khâu cắt ảnh. Sửa đổi hệ thống để cắt hình ảnh rộng hơn đã mang lại hiệu suất tốt hơn nhiều cho hệ thống tổng thể, mặc dù mạng phiên mã cần xử lý sự biến động lớn hơn về vị trí và độ rộng của số địa chỉ.

Biện luận phần mềm thông qua sai số huấn luyện và kiểm thử: Việc xác định xem nền tảng bên trong của phần mềm có được thực thi đúng hay không thường là rất khó khăn. Ta có thể thu được một số manh mối từ sai số huấn luyện và kiểm thử. Nếu sai số huấn luyện thấp nhưng sai số kiểm thử cao, thì có khả năng là quá trình huấn luyện hoạt động chính xác và mô hình đã quá khớp vì các lý do cơ bản về mặt thuật toán. Một khả năng khác là sai số kiểm thử được đánh giá không chính xác do có vấn đề ở khâu lưu trữ mô hình sau khi hoàn tất huấn luyện và sau đó tải nó lên để kiểm tra tập xác thực, hoặc vì dữ liệu kiểm thử đã được chuẩn bị không giống với dữ liệu huấn luyện (theo nghĩa được lấy từ các phân phối sinh dữ liệu khác nhau). Nếu cả sai số huấn luyện và kiểm thử đều cao, rất khó để xác định xem nguyên nhân là do lỗi của phần mềm hay là mô hình bị vị khớp. Kịch bản này đòi hỏi ta cần thực hiện thêm những phép thử khác, sẽ được mô tả tiếp theo.

Khớp với một tập dữ liệu rất nhỏ nào đó: Nếu sai số trên tập huấn luyện cao, hãy xác định xem điều này đến từ lỗi do vị khớp hay lỗi phần mềm. Thông thường, ngay cả các mô hình nhỏ cũng có thể được đảm bảo việc khớp với một tập dữ liệu nhỏ. Ví dụ, một tập dữ liệu phân loại với chỉ một mẫu có thể được khớp bằng cách thiết lập chính xác các hệ số tự do của tầng đầu ra. Thông thường, nếu bạn không thể huấn luyện được một bộ phân loại để gán nhãn chính xác cho một mẫu đơn giản, một bộ tự mã hóa tái tạo thành công một mẫu đơn lẻ với độ trung thực cao, hay một mô hình sinh mẫu tạo ra các mẫu nhất quán với một mẫu duy nhất, nghĩa là có một lỗi phần mềm nào đó ngăn chặn quá trình tối ưu hóa thành công trên tập huấn luyện. Phép thử này có thể được mở rộng thành một tập dữ liệu nhỏ với vài mẫu thay vì chỉ một.

So sánh các đạo hàm được lan truyền ngược với các đạo hàm số học: Nếu bạn đang sử dụng một bộ khung phần mềm yêu cầu thực thi các phép tính gradient của riêng bạn, hoặc nếu bạn đang thêm một phép toán mới vào thư viện tính vi phân và phải định nghĩa phương thức $\mathtt{bprop}$ của nó, thì một nguồn gây lỗi thường gặp đó là lỗi khi triển khai biểu thức tính gradient. Một cách để xác minh xem những đạo hàm này có được tính đúng hay không là so sánh các đạo hàm được tính bởi phép vi phân tự động của bạn với các đạo hàm được tính bởi sai phân hữu hạn (finite difference). Bởi vì

nên ta có thể xấp xỉ đạo hàm bằng cách sử dụng một $\epsilon$ nhỏ, hữu hạn

Ta có thể cải thiện độ chính xác của phép lấy xấp xỉ bằng cách sử dụng sai phân hướng tâm (centered difference):

Kích thước nhiễu $\epsilon$ phải đủ lớn để đảm bảo rằng nhiễu loạn không bị làm tròn xuống quá nhiều bởi các tính toán với số có phần thập phân hữu hạn.

Thông thường, chúng ta sẽ muốn kiểm tra gradient hoặc ma trận Jacobi của một của hàm mà đầu ra có dạng vector $g: \mathbb{R}^m \to \mathbb{R}^n$. Tuy nhiên, sai phân hữu hạn chỉ cho phép lấy một đạo hàm duy nhất tại một thời điểm. Chúng ta có thể thực hiện sai phân hữu hạn $mn$ lần để lấy tất cả các đạo hàm riêng của hàm $g$, hoặc áp dụng phép thử cho một hàm mới mà nó sử dụng các phép chiếu ngẫu nhiên lên cả đầu vào và đầu ra của hàm $g$. Ví dụ, chúng ta có thể áp dụng phép thử cho đạo hàm của $f(x)$, trong đó $f(x) = {\boldsymbol u}^\intercal \,g(\boldsymbol{v}x)$, với $\boldsymbol u$ và $\boldsymbol v$ là các vector được chọn ngẫu nhiên. Để tính toán đạo hàm $f’(x)$ một cách chính xác thì ta phải lan truyền ngược thông qua $g$ một cách chính xác. Tuy nhiên, phép tính này là hiệu quả đối với sai phân hữu hạn vì $f$ chỉ có một đầu vào và một đầu ra. Thông thường ta lặp lại phép thử này cho nhiều hơn một giá trị của $\boldsymbol{u}$ và $\boldsymbol{v}$ vì nó giúp giảm nguy cơ bỏ sót các lỗi trực giao với phép chiếu ngẫu nhiên.

Nếu có thể tính toán số trên các số phức, có một cách rất hiệu quả để ước lượng gradient là sử dụng các số phức làm đầu vào của hàm [Squire and Trapp, 1998]. Phương pháp này dựa trên nhận xét rằng

trong đó $i = \sqrt{− 1}$. Không giống như trong trường hợp giá trị thực ở trên, sự triệt tiêu sẽ không xẩy ra khi lấy vi phân giữa các giá trị của $f$ tại các điểm khác nhau. Điều này cho phép ta sử dụng những giá trị $\epsilon$ siêu nhỏ chẳng hạn như $\epsilon = 10^{−150}$, khiến cho sai số $O (\epsilon ^2)$ trở nên không đáng kể so với tất cả các mục đích thực tế.

Giám sát biểu đồ tần suất của các tín hiệu kích hoạt và gradient: Diễn hoạ số liệu thống kê của các gradient và tín hiệu kích hoạt trên mạng neuron, được thu thập qua một số lượng lớn các vòng lặp huấn luyện (có thể là một lượt huấn luyện), thường khá hữu ích. Giá trị tiền kích hoạt của các đơn vị ẩn có thể cho biết liệu các đơn vị có bị bão hòa hay không, hoặc tần suất bão hoà của các đơn vị này. Ví dụ, đối với các bộ tuyến tính hiệu chỉnh, chúng có thường bị tắt đi hay không? Có đơn vị nào luôn luôn bị tắt không? Đối với các đơn vị $tanh$, trung bình trị tuyệt đối của các giá trị tiền kích hoạt cho ta biết mức độ bão hòa của những đơn vị này. Trong một mạng đa tầng, các gradient được lan truyền bùng nổ hoặc tiêu biến quá nhanh, quá trình tối ưu hóa có thể bị cản trở. Cuối cùng, việc so sánh độ lớn của gradient theo từng tham số với chính độ lớn của các tham số này cũng là rất hữu ích. Theo đề xuất của Bottou (2015), ta muốn độ lớn của các cập nhật tham số trên một lô nhỏ nên có giá trị khoảng $1%$ độ lớn của tham số, thay vì $50%$ hoặc $0,001%$ (khiến quá trình cập nhật tham số trở nên rất chậm chạp). Đôi khi, có một nhóm tham số đang được cập nhật với tốc độ vừa phải trong khi các nhóm khác bị mắc kẹt. Khi dữ liệu là thưa (như trong ngôn ngữ tự nhiên), một vài tham số có thể hiếm khi được cập nhật, và ta nên lưu ý điều này khi giám sát quá trình tiến triển của chúng.

Cuối cùng, nhiều thuật toán học sâu cho ta một số bảo đảm về kết quả đạt được ở mỗi bước. Ví dụ, trong phần III của cuốn sách này, một số thuật toán suy luận gần đúng hoạt động bằng cách sử dụng các nghiệm đại số cho các bài toán tối ưu. Thông thường, những thuật toán này có thể được gỡ lỗi bằng cách kiểm tra từng bảo đảm. Một số đảm bảo mà một số thuật toán tối ưu thoả mãn bao gồm: hàm mục tiêu sẽ không tăng sau một bước của thuật toán, gradient tương ứng với một tập con nào đó của các biến sẽ bằng $0$ sau mỗi bước của thuật toán, hay gradient tương ứng với tất cả các biến sẽ bằng $0$ khi mạng hội tụ. Thông thường, do sai số làm tròn, các điều kiện này sẽ không được đảm bảo chính xác trong một máy tính kỹ thuật số, vì vậy các phép thử thử gỡ lỗi nên bao gồm thêm một số tham số dung sai.

11.6 Ví dụ: Nhận dạng số có nhiều chữ số

Để cung cấp một mô tả hoàn chỉnh từ đầu đến cuối về cách áp dụng nguyyên lý thiết kế trong thực tế, chúng tôi sẽ mô tả ngắn gọn về hệ thống phiên mã địa chỉ Street View, từ quan điểm thiết kế các thành phần học sâu. Rõ ràng, nhiều thành phần khác trong hệ thống hoàn chỉnh, chẳng hạn như các xe ô tô được thiết lập dành riêng cho Street View, hạ tầng cơ sở dữ liệu, v.v…, cũng có vai trò vô cùng quan trọng.

Từ quan điểm của tác vụ học máy, quá trình thực hiện bắt đầu với việc thu thập dữ liệu. Những chiếc xe thu thập dữ liệu thô, sau đó chúng được gán nhãn bởi con người. Tác vụ phiên mã bắt đầu khi đã có một lượng lớn dữ liệu được chọn lọc, bao gồm cả việc sử dụng các kỹ thuật học máy khác để phát hiện số nhà trước khi phiên mã chúng.

Dự án phiên mã bắt đầu với việc lựa chọn các thang đo hiệu suất và giá trị mong muốn của các thang đo này. Một nguyên tắc chung quan trọng là điều chỉnh lựa chọn thang đo cho mục tiêu kinh doanh của dự án. Một bản đồ chỉ hữu ích khi nó có độ chính xác cao, vì vậy độ chính xác cao là yêu cầu rất quan trọng trong dự án này. Cụ thể, mục tiêu của chúng tôi là đạt được mức độ chính xác ở mức như con người, tức là $98\%$. Mức độ chính xác này có thể không phải lúc nào cũng khả thi. Để đạt được nó, hệ thống phiên mã Street View phải hi sinh độ phủ. Do đó, độ phủ trở thành thước đo hiệu suất chính, được tối ưu hóa trong suốt dự án, với độ chính xác giữ cố định ở mức $98\%$. Dần dà, khi mạng tích chập được cải thiện, chúng tôi có thể giảm ngưỡng tin cậy - đại lượng quyết định mạng sẽ thực hiện phiên mã hay từ chối một địa chỉ - để đạt được độ bao phủ vượt trên cả mục tiêu $95%$.

Sau khi chọn các mục tiêu định lượng, bước tiếp theo trong phương pháp luận mà chúng tôi đề xuất là nhanh chóng thiết lập một mô hình cơ sở hợp lý. Đối với các tác vụ về thị giác, lựa chọn phổ biển là một mạng tích chập với các đơn vị tuyến tính hiệu chỉnh. Dự án phiên mã bắt đầu với một mô hình như vậy. Vào thời điểm đó, một mạng tích chập cho đầu ra là một chuỗi các dự đoán vẫn chưa phổ biến. Để bắt đầu với mô hình cơ sở đơn giản nhất có thể, đầu tiên chúng tôi cài đặt tầng đầu ra của mô hình bao gồm $n$ đơn vị softmax khác nhau để dự đoán một chuỗi gồm $n$ ký tự. Các đơn vị softmax này được huấn luyện chính xác tương tự như với tác vụ phân lớp, được huấn luyện độc lập với nhau.

Phương pháp mà chúng tôi khuyến nghị là lặp đi lặp lại việc tinh chỉnh mô hình cơ sở và kiểm tra xem mỗi thay đổi có cải thiện được gì hay không. Thay đổi đầu tiên trong hệ thống phiên mã Street View được thúc đẩy bởi lý thuyết về thang đo độ phủ và cấu trúc của dữ liệu. Cụ thể, mạng từ chối phân loại một đầu vào $\boldsymbol{x}$ khi thấy xác suất của chuỗi đầu ra $p(\boldsymbol{y} | \boldsymbol{x}) < t$, với $t$ là một ngưỡng được định trước. Ban đầu, định nghĩa của $p(\boldsymbol{y} | \boldsymbol{x})$ đơn giản chỉ là dựa trên phép nhân toàn bộ các đầu ra softmax với nhau. Điều này thúc đẩy sự phát triển của một tầng đầu ra chuyên biệt và hàm chi phí thực sự tính toán một logarit hàm hợp lý có chủ đích. Cách tiếp cận này cho phép mô hình thực hiện cơ chế từ chối mẫu đầu hiệu quả hơn.

Tại thời điểm này, độ phủ vẫn ở dưới mức $90\%$, mặc dù hướng tiếp cận này không có vấn đề rõ ràng nào về mặt lý thuyết. Do đó, phương pháp luận của chúng tôi đề xuất đo lường tập huấn luyện và tập kiểm thử để xác định xem vấn đề là quá khớp hay vị khớp. Trong trường hợp này, sai số tập trên tập huấn luyện và trên tập kiểm thử đã gần giống nhau. Thật vậy, lý do chính mà dự án này tiến hành rất suôn sẻ là sự sẵn có của một tập dữ liệu với hàng chục triệu mẫu đã được gán nhãn. Sai số trên tập huấn luyện và kiểm thử rất gần nhau gợi ý cho chúng tôi rằng vấn đề ở đây là vị khớp hoặc dữ liệu huấn luyện. Một trong những chiến lược gỡ lỗi đã được đề xuất là xét các lỗi tệ nhất của mô hình. Trong trường hợp này, có nghĩa là quan sát trực tiếp các phiên mã không chính xác trong tập huấn luyện mà mô hình đã đưa ra với độ tin cậy cao nhất. Kết quả cho thấy những mẫu lỗi này có ảnh đầu vào bị cắt gọt quá sát, làm mất một vài số chữ số của địa chị. Ví dụ, một ảnh của địa chỉ $“1849”$ có thể bị cắt quá sát, chỉ còn lại phần ảnh chứa nội dung $“849”$. Vấn đề này đã có thể được giải quyết bằng cách dành vài tuần để nâng cao độ chính xác của hệ thống phát hiện vùng chữ số trong địa chỉ nhằm định vị các vùng cắt. Tuy nhiên, nhóm nghiên cứu đã đưa ra một quyết định thực tế hơn nhiều, chỉ đơn giản là mở rộng chiều rộng của vùng cắt rộng hơn so với dự đoán ban đầu của mô hình một cách có hệ thống. Thay đổi đơn giản này giúp tăng thêm $10\%$ độ phủ của hệ thống.

Một vài phần trăm cuối cùng của hiệu suất đến từ việc điều chỉnh các siêu tham số. Điều chỉnh này chủ yếu bao gồm việc làm cho mô hình lớn hơn nhưng vẫn duy trì một số giới hạn về chi phí tính toán. Bởi vì sai số huấn luyện và sai số kiểm thử vẫn gần như bằng nhau, nên rõ ràng rằng hiệu suất thiếu hụt là do vị khớp và một số vấn đề còn lại với chính tập dữ liệu.

Nhìn chung, dự án phiên mã là một thành công lớn, cho phép hàng trăm triệu địa chỉ được phiên mã nhanh hơn và với chi phí thấp hơn nhiều so với cách làm thủ công.

Chúng tôi hy vọng rằng các nguyên lý thiết kế được mô tả trong chương này sẽ mang đến thành công của nhiều hệ thống tương tự khác.


Việt hóa hình ảnh: Phạm Hoàng Nhật
Người dịch: Toàn, Nguyễn Thị Ngọc Ánh, Quang Lê, Trang Le, Soan Duong, Xuan Tu, lhlong, Trần Duy Thanh, Võ Tấn Phát, LA, Lê Việt Hùng

DeepLearning Book VN

DeepLearning Book VN

Sách DeepLearning phiên bản Việt ngữ

rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora