Trong thực tế, điều này không khó (dựa trên việc đã mã hóa và đào tạo hàng chục MLP).
Theo nghĩa sách giáo khoa, việc hiểu được kiến trúc "đúng" là rất khó - tức là, để điều chỉnh kiến trúc mạng của bạn sao cho hiệu suất (độ phân giải) không thể được cải thiện bằng cách tối ưu hóa kiến trúc hơn nữa là điều khó, tôi đồng ý. Nhưng chỉ trong một số trường hợp hiếm hoi mới yêu cầu mức độ tối ưu hóa đó.
Trong thực tế, để đáp ứng hoặc vượt quá độ chính xác của dự đoán từ một mạng nơ-ron theo yêu cầu của bạn, bạn hầu như không cần phải dành nhiều thời gian cho kiến trúc mạng - ba lý do tại sao điều này là đúng:
hầu hết các tham số được yêu cầu để chỉ định kiến trúc mạng
là cố định sau khi bạn đã quyết định về mô hình dữ liệu của mình (số lượng tính năng trong vectơ đầu vào, liệu biến phản hồi mong muốn là số hay phân loại và nếu là loại sau thì có bao nhiêu nhãn lớp duy nhất bạn đã chọn);
một số ít tham số kiến trúc còn lại thực tế có thể điều chỉnh được, gần như luôn luôn (100% thời gian theo kinh nghiệm của tôi) bị hạn chế rất nhiều bởi các tham số kiến trúc cố định đó - tức là, giá trị của các tham số đó bị ràng buộc chặt chẽ bởi giá trị tối đa và tối thiểu; và
không nhất thiết phải xác định kiến trúc tối ưu trước khi quá trình đào tạo bắt đầu, thực tế là rất phổ biến đối với mã mạng nơron bao gồm một mô-đun nhỏ để điều chỉnh theo chương trình kiến trúc mạng trong quá trình đào tạo (bằng cách loại bỏ các nút có giá trị trọng số gần bằng 0 - thường được gọi là " cắt tỉa .")
Theo Bảng trên, kiến trúc của mạng nơ-ron hoàn toàn được xác định bởi sáu tham số (sáu ô trong lưới bên trong). Hai trong số đó (số loại lớp cho các lớp đầu vào và đầu ra) luôn là một và một - mạng nơ-ron có một lớp đầu vào duy nhất và một lớp đầu ra duy nhất. NN của bạn phải có ít nhất một lớp đầu vào và một lớp đầu ra - không hơn, không kém. Thứ hai, số lượng nút bao gồm mỗi lớp trong số hai lớp đó là cố định - lớp đầu vào, bằng kích thước của vectơ đầu vào - tức là số lượng nút trong lớp đầu vào bằng độ dài của vectơ đầu vào (thực tế một nơ-ron nữa gần như luôn được thêm vào lớp đầu vào như một nút thiên vị ).
Tương tự, kích thước lớp đầu ra được cố định bởi biến phản hồi (nút đơn cho biến phản hồi số và (giả sử sử dụng softmax, nếu biến phản hồi là nhãn lớp, số lượng nút trong lớp đầu ra đơn giản bằng số duy nhất nhãn lớp).
Điều đó chỉ để lại hai tham số mà bạn có thể quyết định - số lớp ẩn và số nút bao gồm mỗi lớp đó.
Số lớp ẩn
nếu dữ liệu của bạn có thể phân tách tuyến tính (mà bạn thường biết khi bắt đầu viết mã NN) thì bạn không cần bất kỳ lớp ẩn nào cả. (Nếu thực tế là như vậy, tôi sẽ không sử dụng NN cho vấn đề này - hãy chọn một bộ phân loại tuyến tính đơn giản hơn). Lớp đầu tiên trong số này - số lớp ẩn - gần như luôn là một. Có rất nhiều trọng lượng thực nghiệm đằng sau giả định này - trong thực tế, rất ít vấn đề không thể giải được với một lớp ẩn duy nhất trở nên hòa tan bằng cách thêm một lớp ẩn khác. Tương tự như vậy, có một sự đồng thuận là sự khác biệt về hiệu suất khi thêm các lớp ẩn bổ sung: các tình huống mà hiệu suất được cải thiện với lớp ẩn thứ hai (hoặc thứ ba, v.v.) là rất nhỏ. Một lớp ẩn là đủ cho phần lớn các vấn đề.
Trong câu hỏi của bạn, bạn đã đề cập rằng vì bất kỳ lý do gì, bạn không thể tìm thấy kiến trúc mạng tối ưu bằng cách thử-và-sai. Một cách khác để điều chỉnh cấu hình NN của bạn (mà không sử dụng thử-và-sai) là ' cắt'. Ý chính của kỹ thuật này là loại bỏ các nút khỏi mạng trong quá trình đào tạo bằng cách xác định các nút, nếu bị xóa khỏi mạng, sẽ không ảnh hưởng đáng kể đến hiệu suất mạng (tức là độ phân giải dữ liệu). (Ngay cả khi không sử dụng kỹ thuật cắt tỉa chính thức, bạn có thể biết sơ bộ về những nút nào không quan trọng bằng cách xem ma trận trọng lượng của bạn sau khi tập luyện; hãy tìm những trọng lượng rất gần bằng 0 - đó là những nút ở một trong hai đầu của những trọng lượng đó thường bị loại bỏ trong quá trình cắt tỉa.) Rõ ràng, nếu bạn sử dụng thuật toán cắt tỉa trong quá trình đào tạo thì hãy bắt đầu với cấu hình mạng có nhiều khả năng có các nút vượt quá (tức là 'có thể cắt tỉa') - nói cách khác, khi quyết định về kiến trúc mạng, lỗi ở phía nhiều nơ-ron hơn, nếu bạn thêm một bước cắt tỉa.
Nói một cách khác, bằng cách áp dụng một thuật toán cắt tỉa cho mạng của bạn trong quá trình đào tạo, bạn có thể tiến gần đến cấu hình mạng được tối ưu hơn nhiều so với bất kỳ lý thuyết tiên nghiệm nào có thể đưa ra cho bạn.
Số lượng nút bao gồm lớp ẩn
nhưng số lượng nút bao gồm lớp ẩn thì sao? Được cấp giá trị này ít nhiều không bị giới hạn - nghĩa là nó có thể nhỏ hơn hoặc lớn hơn kích thước của lớp đầu vào. Ngoài ra, như bạn có thể biết, có một núi bình luận về câu hỏi cấu hình lớp ẩn trong NN (xem Câu hỏi thường gặp về NN nổi tiếng để biết tóm tắt xuất sắc về bài bình luận đó). Có rất nhiều quy tắc dựa trên thực nghiệm, nhưng trong số này, quy tắc thường được dựa vào là kích thước của lớp ẩn nằm giữa các lớp đầu vào và đầu ra . Jeff Heaton, tác giả của " Giới thiệu về mạng thần kinh trong Java "cung cấp thêm một số quy tắc khác, được đọc lại trên trang mà tôi vừa liên kết Tương tự như vậy, việc quét tài liệu mạng nơ-ron hướng ứng dụng, gần như chắc chắn sẽ tiết lộ rằng kích thước lớp ẩn thường nằm trong khoảng đầu vào và đầu ra. Nhưng giữa không có nghĩa là ở giữa; trên thực tế, tốt hơn là đặt kích thước lớp ẩn gần với kích thước của vectơ đầu vào. Lý do là nếu lớp ẩn quá nhỏ, mạng có thể khó hội tụ. Đối với cấu hình ban đầu, sai ở kích thước lớn hơn - lớp ẩn lớn hơn mang lại cho mạng nhiều dung lượng hơn, giúp nó hội tụ, so với lớp ẩn nhỏ hơn. Thật vậy, lý do này thường được sử dụng để đề xuất kích thước lớp ẩn lớn hơn (nhiều nút hơn) lớp đầu vào - tức là bắt đầu với một kiến trúc ban đầu sẽ khuyến khích sự hội tụ nhanh chóng, sau đó bạn có thể cắt bỏ các nút 'thừa' (xác định các nút trong lớp ẩn có giá trị trọng số rất thấp và loại bỏ chúng khỏi mạng tái phân tích).