TensorFlow.js: 댓글 스팸 감지 모델을 다시 학습하여 특이 사례 처리

1. 시작하기 전에

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

마지막 Codelab에서는 가상의 동영상 블로그용으로 완전히 작동하는 웹페이지를 만들었습니다. 브라우저

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

ee0f13398ea4e91e.gif

이 방식은 매우 효과적이긴 했지만 감지할 수 없었던 극단적인 사례가 존재합니다. 모델이 처리할 수 없었던 상황을 고려하여 모델을 다시 학습시킬 수 있습니다.

이 Codelab은 자연어 처리 (컴퓨터에서 인간의 언어를 이해하는 기술) 사용에 중점을 두고 개발자가 만든 기존 웹 앱을 수정하는 방법을 보여줍니다 (권장).Codelab을 순서대로 )를 비롯하여 많은 웹 개발자가 오늘날의 수많은 웹 웹 앱을 작업하고 있습니다.

이 Codelab에서는 한 단계 더 나아가 ML 모델을 재학습시켜 시간이 지남에 따라 변할 수 있는 스팸 메시지 콘텐츠의 변화를 살펴보고, 현재 트렌드와 인기 있는 주제를 기반으로 모델을 최신 상태로 유지할 수 있도록 합니다. 변경할 수 있습니다

기본 요건

  • 이 시리즈의 첫 번째 Codelab을 완료했습니다.
  • HTML, CSS, 자바스크립트를 비롯한 웹 기술 관련 기본 지식

빌드할 항목

이전에 빌드한 웹사이트를 가상의 동영상 블로그에 가상의 동영상 섹션으로 재사용하고 TensorFlow.js를 사용해 학습된 스팸 감지 모델의 커스텀 모델을 로드하도록 업그레이드하여 이전에 실패한 에지 케이스에서 더 나은 성능을 발휘합니다. 가 있는지 진단합니다. 물론 웹 개발자와 엔지니어는 일상적으로 작업하는 모든 웹사이트에서 재사용하려는 이 가상 UX를 변경하고 고객, 사용 사례(블로그, 포럼 등)에 맞게 솔루션을 조정할 수 있습니다. CMS(예: Drupal)를 사용해서는 안 됩니다.

해킹 시작하기

과정 내용

다음을 수행합니다.

  • 선행 학습된 모델이 실패한 특이 사례 파악하기
  • Model Maker를 사용하여 만든 스팸 분류 모델을 다시 학습시킵니다.
  • 브라우저에서 사용할 수 있도록 이 Python 기반 모델을 TensorFlow.js 형식으로 내보냅니다.
  • 새로 학습된 모델로 호스팅된 모델 및 사전을 업데이트하고 결과를 확인합니다.

이 실습에서는 HTML5, CSS, 자바스크립트에 익숙하다고 가정합니다. 또한 'colab' 노트북을 통해 Python 코드를 실행하여 Model Maker를 사용하여 만든 모델을 다시 학습시킵니다. 그러나 Python에 익숙하지 않아도 됩니다.

2 코드 설정

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

Glitch에서 remix 버튼을 클릭하여 포크하고 수정할 수 있는 새로운 파일 세트를 만듭니다.

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. '일부 의약품을 접종할 수 있는 사람을 알고 있습니다.'
  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. "앗!! 너무 늦지 마세요." 확률 스팸: 20.42894%

이러한 주석의 경우 SPAM_THRESHOLD 값을 추가로 변경하기만 하면 됩니다. 스팸에 대한 기준점을 96% 에서 9% 로 낮추면 진실된 댓글이라도 스팸으로 분류되며 그중 58% 는 스팸으로 표시됩니다. 이러한 댓글을 처리하는 유일한 방법은 학습 데이터에 포함된 극단적인 사례로 모델을 다시 학습시켜 스팸 여부에 따라 세상을 보는 관점을 학습하는 것입니다.

지금 남은 유일한 옵션은 모델을 다시 학습시키는 것이지만, 무언가를 스팸하기로 결정했을 때 성능을 개선하기 위해 기준을 정하는 방법도 확인했습니다. 사람의 관점에서는 75% 가 상당히 자신감을 갖고 있지만, 이 모델에서는 예시 입력의 효과를 더욱 높이려면 81.5% 에 근접해야 했습니다.

