Từ đó cho ra kết quả tối ưu nhất về việc tìm độtương đồng giữa câu hỏi bằng ngôn ngữ tự nhiên của người dùng với các câu hỏi trong bộ dữ liệu câu hỏi tự nhiên... Đối tượng Sử dụng bộ dữ
Chức năng mục tiêu phân loại (Classification Objective Function)
Câu nhúng u, v được nôi lại với nhau lu-v| và nhân nó với trọng sô thu được khi huấn luyện Wt e I3" và được tối ưu hóa bang hàm mat mát cross entropy. o = softmax(Wt(u, v, |u — 0|))
Trong đó: e =n là sô chiêu của câu nhúng. e — klà số nhãn (label).
Hình 3.21: Chức năng mục tiêu phân loại (Classification Objective Function)
Chức năng mục tiêu hồi quy (Regression Objective Function)
Sử dụng độ cosine đê tính độ giông nhau giữa hai câu nhúng và sử dụng sai sô bình phương trung bình làm hàm mat mát.
Hình 3.22: Chức năng mục tiêu hồi quy (Regression Objective Function)
Chức năng mục tiêu bộ ba (Triplet Objective Function)
Cho một câu a, một câu khang định p và một câu phủ định n Mạng điều chỉnh bộ ba mắt mát sao cho khoảng cách giữa a và p nhỏ hơn khoảng cách giữa a và n Về mặt toán hoc, hàm mat mát được tối thiểu (minimize) như sau: max (Ilsa — Spl — IlSa ~ Sall + €, 0)
Trong đó: e sx là nhúng câu cho a/p/n. e || là khoảng cách.
48 e _£ (epsilon) là một tham số đảm bảo rằng sp ít nhất ¢ gần sạ hơn sa Trong thí nghiệm đặt e = 1. a S
Positive sentence Anchor sentence Negative sentence c>
Hình 3.23: Chức năng mục tiêu bộ ba (Triplet ObJective Function)
Trong quá trình nghiên cứu, chiến lược gộp theo MEAN chiếm ưu thế vượt bậc hơn hai chiến lược còn lại đối với nhiệm vụ của dé tài luận văn Do đó, hệ thống hỏi dap sẽ sử dụng chiến lược gộp trung bình cho quá trình huấn luyện mô hình Chi tiết quá trình triển khai xây dựng sẽ được trình bày ở chương tiếp theo.
CHƯƠNG 4: TRIEN KHAI THỰC NGHIEM
4.1 Thực hiện xứ lý dữ liệu
— _ Làm sạch dữ liệu: lowercase và loại bỏ các dâu câu, ky tự non-ascii. result
Hình 4.1: Lam sạch dữ liệu
— Tach từ và loại bỏ stopwords: from nltk.tokenize import word_tokenize from nltk.corpus import stopwords
50 wn WordNetLemmatizer() result [wn.lemmatize(word, for word in result] result
— _ Nối các token lại thành một câu:
Sau quá trình tiên xử lý dữ liệu, văn bản chỉ còn lại các từ trọng yêu, nó trở nên ngăn gọn và hữu ích hơn cho máy có thê hiệu và học tập được.
Một sô kêt quả thực của bộ dữ liệu câu hỏi tự nhiên (trường câu hoi) sau khi qua quá trình xử lý:
Tiên xử lý when puerto rico add usa who choose best support actress 64 national filmfare award which side white house front name metropolitan municipality south africa who host super bowl 2019 which year vivo launch first phone india
51 where talk mary magdalene bible who carry nuclear football president what origin name cynthia
Bảng 4.1: Một số dữ liệu tiền xử lý
4.2 Huấn luyện mô hình Đê huân luyện mô hình trên bộ dữ liệu cá nhân, chúng ta có thê sử dụng kiên trúc mô hình tương tự với cấu trúc mạng Siamese và Triplet như trong [7]. Ý tưởng là, đầu tiên, tạo ra các câu nhúng bằng SBERT, gọi là mô hình “giáo viên” Sau đó, tạo một mô hình mới cho tập dữ liệu mong muôn, gọi là mô hình “học sinh” và mô hình này cô găng băt chước mô hình “giáo viên”.
Sử dụng mô hình BERTbas (“bert-base-uncased”) dé tạo nhúng từ dưới dạng mô hình “học sinh” Áp dụng cho mô hình “giáo viên” là SBERT sử dụng lớp gộp trung bình (“bert-base-nli-stsb-mean-tokens”) Cùng với các tham số khác là: e e Độ dai câu đầu vào: max_seq_length = 128.
Kích thước lô (batch) nghĩa là dùng bao nhiêu dữ liệu cho mỗi lần tinh và cập nhật hệ SỐ trong khi huấn luyện: train_batch_size = 64.
Số lượng epoch thực hiện trong quá trình huấn luyện: epochs = 20.
Ty lệ học tập (learning rate) của trình tối ưu hóa Adam: Ir = 2e-5.
Tỷ lệ khởi động học tuyến tính (linear warm-up): warmup_steps = 10000 (10% dit liệu huấn luyện).
— Tao mô hình “giáo viên”:
52 teacher_model = SentenceTransformer(‘bert-base-nli-stsb-mean-tokens')
— _ Tạo mô hình “học sinh”: kết hop BERT base và lớp gdp trung bình theo sau. from sentence_transformers import models embedding_ model = models.Transformer('bert-base-uncased’) pooling_model = models.Pooling( embedding_model.get_word_embedding_ dimensionQ, pooling_mode_mean_tokens=True, pooling_mode_cls_tokense, pooling_mode_max_tokensse)
— _ Đưa dé liệu huấn luyện vào mô hình: dữ liệu gồm 93,316 câu hỏi đã được tiền xử lý, mỗi câu năm trên một dòng. from torch.utils.data import DataLoader from sentence_transformers import SentencesDataset, losses, evaluation, readers train_reader = ParallelSentencesDataset(student_model=model, teacher_model=teacher_model) train_reader.load_datắG:/_DATA/train.txt') train_dataloader = DataLoader(train_reader, shuffle=True, batch_size=train_batch_size) train_loss = losses MSELoss(model=model)
— Điều chỉnh mô hình (huấn luyện): model.fit( train_objectives=[(train_dataloader, train_loss)], epochs , evaluation_steps00, warmup_steps000, scheduler='warmupconstant', save_best_model=True, optimizer_params={'lr': 2e-5, 'eps': le-6, 'correct_bias': False })
Sau khi chạy xong, lưu model và sử dụng nó như một mô hình nhúng câu, có thể chuyên bat cứ câu nào thành một vector có 768 chiều cé định.
4.3 Đánh giá mô hình huấn luyện
— Lấy dữ liệu STS Benchmark: import tensorflow as tf import pandas as pd import os sts_dataset = tf.keras.utils.get_file( fname = "Stsbenchmark.tar.gz", origin = "http://ixa2.si.ehu.es/stswiki/images/4/48/Stsbenchmark.tar.gz", extract = True) sts_dev = pd.read_table( wou error_bad_lines = False, skip_blank_lines = True, usecols = [4, 5, 6], names = ["sim", "sent_1", "sent_2"])
# cleanup some NaN values in sts_dev sts_data = sts_dev[[isinstance(s, str) for s in sts_dev['sent_2']]] dev_scores = sfs_ data['sim ].tolist()
— _ Tính mối tương quan giữa kết quả dự đoán của mô hình và kết qua của bộ dữ liệu điểm chuẩn STS: import math from scipy import stats def my_embed(input): return model.encode([input]) def sts_ben(batch): encodel = tf.nn.12_normalize(my_embed(batch[1]), axis=1) encode2 = tf.nn.12_normalize(my_embed(batch[2]), axis=1) cosine_similarities = tf.reduce_sum(tf.multiply(encodel, encode2), axis=1) clip_cosine_similarities = tf.clip_by_value(cosine_similarities, -1.0, 1.0) return 1.0 - tf.acos(clip_cosine_similarities) / math.pi my_scores = [] my_scores.extend(sts_ben(batch)) pearson_correlation = stats.pearsonr(my_scores, dev_scores) print(Pearson correlation coefficient = {0}'.format(pearson_correlation[0])
Kết quả đánh giá mối tương quan của mô hình so với bộ dữ liệu điểm chuan STS là 0.871, đạt được kết quả khá cao, vượt kỳ vọng Tuy nhiên, nếu so sánh với các kết quả khác của mô hình SBERT được huấn luyện trước ở Bảng 4.2 thì mô hình tốt nhất của SBERT (“stsb-mpnet-base-v2”) có kết quả cao hơn một chút so với mô hình này Chính vì vậy, hệ thống hỏi đáp sẽ được triển khai dựa trên mô hình tốt nhất hiện có là “stsb-mpnet-base-v2”.
Mô hình SBERT Đánh giá bert-base-nli-mean-tokens 0.819 bert-base-nli-stsb-mean-tokens 0.871 stsb-roberta-base-v2 0.894 stsb-mpnet-base-v2 0.902
Bang 4.2: Bang đánh gia mô hình SBERT
4.4 Xây dựng hệ thống hỏi đáp
— Sử dụng model để nhúng toàn bộ các câu hỏi trong bộ dữ liệu câu hỏi tự nhiên vào không gian vector. data = pd.read_ csv(G:/cleandata.csv') embed_ data = model.encode(data.Clean)
— _ Xử lý câu hỏi truy vân của người dùng: query = 'where eiffel’ embed_query = model.encode([query]) similar = cosine_similarity(embed_query, embed_data) result = [] for id, score in sorted(enumerate(similar[0]), key=lambda x: x[1], reverse=True)[0:5]: result.append([score, data['Question ][id], data['Answer'][id]]) print(pd.DataFrame(result, columns=["Score", "Prediction", "Answer"]))
0.826517 | who is the owner of the eiffel tower City of Paris, France
0.775095 | how high is the eiffel tower in meters 324
0.766728 | how many levels are there on the eiffel tower | three
0.764441 | what is the french name of the eiffel tower tour Eiffel
0.760158 | what do they call the eiffel tower in france Tour Eiffel
Bảng 4.3: Kết quả của hệ thống hỏi đáp
4.4.2 Triển khai hệ thống lên web
— Giao diện khi vào trang web của hệ thống hỏi đáp:
Giao diện khi người dùng thực hiện truy van: ma
Hình 4.5: Giao diện trang chu