2015-11-18 45 views
12

Các tensorflow tutorial trên mô hình ngôn ngữ cho phép để tính xác suất của câu:Dự đoán từ kế tiếp bằng cách sử dụng mô hình ngôn ngữ tensorflow dụ

probabilities = tf.nn.softmax(logits) 

trong các ý kiến ​​dưới đây nó cũng quy định cụ thể một cách để dự đoán từ kế tiếp thay vì xác suất nhưng không chỉ định cách thực hiện điều này. Vậy làm thế nào để tạo ra một từ thay vì xác suất bằng cách sử dụng ví dụ này?

lstm = rnn_cell.BasicLSTMCell(lstm_size) 
# Initial state of the LSTM memory. 
state = tf.zeros([batch_size, lstm.state_size]) 

loss = 0.0 
for current_batch_of_words in words_in_dataset: 
    # The value of state is updated after processing each batch of words. 
    output, state = lstm(current_batch_of_words, state) 

    # The LSTM output can be used to make next word predictions 
    logits = tf.matmul(output, softmax_w) + softmax_b 
    probabilities = tf.nn.softmax(logits) 
    loss += loss_function(probabilities, target_words) 

Trả lời

0

Đây thực sự là một lợi thế mà hàm trả về xác suất thay vì chính từ đó. Vì nó đang sử dụng một danh sách các từ, với các xác suất liên quan, bạn có thể thực hiện tiếp tục xử lý và tăng độ chính xác của kết quả của bạn.

Để trả lời câu hỏi của bạn: Bạn có thể lấy danh sách các từ, lặp lại mặc dù nó và làm cho chương trình hiển thị từ có xác suất cao nhất.

+0

Có, tôi hiểu rằng bạn có thể mã hóa một ví dụ cho sự giống nhau không? Ngoài ra có thể có một kích thước vocab rất lớn và lặp lại cho mỗi từ trong từ vựng thực tế là không khả thi. – stackit

+0

Máy học trong tự nhiên của nó là một phương pháp tính toán cao để giải quyết một vấn đề. Tùy thuộc vào cách bạn đang đào tạo mô hình của mình, bạn có thể đã lặp lại qua nhiều lần. Trên một máy điển hình, bạn có thể lặp qua một vài triệu chuỗi trong vài giây, vì vậy nó có thể không phải là không thể xảy ra. Nếu bạn muốn cắt giảm thời gian tính toán (và sau đó về hiệu năng), bạn có thể thực hiện một cách để dừng lặp lại khi bạn tìm thấy kết quả có xác suất đủ lớn –

+0

Trong quá trình đào tạo tiền phạt nhưng không sử dụng trong quá trình sản xuất – stackit

0

Đầu ra của bạn là danh sách TensorFlow và có thể lấy đối số tối đa của nó (lớp được dự đoán nhiều nhất) với hàm TensorFlow. Đây thường là danh sách chứa các xác suất của từ tiếp theo.

Tại "Đánh giá mô hình" từ page này, danh sách đầu ra của bạn là y trong ví dụ sau:

Đầu tiên chúng ta sẽ tìm ra nơi chúng tôi dự đoán nhãn chính xác. tf.argmax là một chức năng cực kỳ hữu ích cung cấp cho bạn chỉ mục của các mục nhập cao nhất trong một tensor dọc theo một số trục . Ví dụ: tf.argmax(y,1) là nhãn mà mô hình của chúng tôi cho là rất có thể cho mỗi đầu vào, trong khi tf.argmax(y_,1) là nhãn thực. Chúng tôi có thể sử dụng tf.equal để kiểm tra xem dự đoán của chúng tôi có khớp với sự thật hay không. correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

