Tôi nên làm gì khi mạng lưới thần kinh của tôi không học?


147

Tôi đang đào tạo một mạng lưới thần kinh nhưng tổn thất đào tạo không giảm. Làm thế nào tôi có thể sửa lỗi này?

Tôi không hỏi về việc quá mức hoặc chính quy. Tôi đang hỏi về cách giải quyết vấn đề mà hiệu suất mạng của tôi không cải thiện trên tập huấn luyện .


Câu hỏi này có chủ ý chung chung để các câu hỏi khác về cách huấn luyện mạng lưới thần kinh có thể được đóng lại như một bản sao của câu hỏi này, với thái độ "nếu bạn cho một người đàn ông một con cá bạn cho anh ta ăn trong một ngày, nhưng nếu bạn dạy Người đàn ông để câu cá, bạn có thể nuôi anh ta đến hết cuộc đời. " Xem chủ đề Meta này để thảo luận: Cách tốt nhất để trả lời các câu hỏi "mạng thần kinh của tôi không hoạt động, vui lòng sửa"?

Nếu mạng lưới thần kinh của bạn không khái quát tốt, hãy xem: Tôi nên làm gì khi mạng lưới thần kinh của tôi không khái quát tốt?


1
Đây là trường hợp NN không thể tiến triển. youtu.be/iakFfOmanJU?t=144
Joshua

4
Blog của Ivanov " Lý do tại sao Mạng thần kinh của bạn không hoạt động ", đặc biệt là các phần II, III và IV, có thể hữu ích.
dùng5228

Câu trả lời:


187

Kiểm tra đơn vị là bạn của bạn

Có một câu nói của các nhà văn rằng "Tất cả các văn bản là viết lại" - đó là, phần lớn hơn của văn bản đang sửa đổi. Đối với các lập trình viên (hoặc ít nhất là các nhà khoa học dữ liệu), biểu thức có thể được đặt lại thành cụm từ "Tất cả mã hóa là gỡ lỗi."

Bất cứ khi nào bạn viết mã, bạn cần xác minh rằng nó hoạt động như dự định. Phương pháp tốt nhất tôi từng tìm thấy để xác minh tính chính xác là chia mã của bạn thành các phân đoạn nhỏ và xác minh rằng mỗi phân đoạn hoạt động. Điều này có thể được thực hiện bằng cách so sánh đầu ra phân khúc với những gì bạn biết là câu trả lời chính xác. Điều này được gọi là thử nghiệm đơn vị . Viết bài kiểm tra đơn vị tốt là một phần quan trọng để trở thành một nhà thống kê / nhà khoa học dữ liệu / chuyên gia học máy / chuyên gia mạng lưới thần kinh giỏi. Đơn giản là không có sự thay thế.

Bạn phải kiểm tra xem mã của bạn không có lỗi trước khi bạn có thể điều chỉnh hiệu suất mạng! Nếu không, bạn cũng có thể sắp xếp lại các ghế trên RMS Titanic .

Có hai tính năng của mạng nơ-ron khiến việc xác minh thậm chí còn quan trọng hơn so với các loại mô hình thống kê hoặc học máy khác.

  1. Các mạng nơ-ron không phải là thuật toán "ngoài luồng" theo cách hồi quy rừng hoặc logistic ngẫu nhiên. Ngay cả đối với các mạng đơn giản, chuyển tiếp nguồn cấp dữ liệu, phần lớn người dùng sẽ đưa ra nhiều quyết định về cách cấu hình, kết nối, khởi tạo và tối ưu hóa mạng. Điều này có nghĩa là viết mã, và viết mã có nghĩa là gỡ lỗi.

  2. Ngay cả khi một mã mạng thần kinh thực thi mà không đưa ra một ngoại lệ, mạng vẫn có thể có lỗi! Những lỗi này thậm chí có thể là loại xảo quyệt mà mạng sẽ đào tạo, nhưng bị mắc kẹt ở một giải pháp tối ưu phụ, hoặc mạng kết quả không có kiến ​​trúc mong muốn. ( Đây là một ví dụ về sự khác biệt giữa lỗi cú pháp và ngữ nghĩa .)

Bài trung bình này , " Cách kiểm tra mã máy học ," của Chase Roberts thảo luận về kiểm thử đơn vị cho các mô hình học máy chi tiết hơn. Tôi đã mượn ví dụ này về mã lỗi từ bài viết:

def make_convnet(input_image):
    net = slim.conv2d(input_image, 32, [11, 11], scope="conv1_11x11")
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv2_5x5")
    net = slim.max_pool2d(net, [4, 4], stride=4, scope='pool1')
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv3_5x5")
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv4_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool2')
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv5_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool3')
    net = slim.conv2d(input_image, 32, [1, 1], scope="conv6_1x1")
    return net

Bạn có thấy lỗi không? Nhiều thao tác khác nhau không thực sự được sử dụng vì các kết quả trước đó được ghi đè bằng các biến mới. Sử dụng khối mã này trong mạng sẽ vẫn được đào tạo và các trọng số sẽ cập nhật và tổn thất thậm chí có thể giảm - nhưng mã chắc chắn không thực hiện được những gì đã dự định. (Tác giả cũng không nhất quán về việc sử dụng dấu ngoặc đơn hoặc dấu ngoặc kép nhưng đó hoàn toàn là phong cách.)

