Làm thế nào để chọn mất mát entropy chéo trong TensorFlow?


83

Các vấn đề phân loại, chẳng hạn như hồi quy logistic hoặc hồi quy logistic đa thức, tối ưu hóa tổn thất chéo entropy . Thông thường, lớp entropy chéo theo sau lớp softmax , lớp này tạo ra phân phối xác suất.

Trong dòng tensorflow, có ít nhất một tá hàm mất entropy chéo khác nhau :

  • tf.losses.softmax_cross_entropy
  • tf.losses.sparse_softmax_cross_entropy
  • tf.losses.sigmoid_cross_entropy
  • tf.contrib.losses.softmax_cross_entropy
  • tf.contrib.losses.sigmoid_cross_entropy
  • tf.nn.softmax_cross_entropy_with_logits
  • tf.nn.sigmoid_cross_entropy_with_logits
  • ...

Cái nào chỉ hoạt động cho phân loại nhị phân và cái nào thích hợp cho các bài toán nhiều lớp? Khi nào bạn nên sử dụng sigmoidthay vì softmax? Các sparsechức năng khác với những chức năng khác như thế nào và tại sao chỉ có nó softmax?

Thảo luận liên quan (thiên về toán học): Sự khác biệt giữa tất cả những mất mát entropy chéo này trong Keras và TensorFlow là gì? .


1
Ngoài ra, chúng tôi có tf.losses.log_loss, thực ra nó chỉ dành cho chéo nhị phân. Cũng github.com/tensorflow/tensorflow/issues/2462
mrgloom

Câu trả lời:


138

Sự thật sơ bộ

  • Theo nghĩa hàm, sigmoid là một trường hợp riêng của hàm softmax , khi số lớp bằng 2. Cả hai đều thực hiện cùng một phép toán: biến đổi log (xem bên dưới) thành xác suất.

    Trong phân loại nhị phân đơn giản, không có sự khác biệt lớn giữa hai loại, tuy nhiên trong trường hợp phân loại đa thức, sigmoid cho phép xử lý các nhãn không độc quyền (hay còn gọi là đa nhãn ), trong khi softmax xử lý các lớp độc quyền (xem bên dưới).

  • Một logit (còn gọi là điểm a) là một giá trị chưa định tỷ lệ nguyên liệu kết hợp với một lớp học , trước khi tính toán xác suất. Về mặt kiến ​​trúc mạng nơron, điều này có nghĩa là logit là đầu ra của một lớp dày đặc (được kết nối đầy đủ).

    Việc đặt tên cho Tensorflow hơi lạ: tất cả các hàm bên dưới đều chấp nhận log, không phải xác suất và tự áp dụng phép biến đổi (đơn giản là hiệu quả hơn).

Họ hàm Sigmoid

Như đã nêu trước đó, sigmoidhàm mất mát dành cho phân loại nhị phân. Nhưng các hàm tensorflow tổng quát hơn và cho phép thực hiện phân loại nhiều nhãn, khi các lớp độc lập. Nói cách khác, tf.nn.sigmoid_cross_entropy_with_logitsgiải quyết N các phân loại nhị phân cùng một lúc.

Các nhãn phải được mã hóa một nóng hoặc có thể chứa các xác suất lớp mềm.

tf.losses.sigmoid_cross_entropyngoài ra còn cho phép thiết lập trọng số trong lô , tức là làm cho một số ví dụ quan trọng hơn những ví dụ khác. tf.nn.weighted_cross_entropy_with_logitscho phép thiết lập trọng số của lớp (hãy nhớ rằng phân loại là nhị phân), tức là tạo ra các lỗi tích cực lớn hơn lỗi tiêu cực. Điều này rất hữu ích khi dữ liệu đào tạo không cân bằng.

Họ hàm Softmax

Các hàm mất mát này nên được sử dụng để phân loại đa thức loại trừ lẫn nhau, tức là chọn một trong số Ncác lớp. Cũng có thể áp dụng khi N = 2.

