1. 시작하기 전에
이 Codelab은 TensorFlow.js를 사용하여 댓글 스팸을 감지하는 이 시리즈의 이전 Codelab의 최종 결과를 기반으로 빌드하도록 설계되었습니다.
마지막 Codelab에서는 가상의 동영상 블로그를 위한 완전한 기능을 갖춘 웹페이지를 만들었습니다. 브라우저에서 TensorFlow.js로 구동되는 사전 학습된 댓글 스팸 감지 모델을 사용하여 댓글이 저장되거나 다른 연결된 클라이언트로 전송되기 전에 스팸 댓글을 필터링할 수 있었습니다.
이 Codelab의 최종 결과는 아래와 같습니다.

이 방법은 매우 효과적이었지만 감지할 수 없는 특이 사례가 있습니다. 모델이 처리할 수 없는 상황을 고려하여 모델을 재학습할 수 있습니다.
이 Codelab에서는 자연어 처리 (컴퓨터로 인간의 언어를 이해하는 기술)를 사용하는 데 중점을 두고, 직접 만든 기존 웹 앱을 수정하여 (순서대로 Codelab을 진행하는 것이 좋습니다) 많은 웹 개발자가 오늘날 계속 증가하는 인기 웹 앱 중 하나를 작업하면서 확실히 겪게 될 댓글 스팸이라는 매우 현실적인 문제를 해결하는 방법을 보여줍니다.
이 Codelab에서는 현재 트렌드나 인기 있는 토론 주제를 기반으로 시간이 지남에 따라 진화할 수 있는 스팸 메시지 콘텐츠의 변화를 고려하여 ML 모델을 재학습하여 한 단계 더 나아갑니다. 이를 통해 모델을 최신 상태로 유지하고 이러한 변화를 고려할 수 있습니다.
기본 요건
- 이 시리즈의 첫 번째 Codelab을 완료했습니다.
- HTML, CSS, JavaScript를 비롯한 웹 기술에 대한 기본 지식
빌드할 항목
실시간 댓글 섹션이 있는 가상 동영상 블로그를 위해 이전에 빌드한 웹사이트를 재사용하고 TensorFlow.js를 사용하여 맞춤 학습된 스팸 감지 모델을 로드하도록 업그레이드하여 이전에 실패했을 수 있는 특이 사례에서 더 나은 성능을 발휘하도록 합니다. 물론 웹 개발자와 엔지니어는 일상적인 역할에서 작업하는 모든 웹사이트에서 재사용할 수 있도록 이 가상 UX를 변경하고 클라이언트 사용 사례에 맞게 솔루션을 적용할 수 있습니다. 예를 들어 블로그, 포럼 또는 Drupal과 같은 CMS일 수 있습니다.
해킹을 시작해 보겠습니다.
학습할 내용
실습할 내용은 다음과 같습니다.
- 사전 학습된 모델이 실패한 극단적인 사례 식별
- Model Maker를 사용하여 만든 스팸 분류 모델을 재학습합니다.
- 브라우저에서 사용할 수 있도록 이 Python 기반 모델을 TensorFlow.js 형식으로 내보냅니다.
- 새로 학습된 모델과 사전으로 호스팅된 모델과 사전을 업데이트하고 결과를 확인합니다.
이 실습에서는 HTML5, CSS, JavaScript에 익숙하다고 가정합니다. '공동작업' 노트북을 통해 Python 코드를 실행하여 Model Maker를 사용하여 만든 모델을 재학습시킬 수도 있지만, 이를 위해 Python에 익숙할 필요는 없습니다.
2. 코딩을 위한 설정
이번에도 Glitch.com을 사용하여 웹 애플리케이션을 호스팅하고 수정합니다. 아직 필수 Codelab을 완료하지 않은 경우 여기에서 최종 결과를 클론하여 시작점으로 사용할 수 있습니다. 코드 작동 방식에 관해 궁금한 점이 있다면 계속하기 전에 이 작동하는 웹 앱을 만드는 방법을 설명하는 이전 Codelab을 완료하는 것이 좋습니다.
Glitch에서는 remix this 버튼을 클릭하여 포크하고 수정할 수 있는 새 파일 세트를 만들면 됩니다.
3. 이전 솔루션의 특이 사례 발견
방금 클론한 완성된 웹사이트를 열고 댓글을 입력해 보면 대부분의 경우 스팸처럼 들리는 댓글을 예상대로 차단하고 정상적인 응답은 허용하는 등 의도한 대로 작동합니다.
하지만 교묘하게 모델을 깨뜨리는 방식으로 문구를 작성하려고 하면 언젠가는 성공할 수 있습니다. 약간의 시행착오를 거치면 아래와 같은 예시를 수동으로 만들 수 있습니다. 기존 웹 앱에 이를 붙여넣고 콘솔을 확인하여 댓글이 스팸인지에 대한 확률을 확인해 보세요.
문제가 없는 적법한 댓글 (진음성):
- '와, 동영상이 정말 마음에 들어요. 멋진 작품입니다.' 스팸 확률: 47.91854%
- '이 데모가 정말 마음에 들어요. 자세한 내용이 있나요?' 스팸 확률: 47.15898%
- '자세히 알아보려면 어떤 웹사이트로 이동해야 하나요?' 스팸 확률: 15.32495%
위의 모든 확률이 매우 낮고 조치를 취하기 전에 기본 SPAM_THRESHOLD (이전 Codelab의 script.js 코드에 정의됨)인 최소 확률 75% 를 통과하므로 좋습니다.
이제 스팸이 아닌데도 스팸으로 표시되는 좀 더 과격한 댓글을 작성해 보겠습니다.
적법한 댓글이 스팸으로 표시됨 (거짓양성):
- '착용 중인 마스크의 웹사이트를 링크해 줄 수 있나요?' 스팸 확률: 98.46466%
- "Spotify에서 이 노래를 구매할 수 있나요? 누군가 알려주세요!' 스팸 확률: 94.40953%
- 'TensorFlow.js 다운로드 방법에 관한 세부정보를 알려주실 분이 있나요?' 스팸 확률: 83.20084%
이런! 허용되어야 하는 정상적인 댓글이 스팸으로 표시되는 것 같습니다. 이 문제를 해결하려면 어떻게 해야 하나요?
간단한 방법 중 하나는 SPAM_THRESHOLD를 98.5% 이상으로 늘리는 것입니다. 이 경우 잘못 분류된 댓글이 게시됩니다. 이를 염두에 두고 아래의 다른 가능한 결과를 계속 살펴보겠습니다.
스팸으로 표시된 스팸 댓글 (참양성):
- '이것도 괜찮지만 내 웹사이트에 있는 다운로드 링크가 더 좋습니다.' 스팸 확률: 99.77873%
- '약물을 구할 수 있는 사람을 알고 있습니다. 자세한 내용은 내 프로필을 확인하세요.' 스팸일 확률: 98.46955%
- '내 프로필에서 더 멋진 동영상을 다운로드하세요. http://example.com' 스팸일 확률: 96.26383%
원래 75% 기준을 사용하면 예상대로 작동하지만 이전 단계에서 SPAM_THRESHOLD가 98.5% 이상으로 변경되었으므로 여기에서 2개의 예가 통과됩니다. 따라서 기준이 너무 높을 수 있습니다. 96% 가 더 나을 수도 있습니다. 하지만 이렇게 하면 이전 섹션의 댓글 중 하나 (거짓양성)가 98.46466%로 평가되어 합법적인데도 스팸으로 표시됩니다.
이 경우 이러한 실제 스팸 댓글을 모두 캡처하고 위의 실패에 대해 다시 학습하는 것이 좋습니다. 임곗값을 96% 로 설정하면 모든 참양성이 계속 포착되고 위의 거짓양성 2개가 삭제됩니다. 단일 숫자만 변경한 것치고는 나쁘지 않습니다.
계속하겠습니다.
게시가 허용된 스팸 댓글 (거짓음성):
- '내 프로필에서 더 멋진 동영상을 다운로드하세요.' 스팸 확률: 7.54926%
- '헬스장 교육 수업 할인 받으세요. 프로필을 확인하세요.' 스팸 확률: 17.49849%
- '어머나, 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으로 이동하면 다음과 같은 시작 화면이 표시됩니다.

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

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

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

