Đào tạo một mạng lưới thần kinh cho hồi quy luôn dự đoán giá trị trung bình


9

Tôi đang đào tạo một mạng nơ ron tích chập đơn giản để hồi quy, trong đó nhiệm vụ là dự đoán vị trí (x, y) của một hộp trong một hình ảnh, ví dụ:

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

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

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

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

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

Đầu ra của mạng có hai nút, một cho x và một cho y. Phần còn lại của mạng là một mạng nơ ron tích chập tiêu chuẩn. Mất mát là một lỗi bình phương trung bình tiêu chuẩn giữa vị trí dự đoán của hộp và vị trí sự thật mặt đất. Tôi đang đào tạo trên 10000 hình ảnh này và xác nhận vào năm 2000.

Vấn đề tôi đang gặp phải là ngay cả sau khi được đào tạo bài bản, tổn thất vẫn không thực sự giảm. Sau khi quan sát đầu ra của mạng, tôi nhận thấy rằng mạng có xu hướng xuất các giá trị gần bằng 0, cho cả hai nút đầu ra. Do đó, dự đoán vị trí của hộp luôn là trung tâm của hình ảnh. Có một số sai lệch trong các dự đoán, nhưng luôn ở khoảng không. Dưới đây cho thấy sự mất mát:

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

Tôi đã chạy nó trong nhiều kỷ nguyên hơn so với hiển thị trong biểu đồ này và tổn thất vẫn không bao giờ giảm. Điều thú vị ở đây, sự mất mát thực sự tăng ở một điểm.

Vì vậy, có vẻ như mạng chỉ dự đoán mức trung bình của dữ liệu đào tạo, thay vì học một cách phù hợp. Bất kỳ ý tưởng về lý do tại sao điều này có thể được? Tôi đang sử dụng Adam làm trình tối ưu hóa, với tỷ lệ học tập ban đầu là 0,01 và được sử dụng làm kích hoạt


Nếu bạn quan tâm đến một số mã của tôi (Keras), thì đây là:

# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))


# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)


# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)

Là những hình ảnh trên các ví dụ hàng đầu của các mẫu thực tế của bạn? Có phải là 5 mẫu riêng biệt? Dường như không có thông tin trong các hình ảnh sẽ giúp khái quát. Ý tôi là, bạn không cần một mạng lưới thần kinh để tìm vị trí x, y của hình vuông màu trắng, bạn chỉ có thể phân tích hình ảnh và tìm kiếm một pixel trắng. Giải thích thêm một chút về tầm nhìn của bạn cho mô hình này. Có một số mô hình thời gian, theo đó bạn đang dự đoán vị trí tiếp theo?
photox

Xin chào, và vâng, hình ảnh là 5 mẫu riêng biệt. Tôi không chắc chúng được hiển thị như thế nào cho bạn, nhưng chúng phải là 5 hình vuông riêng lẻ (Tôi đã thay đổi bố cục một chút để giúp ...). Vâng, tôi nhận ra rằng bạn không cần một mạng lưới thần kinh cho nhiệm vụ này, nhưng nó chỉ là một thử nghiệm thử nghiệm để giúp tôi tìm hiểu cách thực hiện hồi quy với mạng thần kinh. Tôi không hiểu ý của bạn là gì khi không có thông tin để giúp khái quát .... Mỗi cặp huấn luyện bao gồm một hình vuông và một vectơ hai chiều của vị trí (x, y) của hình vuông. Cảm ơn :)
Karnivaurus

1
1) Hình dạng đầu vào của bạn trên lớp đối lưu đầu tiên đang sử dụng 3 kênh (rbg), nhưng dữ liệu của bạn là thang độ xám (1 kênh) 2) Bạn không cần nhiều lớp đối lưu và bộ lọc, thực tế tôi nghĩ rằng một lớp duy nhất và một số ít hạt nhân sẽ ổn.
photox

Bạn có chắc chắn rằng hình ảnh thực sự tương ứng với các mục tiêu?
dùng31264

