이번주 학습한 내용을 정리해보자!


🚗목차

  • 서론
    • 상황
  • 본론
    • BERT
    • word2vec
    • doc2vec
  • 결론
    • 느낀점

🚀서론

소프트웨어 마에스트로를 시작하고 곧있으면 중간평가날이 다가온다. 프로젝트를 진행하며 배우고 느낀 것들을 정리하여 팀원들과 공유하기로 했다. 그러한 공유글을 블로그로 작성해 보려고한다.

😂 상황

팀원들 모두가 AI에 대한 지식이 전무한 상태로 프로젝트를 진행했다. 코드를 작성함과 동시에 학습을 해야했기에 많은 어려움들이 있었다. 그렇게 라이브러리와 오픈소스들을 활용하여 프로젝트를 진행하였다. 그렇게 진행한 프로젝트를 멘토님께 보여드리자 "프로젝트에 대한 이해와 진행도는 양호하나 기초지식이 부족하여 추후 응용을 할때 문제가 생길것으로 보입니다." 라고 하셨다. 그렇게 팀원 모두가 1주일동안의 학습을 하는 시간을 가지기로 하였다.

프로젝트는 현재 두가지 방향으로 나눠놓은 상태이다. 1. 감정분석, 2. 키워드 분석이다. 감정 분석은 bert를 이용하여 Fine-tuning하여 활용하려 하였다. 이러한 방법의 문제는 현재 가지고 있는 데이터의 곡이 1012곡인데 그러한 곡들에 사전 Labeling을 하는 것이 힘들었다. 4개로 정한 라벨은 주관적이므로 사람마다, 곡마다 붙여지는 라벨이 상이했다. 이러한 것을 해결하는 방법과 키워드를 뽑는 방법들을 공부하고 이해해야 하는 상황이다. 그러기 전에 본질적인 것들에 대해 학습하려고 한다.


🖱본론

본론은 BERT, Word2Vec, Doc2Vec에 대하여 다룬다. 두가지로 크게 나눠서 감성, 키워드로 나눠서 설명한다.

🎨BERT

첫번째로 감성분석을 하다 시행착오를 겪었던 Bert 모델에 대해 이론적인 부분들을 공부하였다. 기초 지식이 부족하여 Transformers, input representation 같은 것들에 대한 지식과 전체적인 bert의 구성과 사용법을 알지 못했던것 같았기 때문이다.

Bert란?

BERT는 Bidirectional Encoder Representations from Transformers의 약자로 말 그대로 Transformers 라는 기계번역 모델의 Encoder 구조를 갖는 기계번역 모델이다. 즉, Transformers 라는 모델의 일부분을 사용하고 성능을 업그레이드한 모델이 BERT인 것이다(쿠키몬스터, 엘모 등이 있는 세서미 스트리트의 캐릭터 BERT에서 따오기도 했다고 한다!). 2018년 10월 구글에서 발표한 BERT는 NLP 분야에서 매우 훌륭한 성능을 보여주었고, 현재 굉장히 촉망받는 기계번역 모델이라고 한다.

BERT를 이용한 자연어처리는 2단계로 나눈다. 거대 Encoder가 입력 문장들을 임베딩 하여 언어를 모델링하는 언어 모델링 구조 과정과(Pre-train) 이를 fine-tuning하여 여러 자연어 처리 Task를 수행하는 과정이다.

