Thư viện Pytorch

Một phần của tài liệu MÔ HÌNH CHATBOT GIAO TIẾP, HỖ TRỢ THỦ TỤC GIẤY TỜ HÀNH CHÍNH CHO SINH VIÊN TẠI KHOA KỸ THUẬT CƠ KHÍ (Trang 94)

CHƯƠNG 4 : THIẾT KẾ VÀ XÂY DỰNG GIAO DIỆN CHO CHATBOT

4.2 Một số thư viện Python hỗ trợ luận văn

4.2.6 Thư viện Pytorch

4.2.6.1 Giới thiệu về Pytorch

PyTorch là 1 thư viện Python-based hỗ trợ tạo ra các Deep Learning models và sử dụng chúng cho các ứng dụng khác nhau. Trên thực tế, PyTorch không chỉ là 1

SVTH: LÊ TRUNG KIÊN 73 thư viện Deep Learning, mà chính là 1 package về tính tốn khoa học (scientific computing).

PyTorch, tương tự như Python, nó được thiết kế tập trung vào tính dễ sử dụng và thậm chí người dùng có kiến thức lập trình rất cơ bản cũng có thể sử dụng nó trong các dự án có liên quan đến Deep Learning.

Cấu trúc dữ liệu cốt lõi được sử dụng trong PyTorch là Tensor. Tương tự numpy array, Tensor là 1 mảng n-chiều với các phần tử có cùng kiểu dữ liệu.

Để cài đặt thư viện này, bạn cần nhập lệnh sau pip install torch.

Hình 4.5: Logo Pytorch

4.2.6.2 Tổng quan Pytorch

Xem xét pipeline cơ bản của 1 dự án PyTorch. Hình dưới đây mơ tả một quy trình cơng việc điển hình cùng với các modules quan trọng được liên kết với mỗi bước.

SVTH: LÊ TRUNG KIÊN 74 Các modules cơ bản mà chúng ta sẽ đề cập là torch.nn, torch.optim, torch.utils và torch.autograd.

4.2.6.3 Load và xử lý data

Đây luôn là một trong những bước đầu tiên trong bất kì một project về Deep Learning nào. Vì thế PyTorch đã hỗ trợ các tiện ích để thực hiện bước này với module torch.utils.data.

Hai class quan trọng trong module này là Dataset và DataLoader:

• Dataset được xây dựng trên nền kiểu dữ liệu Tensor và được sử dụng chủ yếu cho các bộ dữ liệu tùy chỉnh.

• DataLoader được sử dụng khi bạn có một tập dữ liệu lớn và bạn muốn tải dữ liệu từ Dataset ở chế độ nền để nó sẵn sàng và chờ sử dụng cho q trình training loop.

Chúng ta cũng có thể sử dụng torch.nn.DataParallel và torch.distribution trong trường hợp có thể sử dụng song song nhiều máy tính hoặc nhiều GPUs.

4.2.6.4 Xây dựng Neural Network

Module torch.nn được sử dụng để tạo Neural Network. Nó cung cấp tất cả các Neural Network layers phổ biến như các fully connected layers, convolutional layers, các hàm activation và hàm loss, v.v.

Một khi kiến trúc mạng đã được tạo ra và dữ liệu đã sẵn sàng để được feed cho mạng, chúng ta sẽ cần các kỹ thuật để cập nhật các trọng số (weights) và độ lệch (biases) để mạng tiến hành quá trình learning. Các tiện ích này được cung cấp trong module torch.optim. Cịn để tính gradient tự động, chúng ta sử dụng module torch.autograd.

SVTH: LÊ TRUNG KIÊN 75

4.2.6.5 Model Inference & Compability

Sau khi model đã được train, nó có thể được sử dụng để dự đốn output cho các test cases hoặc thậm chí các datasets mới. Quá trình này được gọi là model inference.

PyTorch cũng cung cấp TorchScript có thể được sử dụng để chạy các model độc lập với Python runtime. Đây có thể được coi là một Máy ảo được thiết kế chủ yếu dành riêng cho việc thao tác với Tensors.

