You are on page 1of 20

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

KHOA CÔNG NGHỆ THÔNG TIN


VÀ TRUYỀN THÔNG
========***========

Báo cáo nghiên cứu tốt nghiệp 3


TOP LIST:
designing and creating chatbots

Giáo viên hướng dẫn: PGS.T.S Nguyễn Linh Giang

Sinh viên: Mã sinh viên:

Tạ Quyền Anh 20167063

Hà Nội, ngày 30 tháng 5 năm 2021


LỜI NÓI ĐẦU
Trong những năm gần đây, khoa học công nghệ đang dần tiến đến
một tầm cao mới. Mặc dù còn mới mẻ trong lĩnh vực khoa học và công
nghệ nhưng Chatbots đang được nghiên cứu và phát triển với tốc độ
chóng mặt bởi các trung tâm nghiên cứu, các trường đại học và học
viện,… rất nhiều các lĩnh vực được ứng dụng công nghệ mới này.
Chatbots là một hình thức thô sơ của phần mềm trí tuệ nhân tạo, là một
chương trình được tạo ra từ máy tính tiến hành cuộc trò chuyện thông
qua các phương pháp nhập văn bản, âm thanh, cảm ứng có thể trả lời các
câu hỏi và xử lý các tình huống, là một công cụ có thể giao tiếp, tương
tác với con người thông qua một trí tuệ nhân tạo đã được lập trình sẵn.
Có rất nhiều công cụ cũng như thư viện hỗ trợ cho Chatbots như:
Dialogflow, Wit.ai, Watson Conversation Service, Microsoft LUIS,
Google Natural Language API, Amazon Lex,…
Đề tài: “Designing and creating chatbots” chủ yếu xây dựng trên
ngôn ngữ Python, nhận dữ liệu dataset là tập dữ liệu hội thoại từ phim để
học và có thể tương tác lại với người dùng trò chuyện.
Để làm được đề tài này em rất cảm ơn PGS.TS. Nguyễn Linh
Giang đã trực tiếp hướng dẫn em giúp em tiếp cận đề tài mặc dù điểm
xuất phát từ con số 0. Em đã nghiên cứu tìm hiểu các thuật toán để nay
có thể ứng dụng xây dựng một ứng dụng chatbot đơn giản để có thể
tương tác trực tiếp với người dùng. Em hy vọng được thầy chỉ bảo thêm
ở học kỳ sau để em có thể tiếp tục nghiên cứu sâu hơn về mảng học máy
này. Em vô cùng cảm ơn thầy.
Chương I: Mô hình hệ thống

Đầu tiên dữ liệu được user nhập vào sau đó sẽ được đưa qua lớp
nhúng embedding. Lớp nhúng này được thực hiện và gửi đến mạng
LSTM. Encoder sẽ xây dựng một chuỗi các xử lý liên hoàn sao cho output
của bước liền trước là input của bước liền sau. Khi đó tại mỗi time step sẽ
truyền đầu vào là các véc tơ đã được mã hóa ứng với mỗi từ . Encoder sẽ
trả ra 2 kết quả ở đầu ra gồm: encoder outputs đại diện cho toàn bộ câu
input trong đó mỗi véc tơ của encoder outputs đại diện cho 1 từ trong câu
và hidden state của GRU cuối cùng. hidden state sẽ được sử dụng để làm
giá trị hidden khởi tạo cho quá trình Decoder (chi tiết ở hình 1 bên dưới).
ma trận encoder outputs được sử dụng để tính attention weight tại mỗi
time step trong phrase decoder.
Sau phrase encoder ta sẽ thu được một hidden state của GRU cuối
cùng và ma trận encoder outputs đại điện cho toàn bộ câu input. Phrase
decoder có tác dụng giải mã thông tin đầu ra ở encoder thành các từ. Do
đó tại mỗi time step đều trả ra các véc tơ phân phối xác xuất của từ tại
bước đó. Từ đó ta có thể xác định được từ có khả năng xảy ra nhất tại mỗi
time step. Tại time step , mô hình sẽ kết hợp giữa decoder embedding véc
tơ đại diện cho token và ma trận encoder outputs theo cơ chế global
attention để tính ra trọng số attention weight phân bố cho vị trí từ ở câu
input lên . véc tơ context đại diện cho toàn bộ câu input sẽ được tính bằng
tích trọng số của attention weight với từng encoder véc tơ của ma trận
encoder outputs. Tiếp theo để dự báo cho từ kế tiếp ta cần kết hợp véc tơ
decoder hidden state và véc tơ context. Qúa trình này sẽ được lặp lại liên
tục cho đến khi gặp token cuối cùng là <EOS> đánh dấu vị trí cuối của
câu. Như vậy ta sẽ trải qua các bước:

-Tính decoder input chính là embedding véc tơ của từ đã biết dựa


vào embedding layer.

-Tính attention weight đánh giá mức độ tập trung của các từ input
vào từ được dự báo dựa vào ma trận encoder outputs và .

-Tính context véc tơ chính là tích có trọng số của attention weights


với các véc tơ đại diện cho mỗi từ input trong ma trận encoder
outputs.

-Truyền decoder input và last hidden state ở bước vào mô hình


decoder GRU để tính ra được decoder hidden state .

-Kết hợp decoder hidden state và context véc tơ để dự báo từ tại


time step .

Quá trình tiếp tục cho đến khi gặp token <EOS> đánh dấu kết thúc câu.

Kết quả đầu ra là chuỗi các indexes (lấy theo vocabulary) đại diện cho
từng từ tại mỗi vị trí của câu.

Nghiên cứu sử dụng mô hình Model seq2seq sẽ nhận đầu vào là 1 chuỗi
và trả ra kết quả output cũng là 1 chuỗi. Chính vì thế tên gọi của mô hình
là sequence to sequence (từ câu đến câu).
Chương II: Công nghệ sử dụng
Tensorflow
Với sự bùng nổ của lĩnh vực Trí Tuệ Nhân Tạo – A.I. trong thập kỷ
vừa qua, machine learning và deep learning rõ ràng cũng phát triển theo
cùng. Và ở thời điểm hiện tại, TensorFlow chính là thư viện mã nguồn mở
cho machine learning nổi tiếng nhất thế giới, được phát triển bởi các nhà
nghiên cứu từ Google. Việc hỗ trợ mạnh mẽ các phép toán học để tính
toán trong machine learning và deep learning đã giúp việc tiếp cận các bài
toán trở nên đơn giản, nhanh chóng và tiện lợi hơn nhiều.
Các hàm được dựng sẵn trong thư viện cho từng bài toán cho phép
TensorFlow xây dựng được nhiều neural network. Nó còn cho phép bạn
tính toán song song trên nhiều máy tính khác nhau, thậm chí trên nhiều
CPU, GPU trong cùng 1 máy hay tạo ra các dataflow graph – đồ thị luồng
dữ liệu để dựng nên các model. Nếu bạn muốn chọn con đường sự nghiệp
trong lĩnh vực A.I. này, nắm rõ những điều cơ bản của TensorFlow thực
sự rất quan trọng.
Kiến trúc của TensorFlow
Kiến trúc TensorFlow hoạt động được chia thành 3 phần:

– Tiền xử lý dữ liệu
– Dựng model
– Train và ước tính model

Cách TensorFlow hoạt động


TensorFlow cho phép các lập trình viên tạo ra dataflow graph, cấu
trúc mô tả làm thế nào dữ liệu có thể di chuyển qua 1 biểu đồ, hay 1 sê-ri
các node đang xử lý. Mỗi node trong đồ thị đại diện 1 operation toán học,
và mỗi kết nối hay edge giữa các node là 1 mảng dữ liệu đa chiều, hay
còn được gọi là ‘tensor’.