Các lỗi lập trình phổ biến nhất liên quan đến mạng thần kinh là

  • Các biến được tạo nhưng không bao giờ được sử dụng (thường là do lỗi sao chép-dán);
  • Biểu thức cho cập nhật gradient là không chính xác;
  • Cập nhật trọng lượng không được áp dụng;
  • Các hàm mất không được đo theo thang đo chính xác (ví dụ, tổn thất entropy chéo có thể được biểu thị theo xác suất hoặc nhật ký)
  • Mất mát không phù hợp với nhiệm vụ (ví dụ: sử dụng tổn thất entropy chéo phân loại cho một nhiệm vụ hồi quy).

Bò trước khi bạn đi bộ; Đi bộ trước khi bạn chạy

Mạng lưới thần kinh rộng và sâu, và mạng lưới thần kinh với hệ thống dây điện kỳ ​​lạ, là điều nóng nhất hiện nay trong học máy. Nhưng những mạng lưới này không hoàn toàn hình thành sự tồn tại; nhà thiết kế của họ đã xây dựng nên chúng từ các đơn vị nhỏ hơn. Đầu tiên, xây dựng một mạng nhỏ với một lớp ẩn duy nhất và xác minh rằng nó hoạt động chính xác. Sau đó, tăng dần độ phức tạp của mô hình bổ sung và xác minh rằng mỗi trong số chúng cũng hoạt động.

  • Quá ít tế bào thần kinh trong một lớp có thể hạn chế sự biểu diễn mà mạng học được, gây ra sự phù hợp. Quá nhiều tế bào thần kinh có thể gây ra sự phù hợp quá mức vì mạng sẽ "ghi nhớ" dữ liệu đào tạo.

    Ngay cả khi bạn có thể chứng minh rằng, về mặt toán học, chỉ có một số lượng nhỏ tế bào thần kinh cần thiết để mô hình hóa một vấn đề, thì thường có trường hợp có thêm một vài tế bào thần kinh giúp trình tối ưu hóa dễ dàng tìm thấy cấu hình "tốt". (Nhưng tôi không nghĩ có ai hiểu đầy đủ lý do tại sao lại như vậy.) Tôi cung cấp một ví dụ về vấn đề này trong bối cảnh của vấn đề XOR ở đây: Không phải các lần lặp của tôi cần đào tạo NN cho XOR với MSE <0,001 quá cao? .

  • Việc chọn số lượng các lớp ẩn cho phép mạng tìm hiểu một sự trừu tượng hóa từ dữ liệu thô. Học sâu là tất cả những cơn thịnh nộ ngày nay, và các mạng với một số lượng lớn các lớp đã cho thấy kết quả ấn tượng. Nhưng việc thêm quá nhiều lớp ẩn có thể gây rủi ro quá mức hoặc làm cho việc tối ưu hóa mạng rất khó khăn.

  • Chọn một mạng lưới thông minh có thể làm rất nhiều công việc cho bạn. Là nguồn dữ liệu của bạn có thể tuân theo kiến ​​trúc mạng chuyên ngành? Mạng thần kinh chuyển đổi có thể đạt được kết quả ấn tượng trên các nguồn dữ liệu, dữ liệu hình ảnh hoặc âm thanh "có cấu trúc". Mạng thần kinh định kỳ có thể làm tốt các loại dữ liệu tuần tự, chẳng hạn như ngôn ngữ tự nhiên hoặc dữ liệu chuỗi thời gian. Kết nối còn lại có thể cải thiện các mạng chuyển tiếp thức ăn sâu.

Đào tạo mạng lưới thần kinh giống như chọn khóa

Để đạt được kết quả hiện đại, hoặc thậm chí chỉ đơn thuần là kết quả tốt, bạn phải thiết lập tất cả các bộ phận được cấu hình để hoạt động tốt với nhau . Thiết lập cấu hình mạng thần kinh thực sự học được rất nhiều như chọn khóa: tất cả các phần phải được xếp thành hàng vừa phải. Cũng như không đủ để có một bộ tách đơn ở đúng vị trí, cũng không đủ để chỉ có kiến ​​trúc, hoặc chỉ có trình tối ưu hóa, được thiết lập chính xác.

Điều chỉnh các lựa chọn cấu hình không thực sự đơn giản như nói rằng một loại lựa chọn cấu hình (ví dụ: tốc độ học tập) ít nhiều quan trọng hơn các loại khác (ví dụ: số lượng đơn vị), vì tất cả các lựa chọn này tương tác với tất cả các lựa chọn khác, vì vậy một sự lựa chọn có thể làm tốt kết hợp với sự lựa chọn khác được thực hiện ở nơi khác .

Đây là danh sách không đầy đủ các tùy chọn cấu hình không phải là tùy chọn chính quy hoặc tùy chọn tối ưu hóa số.

Tất cả các chủ đề này là lĩnh vực hoạt động nghiên cứu.

Tối ưu hóa không lồi là khó

