Chương 1: Tổng quan đề tài Theo dòng chảy của cuộc cách mạng 4.0, trí tuệ nhân tạo AI ngày càng được phổ biến và ứng dụng rộng rãi trong mọi lĩnh vực của cuộc sống, mặc dù được John McCa
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
BÁO CÁO ĐỒ ÁN MÔN HỌC: ĐỒ ÁN 1
Đề tài: Tìm hiểu ML.NET và xây dựng bài toán so sánh
ngữ nghĩa 2 câu tiếng Anh
GVHD: Đỗ Thị Thanh Tuyền Sinh viên thực hiện:
Tp Hồ Chí Minh, 05/2022
Trang 2NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
……., ngày…… tháng……năm 20…
Người nhận xét
(Ký tên và ghi rõ họ tên)
Trang 3DANH MỤC HÌNH ẢNH
Hình 1 Giao diện mô hình trên trang Huggingface 7
Hình 2 Khai báo các thư viện 8
Hình 3 Thiết lập tokenizer và model 8
Hình 4 Định nghĩa Convert_ONNX() 9
Hình 5 Kết quả sau khi chạy chương trình chuyển đổi 9
Hình 6 Thư mục chứa project chuyển đổi 10
Hình 7 Giao diện trang web Netron 10
Hình 8 Trực quan hoá mô hình ONNX trên Netron 11
Hình 9 Các package cần thiết cho project 12
Hình 10 BERTInput.cs 13
Hình 11 BERTOutput.cs 13
Hình 12 BERTTrainer.cs 14
Hình 13 Trainer 14
Hình 14 BERTPredictor.cs 15
Hình 15 BERT.cs 16
Hình 16 hàm SoftMax 16
Hình 17 Predict 17
Hình 18 Program.cs 17
Hình 19 Kết quả sau khi chạy Program.cs 17
MỤC LỤC Chương 1: Tổng quan đề tài 4
Chương 2: Cơ sở lý thuyết 5
Chương 3: Thực hiện đề tài 7
Chương 4: Kết luận 18
Phụ lục: Tài liệu tham khảo 19
Trang 4Chương 1: Tổng quan đề tài
Theo dòng chảy của cuộc cách mạng 4.0, trí tuệ nhân tạo (AI) ngày càng được phổ biến và ứng dụng rộng rãi trong mọi lĩnh vực của cuộc sống, mặc dù được John
McCarthy – nhà khoa học máy tính người Mỹ đề cập lần đầu tiên vào những năm 1950 nhưng đến ngày nay thuật ngữ trí tuệ nhân tạo mới thực sự được biết đến rộng rãi và được các “ông lớn” của làng công nghệ chạy đua phát triển
AI là công nghệ sử dụng đến kỹ thuật số có khả năng thực hiện những nhiệm vụ mà bình thường phải cần tới trí thông minh của con người, được xem là phổ biến nhất Đặc trưng của công nghệ AI là năng lực “tự học” của máy tính, do đó có thể tự phán đoán, phân tích trước các dữ liệu mới mà không cần sự hỗ trợ của con người, đồng thời có khả năng xử lý dữ liệu với số lượng rất lớn và tốc độ cao Trí tuệ nhân tạo là một lĩnh vực liên quan đến chuyên ngành khoa học máy tính và công nghệ thông tin, bản chất của trí tuệ nhân tạo vẫn do con người làm ra, họ xây dựng các thuật toán, lập trình bằng các công cụ phần mềm công nghệ thông tin, giúp các máy tính có thể tự động xử lý các hành vi thông minh như con người
Trong đó, việc ứng dụng AI vào những bài toán cơ bản cần đến trí thông minh của con người như xử lý ngôn ngữ tự nhiên, phân loại hình ảnh,… chính là nền tảng để phát triển và nâng cao trí thông minh của AI, nhằm giúp cho máy tính xử lý những bài toán phức tạp hơn
Trang 5Chương 2: Cơ sở lý thuyết
2.1 Windows Machine Learning
Windows Machine Learning (Windows ML) là một thư viện hỗ trợ máy học, được tích hợp vào các phiên bản mới nhất của Windows 10 và Windows Server 2019, đồng thời cũng được phát hành dưới dạng các NuGet package Một số lợi ích của Windows ML
có thể kể đến bao gồm:
• Dễ phát triển: Chỉ cần một máy tính Windows 10 hoặc Windows Server 2019
đã được cài đặt sẵn Visual Studio và một mô hình ONNX đã được huấn luyện, chúng ta có thể tiến hành làm việc với một mô hình AI ngay trên máy tính của chúng ta Thậm chí, Windows ML còn có thể được cài đặt dưới dạng NuGet package cho các máy tính sử dụng Windows từ các phiên bản mới nhất đến phiên bản 8.1
• Hỗ trợ nhiều cấu hình: Windows ML có thể được dùng để nâng cao hiệu suất trong việc huấn luyện mô hình AI trên CPU hoặc GPU
• Độ trễ thấp và kết quả theo thời gian thực: Các mô hình ML có thể được xử lý, phân tích nội bộ trên máy tính theo thời gian thực với lượng lớn dữ liệu bao gồm hình ảnh, văn bản, video, … Kết quả sẽ được trả về gần như ngay lập tức phù hợp với nhiều tác vụ khác nhau
• Tính linh hoạt cao: Các mô hình ML có thể được đánh giá khi máy tính có kết nối Internet không ổn định, hoặc trong trường hợp mất mát dữ liệu khi phải nhận dữ liệu từ đám mây
• Chi phí vận hành thấp: Huấn luyện các mô hình ML và đánh giá nội bộ trên máy tính sẽ làm giảm đáng kể chi phí cần thiết cho băng thông Ngoài ra, khi áp dụng mô hình trên các máy chủ, các lập trình viên có thể nâng cấp phần cứng
để có thể xử lý luồng làm việc tốt hơn mà không làm phát sinh chi phí
2.2 Mô hình ONNX
Open Neural Network Exchange (ONNX) là một hệ sinh thái mở nhằm phục vụ các lập trình viên AI lựa chọn công cụ phù hợp cho các dự án liên quan ONNX cung cấp một format mã nguồn mở cho các mô hình AI, bao gồm cả các mô hình học sâu (deep learning) và các mô hình AI truyền thống
Các mô hình ONNX có thể được tải xuống và sử dụng hoàn toàn miễn phí trên mạng,
ví dụ như ONNX Model Zoo bao gồm các mô hình ONNX đã được huấn luyện sẵn,
Trang 6hoặc có thể chuyển các mô hình từ các framework khác như PyTorch, Caffee2,
Chainer, …
2.3 Huggingface và Transformers
Huggingface là nhà cung cấp nền tảng cho các công nghệ AI dưới dạng mã nguồn mở Đến nay đã có hơn 50,000 mô hình AI đã được đăng tải lên trang web của
Huggingface, trong đó bao gồm cả các mô hình của các tập đoàn công nghệ lớn như Google, Facebook, Microsoft, …
Transformers là một thư viện mã nguồn mở của Huggingface cung cấp các API cần thiết hỗ trợ trong việc tải và huấn luyện các mô hình của Huggingface Transformers chủ yếu hỗ trợ các thư viện PyTorch, TensorFlow, JAX, nhưng Transformers cũng hỗ trợ việc xuất các mô hình sang dạng ONNX với package transformers.onnx
2.4 Xử lý ngôn ngữ tự nhiên (Natural Language Processing – NLP)
Xử lý ngôn ngữ tự nhiên là một nhánh của Trí tuệ nhân tạo, tập trung vào việc nghiên cứu sự tương tác giữa máy tính và ngôn ngữ tự nhiên của con người, dưới dạng tiếng nói (speech) hoặc văn bản (text) Mục tiêu của lĩnh vực này là giúp máy tính hiểu và thực hiện hiệu quả những nhiệm vụ liên quan đến ngôn ngữ của con người như: tương tác giữa người và máy, cải thiện hiệu quả giao tiếp giữa con người với con người, hoặc đơn giản là nâng cao hiệu quả xử lý văn bản và lời nói
Có nhiều lý do khiến xử lý ngôn ngữ tự nhiên là một nhiệm vụ khó như tập từ vựng rộng lớp và được cập nhật thường xuyên, cấu trúc ngữ pháp linh hoạt và đôi khi khá lỏng lẻo, ngôn ngữ đôi khi thể hiện cảm xúc, ẩn ý của người viết Tuy nhiên có hai lý
do cơ bản nhất là tính nhập nhằng của ngôn ngữ (ambiguity) và sự cần thiết của tri thức nền (background knowledge)
Trang 7Chương 3: Thực hiện đề tài
3.1 Chuẩn bị
Bài toán yêu cầu đầu vào là 2 câu tiếng Anh (cả 2 câu có thể cùng nằm trên 1 dòng và được ngăn cách bằng dấu chấm), đầu ra là một trong ba nhãn dán (label): Entailment (tương tự nhau), Contradiction (trái ngược nhau), Neutral (không liên quan) Các nhãn dán được đánh số lần lượt là LABEL_1, LABEL_0, LABEL_3
Chúng ta sẽ sử dụng một mô hình đã được huấn luyện sẵn từ Huggingface Đây là một
mô hình BERT Base Uncased, sử dụng bộ dữ liệu SNLI (Stanford Natural Language Inference) để huấn luyện Tuy nhiên, mô hình này sử dụng PyTorch để huấn luyện Nếu muốn áp dụng vào ML.NET, trước tiên chúng ta cần phải chuyển về dạng ONNX
Hình 1 Giao diện mô hình trên trang Huggingface
Trang 8Lưu ý là mô hình trên sử dụng nhãn dán khác với yêu cầu đề bài, cụ thể là LABEL_0
là tương đồng, LABEL_1 là không liên quan, và LABEL_2 là trái ngược nhau
3.2 Chuyển mô hình từ PyTorch sang ONNX
Trước khi bắt đầu việc chuyển đổi, chúng ta cần cài đặt các thư viện cần thiết phục vụ cho việc chuyển đổi Chúng ta sẽ sử dụng pip để cài đặt
Mở pip dưới dạng cmd và gõ 2 lệnh sau:
pip install torch
pip install transformers
Sau khi hoàn thành chúng ta có thể bắt đầu công việc chuyển đổi Ở đây chúng ta sẽ dùng Python có sẵn trên Visual Studio để thực hiện
Khai báo các thư viện đã cài đặt trước đó:
Hình 2 Khai báo các thư viện
AutoTokenizer và AutoModelForSequenceClassification sẽ được dùng để định nghĩa tokenizer và model phục vụ cho việc chuyển đổi
Ngoài ra, convert_graph_to_onnx cũng được khai báo để thực hiện việc chuyển đổi một cách dễ dàng
Path sẽ được dùng để định nghĩa vị trí của file ONNX sau khi chuyển đổi
Hình 3 Thiết lập tokenizer và model
Chúng ta tiếp tục thiết lập tokenizer và model, ở đây có thêm from_pretrained để lấy
dữ liệu từ mô hình đã huấn luyện sẵn trên Huggingface
Cuối cùng, chúng ta định nghĩa Convert_ONNX() để thực hiện chuyển đổi
Ở đây cần lưu ý:
• framework chỉ môi trường ban đầu của model, ‘pt’ tức là PyTorch, còn nếu đó
là ‘tf’ thì đó là TensorFlow
• opset là một con số định nghĩa phiên bản của ONNX, tức là file ONNX của chúng ta sẽ có opset là 11
Trang 9• user_external_format là các định dạng từ phía người dùng, thông thường nếu chúng ta sẽ không định dạng gì khác với ban đầu thì để là False
Hình 4 Định nghĩa Convert_ONNX()
Kết quả sau khi chạy chương trình:
Hình 5 Kết quả sau khi chạy chương trình chuyển đổi
Kiểm tra trong thư mục của project, chúng ta thấy có một folder mới với tên gọi
“onnx”, trong đó có một file với tên gọi “bert-base-uncased-snli.onnx”
Trang 10Hình 6 Thư mục chứa project chuyển đổi
Để tìm hiểu xem mô hình ONNX vừa nhận được có đầu vào và đầu ra là gì, chúng ta
sẽ dùng Netron để phân tích
Netron là một phần mềm trực quan hoá các mô hình trí tuệ nhân tạo, máy học, và mô hình học sâu Có thể tải về Netron trên máy tính hoặc truy cập trực tiếp trên trang web của Netron: https://netron.app/
Hình 7 Giao diện trang web Netron
Trên trang Netron, chúng ta nhấn vào “Open Model” sau đó lựa chọn mô hình ONNX trên máy tính Kết quả hiện ra:
Trang 11Hình 8 Trực quan hoá mô hình ONNX trên Netron
Trong mô hình này có thể thấy có 3 input khác nhau bao gồm input_ids,
attention_mask, và token_type_ids, và 1 output với tên gọi output_0
Ở đây cần chú ý đến kiểu dữ liệu của cả input và output, khi các input đều có dạng [batch, sequence], còn output thì có dạng [batch, 3] Trong Transformers, batch là một hoặc nhiều câu văn, có thể được gửi cùng một lúc tới mô hình để xử lý, còn sequence
là độ dài của các batch Thông thường thì các mô hình Transformers có thể xử lý độ dài từ 512 đến 1024 ký tự, đối với mô hình BERT chúng ta sẽ sử dụng thì độ dài tối đa
là 512
3.3 Tạo project sử dụng mô hình ONNX
Đầu tiên chúng ta sẽ tạo project console sử dụng C#, có thể dùng NET 5.0 (không được hỗ trợ bởi Microsoft kể từ 10/5/2022) hoặc NET 6.0 (yêu cầu Visual Studio 2022)
Sau khi tạo project, từ của sổ Solution Explorer, nhấn chuột phải vào Dependencies, chọn “Manage NuGet Packages” Chúng ta sẽ tải về các package NuGet phục vụ cho project này Các package cần đến bao gồm:
Microsoft.ML: framework cung cấp các thư viện căn bản nhất hỗ trợ cho lập trình máy học trên NET
Microsoft.ML.OnnxRuntime: cung cấp các thư viện cần thiết cho các nền tảng hỗ trợ ONNX Runtime
Microsoft.ML.OnnxTransformers: hỗ trợ các thư viện của
Microsoft.ML.OnnxRuntime
Trang 12BERTTokenizers: cung cấp tokenizer cho các mô hình BERT, bao gồm BERT Base Uncased, mô hình mà chúng ta sẽ sử dụng (lưu ý: BERTTokenizers phiên bản 1.1.0 không thể cài đặt được trên Visual Studio 2019, cần phải chuyển qua BERTTokenizers phiên bản 1.0.6)
Hình 9 Các package cần thiết cho project
Cũng có thể tải các package từ giao diện console bằng cách: Từ thanh menu, chọn Tools, chọn NuGet Package Manager, chọn Package Manager Console
Sau khi giao diện console được hiển thị, gõ các dòng sau để tải các package về:
Install-Package Microsoft.ML -Version 1.7.1
Install-Package Microsoft.ML.OnnxRuntime -Version 1.11.0 Install-Package Microsoft.ML.OnnxTransformer -Version
1.7.1
Install-Package BERTTokenizers -Version 1.1.0
Bây giờ chúng ta có thể bắt đầu thực hiện project
Tạo một class mới với tên BERTInput.cs, đây sẽ là class dùng để định nghĩa các input
Trang 13Hình 10 BERTInput.cs
Tương tự, tạo lớp BERTOutput.cs để định nghĩa output Ở đây chỉ có một kiểu output
là Output0
Hình 11 BERTOutput.cs
Sau khi định nghĩa input và output, chúng ta sẽ tạo một class mới tên là
BERTTrainer.cs Trong class này, MLContext được gọi để chuẩn bị dữ liệu, bao gồm việc huấn luyện, dự đoán mô hình
Trang 14Hình 12 BERTTrainer.cs
Tiếp theo chúng ta tạo phương thức Trainer với đầu ra là ITransformer Phương thức này yêu cầu đường dẫn tới mô hình ONNX và một biến bool biểu thị việc sử dụng GPU Trong Trainer chúng ta tạo một Dictionary mới bao gồm các input và output cùng với kích cỡ, và sử dụng chúng trong inputColumnNames và
outputColumnNames
Hình 13 Trainer
Trang 15Tạo thêm class mới với tên gọi BERTPredictor.cs Như tên gọi, class này sẽ được dùng để thực hiện việc dự đoán với phương thức Predict
Hình 14 BERTPredictor.cs
Cuối cùng chúng ta tạo lớp BERT.cs dùng để tổng hợp các phương thức trước đó để tạo nên dự đoán với dữ liệu đầu vào
Như trước đó đã đề cập, vì đề bài yêu cầu các nhãn dán cho kết quả khác với mô hình ban đầu (Trong mô hình từ PyTorch, LABEL_0 là tương đồng, LABEL_1 là không liên quan, và LABEL_2 là trái ngược; trong khi đó theo đề bài thì LABEL_1 là tương
Trang 16đồng, LABEL_3 là không liên quan, và LABEL_0 là không liên quan), chúng ta cần phải tạo enum Label theo thứ tự LABEL_1, LABEL_3, LABEL_0
Hình 15 BERT.cs
Chúng ta có thể tạo thêm hàm SoftMax để tính toán thêm mức độ xuất hiện của Label trong số 3 Label có thể xuất hiện
Hình 16 hàm SoftMax
Cuối cùng, chúng ta tạo hàm Predict với text là đầu vào Để đơn giản hoá, text ở đây được nhập vào như một chuỗi liên tục với dấu chấm ngăn cách 2 câu
Trang 17Hình 17 Predict
3.4 Kết quả
Trong Program.cs, chúng ta khai báo model và modelPath, cùng với input
Chương trình này sẽ hoạt động liên tục để dự đoán kết quả so sánh về ngữ nghĩa của 2 câu tiếng Anh, cho đến khi input là rỗng
Hình 18 Program.cs
Kết quả thu được:
Hình 19 Kết quả sau khi chạy Program.cs
Trang 18Chương 4: Kết luận
Thông qua đồ án này, nhóm đã tìm hiểu được các khái niệm cơ bản về máy học, về các
bài toán xử lý ngôn ngữ tự nhiên, và đã áp dụng các kiến thức tiếp thu được vào để
giải một bài toán mang tính thực tiễn với kết quả có thể xuất ra màn hình dưới dạng
console Nhóm cũng đã được tiếp cận với một hướng phát triển mới để xây dựng các
mô hình máy học là NET thay vì Python như các hướng phát triển thông thường
Trang 19Phụ lục: Tài liệu tham khảo
Windows Machine Learning: https://docs.microsoft.com/en-us/windows/ai/windows-ml/
ONNX model: https://docs.microsoft.com/en-us/windows/ai/windows-ml/get-onnx-model
Huggingface: https://huggingface.co/
Transformers: https://huggingface.co/docs/transformers/index
Xử lý ngôn ngữ tự nhiên:
https://digital.fpt.com.vn/linh-vuc/xu-ly-ngon-ngu-tu-nhien.html
Cách chuyển mô hình từ PyTorch sang ONNX:
https://docs.microsoft.com/en-us/windows/ai/windows-ml/tutorials/pytorch-convert-model
Link mô hình: https://huggingface.co/textattack/bert-base-uncased-snli
Mô hình máy học NLP cho NET:
https://rubikscode.net/2021/04/19/machine-learning-with-ml-net-nlp-with-bert/
BERTTokenizer: https://rubikscode.net/2022/03/14/bert-tokenizers-for-ml-net/