관리 메뉴

솜씨좋은장씨

한국인공지능아카데미 인공지능 실용교육 BERT 수강 후기! - 2 (4일차/5일차!) 본문

일상/교육

한국인공지능아카데미 인공지능 실용교육 BERT 수강 후기! - 2 (4일차/5일차!)

솜씨좋은장씨 2020. 2. 7. 20:26
728x90
반응형

1~3일차에는

기본적인 파이썬을 활용한 자연어처리와 어텐션 모델과 GRU모델을 활용한 간단한 분류 실습과

BERT를 사용한 SQuAD, KorQuAD 실습을 했다면

 

4~5일차는

3일차에 구성퇸 팀원들끼리 각팀의 아이디어를 가지고 실습해보았던 BERT를 활용하여 구현해보고 발표하는 시간을 가졌습니다.

 

다들 짧은 시간안에 다양한 아이디어를 BERT를 활용하여 구성하는 시간이었습니다.

 

팀은 총 6개의 팀으로 구성되었으나

아쉽게도 마지막날 한 팀이 사정상 참석을 하지못하여 최종 구현 및 발표는 5개의 팀이 발표를 하게 되었습니다.

 

아이디어는

- BERT와 재난 트윗

- BERT 를 활용하여 쇼핑몰 리뷰 평점 예측하기

- BERT를 이용한 키워드 추출

- KoBERT를 이용한 한국어 모델 만들기
- 게시판 글 카테고리 자동분류

 

이렇게 다섯가지의 아이디어로 진행되었습니다.

 

길지않은 짧은 시간이었지만 다들 정말 최선을 다하여 하는 모습이 정말 멋졌습니다.

 

BERT는 아래의 김웅곤님이 올려주신 Keras를 활용한 BERT코드를 활용하였습니다.

 

kimwoonggon/publicservant_AI

Contribute to kimwoonggon/publicservant_AI development by creating an account on GitHub.

github.com

 

 

BERT와 재난 트윗

이 아이디어는 혼자 프로젝트를 진행하신 김도이님께서

Kaggle에서 진행하고 있는 재난관련 트윗이 진짜인지 가짜인지에 대해서 구분하는 Competition을

여기서 배운 BERT를 수정해서 활용하여 도전해본 후기였습니다.

 

Real or Not? NLP with Disaster Tweets

Predict which Tweets are about real disasters and which ones are not

www.kaggle.com

이 Competition의 아이디어를 가지고 이진분류를 하기위해서 어떤 방식으로 BERT모델을 수정했는지

데이터가 어떤식으로 구성되어있는지 그래프, 워드클라우드 등으로 시각화하여 설명해주어 흥미로운 발표였습니다.

사진 출처 : https://colab.research.google.com/drive/1nNzzKQk_ddVCN3IKd8DQ9vpmNxv2lX3D  / 팀 독고다이 Colab Code

아직 진행중인 Competition인 것 같아 저도 한번 도전해보려고합니다!

물론 이미 점수가 1.0000인사람이 369명이지만! 저도 1.0000을 받기위해서 또 노력해보아야겠습니다.

 

다음은 제가 있던 팀이했던

 

 

BERT 를 활용하여 쇼핑몰 리뷰 평점 예측하기

아이디어였습니다.

 

글로우픽 - 100만인의 리뷰로 만들어진 진짜 뷰티 랭킹

세상 모든 뷰티 리뷰, 글로우픽

www.glowpick.com

글로우픽에서 가져온 샴푸리뷰를 가지고 새로운 리뷰에 대해서 이 평점이 몇점인지 예측(?)해주는 아이디어를 구현해보았습니다.

 

리뷰데이터와 1점 ~ 5점 사이의 평점을 크롤링해와서 만든 데이터를 가지고 실시해보았습니다.

 

수집한 데이터는 아래와 같은 형식으로 크롤링해왔습니다.

여기서 review column의 데이터와 star column의 데이터를 활용하였습니다.

 

