TensorFlow.js: 특이 사례를 처리하도록 댓글 스팸 감지 모델 다시 학습시키기

1. 시작하기 전에

이 Codelab은 TensorFlow.js를 사용한 댓글 스팸 감지를 위해 이 시리즈의 이전 Codelab의 최종 결과를 기반으로 빌드되었습니다.

지난 Codelab에서는 가상의 동영상 블로그를 위해 완전히 작동하는 웹페이지를 만들었습니다. 브라우저에서 TensorFlow.js로 구동되는 선행 학습된 댓글 스팸 감지 모델을 사용하여 댓글이 서버로 전송되거나 다른 연결된 클라이언트로 전송되기 전에 스팸 댓글을 필터링할 수 있었습니다.

이 Codelab의 최종 결과는 다음과 같습니다.

a4511e5d445706b1.gif

이 방법은 매우 잘 작동했지만, 감지하지 못한 극단적인 사례가 있습니다. 처리할 수 없었던 상황을 고려하여 모델을 다시 학습시킬 수 있습니다.

이 Codelab은 자연어 처리 (컴퓨터로 인간의 언어를 이해하는 기술)를 사용하는 데 중점을 두고, 직접 만든 기존 웹 앱을 수정하여 (Codelab을 순서대로 진행하는 것이 좋음) 댓글 스팸의 실질적인 문제를 해결하는 방법을 보여줍니다. 댓글 스팸은 오늘날 인기를 얻고 있는 웹 앱에서 작업하는 많은 웹 개발자가 직면하게 될 문제입니다.

이 Codelab에서는 한 단계 더 나아가 현재 트렌드나 인기 있는 논의 주제를 기반으로 시간이 지남에 따라 발전할 수 있는 스팸 메시지 콘텐츠의 변화를 고려하여 모델을 최신 상태로 유지하고 이러한 변경사항을 반영할 수 있도록 ML 모델을 다시 학습시킵니다.

기본 요건

  • 이 시리즈의 첫 번째 Codelab을 완료했습니다.
  • HTML, CSS, JavaScript를 비롯한 웹 기술에 관한 기본 지식

빌드할 항목

실시간 댓글 섹션이 있는 가상의 동영상 블로그용으로 이전에 구축한 웹사이트를 재사용하고, TensorFlow.js를 사용하여 학습된 스팸 감지 모델 버전을 로드하도록 업그레이드하여 이전에는 실패했을 수 있는 특이 사례에서 더 나은 성능을 발휘합니다. 물론 웹 개발자와 엔지니어는 일상 업무에서 작업 중인 모든 웹사이트에서 재사용할 수 있도록 가상의 UX를 변경할 수 있으며 블로그, 포럼 또는 Drupal과 같은 CMS 형태에 맞게 솔루션을 조정할 수 있습니다.

해킹을 시작해 보자...

학습할 내용

실습할 내용은 다음과 같습니다.

  • 선행 학습된 모델에서 장애가 발생한 특이 사례 식별
  • Model Maker를 사용하여 만든 스팸 분류 모델을 다시 학습시킵니다.
  • 이 Python 기반 모델을 TensorFlow.js 형식으로 내보내 브라우저에서 사용하세요.
  • 호스팅된 모델과 해당 사전을 새로 학습된 모델로 업데이트하고 결과 확인

이 실습에서는 HTML5, CSS, JavaScript에 익숙하다고 가정합니다. 'colab'을 통해 Python 코드도 몇 가지 실행합니다. 노트북을 사용하여 Model Maker를 사용하여 만든 모델을 재학습시킬 수 있지만 Python에 대한 지식이 없어도 됩니다.

2. 코딩 설정

이번에도 Glitch.com을 사용하여 웹 애플리케이션을 호스팅하고 수정하게 됩니다. 기본 요건 Codelab을 아직 완료하지 않았다면 여기에서 최종 결과를 클론하면 됩니다. 코드 작동 방식에 관해 궁금한 점이 있다면 계속하기 전에 이 웹 앱을 만드는 방법을 안내한 이전 Codelab을 완료하는 것이 좋습니다.

Glitch에서 리믹스 버튼을 클릭하면 새로운 파일 세트가 만들어지고 수정할 수 있습니다.

