Xây dựng Open Chatbot bằng Deep Learning

Hiện nay, chúng ta đã quen với những Chatbot được xây dựng dựa trên các Platform có sẵn như IBM Watson Conversation, Luis, API.Ai, Amazon Lex hay FPT.AI. Tuy nhiên các platform chỉ có thể áp dụng cho các Close Chatbot như tổng đài trả lời tự động của ngân hàng, hướng dẫn đăng ký bảo hiểm trực tuyến. Chúng không thể làm được như các Open Chatbot kiểu như Siri của Apple, Cortana của Microsoft, Google Assistant, hay Alexa của Amazon.
Các bạn hãy tưởng tượng thế này, để xây dựng các Open Chatbot bằng các Platform trên thì chúng ta phải tạo ra các Intents các Entities có thể cover hàng tỷ tỷ case sử dụng của người dùng. Điều đó thật sự là bất khả thi!
Vậy các Open Chatbot được xây dựng như thế nào? Thực tế thì có rất nhiều phương pháp, rất nhiều kỹ thuật được sử dụng để tạo nên một Open Chatbot. Trong bài này, tôi muốn chia sẻ với các bạn một phương pháp như một phần cơ bản được sử dụng để tạo ra chúng. Đó là Deep Learning.

Đặt vấn đề

Ở mức high level, công việc của Chatbot là có thể xác định được response tốt nhất cho bất kỳ message nhận được. Bao gồm:
  1. Trả lời câu hỏi của người dùng
  2. Cung cấp thông tin cho người dùng
  3. Hỏi các câu hỏi tiếp theo cho người dùng
  4. Tiếp tục cuộc trò chuyện một cách tự nhiên
Chatbot cần phải hiểu được ý định các message của người dùng, xác định loại thông điệp phản hồi (câu hỏi tiếp theo, phản hồi trực tiếp,…) và phải tuân theo các quy tắc ngữ pháp và từ vựng chính xác trong khi tạo câu trả lời. Deep Learning là một trong những phương pháp hiệu quả nhất trong việc giải quyết những khó khăn này.

Hướng tiếp cận Deep Learning

Sử dụng Deep Learning trong Chatbot là một biến thể của sequence-to-sequence (Seq2Seq) model. Ý tưởng của nó là sử dụng một Recurrent Neural Netword (RNN) để mapping input sequence với một vector số. Sau đó, mapping vector này với target sequence bởi một RNN khác. Trong bài toán Chatbot thì input sequence là các input messages của người dùng còn target sequence là các responses của bot.
DL-01
High Architect
Trong phần ENCODER, một RNN bao gồm các hidden state vectors chứa đựng thông tin của các bước trước. Như trong hình trên, hidden state vector là thể hiện của 3 từ đầu tiên. Theo logic này thì hidden state vector cuối cùng trong phần ENCODER là một thể hiện tương đối chính xác của input message.
Trong phần DECODER, hidden state vector cuối cùng thể hiện các từ mà bot dự đoán sẽ trả lời. Hãy nhìn vào cell đầu tiên của DECODER, nó sẽ dự đoán từ nào trong tập từ vựng là tốt nhất cho từ đầu tiên của câu trả lời. Về mặt toán học, nó tính toán xác suất của tất cả các từ vựng và lấy từ có xác suất cao nhất.
Cell thứ hai sẽ là một hàm của vector đại diện (thought vector) và đầu ra của cell đầu tiên. Mục đích của LSTM là đánh giá xác suất có điều kiện sau:
DL-02
Tại mỗi cell từ được lựa chọn để trả lời là từ làm cho xác suất có điều kiện ở trên là cao nhất.
DL-03
Như trong hình ta sẽ thấy từ đầu tiên trong câu trả lời cho “Are you free tomorrow?” là “No”. Và cứ thế các từ tiếp theo của câu trả lời được sinh ra.

Hướng dẫn Step by step

Bước 1: Data Collection – Thu thập dữ liệu

Đầu tiên chúng ta sẽ thu tập dữ liệu. Dữ liệu để training là những đoạn hội thoại đã được lưu lại. Nguồn dữ liệu ở đây có thể là các Data Set có thể download như Cornell Movie Dialog Corpus, Microsoft’s Social Media Conversation Corpus hay các đoạn hội thoại trên Facebook, Google Hangouts, SMS, LinkedIn, Twitter, Tinder và Slack.
DL-04

Step 2: Data Pre-processing – Tiền xử lý dữ liệu

Tại bước này, các đoạn hội thoại sẽ được trích xuất ra thành các cặp input message/response. Response sẽ là label cho các input message và chúng được dùng để train cho Seq2Seq.
DL-05
Tuy nhiên việc này vẫn chưa đủ để training bởi gì dữ liệu vẫn đang ở dạng text và máy tính vẫn không thể hiểu được. Chúng ta cần làm bước tiếp theo là vector hóa những từ trong các đoạn hội thoại. Để làm điều này chúng ta sử dụng kỹ thuật Word2vec với Deep Learning (đây là một phương pháp rất phổ biến hiện nay để thể hiện một từ vựng bởi một vector số, các bạn có thể tìm hiểu sâu hơn trên Internet).
Sau bước này, chúng ta đã có dữ liệu để training.

Bước 3: Seq2Seq model training

Như trong hình minh họa High Level Architecture đầu bài báo, Seq2Seq model sẽ là mô hình tổng hợp của 2 model: ENCODER và DECODER. ENCODER sẽ tạo ra vector thể hiện của input message còn DECODER sẽ dựa vào vector thể hiện để sinh ra các từ của response.
Mỗi ENCODER, DECODER sẽ là một RNN model (cụ thể là LSTM), output layer của ENCODER là input layer của DECODER.
Chúng ta có thể dùng TensorFlow để xây dựng các model này.
encoderLSTM = tf.nn.rnn_cell.BasicLSTMCell(lstmUnits, state_is_tuple=True)
decoderFinalState = tf.contrib.legacy_seq2seq.embedding_rnn_seq2seq(encoderInputs, decoderInputs, encoderLSTM)
Sau bước này, chúng ta đã có Seq2Seq model cho Open Chatbot của mình.
Chatbot

Kết luận

Mặc dù trên thực tế việc xây dựng một Open Chatbot bao gồm rất nhiều vấn đề phức tạp chứ không chỉ đơn giản như trên. Tuy nhiên các bước này là xương sống trong việc tạo ra một Open Chatbot, giúp chúng ta hiểu được các Open Chatbot được tao ra như thế nào. Và dựa vào đó, chúng ta đã có thể xây dựng một Open Bot đơn giản cho riêng mình.
Tham khảo

No comments:

Post a Comment

The Ultimate XP Project

  (Bài chia sẻ của tác giả  Ryo Amano ) Trong  bài viết  số này, tôi muốn viết về dự án phát triển phần mềm có áp dụng nguyên tắc phát triển...