다양한 모델 간에 잘 작동하는 마법 같은 값은 없으며, 이 임곗값은 실제 데이터로 효과적인 실험을 진행한 후 모델별로 설정해야 합니다.

거짓양성 (또는 부정적)(예: 의료 업계)에 심각한 결과가 초래될 수 있으므로 기준점을 매우 높게 설정하여 기준을 충족하지 못하는 기준에 대해서는 직접 검토를 요청할 수 있습니다. 이 선택은 개발자로서 선택이므로 실험이 필요합니다.

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

이전 섹션에서는 이러한 실패를 고려하여 모델을 재학습시키는 유일한 옵션인 모델에서 실패한 극단적인 사례의 수를 확인했습니다. 프로덕션 시스템에서는 시간이 지남에 따라 사람들이 댓글을 스팸으로 신고하면 검토자가 신고한 댓글을 검토하거나 검토자가 실제로 스팸이 아님을 알게 되며 이러한 댓글을 재학습으로 표시할 수 있으므로 시간이 지남에 따라 발견됩니다. 이러한 극단적인 사례에 대한 많은 새로운 데이터를 수집했다면 (가능한 경우 이러한 새 문장을 다양하게 변형해야 함) 이러한 극단적인 사례를 염두에 두고 모델을 다시 학습시키는 방법을 알아보겠습니다.

사전 제작된 모델 요약

사전 제작된 모델은 모델 메이커를 통해 타사가 만든 모델로, '평균 단어 삽입' 모델을 사용하여 작동합니다.

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

Colab

이 Codelab에서는 크게 걱정하지 마세요. 설치된 모든 Python 유틸리티가 포함된 Linux 서버를 설정하려고 하므로 'Colab 노트북'을 사용해 웹브라우저를 통해 코드를 실행하면 됩니다. 이 노트북은 '백엔드'에 연결할 수 있습니다. '백엔드'는 몇 가지 항목이 사전 설치된 서버이며, 이를 통해 웹브라우저 내에서 임의의 코드를 실행하고 결과를 확인할 수 있습니다. 프로토타입을 빠르게 제작하거나 이러한 튜토리얼에서 사용할 때 매우 유용합니다.

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

b2df89c1f7b38cc9.png

이제 팝업 창 오른쪽 하단의 New Notebook(새 노트북) 버튼을 클릭하면 다음과 같은 빈 Colab이 표시됩니다.

94a875f67d6e34f6.png

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

f4fcd56ae53527bd.png

연결되면 그 자리에 RAM과 디스크 아이콘이 다음과 같이 표시됩니다.

D979e93ba595d1de.png

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

1단계

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

!pip install -q tflite-model-maker

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

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

이제 모델 제조업체가 설치되는 것을 볼 수 있습니다.

376bc0fbde89a60d.png

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

2단계

다음으로, 새 코드 셀을 추가하여 첫 번째 셀 뒤에 코드를 더 붙여넣고 별도로 실행할 수 있도록 합니다.

7ec405d0d82b2143.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를 실행 중인지 확인합니다.

마지막으로 이전과 마찬가지로 셀 위로 마우스를 가져가면 '재생' 아이콘을 눌러 셀을 실행한 후 다음 단계를 위해 새 코드 셀을 추가합니다.

3단계

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