먼저 review데이터에서 특수문자를 제거하여 새로운 column을 만들었습니다.

import re

review_data = list(data['review'])

clear_review = []

for review in review_data:
  temp = re.sub('[-=+,#/\?:^$.@*\"※~&%ㆍ!』\\‘|\(\)\[\]\<\>`\'…》]', '', review)
  clear_review.append(temp)
data['clear_review'] = clear_review
data

그리고 star column에 있는 별한개~별다섯개로 되어있는 평점 데이터를 정수로 변경하여 label 이라는 column으로 추가하여주었습니다.

stars = list(data['star'])

label = []

for i in range(len(stars)):
  if stars[i] == '별다섯개':
    label.append(4)
  elif stars[i] == '별네개':
    label.append(3)
  elif stars[i] == '별세개':
    label.append(2)
  elif stars[i] == '별두개':
    label.append(1)
  elif stars[i] == '별한개':
    label.append(0)
data['label'] = label
data

그리고 label 값은 모델에서 학습을 할때 사용하기위해서

keras.utils의 to_categorical 함수를 활용하여 One-Hot Encoding을 해주었습니다.

from keras.utils import to_categorical

train_y_new = to_categorical(train_y, num_classes=5)
test_y_new = to_categorical(test_y, num_classes=5)

그리고 기존 이진분류로 구성되어있는 코드를 다중분류가 가능하도록

출력층 1 -> 5 / 활성화함수 sigmoid -> softmax / loss binary_crossentropy -> categorical_crossentropy

이렇게 변경하였습니다.

학습 결과는!

2 epoch, 5epoch를 학습하였을때 각각 52.51% / 55.05%의 정확도를 보여주는 것을 볼 수 있었습니다.

 

팀원들끼리 왜 이렇게 나왔나 토의를 해보던 중에 1명의 사용자 리뷰 데이터를 가지고 1점 ~ 5점을 추론하는것이아닌

다양한 사람들의 주관이 담긴 데이터를 1점 ~ 5점으로 분류하는 문제여서 더 어려운 것 같다는 생각들이 나왔습니다.

 

추후 성능을 높이기 위해서 여러 시도를 해볼 생각입니다.

 

 

BERT를 이용한 키워드 추출

이 아이디어는 같은 연구실에서 공부를 하던 학부생들이 연구실 방번호를 팀이름에 넣어 NLP209라는 팀을 만들고

BIO태깅 데이터를 가지고 fine tuning 시켜보고 결과를 보는 프로젝트였습니다.

 

처음에 BIO라고 해서 의료쪽데이터인줄 알았으나

개체명 인식에서 사용되는 BIO 표현을 뜻하는 것이었습니다. 입니다

 

BIO표현은

B - Begin의 약자 - 개체명이 시작되는 부분

I - Inside의 약자 - 개체명의 내부 부분

O - Outside의 약자 - 개체명이 아닌 부분  입니다.

 

예를들어 영화에 대한 코퍼스 중에서 영화 제목에 대한 개체명을 뽑아내고 싶다고 가정한다면

사진 출처 : https://wikidocs.net/24682 / 위키독스 딥러닝을 위한 자연어처리 입문

여기서

B - 영화 제목의 시작인 (해)

I - 해리포터에서 해 뒤에 영화의 제목이 끝날 때까지 (리 포 터)

O - 그 외 나머지 단어들 (보 러 가 자) 로 볼 수 있습니다.

 

B와 I는 개체명에 사용되고 O는 그렇지 않다는 것을 알 수 있습니다.

 

중간에 Output 차원의 크기가 맞지 않아 오류가 나서 끝까지 진행하지는 못하였지만

여기서 끝내지 않고 crossentropy loss를 사용하지 않는 다른 방법으로도 시도해보고 다시 공유한다고 하여

그때 저도 보고 개체명 인식에 대해서 더 공부해보려고 합니다.

 

KoBERT를 이용한 한국어 모델 만들기

