1. Trước khi bắt đầu
Lớp học lập trình này được thiết kế dựa trên kết quả cuối cùng của lớp học lập trình trước trong loạt lớp học lập trình này để phát hiện bình luận không liên quan bằng TensorFlow.js.
Trong lớp học lập trình gần đây nhất, bạn đã tạo một trang web hoạt động đầy đủ cho một blog video giả tưởng. Bạn có thể lọc bình luận không liên quan trước khi bình luận được gửi đến máy chủ để lưu trữ hoặc gửi đến các ứng dụng khách được kết nối khác bằng cách sử dụng một mô hình phát hiện bình luận không liên quan được huấn luyện trước, dựa trên TensorFlow.js trong trình duyệt.
Kết quả cuối cùng của lớp học lập trình đó được trình bày dưới đây:

Mặc dù hoạt động này diễn ra rất suôn sẻ, nhưng vẫn có những trường hợp đặc biệt cần khám phá mà hệ thống không phát hiện được. Bạn có thể huấn luyện lại mô hình để xử lý những tình huống mà mô hình không thể xử lý.
Lớp học lập trình này tập trung vào việc sử dụng quy trình xử lý ngôn ngữ tự nhiên (nghệ thuật hiểu ngôn ngữ của con người bằng máy tính) và cho bạn biết cách sửa đổi một ứng dụng web hiện có mà bạn đã tạo (bạn nên tham gia các lớp học lập trình theo thứ tự), để giải quyết vấn đề rất thực tế về bình luận không liên quan mà nhiều nhà phát triển web chắc chắn sẽ gặp phải khi họ làm việc trên một trong số ngày càng tăng của các ứng dụng web phổ biến hiện nay.
Trong lớp học lập trình này, bạn sẽ tiến thêm một bước bằng cách huấn luyện lại mô hình học máy để tính đến những thay đổi về nội dung của tin nhắn rác có thể thay đổi theo thời gian, dựa trên các xu hướng hiện tại hoặc các chủ đề thảo luận phổ biến, cho phép bạn cập nhật mô hình và tính đến những thay đổi đó.
Điều kiện tiên quyết
- Đã hoàn tất lớp học lập trình đầu tiên trong loạt lớp học lập trình này.
- Kiến thức cơ bản về các công nghệ web, bao gồm HTML, CSS và JavaScript.
Sản phẩm bạn sẽ tạo ra
Bạn sẽ sử dụng lại trang web đã tạo trước đó cho một blog video giả tưởng có phần bình luận theo thời gian thực và nâng cấp trang web đó để tải một phiên bản tuỳ chỉnh của mô hình phát hiện tin nhắn rác bằng TensorFlow.js. Nhờ đó, trang web sẽ hoạt động hiệu quả hơn trong các trường hợp đặc biệt mà trước đây trang web sẽ không hoạt động. Tất nhiên, với vai trò là nhà phát triển và kỹ sư web, bạn có thể thay đổi UX giả định này để sử dụng lại trên bất kỳ trang web nào mà bạn có thể đang làm việc trong vai trò hằng ngày và điều chỉnh giải pháp cho phù hợp với mọi trường hợp sử dụng của khách hàng – có thể đó là một blog, diễn đàn hoặc một số dạng CMS, chẳng hạn như Drupal.
Hãy bắt đầu tấn công...
Kiến thức bạn sẽ học được
Bạn sẽ:
- Xác định các trường hợp đặc biệt mà mô hình được huấn luyện tiền kỳ không xử lý được
- Huấn luyện lại Mô hình phân loại nội dung rác được tạo bằng Model Maker.
- Xuất mô hình dựa trên Python này sang định dạng TensorFlow.js để sử dụng trong trình duyệt.
- Cập nhật mô hình được lưu trữ và từ điển của mô hình đó bằng mô hình mới được huấn luyện, sau đó kiểm tra kết quả
Bạn cần có kiến thức về HTML5, CSS và JavaScript để thực hiện bài thực hành này. Bạn cũng sẽ chạy một số mã Python thông qua sổ tay "co lab" để huấn luyện lại mô hình đã được tạo bằng Model Maker. Tuy nhiên, bạn không cần phải có kiến thức về Python để làm việc này.
2. Thiết lập để viết mã
Một lần nữa, bạn sẽ sử dụng Glitch.com để lưu trữ và sửa đổi ứng dụng web. Nếu chưa hoàn thành lớp học lập trình tiên quyết, bạn có thể sao chép kết quả cuối cùng tại đây làm điểm xuất phát. Nếu có thắc mắc về cách hoạt động của mã, bạn nên hoàn thành lớp học lập trình trước để tìm hiểu cách tạo ứng dụng web đang hoạt động này trước khi tiếp tục.
Trên Glitch, bạn chỉ cần nhấp vào nút remix this (phối lại) để phân nhánh và tạo một bộ tệp mới mà bạn có thể chỉnh sửa.
3. Khám phá các trường hợp đặc biệt trong giải pháp trước đó
Nếu mở trang web đã hoàn tất mà bạn vừa sao chép và thử nhập một số bình luận, bạn sẽ nhận thấy rằng phần lớn thời gian, trang web hoạt động như dự kiến, chặn những bình luận có vẻ là nội dung rác và cho phép những phản hồi hợp lệ.
Tuy nhiên, nếu bạn khéo léo và cố gắng diễn đạt theo cách để phá vỡ mô hình, thì có lẽ bạn sẽ thành công vào một thời điểm nào đó. Bạn có thể tự tạo các ví dụ như ví dụ bên dưới bằng cách thử và mắc lỗi. Hãy thử dán những bình luận này vào ứng dụng web hiện có, kiểm tra bảng điều khiển và xem xác suất trả về cho biết liệu bình luận có phải là nội dung rác hay không:
Bình luận hợp lệ được đăng mà không gặp vấn đề (phủ định thực):
- "Wow, I love that video, amazing work." Xác suất là thư rác: 47,91854%
- "Tôi hoàn toàn thích những bản minh hoạ này! Bạn có thông tin chi tiết nào khác không?" Xác suất là thư rác: 47,15898%
- "Tôi có thể truy cập vào trang web nào để tìm hiểu thêm?" Xác suất là thư rác: 15,32495%
Điều này rất tốt, xác suất cho tất cả các trường hợp trên đều khá thấp và thành công khi vượt qua SPAM_THRESHOLD mặc định với xác suất tối thiểu là 75% trước khi thực hiện hành động (được xác định trong mã script.js của lớp học lập trình trước đó).
Giờ hãy thử viết một số bình luận phản cảm hơn để xem chúng có bị đánh dấu là nội dung rác hay không, mặc dù chúng không phải là nội dung rác...
Bình luận hợp lệ bị đánh dấu là nội dung rác (trường hợp nhận diện sai):
- "Có ai có thể gửi đường liên kết đến trang web về chiếc mặt nạ mà anh ấy đang đeo không?" Xác suất là thư rác: 98,46466%
- "Tôi có thể mua bài hát này trên Spotify không? Ai đó hãy cho tôi biết!" Xác suất là thư rác: 94,40953%
- "Có thể liên hệ với tôi để cung cấp thông tin chi tiết về cách tải TensorFlow.js xuống không?" Xác suất là thư rác: 83,20084%
Rất tiếc! Có vẻ như những bình luận hợp lệ này đang bị đánh dấu là nội dung rác trong khi đáng lẽ chúng phải được cho phép. Bạn có thể làm gì để khắc phục vấn đề đó?
Một lựa chọn đơn giản là tăng SPAM_THRESHOLD để có độ tin cậy trên 98,5%. Trong trường hợp đó, những bình luận bị phân loại sai này sẽ được đăng. Theo đó, hãy tiếp tục xem xét các kết quả có thể xảy ra khác bên dưới...
Bình luận rác bị đánh dấu là rác (dương tính thật):
- "Cái này hay đấy, nhưng hãy xem các đường liên kết tải xuống trên trang web của tôi, chúng còn hay hơn nữa!" Xác suất là thư rác: 99,77873%
- "I know some people who can get you some medicines just see my pr0file for details" Xác suất là nội dung rác: 98,46955%
- "Xem hồ sơ của tôi để tải thêm nhiều video tuyệt vời hơn nữa! http://example.com" Xác suất là nội dung rác: 96,26383%
OK, vậy là điều này hoạt động như mong đợi với ngưỡng 75% ban đầu của chúng ta, nhưng vì ở bước trước bạn đã thay đổi SPAM_THRESHOLD thành mức độ tin cậy trên 98,5%, nên điều này có nghĩa là 2 ví dụ ở đây sẽ được thông qua, vậy có lẽ ngưỡng này quá cao. Có lẽ 96% sẽ tốt hơn? Nhưng nếu bạn làm như vậy, thì một trong những bình luận ở phần trước (dương tính giả) sẽ bị đánh dấu là nội dung rác mặc dù đó là bình luận hợp lệ vì được đánh giá ở mức 98,46466%.
Trong trường hợp này, có lẽ tốt nhất là bạn nên ghi lại tất cả những bình luận rác thực sự này và chỉ cần huấn luyện lại cho những trường hợp thất bại ở trên. Khi đặt ngưỡng thành 96%, tất cả kết quả dương tính thực vẫn được ghi nhận và bạn loại bỏ được 2 kết quả dương tính giả ở trên. Không quá tệ khi chỉ thay đổi một con số.
Hãy tiếp tục...
Bình luận rác được phép đăng (âm tính giả):
- "Hãy xem hồ sơ của tôi để tải xuống nhiều video tuyệt vời hơn nữa!" Xác suất là thư rác: 7,54926%
- "Nhận ưu đãi giảm giá cho các lớp huấn luyện tại phòng tập thể dục của chúng tôi, hãy xem hồ sơ!" Xác suất là nội dung rác: 17,49849%
- "omg GOOG stock just shot right up! Hãy nhận ngay trước khi quá muộn!" Xác suất là thư rác: 20,42894%
Đối với những bình luận này, bạn không thể làm gì bằng cách chỉ thay đổi giá trị SPAM_THRESHOLD. Việc giảm ngưỡng phát hiện nội dung rác từ 96% xuống còn khoảng 9% sẽ dẫn đến việc bình luận hợp lệ bị đánh dấu là nội dung rác. Một trong số đó có mức đánh giá là 58% mặc dù đó là bình luận hợp lệ. Cách duy nhất để xử lý những bình luận như vậy là huấn luyện lại mô hình bằng cách đưa những trường hợp đặc biệt như vậy vào dữ liệu huấn luyện để mô hình học cách điều chỉnh quan điểm của mình về nội dung nào là nội dung rác và nội dung nào không phải.
Mặc dù hiện tại chỉ còn lựa chọn duy nhất là huấn luyện lại mô hình, nhưng bạn cũng đã thấy cách tinh chỉnh ngưỡng để quyết định khi nào gọi một nội dung là nội dung rác nhằm cải thiện hiệu suất. Đối với con người, 75% có vẻ khá tự tin, nhưng đối với mô hình này, bạn cần tăng gần đến 81,5% để có hiệu quả hơn với các dữ liệu đầu vào mẫu.
Không có giá trị nào phù hợp với mọi mô hình, và bạn cần đặt giá trị ngưỡng này cho từng mô hình sau khi thử nghiệm với dữ liệu thực tế để xem giá trị nào phù hợp.
Có thể có một số trường hợp mà việc có kết quả dương tính giả (FN) (hoặc âm tính) có thể gây ra hậu quả nghiêm trọng (ví dụ: trong ngành y tế), vì vậy, bạn có thể điều chỉnh ngưỡng thành rất cao và yêu cầu xem xét thủ công thêm cho những trường hợp không đáp ứng ngưỡng. Đây là lựa chọn của bạn với tư cách là nhà phát triển và bạn cần thử nghiệm một chút.
4. Đào tạo lại mô hình phát hiện bình luận không liên quan
Trong phần trước, bạn đã xác định một số trường hợp biên thất bại đối với mô hình, trong đó lựa chọn duy nhất là huấn luyện lại mô hình để tính đến những trường hợp này. Trong hệ thống sản xuất, theo thời gian, bạn có thể thấy những trường hợp này khi người dùng gắn cờ một bình luận là nội dung rác theo cách thủ công nhưng bình luận đó vẫn được thông qua, hoặc khi người kiểm duyệt xem xét các bình luận bị gắn cờ và nhận ra một số bình luận không thực sự là nội dung rác và có thể đánh dấu những bình luận đó để huấn luyện lại. Giả sử bạn đã thu thập một loạt dữ liệu mới cho những trường hợp đặc biệt này (để có kết quả tốt nhất, bạn nên có một số biến thể của những câu mới này nếu có thể), giờ đây, chúng ta sẽ tiến hành cho bạn thấy cách huấn luyện lại mô hình có tính đến những trường hợp đặc biệt đó.
Bản tóm tắt được tạo sẵn
Mô hình được tạo sẵn mà bạn đã sử dụng là mô hình do bên thứ ba tạo thông qua Model Maker. Mô hình này sử dụng mô hình "mức nhúng từ trung bình" để hoạt động.
Vì mô hình được tạo bằng Model Maker, nên bạn cần chuyển sang Python trong thời gian ngắn để huấn luyện lại mô hình, sau đó xuất mô hình đã tạo sang định dạng TensorFlow.js để có thể sử dụng mô hình đó trong trình duyệt. Rất may là Model Maker giúp bạn sử dụng các mô hình của họ một cách cực kỳ đơn giản. Do đó, bạn có thể dễ dàng làm theo và chúng tôi sẽ hướng dẫn bạn trong suốt quá trình này. Vì vậy, đừng lo lắng nếu bạn chưa từng sử dụng Python trước đây!
Colab
Vì không quá lo ngại về việc thiết lập một máy chủ Linux có cài đặt tất cả các tiện ích Python, nên bạn có thể chỉ cần thực thi mã thông qua trình duyệt web bằng "Sổ tay Colab". Những sổ tay này có thể kết nối với một "backend" (phần phụ trợ) – đây chỉ là một máy chủ đã cài đặt sẵn một số thứ, từ đó bạn có thể thực thi mã tuỳ ý trong trình duyệt web và xem kết quả. Điều này rất hữu ích cho việc tạo mẫu nhanh hoặc sử dụng trong các hướng dẫn như thế này.
Bạn chỉ cần truy cập vào colab.research.google.com và bạn sẽ thấy màn hình chào mừng như sau:

Bây giờ, hãy nhấp vào nút New Notebook (Sổ tay mới) ở dưới cùng bên phải của cửa sổ bật lên. Bạn sẽ thấy một Colab trống như thế này:

Tuyệt vời! Bước tiếp theo là kết nối colab giao diện người dùng với một số máy chủ phụ trợ để bạn có thể thực thi mã Python mà bạn sẽ viết. Để làm như vậy, hãy nhấp vào Kết nối ở trên cùng bên phải rồi chọn Kết nối với thời gian chạy được lưu trữ.

Sau khi kết nối, bạn sẽ thấy các biểu tượng RAM và Ổ đĩa xuất hiện ở vị trí đó, như sau:

Tốt lắm! Giờ đây, bạn có thể bắt đầu viết mã bằng Python để huấn luyện lại mô hình Model Maker. Chỉ cần thực hiện theo các bước bên dưới.
Bước 1
Trong ô đầu tiên hiện đang trống, hãy sao chép mã bên dưới. Thao tác này sẽ cài đặt TensorFlow Lite Model Maker cho bạn bằng trình quản lý gói của Python có tên là "pip" (tương tự như npm mà hầu hết độc giả của lớp học lập trình này có thể quen thuộc hơn trong hệ sinh thái JS):
!apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0
!pip install -q tflite-model-maker
Tuy nhiên, việc dán mã vào ô sẽ không thực thi mã đó. Tiếp theo, hãy di chuột qua ô màu xám mà bạn đã dán mã ở trên vào. Một biểu tượng "phát" nhỏ sẽ xuất hiện ở bên trái ô như được đánh dấu bên dưới:
Nhấp vào nút phát để thực thi mã vừa nhập vào ô.
Giờ đây, bạn sẽ thấy trình tạo mô hình đang được cài đặt:

Sau khi quá trình thực thi ô này hoàn tất như minh hoạ, hãy chuyển sang bước tiếp theo bên dưới.
Bước 2
Tiếp theo, hãy thêm một ô mã mới như minh hoạ để bạn có thể dán thêm mã sau ô đầu tiên và thực thi riêng mã đó:

Ô tiếp theo được thực thi sẽ có một số nội dung nhập mà mã trong phần còn lại của sổ tay sẽ cần sử dụng. Sao chép và dán nội dung bên dưới vào ô mới được tạo:
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')
Đây là những thứ khá tiêu chuẩn, ngay cả khi bạn không quen thuộc với Python. Bạn chỉ cần nhập một số tiện ích và các hàm Model Maker cần thiết cho trình phân loại thư rác. 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.
Cuối cùng, giống như trước đây, hãy thực thi ô bằng cách nhấn vào biểu tượng "phát" khi bạn di chuột lên ô, rồi thêm một ô chứa mã mới cho bước tiếp theo.
Bước 3
Tiếp theo, bạn sẽ tải dữ liệu xuống từ một máy chủ từ xa xuống thiết bị của mình và đặt biến training_data thành đường dẫn của tệp cục bộ đã tải xuống:
data_file = tf.keras.utils.get_file(fname='comment-spam-extras.csv', origin='https://storage.googleapis.com/jmstore/TensorFlowJS/EdX/code/6.5/jm_blog_comments_extras.csv', extract=False)
Model Maker có thể huấn luyện các mô hình từ các tệp CSV đơn giản như tệp đã tải xuống. 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 này ở Bước 5. Bạn có thể tải trực tiếp tệp CSV xuống để xem nội dung của tệp nếu muốn.
Những người tinh ý sẽ nhận thấy tên của tệp này là jm_blog_comments_extras.csv. Tệp này chỉ đơn giản là dữ liệu huấn luyện ban đầu mà chúng tôi dùng để tạo mô hình bình luận không liên quan đầu tiên kết hợp với dữ liệu trường hợp đặc biệt mới mà bạn phát hiện được, vì vậy, tất cả dữ liệu đều nằm trong một tệp. Bạn cũng cần dữ liệu huấn luyện ban đầu được dùng để huấn luyện mô hình, ngoài những câu mới mà bạn muốn học.
Không bắt buộc: Nếu tải tệp CSV này xuống và kiểm tra vài dòng cuối, bạn sẽ thấy ví dụ về các trường hợp đặc biệt không hoạt động đúng cách trước đây. Chúng vừa được thêm vào cuối dữ liệu huấn luyện hiện có mà mô hình được tạo sẵn đã dùng để tự huấn luyện.
Thực thi ô này, sau đó thêm một ô mới và chuyển sang bước 4.
Bước 4
Khi sử dụng Model Maker, bạn không cần tạo mô hình từ đầu. Thông thường, bạn sẽ sử dụng các mô hình hiện có rồi tuỳ chỉnh cho phù hợp với nhu cầu của mình.
Model Maker cung cấp một số mục nhúng mô hình được học trước mà bạn có thể sử dụng, nhưng đơn giản nhất và nhanh nhất để bắt đầu là average_word_vec. Đây là mục nhúng mà bạn đã sử dụng trong lớp học lập trình trước đó để tạo trang web. Đây là mã:
spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7
Hãy chạy mã đó sau khi bạn dán vào ô mới.
Tìm hiểu về
num_words
tham số
Đây là số từ 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 điểm 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ộ ngữ liệu, bạn có thể khiến mô hình cố gắng tìm hiểu và cân bằng trọng số của những từ chỉ được dùng một lần – điều này không hữu ích lắm. 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ể. Vì vậy, bạn có thể điều chỉnh mô hình của mình theo số lượng từ bạn muốn bằng cách sử dụng tham số num_words. Nếu bạn chọn một số nhỏ hơn, mô hình sẽ nhỏ hơn và nhanh hơn, nhưng có thể kém chính xác hơn vì mô hình nhận dạng ít từ hơn. Số lượng càng lớn thì mô hình sẽ càng lớn và có khả năng chậm hơn. Việc tìm ra điểm phù hợp là chìa khoá và bạn, với tư cách là một kỹ sư máy học, sẽ phải tìm ra phương pháp phù hợp nhất cho trường hợp sử dụng của mình.
Tìm hiểu về
wordvec_dim
tham số
Tham số wordvec_dim là số lượng phương diện mà bạn muốn dùng cho vectơ của mỗi từ. Về cơ bản, các phương diện này là những đặc điểm khác nhau (do thuật toán học máy tạo ra trong quá trình huấn luyện) mà mọi từ nhất định có thể được đo lường. Chương trình sẽ sử dụng các phương diện này để cố gắng liên kết những từ tương tự nhau theo một cách có ý nghĩa nhất.
Ví dụ: nếu bạn có một phương diện cho biết mức độ "y tế" của một từ, thì một từ như "thuốc" có thể đạt điểm cao ở phương diện này và được liên kết với các từ đạt điểm cao khác như "xquang", nhưng "mèo" sẽ đạt điểm thấp ở phương diện này. Có thể "phương diện y tế" sẽ hữu ích trong việc xác định nội dung rác khi kết hợp với các phương diện tiềm năng khác mà mô hình có thể quyết định sử dụng nếu chúng có ý nghĩa.
Trong trường hợp những từ có điểm số cao trong "phương diện y tế", có thể thấy rằng phương diện thứ 2 liên kết các từ với cơ thể con người có thể hữu ích. Những từ như "chân", "tay", "cổ" có thể đạt điểm cao ở đây và cũng khá cao trong phương diện y tế.
Sau đó, mô hình có thể sử dụng những phương diện này để phát hiện những từ có nhiều khả năng liên quan đến nội dung rác. Có thể email rác có nhiều khả năng chứa cả từ ngữ y tế và bộ phận cơ thể người.
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ừ hoạt động hiệu quả cho tham số này. Vì vậy, nếu tôi đang sử dụng 2.000 từ, thì điểm xuất phát phù hợp cho việc này là 7 phương diện. Nếu thay đổi số lượng từ được dùng, bạn cũng có thể thay đổi số này.
Tìm hiểu về
seq_len
tham số
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, trong đó tham số này biểu thị "độ 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ì sẽ được thêm khoảng đệm – giống như trong lớp học lập trình đầu tiên trong loạt lớp học lập trình này.
Bước 5 – tải dữ liệu huấn luyện
Trước đó, bạn đã tải tệp CSV xuống. Bây giờ, bạn cầ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 thông số mô hình mà bạn đã tạo ở bước 4, 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 cách bằng dấu phẩy. Bạn cũng đặt một thông số xáo trộn để sắp xếp lại dữ liệu huấn luyện một cách ngẫu nhiên, nhờ đó những nội dung có thể tương tự hoặc được thu thập cùng nhau sẽ được phân tán ngẫu nhiên trong tập dữ liệu.
Sau đó, bạn sẽ dùng data.split() để chia dữ liệu thành dữ liệu huấn luyện và dữ liệu kiểm thử. .9 cho biết 90% tập dữ liệu sẽ được dùng để huấn luyện, phần còn lại để kiểm thử.
Bước 6 – Xây dựng mô hình
Thêm một ô khác để chúng ta thêm mã nhằm tạo mô hình:
model = text_classifier.create(train_data, model_spec=spec, epochs=50)
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 (được xác định ở bước 4), quy cách mô hình (cũng được 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" 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 không phải nội dung rác. 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 như minh hoạ dưới đây:

Sau đó, hệ thống sẽ đo lường kết quả của việc này và thay đổi trọng số của mô hình để đ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, chương trình sẽ thực hiện "vòng lặp" đó 50 lần như minh hoạ:

Vì vậy, khi 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, tỷ lệ hiển thị là 99,1%!
Bước 7 – 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ột 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 TensorFlow.js để sử dụng trên trang web. Bạn chỉ cần dán nội dung sau vào một ô mới rồi thực thi:
model.export(export_dir="/js_export/", export_format=[ExportFormat.TFJS, ExportFormat.LABEL, ExportFormat.VOCAB])
!zip -r /js_export/ModelFiles.zip /js_export/
Sau khi thực thi mã này, nếu nhấp vào biểu tượng thư mục nhỏ ở bên trái Colab, bạn có thể chuyển đến thư mục mà bạn đã xuất ở trên (trong thư mục gốc – bạn có thể cần chuyển lên một cấp) và tìm gói zip của các tệp đã xuất có trong ModelFiles.zip.
Tải tệp zip này xuống máy tính ngay bây giờ vì bạn sẽ sử dụng các tệp đó giống như trong lớp học lập trình đầu tiên:

Tuyệt vời! Phần Python đã kết thúc, giờ đây bạn có thể quay lại với JavaScript mà bạn biết và yêu thích. Chà!
5. Phân phát mô hình học máy mới
Giờ đây, bạn gần như đã sẵn sàng tải mô hình. Tuy nhiên, trước khi có thể làm việc đó, bạn phải tải các tệp mô hình mới đã tải xuống trước đó trong lớp học lập trình lên để tệp được lưu trữ và có thể sử dụng trong mã của bạn.
Trước tiên, nếu bạn chưa làm, hãy giải nén các tệp cho mô hình vừa tải xuống từ sổ tay Model Maker Colab mà bạn vừa chạy. Bạn sẽ thấy các tệp sau đây trong nhiều thư mục của thư mục đó:

Bạn có gì ở đây?
model.json– Đây là một trong những tệp tạo nên mô hình TensorFlow.js đã được huấn luyện. Bạn sẽ tham chiếu tệp cụ thể này trong mã JS.group1-shard1of1.bin– Đây là một tệp nhị phân chứa nhiều dữ liệu đã lưu cho mô hình TensorFlow.js được xuất và cần được lưu trữ ở một nơi nào đó trên máy chủ của bạn để tải xuống trong cùng thư mục vớimodel.jsonở trên.vocab– Tệp lạ không có đuôi này là một tệp từ Model Maker, cho chúng ta biết cách mã hoá các từ trong câu để mô hình hiểu cách sử dụng các từ đó. Bạn sẽ tìm hiểu kỹ hơn về vấn đề này trong phần tiếp theo.labels.txt– Mã này chỉ chứa tên lớp kết quả mà mô hình sẽ dự đoán. Đối với mô hình này, nếu bạn mở tệp này trong trình chỉnh sửa văn bản, tệp sẽ chỉ có "false" và "true" được liệt kê, cho biết "không phải nội dung rác" hoặc "nội dung rác" dưới dạng đầu ra dự đoán.
Lưu trữ các tệp mô hình TensorFlow.js
Trước tiên, hãy đặt các tệp model.json và *.bin đã được tạo trên một máy chủ web để bạn có thể truy cập vào các tệp này thông qua trang web của mình.
Xoá các tệp mô hình hiện có
Vì bạn đang xây dựng dựa trên kết quả cuối cùng của lớp học lập trình đầu tiên trong loạt lớp học lập trình này, nên trước tiên, bạn phải xoá các tệp mô hình hiện có đã tải lên. Nếu bạn đang sử dụng Glitch.com, chỉ cần kiểm tra bảng điều khiển tệp ở bên trái để tìm model.json và group1-shard1of1.bin, nhấp vào trình đơn thả xuống có biểu tượng 3 dấu chấm cho từng tệp rồi chọn xoá như minh hoạ:

Tải tệp mới lên Glitch
Tuyệt vời! Bây giờ, hãy tải các tệp mới lên:
- Mở thư mục assets (thành phần) trong bảng điều khiển bên trái của dự án Glitch rồi xoá mọi thành phần cũ đã tải lên nếu chúng có cùng tên.
- Nhấp vào tải một thành phần lên rồi chọn
group1-shard1of1.binđể tải lên thư mục này. Sau khi tải lên, tệp sẽ có dạng như sau:

- Tuyệt vời! Bây giờ, hãy làm tương tự cho tệp model.json để có 2 tệp trong thư mục tài sản của bạn như sau:

- Nếu nhấp vào tệp
group1-shard1of1.binmà bạn vừa tải lên, bạn sẽ có thể sao chép URL đến vị trí của tệp đó. Sao chép đường dẫn này ngay bây giờ như minh hoạ:

- Bây giờ, ở dưới cùng bên trái màn hình, hãy nhấp vào Công cụ > Terminal (Thiết bị đầu cuối). Chờ cửa sổ dòng lệnh tải xong.
- Sau khi tải, hãy nhập nội dung sau rồi nhấn phím Enter để thay đổi thư mục thành thư mục
www:
terminal:
cd www
- Tiếp theo, hãy dùng
wgetđể tải 2 tệp vừa tải lên xuống bằng cách thay thế các URL bên dưới bằng các URL mà bạn đã tạo cho các tệp trong thư mục tài sản trên Glitch (kiểm tra thư mục tài sản để biết URL tuỳ chỉnh của từng tệp).
Lưu ý khoảng trống giữa hai URL và rằng URL bạn cần sử dụng sẽ khác với URL được hiển thị nhưng sẽ có hình thức tương tự:
terminal
wget https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fmodel.json?v=1616111344958 https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fgroup1-shard1of1.bin?v=1616017964562
Tuyệt vời! Giờ đây, bạn đã tạo bản sao của các tệp được tải lên thư mục www.
Tuy nhiên, hiện tại, các tệp này sẽ được tải xuống với tên lạ. Nếu nhập ls vào thiết bị đầu cuối rồi nhấn Enter, bạn sẽ thấy nội dung như sau:

- Sử dụng lệnh
mvđể đổi tên các tệp. Nhập nội dung sau vào bảng điều khiển và nhấn phím Enter sau mỗi dòng:
terminal:
mv *group1-shard1of1.bin* group1-shard1of1.bin
mv *model.json* model.json
- Cuối cùng, hãy làm mới dự án Glitch bằng cách nhập
refreshvào cửa sổ dòng lệnh rồi nhấn Enter:
terminal:
refresh
Sau khi làm mới, bạn sẽ thấy model.json và group1-shard1of1.bin trong thư mục www của giao diện người dùng:

Tuyệt vời! Bước cuối cùng là cập nhật tệp dictionary.js.
- Chuyển đổi tệp từ vựng mới tải xuống sang định dạng JS chính xác theo cách thủ công thông qua trình chỉnh sửa văn bản hoặc sử dụng công cụ này rồi lưu đầu ra kết quả dưới dạng
dictionary.jstrong thư mụcwww. Nếu đã có tệpdictionary.js, bạn chỉ cần sao chép và dán nội dung mới vào tệp đó rồi lưu tệp.
Thật tuyệt vời! Bạn đã cập nhật thành công tất cả các tệp đã thay đổi và nếu hiện tại bạn thử sử dụng trang web, bạn sẽ nhận thấy cách mô hình được huấn luyện lại có thể giải thích các trường hợp đặc biệt đã phát hiện và học được như minh hoạ:

Như bạn thấy, 6 email đầu tiên hiện được phân loại chính xác là không phải thư rác và 6 email thứ hai đều được xác định là thư rác. Tuyệt lắm!
Hãy thử một số biến thể để xem liệu mô hình có khái quát hoá tốt hay không. Ban đầu, có một câu không chính xác như:
"omg GOOG stock just shot right up! Hãy nhận ngay trước khi quá muộn!"
Giờ đây, email này được phân loại chính xác là thư rác, nhưng điều gì sẽ xảy ra nếu bạn thay đổi thành:
"Vậy là cổ phiếu của XYZ vừa tăng giá trị! Hãy mua ngay trước khi quá muộn!"
Ở đây, bạn nhận được dự đoán là 98% khả năng là thư rác, dự đoán này là chính xác ngay cả khi bạn thay đổi mã chứng khoán và nội dung một chút.
Tất nhiên, nếu thực sự cố gắng phá vỡ mô hình mới này, bạn sẽ có thể làm được. Điều này sẽ dẫn đến việc thu thập thêm nhiều dữ liệu huấn luyện để có cơ hội tốt nhất nhằm nắm bắt thêm nhiều biến thể riêng biệt cho những tình huống phổ biến mà bạn có thể gặp phải trên mạng. Trong một lớp học lập trình trong tương lai, chúng tôi sẽ hướng dẫn bạn cách liên tục cải thiện mô hình bằng dữ liệu trực tiếp khi dữ liệu đó được gắn cờ.
6. Xin chúc mừng!
Xin chúc mừng! Bạn đã tìm cách huấn luyện lại một mô hình học máy hiện có để mô hình này tự cập nhật nhằm hoạt động cho các trường hợp đặc biệt mà bạn tìm thấy và triển khai những thay đổi đó vào trình duyệt bằng TensorFlow.js cho một ứng dụng trong thế giới thực.
Tóm tắt
Trong lớp học lập trình này, bạn đã:
- Phát hiện các trường hợp đặc biệt không hoạt động khi sử dụng mô hình bình luận không liên quan được tạo sẵn
- Đã đào tạo lại mô hình Model Maker để tính đến các trường hợp đặc biệt mà bạn phát hiện được
- Xuất mô hình đã huấn luyện mới sang định dạng TensorFlow.js
- Cập nhật ứng dụng web để sử dụng các tệp mới
Tiếp theo là gì?
Vì vậy, bản cập nhật này hoạt động rất tốt, nhưng cũng như mọi ứng dụng web khác, các thay đổi sẽ diễn ra theo thời gian. Sẽ tốt hơn nhiều nếu ứng dụng liên tục cải thiện theo thời gian thay vì chúng ta phải làm việc này theo cách thủ công mỗi lần. Bạn có thể nghĩ ra cách tự động hoá các bước này để tự động huấn luyện lại mô hình sau khi có, chẳng hạn như 100 bình luận mới được đánh dấu là phân loại không chính xác không? Hãy sử dụng kiến thức kỹ thuật web thông thường, có thể bạn sẽ tìm ra cách tạo một quy trình để thực hiện việc này một cách tự động. Nếu không, đừng lo lắng, hãy chờ lớp học lập trình tiếp theo trong loạt lớp học này để biết cách thực hiện.
Chia sẻ những nội dung bạn tạo với chúng tôi
Bạn cũng có thể dễ dàng mở rộng những gì mình đã tạo hôm nay cho các trường hợp sử dụng sáng tạo khác. Chúng tôi khuyến khích bạn suy nghĩ sáng tạo và tiếp tục khám phá.
Đừng quên gắn thẻ chúng tôi trên mạng xã hội bằng hashtag #MadeWithTFJS để có cơ hội xuất hiện trên blog TensorFlow hoặc thậm chí là các sự kiện trong tương lai. Chúng tôi rất mong được xem những tác phẩm của bạn.
Các lớp học lập trình khác về TensorFlow.js để tìm hiểu sâu hơn
- Sử dụng tính năng lưu trữ Firebase để triển khai và lưu trữ mô hình TensorFlow.js ở quy mô lớn.
- Tạo một webcam thông minh bằng mô hình phát hiện đối tượng được tạo sẵn bằng TensorFlow.js
Các trang web cần xem
- Trang web chính thức của TensorFlow.js
- Các mô hình được tạo sẵn của TensorFlow.js
- TensorFlow.js API
- TensorFlow.js Show & Tell – tìm cảm hứng và xem những gì người khác đã tạo.