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 đó, sigmoid
hà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_logits
giả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_entropy
ngoà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_logits
cho 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ố N
cá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 sigmoid
gia đình, tf.losses.softmax_cross_entropy
cho 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, v2
phiên bản đã được giới thiệu và bản softmax_cross_entropy_with_logits
mấ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ố N
cá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.losses
phiê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ố weights
và biases
chỉ đị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, labels
khô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 softmax
tổ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.
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