1
Giống như @photox nói, bạn không cần các lớp đối lưu. Thêm những điều này làm cho trình tối ưu hóa khó khăn hơn để tìm ra một giải pháp tốt. Nếu bạn loại bỏ 3 lớp đối lưu, tôi nghi ngờ "mô hình" của bạn sẽ hoạt động.
Pieter

Câu trả lời:


9

Trình tối ưu hóa không thể hội tụ thành một giải pháp tối ưu (phụ). Tại sao? Vấn đề của bạn quá dễ dàng và / hoặc mô hình của bạn quá phức tạp.

Vấn đề quá dễ

Như @photox đã nói vấn đề này có thể được giải quyết chỉ với một lớp ẩn duy nhất. Tôi thậm chí nghi ngờ rằng nó có thể được thực hiện mà không có một lớp ẩn. Đó là bởi vì vấn đề này là tách biệt tuyến tính .

Hãy để tôi minh họa điều này. Tưởng tượng một mạng thần kinh không có các lớp ẩn và hàm kích hoạt tuyến tính (bạn cũng có thể gọi nó là hồi quy tuyến tính). Để tính vị trí x của hình vuông, mỗi pixel được kết nối với đầu ra x. Cột pixel đầu tiên được kết nối với trọng số . Cột thứ hai được kết nối với trọng số . Điều này tiếp tục cho đến khi cột cuối cùng (ví dụ cột ) được kết nối với weight . Vì2 / chiều cao chiều rộng n n / chiều cao chiều cao chiều cao chiều rộng1/height/width2/heightwidthnn/heightwidthheightwidthpixel là khác không (ví dụ: độ lệch bằng giá trị màu xám) kích hoạt đầu ra x bằng với tâm của hình vuông. Do đó, một hàm tuyến tính có thể tính toán vị trí của hình vuông.

Có một số giải pháp:

  • Chọn một vấn đề khó hơn, ví dụ phân loại hình ảnh
  • Thêm tiếng ồn, ví dụ như muối và hạt tiêu hoặc tiếng ồn trắng
  • Làm cho vấn đề khó hơn, ví dụ bằng cách dự đoán vị trí của hình vuông màu đỏ trong khi có rất nhiều vòng tròn có màu khác nhau trong nền

Mô hình quá phức tạp

Mô hình của bạn có một vài phần làm tăng thêm sự phức tạp trong khi không giúp trình tối ưu hóa tìm thấy một tối ưu ngọt ngào.

Ví dụ, các lớp chập. Lớp đầu tiên có 32 bộ lọc tích chập có kích thước . Bạn mong đợi những bộ lọc này học được gì? Trong phân loại hình ảnh, các bộ lọc này học cách phát hiện các cạnh, góc, độ dốc và đốm màu. Nhưng trong trường hợp này chỉ có vài bộ lọc có ý nghĩa. Tôi có thể nghĩ về cạnh từ trái sang phải và ngược lại và từ trên xuống dưới và ngược lại. Trong trường hợp của bạn, do đó có khoảng 28 bộ lọc chỉ thêm nhiễu ngẫu nhiên. Xóa chúng (hoặc chỉ toàn bộ lớp) giúp trình tối ưu hóa dễ dàng hơn rất nhiều để tìm một tối ưu hoạt động.5×5

Một ví dụ khác là trình tối ưu hóa Adam với rất nhiều tham số phụ. Trình tối ưu hóa Adam có thể hoạt động tốt với các tham số này nhưng tại sao bạn không bắt đầu với trình SGDtối ưu hóa đơn giản với các giá trị mặc định.