Chúng ta cũng có thể convert model được train bằng PyTorch sang các định dạng như ONNX, cho phép bạn sử dụng các model này trong các Deep Learning framework khác như MXNet, CNTK, Caffe2. Bạn cũng có thể chuyển đổi các model ONNX sang TensorFlow.

4.2.7 Thư viện tkinter

Các Widget của Tkinter trong Python: Có nhiều widget khác nhau như button, canvas, checkbutton, entry, ... chúng được sử dụng để xây dụng các ứng dụng GUI trong Python.

Bảng 4.3: Các Widget của Tkinter

STT Button Mô tả

1 Button Button được sử dụng để thêm nhiều nút khác nhau vào ứng dụng python.

2 Canvas Canvas được sử dụng để vẽ các hình trên cửa sổ.

3 Checkbutton Checkbutton được sử dụng để hiển thị CheckButton trên cửa sổ.

4 Entry

Entry được sử dụng để hiển thị trường văn bản một dịng cho người dùng. Nó thường được sử dụng để nhập các giá trị của người dùng.

5 Frame Frame có thể được định nghĩa là một vùng chứa mà có thể chứa một hoặc nhiều widget khác.

6 Label Label là một văn bản được sử dụng để hiển thị một số thông báo hoặc thông tin cho các widget khác.

SVTH: LÊ TRUNG KIÊN 76 7 ListBox ListBox được sử dụng để hiển thị danh sách các tùy

chọn cho người dùng.

8 Menubutton Menubutton được sử dụng để hiển thị các mục menu cho người dùng.

9 Menu Menu được sử dụng để thêm các mục menu cho người dùng.

10 Message Message được sử dụng để hiển thị hộp tin nhắn cho người dùng.

11 Radiobutton Người dùng được cung cấp các tùy chọn khác nhau và người dùng chỉ có thể chọn một tùy chọn trong số đó. 12 Scale Nó được sử dụng để cung cấp thanh trượt cho người

dùng.

13 Scrollbar Nó cung cấp thanh cuộn cho người dùng để người dùng có thể cuộn cửa sổ lên và xuống.

14 Text

Nó khác với Entry vì nó cung cấp một trường văn bản nhiều dòng cho người dùng để người dùng có thể viết văn bản và chỉnh sửa văn bản bên trong nó.

15 Toplevel Nó được sử dụng để tạo một vùng chứa cửa sổ riêng biệt.

16 Spinbox Nó là một widget mục nhập được sử dụng để chọn từ các tùy chọn của các giá trị.

17 PanedWindow Nó giống như một widget container chứa các ô ngang hoặc dọc.

18 LabelFrame LabelFrame là một widget vùng chứa hoạt động như một container.

18 MessageBox Nó được sử dụng để hiển thị hộp thơng báo trong các ứng dụng desktop.

Tkinter cung cấp các phương thức để bố cục các widget sau:

1. Phương thức pack():

Phương thức pack() được sử dụng để tổ chức widget theo khối. Vị trí các widget được thêm vào ứng dụng python bằng phương thức pack() có thể được kiểm sốt bằng cách sử dụng các tùy chọn khác nhau được chỉ định trong lệnh gọi phương thức.

SVTH: LÊ TRUNG KIÊN 77

Hình 4.7: Ví dụ phương thức pack() Tkinter

2. Phương thức grid()

Trình quản lý layout grid() sắp xếp các widget ở dạng bảng. Chúng ta có thể chỉ định các hàng và cột. Chúng ta cũng có thể chỉ định khoảng cột (chiều rộng) hoặc chiều dài hàng (chiều cao) của widget con.

Hình 4.8: Ví dụ phương thức grid() Tkinter

3. Phương thức place()

Trình quản lý layout place() sắp xếp các widget theo các tọa độ x và y.

Hình 4.9: Ví dụ phương thức place() Tkinter

4.3 Xây dựng, thiết kế chương trình cho chatbot 4.3.1 Mục đích và nội dung chương trình 4.3.1 Mục đích và nội dung chương trình