Hàm mục tiêu của mạng nơ ron chỉ lồi khi không có đơn vị ẩn, tất cả các kích hoạt là tuyến tính và ma trận thiết kế là toàn hạng - vì cấu hình này là một vấn đề hồi quy thông thường.

Trong tất cả các trường hợp khác, vấn đề tối ưu hóa là không lồi và tối ưu hóa không lồi là khó. Những thách thức của việc đào tạo mạng lưới thần kinh là nổi tiếng (xem: Tại sao khó đào tạo mạng lưới thần kinh sâu? ). Ngoài ra, các mạng thần kinh có số lượng tham số rất lớn, điều này hạn chế chúng ta chỉ sử dụng các phương pháp bậc nhất (xem: Tại sao phương pháp của Newton không được sử dụng rộng rãi trong học máy? ). Đây là một lĩnh vực nghiên cứu rất tích cực.

  • Đặt tốc độ học tập quá lớn sẽ khiến tối ưu hóa phân kỳ, bởi vì bạn sẽ nhảy từ một bên của "hẻm núi" sang bên kia. Đặt cài đặt này quá nhỏ sẽ khiến bạn không thực hiện được bất kỳ tiến triển thực sự nào và có thể cho phép tiếng ồn vốn có trong SGD lấn át các ước tính độ dốc của bạn.

  • Cắt độ dốc quy mô lại định mức của độ dốc nếu nó vượt quá ngưỡng nào đó. Tôi đã từng nghĩ rằng đây là một tham số thiết lập và quên, thường là 1.0, nhưng tôi thấy rằng tôi có thể làm cho một mô hình ngôn ngữ LSTM tốt hơn đáng kể bằng cách đặt nó thành 0,25. Tôi không biết tại sao lại như vậy.

  • Lập kế hoạch tỷ lệ học tập có thể làm giảm tỷ lệ học tập trong quá trình đào tạo. Theo kinh nghiệm của tôi, cố gắng sử dụng lập lịch rất giống với regex : nó thay thế một vấn đề ("Làm thế nào để tôi học tiếp tục sau một kỷ nguyên nhất định?") Với hai vấn đề ("Làm thế nào để tôi học tiếp tục sau một kỷ nguyên nhất định ? "Và" Làm thế nào để tôi chọn một lịch trình tốt? "). Những người khác nhấn mạnh rằng lập kế hoạch là cần thiết. Tôi sẽ để bạn quyết định.

  • Chọn kích thước xe buýt nhỏ tốt có thể ảnh hưởng gián tiếp đến quá trình học tập, vì một lô nhỏ lớn hơn sẽ có xu hướng có phương sai nhỏ hơn ( ) so với lô nhỏ hơn. Bạn muốn lô nhỏ đủ lớn để có thể cung cấp thông tin về hướng của độ dốc, nhưng đủ nhỏ để SGD có thể thường xuyên hóa mạng của bạn.

  • Có một số biến thể về độ dốc dốc ngẫu nhiên sử dụng động lượng, tốc độ học tập thích ứng, cập nhật Nesterov, v.v để cải thiện vanilla SGD. Thiết kế một trình tối ưu hóa tốt hơn là một lĩnh vực nghiên cứu tích cực. Vài ví dụ:

  • Khi mới ra mắt, trình tối ưu hóa Adam đã tạo ra rất nhiều sự quan tâm. Nhưng một số nghiên cứu gần đây đã phát hiện ra rằng SGD với động lượng có thể thực hiện các phương pháp gradient thích ứng cho các mạng thần kinh. " Giá trị cận biên của các phương pháp chuyển đổi thích nghi trong học máy " của Ashia C. Wilson, Rebecca Roelofs, Mitchell Stern, Nathan Srebro, Benjamin Recht

  • Nhưng mặt khác, bài báo gần đây này đề xuất một trình tối ưu hóa tỷ lệ học tập thích ứng mới, được cho là sẽ thu hẹp khoảng cách giữa các phương pháp tỷ lệ thích ứng và SGD với động lượng. " Đóng khoảng cách khái quát hóa của các phương pháp Gradient thích ứng trong việc đào tạo mạng lưới thần kinh sâu " của Jinghui Chen, Quanquan Gu

    Các phương pháp gradient thích ứng, sử dụng thông tin độ dốc lịch sử để tự động điều chỉnh tốc độ học tập, đã được quan sát để khái quát hóa kém hơn so với độ dốc dốc ngẫu nhiên (SGD) với động lực trong việc đào tạo mạng lưới thần kinh sâu. Điều này để lại cách thu hẹp khoảng cách khái quát hóa của các phương thức gradient thích ứng là một vấn đề mở. Trong công việc này, chúng tôi chỉ ra rằng các phương thức gradient thích ứng như Adam, Amsgrad, đôi khi "quá thích nghi". Chúng tôi thiết kế một thuật toán mới, được gọi là phương pháp ước lượng động lượng thích ứng một phần (Padam), hợp nhất Adam / Amsgrad với SGD để đạt được kết quả tốt nhất từ ​​cả hai thế giới. Các thử nghiệm về điểm chuẩn tiêu chuẩn cho thấy Padam có thể duy trì tốc độ hội tụ nhanh như Adam / Amsgrad trong khi khái quát hóa cũng như SGD trong việc đào tạo mạng lưới thần kinh sâu.

