Làm việc với mạng nơ-ron: danh sách kiểm tra để gỡ lỗi

Làm việc với mạng nơ-ron: danh sách kiểm tra để gỡ lỗi

Code của các sản phẩm phần mềm machine learning thường phức tạp và khá khó hiểu. Việc phát hiện và loại bỏ các lỗi trong đó là một nhiệm vụ tốn nhiều tài nguyên. Kể cả đơn giản nhất mạng lưới thần kinh chuyển tiếp đòi hỏi một cách tiếp cận nghiêm túc về kiến ​​trúc mạng, khởi tạo trọng số và tối ưu hóa mạng. Một sai sót nhỏ có thể dẫn đến những vấn đề khó chịu.

Bài viết này nói về một thuật toán để gỡ lỗi mạng lưới thần kinh của bạn.

Hộp kỹ năng khuyến nghị: khóa học thực hành Nhà phát triển Python từ đầu.

Chúng tôi nhắc nhở: cho tất cả độc giả của "Habr" - giảm giá 10 rúp khi đăng ký bất kỳ khóa học Skillbox nào bằng mã khuyến mại "Habr".

Thuật toán bao gồm năm giai đoạn:

  • khởi đầu dễ dàng;
  • xác nhận tổn thất;
  • kiểm tra kết quả trung gian và kết nối;
  • chẩn đoán tham số;
  • kiểm soát công việc.

Nếu điều gì đó có vẻ thú vị với bạn hơn những phần còn lại, bạn có thể chuyển ngay sang các phần này.

Bắt đầu dễ dàng

Mạng nơ-ron có kiến ​​trúc phức tạp, chính quy hóa và bộ lập lịch tốc độ học tập sẽ khó gỡ lỗi hơn mạng thông thường. Ở đây chúng ta đang gặp một chút khó khăn vì bản thân vấn đề này có liên quan gián tiếp đến việc gỡ lỗi, nhưng đây vẫn là một đề xuất quan trọng.

Một khởi đầu đơn giản là tạo một mô hình đơn giản hóa và huấn luyện nó trên một tập hợp (điểm) dữ liệu.

Đầu tiên chúng ta tạo một mô hình đơn giản hóa

Để bắt đầu nhanh chóng, chúng tôi tạo một mạng nhỏ với một lớp ẩn duy nhất và kiểm tra xem mọi thứ có hoạt động chính xác hay không. Sau đó, chúng tôi dần dần phức tạp hóa mô hình, kiểm tra từng khía cạnh mới của cấu trúc của nó (lớp bổ sung, tham số, v.v.) và tiếp tục.

Chúng tôi huấn luyện mô hình trên một tập hợp (điểm) dữ liệu

Để kiểm tra nhanh chóng tính chính xác cho dự án của mình, bạn có thể sử dụng một hoặc hai điểm dữ liệu đào tạo để xác nhận xem hệ thống có hoạt động chính xác hay không. Mạng lưới thần kinh phải thể hiện độ chính xác 100% trong quá trình đào tạo và kiểm tra. Nếu không đúng như vậy thì có thể mô hình quá nhỏ hoặc bạn đã gặp lỗi.

Ngay cả khi tất cả đều ổn, hãy chuẩn bị mô hình cho một hoặc nhiều kỷ nguyên trước khi tiếp tục.

Đánh giá tổn thất

Ước tính tổn thất là cách chính để tinh chỉnh hiệu suất của mô hình. Bạn cần đảm bảo rằng tổn thất phù hợp với vấn đề và các hàm tổn thất được đánh giá theo thang đo chính xác. Nếu bạn sử dụng nhiều loại tổn thất, hãy đảm bảo rằng tất cả chúng đều có cùng thứ tự và được chia tỷ lệ chính xác.

Điều quan trọng là phải chú ý đến những mất mát ban đầu. Kiểm tra xem kết quả thực tế gần với kết quả mong đợi đến mức nào nếu mô hình bắt đầu bằng một lần đoán ngẫu nhiên. TRONG Công trình của Andrey Karpathy gợi ý như sau:: “Hãy đảm bảo rằng bạn nhận được kết quả như mong đợi khi bắt đầu với một số ít tham số. Tốt hơn là nên kiểm tra ngay việc mất dữ liệu (với mức độ chính quy được đặt thành 10). Ví dụ: đối với CIFAR-2.302 với bộ phân loại Softmax, chúng tôi dự kiến ​​tổn thất ban đầu là 0,1 vì xác suất khuếch tán dự kiến ​​là 10 cho mỗi lớp (vì có 0.1 lớp) và tổn thất Softmax là khả năng ghi nhật ký âm của lớp chính xác là − ln (2.302) = XNUMX.”

