Ước tính số lượng nơ-ron và số lớp của mạng nơ-ron nhân tạo [đóng]


76

Tôi đang tìm một phương pháp về cách tính số lớp và số lượng tế bào thần kinh trên mỗi lớp. Khi đầu vào, tôi chỉ có kích thước của vectơ đầu vào, kích thước của vectơ đầu ra và kích thước của tập huấn luyện.

Thông thường mạng tốt nhất được xác định bằng cách thử các cấu trúc liên kết mạng khác nhau và chọn mạng có ít lỗi nhất. Thật không may, tôi không thể làm điều đó.


Một điều khác mà bạn có thể cân nhắc khi cấu trúc mạng nơ-ron của mình là mức độ dư thừa giữa các tính năng của bạn. Càng dư thừa, số lượng nút bạn chọn cho lớp ẩn càng ít để mạng nơ-ron buộc phải trích xuất các tính năng liên quan. Ngược lại, nếu bạn thêm nhiều nút và lớp hơn, bạn cho phép mạng nơ-ron kết hợp lại các tính năng theo những cách phi tuyến tính mới. Tức là bạn cho phép mạng có một góc nhìn mới. Tái bút: Tôi sẽ thêm điều này như một bình luận, nhưng tôi không có đủ danh tiếng.
PARTH SURESH

Câu trả lời:


103

Đây là một vấn đề thực sự khó.

Mạng càng có nhiều cấu trúc bên trong thì mạng đó càng có khả năng thể hiện các giải pháp phức tạp tốt hơn. Mặt khác, quá nhiều cấu trúc bên trong chậm hơn, có thể khiến quá trình đào tạo bị lệch hướng hoặc dẫn đến trang bị quá mức - điều này sẽ ngăn mạng của bạn tổng quát hóa tốt dữ liệu mới.

Mọi người thường tiếp cận vấn đề này theo một số cách khác nhau:

  1. Hãy thử các cấu hình khác nhau, xem những gì hoạt động tốt nhất. Bạn có thể chia bộ đào tạo của mình thành hai phần - một phần để đào tạo, một phần để đánh giá - và sau đó đào tạo và đánh giá các cách tiếp cận khác nhau. Rất tiếc, có vẻ như trong trường hợp của bạn, phương pháp thử nghiệm này không khả dụng.

  2. Sử dụng quy tắc ngón tay cái. Rất nhiều người đã đưa ra rất nhiều phỏng đoán về cách hoạt động tốt nhất. Liên quan đến số lượng tế bào thần kinh trong lớp ẩn, mọi người đã suy đoán rằng (ví dụ) nó phải (a) nằm giữa kích thước lớp đầu vào và đầu ra, (b) được đặt thành gần (đầu vào + đầu ra) * 2/3, hoặc (c) không bao giờ lớn hơn hai lần kích thước của lớp đầu vào.

    Vấn đề với các quy tắc ngón tay cái là chúng không phải lúc nào cũng tính đến những phần thông tin quan trọng , chẳng hạn như mức độ "khó" của vấn đề, quy mô của các tập huấn luyện và kiểm tra , v.v. Do đó, các quy tắc này thường được sử dụng như những điểm khởi đầu khó khăn cho cách tiếp cận "chúng ta hãy thử-một-đống-thứ-và-xem-cái-gì-tốt-nhất".

  3. Sử dụng thuật toán điều chỉnh động cấu hình mạng. Các thuật toán như Tương quan tầng bắt đầu với một mạng tối thiểu, sau đó thêm các nút ẩn trong quá trình huấn luyện. Điều này có thể làm cho thiết lập thử nghiệm của bạn đơn giản hơn một chút và (về lý thuyết) có thể mang lại hiệu suất tốt hơn (vì bạn sẽ không vô tình sử dụng một số lượng nút ẩn không phù hợp).

Có rất nhiều nghiên cứu về chủ đề này - vì vậy nếu bạn thực sự quan tâm, có rất nhiều thứ để đọc. Kiểm tra các trích dẫn trên bản tóm tắt này , cụ thể là:


4
+1 câu trả lời rất hay. Bất cứ khi nào bạn cần điều chỉnh một tham số của mô hình, bạn có thể sử dụng kỹ thuật Xác thực chéo như trong cách tiếp cận đầu tiên. Điều này trở nên khó khăn hơn khi bạn có nhiều tham số để tối ưu hóa, một ví dụ về điều đó là libSVM thực hiện tìm kiếm lưới trên không gian của hai tham số của nó bằng cách sử dụng xác thực chéo. Các cách tiếp cận khác đã sử dụng Thuật toán di truyền để tìm hiểu cấu trúc của mạng cũng như các trọng số thông thường.
Amro

44

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 .")

nhập mô tả hình ảnh ở đây

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).


1
"Một lớp ẩn là đủ cho phần lớn các vấn đề" - vậy ... các nhiệm vụ hồi quy và phân loại tùy ý? Bạn có bằng chứng cho điều này? Đây có phải là một tham chiếu đến một lớp ẩn lý thuyết với vô số nơ-ron không?
chris

1
Tương tự, bạn có tham chiếu cho tuyên bố rằng kích thước của lớp ẩn là không bị giới hạn? 1 nút? 300k nút? Tôi đang bối rối ở đây, nhưng có rất nhiều tuyên bố trong câu trả lời này mà tôi sẽ đánh giá cao một số lời giải thích.
chris

0

Tôi đã sử dụng MLP cho một phần mềm thương mại chỉ có một lớp ẩn chỉ có một nút. Vì các nút đầu vào và nút đầu ra được cố định, tôi chỉ có thể thay đổi số lượng các lớp ẩn và chơi với sự tổng quát hóa đạt được. Tôi chưa bao giờ thực sự có sự khác biệt lớn về những gì tôi đạt được chỉ với một lớp ẩn và một nút bằng cách thay đổi số lượng lớp ẩn. Tôi chỉ sử dụng một lớp ẩn với một nút. Nó hoạt động khá tốt và cũng giảm bớt các tính toán rất hấp dẫn trong tiền đề phần mềm của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.