3. 이전 솔루션에서 특이 사례 살펴보기

방금 복제한 완성된 웹사이트를 열고 댓글을 입력해 보면 대부분 의도한 대로 작동하여 스팸으로 보이는 댓글이 정상적으로 차단되고 합법적인 응답을 허용한다는 사실을 알 수 있습니다.

그러나 교묘하게 교묘하게 행동하여 모델을 깨뜨리려는 시도를 한다면 언젠가는 성공할 것입니다. 약간의 시행착오를 거쳐 아래와 같은 예시를 수동으로 만들 수 있습니다. 기존 웹 앱에 이를 붙여넣고 콘솔을 확인하여 댓글이 스팸일 가능성이 있는지 확인해 보세요.

문제 없이 게시된 합법적인 댓글 (참음성):

  1. '와, 정말 멋진 동영상이에요.' 스팸 가능성: 47.91854%
  2. "데모가 정말 마음에 들었습니다. 자세한 내용을 알고 계신가요?" 스팸 가능성: 47.15898%
  3. '자세히 알아보려면 어느 웹사이트를 방문해야 하나요?' 스팸 가능성: 15.32495%

이는 훌륭합니다. 위의 모든 확률은 매우 낮으며 조치를 취하기 전에 최소 확률 75% 인 기본 SPAM_THRESHOLD를 성공적으로 통과합니다 (이전 Codelab의 script.js 코드에 정의됨).

이제 스팸은 아니지만 스팸으로 표시되는 좀 더 날카로운 댓글을 작성해 보겠습니다.

스팸으로 표시된 합법적인 댓글 (거짓양성):

  1. '그가 착용한 마스크의 웹사이트 링크를 제공할 수 있나요?' 스팸 가능성: 98.46466%
  2. "Spotify에서 이 노래를 구매할 수 있나요? 누구신지 알려주세요." 스팸 가능성: 94.40953%
  3. "TensorFlow.js 다운로드 방법에 관한 자세한 내용을 문의할 수 있나요?" 스팸 가능성: 83.20084%

이런! 이러한 합법적인 댓글이 허용되어야 하는데 스팸으로 표시되고 있는 것 같습니다. 어떻게 해결할 수 있을까요?

한 가지 간단한 옵션은 SPAM_THRESHOLD의 신뢰도를 98.5% 이상으로 높이는 것입니다. 이 경우 잘못 분류된 댓글이 게시됩니다. 이를 염두에 두고 아래의 다른 가능한 결과를 계속 살펴보겠습니다.

스팸으로 표시된 스팸 댓글 (참양성):

  1. "멋지네요. 웹사이트에서 더 나은 다운로드 링크를 확인해 보세요." 스팸 가능성: 99.77873%
  2. "약을 준비할 수 있는 사람 중에 자세한 내용은 제 pr0file을 참고합니다." 스팸 가능성: 98.46955%
  3. "제 프로필을 보고 더 멋진 동영상을 더 멋지게 다운로드해 보세요. http://example.com" 스팸 가능성: 96.26383%

알겠습니다. 원래 75% 임곗값에서 예상대로 작동하지만 이전 단계에서 SPAM_THRESHOLD을 98.5% 이상의 신뢰도로 변경했으므로 여기서는 예시 2개가 통과되어 임곗값이 너무 높을 수 있습니다. 어쩌면 96% 가 더 나을까요? 하지만 그렇게 하면 이전 섹션의 댓글 중 하나 (거짓양성)가 합법적일 때 98.46466%로 평가되어 스팸으로 표시됩니다.

이 경우 모든 실제 스팸 댓글을 캡처하고 위의 실패에 대해 다시 학습하는 것이 가장 좋습니다. 임곗값을 96% 로 설정하면 모든 참양성이 계속 포착되며 위의 거짓양성 중 2개가 사라집니다. 숫자를 하나만 바꾸는 것도 나쁘지 않은 일입니다.

계속 진행하겠습니다...

게시가 허용된 스팸 댓글 (거짓음성):

  1. "내 프로필을 보고 훨씬 더 멋진 동영상을 더 다운로드해 보세요." 스팸 가능성: 7.54926%
  2. "체육관 트레이닝 수업 pr0file 참조!" 스팸 가능성: 17.49849%
  3. "우주 GOOG 주가가 순식간에 올랐습니다. 너무 늦기 전에 가세요!" 스팸 가능성: 20.42894%