Bình thường hóa

Quy mô của dữ liệu có thể tạo ra sự khác biệt lớn về đào tạo.

Chính quy

Chọn và điều chỉnh chính quy mạng là một phần quan trọng trong việc xây dựng một mô hình khái quát tốt (nghĩa là một mô hình không phù hợp với dữ liệu đào tạo). Tuy nhiên, tại thời điểm mạng của bạn đang vật lộn để giảm tổn thất về dữ liệu đào tạo - khi mạng không học - việc chính quy hóa có thể làm mờ vấn đề là gì.

Khi mạng của tôi không học, tôi tắt tất cả các chương trình chính quy và xác minh rằng mạng không chính quy hoạt động chính xác. Sau đó, tôi thêm từng phần chính quy trở lại và xác minh rằng mỗi phần đó hoạt động trên đường đi.

Chiến thuật này có thể xác định chính xác nơi một số chính quy có thể được thiết lập kém. Một số ví dụ

Giữ một Nhật ký thí nghiệm

Khi tôi thiết lập mạng thần kinh, tôi không mã hóa bất kỳ cài đặt tham số nào. Thay vào đó, tôi thực hiện điều đó trong một tệp cấu hình (ví dụ: JSON) được đọc và sử dụng để điền chi tiết cấu hình mạng khi chạy. Tôi giữ tất cả các tập tin cấu hình. Nếu tôi thực hiện bất kỳ sửa đổi tham số, tôi tạo một tệp cấu hình mới. Cuối cùng, tôi viết thêm ý kiến ​​về tất cả các tổn thất mỗi epoch cho đào tạo và xác nhận.

k

Lấy ví dụ, tôi muốn tìm hiểu về các mô hình ngôn ngữ LSTM, vì vậy tôi đã quyết định tạo một bot Twitter viết các tweet mới để đáp lại những người dùng Twitter khác. Tôi đã làm việc này trong thời gian rảnh, giữa trường học và công việc của tôi. Mất khoảng một năm và tôi đã lặp đi lặp lại khoảng 150 mô hình khác nhau trước khi đến một mô hình đã làm những gì tôi muốn: tạo văn bản tiếng Anh mới (loại) có ý nghĩa. (Một điểm dính chính và một phần lý do khiến phải mất quá nhiều nỗ lực, là nó không đủ để chỉ mất một lượng nhỏ mẫu, vì các mô hình tổn thất thấp ban đầu đã quản lý để ghi nhớ dữ liệu đào tạo, do đó, nó chỉ tái tạo các khối nguyên văn của văn bản để trả lời các lời nhắc - phải mất một số điều chỉnh để làm cho mô hình trở nên tự phát hơn và vẫn có tổn thất thấp.)


11
Có rất nhiều lời khuyên tốt ở đó. Thật thú vị khi có nhiều bình luận của bạn giống với các bình luận tôi đã đưa ra (hoặc đã thấy những người khác đưa ra) liên quan đến việc gỡ lỗi ước tính các tham số hoặc dự đoán cho các mô hình phức tạp với các sơ đồ lấy mẫu MCMC. (Ví dụ: mã có thể hoạt động khi không được triển khai chính xác.)
Glen_b

11
@Glen_b Tôi không nghĩ rằng các thực tiễn tốt nhất về mã hóa nhận được đủ sự nhấn mạnh trong hầu hết các chương trình giảng dạy thống kê / máy học, đó là lý do tại sao tôi nhấn mạnh điểm đó rất nhiều. Tôi đã thấy một số bài viết NN trong đó OP đã để lại một bình luận như hiện tại. Tôi đã tìm thấy một lỗi bây giờ. Nó
Sycorax

7
Tôi dạy một chương trình cho khóa học khoa học dữ liệu về python và chúng tôi thực sự thực hiện các chức năng và kiểm tra đơn vị vào ngày đầu tiên, như là các khái niệm chính. Chiến đấu tốt.
Matthew Drury

8
+1 cho "Tất cả mã hóa là gỡ lỗi". Tôi ngạc nhiên khi có nhiều áp phích trên SO dường như nghĩ rằng mã hóa là một bài tập đơn giản đòi hỏi ít nỗ lực; ai ngờ mã của họ hoạt động chính xác ngay lần đầu tiên họ chạy nó; và những người dường như không thể tiến hành khi nó không. Điều buồn cười là họ đúng một nửa: mã hóa thì dễ - nhưng lập trình thì khó.
Bob Jarvis

41

Các câu trả lời được đăng là rất tốt, và tôi muốn thêm một vài "Kiểm tra Sanity" đã giúp tôi rất nhiều trong quá khứ.

1) Huấn luyện mô hình của bạn trên một điểm dữ liệu duy nhất. Nếu điều này hoạt động, đào tạo nó trên hai đầu vào với đầu ra khác nhau.

Điều này xác minh một vài điều. Đầu tiên, nó nhanh chóng cho bạn thấy rằng mô hình của bạn có thể học bằng cách kiểm tra xem mô hình của bạn có thể vượt quá dữ liệu của bạn hay không. Trong trường hợp của tôi, tôi liên tục mắc phải những sai lầm ngớ ngẩn khi làm Dense(1,activation='softmax')so Dense(1,activation='sigmoid')với dự đoán nhị phân và lần đầu tiên đưa ra kết quả rác.

