Trong bài tutorial Tóm tắt văn bản sử dụng mô hình Seq2seq, chúng ta đã áp dụng mô hình Seq2seq vào bài toán thực tế là Tóm tắt và tạo tiêu đề cho bài viết. Trong bài tutorial này, chúng ta sẽ tiến hành chỉnh sửa một số đoạn code trong chương trình trên để áp dụng Data pipeline (tf.data API) thay thế cho Feeddict nhằm tăng hiệu quả và tiết kiệm thời gian cho quá trình huấn luyện Model (xem thêm tại bài tutorial Sử dụng Datasets thay thế cho feed_dict).

So với chương trình đã viết tại bài tutorial Tóm tắt văn bản sử dụng mô hình Seq2seq, chúng ta giữ lại đoạn code về tiền xử lý dữ liệu sau:

Tiếp theo, ta sẽ viết hàm get_trainDatasets() để chuyển đổi dữ liệu đầu vào thành dạng Datasets của TensorFlow. Trước hết, chúng ta sử dụng tf.data.Dataset.from_tensor_slices() để tạo một Training Dataset từ src_data và tgt_data như sau:

Sau đó, ta sử dụng hàm .map() của Datasets để tiến hành tách từ trong từng câu và giới hạn độ dài của từng câu như sau:

Việc chuyển hóa dữ liệu từ words sequence sang int sequence được thực hiện bằng cách sử dụng hàm tf.contrib.lookup.index_table_from_tensor() (các từ không có trong từ điển sẽ có giá trị là giá trị int tương ứng của từ “<unk>”. Ngoài ra các bạn có thể sử dụng tf.contrib.lookup.index_table_from_file() nếu danh sách các từ vựng được lưu dưới dạng file):

Tiếp theo, chúng ta tạo input và ouput cho decoder bằng cách lần lượt thêm “<s>” và “</s>” vào tgt_data. Sau đó ta sử dụng tf.size() để tính độ dài của Encoder’s input và Decoder’s input (xem thêm tại bài tutorial Tóm tắt văn bản sử dụng mô hình Seq2seq):

Cuối cùng chúng ta tiến hành Shuffle dữ liệu, chia dữ liệu thành các batches và thêm padding để các sequence trong cùng một batch có độ dài như nhau. Ngoài ra ta cũng sử dụng prefetch() để đảm bảo GPU không phải đợi dữ liệu khi xử lý xong 1 batch:

Như vậy chúng ta đã hoàn thành việc viết hàm get_trainDatasets() để tạo Dataset cho dữ liệu đầu vào để huấn luyện Model. Đối với test data chúng ta cũng viết hàm get_testDatasets() tương tự như get_trainDatasets() nhưng đơn giản hơn do chỉ cần tạo dữ liệu cho Encoder mà không cần tạo dữ liệu cho Decoder:

Sau khi đã tạo các datasets cho train_data và test_data, chúng ta tiến hành chỉnh sử đoạn code của mô hình Seq2seq đã trình bày trong bài Xây dựng mô hình Seq2seq với Attention Mechanism. Ở đây, chúng ta chỉ cần thay thế các Placeholder và chỉnh sửa một số đoạn code nhằm phù hợp với interator của train_dataset và test_dataset. Phần lớn các đoạn code trong phần embedding, encoder, decoder, optimization đều được giữ nguyên:

Việc huấn luyện mô hình Seq2seq sử dụng Data pipeline được thực hiện như sau:

Với tham số tương tự như Mô hình đã tạo ra trong bài Tóm tắt văn bản sử dụng mô hình Seq2seq (n_epoch=10, n_sents=100.000), quá trình huấn luyện sử dụng Data pipeline chỉ mất 61.49 mins (giảm 12 mins so với 73 mins ở mô hình ban đầu):

Epoch loss_value
6 2.3472600093113782
7 2.1410149374783574
8 1.9667309322674662
9 1.8205992379506022
10 1.6929742412286286

Như vậy, chúng ta đã hoàn thành việc xây dựng mô hình Seq2seq sử dụng Data pipeline thay cho Feed_dict nhằm tăng hiệu quả và tiết kiệm thời gian cho quá trình huấn luyện Model. Các bạn có thể tham khảo Colab notebook của tutorial này trên trang Github của ItechSeeker tại đây.

 

Tài liệu tham khảo:

https://cs230-stanford.github.io/tensorflow-input-data.html

https://github.com/tensorflow/nmt/blob/master/nmt/utils/iterator_utils.py

Tháng Năm 16, 2019
ITechSeeker