Một mô hình Machine Learning thường sẽ được phát triển bằng cách đưa vào dữ liệu lịch sử và cho phép thuật toán dùng dữ liệu đó để dự đoán những kết quả mong đợi.. Ngoài ra, việc các mô
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
BÁO CÁO CUỐI KỲ
ĐỒ ÁN 2 TÌM HIỂU MICROSOFT ML.NET VÀ MINH HỌA VỚI BÀI TOÁN HỎI ĐÁP TIẾNG ANH
Giảng viên hướng dẫn:
ĐỖ THỊ THANH TUYỀN Sinh viên thực hiện:
Trang 2NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
……., ngày… tháng……năm 2022
Người nhận xét
(Ký tên và ghi rõ họ tên)
Trang 3CHƯƠNG I: GIỚI THIỆU 4
1 Đề tài 4
2 Lý do chọn đề tài 4
CHƯƠNG 2: LÝ THUYẾT CHUNG 5
1 Machine Learning 5
2 Microsoft ML.NET 5
3 Luồng làm việc của ML.NET 6
4 ONNX 7
5 BERT 8
CHƯƠNG 3: THỰC HIỆN BÀI TOÁN 9
1 Chuyển mô hình sang ONNX 9
2 Cài đặt project 11
3 Định nghĩa dữ liệu nhập và xuất 13
4 Xây dựng, luyện và dự đoán 15
CHƯƠNG 4: TỰ ĐÁNH GIÁ 22
CÁC LINK THAM KHẢO 23
Trang 4CHƯƠNG I: GIỚI THIỆU
1 Đề tài
Theo gợi ý của giảng viên hướng dẫn, đề tài được chọn là “Tìm hiểu Microsoft
ML.NET và minh họa với bài toán hỏi – đáp tiếng Anh”
2 Lý do chọn đề tài
Bước vào thời đại Công nghệ 4.0, ngành Công nghệ thông tin đã và đang có
nhiều phát triển tiến bộ ở mọi ngành và lĩnh vực khác nhau Một trong những lĩnh
vực đáng chú ý và đang được nhiều người quan tâm là trí tuệ nhân tạo, hay AI
(Artificial Intelligence), và một trong những chuyên môn được chú trọng nhiều nhất
của AI là học máy, hay Machine Learning Những bước đột phá trong lĩnh vực này
hứa hẹn sẽ tự động hóa rất nhiều công việc trong tương lai với một hiệu suất và độ
chính xác vượt bậc hơn con người
Tuy nhiên, việc áp dụng Machine Learning vào các ứng dụng hiện có không
phải lúc nào cũng hoàn thành được chỉ trong một ngày Để áp dụng Machine
Learning đương nhiên phải có cái “Machine”, cái “máy” thực hiện những thao tác
mong muốn, sau đó phải giúp máy nó học để có được cái phần nửa còn lại là
“Learning” Mà muốn đạt được điều đó thì phải có dữ liệu nguồn để nó học và tham
khảo, và để hạn chế sai sót nhất thiết phải có nhiều dữ liệu đúng và chính xác trong
nhiều trường hợp khác nhau Machine Learning vì thế tốn rất nhiều thời gian và tài
nguyên do các tổ chức phải đầu tư vào dữ liệu huấn luyện máy, bên cạnh thời gian
cần phải bỏ ra để luyện cái máy đó thực hiện các thao tác theo mong muốn Chưa kể
đến việc các mô hình này có thể được tạo ra và luyện trên những ngôn ngữ, nền tảng
lập trình mà lập trình viên có thể chưa biết
Vì thế, nhóm chọn đề tài này với mục đích giới thiệu một thư viện có khả năng
áp dụng và tạo các ứng dụng Machine Learning một cách dễ dàng và nhanh chóng,
sử dụng nền tảng NET tương đối quen thuộc với nhiều lập trình viên Qua báo cáo
này, nhóm hi vọng sẽ mở mang kiến thức của nhiều người cùng ngành và giúp mở
rộng việc sử dụng và áp dụng Machine Learning trong các ứng dụng nhiều hơn
Trang 5CHƯƠNG 2: LÝ THUYẾT CHUNG
1 Machine Learning
Nói khái quát, Machine Learning là một nhánh của nghiên cứu trí tuệ nhân tạo tập trung vào nghiên cứu và phát triển các thuật toán máy tính có khả năng tự cải thiện thông qua kinh nghiệm và sử dụng dữ liệu giống như con người Việc dự đoán
và tính toán kết quả của một mô hình Machine Learning là do chính thuật toán đó tự tạo ra mà không được con người lập trình tính ra kết quả đó Một mô hình Machine Learning thường sẽ được phát triển bằng cách đưa vào dữ liệu lịch sử và cho phép thuật toán dùng dữ liệu đó để dự đoán những kết quả mong đợi
Việc dữ liệu ngày càng nhiều và đa dạng hơn, cộng với máy tính ngày càng mạnh hơn và lưu trữ dữ liệu rẻ hơn đã làm Machine Learning ngày càng đáng được quan tâm hơn Các mô hình Machine Learning có thể giải quyết nhiều vấn đề với tốc độ và quy mô con người khó đạt được, cho phép những mô hình này cường hóa hoặc thậm chí thay thế khả năng con người trong công việc Ngoài ra, việc các mô hình Machine Learning có thể dự đoán dựa trên dữ liệu mẫu mà không cần được lập trình để làm thế cho phép các bộ máy này phát hiển các xu hướng, họa tiết trong dữ liệu, và từ đó có thể giúp các tập đoàn, công ty phát hiện được xu hướng về hành vi khách hàng và người dùng
2 Microsoft ML.NET
Ra mắt năm 2018, ML.NET là một thư viện Machine Learning mã nguồn mở
và đa nền tảng cho các ngôn ngữ lập trình C# và F#, được phát triển bởi Tập đoàn NET và xuất bản bởi Microsoft Mặc dù tương đối mới, MLNET khởi nguồn vào năm 2002 là một dự án nghiên cứu tìm kiếm và điều hướng khai thác dữ liệu từ văn bản sử dụng nội bộ trong các sản phẩm của Microsoft, sau đó đổi tên thành TLC (The Learning Code) vào năm 2011; ML.NET là một sản phẩm dẫn xuất từ thư viện này
ML.NET có thể chạy trên Windows, Linux và macOS thông qua NET Core, hoặc Windows thông qua NET Framework Mọi nền tảng hỗ trợ chạy ML.NET 64 bit; 32 bit chỉ được hỗ trợ trên Windows, ngoài trừ các chức năng liên quan đến TensorFlow, LightGBM và ONNX ML.NET hỗ trợ nhiều loại mô hình dự đoán, như phân loại, hồi quy, nhận diện dị thường, kiến nghị, dữ liệu tuần tự và phân loại ảnh
Mô hình Machine Learning là một trong những yếu tố trọng tâm của ML.Net
Mô hình này phải đặc tả những bước thực hiện chuyển đổi dữ liệu đầu vào thành một dự đoán Với ML.NET, mô hình này có được thông qua nhập vào mô hình ONNX và TensorFlow đã được luyện sẵn, hoặc tự luyện mô hình riêng sử dụng extension ML.NET Model Builder cho Visual Studio thông qua ML.NET CLI và ML.NET AutoML
Trang 6Trong đồ án này, chúng ta sẽ dùng ML.NET để tạo một chương trình hỏi đáp tiếng Anh sử dụng một mô hình hỏi – đáp BERT Do mô hình này được xây dựng trên nền tảng PyTorch, vốn không được hỗ trợ bởi ML.NET, chúng ta trước hết phải chuyển mô hình này sang một định dạng đọc được bởi ML.NET, như ONNX
3 Luồng làm việc của ML.NET
Quá trình làm việc của ML.NET nói riêng, cũng như quá trình phát triển mô hình Machine Learning nói chung, là một quá trình mang tính lặp đi lặp lại Phát triển một mô hình thường trải qua các bước sau:
Thu thập và tải dữ liệu luyện tập vào một đối tượng dữ liệu (i.e IDataView
của ML.NET)
Đặc tả pipeline thu thập thông tin và thực thi thuật toán Machine Learning
Luyện mô hình (ML.NET: gọi Fit() lên pipeline)
Đánh giá mô hình, lặp lại quy trình để cải thiện
Lưu mô hình dưới dạng nhị phân để tích hợp vào ứng dụng
Tải mô hình vào một đối tượng ITransformer
Gọi CreatePredictionEngine.Predict() để tiến hành dự đoán
Trang 74 ONNX
Viết tắt cho Open Neural Network Exchange (tạm dịch: khu trao đổi mạng
thần kinh mở), ONNX là một hệ sinh thái trí tuệ nhân tạo mã nguồn mở gồm nhiều
Trang 8công ty công nghệ và tổ chức nghiên cứu với sứ mệnh thiết lập tiêu chuẩn xây dựng
và phát triển thuật toán và công cụ Machine Learning để khuyến khích tính sáng tạo
và hợp tác trong ngành trí tuệ nhân tạo Ban đầu được phát triển bởi đội PyTorch của Facebook dưới tên là Toffee, nền tảng được đổi tên lại thành ONNX vào tháng 9/2017, được ra mắt bởi Facebook và Microsoft, và hứa hẹn sẽ tăng tính tương tác giữa các framework khác nhau cũng như cải thiện hiệu suất các mạng thần kinh nhân tạo
Để có mô hình ONNX, người dùng có thể tải về một mô hình luyện sẵn từ ONNX Model Zoo, xuất mô hình từ các framework luyện Machine Learning như PyTorch, hoặc chuyển các mô hình có sẵn sang ONNX sử dụng gói ONNXMLTools của Python
5 BERT
Viết tắt cho Bidirectional Encoder Representations from Transformers (tạm
dịch: đại diện mã hóa song chiều từ transformer), BERT là một kỷ thuật Machine Learning dựa trên mô hình transformer (mô hình Machine Learning tự chú ý) được dùng trong xử lý ngôn ngữ tự nhiên được phát triển bởi Google Lần đầu được xuất bản vào năm 2018, Google bắt đầu áp dụng BERT vào Google Search từ năm 2019;
từ đó đến nay BERT được áp dụng vào hơn 70 ngôn ngữ khác nhau trong Search,
và mọi truy vấn tiếng Anh được xử lý bởi BERT
BERT được luyện trước trên hai tác vụ: định hình ngôn ngữ và dự đoán câu tiếp theo; vì thế BERT học được cách nhúng từ thông qua ngữ cảnh Sau giai đoạn tiền luyện tập, BERT có thể được tinh chỉnh với ít tài nguyên hơn trên những bộ dữ liệu bé hơn để tối ưu hóa hiệu suất trên những công việc cụ thể
Trang 9CHƯƠNG 3: THỰC HIỆN BÀI TOÁN
1 Chuyển mô hình sang ONNX
Mô hình chúng ta sẽ sử dụng để giải quyết bài toán này là một mô hình BERT thuộc dòng các mô hình transformer, được xây dựng bằng framework PyTorch, vì thế trước hết chúng ta cần cấu hình hệ thống để làm việc được với Python và transformers
Sau khi cài đặt Python, chúng ta cần thiết lập một môi trường ảo để cài đặt một số thư viện thêm Cách dễ nhất đạt được điều này là tạo một project Python mới trên Visual Studio, sau đó cấu hình tạo môi trường ảo mới trong Visual Studio Một khi tạo xong, mở Python cmd, điều hướng về thư mục chứa môi trường ảo và chạy dòng lệnh sau để tải về PyTorch và transformers:
.\venv\Scripts\activate
pip3 install upgrade pip
pip3 install torch
pip3 install transformers
Trong project, tiến hành nhập vào các thư viện cần thiết:
1 Các thư viện nhập/xuất liệu tiêu chuẩn của Python
2 Các thư viện làm việc với ứng dụng Chúng ta nhập vào thư viện Torch để project làm việc với mô hình được đề cập đến, và Path để giúp project đọc và xuất file
3 Các mô hình transformers được tự động lưu vào bộ nhớ cache của máy trong lần đầu sử dụng, cho nên tải mô hình chỉ cần chạy code nhập trực tiếp từ thư viện transformer, không cần pull về dùng github Trên trang repository của mỗi mô hình sẽ có nút “Use in Transformers”; click vào đây sẽ hiện code cần sao chép để nhập mô hình vào Python
4 Cũng từ thư viện transformers, ta nhập vào các chức năng cho phép chuyển
Trang 10các mô hình tải về sang định dạng ONNX
Sau khi tải mô hình xong, chúng ta tiến hành tạo hàm chuyển mô hình tải về sang định dạng ONNX Nếu muốn, chúng ta có thể thử xem mô hình đã được tải về chưa bằng cách làm một truy vấn thử nghiệm Để làm một dự đoán, chúng ta cần định nghĩa một pipeline dùng để xử lý truy vấn của người dùng; pipeline trong trường hợp này sẽ là một pipeline chuyên xử lý hỏi – đáp, sử dụng mô hình vừa tải
về và tokenizer (bộ hàm dùng để chia từ trong câu) đã được định nghĩa như trên Sau
đó, chúng ta sẽ làm một câu truy vấn, bao gồm nội dung (context – chứa thông tin
trả lời cho các câu hỏi truy vấn) và câu hỏi cần được giải đáp
Nếu mô hình tải về thành công, trong cmd sẽ xuất ra câu trả lời của truy vấn, cộng vởi một điểm thể hiện mức độ tự tin của mô hình về kết quả được đưa ra
Sau khi đã xác nhận là mô hình đã được tải về và hoạt động, chúng ta gọi hàm eval() trên mô hình để chuyển mô hình sang trạng thái “đánh giá” nhằm chuẩn bị xuất ra ONNX, rồi đưa vào hàm convert() của thư viện convert_graph_to_onnx để xuất mô hình Trong hàm main của project, gọi hàm chuyển mô hình để xuất mô hình ra ONNX
1 Framework: nền tảng xây dựng mô hình Trong trường hợp này ta sử dụng
Trang 11“pt” vì mô hình sử dụng là mô hình PyTorch; nếu mô hình được sử dụng là TensorFlow chúng ta sẽ ghi vào “tf”
2 Model: mô hình cần được xuất sang ONNX
3 Output: Đường dẫn đến thư mục xuất mô hình
4 Opset: Mã số phiên bản, dùng cho mô hình ONNX
5 Tokenizer: Thư viện phân chia từ trong câu văn đã định nghĩa ở khâu nhập thư viện
6 User external format: Mô hình xuất có sử dụng định dạng tùy chọn từ bên ngoài của người dùng không Thường nên để là False
7 Pipeline name: Tên của pipeline mô hình sử dụng
Kết quả mong đợi: mô hình xuất ra với đuôi onnx tại thư mục định nghĩa ở (3)
2 Cài đặt project
Trong đồ án này, chúng ta sẽ tạo một project WinForms tích hợp mô hình trên thành một ứng dụng hoàn chỉnh Khi cấu hình project cần đảm bảo framework mục tiêu của ứng dụng ít nhất là NET 5.0 (không phải NET Framework); ML.NET và các thư viện liên quan được xây dựng trên NET 5.0 và vì thế sẽ không chạy trong các ứng dụng sử dụng NET Framework
Sau khi tạo xong project, chúng ta mở NuGet Package Manager (Tools
thêm một số gói và thư viện mà chúng ta sẽ cần đến Cụ thể, chúng ta cần những thư viện sau:
Trang 12 Microsoft.ML: Thư viện ML.NET chính; thành phần chủ chốt và “nhân vật chính” của đề tài
Microsoft.ML.OnnxRuntime: Chứa một số hàm để đọc và xử lý các mô hình ONNX
Microsoft.ML.OnnxTransformer: Cung cấp lớp xử lý dữ liệu các mô hình transformer dạng ONNX
BERTTokenizers: Cung cấp chức năng phân chia câu thành từ, do mặc định NET không có chức năng này
Chúng ta ngoài ra sẽ làm thêm một hàm có chức năng đọc chữ từ một file text đưa vào ứng dụng Hàm này sẽ được sử dụng sau này để ứng dụng đọc file từ điển của mô hình lấy ngữ vựng; ngữ vựng này kết hợp với chức năng phân chia câu sẽ giúp mã hóa truy vấn từ ngôn ngữ người sang ngôn ngữ máy, và dịch kết quả máy sang ngôn ngữ người
Trang 133 Định nghĩa dữ liệu nhập và xuất
Vốn là máy, mô hình xử lý ngôn ngữ tự nhiên không thể nào hiểu được ngữ cảnh mình đưa vào và câu trả lời mong đợi giống như một con người được Chúng chỉ thấy thông tin mình đưa vào là một chuỗi ký tự mang giá trị khác nhau nó phải
xử lý, và xuất ra cũng một chuỗi ký tự giống vậy Vì thế, trước tiên ứng dụng của chúng ta phải định nghĩa mô hình dữ liệu mô hình sẽ nhận được và xuất ra
Tải ứng dụng Netron rồi mở mô hình ONNX có được từ phần 1 nêu trên
Netron là một ứng dụng trực quan hóa các mô hình mạng thần kinh, deep learning
và machine learning, và hỗ trợ nhiều kiểu mô hình khác nhau Mô hình ONNX sẽ
có hình dáng giống như sau đây:
Trang 14Có rất nhiều thông tin và node khác nhau cấu thành nên mô hình này, tuy nhiên chúng ta chỉ quan tâm đến đầu vào và ra của mô hình Nhấp vào một trong các node input hoặc output (thường các node này sẽ ở tận đầu hoặc tận cuối của biểu đồ)
và màn hình đặc tính phía bên phải sẽ hiển thị hình dáng của đầu vào và đầu ra, gồm các thuộc tính nào, kiểu dữ liệu gì và kích cỡ trường đó
Với thông tin này, ta quay lại ứng dụng của mình trên Visual Studio và tạo
hai lớp InputData và Prediction, định hình đầu vào và ra của mô hình Mỗi thuộc
tính trong Netron là một mảng dữ liệu mang tên và kiểu dữ liệu tương ứng trong
.NET Đặc biệt quan trọng là hai thuộc tính ColumnName và VectorType được
cung cấp bởi Microsoft.ML; hai thuộc tính này báo cho ứng dụng biết xử lý đầu vào
và ra với mô hình như thế nào Giá trị ColumnName là tên của thuộc tính ứng với mảng đó trong Netron (bảo đảm tên trong Netron là gì ColumnName tên phải y chang vậy), và giá trị của VectorType là giá trị tương ứng với thuộc tính đó trong Netron trong mục type
Mô hình này có trường hợp đặc biệt là giá trị của mỗi cội không phải là một
con số cụ thể, mà thay vào đó là batch và sequence Trong transformers, batching là
một kỹ thuật cho phép mô hình hoạt động khi người dùng nhập vào nhiều câu văn cùng lúc, cho phép mô hình tạo nên một “cụm” các câu khác nhau thành một
sequence, một chuỗi ký tự liên tiếp Sequence trong đây là độ dài tối đa của một batch, hay nói cách khác, sequence càng lớn mô hình có thể xử lý những ngữ cảnh,
truy vấn dài hơn Đa số các mô hình transformers hỗ trợ xử lý những chuỗi có độ dài từ 512 đến 1024 ký tự, và sẽ gặp sự cố nếu nó cố xử lý những chuỗi dài hơn
Để đơn giản hóa mọi việc, trong ví dụ này ta sẽ đặt batch giá trị bằng một, để
ứng dụng chuyển thông tin đầu vào thành một chuỗi duy nhất thay vì chia nhỏ thành nhiều chuỗi hơn nữa Chúng ta cũng sẽ đặt kích cỡ chuỗi tối đa là 512