잘하셨습니다. 이제 Python으로 코딩하여 Model Maker 모델을 재학습시킬 수 있습니다. 다음 단계를 따르기만 하면 됩니다.
1단계
현재 비어 있는 첫 번째 셀에 아래 코드를 복사합니다. Python의 패키지 관리자인 'pip'을 사용하여 TensorFlow Lite Model Maker를 설치합니다. 이 패키지 관리자는 이 코드 랩의 독자가 JS 생태계에서 더 익숙할 수 있는 npm과 유사합니다.
!apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0
!pip install -q tflite-model-maker
하지만 셀에 코드를 붙여넣어도 실행되지는 않습니다. 다음으로 위의 코드를 붙여넣은 회색 셀 위로 마우스를 가져가면 아래와 같이 셀 왼쪽에 작은 '재생' 아이콘이 표시됩니다.
재생 버튼을 클릭하여 셀에 입력한 코드를 실행합니다.
이제 모델 메이커가 설치되는 것을 확인할 수 있습니다.

이 셀의 실행이 완료되면 아래의 다음 단계로 이동합니다.
2단계
다음과 같이 새 코드 셀을 추가하여 첫 번째 셀 뒤에 코드를 더 붙여넣고 별도로 실행할 수 있습니다.

다음으로 실행되는 셀에는 노트북의 나머지 코드에서 사용해야 하는 여러 가져오기가 있습니다. 생성된 새 셀에 아래 내용을 복사하여 붙여넣습니다.
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/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
새 셀에 붙여넣은 후 실행합니다.
이해하기
num_words
parameter
모델에서 사용할 단어 수입니다. 많을수록 좋다고 생각할 수도 있지만, 일반적으로 각 단어의 사용 빈도에 따라 적절한 개수가 있습니다. 전체 코퍼스의 모든 단어를 사용하면 한 번만 사용된 단어에 대해서도 모델이 학습 및 가중치 균형을 시도하므로 유용하지 않습니다. 모든 텍스트 코퍼스에는 한두 번만 사용되는 단어가 많은데, 이러한 단어는 전반적인 감정에 거의 영향을 주지 않으므로 모델에 포함하지 않아도 무방합니다. 따라서 num_words 매개변수를 사용하여 원하는 단어 수에 따라 모델을 조정할 수 있습니다. 여기에 더 작은 숫자를 입력하면 더 작고 빠른 모델이 생성되지만 인식되는 단어 수가 적어지므로 정확도가 떨어질 수 있습니다. 여기에 더 큰 숫자를 입력하면 더 큰 모델이 생성될 수 있으며, 이로 인해 모델이 더 느려질 수 있습니다. 적절한 지점을 찾는 것이 중요하며, 머신러닝 엔지니어는 사용 사례에 가장 적합한 방법을 파악해야 합니다.
이해하기
wordvec_dim
parameter
wordvec_dim 매개변수는 각 단어의 벡터에 사용할 차원의 수입니다. 이러한 차원은 기본적으로 학습 시 머신러닝 알고리즘에 의해 생성되는 다양한 특성으로, 프로그램이 의미 있는 방식으로 유사한 단어를 가장 잘 연결하는 데 사용하는 단어를 측정할 수 있습니다.
예를 들어 단어가 얼마나 '의학적'인지 나타내는 측정기준이 있는 경우 '알약'과 같은 단어는 이 측정기준에서 높은 점수를 받고 '엑스레이'와 같은 높은 점수를 받은 다른 단어와 연결되지만 '고양이'는 이 측정기준에서 낮은 점수를 받습니다. '의료 측정기준'이 스팸을 판단하는 데 유용할 수 있으며, 이 경우 Google은 사용할 수 있는 다른 잠재적 측정기준과 결합하여 유의미한 결과를 도출할 수 있습니다.
'의료 차원'에서 점수가 높은 단어의 경우 단어를 인체와 연관시키는 두 번째 차원이 유용할 수 있다고 판단할 수 있습니다. '다리', '팔', '목'과 같은 단어는 여기에서 높은 점수를 받을 수 있으며 의료 차원에서도 상당히 높은 점수를 받을 수 있습니다.
모델은 이러한 차원을 사용하여 스팸과 더 관련이 있을 가능성이 높은 단어를 감지할 수 있습니다. 스팸 이메일에는 의학 용어와 인체 부위가 모두 포함된 단어가 포함될 가능성이 더 높을 수 있습니다.
연구 결과에 따른 일반적인 규칙은 단어 수의 네제곱근을 사용하는 것입니다. 따라서 2, 000개의 단어를 사용하는 경우 7개의 차원으로 시작하는 것이 좋습니다. 사용하는 단어 수를 변경하는 경우 이 값도 변경할 수 있습니다.
이해하기
seq_len
parameter
모델의 입력 값은 일반적으로 매우 엄밀하게 규정됩니다. 특히 언어 모델은 특정한 정적 길이를 갖는 문장을 분류할 수 있습니다. 이는 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를 사용하여 텍스트 분류기 모델이 만들어집니다. 사용자는 사용할 학습 데이터(4단계에서 정의됨), 모델 사양(4단계에서 설정됨), 세대 수(이 경우 50)를 지정합니다.
머신러닝의 기본 원리는 패턴 일치의 한 형태입니다. 처음에는 단어에 대해 사전 학습된 가중치를 로드하고, 그룹으로 묶어서 볼 때 스팸을 나타내는 단어와 그렇지 않은 단어를'예측'하여 단어를 그룹화하려고 시도합니다. 초기 상태에서는 모델이 이제 막 시작되었기 때문에 아래와 같이 50:50에 가까울 수 있습니다.