이 팀은 현직에서 일을 하시고 계시는 분 두분이서 만든 Kobert_start 팀에서 진행한 프로젝트 였습니다.

이 팀은 KoBERT를 이용한 한국어모델 만들기는 최초 아이디어가 ETRI에서 신청을 통해 인증키와 사전 학습되어있는 모델을 다운받아서

프로젝트를 진행하려고 하였으나 프로젝트 발표 당일인 오늘도 아직 서류 제출이후 인증키 발급이 되지 않아서

기존에 이 교육에서 사용해보았던 BERT모델을 활용하여 감성분석을 진행해보셨다고 하셨습니다.

 

네이버에서 강아지 옷에 관련된 리뷰와 평점을 1,700개를 크롤링을 통하여 수집하였고

1점 ~ 3점은 (0) / 4점 ~ 5점은 (1)로 라벨링하여 이진분류를 진행해보았다고 하였습니다.

최종 정확도는 89%로 나왔다고 합니다.

 

저도 최근 펫 관련 데이터를 크롤링하고 이것저것 도전해보고 있는데 그래서 그런지 뭔가 반가운 주제였습니다.

 

frontier1020/Korbert_Start

코버트 알아보기. Contribute to frontier1020/Korbert_Start development by creating an account on GitHub.

github.com

 

 

마지막팀은

Team Spammon의 

게시판 글 카테고리 자동분류

프로젝트 였습니다.

 

이 프로젝트는 최근에 idEANS 팀원이 공유해주었던 자료가 생각나게 하는 프로젝트였습니다.

 

딥러닝으로 동네생활 게시글 필터링하기

BERT를 사용해서 동네 생활 게시글 필터링 모델을 개발한 과정을 정리해봤습니다.

medium.com

이 팀은 게임정보를 공유하는 인벤이라는 홈페이지에서 메이플스토리 게임에 관련된 게시글을 크롤링해와서 데이터를 구축하고

그 게시물이 어떤 카테고리에 포함되는지에 대해서 분류를 해보는 프로젝트였습니다.

 

저희의 아이디어와 같이 다중 분류를 하는 모델이기 때문에

activation을 sigmoid에서 softmax로

출력 Dense레이어에서 2->5로 수정해주고 학습을 진행한 것을 볼 수 있었습니다.

사진 출처 : https://colab.research.google.com/drive/1RvCVX_HV3rG3oepYnS2SOc14stCgZSoQ / Team Spammon 프로젝트 Colab Code

validation accuracy 기준으로 58.9%의 정확도를 보이는 것을 볼 수 있었습니다.

사진 출처 : https://colab.research.google.com/drive/1RvCVX_HV3rG3oepYnS2SOc14stCgZSoQ / Team Spammon 프로젝트 Colab Code

새로운 글에 대해서 그래도 어느정도 잘 분류를 해주는 것을 볼 수 있었습니다.

 

교육 수강 후기

처음 기대는 이 교육을 통해서 어텐션, 트랜스포머 등에 대해서 조금 더 이론적으로 레이어의 구성방식이나 학습이 되는 과정에 대해서

자세하게 배울 수 있을 것 같았지만 Keras로 이미 구현되어있는 코드를 보고 실제로 실행해보면서 실습위주로 진행하다 보니 이론적인 부분은 아직 완벽하게 이해하지는 못했던 것 같습니다.

 

그래도 Google Colab환경에서 BERT모델을 활용할 수 있었던 점과 그 코드가 Keras로 구성되어있어 나중에 다른 곳에 활용할 수 있다는 점이 좋았던 것 같습니다.

 

2일 동안 자연어처리와 BERT에 대해서 강의해주신 김웅곤 강사님,

그리고 팀프로젝트가 원할하게 진행되도록 팀빌딩부터 샌드위치부터 치킨까지 여러 간식을 준비해주신 많은 분들께 감사의 말씀을 드립니다.

 

덕분에 월화수목금 일주일이 알찼던 것 같습니다.

 

읽어주셔서 감사합니다!

Comments