Các nhãn phải được mã hóa một nóng hoặc có thể chứa xác suất lớp mềm: một ví dụ cụ thể có thể thuộc lớp A với xác suất 50% và lớp B với xác suất 50%. Lưu ý rằng nói đúng ra nó không có nghĩa là nó thuộc cả hai lớp, nhưng người ta có thể giải thích các xác suất theo cách này.

Cũng giống như trong sigmoidgia đình, tf.losses.softmax_cross_entropycho phép đặt trọng số theo lô , tức là làm cho một số ví dụ quan trọng hơn những ví dụ khác. Theo như tôi biết, kể từ tensorflow 1.3, không có cách nào được tích hợp sẵn để đặt trọng số lớp .

[UPD] Trong tensorflow 1.5, v2phiên bản đã được giới thiệu và bản softmax_cross_entropy_with_logitsmất gốc không được chấp nhận. Sự khác biệt duy nhất giữa chúng là trong một phiên bản mới hơn, sự lan truyền ngược xảy ra đối với cả logits và nhãn ( đây là một cuộc thảo luận tại sao điều này có thể hữu ích).

Họ chức năng thưa thớt

Giống như thông thường softmaxở trên, các hàm mất mát này nên được sử dụng để phân loại đa thức loại trừ lẫn nhau, tức là chọn một trong số Ncác lớp. Sự khác biệt là trong mã hóa nhãn: các lớp được chỉ định dưới dạng số nguyên (chỉ mục lớp), không phải vectơ một nóng. Rõ ràng, điều này không cho phép các lớp mềm, nhưng nó có thể tiết kiệm một số bộ nhớ khi có hàng nghìn hoặc hàng triệu lớp. Tuy nhiên, lưu ý rằng logitsđối số vẫn phải chứa các log cho mỗi lớp, do đó nó tiêu tốn ít nhất [batch_size, classes]bộ nhớ.

Giống như ở trên, tf.lossesphiên bản có một weightsđối số cho phép đặt trọng số trong lô.

Họ hàm softmax được lấy mẫu

Các hàm này cung cấp một giải pháp thay thế khác để xử lý số lượng lớp khổng lồ. Thay vì tính toán và so sánh phân phối xác suất chính xác, họ tính toán ước tính tổn thất từ ​​một mẫu ngẫu nhiên.

Các đối số weightsbiaseschỉ định một lớp được kết nối đầy đủ riêng biệt được sử dụng để tính nhật ký cho một mẫu đã chọn.

Giống như trên, labelskhông được mã hóa một nóng, nhưng có hình dạng [batch_size, num_true].

Các chức năng được lấy mẫu chỉ thích hợp cho đào tạo. Trong thời gian thử nghiệm, chúng tôi khuyến nghị sử dụng softmaxtổn thất chuẩn (ít hoặc một nóng) để có được phân phối thực tế.

Một tổn thất thay thế khác là tf.nn.nce_loss, thực hiện ước tính tương phản tiếng ồn (nếu bạn quan tâm, hãy xem phần thảo luận rất chi tiết này ). Tôi đã đưa hàm này vào họ softmax, vì NCE đảm bảo tính gần đúng với softmax trong giới hạn.


Tôi có thể yêu cầu một điểm làm rõ về entropy chéo sigmoid (sigCE) không? Nếu nó giải quyết các Nnhiệm vụ phân loại nhị phân cùng một lúc N = prod(output.shape), chẳng hạn shape = [batch, examples, channels]; N = (batch * examples * channels)? Nếu tf.lossesmong đợi "logits" (đầu ra của mạng), tôi cũng nên trả về xác suất để dễ sử dụng? bạn có thể xem stackoverflow.com/questions/53612973/…
SumNeuron

5

Tuy nhiên, đối với phiên bản 1.5, softmax_cross_entropy_with_logits_v2phải được sử dụng thay thế, trong khi sử dụng đối số của nó với argument key=..., ví dụ

softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,
                                    logits=my_prediction, dim=-1, name=None)
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.