그런 다음 결과를 측정하고 모델의 가중치를 변경하여 예측을 수정한 후 다시 시도합니다. 여기까지가 한 세대입니다. 따라서 epochs=50을 지정하면 다음 그림과 같이 이 '루프'가 50번 반복됩니다.

따라서 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 번들을 찾을 수 있습니다.
첫 번째 Codelab에서와 마찬가지로 이 파일을 사용하므로 지금 컴퓨터에 이 ZIP 파일을 다운로드하세요.

좋습니다. Python 부분이 끝났습니다. 이제 잘 알고 좋아하는 JavaScript로 돌아갈 수 있습니다. 다양한 혜택이 마음에 드셨나요?
5. 새 머신러닝 모델 제공
이제 모델을 로드할 준비가 거의 완료되었습니다. 하지만 먼저 Codelab 초반에 다운로드한 새 모델 파일을 업로드하여 코드 내에서 호스팅되고 사용할 수 있도록 해야 합니다.
먼저 아직 실행하지 않은 경우 방금 실행한 Model Maker Colab 노트북에서 다운로드한 모델의 압축을 풉니다. 다양한 폴더에 포함된 다음 파일이 표시됩니다.

여기에는 뭐가 있어?
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.json 및 group1-shard1of1.bin를 확인하고 각 파일의 점 3개 메뉴 드롭다운을 클릭한 후 삭제를 선택합니다.

