Xây dựng mô hình Học máy về bình luận rác

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à Trình tạo mô hình TensorFlow Lite để tạo một mô hình bằng cách sử dụng một tập dữ liệu dựa trên bình luận không liên quan. Dữ liệu gốc có trên kaggle. Tệp này đã đượ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, các 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 sẽ xem xét đã được cung cấp ở đây, nhưng bạn nên làm theo mã trong Google Colab.

Đ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 cho thiết bị di động. 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 Google Colab
  • Cách tải dữ liệu từ máy chủ đám mây xuống thiết bị
  • Cách sử dụng trình tải dữ liệu
  • Cách xây dựng mô hình

Bạn cần có

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ó đang chạy TensorFlow 2.x hay không. Đây là một yêu cầu để sử dụng Model Maker.

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

Tiếp theo, bạn sẽ tải dữ liệu từ máy chủ Cloud xuống thiết bị của mình và đặt 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ẽ tìm hiểu cách thực hiện việc đó 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.

Đối với các mô hình ngôn ngữ như mô hình này, việc này liên quan đến việc sử dụng các mục 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 đượ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 không liên quan 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ẽ chỉ theo hướng ngược lại.

Bằng cách sử dụng các mục nhúng được học trước, bạn có thể bắt đầu với 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. Việc này sẽ giúp bạn tìm ra giải pháp nhanh hơn nhiều so với việc bắt đầu từ con số không.

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

Đây là mã:

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 sẽ 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 mỗi từ. Nếu sử dụng mọi từ trong toàn bộ kho ngữ liệu, bạn có thể sẽ thấy mô hình cố gắng học và xác định hướng của những từ chỉ được dùng một lần. Bạn sẽ thấy trong mọi ngữ liệu văn bản rằng nhiều từ chỉ được sử dụng một hoặc hai lần và thường thì không đáng để sử dụng chúng trong mô hình của bạn vì chúng có tác động không đáng kể đến tình cảm tổng thể. Bạn có thể điều chỉnh mô hình theo số lượng từ bạn muốn bằng cách sử dụng tham số num_words.

Số lượng nhỏ hơn ở đây có thể tạo ra một mô hình nhỏ hơn và nhanh hơn, nhưng có thể kém chính xác hơn vì mô hình này nhận dạng ít từ hơn. Số càng lớn thì mô hình càng lớn và càng chậm. Tìm ra điểm cân bằng là yếu tố then chốt!

Tham số wordvec_dim

Tham số wordved_dim là số lượng phương diện 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 đang sử dụng 2.000 từ, thì 7 là một điểm xuất phát 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ột 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. Vì vậy, mô hình của bạn sẽ được huấn luyện (trong trường hợp này) để 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ì giá trị này sẽ được thêm khoảng đệm. Bạn sẽ thấy một mã thông báo <PAD> chuyên dụng trong kho ngữ liệu sẽ đượ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ẽ 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 không liên quan hay không. Các thuộc tính khác đặt 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 việc huấn luyện và 10% còn lại cho việc 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)

Thao tác này sẽ tạo một mô hình phân loại văn bản bằng Model Maker, đồng thời 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 4), quy cách mô hình (như đã thiết lập ở bước 4) và số lượng giai đoạ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 sẽ 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 từ nào khi được nhóm lại với nhau sẽ cho biết nội dung rác và từ nào thì không. Lần đầu tiên, tỷ lệ này có thể gần bằng 50:50 vì mô hình chỉ mới bắt đầu.

b94b00f0b155db3d.png

Sau đó, nó sẽ đo lường kết quả của việc 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, quá trình này sẽ trải qua "vòng lặp" đó 50 lần.

85f1d21c0b64d654.png

Đến thời điểm bạn đạt đến kỷ nguyên 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, hệ thống hiển thị 99%!

Ở phía bên phải, bạn sẽ thấy số liệu về độ chính xác của quy trình xác thực. Các giá trị này thường thấp hơn một chút so với độ chính xác của quá 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. Thao tác này sử dụng 10% dữ liệu thử nghiệm mà chúng ta đã dành riêng trước đó.

5be7967ec70e4302.png

8. Xuất mô hình

Sau khi hoàn tất quá trình huấn luyện, bạn có thể xuất mô hình.

TensorFlow huấn luyện mô hình theo định dạng riêng và bạn cần chuyển đổi mô hình này sang định dạng TFLITE để sử dụng trong ứng dụng di động. Model Maker sẽ xử lý sự phức tạp này cho bạn.

Chỉ cần xuất mô hình, chỉ định một thư mục:

model.export(export_dir='/mm_spam')

Trong thư mục đó, bạn sẽ thấy một tệp model.tflite. Tải xuống. Bạn sẽ cần đến nó trong lớp học lập trình tiếp theo, nơi bạn thêm nó vào Ứng dụng Android của mình!

Những điều cần cân nhắc về iOS

Mô hình .tflite mà bạn vừa xuất hoạt động tốt trên Android vì siêu dữ liệu về mô hình được nhúng trong đó và Android Studio có thể đọc siêu dữ liệu đó.

Siêu dữ liệu này rất quan trọng vì nó bao gồm một từ điển mã thông báo biểu thị các từ khi mô hình nhận dạng chúng. Bạn còn nhớ trước đây khi bạn học được rằng các từ trở thành mã thông báo và sau đó các mã thông báo này được cung cấp vectơ cho tình cảm của chúng không? Ứng dụng di động của bạn sẽ cần biết các mã thông báo này. Ví dụ: nếu "dog" được mã hoá thành 42 và người dùng nhập "dog" vào một câu, thì ứng dụng của bạn sẽ cần chuyển đổi "dog" thành 42 để mô hình hiểu được. Là một nhà phát triển Android, bạn sẽ có "Thư viện tác vụ TensorFlow Lite" giúp bạn dễ dàng sử dụng hơn. Tuy nhiên, trên iOS, bạn cần xử lý từ vựng nên bạn cần phải có từ vựng. Model Maker có thể xuất thông tin này cho bạn bằng cách chỉ định tham số export_format. Vì vậy, để lấy nhãn và từ vựng cho mô hình của mình, bạn có thể sử dụng:

model.export(export_dir='/mm_spam/', 
             export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

9. Xin chúc mừng

Lớp học lập trình này hướng dẫn bạn cách sử dụng Mã Python để tạo và xuất mô hình. Bạn sẽ có một tệp .tflite ở cuối quá trình này.

Trong lớp học lập trình tiếp theo, bạn sẽ thấy cách chỉnh sửa Ứng dụng Android để sử dụng mô hình này, nhờ đó bạn có thể bắt đầu phân loại bình luận rác.