Chức năng mất nào cho các nhiệm vụ phân loại đa lớp, đa nhãn trong các mạng thần kinh?


64

Tôi đang đào tạo một mạng lưới thần kinh để phân loại một tập hợp các đối tượng thành các lớp n. Mỗi đối tượng có thể thuộc nhiều lớp cùng một lúc (đa lớp, đa nhãn).

Tôi đọc rằng đối với các vấn đề đa lớp, thông thường nên sử dụng entropy chéo mềm và phân loại là hàm mất thay vì mse và tôi hiểu ít nhiều tại sao.

Đối với vấn đề đa nhãn của tôi, tất nhiên sẽ không có ý nghĩa gì khi sử dụng softmax vì mỗi xác suất của lớp phải độc lập với nhau. Vì vậy, lớp cuối cùng của tôi chỉ là các đơn vị sigmoid nén các đầu vào của chúng vào phạm vi xác suất 0..1 cho mỗi lớp.

Bây giờ tôi không chắc tôi nên sử dụng chức năng mất nào cho việc này. Nhìn vào định nghĩa của crossentropy phân loại tôi tin rằng nó sẽ không áp dụng tốt cho vấn đề này vì nó sẽ chỉ tính đến đầu ra của các nơ-ron nên là 1 và bỏ qua những cái khác.

Entropy chéo nhị phân nghe có vẻ phù hợp hơn, nhưng tôi chỉ thấy nó từng được đề cập cho các vấn đề phân loại nhị phân với một nơron đầu ra duy nhất.

Tôi đang sử dụng python và keras để huấn luyện trong trường hợp có vấn đề.


1
Tôi tin rằng softmax "các đơn vị sigmoid nén các đầu vào của chúng vào phạm vi xác suất 0..1 cho mỗi lớp".
Hồng Ooi

Bạn có thể sử dụng softmax làm chức năng mất và sau đó sử dụng xác suất để đa nhãn dữ liệu của bạn.
balboa

Câu trả lời:


30

Nếu bạn đang sử dụng máy ảnh, chỉ cần đặt sigmoids trên lớp đầu ra và binary_crossentropy trên hàm chi phí của bạn.

Nếu bạn đang sử dụng tenorflow, thì có thể sử dụng sigmoid_cross_entropy_with_logits . Nhưng đối với trường hợp của tôi, hàm mất trực tiếp này không hội tụ. Vì vậy, tôi đã kết thúc bằng cách sử dụng mất entropy chéo sigmoid rõ ràng . Bạn có thể làm cho riêng mình như trong ví dụ này(yln(sigmoid(logits))+(1y)ln(1sigmoid(logits)))

Sigmoid, không giống như softmax không cung cấp phân phối xác suất xung quanh làm đầu ra, nhưng xác suất độc lập.nclasses

Nếu trung bình bất kỳ hàng nào được gán ít nhãn hơn thì bạn có thể sử dụng softmax_cross_entropy_with_logits vì với sự mất mát này trong khi các lớp loại trừ lẫn nhau, xác suất của chúng không cần phải có. Tất cả những gì được yêu cầu là mỗi hàng nhãn là phân phối xác suất hợp lệ. Nếu không, tính toán của gradient sẽ không chính xác.


Alok thân mến, bạn có thể giải thích cho OP về cách họ sẽ sử dụng chức năng này không và tại sao nó lại có ý nghĩa? Như bạn sẽ thấy trong chuyến tham quan , chỉ liên kết câu trả lời không được khuyến khích trên trang web.
Antoine Vernet

Một lời giải thích ngắn gọn có thể được nhìn thấy trong keras github: github.com/fchollet/keras/issues/741
Dror Hilman

1
Không nên viết hàm chi phí của riêng bạn khi sử dụng entropy chéo - nó thể bị các vấn đề ổn định số. Xem github.com/tensorflow/tensorflow/issues/2462 để thảo luận.
kbrose

Một điều là đa nhãn, một điều khác là đa lớp đa nhãn. Sigmoid đè bẹp đầu ra của bạn trong khoảng từ 0 đến 1, nhưng OP có nhiều lớp, do đó, đầu ra phải là 0 - 10. Vì vậy, các đầu ra sẽ trông: [0,5,2,3,1] <--- đây không phải là sigmoid làm.
mimoralea

Tôi nên tf.round (logits) trước khi sử dụng trong hàm chi phí hay tôi có thể trực tiếp sử dụng các bản ghi từ lớp ẩn đến tf.nn.sigmoid ....?

9

CẬP NHẬT (18/04/18): Câu trả lời cũ vẫn tỏ ra hữu ích trên mô hình của tôi. Bí quyết là mô hình hóa chức năng phân vùng và phân phối riêng biệt, do đó khai thác sức mạnh của softmax.