data_file = tf.keras.utils.get_file(fname='comment-spam-extras.csv', origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/jm_blog_comments_extras.csv', extract=False)

Model Maker는 다운로드한 CSV 파일과 같은 간단한 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

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

이해력

num_words

매개변수

모델에서 사용할 단어 수입니다. 더 많을수록 좋다고 생각할 수 있지만, 일반적으로 각 단어가 사용되는 빈도에 따라 최적의 지점이 존재합니다. 전체 코퍼스에서 모든 단어를 사용하면 모델이 한 번만 사용되는 단어의 가중치를 학습하고 밸런스를 맞추려고 할 수도 있습니다. 이는 그다지 유용하지 않습니다. 텍스트 코퍼스에서 많은 단어가 한두 번만 사용되는 것을 발견할 수 있습니다. 또한 텍스트에 사용한 감정은 전반적인 감정에 미미한 영향을 미치지 않으므로 일반적으로 모델에 사용하지 않아도 됩니다. 따라서 num_words 매개변수를 사용하여 원하는 단어 수에 맞게 모델을 조정할 수 있습니다. 여기서 작은 숫자는 더 작고 빠른 모델을 가지지만, 더 적은 단어를 인식하기 때문에 정확도가 떨어질 수 있습니다. 여기서 숫자가 클수록 모델이 더 크고 잠재적으로 느려집니다. 가장 적합한 부분을 찾는 것이 핵심이며 머신러닝 엔지니어가 여러분의 사용 사례에 가장 적합한 방법을 찾아내는 것은 개발자의 몫입니다.

이해력

wordvec_dim

매개변수

wordvec_dim 매개변수는 각 단어의 벡터에 사용할 차원의 수입니다. 이러한 치수는 기본적으로 특정 단어를 측정할 때 사용할 수 있는 여러 가지 특성 (학습 시 머신러닝 알고리즘에 의해 생성됨)으로, 보통 이러한 의미에서는 유사한 방식으로 단어를 가장 효과적으로 연결해 줍니다.

예를 들어 단어 '의학'의 측정기준이 있는 경우 여기에서 '알약'과 같은 단어가 높은 점수를 기록하며 'xray'와 같이 점수가 높은 다른 단어와 연관될 수 있지만 '고양이'는 점수를 받습니다. 낮은 측정기준입니다 '의료 측정기준'은 중요한 것으로 판단되는 다른 잠재적 측정기준과 함께 사용할 경우 스팸을 결정하는 데 유용할 수 있습니다.

'의료 차원'에서 점수가 높은 단어의 경우, 인간과 신체 간에 상관관계가 있는 두 번째 측정기준이 유용할 수 있습니다. '다리', '팔', '목'과 같은 단어는 여기에서 높은 점수를 줄 수 있으며 의료 측면에서도 상당히 높다는 것을 알 수 있습니다.

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

연구에 따르면 결정된 단어 수의 네 번째 루트가 이 매개변수에 적합하다고 판단하는 규칙이 있습니다. 예를 들어 단어 2, 000개를 처음 사용한다면 7개 측정기준을 만드는 것이 좋습니다. 사용된 단어 수를 변경하는 방법도 있습니다.

이해력

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에 가까울 가능성이 높습니다.

D6C8116F8E7E781B.png

그런 다음 결과를 측정하고 모델의 가중치를 변경하여 예측을 조정한 다음 다시 시도합니다. 에포크입니다. 따라서 epochs=50을 지정하면 다음과 같이 '루프'가 50번 진행됩니다.

fc7bf6a948b7aa26.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 왼쪽에 있는 작은 폴더 아이콘을 클릭하면 위에서 내보낸 폴더로 이동하여 루트 디렉터리에서 수준을 높여야 할 수 있으며, ZIP 파일의 ModelFiles.zip에 포함된 파일 내보내기

첫 번째 Codelab에서처럼 파일을 사용하기 때문에 지금 이 zip 파일을 컴퓨터에 다운로드합니다.

A9D8595a3e2564dc.png

Python 부분은 끝났습니다. 이제 익숙하고 마음에 드는 자바스크립트 영역으로 돌아갈 수 있습니다. 휴!

5 새로운 머신러닝 모델 제공

이제 모델을 로드할 준비가 되었습니다. 그러나 먼저 Codelab에서 이전에 다운로드한 새 모델 파일을 업로드하여 코드 내에서 호스팅하고 사용할 수 있도록 해야 합니다.

먼저, 앞서 실행한 Model Maker Colab 노트북에서 다운로드한 모델의 파일을 압축 해제합니다. 다양한 폴더에 포함된 다음 파일이 표시됩니다.

5634d536ef8be9ca.png

여기에 어떤 항목이 있나요?

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

TensorFlow.js 모델 파일 호스팅

먼저 웹페이지에서 생성한 model.json*.bin 파일을 웹페이지에 액세스할 수 있도록 저장합니다.

기존 모델 파일 삭제하기

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

7412b0b795d3b84f.png

Glitch에 새 파일 업로드

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

  1. Glitch 프로젝트의 왼쪽 패널에 있는 assets 폴더를 열고 이름이 같은 경우 업로드한 이전 애셋을 삭제합니다.
  2. 애셋 업로드를 클릭하고 group1-shard1of1.bin 폴더를 선택하여 이 폴더에 업로드합니다. 이제 업로드되면 다음과 같이 표시됩니다.

25a2251c7f165264.png

  1. 이제 model.json 파일에도 같은 작업을 실행하여 2개의 파일이 다음과 같이 애셋 폴더에 있어야 합니다.

51a6dbd5d3097ffc.png

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

92ded8d46443c404.png

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

terminal:

cd www
  1. 그런 다음 wget를 사용하여 아래 URL을 Glitch의 애셋 폴더에 있는 파일에 대해 생성한 URL로 교체하여 방금 업로드한 파일 2개를 다운로드합니다 (각 폴더의 맞춤 URL이 포함된 애셋 폴더 확인).

두 URL 사이 및 사용해야 하는 URL 사이의 공백은 표시된 URL과 다르지만 모양은 유사합니다.

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

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

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

9cc90f1d053f517f.png

  1. mv 명령어를 사용하여 파일 이름을 변경합니다. Console에 다음을 입력하고 각 줄의 뒤에 Enter 키를 누릅니다.

terminal:

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

terminal:

refresh

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

50dd98c0a8f3e629.png

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

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

와우! 변경된 모든 파일을 성공적으로 업데이트했습니다. 이제 웹사이트를 사용해 보면 재학습된 모델이 아래와 같이 발견된 극단적인 사례를 고려할 수 있습니다.

3ece5dbd0a673987.gif

보시다시피 처음 6개는 이제 스팸이 아닌 것으로 올바르게 분류되며 6번째는 2개 모두 스팸으로 식별됩니다. 완벽해요

대안을 충분히 일반화했는지 확인해 보겠습니다. 원래 다음과 같은 실패한 문장이 있습니다.

"앗!! 너무 늦기 전에 주문하세요."

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

"지금까지 XYZ 주식은 가치가 증가했습니다. 너무 늦기 전에 바로 구매하세요."

그러면 종목 코드 및 문구에 약간의 변화가 있어도 스팸일 가능성이 높은 98% 의 예측이 표시됩니다.

물론 이 새로운 모델을 실제로 재현하려고 하면 성공할 수 있습니다. 온라인에서 흔히 접하게 될 일반적인 상황에 맞춰 고유한 대안을 최대한 많이 얻을 수 있도록 더 많은 학습 데이터를 수집할 수도 있습니다. 향후 Codelab에서는 실시간 데이터로 신고된 모델을 지속적으로 개선하는 방법을 알아봅니다.

6. 축하합니다.

축하합니다. 여러분이 발견한 극단적인 사례에서 작동하도록 기존 머신러닝 모델을 다시 학습시키고 실제 애플리케이션을 위해 TensorFlow.js를 사용하여 이러한 변경사항을 브라우저에 배포했습니다.

요약

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

  1. 미리 만들어진 댓글 스팸 모델을 사용할 때 작동하지 않는 특이 사례 발견
  2. 발견한 극단적인 경우를 고려하도록 Model Maker 모델을 다시 학습시켰습니다.
  3. 새로운 학습 모델을 TensorFlow.js 형식으로 내보냈습니다.
  4. 새 파일을 사용하도록 웹 앱을 업데이트했습니다.

다음 단계

따라서 이 업데이트는 잘 작동하지만 다른 웹 앱과 마찬가지로 시간이 지남에 따라 변경됩니다. 앱을 매번 수동으로 변경하는 대신 시간이 지남에 따라 앱이 지속적으로 개선되면 훨씬 더 좋습니다. 예를 들어 100개의 새 댓글이 잘못 분류된 것으로 표시된 후 이러한 단계를 자동화하여 모델을 자동으로 재학습시킬 수 있을까요? 일반적인 웹 엔지니어링 모자를 착용하면 이 작업을 자동으로 수행하는 파이프라인을 만들 수 있습니다. 걱정하지 않아도 방법을 설명하는 시리즈의 다음 Codelab을 찾아보세요.

결과물 공유

오늘날의 창의적인 작업을 다른 창작 사례에 손쉽게 적용할 수 있습니다. 기존과는 달리 사고를 멈추고 계속 해킹하는 것이 좋습니다.

잊지 말고 소셜 미디어에서#MadeWithTFJS 해시태그가 관심을 가질 만한TensorFlow 블로그 심지어향후 일정 가 있는지 진단합니다. 여러분의 의견을 기다리겠습니다.

TensorFlow.js Codelab 심층 탐구

확인할 웹사이트