1) BERT의 MLM(Masked Language Model)
MLM(Masked Language Model)은 일련의 단어가 주어지면 그 단어를 예측하는 작업이다. 이때 모든 다음 토큰을 예측하는 것이 아닌 입력에서 무작위 하게 몇 개의 토큰을 마스킹하고 이를 Transformer 구조에 넣어 주변 단어의 맥락으로 마스킹된 토큰만 예측한다. BERT에서 MLM이 수행되는 과정은 우선 토큰 중 15%는 무작위로 [MASK]토큰으로 바꾼다. 토큰은 input representation 방법으로 토큰화 되어있다. 이때 15% 토큰을 생성하는 과정에서 80%는 토큰을 [MASK]로 바꾸고 10%은 토큰을 무작위 단어로 바꾼다. 이전의 좌-우, 혹은 우-좌를 통하여 문장 전체를 예측하는 사전학습 언어 모델 방법과는 달리, [MASK] 토큰만을 예측하는 pre-training 작업을 수행한다. 이 [MASK] 토큰은 pre-training에만 사용되고, fine-tuning시에는 사용되지 않는다. MLM을 수행하며 BERT는 문맥을 파악하는 능력을 길러내게 된다..

2) BERT의 NSP(Next Sentence Prediction)
NSP(Next Sentence Prediction)는 두 문장의 관계를 이해하기 위해 BERT의 학습 과정에서 두 번째 문장이 첫 번째 문장의 바로 다음에 오는 문장인지 예측하는 방식이다.

이미지 출처 : https://happy-obok.tistory.com/23

BERT는 [SEP] 특수 토큰으로 문장을 분리한다. 학습 중에 모델에 입력으로 두 개의 문장이 제공된다. 50%의 경우 실제 두 번째 문장이 첫 번째 문장 뒤에 오고 50%는 전체 말뭉치에서 나오는 임의의 문장이다. 그런 다음 BERT는 임의의 문장이 첫 번째 문장에서 분리된다는 가정 하에 두 번째 문장이 임의의 문장인 여부를 예측한다. BERT는 손실 함수를 최소화하기 위해 MLM과 NSP을 함께 학습한다.

활용?

감성 분석을 하기위해 크게 4가지 감정으로 나눠서 분류를 하려고 한다. 이전에 진행하였던 방법은 Bert-base를 이용하여 4가지 레이블을 사전 레이블링을 하여 예측 하는 방식으로 진행하였다. 이러한 방식을 사용할때 잘못된 지식과 사용방법 미흡으로 인해 결과물이 제대로 나오지 않았다. Accuracy를 높일 방법과 다른 모델들을 살펴보고 기존에 진행하였던 코버트를 다시한번 사용해보아야 겠다. 그리고 bert는 감성분석만으로 활용할수 있는 것은 아니다. MASK를 이용하여 의미를 분석할수 있는 모델이기에 키워드를 추출 할 수도 있다. bert를 통해 키워드를 추출하는데도 사용할 계획이다.


워드 임베딩 두가지의 방법에 대해 다루려한다.

Word2Vec

Word2Vec은 단어를 벡터화 시켜 단어간의 거리를 이용해 유사도를 확인할 수 있게 할수있는 뉴럴 네트워크 모델이다. 어떤식으로 단어가 유사도를 파악하고 연산이 되는지를 확인하려면 직접 해보는 것이 좋다. 그러한 이해를 돕는 [사이트](http://w.elnn.kr/search/)이다. Word2Vec은 희소 표현이 아닌 분산표현으로 단어를 다공간에 벡터화한다.
  • 희소 표현 :
    Ex) 강아지 = [ 0 0 0 0 4 0 0 0 0 0 0 0 ... 중략 ... 0]
  • 분산 표현 :
    Ex) 강아지 = [0.2 0.3 0.5 0.7 0.2 ... 중략 ... 0.2]

요약하면 희소 표현이 고차원에 각 차원이 분리된 표현 방법이었다면, 분산 표현은 저차원에 단어의 의미를 여러 차원에다가 분산 하여 표현한다. 이런 표현 방법을 사용하면 단어 벡터 간 유의미한 유사도를 계산할 수 있다.
다음은 Word2Vec의 학습방식 두가지에 대해 알아보자.

1) CBOW(Continuous Bag of Words)

CBOW는 주변에 있는 단어들을 입력으로 중간에 있는 단어들을 예측하는 방법이다. 메커니즘 자체는 Skip-Gram과 거의 동일하다.

