TensorFlow Lite Model Maker로 댓글 스팸 감지 모델 학습

1. 시작하기 전에

이 Codelab에서는 TensorFlow 및 TensorFlow Lite Model Maker로 만든 코드를 검토하여 댓글 스팸을 기반으로 하는 데이터 세트로 모델을 만듭니다. 원본 데이터는 Kaggle에서 제공됩니다. 이 데이터는 단일 CSV 파일로 수집되었으며 비정상 텍스트, 마크업, 반복 단어 등을 삭제하는 정리 과정을 거쳤습니다. 따라서 텍스트 대신 모델에 집중하기가 수월합니다.

검토할 코드가 이 문서에서 제공되지만 Colaboratory에서 코드 작성 과정을 따라가 보는 것이 좋습니다.

기본 요건

  • 이 Codelab은 머신러닝을 처음 접하는 숙련된 개발자를 대상으로 작성되었습니다.
  • 이 Codelab은 Flutter 앱에서 텍스트 분류 시작하기 개발자 과정의 일부입니다. 이전 활동을 아직 완료하지 않았다면 여기에서 멈추고 이전 활동을 진행하시기 바랍니다.

학습할 내용

  • Colab으로 TensorFlow Lite Model Maker를 설치하는 방법
  • Colab 서버에서 기기로 데이터를 다운로드하는 방법
  • 데이터 로더 사용 방법
  • 모델 빌드 방법

필요한 항목

2. TensorFlow Lite Model Maker 설치

  • Colab을 엽니다. 노트북의 첫 번째 셀에서 TensorFLow Lite Model Maker를 자동으로 설치합니다.
!pip install -q tflite-model-maker

완료되면 다음 셀로 이동합니다.

3. 코드 가져오기

다음 셀에는 노트북의 코드에서 사용해야 하는 여러 가져오기가 있습니다.

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')

또한 Model Maker를 사용하는 데 필요한 TensorFlow 2.x를 실행했는지 여부를 확인합니다.

4. 데이터 다운로드

이제 Colab 서버에서 기기로 데이터를 다운로드하고 로컬 파일을 가리키도록 data_file 변수를 설정합니다.

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는 이와 같은 간단한 CSV 파일로 모델을 학습시킬 수 있습니다. 텍스트를 포함하는 열과 라벨을 포함하는 열을 지정하기만 하면 되며, 이 Codelab의 뒷부분에서 그 방법을 보여줍니다.

5. 사전 학습된 임베딩

일반적으로 Model Maker를 사용할 때는 모델을 처음부터 빌드하지 않습니다. 필요에 따라 맞춤설정한 기존 모델을 사용합니다.

이와 같은 언어 모델에는 사전 학습된 임베딩이 사용됩니다. 임베딩의 원리는 단어를 숫자로 변환하고 전체 코퍼스의 각 단어에 특정 숫자를 부여하는 것입니다. 임베딩은 단어의 '방향'을 설정하여 단어의 감정을 판단하는 데 사용되는 벡터입니다. 예를 들어 댓글 스팸 메시지에 자주 사용되는 단어의 벡터는 특정 방향을 가리키고, 그렇지 않은 단어의 벡터는 반대 방향을 가리킵니다.

사전 학습된 임베딩을 사용할 때는 이미 방대한 텍스트로 감정 학습을 완료한 단어의 모음인 코퍼스를 가지고 시작하므로 완전히 처음부터 시작할 때보다 훨씬 빠르게 문제를 해결할 수 있습니다.

Model Maker가 제공하는 여러 가지 사전 학습 임베딩을 사용할 수 있지만, 가장 쉽고 빠른 방법은 average_word_vec 옵션으로 시작하는 것입니다.

다음은 해당 코드입니다.

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

num_words 매개변수

모델에서 사용할 단어 수도 지정합니다.

많을수록 좋다고 생각할 수도 있지만, 일반적으로 각 단어의 사용 빈도에 따라 알맞은 개수가 있습니다. 전체 코퍼스의 모든 단어를 사용하면 한 번만 사용된 단어에 대해서도 모델이 학습 및 방향 설정을 시도합니다. 모든 텍스트 코퍼스에는 한두 번만 사용되는 단어가 많은데, 이러한 단어는 전반적인 감정에 거의 영향을 주지 않으므로 모델에 포함하지 않아도 무방합니다.

num_words 매개변수를 사용하여 원하는 단어 수에 따라 모델을 조정할 수 있습니다. 숫자가 작을수록 더 작은 모델을 빠르게 제공할 수 있지만 인식되는 단어 수가 적어지므로 정확도가 떨어질 수 있습니다. 반면 숫자가 클수록 더 큰 모델을 느리게 제공하게 됩니다. 적절한 균형을 찾는 것이 중요합니다.

wordvec_dim 매개변수