Chương trình chatbot được viết bằng ngơn ngữ Python kết hợp với việc sử dụng thư viện Pytorch và một số thư viện hỗ trợ khác có mục đích nghe câu hỏi để trả lời, phân tích và lưu trữ dữ liệu người dùng. Tăng khả năng tác với người dùng trực quan

SVTH: LÊ TRUNG KIÊN 78 và hiệu quả. Để đạt được những mục tiêu đó, chương trình cần phải giải quyết được các nội dung sau:

• Khả năng xử lý ngơn ngữ tự nhiên.

• Đào tạo dữ liệu các gói câu hỏi cho chatbot.

• Phân tích và đưa ra câu trả lời đúng nhất theo dữ liệu đã đào tạo. • Xây dựng giao diện tương tác với người dùng.

• Giao tiếp với thiết bị ngoại vi, gửi tín hiệu điều khiển để quản lý thu thập tài liệu.

4.3.2 Thiết kế sơ đồ khối hệ thống

Chatbot được xây dựng dựa trên mơ hình phân loại ý định.

Hình 4.10: Sơ đồ khối các bước phân loại ý định

4.3.2.1 Bước huấn luyện mơ hình 4.3.2.1.1 Dữ liệu huấn luyện 4.3.2.1.1 Dữ liệu huấn luyện

Để dữ liệu huấn luyện dể dàng kiểm soát và truy xuất ta thêm tất cả dữ liệu ý định mà ta muốn huấn luyện vào file json .

Để tạo dữ liệu huấn luyện ta cần tạo nhiều gói từ và mỗi gói từ đại diện cho một ý định và phải tuân theo ba thứ:

SVTH: LÊ TRUNG KIÊN 79 Thứ 1: Tên ý định (tag). Để máy tính có thể hiểu, trích xuất, phân biệt được dữ liệu ta cần đặt tên cho từng ý định nó giống như một nhãn mác hàng hóa, mỗi tên ý định phải khác nhau để máy tính khơng bị nhầm lẫn

Thứ 2: Câu hỏi đầu vào (patterns). Là những câu hỏi mà ta muốn máy tính học được, để tránh trường hợp máy tính khơng hiểu ta tạo thêm nhiều câu hỏi theo nhiều cách diễn đạt khác nhau.

Thứ 3: Câu phản hồi đầu ra (responses). Là những câu trả lời mà chúng ta muốn máy tính phản hồi. Để tăng thêm phong phú câu trả lời ta nên thêm nhiều câu trả lời cùng nội dung.

Hình 4.11: Cấu trúc dữ liệu intents

4.3.2.1.2 Tiền xử lý

Vì bước tiền xử lý đóng vai trị quan trọng trong hệ thống chatbot. Nếu tiền xử lý làm sạch và chuẩn hóa tốt dữ liệu đầu vào thì sẽ làm tăng khả độ chính xác cũng như độ thông minh của chatbot.

SVTH: LÊ TRUNG KIÊN 80

Hình 4.12: Sơ đồ khối tiền xử lý huấn luyện

Để chuẩn hóa và làm sạch dữ liệu ta thực hiện các bước: Bước 1. Tách từ trong câu:

Để tách được từ trong một câu tôi sử dụng thư viện nltk trên python. Ví dụ: để tách câu “What are you doing?” ta thực hiện lệnh như hình().

Hình 4.13: Tách từ trong câu với nltk

Kết quả câu “What are you doing?” đã trở thành một mảng từ riêng lẻ ['What', 'are', 'you', 'doing', '?']

SVTH: LÊ TRUNG KIÊN 81 Sau khi tách câu ta chuyển các từ về nguyên mẫu và chuyển chữ hoa thành chữ thường bằng cách dùng thư viện nltk trên python

Hình 4.14: Chuyển từ về nguyên mẫu với nltk

4.3.2.1.3 Trích xuất đặc trưng

Hình 4.15: Sơ đồ khối trích xuất đặc trưng huấn luyện

Để sử dụng được các thuật tốn ta cần vector hóa các văn bản, các đoạn text đầu vào.