Nếu mô hình của bạn không thể phù hợp với một vài điểm dữ liệu, thì nó quá nhỏ (điều không thể xảy ra trong thời đại ngày nay) hoặc có gì đó không đúng trong cấu trúc của nó hoặc thuật toán học tập.

2) Hãy chú ý đến mất mát ban đầu của bạn.

L= =-0,3ln(0,5)-0,7ln(0,5)0,7

-0,3ln(0,99)-0,7ln(0,01)= =3.2

Bạn có thể nghiên cứu thêm về điều này bằng cách làm cho mô hình của bạn dự đoán trên một vài nghìn ví dụ và sau đó lập biểu đồ cho các kết quả đầu ra. Điều này đặc biệt hữu ích để kiểm tra xem dữ liệu của bạn có được chuẩn hóa chính xác không. Ví dụ, nếu bạn kỳ vọng đầu ra của mình bị lệch nhiều về 0, thì có thể nên chuyển đổi đầu ra dự kiến ​​(dữ liệu đào tạo của bạn) bằng cách lấy căn bậc hai của đầu ra dự kiến. Điều này sẽ tránh các vấn đề về độ dốc cho sigmoids bão hòa, ở đầu ra.

3) Tổng quát hóa đầu ra mô hình của bạn để gỡ lỗi

Ví dụ, hãy tưởng tượng bạn đang sử dụng LSTM để đưa ra dự đoán từ dữ liệu chuỗi thời gian. Có thể trong ví dụ của bạn, bạn chỉ quan tâm đến dự đoán mới nhất, vì vậy LSTM của bạn đưa ra một giá trị duy nhất chứ không phải một chuỗi. Chuyển LSTM để trả về dự đoán ở mỗi bước (trong máy ảnh, đây là return_sequences=True). Sau đó, bạn có thể xem kết quả đầu ra ở trạng thái ẩn sau mỗi bước và đảm bảo chúng thực sự khác nhau. Một ứng dụng của điều này là để đảm bảo rằng khi bạn che giấu các chuỗi của mình (nghĩa là đệm chúng với dữ liệu để làm cho chúng có độ dài bằng nhau), LSTM sẽ bỏ qua chính xác dữ liệu bị che của bạn. Nếu không khái quát mô hình của bạn, bạn sẽ không bao giờ tìm thấy vấn đề này .

4) Nhìn vào các lớp riêng lẻ

Tensorboard cung cấp một cách hữu ích để trực quan hóa đầu ra lớp của bạn . Điều này có thể giúp đảm bảo rằng đầu vào / đầu ra được chuẩn hóa đúng trong mỗi lớp. Nó cũng có thể bắt các kích hoạt lỗi. Bạn cũng có thể truy vấn các kết quả đầu ra của lớp trong máy ảnh trên một loạt các dự đoán và sau đó tìm kiếm các lớp có kích hoạt sai lệch đáng ngờ (tất cả là 0 hoặc tất cả khác không).

5) Xây dựng mô hình đơn giản hơn trước

Bạn đã quyết định rằng cách tiếp cận tốt nhất để giải quyết vấn đề của bạn là sử dụng CNN kết hợp với máy dò hộp giới hạn, xử lý thêm các hình ảnh và sau đó sử dụng LSTM để kết hợp mọi thứ. Phải mất 10 phút để GPU của bạn khởi tạo mô hình của bạn.

Thay vào đó, hãy tạo một loạt dữ liệu giả (cùng hình dạng) và chia mô hình của bạn thành các thành phần. Sau đó, tạo các mô hình giả thay cho từng thành phần ("CNN" của bạn chỉ có thể là một tổ hợp 2x2 20 bước duy nhất, LSTM chỉ với 2 đơn vị ẩn). Điều này sẽ giúp bạn đảm bảo rằng cấu trúc mô hình của bạn là chính xác và không có vấn đề ngoại lai. Tôi đã vật lộn một lúc với một mô hình như vậy và khi tôi thử một phiên bản đơn giản hơn, tôi phát hiện ra rằng một trong các lớp không được che dấu đúng cách do lỗi máy ảnh. Bạn có thể dễ dàng (và nhanh chóng ) truy vấn các lớp mô hình nội bộ và xem bạn đã thiết lập biểu đồ của mình một cách chính xác chưa.

6) Chuẩn hóa các phiên bản tiền xử lý và gói của bạn

Mạng lưới thần kinh nói riêng cực kỳ nhạy cảm với những thay đổi nhỏ trong dữ liệu của bạn. Ví dụ, hai gói tải hình ảnh phổ biến là cv2PIL. Chỉ cần mở JPEG, cả hai gói này sẽ tạo ra hình ảnh hơi khác nhau . Sự khác biệt thường rất nhỏ, nhưng đôi khi bạn sẽ thấy hiệu suất mô hình giảm xuống do loại công cụ này. Ngoài ra, nó làm cho việc gỡ lỗi trở thành một cơn ác mộng: bạn có điểm xác nhận trong quá trình đào tạo và sau đó, bạn sử dụng một trình tải khác nhau và nhận được độ chính xác khác nhau trên cùng một tập dữ liệu.