Do đó, bạn có thể thực hiện một số tối ưu hóa:

  • sử dụng LinearRegressiontừ scikit-learn. OK, đây không phải là điều bạn muốn nhưng tôi chỉ muốn minh họa mức độ phức tạp của mô hình này.
  • Loại bỏ các lớp đối lưu
  • Giảm kích thước của các Denselớp ẩn
  • Sử dụng trình SGDtối ưu hóa mặc định
  • Nếu bạn đang sử dụng một lớp ẩn, bạn nên thử sigmoidkích hoạt. Bạn có thể nghĩ về từng nút của lớp ẩn khi phát hiện nếu một hình vuông nằm ở một vị trí nhất định.
  • Nếu tất cả điều này không hoạt động, hãy thử nghiệm tốc độ học tập một chút để tìm hiểu xem nó quá cao hay quá thấp.

Ps

Tôi nghĩ bạn sẽ thích blogpost này của Adit Deshpande.


Hãy cho tôi biết nếu các giải pháp này đã thay đổi hành vi tối ưu hóa.
Pieter

Cảm ơn, điều đó rất hữu ích. Tôi đang làm việc để thử đề xuất của bạn. Tuy nhiên, tôi không hiểu điểm đầu tiên của bạn. Tôi bối rối không biết tại sao, nếu vấn đề quá đơn giản, thì khó tối ưu hóa hơn là một vấn đề phức tạp hơn. Đối với một mạng nhất định, tại sao một vấn đề đơn giản sẽ khó tối ưu hóa hơn một vấn đề phức tạp hơn? Trong một vấn đề đơn giản, tôi đã nghĩ rằng sẽ có độ dốc rất mạnh và tối ưu toàn cầu mạnh mẽ. Nhưng quan điểm đầu tiên của bạn nói rằng sự đơn giản của vấn đề khiến việc tối ưu hóa trở nên khó khăn, cho thấy rằng một vấn đề phức tạp hơn sẽ giúp tối ưu hóa ...
Karnivaurus

0

Có vẻ như một vấn đề quá mức điển hình. Dữ liệu của bạn không cung cấp đủ thông tin để có kết quả tốt hơn. Bạn chọn NN phức tạp với bạn đào tạo để ghi nhớ tất cả các sắc thái của dữ liệu đào tạo . Mất mát không bao giờ có thể là số không, vì nó là trên biểu đồ của bạn. BTW Có vẻ như xác thực của bạn có lỗi hoặc bộ xác thực không phù hợp để xác thực vì mất xác thực cũng bằng không.


4
Câu hỏi nói rằng mạng hầu như luôn luôn đầu ra bằng không. Đó sẽ là một trường hợp nghiêm trọng underfitting , không overfitting. Cũng không có khoảng cách giữa lỗi đào tạo và xác nhận trên đường cong học tập, cho thấy rằng quá mức không phải là vấn đề (lỗi không phải là 0, thang đo là logarit)
user20160

0

Tôi đang đối mặt với cùng một vấn đề với tập dữ liệu của tôi. Nó chỉ ra rằng trong trường hợp của tôi, các yếu tố dự đoán tập trung cao độ với phương sai rất nhỏ. Bạn nên kiểm tra phương sai của các biến dự đoán của bạn và xem nó được phân phối như thế nào.Phân phối biến tôi đang cố gắng dự đoán

Tuy nhiên, một số biến đổi trên biến đầu ra có thể được thực hiện để sửa đổi hoặc thay đổi tỷ lệ của nó. Điều này có thể dẫn đến một phân phối loại thống nhất hơn. Ví dụ, trong các nhiệm vụ nhận dạng hình ảnh, cân bằng biểu đồ hoặc tăng cường độ tương phản đôi khi hoạt động theo hướng có lợi cho việc ra quyết định chính xác.


-1