wordved_dim 매개변수는 각 단어의 벡터에 사용할 차원의 수입니다. 연구 결과에 따른 일반적인 규칙은 단어 수의 네제곱근을 사용하는 것입니다. 예를 들어 단어 2,000개를 사용하는 경우 7부터 시도하는 것이 좋습니다. 사용하는 단어 수를 변경하는 경우 이 값도 변경할 수 있습니다.

seq_len 매개변수

모델의 입력 값은 일반적으로 매우 엄밀하게 규정됩니다. 특히 언어 모델은 특정한 정적 길이를 갖는 문장을 분류할 수 있습니다. 이는 seq_len 매개변수, 즉 시퀀스 길이에 따라 결정됩니다.

단어를 숫자 또는 토큰으로 변환하면 문장이 이러한 토큰의 시퀀스가 됩니다. 이 경우 문장을 20개 토큰으로 분류하고 인식하도록 모델이 학습됩니다. 이보다 긴 문장은 잘립니다. 이보다 짧은 문장은 패딩됩니다. 코퍼스에서 이러한 용도로 지정된 <PAD> 토큰을 확인할 수 있습니다.

6. 데이터 로더 사용

앞에서 CSV 파일을 다운로드했습니다. 이제 데이터 로더를 사용하여 이 파일을 모델이 인식할 수 있는 학습 데이터로 변환할 차례입니다.

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)

편집기에서 CSV 파일을 열면 각 행에 값이 2개뿐이며, 파일의 첫 번째 줄에 있는 텍스트가 해당 값을 설명합니다. 일반적으로 각 항목이 열로 간주됩니다.

첫 번째 열의 설명어는 commenttext이며, 각 행의 첫 번째 항목은 주석 텍스트입니다. 마찬가지로 두 번째 열의 설명어는 spam이며, 각 행의 두 번째 항목은 텍스트가 댓글 스팸으로 간주되는지 여부를 나타내는 True 또는 False,입니다. 다른 속성은 이전에 만든 model_spec 변수와 구분 기호 문자를 설정합니다. 이 경우에는 파일이 쉼표로 구분되므로 쉼표입니다. 이 데이터를 모델 학습에 사용할 것이므로 is_TrainingTrue로 설정되어 있습니다.

모델 테스트를 위해 데이터 중 일부를 보관해 두는 것이 좋습니다. 90%는 학습용으로, 나머지 10%는 테스트/평가용으로 데이터를 분할합니다. 이렇게 할 때는 테스트 데이터를 데이터 세트의 '하위' 10%가 아니라 무작위로 선택해야 하므로 데이터를 로드할 때 shuffle=True를 사용하여 무작위화합니다.

7. 모델 빌드

다음 셀에서는 코드 한 줄을 사용하여 모델을 빌드합니다.

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

이 코드는 Model Maker를 사용하여 텍스트 분류기 모델을 만듭니다. 사용자는 4단계에서 설정한 대로 사용할 학습 데이터와 모델 사양을 지정하고 세대 수(여기에서는 50)를 지정합니다.

ML의 기본 원리는 패턴 일치의 한 형태입니다. 처음에는 단어에 대해 사전 학습된 가중치를 로드하고, 그룹으로 묶어서 볼 때 스팸을 나타내는 단어와 그렇지 않은 단어를 예측하여 단어를 그룹화하려고 시도합니다. 초기 상태에서는 모델이 이제 막 시작되었기 때문에 균등하게 분할되는 경향이 있습니다.

c42755151d511ce.png

그런 다음 이번 학습 세대의 결과를 측정하고 최적화 코드를 실행하여 예측을 수정한 후 다시 시도합니다. 여기까지가 한 세대입니다. 따라서 epochs=50을 지정하면 이 '루프'가 50번 반복됩니다.

7d0ee06a5246b58d.png

50세대에 도달하면 모델이 보고하는 정확도가 크게 향상됩니다. 여기에서는 99%가 표시되었습니다.

검증 정확도 수치는 모델이 아직 접하지 못한 데이터를 분류하는 방식을 나타내므로 일반적으로 학습 정확도보다 약간 낮습니다. 앞에서 따로 나누었던 10%의 테스트 데이터가 사용됩니다.

f063ff6e1d2add67.png

8. 모델 내보내기

  1. 이 셀을 실행하여 디렉터리를 지정하고 모델을 내보냅니다.
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
  1. /mm_spam_savedmodel 폴더 전체를 압축하고 생성된 mm_spam_savedmodel.zip 파일을 다운로드합니다. 다음 Codelab에서 이 파일이 필요합니다.
# 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. 수고하셨습니다.

이 Codelab에서는 Python 코드를 따라가면서 모델을 빌드하고 내보냈습니다. 이제 그 결과물로서 SavedModel과 라벨 및 어휘를 갖게 되었습니다. 다음 Codelab에서는 이 모델을 사용하여 스팸 댓글 분류를 시작하는 방법을 알아봅니다.

자세히 알아보기