(Luận văn tốt nghiệp) tìm hiểu mô hình ngôn ngữ phobert cho bài toán phân loại quan điểm bình luận tiếng việt

66 16 0
(Luận văn tốt nghiệp) tìm hiểu mô hình ngôn ngữ phobert cho bài toán phân loại quan điểm bình luận tiếng việt

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC QUẢN LÝ VÀ CƠNG NGHỆ HẢI PHỊNG - ĐỒ ÁN TỐT NGHIỆP NGÀNH: CÔNG NGHỆ THÔNG TIN Sinh viên : Nguyễn Thành Long Lớp : CT2101C Giảng Viên Hướng Dẫn: Ths.Nguyễn Thị Xuân Hương Hải Phòng – 2021 Luan van BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC QUẢN LÝ VÀ CƠNG NGHỆ HẢI PHỊNG - TÌM HIỂU VỀ MƠ HÌNH NGÔN NGỮ PHOBERT CHO BÀI TOÁN PHÂN LOẠI QUAN ĐIỂM BÌNH LUẬN TIẾNG VIỆT ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY NGÀNH: CƠNG NGHỆ THƠNG TIN Sinh Viên : Nguyễn Thành Long Lớp : CT2101C Giảng Viên Hướng Dẫn : Ths.Nguyễn Thị Xuân Hương Luan van BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC QUẢN LÝ VÀ CƠNG NGHỆ HẢI PHỊNG NHIỆM VỤ ĐỀ TÀI TỐT NGHIỆP Sinh viên: Nguyễn Thành Long Lớp : CT2101C Ngành : Công nghệ thông tin Mã SV : 1712111008 Tên đề tài: Tìm hiểu mơ hình ngơn ngữ PhoBert cho bài toán phân loại quan điểm bình luận tiếng Việt Luan van CÁN BỘ HƯỚNG DẪN ĐỀ TÀI TỐT NGHIỆP Họ tên : Nguyễn Thị Xuân Hương Học hàm, học vị : Thạc sĩ Cơ quan công tác : Trường Đại học Quản lý Cơng nghệ Hải Phịng Nội dung hướng dẫn: + Tìm hiểu về mơ hình ngơn ngữ PhoBert + Tìm hiểu về bài toán phân tích quan điểm người dùng, phân loại quan điểm bình luận Tiếng Việt + Tìm hiểu về ngôn ngữ lập trình Python Đề tài tốt nghiệp giao ngày 16 tháng 07 năm 2021 Yêu cầu phải hoàn thành xong trước ngày 03 tháng 10 năm 2021 Đã nhận nhiệm vụ ĐTTN Đã giao nhiệm vụ ĐTTN Giảng viên hướng dẫn Sinh viên Hải Phòng, ngày tháng năm 2021 TRƯỞNG KHOA Luan van CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự - Hạnh phúc PHIẾU NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN TỐT NGHIỆP Họ tên giảng viên: Nguyễn Thị Xuân Hương Đơn vị công tác: Khoa Công nghệ thông tin, Trường Đại học Quản lý Cơng nghệ Hải Phịng Họ tên sinh viên: Nguyễn Thành Long Ngành: Công nghệ thông tin Nội dung hướng dẫn: + Tìm hiểu về mơ hình ngơn ngữ PhoBert + Tìm hiểu về bài toán phân tích quan điểm người dùng, phân loại quan điểm bình luận Tiếng Việt + Tìm hiểu về ngôn ngữ lập trình Python Tinh thần thái độ sinh viên trình làm đề tài tốt nghiệp ……………………………………………………………………………………………… ……………………………………………………………………………………………… ……………………………………………………………………………………………… ……………………………………………………………………………………………… Đánh giá chất lượng đồ án/khóa luận (so với nội dung yêu cầu đề nhiệm vụ Đ.T T.N mặt lý luận, thực tiễn, tính tốn số liệu…) ……………………………………………………………………………………………… ……………………………………………………………………………………………… ……………………………………………………………………………………………… ……………………………………………………………………………………………… Ý kiến giảng viên hướng dẫn tốt nghiệp Đạt Khơng đạt Điểm:…………………… Hải Phịng, ngày tháng 10 năm 2021 Giảng viên hướng dẫn (Ký ghi rõ họ tên) Luan van CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự - Hạnh phúc PHIẾU NHẬN XÉT CỦA GIẢNG VIÊN CHẤM PHẢN BIỆN Họ tên giảng viên: Đỗ Văn Chiểu Đơn vị công tác: Khoa Công nghệ thông tin, Trường Đại học Quản lý Cơng nghệ Phịng Họ tên sinh viên: Nguyễn Thành Long Hải Ngành: Công nghệ thơng tin Đề tài tốt nghiệp: Tìm hiểu mơ hình ngôn ngữ PhoBert cho bài toán phân loại quan điểm bình luận Tiếng Việt Phần nhận xét giảng viên chấm phản biện Những mặt hạn chế Ý kiến giảng viên chấm phản biện Được bảo vệ Không bảo vệ Điểm:…………………… Hải Phòng, ngày tháng 10 năm 2021 Giảng viên chấm phản biện (Ký ghi rõ họ tên) Luan van MỤC LỤC MỤC LỤC LỜI CẢM ƠN MỞ ĐẦU DANH MỤC CÁC HÌNH VẼ VÀ CÁC BẢNG BẢNG CÁC TỪ VIẾT TẮT CHƯƠNG MÔ HÌNH BERT 1.1 Khái niệm 1.2 Tại lại cần BERT 10 1.3 Một số khái niệm 10 1.3.1 Nhiệm vụ phía sau (Downstream task) 10 1.3.2 Điểm khái quát đánh giá mức độ hiểu ngôn ngữ (GLUE score benchmark) 11 1.3.3 Phân tích cảm xúc (Sentiment Analysis) 11 1.3.4 Hỏi đáp (Question and Answering) 11 1.3.5 Suy luận ngôn ngữ (Natural Language Inference) 11 1.3.6 Quan hệ văn (Textual Entailment) 11 1.3.7 Ngữ cảnh (Contextual) 12 1.3.8 Phương pháp Hiện đại (SOTA) 12 1.3.9 Mơ hình LTR 12 1.3.10 Mơ hình ngơn ngữ đánh dấu MLM (Masked Language Model) 12 1.4 Ngữ cảnh (Contextual) vai trò NLP 13 1.5 Tiếp cận nông học sâu ứng dụng huấn luyện trước (pre-training) NLP 14 1.5.1 Tiếp cận nông (shallow approach) 14 1.5.2 Học sâu (deep-learning) 15 1.6 Phương pháp TRANSFORMER 16 1.6.1 Encoder và Decoder BERT 16 1.6.2 Các tiến trình self-attention encoder-decoder attention ( phương pháp transformer ) 18 1.7 Mô hình BERT 20 Luan van 1.7.1 Mơ hình BERT tinh chỉnh (Fine-tuning model BERT) 20 1.8 Cách huấn luyện BERT 22 1.8.1 Mô hình ngô ngữ đánh dấu (Masked Language Model) 22 1.8.2 Next Sentence Prediction (NSP) 24 1.9 Các kiến trúc mơ hình BERT 26 1.10 RoBerta 27 1.10.1 Khái niệm RoBerta 27 1.10.2 Dữ liệu 27 1.10.3 Extract fearture từ RoBerta 31 1.10.4 Điền từ ( Filling Mask ) 32 1.10.5 Trích suất đặc trưng ( Extract feature ) cho từ 32 CHƯƠNG PHOBERT 33 2.1 Sự đời của PhoBERT 33 2.2 Cấu trúc của PhoBERT 33 2.2.1 Dữ liệu trước huấn luyện 36 2.2.2 Tối ưu hóa 36 2.2.3 Thiết lập thử nghiệm 37 2.2.4 Kết thực nghiệm 38 2.2.5 Kết luận 41 2.3 Ứng dụng của PhoBert 41 CHƯƠNG ỨNG DỤNG PHOBERT VÀO BÀI TOÁN PHÂN TÍCH QUAN ĐIỂM BÌNH LUẬN TIẾNG VIỆT 42 3.1 Phát biểu bài toán 42 3.2 Dữ liệu Công cụ, môi trường thực nghiệm: 45 3.2.1 Dữ liệu 45 3.2.2 Công cụ và môi trường thực nghiệm: 46 ❖ Công cụ 46 Ngôn ngữ lập trình Python 46 Thư viện mã nguồn mở Tensorflow 47 Thư viện Transformers 48 Thư viện fastBPE 48 Thư viện fairseq 48 Thư viện VnCoreNLP 48 Luan van PhoBERT huấn luyện trước 48 ❖ Môi trường thực nghiệm: 48 3.3 Các bước thực 48 3.3.1 Cài đặt các thư viện cần thiết 49 3.3.2 Cài đặt thư viện vncorenlp 49 3.3.3 Tải về dữ liệu huấn luyện từ trang chủ thi của AIVIVN pre-trained của PhoBERT 50 3.3.4 Tải về dữ liệu của thi Phân tích sắc thái bình ḷn 50 3.3.5 Tách dữ liệu thành tập train validation theo tỉ lệ 90:10 51 3.3.6 Tạo mask gồm giá trị 0, để làm đầu vào cho thư viện transformers 52 3.3.7 Huấn luyện mô hình 53 KẾT LUẬN 57 TÀI LIỆU THAM KHẢO 58 Luan van LỜI CẢM ƠN Lời cho em gửi lời cảm ơn sâu sắc đến gia đình, người thân của em động viên, giúp đỡ, cổ vũ, tạo cho em thêm động lực để em có thể hoàn thành đồ án thời gian giao Em xin gửi lời cảm ơn đến Ban Giám Hiệu Trường Đại học Quản lý Cơng nghệ Hải Phịng, Ban, Ngành hỗ trợ hết mức tạo điều kiện tốt để em có thể đăng kí đồ án tốt nghiệp Em xin cảm ơn đến thầy, cô Khoa Công nghệ thông tin, Trường Đại học Quản lý Cơng nghệ Hải Phòng, giúp em có những kiến thức cực kì bổ ích vịng năm vừa qua, giúp em có nền tảng kiến thức vững để em có thẻ thực đồ án Em xin gửi lời cảm ơn chân thành đến cô Ths Nguyễn Thị Xuân Hương, dành nhiều thời gian công sức, về vật chất tinh thần giúp em có thể thể hồn thành đồ án cách trơn tru Em xin chân thành cảm ơn! Hải Phòng, ngày tháng năm 2021 Sinh viên Nguyễn Thành Long Luan van Ví dụ bình luận tiêu cực: “ quá thất vọng”, “sản phẩm quá đắt mà chất lượng bình thường” 3.2.2 Công cụ và môi trường thực nghiệm: ❖ Công cụ Ngôn ngữ lập trình Python Python Guido van Rossum phát triển vào cuối những năm tám mươi và đầu những năm chín mươi tại Viện nghiên cứu quốc gia về toán học khoa học máy tính Hà Lan Python ngôn ngữ lập trình hướng đối tượng, cấp cao, mạnh mẽ, tạo Guido van Rossum Nó dễ dàng để tìm hiểu và lên những ngơn ngữ lập trình nhập mơn tốt cho người lần đầu tiếp xúc với ngôn ngữ lập trình Python hồn tồn tạo kiểu động sử dụng chế cấp phát nhớ tự động Python có cấu trúc dữ liệu cấp cao mạnh mẽ cách tiếp cận đơn giản hiệu đối với lập trình hướng đối tượng Cú pháp lệnh của Python là điểm cộng vơ lớn sự rõ ràng, dễ hiểu cách gõ linh động làm cho nhanh chóng trở thành ngơn ngữ lý tưởng để viết script phát triển ứng dụng nhiều lĩnh vực, hầu hết nền tảng Tính chính của Python : • • • Ngơn ngữ lập trình đơn giản, dễ học: Python có cú pháp đơn giản, rõ ràng Nó dễ đọc viết nhiều so sánh với những ngôn ngữ lập trình khác C++, Java, C# Python làm cho việc lập trình trở nên thú vị, cho phép bạn tập trung vào những giải pháp khơng phải cú pháp Miễn phí, mã nguồn mở: Bạn có thể tự sử dụng phân phối Python, thậm chí dùng cho mục đích thương mại Vì mã nguồn mở, bạn khơng những có thể sử dụng phần mềm, chương trình viết Python mà cịn có thể thay đổi mã nguồn của Python có cộng đồng rộng lớn, khơng ngừng cải thiện lần cập nhật Khả di chuyển: Các chương trình Python có thể di chuyển từ nền tảng sang nền tảng khác chạy mà khơng có thay đổi Nó chạy liền mạch hầu hết tất nền tảng Windows, macOS, Linux 46 Luan van • Khả mở rộng có thể nhúng: Giả sử ứng dụng đòi hỏi sự phức tạp lớn, bạn có thể dễ dàng kết hợp phần code C, C++ những ngôn ngữ khác (có thể gọi từ C) vào code Python Điều cung cấp cho ứng dụng của bạn những tính tốt khả scripting mà những ngơn ngữ lập trình khác khó có thể làm • Ngơn ngữ thơng dịch cấp cao: Khơng giống C/C++, với Python, bạn lo lắng những nhiệm vụ khó khăn quản lý nhớ, dọn dẹp những dữ liệu vô nghĩa, Khi chạy code Python, tự động chủn đổi code sang ngơn ngữ máy tính có thể hiểu Bạn khơng cần lo lắng về hoạt động cấp thấp • • Thư viện tiêu chuẩn lớn để giải nhiệm vụ phổ biến: Python có số lượng lớn thư viện tiêu chuẩn giúp cho công việc lập trình của bạn trở nên dễ thở nhiều, đơn giản khơng phải tự viết tất code Ví dụ: Bạn cần kết nối sở dữ liệu MySQL Web server? Bạn có thể nhập thư viện MySQLdb sử dụng Những thư viện này kiểm tra kỹ lưỡng và sử dụng hàng trăm người Vì vậy, bạn có thể chắn khơng làm hỏng code hay ứng dụng của Hướng đối tượng: Mọi thứ Python đều là hướng đối tượng Lập trình hướng đối tượng (OOP) giúp giải quyết những vấn đề phức tạp cách trực quan Với OOP, bạn có thể phân chia những vấn đề phức tạp thành những tập nhỏ cách tạo các đối tượng Thư viện mã nguồn mở Tensorflow Tensorflow thư viện mã nguồn mở cung cấp khả xử lí tính tốn số học dựa biểu đồ mô tả sự thay đổi của dữ liệu, node phép tính tốn học cạnh biểu thị luồng dữ liệu Trong tesorflow có vài khái niệm sau Tensor cấu trúc dữ liệu tensorflow đại diện cho tất loại dữ liệu Nói cách khác, tất kiểu dữ liệu đưa vào tensorflow thì đều gọi Tensor Vậy nên có thể hiểu Tensorflow thư viện mô tả, điều chỉnh dịng chảy của Tensor Tensor có thuộc tính rank, shape type: Rank số bậc của tensor Ví dụ Tensor = [1] có rank = 1, Tensor = [[3,4],[5,6]] có rank = Việc phân rank quan trọng vì đồng thời giúp phân loại dữ liệu của Tensor Khi các rank đặc biệt cụ thể, Tensor có những tên gọi riêng sau: 47 Luan van • Scalar: Khi Tensor có rank • Véc tơ: Véc tơ Tensor rank • Matrix: Đây là Tensor rank hay mảng hai chiều theo khái niệm của Python • N-Tensor: Khi rank của Tensor tăng lên lớn 2, chúng gọi chung NTensor • Shape chiều của tensor Vi dụ Tensor = [[[1,1,1], [178,62,74]]] có Shape = (1,2,3), Tensor = [[1,1,1], [178,62,74]] có Shape = (2,3) Type kiểu dữ liệu của elements Tensor Vì Tensor có thuộc tính Type nên từ suy là có kiểu Type cho tồn elements có Tensor tại Thư viện Transformers : Là project của huggingface hỗ trợ huấn luyện model dựa kiến trúc transformer BERT, GPT-2, RoBERTa, XLM, DistilBert, XLNet, T5, CTRL,… phục vụ cho tác vụ xử lý ngôn ngữ tự nhiên nền tảng pytorch tensorflow Thư viện fastBPE : Là package hỗ trợ tokenize từ (word) thành từ phụ (subwords) theo phương pháp mới áp dụng cho pretrain model xử lý ngôn ngữ tự nhiên đại BERT và các biến thể của BERT Thư viện fairseq : Là project của facebook chuyên hỗ trợ nghiên cứu dự án liên quan đến model seq2seq Thư viện VnCoreNLP : Là package xử lý ngôn ngữ tự nhiên Tiếng Việt, hỗ trợ tokenize tác vụ xử lý ngôn ngữ khác PhoBERT huấn luyện trước ❖ Mơi trường thực nghiệm: - Máy tính Chip: Intel(R) Dual Core I5(R) @ 4300U, Ram: 16.00 GB - Hệ điều hành Ubuntu 20.04 - Công cụ lập trình: Python 3.9 3.3 Các bước thực 48 Luan van 3.3.1 Cài đặt thư viện cần thiết pip install transformers pip install fastBPE pip install fairseq 3.3.2 Cài đặt thư viện vncorenlp # Install the vncorenlp python wrapper pip install vncorenlp # Download VnCoreNLP-1.1.1.jar & its word segmentation component (i.e RDRSegmenter) mkdir -p vncorenlp/models/wordsegmenter wget https://raw.githubusercontent.com/vncorenlp/VnCoreNLP/master/VnCoreNLP1.1.1.jar wget https://raw.githubusercontent.com/vncorenlp/VnCoreNLP/master/models/wordsegmenter /vi-vocab wget https://raw.githubusercontent.com/vncorenlp/VnCoreNLP/master/models/wordsegmenter /wordsegmenter.rdr mv VnCoreNLP-1.1.1.jar vncorenlp/ mv vi-vocab vncorenlp/models/wordsegmenter/ mv wordsegmenter.rdr vncorenlp/models/wordsegmenter/ Để chắn cài đặt vncorenlp thành cơng , ta có thể sử dụng để tách từ câu đơn giản theo cách dưới đây: from vncorenlp import VnCoreNLP rdrsegmenter = VnCoreNLP("/Absolute-path-to/vncorenlp/VnCoreNLP-1.1.1.jar", annotators="wseg", max_heap_size='-Xmx500m') # rdrsegmenter = VnCoreNLP("/content/drive/My Drive/BERT/SA/vncorenlp/VnCoreNLP-1.1.1.jar", annotators="wseg", max_heap_size='-Xmx500m') text = "Đại học Bách Khoa Hà Nội." word_segmented_text = rdrsegmenter.tokenize(text) print(word_segmented_text) 49 Luan van Kết thu là: [['Đại_học', 'Bách_Khoa', 'Hà_Nội', '.']] 3.3.3 Tải liệu huấn luyện từ trang chủ thi AIVIVN pre-trained PhoBERT wget https://public.vinai.io/PhoBERT_base_transformers.tar.gz tar -xzvf PhoBERT_base_transformers.tar.gz Sau ta load model và bpe : from fairseq.data.encoders.fastbpe import fastBPE from fairseq.data import Dictionary import argparse parser = argparse.ArgumentParser() parser.add_argument(' bpe-codes', default="/content/drive/My Drive/BERT/SA/PhoBERT_base_transformers/bpe.codes", required=False, type=str, help='path to fastBPE BPE' ) args, unknown = parser.parse_known_args() bpe = fastBPE(args) # Load the dictionary vocab = Dictionary() vocab.add_from_file("/content/drive/My Drive/BERT/SA/PhoBERT_base_transformers/dict.txt") 3.3.4 Tải liệu thi Phân tích sắc thái bình luận Ta tiến hành đọc dữ liệu và dữ liệu test import re train_path = '/content/drive/My Drive/BERT/SA/train.crash' test_path = '/content/drive/My Drive/BERT/SA/test.crash' train_id, train_text, train_label = [], [], [] test_id, test_text = [], [] with open(train_path, 'r') as f_r: data = f_r.read().strip() 50 Luan van data = re.findall('train_[\s\S]+?\"\n[01]\n\n', data) for sample in data: splits = sample.strip().split('\n') id = splits[0] label = int(splits[-1]) text = ' '.join(splits[1:-1])[1:-1] text = rdrsegmenter.tokenize(text) text = ' '.join([' '.join(x) for x in text]) train_id.append(id) train_text.append(text) train_label.append(label) with open(test_path, 'r') as f_r: data = f_r.read().strip() data = re.findall('train_[\s\S]+?\"\n[01]\n\n', data) for sample in data: splits = sample.strip().split('\n') id = text text text splits[0] = ' '.join(splits[1:])[1:-1] = rdrsegmenter.tokenize(text) = ' '.join([' '.join(x) for x in text]) test_id.append(id) test_text.append(text) 3.3.5 Tách liệu thành tập train validation theo tỉ lệ 90:10 from sklearn.model_selection import train_test_split train_sents, val_sents, train_labels, val_labels = train_test_split(train_text, train_labels, test_size=0.1) Sử dụng bpe load để đưa text đầu vào dưới dạng subword ánh xạ subword về dạng index từ điển from tensorflow.keras.preprocessing.sequence import pad_sequences MAX_LEN = 125 train_ids = [] 51 Luan van for sent in train_sents: subwords = ' ' + bpe.encode(sent) + ' ' encoded_sent = vocab.encode_line(subwords, append_eos=True, add_if_not_exist=False).long().tolist() train_ids.append(encoded_sent) val_ids = [] for sent in val_sents: subwords = ' ' + bpe.encode(sent) + ' ' encoded_sent = vocab.encode_line(subwords, append_eos=True, add_if_not_exist=False).long().tolist() val_ids.append(encoded_sent) train_ids = pad_sequences(train_ids, maxlen=MAX_LEN, dtype="long", value=0, truncating="post", padding="post") val_ids = pad_sequences(val_ids, maxlen=MAX_LEN, dtype="long", value=0, truncating="post", padding="post") 3.3.6 Tạo mask gồm giá trị 0, để làm đầu vào cho thư viện transformers train_masks = [] for sent in train_ids: mask = [int(token_id > 0) for token_id in sent] train_masks.append(mask) val_masks = [] for sent in val_ids: mask = [int(token_id > 0) for token_id in sent] val_masks.append(mask) Sử dụng DataLoader của torch để tạo dataloader from torch.utils.data import TensorDataset, DataLoader, RandomSampler, SequentialSampler import torch train_inputs = torch.tensor(train_ids) val_inputs = torch.tensor(val_ids) train_labels = torch.tensor(train_labels) val_labels = torch.tensor(val_labels) train_masks = torch.tensor(train_masks) val_masks = torch.tensor(val_masks) train_data = TensorDataset(train_inputs, train_masks, train_labels) train_sampler = SequentialSampler(train_data) 52 Luan van train_dataloader = DataLoader(train_data, sampler=train_sampler, batch_size=32) val_data = TensorDataset(val_inputs, val_masks, val_labels) val_sampler = SequentialSampler(val_data) val_dataloader = DataLoader(val_data, sampler=val_sampler, batch_size=32) Load model PhoBert from transformers import RobertaForSequenceClassification, RobertaConfig, AdamW config = RobertaConfig.from_pretrained( "/content/drive/My Drive/BERT/SA/PhoBERT_base_transformers/config.json", from_tf=False, num_labels = 2, output_hidden_states=False, ) BERT_SA = BertForSequenceClassification.from_pretrained( "/content/drive/My Drive/BERT/SA/PhoBERT_base_transformers/model.bin", config=config ) 3.3.7 Huấn luyện mơ hình import random from tqdm import tqdm_notebook device = 'cpu' epochs = 10 param_optimizer = list(BERT_SA.named_parameters()) no_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight'] optimizer_grouped_parameters = [ {'params': [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)], 'weight_decay': 0.01}, {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay': 0.0} ] optimizer = AdamW(optimizer_grouped_parameters, lr=1e-5, correct_bias=False) for epoch_i in range(0, epochs): print('======== Epoch {:} / {:} ========'.format(epoch_i + 1, epochs)) print('Training ') total_loss = BERT_SA.train() 53 Luan van train_accuracy = nb_train_steps = train_f1 = for step, batch in tqdm_notebook(enumerate(train_dataloader)): b_input_ids = batch[0].to(device) b_input_mask = batch[1].to(device) b_labels = batch[2].to(device) BERT_SA.zero_grad() outputs = BERT_SA(b_input_ids, token_type_ids=None, attention_mask=b_input_mask, labels=b_labels) loss = outputs[0] total_loss += loss.item() logits = outputs[1].detach().cpu().numpy() label_ids = b_labels.to('cpu').numpy() tmp_train_accuracy, tmp_train_f1 = flat_accuracy(logits, label_ids) train_accuracy += tmp_train_accuracy train_f1 += tmp_train_f1 nb_train_steps += loss.backward() torch.nn.utils.clip_grad_norm_(BERT_SA.parameters(), 1.0) optimizer.step() avg_train_loss = total_loss / len(train_dataloader) print(" Accuracy: {0:.4f}".format(train_accuracy/nb_train_steps)) print(" F1 score: {0:.4f}".format(train_f1/nb_train_steps)) print(" Average training loss: {0:.4f}".format(avg_train_loss)) print("Running Validation ") BERT_SA.eval() eval_loss, eval_accuracy = 0, nb_eval_steps, nb_eval_examples = 0, eval_f1 = for batch in tqdm_notebook(val_dataloader): batch = tuple(t.to(device) for t in batch) b_input_ids, b_input_mask, b_labels = batch with torch.no_grad(): outputs = BERT_SA(b_input_ids, 54 Luan van token_type_ids=None, attention_mask=b_input_mask) logits = outputs[0] logits = logits.detach().cpu().numpy() label_ids = b_labels.to('cpu').numpy() tmp_eval_accuracy, tmp_eval_f1 = flat_accuracy(logits, label_ids) eval_accuracy += tmp_eval_accuracy eval_f1 += tmp_eval_f1 nb_eval_steps += print(" Accuracy: {0:.4f}".format(eval_accuracy/nb_eval_steps)) print(" F1 score: {0:.4f}".format(eval_f1/nb_eval_steps)) print("Training complete!") Kết thực ======== Epoch / 10 ======== Training Accuracy: 0.8370 F1 score: 0.8262 Average training loss: 0.3511 Running Validation Accuracy: 0.9118 F1 score: 0.9087 ======== Epoch / 10 ======== Training Accuracy: 0.9071 F1 score: 0.9025 Average training loss: 0.2348 Running Validation Accuracy: 0.9167 F1 score: 0.9131 ======== Epoch / 10 ======== Training Accuracy: 0.9261 F1 score: 0.9223 Average training loss: 0.1954 Running Validation Accuracy: 0.9148 F1 score: 0.9113 ======== Epoch / 10 ======== Training Accuracy: 0.9390 F1 score: 0.9358 Average training loss: 0.1662 Running Validation 55 Luan van Accuracy: 0.9167 F1 score: 0.9138 ======== Epoch / 10 ======== Training Accuracy: 0.9510 F1 score: 0.9482 Average training loss: 0.1443 Running Validation Accuracy: 0.9148 F1 score: 0.9113 ======== Epoch / 10 ======== Training Accuracy: 0.9587 F1 score: 0.9566 Average training loss: 0.1271 Running Validation Accuracy: 0.9167 F1 score: 0.9127 ======== Epoch / 10 ======== Training Accuracy: 0.9645 F1 score: 0.9625 Average training loss: 0.1099 Running Validation Accuracy: 0.9142 F1 score: 0.9103 56 Luan van KẾT LUẬN Trong thời gian làm đồ án này, kiến thức học trường cùng với sự hướng dẫn tận tình của các thầy cô và bạn bè, giúp em vận dụng và hoàn thành đề tài và đồ án tốt nghiệp thời gian quy định Trong quá trình thực đề tài em học hỏi và tìm hiểu những khái niệm về xử lý ngôn ngữ tự nhiên, mô hình ngôn ngữ BERT, PhoBer, ngôn ngữ lập trình Python, sử dụng các thư viện Tensorflow Đồ án cài đặt thử nghiệm bài toán phân tích quan điểm bình luận Tiếng Việt dựa mô hình ngôn ngữ PHoBERT huấn luyện trước và công cụ phân loại văn Keras Dữ liệu cho bài toán thực nghiệm là các bình luận thu thập từ thi Phân tích quan điểm bình luận Tiếng Việt Bộ dữ liệu gồm 16087 câu bình luận gắn nhãn, dữ liệu đánh giá gồm 10981 câu bình luận sử dụng để đánh giá chất lượng của mô hình học Bộ dữ liệu gồm bình luận và nhãn của bình luận Bình luận tích cực gắn nhãn 0, còn bình luận tiêu cực gắn nhãn Trong thời gian 12 tuần thực đề tài, kiến thức hạn hẹp, nên đồ án tốt nghiệp của em không thể tránh khỏi những thiếu sót, em mong nhận những đóng góp của thầy cô và các bạn để đồ án của em trở lên hoàn thiện 57 Luan van TÀI LIỆU THAM KHẢO Python Machine Learning By Example by Yuxi Liu, 2017 Neural Network Embeddings Explained by Will Koehrsen, 2018 Deep Learning: Recurrent Neural Networks in Python: LSTM, GRU, and more RNN machine learning architectures in Python and Theano, 2016 Andrew Ng, Machine Learning course, 2020 https://viblo.asia/ Christopher Olah (2015), Understanding LSTM networks in Colah’s blog RoBERTa: A Robustly Optimized BERT Pretraining Approach by Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov Attention Is All You Need by Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Lukasz Kaiser, Illia Polosukhin How to Fine-Tune BERT for Text Classification? by Chi Sun, Xipeng Qiu, Yige Xu, Xuanjing Huang 10 Yiming Cui, Wanxiang Che, Ting Liu, Bing Qin, Ziqing Yang, Shijin Wang, and Guoping Hu 2019 Pre-Training with Whole Word Masking for Chinese BERT arXiv preprint, arXiv:1906.08101 11 Wietse de Vries, Andreas van Cranenburgh, Arianna Bisazza, Tommaso Caselli, Gertjan van Noord, and Malvina Nissim 2019 BERTje: A Dutch BERT Model arXiv preprint, arXiv:1912.09582 12 Byte-Pair encoding (BPE) methods (Sennrich et al., 2016; Kudo and Richardson, 2018) 13 Xuan-Son Vu, Thanh Vu, Son Tran, and Lili Jiang 2019 ETNLP: A visualaided systematic approach to select pre-trained embeddings for a downstream task In Proceedings of RANLP, pages 1285–1294 14 Louis Martin, Benjamin Muller, Pedro Javier Ortiz Suárez, Yoann Dupont, Laurent Romary, Éric Villemonte de la Clergerie, Djamé Seddah, and Benoˆıt Sagot 2020 CamemBERT: a Tasty French Language Model In Proceedings of ACL, pages 7203– 7219 58 Luan van 15 Dat Quoc Nguyen, Dai Quoc Nguyen, Son Bao Pham, Phuong-Thai Nguyen, and Minh Le Nguyen 2014b From Treebank Conversion to Automatic Dependency Parsing for Vietnamese In Proceedings of NLDB 16 Thomas Wolf, Lysandre Debut, Victor Sanh, Julien Chaumond, Clement Delangue, Anthony Moi, Pier-ric Cistac, Tim Rault, R’emi Louf, Morgan Funtowicz, and Jamie Brew 2019 HuggingFace’s Transformers: State-of-theart Natural Language Processing 17 Thanh Vu, Dat Quoc Nguyen, Dai Quoc Nguyen, Mark Dras, and Mark Johnson 2018 VnCoreNLP: A Vietnamese Natural Language Processing Toolkit In Proceedings of NAACL: Demonstrations 18 Myle Ott, Sergey Edunov, Alexei Baevski, Angela Fan, Sam Gross, Nathan Ng, David Grangier, and Michael Auli 2019 fairseq: A Fast, Extensible Toolkit for Sequence Modeling In Proceedings of NAACL-HLT 2019: Demonstrations 19 Jacob Devlin, Ming-Wei Chang, Kenton Lee, and Kristina Toutanova 2019 BERT: Pre-training of deep bidirectional transformers for language understanding In Proceedings of NAACL, pages 4171– 4186 20 Alexis Conneau and Guillaume Lample 2019 Crosslingual Language Model Pretraining In Proceedings of NeurIPS, pages 7059–7069 21 Dat Quoc Nguyen, Dai Quoc Nguyen, Thanh Vu, Mark Dras, and Mark Johnson 2018 A Fast and Accurate Vietnamese Word Segmenter In Proceedings of LREC, pages 2582–2587 22 Huyen Nguyen, Quyen Ngo, Luong Vu, Vu Tran, and Hien Nguyen 2019a VLSP Shared Task: Named Entity Recognition Journal of Computer Science and Cybernetics, 34(4):283–294 23 Thomas Wolf, Lysandre Debut, Victor Sanh, Julien Chaumond, Clement Delangue, Anthony Moi, Pierric Cistac, Tim Rault, R’emi Louf, Morgan Funtowicz, and Jamie Brew 2019 HuggingFace’s Transformers: State-of-theart Natural Language Processing arXiv preprint, arXiv:1910.03771 24 Myle Ott, Sergey Edunov, Alexei Baevski, Angela Fan, Sam Gross, Nathan Ng, David Grangier, and Michael Auli 2019 fairseq: A Fast, Extensible Toolkit for Sequence Modeling In Proceedings of NAACL-HLT 2019: Demonstrations, pages 48–53 59 Luan van 25 Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, and Veselin Stoyanov 2019 RoBERTa: A Robustly Optimized BERT Pretraining Approach arXiv preprint, arXiv:1907.11692 26 Thanh Vu, Dat Quoc Nguyen, Dai Quoc Nguyen, Mark Dras, and Mark Johnson 2018 VnCoreNLP: A Vietnamese Natural Language Processing Toolkit In Proceedings of NAACL: Demonstrations, pages 56–60 27 Dat Quoc Nguyen, Thanh Vu, Dai Quoc Nguyen, Mark Dras, and Mark Johnson 2017 From word segmentation to POS tagging for Vietnamese In Proceedings of ALTA, pages 108–113 28 Xuezhe Ma and Eduard Hovy 2016 End-to-end sequence labeling via bidirectional LSTM-CNNsCRF In Proceedings of ACL, pages 1064–1074 29 Alexis Conneau and Guillaume Lample 2019 Crosslingual Language Model Pretraining In Proceedings of NeurIPS, pages 7059–7069 60 Luan van ... QUẢN LÝ VÀ CƠNG NGHỆ HẢI PHỊNG - TÌM HIỂU VỀ MƠ HÌNH NGƠN NGỮ PHOBERT CHO BÀI TOÁN PHÂN LOẠI QUAN ĐIỂM BÌNH LUẬN TIẾNG VIỆT ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY NGÀNH: CÔNG NGHỆ... lý ngôn ngữ tự nhiên khác với kết tốt Tiếp theo đó, PhoBERT đời nhằm xây dựng mơ hình ngơn ngữ BERT riêng cho tiếng Việt với kết tốt cho nhiều toán xử lý ngôn ngữ tự nhiên tiếng Việt. .. về mơ hình BERT khái niệm liên quan, chương 2: Mô hình PhoBERT trình bày về tìm hiểu cho mơ hình PhoBERT, Chương 3: Ứng dụng PhoBERT cho bài toán phân loại bình luận tiếng Việt trình

Ngày đăng: 11/02/2023, 12:53

Tài liệu cùng người dùng

Tài liệu liên quan