[go: up one dir, main page]

Skip to content
This repository has been archived by the owner on Oct 17, 2019. It is now read-only.

14hy/chatbot-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Capstone Design Project - Hanyang-Chatbot

인공지능을 이용한 챗봇 솔루션 개발

capstone

구조

ver1 1

전처리기

정제

  1. 공백문자 정리
  2. 대문자 -> 소문자
  3. 유니코드 변환 이후 유니코드 카테고리 중 �Mn, C*, P*제거
  4. 초성 변환 예) ㅅㅌ -> 셔틀
  5. 불용어 제거

image

형태소 분석

Khaiiimecab-ko를 함께 사용하였다. 이유 / 품사 정보

image

키워드 분리

image

토큰화

image image

유사도 분석

Deep Learning Models

BERT - transformer모델의 Encoder 부분을 사용한 사전 훈련 모델

Bert Pretraining

  1. 구글의 사전훈련 모델을 사용하지 않은 이유

    모델 사용 중 전처리 과정에서 NFC 정규화 문제 발견 - 관련된 issue

    문제를 해결하는 코드를 pull request, 한국어의 사전훈련이 제대로 되지 않았을 것으로 판단

    (현재는 NFC 정규화하지 않은 버전의 모델이 올라와 있음)

    *(2019.10.17) KorBERT이 공개 *

  2. 학습 데이터

    Wikipedia 말뭉치를 사용 wikiextractor를 사용해 본문만을 추출하고 추가적인 데이터 정제와 모델 훈련데이터 생성을 위한 형식으로 변경

  3. 형태소 사전

    기존 단어 사전은 다국어 지원으로 사전의 크기가 크며 사용된 wordpiece도 충분히 좋지만 형태소를 분석한 사전을 사용 해보고자 함

    1. Wiki에서 많이 사용되는 상위 형태소 7449개를 추출
    2. Wiki 데이터에 대한 지나친 편향을 줄이기 위해 국립국어원의 자주사용되는 한국어 어휘 데이터의 형태소 1842개를 추가하여 9169개의 형태소 사전을 생성
    3. 결과 voca2
    • 전체 토큰의 수가 줄어 들었다. (약 1.5%)
    • [메나헴], [베긴] 과 같은 흔하지 않은 고유명사가 [UNK] 토큰화 되었다.
    • [UNK] 토큰의 수가 증가했다.(0.2% -> 1%)
    1. 아쉬운 점
    • 완전히 재구성하지 말고 기존 wordpiece 사전에 형태소만을 추가하는 방법또한 좋았을 것
    • 띄어쓰기 정보X
  4. 학습

    google-research/bert의 텐서플로우 구현코드에 형태소 분석기를 추가하여 학습을 진행했다. 학습 파라미터는 BERT paper를 따라했으며, pretraining tip에 따라 학습데이터의 문장의 길이를 128로 두고 1차 학습한 뒤, 길이 512로 2차 학습을 하였다. 학습은 구글 클라우드 플랫폼의 Nvidia Tesla T4를 사용하였다.

  • 1차 학습(max_seq_length - 128) LOSS, 10만 스텝 pre_loss1
  • 2차 학습(max_seq_length - 512) LOSS, 100만 스텝 pre_loss2

Fine Tunings

  1. 인공지능 QA

    SQUAD 의 한국판인 KorQUAD의 데이터셋을 사용 KorQuAD introduction

    image

    질문과 문단(input)에 대한 문단에서의 정답인덱스의 시작과 끝(output)을 학습 squad-loss-log

    • 1차 학습모델사용(주황색) / 2차 학습모델사용(파란색) 로스
    • 평가셋에 대한 F1 score
    F1 score Exact Match Loss(smoothed) Epochs
    1차 사전훈련 모델(주황선) 74.66 53.06 0.6043 3
    2차 사전훈련 모델(파랑선) 83.43 62.57 0.2793 3

    최종적으로 평가셋을 포함한 데이터로 학습 (평가셋 F1 score 92.68)

실전 테스트

DB에서 tf-idf알고리즘 를 통해 답이 있을 만한 문단을 찾은 뒤, Top 1 문단에서 답을 추론 image

Q. 한양대의 마스코트 하냥이를 만든 곳은?
A. 토이츄러스
  1. 감성 분석

Naver sentiment movie corpus데이터를 사용하여 긍, 부정에 대한 학습

image

정확도(주황선 - 학습데이터, 파란선 - 평가데이터)

image

하나의 Logistic regression 레이어 추가로 손쉽게 학습데이터 정확도 96%이상, 평가데이터 정확도 93%

실전 테스트

*** 1.0 에 가까우면 긍정, 0.0 에 가까우면 부정 ***

image image image

실행

  1. MongoDB 서버 실행
  2. Server 1 - (CPU)
python app.py --ip --port
  1. Server 2 - (GPU)

nvidia-docker 설치 이후

image

인공지능 QA
docker run --runtime=nvidia -p 8501:8501 \
  --mount type=bind,source=/home/rhodochrosited/tensor_serving_models/search/,\
  target=/models/search -e MODEL_NAME=search -t tensorflow/serving:latest-gpu \
  --per_process_gpu_memory_fraction=0.3 &
문장임베딩
docker run --runtime=nvidia -p 8502:8501 \
  --mount type=bind,source=/home/rhodochrosited/tensor_serving_models/similarity/,target=/models/similarity -e \
  MODEL_NAME=similarity -t tensorflow/serving:latest-gpu \
  --per_process_gpu_memory_fraction=0.3 &
감성분석
docker run --runtime=nvidia -p 8503:8501 \
  --mount type=bind,source=/home/rhodochrosited/tensor_serving_models/sentiment/,target=/models/sentiment -e \
  MODEL_NAME=sentiment -t tensorflow/serving:latest-gpu \
  --per_process_gpu_memory_fraction=0.3 &

Releases

No releases published

Packages

No packages published

Languages