Vì vậy, nếu bạn đang tải xuống mô hình của ai đó từ github, hãy chú ý đến quá trình tiền xử lý của họ. Những gì họ sử dụng bộ tải hình ảnh? Những thói quen tiền xử lý hình ảnh nào họ sử dụng? Khi thay đổi kích thước một hình ảnh, họ sử dụng phép nội suy nào? Đầu tiên họ có thay đổi kích thước và sau đó bình thường hóa hình ảnh? Hoặc cách khác xung quanh? Thứ tự kênh cho hình ảnh RGB là gì?

Cách an toàn nhất để chuẩn hóa các gói là sử dụng một requirements.txttệp phác thảo tất cả các gói của bạn giống như khi thiết lập hệ thống đào tạo của bạn, cho đến keras==2.1.5số phiên bản. Về lý thuyết sau đó, sử dụng Docker cùng với GPU như trên hệ thống đào tạo của bạn sẽ tạo ra kết quả tương tự.


7
(+1) Kiểm tra tổn thất ban đầu là một gợi ý tuyệt vời. Tôi rất tiếc rằng tôi đã để nó ra khỏi câu trả lời của tôi.
Sycorax

7
Đảm bảo rằng mô hình của bạn có thể phù hợp hơn là một ý tưởng tuyệt vời. Tôi đã quá quen với việc nghĩ về việc thừa cân là một điểm yếu mà tôi không bao giờ nghĩ rõ ràng (cho đến khi bạn đề cập đến nó) rằng khả năng tập luyện quá sức thực sự là một điểm mạnh.
John Coleman

15

Đừng đào tạo một mạng lưới thần kinh để bắt đầu!

Tất cả các câu trả lời đều rất hay, nhưng có một điểm cần được đề cập: có gì để học từ dữ liệu của bạn không? (có thể được coi là một loại thử nghiệm).

Nếu nhãn bạn đang cố gắng dự đoán là độc lập với các tính năng của bạn, thì có khả năng mất đào tạo sẽ có một thời gian khó giảm.

Thay vào đó, hãy bắt đầu hiệu chỉnh hồi quy tuyến tính, một khu rừng ngẫu nhiên (hoặc bất kỳ phương pháp nào bạn thích có số lượng siêu đường kính thấp và hành vi mà bạn có thể hiểu).

Sau đó, nếu bạn đạt được hiệu suất tốt trên các mô hình này (tốt hơn so với đoán ngẫu nhiên), bạn có thể bắt đầu điều chỉnh mạng thần kinh (và câu trả lời của @Sycorax sẽ giải quyết hầu hết các vấn đề).


5
xk

11

Về cốt lõi, quy trình công việc cơ bản để đào tạo mô hình NN / DNN ít nhiều luôn giống nhau:

  1. định nghĩa kiến ​​trúc NN (có bao nhiêu lớp, loại lớp nào, các kết nối giữa các lớp, chức năng kích hoạt, v.v.)

  2. đọc dữ liệu từ một số nguồn (Internet, cơ sở dữ liệu, tập hợp các tệp cục bộ, v.v.), xem xét một vài mẫu (để đảm bảo quá trình nhập đã diễn ra tốt) và thực hiện làm sạch dữ liệu nếu / khi cần. Bước này không tầm thường như mọi người thường cho là như vậy. Lý do là vì đối với các DNN, chúng ta thường xử lý các tập dữ liệu khổng lồ, một số bậc lớn hơn so với những gì chúng ta đã sử dụng, khi chúng ta phù hợp với các mô hình thống kê tham số phi tuyến chuẩn hơn (theo lý thuyết NN thuộc họ này).

  3. bình thường hóa hoặc chuẩn hóa dữ liệu theo một cách nào đó. Do NN là mô hình phi tuyến, nên việc chuẩn hóa dữ liệu có thể ảnh hưởng đến không chỉ độ ổn định số mà còn cả thời gian đào tạo và đầu ra NN (một hàm tuyến tính như chuẩn hóa không đi lại với hàm phân cấp phi tuyến).

  4. phân chia dữ liệu trong tập huấn luyện / xác nhận / kiểm tra hoặc nhiều lần nếu sử dụng xác thực chéo.

  5. đào tạo mạng lưới thần kinh, đồng thời kiểm soát tổn thất trên bộ xác nhận. Ở đây bạn có thể tận hưởng những thú vui đau khổ của việc tối ưu hóa không lồi, nơi bạn không biết có giải pháp nào tồn tại hay không, nếu có nhiều giải pháp, đó là giải pháp tốt nhất về lỗi tổng quát hóa và mức độ gần gũi của bạn nó Dĩ nhiên, việc so sánh giữa đường cong mất mát đào tạo và mất hiệu lực hướng dẫn bạn, nhưng đừng đánh giá thấp thái độ khó khăn của các NN (và đặc biệt là DNN): họ thường thể hiện (có thể giảm dần) mất đào tạo / xác nhận ngay cả khi bạn có lỗi làm tê liệt trong mã của bạn.

  6. Kiểm tra độ chính xác trên bộ kiểm tra và tạo một số sơ đồ / bảng chẩn đoán.

  7. Quay trở lại điểm 1 vì kết quả không tốt. Lặp lại nhắc nhở quảng cáo .