Glitch에 새 파일 업로드하기
좋습니다. 이제 새 파일을 업로드합니다.
- Glitch 프로젝트의 왼쪽 패널에서 assets 폴더를 열고 업로드된 이전 애셋이 이름이 같은 경우 삭제합니다.
- 애셋 업로드를 클릭하고 이 폴더에 업로드할
group1-shard1of1.bin을 선택합니다. 업로드 후에는 다음과 같이 표시됩니다.

- 좋습니다. 이제 model.json 파일도 동일하게 처리하여 다음과 같이 2개의 파일이 assets 폴더에 있어야 합니다.

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

- 이제 화면 왼쪽 하단에서 도구 > 터미널을 클릭합니다. 터미널 창이 로드될 때까지 기다립니다.
- 로드되면 다음을 입력한 다음 Enter 키를 눌러 디렉터리를
www폴더로 변경합니다.
terminal:
cd www
- 그런 다음
wget를 사용하여 방금 업로드한 2개의 파일을 다운로드합니다. 아래 URL을 Glitch의 assets 폴더에 있는 파일에 대해 생성한 URL로 대체합니다 (각 파일의 맞춤 URL은 assets 폴더에서 확인).
두 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 키를 누르면 다음과 같이 표시됩니다.

mv명령어를 사용하여 파일 이름을 바꿉니다. 콘솔에 다음을 입력하고 각 줄이 끝날 때마다 Enter 키를 누릅니다.
terminal:
mv *group1-shard1of1.bin* group1-shard1of1.bin
mv *model.json* model.json
- 마지막으로 터미널에
refresh를 입력하고 Enter 키를 눌러 Glitch 프로젝트를 새로고침합니다.
terminal:
refresh
새로고침하면 사용자 인터페이스의 www 폴더에 model.json 및 group1-shard1of1.bin가 표시됩니다.