TensorFlow cung cấp tất cả những điều này cho lập trình viên theo
phương thức của ngôn ngữ Python. Vì Python khá dễ học và làm việc,
ngoài ra còn cung cấp nhiều cách tiện lợi để ta hiểu được làm thế nào các
high-level abstractions có thể kết hợp cùng nhau. Node và tensor trong
TensorFlow là các đối tượng Python, và các ứng dụng TensorFlow bản
thân chúng cũng là các ứng dụng Python.

Các operation toán học thực sự thì không được thi hành bằng
Python. Các thư viện biến đổi có sẵn thông qua TensorFlow được viết
bằng các binary C++ hiệu suất cao. Python chỉ điều hướng lưu lượng giữa
các phần và cung cấp các high-level abstraction lập trình để nối chúng lại
với nhau.
Lợi ích từ TensorFlow
Lợi ích dễ thấy nhưng quan trọng nhất mà TensorFlow cung cấp cho
việc lập trình machine learning chính là abstraction. Thay vì phải đối phó
với những tình huống rườm rà từ việc thực hiện triển khai các thuật toán,
hay tìm ra cách hợp lý để chuyển output của 1 chức năng sang input của
1 chức năng khác, giờ đây bạn có thể tập trung vào phần logic tổng thể
của 1 ứng dụng hơn. TensorFlow sẽ chăm sóc phần còn lại thay cho bạn.

Ngoài ra TensorFlow còn ung cấp các tiện ích bổ sung cho các lập
trình viên cần debug cũng như giúp bạn tự suy xét các ứng dụng
TensorFlow. Chế độ eager execution cho phép bạn đánh giá và sửa đổi
từng operation của biểu đồ 1 cách riêng biệt và minh bạch, thay vì phải
dựng toàn bộ biểu đồ dưới dạng 1 đối tượng độc lập vốn khá mơ hồ hay
phải đánh giá chung tổng thể. Cuối cùng, 1 tính năng khá độc đáo của
TensorFlow là TensorBoard. TensorBoard cho phép bạn quan sát 1 cách
trực quan những gì TensorFlow đang làm.

TensorFlow còn có nhiều cải tiến từ sự hậu thuẫn từ các ekíp thương
mại hạng A tại Google. Google không những tiếp lửa cho tiến độ nhanh
chóng cho sự phát triển đằng sau dự án, mà còn tạo ra nhiều phục vụ độc
đáo xung quanh TensorFlow để nó dễ dàng deploy và sử dụng: như silicon
TPU mình đã nói ở trên để tăng tốc hiệu suất đám mây Google, 1 online
hub cho việc chia sẻ các model được tạo với framework, sự hiện diện của
in-browser và gần gũi với mobile của framework, và nhiều hơn thế nữa…
Keras
Keras là một open source cho Neural Network được viết bởi ngôn
ngữ Python. Nó là một library được phát triển vào năm 205 bởi Francois
Chollet, là một kỹ sư nghiên cứu Deep Learning. Keras có thể sử dụng
chung với các thư viện nổi tiếng như Tensorflow, CNTK, Theano. Một số
ưu điểm của Keras như:

- Dễ sử dụng, dùng đơn giản hơn Tensor, xây dựng model nhanh.
- Run được trên cả CPU và GPU.
- Hỗ trợ xây dựng CNN , RNN hoặc cả hai. Với những người mới
tiếp cận đến Deep như mình thì mình chọn sử dụng Keras để build
model vì nó đơn giản,dễ nắm bắt hơn các thư viện khác.
Chương III: Phân tích dữ liệu
Để cung cấp dữ liệu dataset cho chatbot em đã thu thập được một
số nguồn có dataset dành cho chatbot. Link dataset:
https://www.kaggle.com/fungusamongus/chatbot-data Khi truy cập vào
link dataset ta có thể thấy được thư mục dataset như sau:

Ta chỉ cần quan tâm đến 2 file là move_lines.txt và


