댓글 스팸 머신러닝 모델 구축

1. 시작하기 전에

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

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

기본 요건

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

학습할 내용

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

필요한 항목

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. 데이터 다운로드

이제 클라우드 서버에서 기기로 데이터를 다운로드하고 로컬 파일을 가리키도록 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 매개변수는 각 단어의 벡터에 사용할 차원의 수입니다. 연구에서 결정된 경험 법칙은 단어 수의 4제곱근이라는 것입니다. 예를 들어 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단계에서 설정)와 모델 사양(4단계에서 설정) 및 세대 수(이 경우 50)를 지정합니다.

머신러닝의 기본 원리는 패턴 일치의 한 형태입니다. 처음에는 단어에 대해 사전 학습된 가중치를 로드하고, 그룹으로 묶어서 볼 때 스팸을 나타내는 단어와 그렇지 않은 단어를 예측하여 단어를 그룹화하려고 시도합니다. 모델이 시작 단계에 있으므로 처음에는 50:50에 가까울 수 있습니다.

b94b00f0b155db3d.png

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

85f1d21c0b64d654.png

50세대에 도달하면 모델이 보고하는 정확도가 크게 향상됩니다. 이 경우 99%를 보여줍니다.

오른쪽에는 검증 정확도 수치가 표시됩니다. 이 수치는 모델이 이전에 '본' 적이 없는 데이터를 분류하는 방식을 나타내므로 일반적으로 학습 정확도보다 약간 낮습니다. 이 수치는 이전에 따로 설정한 10% 테스트 데이터를 사용합니다.

5be7967ec70e4302.png

8. 모델 내보내기

학습이 완료되면 모델을 내보낼 수 있습니다.

TensorFlow는 자체 형식으로 모델을 학습시키며, 모바일 앱 내에서 사용하려면 TFLITE 형식으로 변환해야 합니다. Model Maker는 이 복잡성을 처리합니다.

디렉터리를 지정하여 모델을 내보내기만 하면 됩니다.

model.export(export_dir='/mm_spam')

이 디렉터리 내에 model.tflite 파일이 표시됩니다. 오프라인 저장하고 다음 Codelab에서 Android 앱에 추가할 때 필요합니다.

iOS 고려사항

방금 내보낸 .tflite 모델은 모델에 관한 메타데이터가 모델 내에 삽입되어 있고 Android 스튜디오에서 이 메타데이터를 읽을 수 있으므로 Android에 적합합니다.

이 메타데이터는 모델이 인식하는 단어를 나타내는 토큰의 사전이 포함되어 있으므로 매우 중요합니다. 앞서 단어가 토큰이 되고 이러한 토큰에 감정을 나타내는 벡터가 부여된다고 배운 것을 기억하시나요? 모바일 앱은 이러한 토큰을 알아야 합니다. 예를 들어 'dog'가 42로 토큰화되고 사용자가 문장에 'dog'를 입력하면 모델이 이를 이해할 수 있도록 앱에서 'dog'를 42로 변환해야 합니다. Android 개발자는 이를 더 쉽게 사용할 수 있는 'TensorFlow Lite 작업 라이브러리'를 보유하지만 iOS에서는 어휘를 처리해야 하므로 어휘를 사용할 수 있어야 합니다. Model Maker는 export_format 매개변수를 지정하여 이를 내보낼 수 있습니다. 따라서 모델의 라벨과 어휘를 가져오려면 다음을 사용하면 됩니다.

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

9. 축하합니다

이 Codelab에서는 모델을 빌드하고 내보내기 위한 Python 코드를 살펴보았습니다. 마지막에 .tflite 파일이 생성됩니다.

다음 Codelab에서는 이 모델을 사용하도록 Android 앱을 수정하여 스팸 댓글 분류를 시작하는 방법을 알아봅니다.