Có nhiều cách khác nhau có thể đưa dữ liệu văn bản thành dữ liệu dạng số:

+ Word2Vec

SVTH: LÊ TRUNG KIÊN 82 + Bag of Words

+ ….

Ở đây tôi sử dụng Bag of Words(BoW) để giải quyết vấn đề này vì lượng dữ liệu hiện tại cịn ít, đơn giản, dễ dàng cài đặt.

BoW hoạt động bằng cách đếm số lần xuất hiện của mỗi từ trong văn bản.

Ví dụ: có hai văn bản đơn giản

1. What your name ? 2. How are you.

Tiền xử lý văn bản này, ta có danh sách các từ được sử dụng, được gọi là từ điển để từ điển gọn gàng ta có thể xóa bỏ những từ trùng lặp thì ta có từ điển sáu từ như sau:

["are", "what","your","you","name","how"]

Vậy với mỗi văn bản tạo ra một vector đặc trưng với chiều dài bằng sáu, mỗi phần tử đại diện cho số từ tương ứng xuất hiện trong văn bản đó.

1. [0. 1. 1. 0. 1. 0.] 2. [1. 0. 0. 1. 0. 1.]

SVTH: LÊ TRUNG KIÊN 83

Hình 4.16: Tạo vector từ trên python

4.3.2.1.4 Huấn luyện mơ hình

Pha huấn luyện dữ liệu là pha mấu chốt, quan trọng nhất trong xây dựng mơ hình chatbot. Sau bước tiền xử lý và trích xuất đặc trưng chỉ mang lại tác dụng làm cho kết quả của mơ hình được tốt hơn, thì pha huấn luyện này là pha khơng thể thiếu.

SVTH: LÊ TRUNG KIÊN 84

Hình 4.17: Lưu đồ giải thuật huấn luyện mơ hình chatbot

Đầu tiên của bước huấn luyện mơ hình ta tìm kiếm, lấy dữ liệu từ bước trích xuất đặc trưng bao gồm từ điển (all_words), tên ý định (tags), câu hỏi (patterns), câu trả lời (responese) và thiết lập số lần huấn luyện cho mơ hình (numEpoch) ở đây cho bằng 1000.

SVTH: LÊ TRUNG KIÊN 85 Ví dụ : Với dữ liệu ở hình 4.14 thì ta có từ điển câu hỏi với 24 từ: ["'s", 'a', 'anyon', 'are', 'bye', 'day', 'good', 'goodby', 'hello', 'help', 'hi', 'how', 'is', 'later', 'lot', 'name', 'see', 'thank', 'that', 'the', 'there', 'what', 'you', 'your'] tương ứng với với vector có chiều dài bằng 24.

Tiếp theo ta xử lý dữ liệu vào bằng thư viện numpy để tính tốn và trích xuất nhất, ta tiến hành tạo mảng ý định thì mảng sẽ là bốn ý định ['goodbye', 'greeting', 'my name', 'thanks'] và tạo mảng xy với x là câu hỏi (patterns) y là ý định (tags) thì mảng sẽ là [(['Hi'], 'greeting'), (['How', 'are', 'you'], 'greeting'), (['Is', 'anyone', 'there', '?'], 'greeting'), (['Hello'], 'greeting'), (['Good', 'day'], 'greeting'), (['Bye'], 'goodbye'), (['See', 'you', 'later'], 'goodbye'), (['Goodbye'], 'goodbye'), (['Thanks'], 'thanks'), (['Thank', 'you'], 'thanks'), (['That', "'s", 'helpful'], 'thanks'), (['Thanks', 'a', 'lot', '!'], 'thanks'), (['What', 'your', 'name', '?'], 'my name'), (['What', 'is', 'the', 'name'], 'my name')]. Đễ để nhìn ta xem (bảng 4.4)

Bảng 4.4: Bảng câu hỏi và ý định sau khi tạo mảng

x y

Hi greeting

How are you greeting

Is anyone there? greeting

Hello greeting

Good day greeting

Bye goodbye

See you later goodbye

Goodbye goodbye

Thanks thanks

Thank you thanks