이러한 주석의 경우 SPAM_THRESHOLD 값을 더 변경하기만 하면 할 수 있는 작업이 없습니다. 스팸에 대한 기준을 96% 에서 최대 9% 로 낮추면 실제 댓글이 스팸으로 표시됩니다. 스팸이 합법적임에도 불구하고 평가가 58% 인 댓글도 스팸으로 표시됩니다. 이러한 주석을 처리하는 유일한 방법은 학습 데이터에 포함된 특이 사례로 모델을 다시 학습시켜 스팸 여부에 대해 세상을 바라보는 관점을 조정하는 방법을 학습하는 것입니다.

지금 남은 유일한 옵션은 모델을 재학습시키는 것뿐이지만, 성능도 개선하기 위해 스팸을 호출하기로 결정하는 시점의 기준을 미세 조정하는 방법도 확인했습니다. 인간의 경우 75% 는 상당히 자신 있는 듯합니다. 하지만 이 모델의 경우 예시 입력으로 더 효과적이려면 81.5% 에 가깝게 값을 높여야 했습니다.

여러 모델에서 원활하게 작동하는 하나의 마법 값은 없으며, 이 임곗값은 실제 데이터로 실험한 후에 모델별로 설정해야 합니다.

거짓양성 (또는 음성)이 심각한 결과를 초래할 수 있는 상황 (예: 의료 업계)이 있을 수 있으므로 기준을 매우 높게 조정하고 기준을 충족하지 못한 경우 직접 검토를 추가로 요청할 수 있습니다. 개발자가 선택할 수 있으며 어느 정도의 실험이 필요합니다.

4. 댓글 스팸 감지 모델 다시 학습시키기

이전 섹션에서는 이러한 상황을 고려하여 모델을 재학습시키는 방법밖에 없는 상황에서 모델에서 실패하는 여러 극단적인 사례를 확인했습니다. 프로덕션 시스템에서는 시간이 지남에 따라 사람들이 스팸으로 신고한 댓글이 통과되어 통과되는 것을 발견할 수 있습니다. 또는 신고된 댓글을 검토하는 검토자는 일부 댓글이 실제로는 스팸이 아님을 깨닫고 이러한 댓글을 재학습 대상으로 표시할 수 있습니다. 이러한 특이 사례에 대한 새로운 데이터를 많이 수집했다고 가정하고 (가능한 한 최상의 결과를 얻으려면 이러한 새 문장의 몇 가지 변형이 있어야 함), 이제 이러한 특이 사례를 염두에 두고 모델을 재학습하는 방법을 보여드리겠습니다.

사전 제작된 모델 요약

사용한 사전 제작 모델은 '평균 단어 임베딩'을 사용하는 Model Maker를 통해 서드 파티에서 만든 모델이었습니다. 살펴보겠습니다

Model Maker를 사용하여 모델을 빌드했으므로 모델을 다시 학습시키기 위해 잠시 Python으로 전환한 다음, 브라우저에서 사용할 수 있도록 생성된 모델을 TensorFlow.js 형식으로 내보내야 합니다. 다행히 Model Maker를 사용하면 모델을 매우 간단하게 사용할 수 있습니다. 따라하기가 매우 쉬울 것이며, 그 과정을 안내해 드립니다. 이전에 Python을 사용해 본 적이 없더라도 걱정하지 마세요.

Colab

이 Codelab에서는 다양한 Python 유틸리티가 설치된 Linux 서버를 설정하는 데 그다지 신경 쓰지 않으므로 'Colab 노트북'을 사용하여 웹브라우저를 통해 코드를 실행하면 됩니다. 이러한 노트북은 '백엔드'에 연결할 수 있습니다. - 웹 브라우저 내에서 임의의 코드를 실행하고 결과를 볼 수 있는 몇 가지 항목이 사전 설치된 서버입니다. 빠르게 프로토타입을 제작하거나 이와 같은 튜토리얼에서 사용할 때 매우 유용합니다.

colab.research.google.com으로 이동하면 다음과 같은 시작 화면이 표시됩니다.

6b82258445885c50.png