예문 : "아버지가 방에 들어가신다."

예를 들어서 갖고 있는 코퍼스에 위와 같은 예문이 있다고 하면 ['아버지가', '방에', '들어가신다']으로부터 '방에'을 예측하는 것은 CBOW가 하는 일이다. 이때 예측해야하는 단어 '방에'을 중심 단어(center word)라고 하고, 예측에 사용되는 단어들을 주변 단어(context word)라고 한다.

중심 단어를 예측하기 위해서 앞, 뒤로 몇 개의 단어를 볼지를 결정해야 한다. 예를 들어 윈도우 크기가 1이고, 예측하고자 하는 중심 단어가 '방에'이라고 한다면 앞의 단어인 '아버지가', 그리고 뒤의 단어인 '들어가신다'를 입력으로 사용한다. 윈도우 크기가 n이라고 한다면, 실제 중심 단어를 예측하기 위해 참고하려고 하는 주변 단어의 개수는 2n이다.

이미지 출처 : https://wikidocs.net/22660

1) Skip-Gram

CBOW에서는 주변 단어를 통해 중심 단어를 예측했다면, Skip-gram은 중심 단어에서 주변 단어를 예측한다. 앞서 언급한 예문에 대해서 동일하게 윈도우 크기가 2일 때, 데이터셋은 다음과 같이 구성된다.

이미지 출처 : https://wikidocs.net/22660

중심 단어에 대해서 주변 단어를 예측하므로 투사층에서 벡터들의 평균을 구하는 과정은 없다. 여러 논문에서 성능 비교를 진행했을 때 전반적으로 Skip-gram이 CBOW보다 성능이 좋다고 알려져 있다.

Doc2Vec

Doc2Vec 은 Word2Vec 이 확장된 임베딩 방법이다. Document id 를 모든 문맥에 등장하는 단어로 취급한다. 예를 들어 ‘a little dog sit on the table’ 이란 문장에 해당하는 document id, #doc5 는 dog 의 문맥에도 [a, little, sit, on, #doc5] 로, sit 의 문맥에도 [little, dog, on, the, #doc5] 로 등장한다. 결국 document id 에 해당하는 벡터는 해당 문서에 등장하는 모든 단어들과 가까워지는 방향으로 이동하여 아래의 그림과 같은 벡터를 지닌다. 그렇기 때문에 두 문서에 등장한 단어가 다르더라도 단어의 벡터들이 비슷하다면 두 문서의 벡터는 서로 비슷해진다.


NLP 키워드 추출 방법

text Rank

KeyBert

다른 방법

감정에 대한 분류를 하는 것은 bert모델을 이용하거나 음원쪽에서 가져오면 될것이라고 생각한다. 자연어인 가사 부분에서 키워드를 뽑는 것이 핵심이 될것이다. 그러한 방법으로 KT-WordRank 라이브러리를 사용하여 분석해보려고 한다. 네이버측에서 제공하는 가사 데이터는 가사의 형식이 불규칙하여 띄어쓰기 같은 처리가 제대로 되어있지 않다. 문장 단위 분석을 이용하려면 이러한 데이터를 문장별로 끊어줘야 할 필요가 있다고 느꼈다. PyKoSpacing을 사용하여 단어의 띄어쓰기와 문장별로 나누는 것을 진행하여 전처리를 해볼 생각이다.


결론

다음시간에는 적어도 Word2Vec의 방식과 Doc2Vec의 방식을 모두 적용하여 결과물을 만들 생각이다. 현재 Word2Vec 방식은 진행하고 있으며 다음 포스팅에서 두가지 방법을 설명하고 다루는 것을 포스팅할 생각이다. 추가로 조사해본 바로 키워드를 뽑아내는 방법으로 kobert를 사용하여 뽑아내거나 TF-IDF 또는 Test Rank의 방법이 있다. 이러한 방법들도 실행해볼 계획이다.

느낀점

0개의 댓글