Đào tạo mô hình phát hiện bình luận rác bằng TensorFlow Lite Model Maker

1. Trước khi bắt đầu

Trong lớp học lập trình này, bạn sẽ xem xét mã được tạo bằng TensorFlow và TensorFlow Lite Model Maker để tạo một mô hình có tập dữ liệu dựa trên bình luận rác. Dữ liệu gốc có trên Kaggle. Tất cả đã được thu thập vào một tệp CSV duy nhất và được dọn dẹp bằng cách xoá văn bản bị hỏng, mã đánh dấu, từ lặp lại và nhiều nội dung khác. Điều này sẽ giúp bạn dễ dàng tập trung vào mô hình thay vì văn bản.

Mã mà bạn xem xét được cung cấp tại đây, nhưng bạn nên theo dõi mã trong Colaboratory.

Điều kiện tiên quyết

  • Lớp học lập trình này được viết cho những nhà phát triển có kinh nghiệm nhưng mới làm quen với học máy.
  • Lớp học lập trình này nằm trong lộ trình Bắt đầu phân loại văn bản trong ứng dụng Flutter. Nếu bạn chưa hoàn thành các hoạt động trước đó, vui lòng dừng lại và hoàn thành ngay bây giờ.

Kiến thức bạn sẽ học được

  • Cách cài đặt TensorFlow Lite Model Maker bằng Colab.
  • Cách tải dữ liệu từ máy chủ Colab xuống thiết bị của bạn.
  • Cách sử dụng trình tải dữ liệu.
  • Cách tạo mô hình.

Bạn cần có

  • Quyền truy cập vào Colab

2. Cài đặt TensorFlow Lite Model Maker

  • Mở Colab. Ô đầu tiên trong sổ tay sẽ cài đặt TensorFLow Lite Model Maker cho bạn:
!pip install -q tflite-model-maker

Sau khi hoàn tất, hãy chuyển sang ô tiếp theo.

3. Nhập mã

Ô tiếp theo có một số nội dung nhập mà mã trong sổ tay sẽ cần sử dụng:

import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

Thao tác này cũng sẽ kiểm tra xem bạn có chạy TensorFlow 2.x hay không. Đây là một yêu cầu bắt buộc để sử dụng Model Maker.

4. Tải dữ liệu xuống

Tiếp theo, bạn sẽ tải dữ liệu xuống từ máy chủ Colab xuống thiết bị của mình và đặt biến data_file để trỏ đến tệp cục bộ:

data_file = tf.keras.utils.get_file(fname='comment-spam.csv', 
  origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv', 
  extract=False)

Model Maker có thể huấn luyện các mô hình từ những tệp CSV đơn giản như tệp này. Bạn chỉ cần chỉ định cột nào chứa văn bản và cột nào chứa nhãn. Bạn sẽ biết cách thực hiện việc này sau trong lớp học lập trình này.

5. Các mục nhúng được học trước

Thông thường, khi sử dụng Model Maker, bạn không tạo mô hình từ đầu. Bạn sử dụng các mô hình hiện có mà bạn tuỳ chỉnh theo nhu cầu của mình.

Các mô hình ngôn ngữ (như mô hình này) liên quan đến việc sử dụng các thành phần nhúng được học trước. Ý tưởng đằng sau việc nhúng là các từ được chuyển đổi thành số, trong đó mỗi từ trong toàn bộ kho ngữ liệu của bạn sẽ được gán một số. Vectơ nhúng là một vectơ được dùng để xác định tình cảm của từ đó bằng cách thiết lập một "hướng" cho từ. Ví dụ: những từ thường được dùng trong tin nhắn bình luận rác sẽ có các vectơ chỉ theo một hướng tương tự, còn những từ không được dùng sẽ có các vectơ chỉ theo hướng ngược lại.

Khi sử dụng các mục nhúng được học trước, bạn có thể bắt đầu bằng một kho ngữ liệu hoặc tập hợp các từ đã được học cảm xúc từ một lượng lớn văn bản, nhờ đó bạn có thể tìm ra giải pháp nhanh hơn nhiều so với khi bắt đầu từ con số không.