That's helpful thanks

Thanks a lot! thanks

What your name my name What is the name my name Tiếp đến là tạo dữ liệu đào tạo:

SVTH: LÊ TRUNG KIÊN 86 - Tạo vector dữ liệu của từng câu hỏi (patterns) trên từ điển của từ (all_words) và đây cũng là dữ liệu đầu vào của huấn luyện mơ hình.

- Tạo vector dữ liệu của từng ý định (tags) trên từng câu hỏi.

Bảng 4.5: Dữ liệu đào tạo

x y Vector (patterns) Vector (tags) Hi greeting [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 1 How are you greeting [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.] 1 Is anyone there? greeting [0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.] 1 Hello greeting [0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 1

Good day greeting [0. 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.

0. 0. 0. 0. 0.] 1 Bye goodbye [0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 0 See you later goodbye [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0.] 0 Goodbye goodbye [0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 0 Thanks thanks [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.] 3

Thank you thanks [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.

0. 0. 0. 1. 0.] 3 That's helpful thanks [1. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.] 3 Thanks a lot! thanks [0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 0. 0. 0.] 3 What your name my name [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 1.] 2 What is the name my name [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 1. 0. 0.] 2

SVTH: LÊ TRUNG KIÊN 87 Tiếp theo là bước huấn luyện với mô hình DeepLearing và mạng Neaural và được hỗ trợ bởi thư viện Pytorch. Đầu vào với 24 nơ ron tương ứng với vector câu hỏi đầu ra là 4 nơ ron ứng với 4 ý định và lớp ẩn, bias là lớp sẽ được training

Hình 4.18: Mơ hình học có giám sát

Để hiểu rõ hơn ta lấy một câu “hello” làm ví dụ thì input lúc này là 24 nơ ron [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] và đầu ra tuyến tính sẽ được tính tốn [-0.2731, 0.2611, -0.1122, -0.1210] để thấy sự chênh lệch ta đưa về dạng xác suất bằng cách tính softmax với cơng thức:

𝜎(𝑧)𝑗 = 𝑒 𝑧𝑖 ∑𝐾 𝑒𝑘𝑧 𝑘=1 𝑉ớ𝑖 𝑗 = 1, … , 𝐾 ( 4.5 ) 𝜎(𝑧)1 = 𝑒 −0.2731 𝑒−0.2731 + 𝑒0.2611+ 𝑒−0.1122+ 𝑒−0.1210 = 0,198217811

SVTH: LÊ TRUNG KIÊN 88 𝜎(𝑧)2 = 𝑒 0.2611 𝑒−0.2731 + 𝑒0.2611 + 𝑒−0.1122+ 𝑒−0.1210 = 0,338178372 𝜎(𝑧)3 = 𝑒 −0.1122 𝑒−0.2731+ 𝑒0.2611+ 𝑒−0.1122+ 𝑒−0.1210 = 0,23282183 𝜎(𝑧)4 = 𝑒 −0.1210 𝑒−0.2731+ 𝑒0.2611+ 𝑒−0.1122+ 𝑒−0.1210 = 0,230781987 Ta ra được dạng xác suất [0.19821892 0.3381779 0.23282151 0.23078167] từ đây ta thấy giá trị xác suất với giá trị dự đoán (label) [0,1,0,0] chưa gần với nhau để đánh giá sự khác biệt đó ta tính Cots function (cross entropy) với công thức:

𝐷(𝑌̂, 𝑌) = −𝑌𝑙𝑜𝑔𝑌̂

= −1 × log(0.3381779) ≈ 1.08

Với Y là giá trị dự đốn và 𝑌̂ là giá trị tính ra ta được cross entropy gần bằng 1.08

Để cross entropy thấp nhất ta lan truyền ngược nơ ron và cập nhật label và bias

Một phần của tài liệu MÔ HÌNH CHATBOT GIAO TIẾP, HỖ TRỢ THỦ TỤC GIẤY TỜ HÀNH CHÍNH CHO SINH VIÊN TẠI KHOA KỸ THUẬT CƠ KHÍ (Trang 94)