2016-06-07 27 views
7

Tôi cố gắng để làm theo các hướng dẫn trên Udacity tensorflow nơi tôi đi qua hai dòng sau cho các mô hình từ nhúng:Tensorflow tiêu cực lấy mẫu

# Look up embeddings for inputs. 
    embed = tf.nn.embedding_lookup(embeddings, train_dataset) 
    # Compute the softmax loss, using a sample of the negative labels each time. 
    loss = tf.reduce_mean(tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, 
         embed, train_labels, num_sampled, vocabulary_size)) 

Bây giờ tôi hiểu rằng tuyên bố thứ hai là cho lấy mẫu nhãn tiêu cực. Nhưng câu hỏi đặt ra là làm cách nào để biết được các nhãn tiêu cực là gì? Tất cả tôi đang cung cấp chức năng thứ hai là đầu vào hiện tại và nhãn tương ứng của nó cùng với số lượng nhãn mà tôi muốn (phủ định) mẫu từ. Không phải là có nguy cơ lấy mẫu từ bộ đầu vào trong chính nó?

Đây là toàn bộ ví dụ: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/udacity/5_word2vec.ipynb

Trả lời

8

Bạn có thể tìm thấy những tài liệu cho tf.nn.sampled_softmax_loss()here. Thậm chí còn có một lời giải thích tốt về Lấy mẫu ứng cử viên do TensorFlow cung cấp here (pdf).


Làm cách nào để biết nhãn tiêu cực là gì?

TensorFlow sẽ chọn ngẫu nhiên các lớp phủ định trong tất cả các lớp có thể (cho bạn, tất cả các từ có thể).

Không có nguy cơ lấy mẫu từ bộ đầu vào trong chính nó?

Khi bạn muốn tính xác suất softmax cho nhãn thực của mình, bạn tính toán: logits[true_label]/sum(logits[negative_sampled_labels]. Vì số lượng các lớp là rất lớn (kích thước từ vựng), có rất ít xác suất để lấy mẫu true_label làm nhãn âm.
Dù sao, tôi nghĩ TensorFlow sẽ loại bỏ hoàn toàn khả năng này khi lấy mẫu ngẫu nhiên. (EDIT: @ Alex khẳng định TensorFlow thực hiện điều này theo mặc định)

+5

"Tôi nghĩ TensorFlow sẽ loại bỏ hoàn toàn khả năng này khi lấy mẫu ngẫu nhiên". Chính xác! Có cờ: 'remove_accidental_hits': Một bool. có nên xóa "các lần truy cập tình cờ" trong đó một lớp được lấy mẫu bằng một trong các lớp mục tiêu hay không. Mặc định là True.' – Alex

+0

Có ai biết cách cung cấp trọng lượng lấy mẫu không? –

1

Candidate sampling giải thích cách hàm tổn thất lấy mẫu được tính:

  • Tính hàm tổn thất trong một tập hợp con C của tất cả các mẫu huấn luyện L, trong đó C = T ⋃ S, T là các mẫu trong các lớp đích và S là các mẫu được chọn ngẫu nhiên trong tất cả các lớp.

Mã bạn cung cấp sử dụng tf.nn.embedding_lookup để nhận các thông tin nhập [batch_size, dim] embed.

Sau đó nó sử dụng tf.nn.sampled_softmax_loss để có được hàm tổn thất lấy mẫu:

  • softmax_weights: Một tensor hình dạng [num_classes, mờ].
  • softmax_biases: Một hàng chục hình dạng [num_classes]. Các thành kiến ​​của lớp.
  • nhúng: Hàng chục hình dạng [batch_size, dim].
  • train_labels: Hàng chục hình dạng [batch_size, 1]. Các lớp mục tiêu T.
  • num_sampled: Một int. Số lượng các lớp để lấy mẫu ngẫu nhiên cho mỗi lô. các lớp học bị làm mờ trong S.
  • từ vựng_size: Số lượng các lớp có thể.
  • sampled_values: mặc định log_uniform_candidate_sampler

Đối với một mẻ, các mẫu mục tiêu chỉ là train_labels (T). Nó chọn num_sampled mẫu từ embed ngẫu nhiên (S) làm mẫu âm tính.

Mẫu sẽ thống nhất lấy mẫu từ embed liên quan đến softmax_wiehgt và softmax_bias. Kể từ embed là nhúng [train_dataset] (của hình dạng [batch_size, embedding_size]), nếu embeddings [train_dataset [i]] chứa train_labels [i], nó có thể được chọn trở lại, sau đó nó không phải là nhãn âm.

Theo Candidate sampling trang 2, có các loại khác nhau. Đối với NCE và lấy mẫu âm, NEG = S, có thể chứa một phần của T; cho mẫu được lấy mẫu, softmax lấy mẫu, NEG = S-T xóa rõ ràng T.

Thật vậy, đó có thể là cơ hội lấy mẫu từ bộ tàu.

Các vấn đề liên quan