좋습니다. 마지막 단계는 dictionary.js 파일을 업데이트하는 것입니다.
- 새로 다운로드한 어휘 파일을 텍스트 편집기를 통해 직접 수동으로 또는 이 도구를 사용하여 올바른 JS 형식으로 변환하고 결과 출력을
www폴더 내에dictionary.js로 저장합니다.dictionary.js파일이 이미 있는 경우 새 콘텐츠를 복사하여 붙여넣고 파일을 저장하면 됩니다.
축하합니다. 변경된 파일을 모두 업데이트했으며 이제 웹사이트를 사용해 보면 재학습된 모델이 다음과 같이 발견되고 학습된 특이치를 고려할 수 있습니다.

보시다시피 처음 6개는 이제 스팸이 아닌 것으로 올바르게 분류되고 두 번째 6개는 모두 스팸으로 식별됩니다. 좋습니다.
일반화가 잘 되었는지 확인하기 위해 몇 가지 변형도 시도해 보겠습니다. 원래는 다음과 같은 실패한 문장이 있었습니다.
"omg GOOG 주가가 급등했어요! 너무 늦기 전에 받으세요!'
이제 스팸으로 올바르게 분류되지만 다음과 같이 변경하면 어떻게 될까요?
'XYZ 주식의 가치가 방금 증가했습니다. 너무 늦기 전에 구매하세요.'
주식 기호와 문구를 약간 변경했지만 스팸일 가능성이 98% 로 예측되어 올바릅니다.
물론 이 새로운 모델을 깨려고 하면 깨질 수 있습니다. 온라인에서 자주 접하는 일반적인 상황에 대해 더 많은 고유한 변형을 포착할 수 있도록 더 많은 학습 데이터를 수집해야 합니다. 향후 Codelab에서는 플래그가 지정된 실시간 데이터를 사용하여 모델을 지속적으로 개선하는 방법을 보여드리겠습니다.
6. 축하합니다.
수고하셨습니다. 기존 머신러닝 모델을 재학습시켜 발견한 특이 사례에 맞게 업데이트하고 TensorFlow.js를 사용하여 실제 애플리케이션을 위해 변경사항을 브라우저에 배포했습니다.
요약
이 Codelab에서는 다음 사항을 다루었습니다.
- 사전 제작된 댓글 스팸 모델을 사용할 때 작동하지 않는 극단적인 사례 발견
- 발견한 특이 사례를 고려하도록 Model Maker 모델을 재학습시켰습니다.
- 새로 학습된 모델을 TensorFlow.js 형식으로 내보냈습니다.
- 새 파일을 사용하도록 웹 앱을 업데이트했습니다.
다음 단계
따라서 이 업데이트는 잘 작동하지만 모든 웹 앱과 마찬가지로 시간이 지남에 따라 변경사항이 발생합니다. 매번 수동으로 이 작업을 실행하는 대신 앱이 시간이 지남에 따라 지속적으로 개선된다면 훨씬 좋을 것입니다. 예를 들어 잘못 분류된 것으로 표시된 새 댓글이 100개 있는 경우 모델을 자동으로 재학습하도록 이러한 단계를 자동화할 수 있을까요? 일반적인 웹 엔지니어링 기술을 활용하면 이를 자동으로 실행하는 파이프라인을 만드는 방법을 파악할 수 있습니다. 그렇지 않다면 걱정하지 마세요. 다음 Codelab에서 방법을 알려드립니다.
결과물 공유
오늘 만든 콘텐츠를 다른 창의적인 사용 사례로 쉽게 확장할 수 있으며, 틀에 박히지 않은 생각을 하고 계속해서 실험해 보시기 바랍니다.
TensorFlow 블로그 또는 향후 이벤트에서 여러분의 프로젝트가 추천되는 기회를 얻으려면 소셜 미디어에서 #MadeWithTFJS 해시태그를 사용해 태그해 주세요. 여러분이 만든 작품을 보고 싶습니다.
TensorFlow.js Codelab 심층 탐구
- Firebase 호스팅을 사용하여 TensorFlow.js 모델을 대규모로 배포하고 호스팅합니다.
- TensorFlow.js를 사용하여 사전 제작된 객체 감지 모델로 스마트 웹캠 만들기
확인할 웹사이트
- TensorFlow.js 공식 웹사이트
- TensorFlow.js 사전 제작 모델
- TensorFlow.js API
- TensorFlow.js Show & Tell - 영감을 얻고 다른 사용자가 만든 콘텐츠를 확인하세요.