Xem xét vector quan sát của bạn để chứa nhãn. (1 nếu mẫu i chứa nhãn m, 0 nếu không). Vì vậy, mục tiêu sẽ là mô hình hóa ma trận theo cách trên mỗi mẫu. Do đó mô hình đánh giá . Xem xét mở rộng để đạt được hai thuộc tính:ymyim=δimF(yi,xi)=logP(yi|xi)yim=ZP(ym)

  1. Hàm phân phối:mP(ym)=1
  2. Hàm phân vùng: ước tính số lượng nhãnZ

Sau đó, đó là vấn đề mô hình hóa hai cái riêng biệt. Hàm phân phối được mô hình hóa tốt nhất với lớp softmax và chức năng phân vùng có thể được mô hình hóa bằng một đơn vị tuyến tính (trong thực tế tôi đã cắt nó ở mức . Mô hình phức tạp hơn như đơn vị Poisson có thể hoạt động tốt hơn). Sau đó, bạn có thể chọn áp dụng tổn thất phân tán (KL trên phân phối và MSE trên phân vùng) hoặc bạn có thể thử mất sau trên sản phẩm của họ.max(0.01,output)

Trong thực tế, sự lựa chọn tối ưu hóa cũng tạo ra một sự khác biệt rất lớn. Kinh nghiệm của tôi với phương pháp tiếp cận nhân tố là nó hoạt động tốt nhất theo Adadelta (Adagrad không hoạt động với tôi, chưa thử RMSprop, các màn trình diễn của SGD tùy thuộc vào tham số).

Nhận xét bên lề về sigmoid : Tôi chắc chắn đã thử sigmoid + crossentropy và nó đã không hoạt động. Mô hình có xu hướng chỉ dự đoán và không thể nắm bắt được sự biến đổi trong chức năng phân phối. (aka, bằng cách nào đó nó khá hữu ích để mô hình hóa phân vùng và có thể có lý do toán học đằng sau nó)Z

CẬP NHẬT : (Suy nghĩ ngẫu nhiên) Có vẻ như sử dụng quy trình Dirichlet sẽ cho phép kết hợp một số trước về số lượng nhãn?

CẬP NHẬT : Bằng thử nghiệm, phân kỳ KL đã sửa đổi vẫn có xu hướng cung cấp đầu ra đa lớp thay vì đầu ra đa nhãn.


(Câu trả lời cũ)

Trải nghiệm của tôi với entropy chéo sigmoid không được dễ chịu cho lắm. Hiện tại tôi đang sử dụng phân kỳ KL đã được sửa đổi. Nó có hình thức

Loss(P,Q)=x|P(x)Q(x)||logP(x)Q(x)|=x|(P(x)Q(x))logP(x)Q(x)|
Trong đó là phân phối giả đích và là phân phối giả được dự đoán (nhưng hàm thực sự đối xứng nên không thực sự quan trọng)P(x)Q(x)

Chúng được gọi là phân phối giả vì không được chuẩn hóa. Vì vậy, bạn có thể có nếu bạn có 2 nhãn cho một mẫu cụ thể.xP(x)=2

Kera

def abs_KL_div(y_true, y_pred):
    y_true = K.clip(y_true, K.epsilon(), None)
    y_pred = K.clip(y_pred, K.epsilon(), None)
    return K.sum( K.abs( (y_true- y_pred) * (K.log(y_true / y_pred))), axis=-1)

trên tập dữ liệu cụ thể của tôi, adamtốt hơn nhiều so vớirmsprop
shadi

Nếu bạn sử dụng mất như vậy cho đào tạo, làm thế nào để làm điều đó trong giai đoạn thử nghiệm? Cũng sử dụng softmax cho dự đoán, nhưng làm thế nào để chọn ngưỡng để xác định các lớp đa nhãn?
karl_TUM


0

Trên thực tế, trong tenorflow bạn vẫn có thể sử dụng sigmoid_cross_entropy_meanhàm tính toán tổn thất trong đa nhãn, tôi rất xác nhận nó


Cung cấp cho chúng tôi một liên kết đến tài liệu
Ivelin

0

Tôi là một người mới ở đây nhưng tôi sẽ thử đưa ra một câu hỏi với câu hỏi này. Tôi đã tìm kiếm điều tương tự như bạn, và cuối cùng tôi đã tìm thấy một hướng dẫn phân loại đa lớp rất tốt của máy ảnh @ http://machinelearningmastery.com/multi- class- classifying-tutorial-keras-deep-learning-l Library / .

Tác giả của hướng dẫn đó sử dụng chức năng mất entropy chéo phân loại, và có một chủ đề khác có thể giúp bạn tìm giải pháp @ tại đây .


3
Nó không chỉ đa lớp, mà còn đa nhã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.