이제 팝업 창 오른쪽 하단에서 새 노트북 버튼을 클릭하면 다음과 같이 빈 Colab이 표시됩니다.

2d52c8f7afa88564.png

좋습니다. 다음 단계는 작성할 Python 코드를 실행할 수 있도록 프런트엔드 Colab을 백엔드 서버에 연결하는 것입니다. 오른쪽 상단의 연결을 클릭하고 호스팅된 런타임에 연결을 선택하면 됩니다.

fa5f578a1a3d352b.png

연결되면 RAM 및 디스크 아이콘이 다음과 같이 나타납니다.

541c9894fb39d4cb.png

잘하셨습니다. 이제 Python에서 코딩을 시작하여 Model Maker 모델을 다시 학습시킬 수 있습니다. 다음 단계를 따르기만 하면 됩니다.

1단계

현재 비어 있는 첫 번째 셀에서 아래 코드를 복사합니다. 'pip'라는 Python의 패키지 관리자를 사용하여 TensorFlow Lite Model Maker를 설치합니다. 이 Codelab의 독자 대부분이 JS 생태계에서 더 익숙할 수 있는 npm과 유사합니다.

!apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0
!pip install -q tflite-model-maker

하지만 코드를 셀에 붙여넣으면 실행되지 않습니다. 그런 다음, 위의 코드를 붙여넣은 회색 셀 위로 마우스를 가져가면 작은 '재생'이라는 아이콘이 아래 강조표시된 것과 같이 셀 왼쪽에 표시됩니다.

7ac5e3516bed6335.png 재생 버튼을 클릭하여 셀에 입력한 코드를 실행합니다.

이제 Model maker가 설치됩니다.

651f21b04fb648cc.png

표시된 대로 이 셀의 실행이 완료되면 아래의 다음 단계로 이동합니다.

2단계

그런 다음 그림과 같이 새 코드 셀을 추가합니다. 그러면 첫 번째 셀 뒤에 코드를 몇 개 더 붙여넣고 따로 실행할 수 있습니다.

869904a9d774c455.png

다음으로 실행되는 셀에는 노트북의 나머지 부분에서 사용해야 하는 여러 가져오기가 있습니다. 다음을 복사하여 새로 생성된 셀에 붙여넣습니다.

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

Python에 익숙하지 않더라도 상당히 기본적인 내용을 다룹니다. 스팸 분류기에 필요한 일부 유틸리티와 Model Maker 함수를 가져오고 있습니다. 이 과정에서 Model Maker 사용의 필수 조건인 TensorFlow 2.x를 실행 중인지도 확인할 수 있습니다.

마지막으로, 이전과 마찬가지로 셀을 실행하려면 'play' 아이콘을 클릭한 후 다음 단계를 위한 새 코드 셀을 추가하세요.

3단계

다음으로 원격 서버에서 기기로 데이터를 다운로드하고 training_data 변수를 다운로드된 로컬 파일의 경로로 설정합니다.

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는 다운로드한 파일과 같은 간단한 CSV 파일로 모델을 학습시킬 수 있습니다. 텍스트를 저장할 열과 라벨을 포함할 열을 지정하기만 하면 됩니다. 방법은 5단계에서 알아보겠습니다. 원한다면 CSV 파일을 직접 다운로드하여 파일에 들어 있는 내용을 확인해 보세요.

이 파일의 이름은 jm_blog_comments_extras.csv입니다. 이 파일은 첫 번째 댓글 스팸 모델을 생성한 새로운 특이 사례 데이터와 결합된 첫 번째 댓글 스팸 모델을 생성하는 데 사용한 원본 학습 데이터이므로 모두 하나의 파일에 포함됩니다. 학습하려는 새 문장 외에 모델 학습에 사용된 원래 학습 데이터도 필요합니다.

선택사항:CSV 파일을 다운로드하고 마지막 몇 줄을 확인하면 이전에 제대로 작동하지 않았던 특이 케이스의 예가 표시됩니다. 미리 만들어진 모델이 자체 학습에 사용하는 기존 학습 데이터 끝에 방금 추가되었습니다.

이 셀을 실행한 다음 실행이 완료되면 새 셀을 추가하고 4단계로 이동합니다.

4단계