movie_conversations.txt. Mở file move_lines.txt ra chúng ta sẽ thấy:
Trong tập dữ liệu này bao gồm 304,713 câu hội thoại từ 1 tập phim.
Trên 1 dòng sẽ bao gồm id, tên user, tên movie, tên Nhân vật và lời thoại
của nhân vật đó. Các trường được ngăn cách nhau bởi dãy kí tự
+++$+++ và mở sang file movie_conversations.txt ta sẽ thấy:
Đây chính là file lưu giữ cuộc hội thoại của 2 user ví dụ dòng đầu tiên
của dataset sẽ là cuộc hội thoại của user0 và user2 trong bộ phim m0 với
id của lời thoại là L194 đến L197. Khi chúng ta seach lại theo id sang
file move_lines.txt chúng ta sẽ có đoạn hội thoại hoàn chỉnh. Tổng cộng
có 83,097 cuộc hội thoại từ 304,713 câu thoại. Việc phân tích dữ liệu
dataset của chatbot đã ổn định chúng ta sẽ chuyển sang bước xử lý dữ
liệu từ dataset đó.
Chương 2: Xử lý dữ liệu.
Đầu tiên chúng ta sẽ đọc dữ liệu và tách tập dữ liệu thành các câu
và sau đó loại bỏ “+++$+++” sắp xếp thành 2 tập là tập câu hỏi ques và
tập câu trả lời ans. Tương ứng với mỗi câu chúng ta có id của từng câu
đó. Chúng ta sẽ lưu id của câu hỏi và câu trả lời vào danh sách exchn.
Khi xử lý tập dữ liệu lớn thì vấn đề bộ nhớ là một vấn đề lớn chính vì
vậy để có được vector đầu ra mã hoá nóng thì chúng ta cần xoá các biến
khác khi không cần thiết để có 1 cặp câu hỏi và câu trả lời. Loại bỏ dấu
chấm câu và chuyển tất cả thành chữ thường. Vì chatbot sử dụng ngôn
ngữ tiếng anh nên chúng ta cần thêm 1 list từ viết tắt ví dụ i’m = i am
hay he’s = he is.
Sau khi xử lý ta được list câu hỏi như sau:

Và 1 list câu trả lời:


Bên cạnh đó một số dạng viết tắt được convert:

Để giảm được bộ nhớ khi sử dụng ta sẽ lọc những từ hay sử dụng hay
nói cách khác là xuất hiện trong data nhiều lần. Loại bỏ những từ ngữ ít
sử dụng để chatbot học được nhanh hơn.
1 số từ sử dụng nhiều trong data.

1 số từ ít sử dụng
Như ta thấy you xuất hiện 11899 lần trong khi 9th chỉ xuất hiện 1 lần.
Những từ vụng không có nghĩa cũng sẽ được loại bỏ ở bước này.
Sau khi loại bỏ được những từ vô nghĩa ta được 1 list từ có nghĩa

Tuy nhiên độ chính xác chỉ đến được 95%. Từ 30000 câu hội thoại ta đã
lọc được 1 từ điển các từ có nghĩa khoảng 3023 từ.
Tiếp theo chúng ta cần thêm token vào cho câu hỏi và câu trả lời

Trước train, chúng ta sẽ nhìn vào tập dữ liệu để chuyển chiều dài của các
câu cho nó giống nhau bằng cách padding. Chúng ta sẽ sử dụng một vài
ký tự đặc biệt để thêm vào câu.
1. EOS: End of sentence
2. PAD: Filler
3. SOS: Start decoding
4. OUT: Từ không có trong từ điển
Câu trả lời sẽ có dạng <SOS> answer <EOS> và OUT là những từ chưa
có trong từ điển từ có nghĩa của chúng ta. Vì mạng nơron của các thuật
toán học máy không thể xử lí dữ liệu kiểu dạng chuỗi chính vì thế mà
chúng ta cần chuyển đổi tâp dữ liệu sang dạng number. Chúng ta sẽ tạo
ra hai bộ mã hoá chuỗi sang number cho tập câu hỏi và câu trả lời đó là
bộ mã hoá encoder và bộ mã hoá decoder.