Tất nhiên chi tiết sẽ thay đổi dựa trên trường hợp sử dụng cụ thể, nhưng với suy nghĩ thô sơ này, chúng ta có thể nghĩ về những gì có nhiều khả năng đi sai.

Kiểm tra kiến ​​trúc cơ bản

Đây có thể là một nguồn của các vấn đề. Thông thường tôi thực hiện các kiểm tra sơ bộ này:

  • hãy tìm một kiến ​​trúc đơn giản phù hợp với vấn đề của bạn (ví dụ: MobileNetV2 trong trường hợp phân loại hình ảnh) và áp dụng một khởi tạo phù hợp (ở cấp độ này, thường sẽ làm ngẫu nhiên). Nếu điều này đào tạo chính xác về dữ liệu của bạn, ít nhất bạn biết rằng không có vấn đề rõ ràng nào trong tập dữ liệu. Nếu bạn không thể tìm thấy một kiến ​​trúc đơn giản, được thử nghiệm hoạt động trong trường hợp của bạn, hãy nghĩ đến một đường cơ sở đơn giản . Ví dụ: trình phân loại Naive Bayes để phân loại (hoặc thậm chí chỉ phân loại luôn là lớp phổ biến nhất) hoặc mô hình ARIMA để dự báo chuỗi thời gian

  • Xây dựng bài kiểm tra đơn vị. Việc bỏ qua để làm điều này (và việc sử dụng Notebook Jupyter đẫm máu) thường là nguyên nhân gốc rễ của các vấn đề trong mã NN tôi được yêu cầu xem xét, đặc biệt là khi mô hình được cho là sẽ được triển khai trong sản xuất. Vì câu trả lời được đánh giá cao nhất đã bao gồm các bài kiểm tra đơn vị, tôi sẽ chỉ thêm rằng có một thư viện hỗ trợ phát triển bài kiểm tra đơn vị cho NN (không may, chỉ trong Tensorflow, không may).

Tập huấn luyện

Kiểm tra lại dữ liệu đầu vào của bạn. Xem nếu bạn đảo ngược nhãn tập huấn luyện và tập kiểm tra, ví dụ (đã xảy ra với tôi một lần -___-) hoặc nếu bạn nhập tệp sai. Hãy xem một vài mẫu đầu vào và các nhãn liên quan và đảm bảo chúng có ý nghĩa. Kiểm tra xem dữ liệu đã chuẩn hóa có thực sự được chuẩn hóa không (hãy xem phạm vi của chúng). Ngoài ra, các bộ dữ liệu trong thế giới thực rất bẩn: để phân loại, có thể có độ nhiễu nhãn cao (các mẫu có nhãn lớp sai) hoặc để dự báo chuỗi thời gian đa biến, một số thành phần chuỗi thời gian có thể thiếu nhiều dữ liệu ( Tôi đã thấy con số cao tới 94% cho một số đầu vào).

Thứ tự tập huấn được đưa vào mạng trong quá trình huấn luyện có thể có hiệu lực. Hãy thử xáo trộn ngẫu nhiên tập huấn luyện ( không phá vỡ sự liên kết giữa đầu vào và đầu ra ) và xem liệu tổn thất đào tạo có giảm không.

Cuối cùng, cách tốt nhất để kiểm tra xem bạn có vấn đề về tập huấn luyện hay không là sử dụng tập huấn luyện khác. Nếu bạn đang thực hiện phân loại hình ảnh, thay vì hình ảnh bạn đã thu thập, hãy sử dụng bộ dữ liệu tiêu chuẩn như CIFAR10 hoặc CIFAR100 (hoặc ImageNet, nếu bạn có đủ khả năng để đào tạo về điều đó). Các bộ dữ liệu này được kiểm tra tốt: nếu mất tập luyện của bạn ở đây nhưng không phải trên tập dữ liệu gốc của bạn, bạn có thể gặp sự cố trong bộ dữ liệu.

Làm bài kiểm tra vàng

Có hai bài kiểm tra mà tôi gọi là Bài kiểm tra Vàng, rất hữu ích để tìm ra các vấn đề trong NN không được đào tạo:

  • giảm tập huấn luyện xuống 1 hoặc 2 mẫu và huấn luyện về điều này. NN cần ngay lập tức vượt qua tập huấn luyện, đạt độ chính xác 100% trên tập huấn luyện rất nhanh, trong khi độ chính xác của tập xác thực / kiểm tra sẽ về 0%. Nếu điều này không xảy ra, có một lỗi trong mã của bạn.

  • bài kiểm tra ngược lại: bạn giữ tập huấn luyện đầy đủ, nhưng bạn xáo trộn các nhãn. Cách duy nhất mà NN có thể học bây giờ là ghi nhớ tập huấn luyện, điều đó có nghĩa là tổn thất đào tạo sẽ giảm rất chậm, trong khi tổn thất kiểm tra sẽ tăng rất nhanh. Cụ thể, bạn sẽ đạt được tổn thất cơ hội ngẫu nhiên trên bộ thử nghiệm . Điều này có nghĩa là nếu bạn có 1000 lớp, bạn sẽ đạt độ chính xác 0,1%. Nếu bạn không thấy bất kỳ sự khác biệt nào giữa tổn thất đào tạo trước và sau khi xáo trộn nhãn, điều này có nghĩa là mã của bạn bị lỗi (hãy nhớ rằng chúng tôi đã kiểm tra nhãn của tập huấn luyện trong bước trước).