Model Maker를 사용하면 모델을 처음부터 빌드할 필요가 없습니다. 일반적으로 기존 모델을 사용한 다음 필요에 맞게 맞춤설정합니다.

Model Maker는 사전에 학습된 모델 임베딩을 여러 개 제공하지만, 가장 쉽고 빠르게 시작할 수 있는 방법은 이전 Codelab에서 웹사이트를 빌드하는 데 사용한 average_word_vec입니다. 코드는 다음과 같습니다.

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

새 셀에 붙여넣은 후 실행합니다.

Google Play에서

num_words

매개변수

이는 모델이 사용할 단어의 수입니다. 많을수록 좋다고 생각할 수도 있지만, 일반적으로 각 단어가 사용되는 빈도에 따라 최적의 결과가 나옵니다. 전체 코퍼스의 모든 단어를 사용하는 경우 모델이 한 번만 사용된 단어의 가중치를 학습하고 균형을 맞추려고 할 수 있습니다. 이는 그다지 유용하지 않습니다. 모든 텍스트 코퍼스에서 많은 단어가 한두 번만 사용된다는 사실을 알 수 있으며, 이러한 단어는 전반적인 감정에 거의 영향을 주지 않으므로 일반적으로 모델에 사용하지 않는 것이 좋습니다. 따라서 num_words 매개변수를 사용하여 원하는 단어 수에 맞게 모델을 조정할 수 있습니다. 여기서 숫자가 작을수록 모델이 더 작고 빠르지만 인식되는 단어 수가 적어지므로 정확도가 떨어질 수 있습니다. 여기서 숫자가 클수록 모델이 더 크고 속도가 느려질 수 있습니다. 최적의 균형을 찾는 것이 핵심이며, 머신러닝 엔지니어로서 사용 사례에 가장 적합한 방식을 찾아내는 것은 여러분에게 달려 있습니다.

Google Play에서

wordvec_dim

매개변수

wordvec_dim 매개변수는 각 단어의 벡터에 사용할 차원 수입니다. 이러한 차원은 본질적으로 특정 단어를 측정할 수 있는 다양한 특성 (학습 시 머신러닝 알고리즘에 의해 생성됨)이며, 프로그램은 유의미한 방식으로 유사한 단어를 가장 잘 연관시키는 데 사용됩니다.

예를 들어 '의료'에 대한 측정기준이 '약' 같은 단어는 'xray'와 같이 점수가 높은 다른 단어와 연관이 있지만, '고양이'가 이 측정기준에서 높은 점수를 받을 수 있음 이 측정기준에서 낮은 점수를 얻습니다. '의료적 차원'이 와

'의료적 차원'에서 점수가 높은 단어의 경우 단어를 인체와 연관시키는 2차원이 유용할 수도 있습니다. '다리', '팔', '목'과 같은 단어 의학 분야에서도 상당히 높은 점수를 받을 수 있습니다.

모델은 이러한 측정기준을 사용하여 스팸과 관련될 가능성이 더 높은 단어를 감지할 수 있습니다. 스팸 이메일에 의학 및 신체 부위를 모두 포함하는 단어가 포함되어 있을 가능성이 더 높을 수 있습니다.

연구에 따르면 단어 수의 네제곱근이 이 매개변수에 적합하다는 것이 경험의 법칙에 따라 결정됩니다. 2, 000단어를 사용하는 경우 7차원으로 시작하는 것이 좋습니다. 사용되는 단어 수를 변경하는 경우 이 값도 변경할 수 있습니다.

Google Play에서

seq_len

매개변수

모델의 입력 값은 일반적으로 매우 엄밀하게 규정됩니다. 언어 모델의 경우, 이는 언어 모델이 특정한 정적 길이의 문장을 분류할 수 있음을 의미합니다. 이는 '시퀀스 길이'를 나타내는 seq_len 매개변수에 의해 결정됩니다. 단어를 숫자 (또는 토큰)로 변환하면 문장이 이러한 토큰의 시퀀스가 됩니다. 따라서 이 경우에는 20개의 토큰이 있는 문장을 분류하고 인식하도록 모델을 학습시킵니다. 이보다 긴 문장은 잘립니다. 더 짧으면 이 시리즈의 첫 번째 Codelab과 마찬가지로 패딩됩니다.