Một cách tiếp cận khác với các từ được mã hóa trước (nhúng/mã hóa). Bạn có thể vector hóa từ của bạn (do đó nhúng chúng) với Word2vec để tăng tốc việc học, bạn có thể muốn xem xét điều này. Mỗi từ có thể được biểu diễn như một điểm trong không gian có kích thước 300 ý nghĩa và bạn có thể tự động tìm thấy "N từ" gần nhất với điểm dự đoán trong không gian tại đầu ra của mạng. Trong trường hợp đó, cách argmax để tiếp tục không hoạt động nữa và bạn có thể so sánh về sự giống nhau về cosine với những từ mà bạn thực sự muốn so sánh, nhưng tôi không chắc chắn điều này có thể gây ra sự mất ổn định về số. Trong trường hợp đó, y sẽ không đại diện cho các từ như các đối tượng địa lý, nhưng các từ nhúng trên kích thước của, giả sử, kích thước từ 100 đến 2000 theo các mô hình khác nhau. Bạn có thể Google một cái gì đó như thế này để biết thêm thông tin: "người đàn ông phụ nữ nữ hoàng từ bổ sung word2vec" để hiểu chủ đề của embeddings nhiều hơn nữa.

Lưu ý: khi tôi nói về word2vec ở đây, đó là sử dụng mô hình word2vec được đào tạo bên ngoài để giúp đào tạo của bạn chỉ có các đầu vào được nhúng trước và tạo các kết quả nhúng. Các từ tương ứng của các đầu ra đó có thể được tìm lại bằng word2vec để tìm các từ được dự đoán tương tự hàng đầu tương ứng.

Lưu ý rằng cách tiếp cận tôi đề xuất không chính xác vì nó sẽ chỉ hữu ích nếu biết chúng tôi dự đoán chính xác từ mà chúng tôi muốn dự đoán. Để có một cách tiếp cận mềm mại hơn, bạn có thể sử dụng các chỉ số ROUGE hoặc BLEU để đánh giá mô hình của bạn trong trường hợp bạn sử dụng câu hoặc cái gì đó dài hơn một từ.

+0

Điều đó không đúng chức năng cho mục đích này như là từ có khả năng nhất tiếp theo cho chuỗi hiện có cần phải được tìm thấy. – stackit

+1

Có lẽ câu hỏi của bạn không đủ chính xác? Dường như với tôi rằng 'tf.argmax (xác suất, 1)' sẽ cho bạn câu trả lời sau khi tập luyện. Cho từ có khả năng nhất là những gì mô hình được đào tạo trên và do đó nó là những gì nó sẽ _output_. Bạn có thể cần phải tinh chỉnh một chút chỉ số được đưa ra bởi các cuộc gọi chức năng tôi chỉ đưa cho bạn để có được từ trở lại từ dictionnary của bạn. –

+1

Nếu mô hình của bạn được huấn luyện để dự đoán việc nhúng từ (các từ được biểu diễn dưới dạng vectơ), bạn cần phải có một công cụ để nhúng ngược các từ của bạn. Word2vec và GloVe là mô hình tiền thưởng thú vị vì lý do đó. Nếu toàn bộ từ điển từ của bạn được nhúng dưới dạng một vector nóng cho mỗi từ, thì số được xuất từ ​​hàm của tôi ở đây là chỉ mục của từ đó trong từ điển. –

2

Bạn cần tìm argmax xác suất và dịch chỉ mục trở lại từ bằng cách đảo ngược bản đồ word_to_id. Để có được điều này để làm việc, bạn phải lưu các xác suất trong mô hình và sau đó lấy chúng từ hàm run_epoch (bạn cũng có thể lưu chỉ bản thân argmax). Dưới đây là một đoạn:

inverseDictionary = dict(zip(word_to_id.values(), word_to_id.keys())) 

def run_epoch(...): 
    decodedWordId = int(np.argmax(logits)) 
    print (" ".join([inverseDictionary[int(x1)] for x1 in np.nditer(x)]) 
    + " got" + inverseDictionary[decodedWordId] + 
    + " expected:" + inverseDictionary[int(y)]) 

Xem thực hiện đầy đủ ở đây: https://github.com/nelken/tf

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