Kiểm tra xem số liệu đào tạo của bạn có ý nghĩa

Độ chính xác (mất 0-1) là một số liệu tồi tệ nếu bạn có sự mất cân bằng lớp mạnh. Hãy thử một cái gì đó có ý nghĩa hơn như mất entropy chéo: bạn không chỉ muốn phân loại chính xác, nhưng bạn muốn phân loại với độ chính xác cao.

Mang ra những khẩu súng lớn

Nếu không có gì giúp được, bây giờ là lúc để bắt đầu nghịch ngợm với siêu âm. Đây dễ dàng là phần tồi tệ hơn của đào tạo NN, nhưng đây là những mô hình khổng lồ, không thể nhận dạng có tham số phù hợp bằng cách giải quyết tối ưu hóa không lồi, do đó, những lần lặp này thường không thể tránh được.

  • thử các trình tối ưu hóa khác nhau: SGD đào tạo chậm hơn, nhưng nó dẫn đến lỗi tổng quát hóa thấp hơn, trong khi Adam đào tạo nhanh hơn, nhưng mất kiểm tra lại có giá trị cao hơn
  • thử giảm kích thước lô
  • tăng tốc độ học tập ban đầu, sau đó phân rã nó, hoặc sử dụng tốc độ học tập theo chu kỳ
  • thêm lớp
  • thêm các đơn vị ẩn
  • loại bỏ dần dần chính quy (có thể chuyển đổi định mức hàng loạt cho một vài lớp). Mất đào tạo bây giờ sẽ giảm, nhưng mất kiểm tra có thể tăng.
  • hình dung sự phân bố trọng lượng và độ lệch cho mỗi lớp. Tôi chưa bao giờ phải đến đây, nhưng nếu bạn đang sử dụng BatchNorm, bạn sẽ mong đợi các bản phân phối bình thường tiêu chuẩn. Xem nếu các chỉ tiêu của trọng lượng đang tăng bất thường với kỷ nguyên.
  • nếu bạn gặp một số lỗi trong thời gian đào tạo, google lỗi đó . Tôi đã lãng phí một buổi sáng trong khi cố gắng sửa một kiến ​​trúc hoạt động hoàn hảo, chỉ để biết rằng phiên bản Keras tôi đã cài đặt có hỗ trợ đa GPU bị lỗi và tôi phải cập nhật nó. Đôi khi tôi phải làm ngược lại (hạ cấp một phiên bản gói).
  • cập nhật CV của bạn và bắt đầu tìm kiếm một công việc khác :-)

+1, nhưng "Notebook Jupyter đẫm máu"? Quan tâm để nhận xét về điều đó? :)
amip

2
Đây là lý do tại sao tôi ghét Notebook Jupyter . TL; DR: trạng thái ẩn, khác biệt là một vấn đề đau đớn, bảo mật và nó khuyến khích các thực hành lập trình xấu, chẳng hạn như không sử dụng các bài kiểm tra đơn vị / hồi quy / tích hợp. Đào tạo NN đã đủ khó, mà mọi người không quên về các nguyên tắc cơ bản của lập trình.
DeltaIV

2
Tôi có thể quá tiêu cực, nhưng thật lòng tôi đã có đủ với những người nhân bản Jupyter Notebook từ GitHub, nghĩ rằng sẽ mất vài phút để điều chỉnh mã cho trường hợp sử dụng của họ và sau đó đến với tôi phàn nàn rằng không có gì hoạt động. Vì lợi ích của cripes, hãy lấy một IDE thực sự như PyCharm hoặc VisualStudio Code và tạo một mã có cấu trúc tốt, thay vì nấu một Notebook! Đặc biệt nếu bạn có kế hoạch vận chuyển mô hình vào sản xuất, nó sẽ giúp mọi việc dễ dàng hơn rất nhiều.
DeltaIV

2
Cười ngả nghiêng. 'Máy tính xách tay Jupyter' và 'thử nghiệm đơn vị' là tương quan chống.
Sycorax

2
(+1) Đây là một bài viết tốt. Các đề xuất cho các thử nghiệm ngẫu nhiên là những cách thực sự tuyệt vời để có được các mạng lỗi.
Sycorax

6

Nếu mô hình không học, có nhiều khả năng backpropagation của bạn không hoạt động. Nhưng có rất nhiều điều có thể sai với một mô hình hộp đen như Mạng lưới thần kinh, có nhiều điều bạn cần kiểm tra. Tôi nghĩ Sycorax và Alex đều cung cấp câu trả lời toàn diện rất tốt. Chỉ muốn thêm vào một kỹ thuật chưa được thảo luận.

ε

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.