5단계 - 학습 데이터 로드

앞에서 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입니다. 다른 속성은 4단계에서 만든 모델 사양과 구분 기호 문자를 설정합니다. 이 경우에는 파일이 쉼표로 구분되므로 쉼표입니다. 또한 학습 데이터를 무작위로 재배열하는 셔플 매개변수를 설정하여 유사하거나 함께 수집된 항목이 데이터 세트 전체에 무작위로 분산되도록 합니다.

그런 다음 data.split()를 사용하여 데이터를 학습 데이터와 테스트 데이터로 분할합니다. .9는 데이터 세트의 90% 가 학습에 사용되고 나머지는 테스트에 사용될 것임을 나타냅니다.

6단계 - 모델 빌드

모델을 빌드하는 코드를 추가할 다른 셀을 추가합니다.

model = text_classifier.create(train_data, model_spec=spec, epochs=50)

그러면 Model Maker를 사용하여 Text Classifier 모델을 만들고 사용할 학습 데이터(4단계에서 정의함), 모델 사양(4단계에서 설정함), 세대 수(이 경우 50)를 지정합니다.

머신러닝의 기본 원칙은 패턴 일치의 한 형태라는 것입니다. 처음에는 단어에 대해 선행 학습된 가중치를 로드하고 '예측'을 사용하여 그룹화하려고 시도합니다. 그룹화된 포드와 그렇지 않은 것을 구별할 수 있습니다. 처음에는 다음과 같이 모델이 시작되기 때문에 50:50에 근접할 가능성이 높습니다.

bbe4b896d8060bc4.png

그런 다음 이 결과를 측정하고 모델의 가중치를 변경하여 예측을 조정한 다음 다시 시도합니다. 여기까지가 한 세대입니다. epochs=50을 지정하면 해당 '루프'가 50회 반복하면 됩니다.

4ed286d114960ca.png

따라서 50세대에 도달할 무렵에는 모델이 훨씬 더 높은 수준의 정확도를 보고합니다. 여기에서는 99.1%를 나타냅니다.

7단계 - 모델 내보내기

학습이 완료되면 모델을 내보낼 수 있습니다. TensorFlow는 자체 형식으로 모델을 학습시키므로 웹페이지에서 사용할 수 있도록 TensorFlow.js 형식으로 변환해야 합니다. 새 셀에 다음을 붙여넣고 실행하면 됩니다.

model.export(export_dir="/js_export/", export_format=[ExportFormat.TFJS, ExportFormat.LABEL, ExportFormat.VOCAB])
!zip -r /js_export/ModelFiles.zip /js_export/

이 코드를 실행한 후 Colab 왼쪽에 있는 작은 폴더 아이콘을 클릭하면 위에서 내보낸 폴더 (루트 디렉터리. 한 단계 위로 이동해야 할 수 있음)로 이동하여 ModelFiles.zip에 포함된 내보낸 파일의 ZIP 번들을 찾을 수 있습니다.

이 ZIP 파일을 첫 번째 Codelab에서와 마찬가지로 사용하게 되므로 지금 컴퓨터에 다운로드합니다.

cda3c681ebf144b4.png

좋습니다. Python 부분이 끝났으므로 이제 익숙하고 좋아하는 JavaScript로 돌아갈 수 있습니다. 다양한 혜택이 마음에 드셨나요?

5. 새 머신러닝 모델 제공

이제 모델을 로드할 준비가 거의 되었습니다. 그렇게 하려면 먼저 Codelab 앞부분에서 다운로드한 새 모델 파일을 업로드하여 코드 내에서 호스팅하고 사용할 수 있도록 해야 합니다.

먼저 방금 실행한 Model Maker Colab 노트북에서 다운로드한 모델 파일의 압축을 아직 풀지 않았다면 먼저 압축을 풉니다. 다양한 폴더에 다음 파일이 포함되어 있습니다.

3ace87c57b98cfbc.png