Model Maker cung cấp một số mục nhúng đã được học mà bạn có thể sử dụng, nhưng mục đơn giản và nhanh nhất để bắt đầu là lựa chọn average_word_vec.

Sau đây là mã cho thành phần kết hợp này:

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

Tham số num_words

Bạn cũng chỉ định số lượng từ mà bạn muốn mô hình sử dụng.

Bạn có thể nghĩ rằng "càng nhiều càng tốt", nhưng thường thì sẽ có một số lượng phù hợp dựa trên tần suất sử dụng của từng từ. Nếu bạn sử dụng mọi từ trong toàn bộ ngữ liệu, mô hình có thể cố gắng tìm hiểu và xác định hướng của những từ chỉ được dùng một lần. Trong bất kỳ kho ngữ liệu văn bản nào, nhiều từ chỉ được sử dụng một hoặc hai lần, vì vậy, việc đưa những từ này vào mô hình của bạn là không đáng vì chúng có tác động không đáng kể đến tình cảm tổng thể.

Bạn có thể sử dụng tham số num_words để điều chỉnh mô hình dựa trên số lượng từ mà bạn muốn. Số lượng nhỏ hơn có thể cung cấp một mô hình nhỏ hơn và nhanh hơn, nhưng mô hình này có thể kém chính xác hơn vì nhận dạng ít từ hơn. Mặt khác, số lượng lớn hơn có thể cung cấp một mô hình lớn hơn và chậm hơn. Bạn cần tìm ra điểm cân bằng!

Tham số wordvec_dim

Tham số wordved_dim là số lượng phương diện mà bạn muốn sử dụng cho vectơ của mỗi từ. Quy tắc chung được xác định từ nghiên cứu là căn bậc tư của số lượng từ. Ví dụ: nếu bạn sử dụng 2.000 từ, thì 7 là một điểm khởi đầu phù hợp. Nếu thay đổi số lượng từ bạn sử dụng, bạn cũng có thể thay đổi số này.

Tham số seq_len

Các mô hình thường rất cứng nhắc khi nói đến giá trị đầu vào. Đối với mô hình ngôn ngữ, điều này có nghĩa là mô hình ngôn ngữ có thể phân loại các câu có độ dài tĩnh cụ thể. Điều này được xác định bằng tham số seq_len hoặc độ dài chuỗi.

Khi bạn chuyển đổi các từ thành số hoặc mã thông báo, một câu sẽ trở thành một chuỗi các mã thông báo này. Trong trường hợp này, mô hình của bạn được huấn luyện để phân loại và nhận dạng các câu có 20 mã thông báo. Nếu câu dài hơn, câu đó sẽ bị cắt ngắn. Nếu ngắn hơn, thì sẽ được thêm khoảng đệm. Bạn có thể thấy một mã thông báo <PAD> chuyên dụng trong ngữ liệu được dùng cho việc này.

6. Sử dụng trình tải dữ liệu

Trước đó, bạn đã tải tệp CSV xuống. Bây giờ, bạn sẽ sử dụng một trình tải dữ liệu để chuyển đổi dữ liệu này thành dữ liệu huấn luyện mà mô hình có thể nhận dạng:

data = DataLoader.from_csv(
    filename=data_file,
    text_column='commenttext',
    label_column='spam',
    model_spec=spec,
    delimiter=',',
    shuffle=True,
    is_training=True)

train_data, test_data = data.split(0.9)

Nếu mở tệp CSV trong một trình chỉnh sửa, bạn sẽ thấy rằng mỗi dòng chỉ có hai giá trị và các giá trị này được mô tả bằng văn bản ở dòng đầu tiên của tệp. Thông thường, mỗi mục nhập sau đó được coi là một cột.