Đối với ví dụ nhị phân, một phép tính tương tự được thực hiện đơn giản cho từng lớp. Ví dụ: đây là dữ liệu: 20% 0 và 80% 1. Khoản lỗ ban đầu dự kiến ​​sẽ lên tới –0,2ln (0,5) –0,8ln (0,5) = 0,693147. Nếu kết quả lớn hơn 1, điều đó có thể chỉ ra rằng trọng số của mạng thần kinh không được cân bằng hợp lý hoặc dữ liệu không được chuẩn hóa.

Kiểm tra kết quả trung gian và kết nối

Để gỡ lỗi mạng nơ-ron, cần phải hiểu động lực của các quá trình trong mạng và vai trò của từng lớp trung gian riêng lẻ khi chúng được kết nối. Dưới đây là những lỗi phổ biến bạn có thể gặp phải:

  • biểu thức không chính xác cho các bản cập nhật lớp;
  • cập nhật trọng lượng không được áp dụng;
  • độ dốc bùng nổ.

Nếu các giá trị gradient bằng XNUMX, điều này có nghĩa là tốc độ học trong trình tối ưu hóa quá chậm hoặc bạn đang gặp phải biểu thức cập nhật gradient không chính xác.

Ngoài ra, cần theo dõi các giá trị của hàm kích hoạt, trọng số và cập nhật của từng lớp. Ví dụ: mức độ cập nhật tham số (trọng số và độ lệch) phải là 1-e3.

Có một hiện tượng gọi là “Dying ReLU” hay "vấn đề độ dốc biến mất", khi các nơ-ron ReLU sẽ xuất ra giá trị XNUMX sau khi học được giá trị sai lệch âm lớn đối với các trọng số của nó. Những nơ-ron này không bao giờ được kích hoạt nữa tại bất kỳ điểm nào trong dữ liệu.

Bạn có thể sử dụng tính năng kiểm tra độ dốc để xác định các lỗi này bằng cách ước tính độ dốc bằng cách sử dụng phương pháp số. Nếu nó gần với độ dốc được tính toán thì lan truyền ngược đã được triển khai chính xác. Để tạo kiểm tra độ dốc, hãy xem các tài nguyên tuyệt vời này từ CS231 đây и đâyCũng như bài học Andrew Nga về chủ đề này.

Faizan Sheikh chỉ ra ba phương pháp chính để trực quan hóa mạng lưới thần kinh:

  • Sơ bộ là những phương pháp đơn giản cho chúng ta thấy cấu trúc chung của mô hình được đào tạo. Chúng bao gồm đầu ra của các hình dạng hoặc bộ lọc của các lớp riêng lẻ của mạng lưới thần kinh và các tham số trong mỗi lớp.
  • Dựa trên kích hoạt. Trong đó, chúng tôi giải mã hoạt động của từng tế bào thần kinh hoặc nhóm tế bào thần kinh để hiểu chức năng của chúng.
  • Dựa trên độ dốc. Các phương pháp này có xu hướng điều khiển độ dốc được hình thành từ quá trình huấn luyện mô hình tiến và lùi (bao gồm bản đồ độ nổi và bản đồ kích hoạt lớp).

Có một số công cụ hữu ích để trực quan hóa việc kích hoạt và kết nối của các lớp riêng lẻ, ví dụ: ConX и Bảng kéo.

Làm việc với mạng nơ-ron: danh sách kiểm tra để gỡ lỗi

Chẩn đoán thông số

Mạng lưới thần kinh có rất nhiều tham số tương tác với nhau, điều này làm phức tạp việc tối ưu hóa. Trên thực tế, phần này đang là chủ đề đang được các chuyên gia tích cực nghiên cứu nên những gợi ý dưới đây chỉ nên được coi là lời khuyên, điểm khởi đầu để xây dựng.

Kích cỡ gói (kích thước lô) - Nếu bạn muốn kích thước lô đủ lớn để có được ước tính độ dốc lỗi chính xác, nhưng đủ nhỏ để giảm độ dốc ngẫu nhiên (SGD) để điều chỉnh mạng của bạn. Kích thước lô nhỏ sẽ dẫn đến sự hội tụ nhanh chóng do nhiễu trong quá trình đào tạo và sau đó là những khó khăn trong việc tối ưu hóa. Điều này được mô tả chi tiết hơn đây.