이 제품에는 어떤 제품이 있나요?

  • model.json - 학습된 TensorFlow.js 모델을 구성하는 파일 중 하나입니다. JS 코드에서 이 특정 파일을 참조합니다.
  • group1-shard1of1.bin: 내보낸 TensorFlow.js 모델에 대해 저장된 데이터의 상당 부분이 포함된 바이너리 파일이며 다운로드를 위해 서버 어딘가에서 호스팅되어야 하며 위의 model.json와 동일한 디렉터리에 있어야 합니다.
  • vocab - 확장자가 없는 이 이상한 파일은 Model Maker에서 제공하는 것으로, 문장에서 단어를 인코딩하여 모델이 단어 사용 방법을 이해할 수 있도록 하는 방법을 보여줍니다. 이 내용은 다음 섹션에서 자세히 설명합니다.
  • labels.txt - 모델이 예측할 결과 클래스 이름만 포함합니다. 이 모델의 경우 텍스트 편집기에서 이 파일을 열면 'false'가 표시됩니다. 및 'true' '스팸 아님'을 표시하는 목록 또는 '스팸' 사용할 수도 있습니다

TensorFlow.js 모델 파일 호스팅

먼저 웹페이지를 통해 액세스할 수 있도록 웹 서버에서 생성된 model.json*.bin 파일을 배치합니다.

기존 모델 파일 삭제

이 시리즈의 첫 번째 Codelab의 최종 결과를 기반으로 빌드하므로 먼저 업로드된 기존 모델 파일을 삭제해야 합니다. Glitch.com을 사용하는 경우 왼쪽의 파일 패널에서 model.jsongroup1-shard1of1.bin를 확인하고 각 파일의 점 3개 메뉴 드롭다운을 클릭한 후 다음과 같이 삭제를 선택하면 됩니다.

c72bfdc5a0db4d0d.png

Glitch에 새 파일 업로드하기

좋습니다. 이제 새 항목을 업로드합니다.

  1. Glitch 프로젝트의 왼쪽 패널에서 assets 폴더를 열고 이름이 동일한 기존에 업로드한 애셋을 삭제합니다.
  2. 애셋 업로드를 클릭하고 group1-shard1of1.bin를 선택하여 이 폴더에 업로드합니다. 업로드가 완료되면 다음과 같이 표시됩니다.

c6739dd30e6df977.png

  1. 좋습니다. model.json 파일에 대해서도 동일한 작업을 수행하여 다음과 같이 애셋 폴더에 두 개의 파일이 있어야 합니다.

b7858eb08bea9ac3.png

  1. 방금 업로드한 group1-shard1of1.bin 파일을 클릭하면 URL을 해당 위치에 복사할 수 있습니다. 다음과 같이 이 경로를 복사합니다.

19999f6644f61153.png

  1. 이제 화면 왼쪽 하단에서 도구를 클릭합니다. 터미널. 터미널 창이 로드될 때까지 기다립니다.
  2. 로드가 완료되면 다음을 입력한 다음 Enter 키를 눌러 디렉터리를 www 폴더로 변경합니다.

터미널:

cd www
  1. 다음으로, wget를 사용하여 아래 URL을 Glitch의 애셋 폴더에 있는 파일에 관해 생성한 URL로 대체하여 방금 업로드한 파일 2개를 다운로드합니다. 애셋 폴더에서 각 파일의 맞춤 URL을 확인합니다.

두 URL 사이의 공백과 사용해야 하는 URL은 표시된 URL과 다르지만 모양은 비슷하다는 점에 유의하세요.

터미널

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

잘하셨습니다. 이제 www 폴더에 업로드된 파일의 사본을 만들었습니다.

하지만 지금은 이상한 이름으로 다운로드됩니다. 터미널에 ls를 입력하고 Enter 키를 누르면 다음과 같이 표시됩니다.

6c417fdfc64762f1.png

  1. mv 명령어를 사용하여 파일 이름을 바꿉니다. 콘솔에 다음을 입력하고 각 줄 다음에 Enter 키를 누릅니다.

터미널:

mv *group1-shard1of1.bin* group1-shard1of1.bin
mv *model.json* model.json
  1. 마지막으로 터미널에 refresh를 입력하고 Enter 키를 눌러 Glitch 프로젝트를 새로고침합니다.

터미널:

refresh

새로고침하면 사용자 인터페이스의 www 폴더에 model.jsongroup1-shard1of1.bin가 표시됩니다.

530bb651f4dbac64.png