Tôi đã thực sự làm việc trên một vấn đề rất giống nhau. Về cơ bản, tôi có một loạt các chấm trên nền trắng và tôi đang đào tạo một NN để nhận ra dấu chấm được đặt trên nền trước. Cách tôi tìm thấy để làm việc là chỉ sử dụng một lớp tế bào thần kinh được kết nối đầy đủ (vì vậy là NN 1 lớp). Ví dụ, đối với hình ảnh 100x100, tôi sẽ có 10.000 nơ ron đầu vào (pixel) được kết nối trực tiếp với 2 nơ ron đầu ra (tọa độ). Trong PyTorch, khi tôi chuyển đổi các giá trị pixel thành tenxơ, nó sẽ tự động chuẩn hóa dữ liệu của tôi, bằng cách trừ giá trị trung bình và chia cho độ lệch chuẩn. Trong các vấn đề máy học bình thường, điều này là tốt, nhưng đối với một hình ảnh có thể có sự chênh lệch về số lượng pixel màu trong một hình ảnh (tức là của bạn, nơi chỉ có một vài pixel trắng). Vì thế, Tôi đã chuẩn hóa thủ công bằng cách chia tất cả các giá trị cường độ pixel cho 255 (vì vậy chúng hiện nằm trong phạm vi 0-1 mà không có kỹ thuật chuẩn hóa điển hình cố gắng khớp tất cả các giá trị cường độ cho phân phối bình thường). Sau đó, tôi vẫn gặp sự cố vì dự đoán tọa độ trung bình của các pixel trong tập huấn luyện. Vì vậy, giải pháp của tôi là đặt tỷ lệ học tập rất cao, điều này đi ngược lại với hầu hết các giảng viên và hướng dẫn ML. Thay vì sử dụng 1e-3, 1e-4, 1e-5, như hầu hết mọi người nói, tôi đã sử dụng tỷ lệ học tập là 1 hoặc 0,1 với độ dốc dốc ngẫu nhiên. Điều này đã khắc phục các sự cố của tôi và mạng của tôi cuối cùng đã học cách ghi nhớ tập huấn luyện của tôi. Nó không khái quát hóa cho một bộ kiểm tra quá tốt, nhưng ít nhất nó cũng hoạt động, đó là một giải pháp tốt hơn so với hầu hết mọi người khác đề xuất về câu hỏi của bạn. bây giờ trong phạm vi 0-1 mà không có kỹ thuật chuẩn hóa điển hình cố gắng khớp tất cả các giá trị cường độ với phân phối chuẩn). Sau đó, tôi vẫn gặp sự cố vì dự đoán tọa độ trung bình của các pixel trong tập huấn luyện. Vì vậy, giải pháp của tôi là đặt tỷ lệ học tập rất cao, điều này đi ngược lại với hầu hết các giảng viên và hướng dẫn ML. Thay vì sử dụng 1e-3, 1e-4, 1e-5, như hầu hết mọi người nói, tôi đã sử dụng tỷ lệ học tập là 1 hoặc 0,1 với độ dốc dốc ngẫu nhiên. Điều này đã khắc phục các sự cố của tôi và mạng của tôi cuối cùng đã học cách ghi nhớ tập huấn luyện của tôi. Nó không khái quát hóa cho một bộ kiểm tra quá tốt, nhưng ít nhất nó cũng hoạt động, đó là một giải pháp tốt hơn so với hầu hết mọi người khác đề xuất về câu hỏi của bạn. bây giờ trong phạm vi 0-1 mà không có kỹ thuật chuẩn hóa điển hình cố gắng khớp tất cả các giá trị cường độ với phân phối chuẩn). Sau đó, tôi vẫn gặp sự cố vì dự đoán tọa độ trung bình của các pixel trong tập huấn luyện. Vì vậy, giải pháp của tôi là đặt tỷ lệ học tập rất cao, điều này đi ngược lại với hầu hết các giảng viên và hướng dẫn ML. Thay vì sử dụng 1e-3, 1e-4, 1e-5, như hầu hết mọi người nói, tôi đã sử dụng tỷ lệ học tập là 1 hoặc 0,1 với độ dốc dốc ngẫu nhiên. Điều này đã khắc phục các sự cố của tôi và mạng của tôi cuối cùng đã học cách ghi nhớ tập huấn luyện của tôi. Nó không khái quát hóa cho một bộ kiểm tra quá tốt, nhưng ít nhất nó cũng hoạt động, đó là một giải pháp tốt hơn so với hầu hết mọi người khác đề xuất về câu hỏi của bạ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.