Tỷ lệ học - quá thấp sẽ dẫn đến hội tụ chậm hoặc có nguy cơ bị kẹt ở cực tiểu cục bộ. Đồng thời, tốc độ học cao sẽ gây ra sự phân kỳ tối ưu hóa vì bạn có nguy cơ nhảy qua phần sâu nhưng hẹp của hàm mất mát. Hãy thử sử dụng lập lịch tốc độ để giảm tốc độ trong khi huấn luyện mạng lưới thần kinh. Cập nhật với CS231n có một phần lớn dành riêng cho vấn đề này.

Cắt chuyển màu  - cắt bớt độ dốc của tham số trong quá trình truyền ngược ở giá trị tối đa hoặc định mức biên. Hữu ích cho việc khắc phục bất kỳ độ dốc bùng nổ nào mà bạn có thể gặp phải ở điểm thứ ba.

Chuẩn hóa hàng loạt - dùng để chuẩn hóa dữ liệu đầu vào của từng lớp, giải quyết vấn đề dịch chuyển hiệp phương sai bên trong. Nếu bạn đang sử dụng Dropout và Batch Norma cùng nhau, kiểm tra bài viết này.

Giảm dần độ dốc ngẫu nhiên (SGD) — có một số loại SGD sử dụng động lượng, tốc độ học thích ứng và phương pháp Nesterov. Tuy nhiên, không ai trong số họ có lợi thế rõ ràng về cả hiệu quả học tập và tính khái quát (chi tiết ở đây).

Chính quy - rất quan trọng để xây dựng một mô hình có thể khái quát hóa, vì nó bổ sung thêm một hình phạt đối với độ phức tạp của mô hình hoặc các giá trị tham số cực trị. Đây là một cách để giảm phương sai của mô hình mà không làm tăng đáng kể độ lệch của mô hình. Hơn thông tin chi tiết - tại đây.

Để tự đánh giá mọi thứ, bạn cần tắt tính năng chính quy hóa và tự mình kiểm tra độ dốc mất dữ liệu.

Bỏ học là một phương pháp khác để hợp lý hóa mạng của bạn nhằm ngăn ngừa tắc nghẽn. Trong quá trình huấn luyện, việc bỏ học chỉ được thực hiện bằng cách duy trì hoạt động của nơ-ron với một xác suất p (siêu tham số) nhất định hoặc đặt nó về XNUMX trong trường hợp ngược lại. Do đó, mạng phải sử dụng một tập hợp con tham số khác nhau cho mỗi đợt huấn luyện, điều này làm giảm những thay đổi trong một số tham số nhất định trở nên chiếm ưu thế.

Quan trọng: Nếu bạn sử dụng cả chuẩn hóa bỏ học và chuẩn hóa hàng loạt, hãy cẩn thận về thứ tự của các thao tác này hoặc thậm chí sử dụng chúng cùng nhau. Tất cả điều này vẫn đang được tích cực thảo luận và bổ sung. Đây là hai cuộc thảo luận quan trọng về chủ đề này trên Stackoverflow и ArXiv.

Kiểm soát công việc

Đó là về việc ghi lại quy trình công việc và thử nghiệm. Nếu bạn không ghi lại bất cứ điều gì, bạn có thể quên, chẳng hạn như tốc độ học tập hoặc trọng số lớp được sử dụng. Nhờ khả năng kiểm soát, bạn có thể dễ dàng xem và tái tạo các thí nghiệm trước đó. Điều này cho phép bạn giảm số lượng thử nghiệm trùng lặp.

Tuy nhiên, việc ghi chép thủ công có thể trở thành một nhiệm vụ khó khăn trong trường hợp khối lượng công việc lớn. Đây là nơi các công cụ như Comet.ml xuất hiện để giúp bạn tự động ghi nhật ký tập dữ liệu, thay đổi mã, lịch sử thử nghiệm và mô hình sản xuất, bao gồm thông tin chính về mô hình của bạn (siêu tham số, số liệu hiệu suất mô hình và thông tin môi trường).

Mạng lưới thần kinh có thể rất nhạy cảm với những thay đổi nhỏ và điều này sẽ dẫn đến giảm hiệu suất của mô hình. Theo dõi và ghi lại công việc của bạn là bước đầu tiên bạn có thể thực hiện để chuẩn hóa môi trường và mô hình hóa của mình.

Làm việc với mạng nơ-ron: danh sách kiểm tra để gỡ lỗi

Tôi hy vọng bài đăng này có thể là điểm khởi đầu để bạn bắt đầu gỡ lỗi mạng thần kinh của mình.

Hộp kỹ năng khuyến nghị:

Nguồn: www.habr.com

Thêm một lời nhận xét