좋습니다. 마지막 단계는 dictionary.js 파일을 업데이트하는 것입니다.

  1. 새로 다운로드한 어휘 파일을 직접 텍스트 편집기를 사용하거나 이 도구를 사용하여 올바른 JS 형식으로 변환하고 결과 출력을 www 폴더 내에 dictionary.js로 저장합니다. dictionary.js 파일이 이미 있다면 새 콘텐츠를 복사하여 붙여넣고 파일을 저장하면 됩니다.

축하합니다. 변경된 모든 파일을 성공적으로 업데이트했으므로 이제 웹사이트를 사용해 보면 재학습된 모델이 다음과 같이 발견되고 학습된 특이 사례를 어떻게 처리할 수 있는지 알 수 있습니다.

64e5cf6f6e158d6c.gif

보시다시피 처음 6개는 이제 스팸이 아닌 것으로 올바르게 분류되고 두 번째 배치 6개는 모두 스팸으로 식별됩니다. 그렇다면

일반화가 잘 되었는지 확인하기 위해 몇 가지 변형도 시도해 보겠습니다. 원래 다음과 같은 실패 문장이 있었습니다.

"omg GOOG 주가가 급등했습니다! 너무 늦기 전에 가세요!"

이제 스팸으로 올바르게 분류되지만 다음으로 변경하면 어떻게 되나요?

"그래서 XYZ 주식의 가치가 올라갔습니다. 너무 늦기 전에 얼른 구매해 주세요."

여기서는 주식 기호와 문구를 약간 변경했더라도 스팸일 가능성이 98% 라는 예측이 표시됩니다.

물론 이 새로운 모델을 부수고자 한다면 훨씬 더 많은 학습 데이터를 수집하여 온라인에서 발생할 수 있는 일반적인 상황에서 더 고유한 변형을 캡처할 가능성을 높일 수 있습니다. 향후 Codelab에서는 신고된 실시간 데이터를 사용하여 모델을 지속적으로 개선하는 방법을 보여드리겠습니다.

6. 축하합니다.

수고하셨습니다. 기존 머신러닝 모델을 재학습시켜 특이한 사례에 적합하도록 자체적으로 업데이트되도록 하고, 이러한 변경 사항을 TensorFlow.js를 사용하여 실제 애플리케이션용으로 브라우저에 배포했습니다.

요약

이 Codelab에서는 다음 사항을 다루었습니다.

  1. 사전 제작된 댓글 스팸 모델을 사용할 때 효과적이지 않은 극단적인 사례를 발견했습니다.
  2. 발견한 특이 사례를 고려하도록 Model Maker 모델을 다시 학습시켰습니다.
  3. 새로 학습된 모델을 TensorFlow.js 형식으로 내보냈습니다.
  4. 새 파일을 사용하도록 웹 앱을 업데이트했습니다.

다음 단계

이번 업데이트는 아주 잘 작동하지만, 다른 웹 앱과 마찬가지로 시간이 지남에 따라 변경사항이 있을 것입니다. 매번 수동으로 앱을 개선하는 대신 앱이 지속적으로 자체적으로 개선되면 훨씬 좋습니다. 예를 들어 잘못 분류된 것으로 표시된 새 댓글이 100개가 된 후 모델을 자동으로 재학습시키기 위해 이러한 단계를 어떻게 자동화했을 수 있었을까요? 일반적인 웹 엔지니어링 작업을 해보면 자동으로 이 작업을 수행하는 파이프라인을 만드는 방법을 알아낼 수 있습니다. 그렇지 않더라도 걱정하지 마세요. 방법을 보여주는 시리즈의 다음 Codelab을 확인하세요.

결과물 공유

오늘 만든 콘텐츠를 다른 창의적인 사용 사례에도 쉽게 확장할 수 있습니다. 고정관념에서 벗어난 생각을 계속하고 해킹을 이어가시기 바랍니다.

소셜 미디어에서 #MadeWithTFJS 해시태그를 사용하여 Google을 태그하고 프로젝트가 TensorFlow 블로그향후 이벤트에 소개될 기회를 잡으세요. 여러분의 결과물을 기대하겠습니다.

더 자세히 알아볼 수 있는 추가 TensorFlow.js Codelab

확인할 웹사이트