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

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

다음으로 Cloud 서버에서 기기로 데이터를 다운로드하고 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를 사용하여 Text Classifier 모델을 만들고 사용할 학습 데이터(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에서 이 항목이 필요하고 다음 Codelab에서 Android 앱에 추가합니다.

iOS 고려사항

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

이 메타데이터는 모델이 인식할 때 단어를 나타내는 토큰의 사전을 포함하므로 매우 중요합니다. 단어가 토큰이 되고, 이러한 토큰은 감정에 대한 벡터를 제공한다는 것을 이전에 배웠던 것을 기억하십니까? 모바일 앱은 이러한 토큰을 알아야 합니다. 예를 들어 '개'가 42로 토큰화되었으며 사용자는 '개'를 앱에서 '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 앱을 수정하는 방법을 알아봅니다.