Kết quả thu được


Sau khi mã hoá chúng ta sẽ pad những chuỗi có cùng length. Và cuối
cùng là thiết lập bộ giải mã.
Chương IV: Thiết lập bộ encoder_decoder
Mô hình sqe2sqe được giới thiệu trong Learning Phrase
Representations using RNN Encoder-Decoder for Statistical Machine
Translation kể từ đó, trở thành mô hình Go-to cho Hệ thống đối thoại và
Dịch máy. Nó bao gồm hai RNN (Mạng thần kinh tái phát): Một bộ mã
hóa và một bộ giải mã. Bộ mã hóa lấy một chuỗi (câu) làm đầu vào và xử
lý một ký hiệu (từ) tại mỗi bước thời gian. Mục tiêu của nó là chuyển đổi
một chuỗi ký hiệu thành một vectơ đặc trưng có kích thước cố định chỉ
mã hóa thông tin quan trọng trong chuỗi trong khi làm mất thông tin không
cần thiết. Có thể trực quan hóa luồng dữ liệu trong bộ mã hóa dọc theo
trục thời gian, như luồng thông tin cục bộ từ đầu này đến đầu khác của
chuỗi.

Mỗi trạng thái ẩn ảnh hưởng đến trạng thái ẩn tiếp theo và trạng thái
ẩn cuối cùng có thể được xem như phần tóm tắt của dãy. Trạng thái này
được gọi là bối cảnh hoặc vectơ suy nghĩ, vì nó đại diện cho ý định của
trình tự. Từ ngữ cảnh, bộ giải mã tạo ra một chuỗi khác, một ký hiệu (từ)
tại một thời điểm. Ở đây, tại mỗi bước thời gian, bộ giải mã bị ảnh hưởng
bởi ngữ cảnh và các ký hiệu đã tạo trước đó.
Chương V: Mô hình đào tạo và các thông số

Để trainning cho cải thiện hiệu suất em đã train với thông số như
sau:
Epochs 50
Batch Size 32
Rnn size 1024
Num layer 3
Encoding embedding size 1024
Decoding embedding size 1024
Learning rate 0.001
Learning rate decay 0.9
Min learning rate 0.0001
Keep probability 0.5
Và kết quả thu được
Chương VI: Tài liệu tham khảo
[1] M. Lewkowitz, ”Bots: The future of human-computer interaction.,”
12 Feb 2014. [Online]. Available: https://chatbotsmagazine.com/bots-
the-future-of human-computerinteraction56696f7aff56

[2] J. Vanian, ”Google Adds More Brainpower to Artificial Intelligence


Research Unit in Canada,” Fortune, 21 November 2016. [Online].
Available: https://fortune.com/2016/11/21/google-canadaartificial-
intelligence/.

[3] Barak Turovsky (November 15, 2016), ”Found in translation: More


accurate, fluent sentences in Google Translate”, Google Blog, Retrieved
January 11, 2017

[4] Mike Schuster, Melvin Johnson, and Nikhil Thorat (November 22,
2016), ”Zero-Shot Translation with Google’s Multilingual Neural
Machine Translation System”, Google Research Blog, Retrieved
January 11, 2017

[5] Gil Fewster (January 5, 2017), ”The mind-blowing AI


announcement from Google that you probably missed”, freeCodeCamp,
Retrieved January 11, 2017 Artificial Intelligence Festival 2.0, NED
University of Engineering and Technology, 22 Nov 2019, Karachi,
Pakistan

[6] Arnaldo Pérez Castaño - Practical Artificial Intelligence. Machine


Learning, Bots and Agent Solutions using C_ (2018, Apress)

[7] Srikanth Machiraju, Ritesh Modi - Developing Bots with Microsoft


Bots Framework (2018, Apress)

[8] Shekhar Varshney (auth.) - Building Trading Bots Using Java (2016,
Apress)

You might also like