Bạn sẽ thấy rằng giá trị mô tả cho cột đầu tiên là commenttext và mục đầu tiên trên mỗi dòng là văn bản của bình luận. Tương tự, giá trị mô tả cho cột thứ hai là spam và bạn sẽ thấy rằng mục thứ hai trên mỗi dòng là True hoặc False, để biểu thị xem văn bản đó có được coi là bình luận rác hay không. Các thuộc tính khác đặt biến model_spec mà bạn đã tạo trước đó, cùng với một ký tự phân cách. Trong trường hợp này, đó là dấu phẩy vì tệp được phân tách bằng dấu phẩy. Bạn sẽ dùng dữ liệu này để huấn luyện mô hình, vì vậy, is_Training được đặt thành True.

Bạn sẽ muốn giữ lại một phần dữ liệu để kiểm thử mô hình. Chia dữ liệu thành 2 phần, 90% cho quá trình huấn luyện và 10% còn lại cho quá trình kiểm thử/đánh giá. Vì chúng ta đang thực hiện việc này, nên chúng ta cần đảm bảo rằng dữ liệu kiểm thử được chọn ngẫu nhiên và không phải là 10% "dưới cùng" của tập dữ liệu. Vì vậy, bạn hãy sử dụng shuffle=True khi tải dữ liệu để ngẫu nhiên hoá dữ liệu.

7. Xây dựng mô hình

Ô tiếp theo chỉ dùng để tạo mô hình và chỉ có một dòng mã:

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50, 
                               validation_data=test_data)

Đoạn mã này tạo một mô hình phân loại văn bản bằng Model Maker và bạn chỉ định dữ liệu huấn luyện mà bạn muốn sử dụng như đã thiết lập ở bước thứ tư), quy cách mô hình như đã thiết lập ở bước thứ tư và số lượng giai đoạn huấn luyện, trong trường hợp này là 50.

Nguyên tắc cơ bản của học máy là một dạng so khớp mẫu. Ban đầu, mô hình này tải các trọng số được huấn luyện trước cho các từ và cố gắng nhóm các từ đó lại với nhau bằng cách dự đoán những từ nào khi được nhóm lại với nhau sẽ cho biết nội dung rác và những từ nào thì không. Trong lần đầu tiên, có thể bạn sẽ thấy kết quả được chia đều vì mô hình chỉ mới bắt đầu.

c42755151d511ce.png

Sau đó, nó sẽ đo lường kết quả của giai đoạn huấn luyện này và chạy mã tối ưu hoá để điều chỉnh dự đoán, rồi thử lại. Đây là một kỷ nguyên. Vì vậy, bằng cách chỉ định epochs=50, nó sẽ trải qua "vòng lặp" đó 50 lần.

7d0ee06a5246b58d.png

Đến thời điểm bạn đạt đến epoch thứ 50, mô hình sẽ báo cáo mức độ chính xác cao hơn nhiều. Trong trường hợp này, biểu tượng sẽ là 99%!

Các số liệu về độ chính xác của quy trình xác thực thường thấp hơn một chút so với độ chính xác của quy trình huấn luyện vì chúng cho biết cách mô hình phân loại dữ liệu mà mô hình chưa từng thấy trước đây. Nó sử dụng 10% dữ liệu kiểm thử mà bạn đã dành riêng trước đó.

f063ff6e1d2add67.png

8. Xuất mô hình

  1. Chạy ô này để chỉ định một thư mục và xuất mô hình:
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
  1. Nén toàn bộ thư mục /mm_spam_savedmodel và tải tệp mm_spam_savedmodel.zip đã tạo xuống. Bạn sẽ cần tệp này trong lớp học lập trình tiếp theo.
# Rename the SavedModel subfolder to a version number
!mv /mm_spam_savedmodel/saved_model /mm_spam_savedmodel/123
!zip -r mm_spam_savedmodel.zip /mm_spam_savedmodel/

9. Xin chúc mừng

Trong lớp học lập trình này, bạn đã được hướng dẫn cách sử dụng mã Python để tạo và xuất mô hình. Giờ đây, bạn có một SavedModel cùng với nhãn và từ vựng ở cuối. Trong lớp học lập trình tiếp theo, bạn sẽ tìm hiểu cách sử dụng mô hình này để có thể bắt đầu phân loại bình luận rác.

Tìm hiểu thêm