반응형

OpenAI

 

GPT-3 배경 설명

  • GPT-3은 요즘 많이 사용하는 ChatGPT의 근간이 된 논문으로, 2020년 OpenAI에서 NIPS에 발표한 논문이다. 
  • Language Model의 parameter가 꾸준히 늘어가는 추세였는데, GPT-3에서는 기존의 가장 큰 모델보다 거의 10배 정도의 많은 parameter를 넣을 정도로 큰 모델을 사용하였다.
  • Model scaling-up을 통해 few-shot에서도 Task-Specific 한 기존의 finetuning 모델들의 성능에 필적하는 성능을 보여주었다. (이 시도가 현재 ChatGPT를 만든 것 같다.)

 

Abstract

  • 최근 NLP task에서 large corpus의 pre-training을 기반으로한 언어모델들이 큰 효과를 내고 있다. 
  • 하지만, 대부분의 모델은 task-agnostic의 재학습이 필요하고, 이 과정에서 task에 맞는 수많은 학습 데이터들이 필요하다.
  • 이 논문에서는 언어모델의 사이즈를 키워서, 현재 task-agnostic SOTA 모델들의 성능에 필적할수 있을 정도로 few-shot 모델 성능을 향상했다.
  • 특히, 175 billion parameter로 구성된 GPT-3을 few-shot으로 학습하였는데, 다양한 NLP 분야에서 좋은 성능을 보였다.
  • 추가적으로 GPT-3은 인간이 작성한 기사와 구분하기 어려운 뉴스 샘플등을 생성할 수 있다는 사실을 발견하였고, 이 발견과 사회적 영향에 대해 논의한다.

Introduction

[문제]

  • 최근 NLP 분야에서의 pre-trained language model의 트렌드는 다양하고 많은 분야에서 큰 향상을 일으켰지만, 이러한 모델들은 task-agnostic 한 방식을 채택하고 있어, 원하는 task에 대한 수많은 데이터셋과 fine-tuning 과정을 필요로 한다.
  • 이러한 방식은 아래의 문제가 있다.
    1. 실용적 관점에서 모든 새로운 task에 대해서 labeling 된 데이터가 필요하여, 언어모델의 확장성을 제한한다. 각 task 학습을 위한 dataset이 필요한데, 그것을 모으는 것은 매우 어렵고, task를 확장할 때마다 반복해야 한다. 
    2. 큰 모델에서 좁은 분포의 데이터를 학습시키면, 잘못된 상관관계를 학습할 수 있다. pre-training 단계와 fine-tuning 단계를 사용한 모델들에서 이런 문제가 있는데, 이러한 모델들은 일반화가 잘 안 되는 문제가 있다.
    3. 인간은 새로운 lagnuage task를 배우기 위해, 많은 데이터를 필요로 하지 않는다는 점이다. 인간의 언어능력에는 일반화와 적용을 자주 활용하는데, NLP 모델도 이러한 인간의 언어 능력과 동일한 수준이 되어야 한다. (task-agnostic은 그렇지 않다는 뜻인 듯하다.)
  • 이러한 문제를 풀기 위해, meta-learning을 활용한 방법들이 있다. 몇 가지 방법들이 등장했지만(특히, GPT-2), fine-tuning 방법에 비해 성능이 매우 떨어진다. 
  • 한편, Language modeling의 최근 트렌드는 model의 capacity를 키우는 것이다. 이러한 트렌드에서 model의 parameter를 키울수록 언어모델의 성능이 향상되는 경향이 있음을 볼 수 있다. (이전까지 17 billion paramter까지 등장)

[모델 소개]

  • 이 논문에서는, 175 billion의 parameter를 사용하는 "GPT-3"이라는 language model을 실험하여, model의 parameter가 커질수록 성능이 향상됨을 확인한다. 
  • 또한, GPT-3을 각각 few-shot learning, one-shot learning, zero-shot learning을 통해 학습하고, 비교해 본다.

[실험 결과]

  • Few-shot에서 단어에서 관계없는 symbol을 지우는 간단한 task를 수행해 보았을 때, task에 대한 설명이 많을수록(zero에서 few shot으로 갈수록), 성능이 향상되었고, model의 parameter가 많을수록 성능이 급격하게 향상되는 것을 보인다.

  • GPT-3이 약한 분야도 있는데, inference task나 reading comprehension과 같은 분야이다.

 

GPT-3 Approach

  • model, data, training을 포함한 pre-training 과정은 model의 크기, dataset의 다양성, 길이, 크기가 커졌다는 것을 빼고는 GPT-2의 방법과 비슷하다.

2023.05.27 - [NLP 논문] - GPT-2 (Language Models are Unsupervised Multitask Learners) 논문 리뷰

 

GPT-2 (Language Models are Unsupervised Multitask Learners) 논문 리뷰

GPT-2 배경 설명 GPT-2는 OpenAI에서 2019년 발표한 논문이다. GPT-2는 기존의 대규모 LM 구조인 GPT-1의 구조를 따르지만, 학습을 Unsupervised Multitask Learning을 사용하여, 범용성 있는 자연어처리를 할 수 있

devhwi.tistory.com

  • in-context learning도 GPT-2 논문의 방법과 비슷하지만, context 내에서 구조적으로 조금 다른 몇 가지 setting을 시도해 볼 수 있다.  task-specific 데이터를 얼마나 활용하냐에 따라, 4가지 setting으로 분류한다.
    • Fine-Tuning (FT) : 최근에 가장 일반적인 방법이다. 원하는 task에 맞는 데이터셋을 통해 학습한다. 이 과정에서 수많은 데이터가 필요하다. FT의 장점은 성능이 매우 좋다는 점이다. 가장 큰 단점은 각 task를 학습할 때마다, 수많은 데이터가 필요하다는 점이다. GPT-3도 FT로 학습할 수 있지만, 논문의 목적은 성능이 아니기 때문에, 별도로 학습하지는 않았다.
    • Few-Shot (FS) : inference 과정에서 conditioning으로 이용할 수 있는 약간의 task에 대한 설명이 주어지지만, 직접 학습에 활용하지는 않는다.  FS는 task에 대한 설명과 함께 task에 대한 K개의 example들이 제공된다. (K를 model의 context window라고 하고, 대략 10~100의 값을 갖는다.) FS의 장점은 task-specific 한 데이터를 많이 줄일 수 있다는 것이고, narrow distribution에서 학습할 수 있는 잘못된 상관관계에 대한 가능성이 줄어든다는 것이다. 단점은 FT 방식의 SOTA에 비해 성능이 떨어진다는 점이다. 또한, task specific한 데이터가 여전히 필요하다는 점이 문제이다. 
    • One-Shot (1S) : task에 대한 example이 하나만 주어진다는 것이 Few-shot과 다른 점이다. 굳이 one-shot을 few-shot과 나누는 이유는 one-shot이 인간의 커뮤니케이션과 비슷하기 때문이다. 
    • Zero-Shot (0S) : 어떤 task인지에 대한  설명만 있고, 아무 example이 주어지지 않는다. 이 방법은 편의성과 확장성, 잘못된 상관관계를 피할 수 있는 점등에서 매우 좋지만, 학습이 매우 어렵다. 

[Model]

  • Sparse Transformer 논문의 sparse attention을 사용한 것 외에는 GPT-2와 같은 모델과 아키텍처를 사용하였다. 
  • model size와 성능 간의 상관관계 확인은 ㄹ위해, 8가지 다른 size의 모델을 사용했다. (125 millions ~ 175 billions)
  • 이 중, 제일 큰 모델을 GPT-3이라고 한다. 

GPT-3 8개의 다른 parameter size 모델

[Training Dataset]

  • 데이터가 풍부한 Common Crawl Dataset을 사용하였지만, 필터링되지 않은 데이터가 많이 섞여있어서, 데이터셋의 품질을 향상하기 위한 3가지 방법을 추가하였다.
    • Common Crawl Dataset에서 high-quality reference corpora와 비슷한 데이터들을 다운로드하였다.
    • 문서 수준에서 퍼지 일치 기반 중복 제거를 활용하여, overfitting 등을 방지하였다.
    • 이미 알려진(앞선 NLP 논문등에서 활용), high-quality reference corpora 데이터들을 데이터셋에 포함하였다.
    • 단순히 양에 따라서 가중치를 둔 것이 아닌, 데이터셋에 품질이 높을수록 높은 가중치를 두었다. (아래 weight in training mix에 해당) 

GPT-3에서 활용한 데이터셋

[Training Process]

  • large model일수록 큰 batch size를 사용하지만, 적은 learning rate를 필요로 한다. 
  • 학습과정에서 gradient noise scale을 측정하여, batch size 선택에 사용하였다.
  • Out of memory를 막기 위해, model parallelism을 사용했다.  

 

Results

  • size가 각기 다른 8개의 GPT-3 모델의 learning curve를 비교하였는데, size가 큰 모델일수록 언어모델의 성능이 향상됨을 보인다.
  • 이 과정에서, traigning compute와 performance는 power-law를 따른다고 알려졌는데, 모델 size가 일정 수준 이상에서는 power-law의 기댓값보다 더 좋은 성능을 보였다. 
  • 이것이 training dataset을 cross-entropy를 통해 학습해서(외워버려서) 그런 것 아닐까 하는 의심이 들 수도 있지, cross-entropy가 다양한 NLP 분야의 task에서 일관적으로 성능 향상을 보임을 보인다. 


1. Language Modeling

  • Penn Tree Bank(PTB) dataset에서 zero-shot perplexity를 계산하였다. 
  • training dataset에 포함된 Wikipedia와 관련된 4가지 task들은 제외했다. 
  • 새로운 SOTA가 되었다.

[LAMBADA]

  • LAMBADA dataset은 text 내에서 long-range dependency를 테스트한다. (context를 읽고, sentence의 마지막 word를 추정하는 문제)
  • Zero-Shot 환경에서 기존 SOTA보다 8%가량 좋은 성능을 보였다.

[HellaSwag]

  • HellaSwag dataset은 story와 몇 가지 instruction이 주어지면, 가장 best의 ending을 뽑는 문제이다. 
  • StoryCloze dataset은 story에 따른 가장 그럴듯한 ending sentence를 뽑는 문제이다.
  • 둘 다, SOTA보다는 떨어지지만, 좋은 성능을 얻었다.


2. Closed Book Question Answering

  • Closed Book Question Answering은 다양한 지식에 대한 context가 없는 답변을 생성하는 Task이다.
  • Model Size가 커졌을 때(GPT-3)에서 SOTA를 넘어서는 결과를 보여주었다. (아마도, task 자체가 광범위함을 포함하고 있어서, task-specific 학습이 크게 힘을 발휘 못하는 것 같다.)


3. Translation

  • Translation의 학습에서는 93% 텍스트가 영어였고, 7% 만 다른 언어들을 포함하였고, 별도의 목적함수를 사용하지 않았다. (그냥 언어 구분 없이 똑같이 학습하였다.)
  • Zero-Shot 환경에서는 기존 Zero-Shot들보다 오히려 성능이 낮지만, Few-Shot 환경에서는 특정 task에 한해서는 Supervised SOTA를 넘기도 하였다. 


4. Winograd-Style Task

  • 해당 Task는 대명사가 지칭하는 것을 맞추는 문제로, 추론 능력을 확인할 수 있다. 
  • SOTA에 비해서는 낮지만, RoBERTa에 근접할 정도로 좋은 성능을 보인다. 


5. Common Sense Reasoning

  • 특정 데이터셋에서는 SOTA를 보였지만, 다른 데이터셋에서는 낮은 성능을 보여주었다. 
  • 전체적으로 OpenBookQA를 제외한 데이터셋에서는 Task 설명이 큰 효과를 보지 못했다.


6. Reading Comprehesion

  • GPT-3이 약한 분야이다. CoQA를 제외하고는 SOTA와 매우 큰 성능 차이가 난다. 


7. Super GLUE

  • BERT와의 비교를 위해 SuperGLUE를 Test 한다. 
  • SOTA에는 못 미치지만, 대부분의 task에서 BERT와 필적하거나, 오히려 더 높은 성능을 보여주기도 한다.


이외, 많은 Task들이 있지만, 대체적으로 비슷한 경향을 보여줘서, Result는 여기까지만 넣도록 하겠다.(힘들다.)

다만, 숫자 연산이나 뉴스 기사 생성, 문법 교정 등 다양한 분야에서 좋은 성능을 보여준다. 

 

Memorization에 대한 검증

  • GPT-3의 학습 데이터가 매우 방대하고, Web Crawling을 통해 만들어졌기 때문에, Training dataset에 원하는 Benchmark의 데이터가 포함되어 있을 가능성이 있다. (Data Contamination이라고 표현한다.) 즉, memorization으로 위의 좋은 performance를 낼 수 있다는 것이다. 
  • Training Curve를 보았을 때, 학습에 따라 Validation Loss와 Train Loss가 비슷한 추세로 줄어드는 것을 볼 수 있는데, 이것은 memorization이 없다는 증거가 된다. (특정 task를 외웠으면, train loss만 급격히 줄어드는 구간이 있을 것이기 때문에)

  • 이것 말고도, memorization을 증명하기 위해, 데이터셋을 clean 하는 실험이 있는데,  실험 내용이 사실 이해가 잘 안 간다. 여하튼 Data를 Clean해도 성능에 딱히 영향이 없기 때문에, memorization은 아니라는 뜻이다.

Limitations

  • GPT-3는 좋은 성능을 보여주었지만, 몇 가지 한계가 있다.
    • 성능적 한계 : 몇가지 NLP task에 대해서는 좋지 않은 성능을 보여준다.
    • 구조 & 알고리즘의 한계 : GPT-3은 bidirectional 구조나 denoising 같은 NLP 분야의 성능을 향상하는 방법들은 고려하지 않았다.  
    • 본질적 한계 : 본 논문은 LM을 scaling up 하는 것에 집중하였는데, pretraing objective에 근본적 한계가 있다. 현재 obejective는 모든 token을 동일한 가중치를 준다. 즉, 중요한 token을 예측하는 것이 NLP 성능 향상에 더 중요하지만, 모두 동일하게 학습한다.  단순 Scaling을 떠나서(한계가 있기 때문에), NLP의 목적을 위한 objective 등을 학습해야 할 것이다.
    • pre-training 과정에서 비효율성 : GPT-3은 인간에 비해 너무 많은 텍스트를 학습한다. 학습과정에서 효율성을 향상해야 한다.
    • Few-Shot learning의 불확실성 : 실제로 GPT-3이 Few-Shot Learning을 통해 학습한 것인지 모호하다. 
    • Expensive Cost :  GPT-3의 parameter가 매우 많기 때문에 training & inference cost가 매우 크다. 
    • 설명 불가능 : 모든 Deep Learning이 겪는 문제처럼 GPT-3도 결과에 대한 해석이 불가능하다. Training data에 대한 bias가 발생할 수 있다.

Reference 

Brown, Tom, et al. "Language models are few-shot learners." Advances in neural information processing systems 33 (2020): 1877-1901.

총평

  • 논문이 매우 길고, 저자도 실험도 매우 많다. 그래서 그런지 읽기 매우 힘들었다. (내 착각인지 모르겠지만, GPT-2와 다르게 논문이 약간 문과틱 감성이 난다.)
  • 실험이 매우 많고, 한계와 사회적 파급력 등에 대해서 매우 자세하고 광범위하게 다뤄서, 정말 좋은 논문이다.
  • 다만, Parameter가 매우 크고, Task example이 정교하게 만들어진 것 같아, 재현을 하기는 어려울 것 같다. 

 

반응형

 

DeBERTa 배경 설명

  • DeBERTa는 2020년 Microsoft에서 ICLR 2021에 낸, BERT의 성능을 개선한 논문이다. 
  • 기존 BERT를 개선한 논문들은 엔지니어링적 개선에 가까웠는데, 이 논문은 새로운 방법들을 제시해서, BERT의 성능을 향상했다.
  • ICLR에 발표된 논문인만큼, 실험과 설명이 자세하게 적혀있어, 직접 읽어보는 것을 추천한다.

Abstract

  • 이 논문에서는 DeBERTa(Decoding-enhanced BERT with disentangled attention)이라는 새로운 모델을 제시한다.
  • 이 모델은 2가지 새로운 방법을 사용하여, BERT, RoBERTa보다 높은 성능을 보인다.
    1. disentangled attention : 각 word들은 content와 position vector로 표현되고, 그들의 contents와 상대적 위치에 따라, words들 간에 attention을 구한다.
    2. enhanced mask decoder : 개선된 mask decoder로 decoding layer의 절대 위치를 포함하여, masking token을 예측한다.
  • 추가적으로, 새로운 virtual adversarial trainin이 model의 generalization을 향상하기 위해 사용된다.
  • 이를 통해, NLU(자연어 이해) 뿐 아니라, NLG(자연어 생성)에서도 기존 모델인 BERT, RoBERTa에 비해 좋은 성능을 보인다.

Introduction

  • Transformer는 문장 내의 각 단어가 미치는 영향을 self-attention으로 연산하여, 병렬 수행이 가능하도록 하였다.
  • 이 논문에서는 distentangled attention과 enhanced mask decoder를 사용하여, BERT의 성능을 개선한, DeBERTa를 소개한다.

[Disentangled attention]

  • 기존 positional 정보와 content 정보의 합으로 표현되던 BERT의 embedding과 다르게, DeBERTa에서는 content와 postion vector를 따로 encode 한다.
  • word 사이에 attention weights는 그들의 contents와 상대적 위치를 고려하여, disentangled matrics를 통해 구해진다.
  • 이것은 attention이 contents 뿐 아니라, 그 사이의 상대적 위치에 의존한다는 것에서 비롯되었다.

[Enhanced mask decoder]

  • DeBERTa도 BERT와 동일하게 masked language modeling을 이용해서 학습한다.
  • Disentangled 단계에서 이미 상대적 위치는 고려했지만, prediction에서 매우 중요한 각 단어의 절대적 위치는 고려하지 못한다. (절대적 위치는 문장 내에서 역할을 의미할 수 있다.)
  • DeBERTa에서는 각 단어의 절대적 위치 정보를 softmax 단 바로직전에 합쳐준다.
  • 추가적으로, 이 논문에서는 fine-tuning 단계에서 새로운 virtual adversarial training 방법을 제시한다. 이 방법은 model의 generalization을 향상한다.

Background

[Transformer]

  • Transformer에 대한 설명은 아래 참조
  • 기본 Transformer에서는 word의 위치정보가 부족하다. 이를 해결하기 위해, 문장 내 단어의 상대적 위치와 절대적 위치를 고려하는 방법들이 나왔지만, 일반적으로 상대적 위치를 사용하는 것이 효과적으로 알려져 있다.
  • 이 논문은 각 단어가 word content와 position의 2개의 독립적인 vector를 사용하고, attention weight를 각 vector의 disentangled metrics를 사용해서 구한다는 점에서 기존 방법들과 차이점이 있다.

2023.05.08 - [NLP 논문] - Transformer (Attention Is All You Need) - (1) 리뷰

 

Transformer (Attention Is All You Need) - (1) 리뷰

Transformer 배경 설명 Transformer는 Google Brain이 2017년 "Attention is All You Need"라는 논문에서 제안된 딥러닝 모델이다. Transformer는 기존 자연어 처리 분야에서 주로 사용되던 RNN, LSTM 같은 순환 신경망 모

devhwi.tistory.com

[Masked Language Model]

  • 자연어 모델에서는 BERT 이후로 Masked Language Modeling을 많이 사용한다.
  • Masked Language Modeling에서는 model parameter θ를 학습하기 위해, 다음의 objective를 사용한다.

DeBERTa

[disentangled attention]

disentangled attention 식을 만들기 위해, 몇 가지를 설명한다. 논문 내에는 따로 구분 짓지 않았지만, 설명 편의를 위해 임의로 3가지 part로 나눴다.


1. Vector 구성 요소

  • 문장 내 i번째 token은 다음과 같은 두 개의 vector로 구성된다.
    • i번째 contents vector: \(H_i\)
    • i번째 token에서 j번째 token과의 상대적 position : \(P_{i|j}\)
  • i번째 token과 j번째 token 간의 attention score는 다음과 같이 계산된다.

→ 위의 수식은 4개의 component로 분리되는데, 왼쪽부터 각각, "content-to-content", "content-to-position", "position-to-content", "position-to-position"이다.  

 

  • 이 논문이 지적하고 있는 것은 과거 논문들에서는 attention의 4가지 component 중, "content-to-content"와 "content-to_position"만 사용하고 있다는 것이다. (content vecotor에 position을 더해서 만들었기에)
  • 특히, 문장 내에서 두 단어 간의 상관관계를 고려할때, 단순 contents만 보는 것이 아니라, 두 단어간의 상대적 위치도 매우 중요하기 때문에 "position-to-contents"와 "contents-to-position"을 모두 봐야 한다.
  •  수식 내용 중, position vector가 상대적 위치를 기반으로 만들어졌기 때문에, "position-to-position"은 추가적인 정보를 주지 못하므로, 수식에서 삭제한다.   

 

2. Self-attention operation

  • self-attention은 아래와 같은 수식을 통해 구해진다. Output hidden vector인  \(H_o\)를 구하기 위해, Query(Q)와 Key(K)를 통해 Attention(A)을 구하고, Attention을 Normalize 한 후 Value(V)에 곱한다. 

 

3. 상대적 위치  

  • 이 논문에서는 상대적 위치를 아래와 같이 계산한다. 

→ k는 maximum relative distance. 위의 거리 식을 생각해 보면, 현재 token의 앞쪽에 위치한 token은 distance가 0으로 주의 깊게 보겠다, 뒤쪽에 위치한 token 중, k 이내는 가까울수록 고려 많이 하겠다, 그 외에는 조금만 고려하겠다는 뜻으로 이해된다.


  • 위의 1,2,3번을 종합하면, disentangled attention은 1.attention은 3개 component로 구성되었고, 2. self-attention 기반, 3. 상대적 거리를 고려하는 attention이다. 
  • 최종적으로 output hidden vector는 아래와 같이 구해진다.

→ 주의해야 할 점은, "position-to-content"에 \(\delta(j, i)\)가 사용되었다는 점인데, 이것은 "position-to-content"를 구할 때, 사용되는 content가 j번째 content이기 때문이다. 

 

[enhanced mask decoder]

  • disentangled attention에서 relative position은 고려되었지만, absolute position은 실제 mask-prediction에 중요함에도 불구하고, 고려되지 않았다. 
  • 특히, 뉘앙스 같은 것은 absolute position 정보가 중요하다. 
  • DeBERTa에서는 모든 Transformation layer들의 직후, softmax layer 전단에 absoulte position 정보를 넣어주었다.
  • 이를 통해, Transformer가 elative position을 우선 고려하되, absolute position 정보도 보완 정보로 사용할 수 있게 하였다. 
  • 이러한 모델을 Enhanced Mask Decoder(EMD)라고 부른다. 
  • BERT 방식(input 정보에 absolute position 정보를 넣는 것)에 비해 성능이 좋다.

 

Scale Invariant fine-tuning

  • Layer Noramlization 기법에 영감을 받아, SIFT 알고리즘을 사용하였다. 
  • SIFT는 word embedding vector를 확률 vector로 normalization 하고, normalize 된 word embedding에 preturbation을 적용한다. 
  • 이로 인해,  fine-tuend model의 성능이 상당히 향상되었다.

 

 

Experiment

  • Large model : GLUE에서 다른 large model에 비해 좋은 성능을 보였다. 

  • Base model : Base 모델에서도 좋은 성능을 보였다.

 

ETC

  • 사용한 데이터 셋 

  • model 학습을 위한 paramter

  • RoBERTa와 attention visualization 비교

→ RoBERTa는 diagonal line이 두드러지지만, DeBERTa는 그렇지 않다. 이것은 EMD의 영향인 것으로 확인된다.(DeBERTa가 다른 단어를 골고루 본다는 뜻인 것 같다.)

RoBERTa는 vertical line이 2줄 존재하는데, 하나는 special token(CLS)등 때문이고, 하나는 high frequency token(예시: a, the) 때문이다. DeBERTa는 special token 영역의 1줄만 존재한다.(특정 단어에 무조건 의존하는 현상이 적다는 것을 말하는 것 같다.)

 

Reference 

He, Pengcheng, et al. "Deberta: Decoding-enhanced bert with disentangled attention." arXiv preprint arXiv:2006.03654 (2020).

 

 

총평

  • 실험이 정말 많아서, 많은 생각을 할 수 있게 만든 논문이다.
  • BERT 관련 논문들을 계속 읽어오고 있는데, 모델 단의 개선 아이디어는 처음인 것 같아서, 재밌었다.

 

DeBERTa 관련 git : https://github.com/microsoft/DeBERTa

반응형

DistilBERT 배경 설명

  •  DistillBERT는 Huggiing Face에서 2019년에 낸 논문으로, knowledge distillation을 사용하여, BERT의 문제점으로 지적되던, 큰 parameter 문제를 극복하기 위한 연구이다.
  • 실제로 BERT를 실생활에서 이용할 때, 속도와 메모리 때문에 거의 DistilBERT를 많이 이용하는 것 같다.  

 

Abstract

  • NLP 분야에서 large-scale pre-trained model을 사용한 transfer learning이 대세가 되었지만, model의 크기가 커서 연산 cost는 아직 크다.
  • 이 논문에서는 DistilBERT라는 더 작지만, 성능은 떨어지지 않는 새로운 모델을 제안한다. 
  • DistilBERT은 pre-training 단계에서 knowledge distillation을 이용하여, BERT의 모델 크기를 40%로 줄이고, 60%나 빠르지만, 성능은 97% 정도로 거의 떨어지지 않는다.
  • lLarge language model이 학습한 내용을 배우기 위해, language modeling에 triplet loss를 사용하여 학습한다.

 

Introduction

  • NLP 분야에서 transfer learning이 주류로 자리 잡은 이후, 성능 향상을 위해 모델의 크기를 점점 키우고 있다. 
  • 하지만, 이런 흐름은 1) 학습을 위한 자원 사용이 계속 증가한다는 점 2) 연산과 메모리 소모가 더 커져서, real time 처리와 같은 응용을 어렵게 한다는 점이 있다. 
  • 이 논문에서는 knowledge distillation을 사용하여, 기존 languager model보다 훨씬 더 작아, 가볍고, 속도가 빠르면서 성능은 좋은 모델을 제안한다.
  •  triplet loss를 사용하여 학습된, 기존보다 40% 가량 작은 Transformer가 기존 방식으로 학습된 Transformer와 거의 비슷한 성능을 내면서, 60%나 빠르다는 것을 보인다.

 

Knowledge Distillation

  • knowledge distillation은 compact model을 위한 압축방식에서 비롯된 것으로, larger model(일반적으로 teacher라고 부름)의 performance를 따를 수 있는 compact model(student라고 함)을 찾는 과정이다.
  • classification 학습은 일반적으로 one-hot vector를 이용한 Cross-entropy를 이용한다. 따라서, 각 class에 분포될 확률을 가지고 있다. classification 학습에서 knowledge distillation은 기존 classification을 위한 학습뿐 아니라, large model의 확률 분포를 따르도록 compact model을 학습한다(distillation loss).
  •  이 논문에서도 pre-training 과정에서 mask를 추정할때, distiilation loss의 개념을 활용한다. 추가적으로 compact model과 large model의 hidden states vector가 align 되도록 cosine embedding loss를 추가했다.

 

DistillBERT

[Student(compact model) architecture]

  • 전체적인 모델은 BERT와 동일하지만, layer의 개수가 반으로 줄었고, token-type embeddings와 pooler를 삭제했다. 
  • transformer의 hidden state dimension은 연산이 최적화된 라이브러리를 사용하기 때문에, 줄여도 큰 영향을 미치지 않아, layer를 줄이는데 집중했다.

[Student Initialization]

  • Teacher와 Student가 구조가 비슷한 덕(dimension이 같아서)에 Teacher의 2개 layer마다 1개 layer의 parameter를 Student로 가져와서 Initialization 하였다. 

[Distillation]

  • RoBERTa의 방법을 따라서 학습했다. 

2023.06.03 - [NLP 논문] - RoBERTa (A Robustly Optimized BERT Pretraining Approach) 논문 리뷰

 

RoBERTa (A Robustly Optimized BERT Pretraining Approach) 논문 리뷰

RoBERTa 배경 설명RoBERTa는 워싱턴 대학과 Facebook에서 2019년에 나온 BERT에 대한 연구 & 개선 논문이다.BERT의 등장으로 언어 모델의 뼈대가 통일(?)된 상황에서, 그것을 개선할 방법을 제안하였다. BERT

devhwi.tistory.com

[Data & Computational Power]

  • Original BERT처럼 English Wikipedia와 Toronto Book Corpus를 사용했다.
  • 8대의 16GB V100로 90시간 학습했다. 

 

Experiments

  • GLUE에서 성능 비교를 했을때, ELMo보다는 높고, Original BERT보다 40%의 paramter만 사용함에도 불구하고, BERT 성능에 97% 정도로 매우 비슷한 성능을 보인다.

  • Downstream tasks들에서도 DistillBERT는 BERT와 과의 비슷한 성능을 보인다.

  • Parameter와 속도를 비교해보았을때, original BERT에 비해 매우 적은 parameter를 사용하고, 빠르다는 것을 알 수 있다.

 

Reference 

DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter, Victor Sanh and Lysandre Debut and Julien Chaumond and Thomas Wolf, arXiv, 2019

 

총평

  • 아이디어가 매우 간단하고, 명확해서 좋다. 
  • BERT를 실용 단계에서 잘 활용할 수 있는 이런 연구들이 많이 나왔으면 좋겠다. 
반응형

GPT-2 배경 설명

  • GPT-2는 OpenAI에서 2019년 발표한 논문이다. 
  • GPT-2는 기존의 대규모 LM 구조인 GPT-1의 구조를 따르지만, 학습을 Unsupervised Multitask Learning을 사용하여, 범용성 있는 자연어처리를 할 수 있는 모델을 제시했다.
  • 또한, parameter의 크기와 성능이 log-linear한 상관관계가 있다는 것을 제시하여, 많은 각광을 받았다. 

Abstract

  • 자연어 처리의 다양한 분야에서 task specific한 데이터셋으로 spervised learning 하는 것이 일반적이다.
  • 이 논문에서는 학습과정에 task specific한 지도학습 없이 학습하는 언어모델을 제안한다.
  • 주어진 문서와 질문에 대한 정답을 구하는 문제에서, training dataset 없이 4개의 베이스라인 시스템 중, 3개와 맞먹거나, 그를 능가하는 수준을 기록했다.
  • LM의 용량은 zero-shot task transfer를 성공적으로 하는데, 중요한 요소이다. 또한, 용량 증가에 따라, 성능도 log linear 하게 증가한다. 
  • GPT-2는 1.5B paramerter의 Transformer로 이뤄져있고, 8개의 zero-shot 환경의 language modeling 데이터 중, 7개에서 가장 좋은 성능을 보여준다. 

Introduction

  • Machine Learning 시스템들은 large datasets와 high-capacity model들을 사용하여 supervised learning을 사용하여 뛰어난 성능을 보인다.
  • 그러나, 이러한 시스템들은 다루기 힘들고, 데이터 분포나 task 변화에 따라 민감하다. 
  • 현재(그 당시) 시스템들은 generalist라기 보다는, 좁은 분야의 전문가의 특성이 있다.(task specific에 특화되어 있다는 뜻) 이 논문에서는, 다양한 분야에서 사용할 수 있는 general system으르 만들고자 한다.
  • 저자들은 single domain dataset으로 single task tranining을 진행하는 것이, 현재(그 당시) 시스템이 generalization을 잘 못하는 이유라고 생각한다. 
  • robust sytstems을 만들기 위해, training과 test에서 다양한 domain과 task의 데이터셋을 사용해야한다. 최근(당시)에는 몇몇 benchmarks 등이 등장했다.(GLUE, decaNLP)
  • Multitask learning은 general performance를 향상시키기에 좋은 방법이지만, NLP에서는 초기 단계이다.
  • 한편, LM 분야에서는 pre-training과 supervised fine-tuning을 결합하는 방식을 주로 사용한다. (GPT-1, BERT 등등)
  • 이 논문에서는 LM의 down-stream 단에서도 zero-shot learning으로 학습할 수 있는 새로운 모델을 소개한다. 이 새로운 LM은 zero-shot setting에서도 좋은 성능을 보인다. 

Approach

  • GPT-2에서도 일반적인 Language Modeling을 사용한다. 

  • 일반적인 signle task에서 conditional dsitribution은 p(output|input)이다.
  • general system에서는 다양한 task들을 처리해야하기 때문에, conditional diestribution은 p(output|input, task)이다. 
  • task conditioning은 종종 architectural level에서 실행되기도 하고(task specific encoder & decoder), algorithmic level에서 수행되기도 한다. 어떤 연구에서는 language가 어떤 task를 수행할지를 지정해주기도 한다. 
  • 언어 모델링은 symbol을 예측하는 supervision 방식으로 학습하지 않아도, 학습 가능하다. supervised objective의 최솟값과 unsupervised objective이 최솟값이 동일하기 때문에, 같게 수렴하기 때문이다. unsupervised learning은 속도는 느리지만, supervised learning과 같게 optimize 될 수 있다.

[Training Dataset]

  • 기존 LM의 학습에는 single domain의 text(뉴스 기사 등)가 사용되었다.
  • 이 논문에서는 크고 다양한 데이터셋을 수집하여, 다양한 task와 context를 커버할 수 있도록 데이터 셋을 다양화하였다. 
  • 다양하고, 풍부한 text를 수집하는 가장 좋은 방법은 Common Crawl 같은 곳에서 web scrape을 진행하는 것이다. 하지만, 기존 LM 데이터셋보다 양이 많음에도 불구하고, 데이터의 quality 이슈가 있다.
  • 어떤 방법들에서는 Common Crawl에서 small subsample만을 이용해서 좋은 성능을 보였다. 하지만, 이 방법은 특정 task의 성능을 향상 시켜주지만, 이 논문에서는 어떤 task 등 커버할 수 있도록 학습을 진행할 수 있는 데이터셋을 수집하고자 했다. (특정 분야만 수집하면, task specific이 한정되기 때문에)
  • 이를 위해, 이 논문에서는 document quality를 강조하는 새로운 web scrape을 만들었다. 새로운 web scrape은 인간에 의해 filtered된 문서만 수집한다. 
  • Reddit에서 3 karma(안써봐서 모르겠지만, 좋아요 같은 것 인가보다.) 이상을 받은 데이터만 수집하여, manual filtering 하였다. 
  • 결론적으로 만들어진, WebText 데이터셋은 45 million개의 링크를 포함한다. HTML에서 text를 뽑기 위해, Dragnet과 Newspaper content extractor들을 사용하였다. 

[Input Representation]

  • charactre와 word level의 중간을 사용하는 Byte Pair Encoding을 사용하였다. 
  • 이러한 방식은 word-level LM의 성능과 byte-level 방법의 generality의 장점을 결합할 수 있다. 

[Model]

  • 이 논문에서는 LM의 base architecture로 Transformer를 사용했다. GPT-1 모델을 약간의 변화를 제외하고 그대로 사용하였다.
  • Layer normalization은 각 sub-block의 input으로 이동하였고, final self-atteention block 이후에 추가 layer normalization을 더했다. 
  • Vocuibulary는 50257개로 증가시켰고, context size는 최대 1024개까지 사용하였다.  

 

Experiments

  • 기존 모델들과의 비교를 위해서 4개의 LM의 space size에 따라 이 모델의 성능을 log-uniformly하게 계산해서, 성능을 구했다.
  •  가장 작은 건 GPT-1과 parameter 정도의 크기이고, 2번째로 작은 것은 BERT 사이즈의 parameter를 가지고 있다. 

Language Modeling

  • 이 논문에서는 BPE를 사용하기 때문에, tokenization 같은 pre-processing이 필요하지 않다.
  • WebText LM dataset을 이용하여, log-probabilty를 이용하여 학습한다. 
  • <UNK>은 WebText에서 거의 나타나지 않는다. (40 billion bytes 중 26회만 등장)
  • Zero-Shot으로 수행된 모델들 간의 비교에서, LM 분야의 8개 task 중 7개에서 SOTA를 달성하였다.  
  • Children's Book Test, LAMBADA 데이터셋에서 좋은 성능을 보였다. 
  • Summarization과 QA, Translation에서는 좋은 성능을 보이지 못하였다.

Conclusion

  • 이 논문에서는 충분하고 다양한 데이터셋으로 학습된 large language mode이 많은 domain들과 dataset들에서 사용될 수 있음을 보여주었다. 
  • GPT-2는 zero-shot으로 학습된 모델 들중, 8개의 testset 중 7개에서 SOTA 성능을 보여주었다.

 

Reference

OpenAI. (2019). Improving Language Understanding by Generative Pre-Training. Retrieved from https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf

 

 

총평

이 논문에서는 사실, 새로운 구조의 모델이나 학습방법을 제시하는 기존 LM 분야의 논문들과 달리, Unsupervised Learning으로 Language Model을 학습해 보았다는 데에 있다. 이 과정에서 학습 과정에 Parameter의 양과 성능의 연관성을 언급하여, 추후에 LM 분야의 구조들이 크기를 더욱 늘리는 데 기여했다고 생각한다. 

반응형

BERT 배경 설명

  • BERT는 Google에서 2018년 10월에 나온 NLP 논문이다.
  • 사실 지금은, Chat-GPT 때문에 GPT가 자연어 처리의 대명사가 되었지만, GPT 전에는 BERT가 자연어 처리의 대표 모델로 불리곤 했었다. 
  • BERT는 성능이 매우 좋아서, 아직도 많은 NLP Task에서 사용되고 있다.
  • 개인적으로 이 논문을 읽으면서, 2018년 6월에 나온 GPT-1 논문을 굉장히 많이 신경 쓰고 있다는 인상을 받았다. 

Abstract

  • 이 논문에서는 BERT(Bidirctional Encoder Representations form Transformers)라는 새로운 모델을 소개한다.
  • 기존의 (그 당시) 유행하는 모델들(특히 GPT-1)과 달리 BERT는 단어의 양방향 데이터(이전 데이터와 이후 데이터 모두)를 사용한다.  
  • 이러한 구조로 BERT는 별도의 task-specific한 변형 없이, 하나의 layer만 추가해도 대다수 NLP task(11개)에서 좋은 성능을 보여준다.

 Introduction

[문제 제기]

  • 기존의 pre-trained language representations들을 specific 한 task에 적용하는 방식은 feature-basedfine-tuning으로 크게 2가지로 나뉘어진다. 
    • Feature-based : task-specific한 구조를 가지고 있고, pre-trained 된 representations들을 추가적인 feature로만 사용한다. (ELMo)
    • Fine-tuning : 최소한의 task-specific한 parameter들을 가지고, 모든 pre-trained parameter들을 fine-tuning 해서 사용한다. (GPT)
  • 하지만, 기존의 방식들은 pre-trained model을 학습하는 과정에서 이전 데이터들만 사용하는 unidirectional launguage models (단방향 모델)이다. 
  • 이러한 방식은 pre-trained representations들의 효과를 감쇠한다. 특히, fine-tuning model에서 이런 감쇠 효과는 더 크다. 

[모델 제시]

  • 이 논문에서는 "BERT"라는 모델을 제시하여, fine-tuning 방식의 pre-trained language model의 성능을 향상 시킨다.
  • BERT는 "masked language model(MLM)" pre-training objective를 이용하여, 단방향 데이터만을 사용하는 기존의 한계를 경감한다. 
  • 은 input 데이터의 token들에 randomly 하게
  • 기존 left-to-right language model pre-training과 달리, MLM은 left와 right context 정보를 모두 활용할 수 있다. 
  • 추가적으로 "next sentence prediction"을 통해, text-pair 들의 representation들을 학습한다. 

 Model

  • BERT는 기존의 Fine-tuning 방법들(특히 GPT-1)처럼 2개의 step으로 구성된다.  (1) pre-training (2) fine-tuning

  • Model Architecture : BERT의 모델 아키텍처는 Transformer를 그대로 사용했다. Paper에서는 두 버전의 BERT 모델을 소개한다. 첫 번째로, GPT와 비교하기 위해, 동일 모델 사이즈를 가지고 있는 BERT BASE(12개의 Layer, 768 Dimension, 16개 Self-Attention)이다. 두번째로, BERT LARGE(24개의 Layer, 1024 Dimension, 16개의 Self-Attention) 이다. 
  • Input/Output Representations : BERT는 WordPiece Embeddings를 사용한다. BERT는 다양한 NLP task에 응용할 수 있도록, 단일 문장이나 문장의 짝 모두를 input으로 사용할 수 있도록 한다. 모든 문장의 맨 첫 token은 special token인 "[CLS]"로 시작하고(해당 Token 등은 sentence 단위의 classification에 활용된다.), 두 문장이 Input으로 들어올 때는 두 문장 사이에 "[SEP]" token을 넣어 구분하고, 어느 문장에 소속된 token인지 구분할 수 있는 learned embedding을 문장을 이루는 각 token에 추가했다.(Segment embeddings)

아래 그림은 BERT의 input representations를 나타내는데, token 자체의 embeddings와 어느 문장에 속하는지를 나타내주는 Segment embeddings, token의 문장 내 위치를 가르쳐주는 Position embeddings로 구성되어 있다. 

 

 

  • BERT의 Pre-Training 단계
    • 논문 내내 강조하는 것이, BERT는 단방향 모델이 아닌, 양방향 Language model을 사용한다는 것이다. 
    • Masked LM 
      • 직관적으로 생각해도(수능 빈칸 추론 문제만 생각해 봐도) 단어를 추정할 때, 그 단어의 앞부분만 보는 것이 아닌 뒷부분에서 힌트를 얻을 수 있다. 하지만, 기존 모델들은 한쪽 방향의 단어들만으로 Language model을 학습했다. BERT는 지금껏 계속 강조해 온 대로, 양방향의 데이터를 모두 활용하기 위해 Masked LM을 제시한다. 
      • Masked LM은 일정한 확률로 무작위로 input token을 가리고("[MASK]" token으로 대체), 문장 내 다른 단어들을 통해, 해당 token을 추정하는 방식(기존의 LM과 동일하게 cross-entropy)으로 학습된다
      •  이런 Masked LM에는 한 가지 문제가 있는데, pre-training에 빈번하게 등장하는 "[MASK]" token이 실제 fine-tuning 과정에서는 없다는 것이다.(pre-training 학습을 위해 임의로 넣어주었기 때문에) 이를 해결하기 위해, 논문에서는 token을 무조건 [MASK]로 대체하는 것이 아닌, 확률적으로 바꿔주는 스킬을 사용한다. 따라서, 한 문장에서 15% 정도의 token의 위치를 1) 80% 확률로 [MASK] token으로 대체, 2) 10% 정도 random 한 token으로 대체, 3) 10%는 바꾸지 않고 원래 단어로 둔다. → 특정 token 들에 의지해서 masked 된 token을 추정하는 것을 방지해 주는 Augmentation 효과도 있을 것이다.  
    • Next Sentence Prediction
      • 앞부분까지는 한 문장 내에서 단어를 추정하기 위한 방법이었다. 하지만, 많은 NLP task들은 문장 간의 관계가 중요한 경우가 많다. 이러한 문장 간의 관계는 기존 Language model로는 잡 포착하기 어려웠다.
      • 문장 간의 관계를 학습하기 위해, BERT에서는 next sentence prediction task를 이용하였다. 
      • 앞서, 문장의 Embeddings 중 Segment Embedding이 존재하였는데, 실제 데이터들은 한 문장 뒤에 다음 문장이 오는 구조로 되어있다. (실제 문장이든, QA 문장이든 선후 관계가 존재한다.) 
      • next sentence prediction task에서는 실제 데이터에서 뒤에 오는 문장을 임의로 변경하여, false 데이터를 만들어서 두 문장 간의 선후 or 인과 관계에 대한 binary classification을 학습한다.  
      • 이러한 구조는 매우 간단하지만, QA 등의 문장 간의 인과 관계가 중요한 task에서 매우 효과적인 성능 향상을 보인다고 한다.
  • BERT의 Fine-tuning 단계
    • BERT의 fine-tuning 과정은 Transformer 구조를 그대로 이용하였고, Input의 형태가 단일 문장이던, 문장의 짝이던 동일하기 때문에 매우 직관적이다. 
    • 언급한 대로, Input의 형태는 task에 상관없이 모두 동일하고, Output은 앞서 문장 앞에 넣어주었던 [CLS] token을 classification을 위한 output layer의 input으로 넣어 학습하면 된다.
    • Pre-training 과정은 매우 많은 시간과 H/W 리소스가 필요하지만, fine-tuning은 구조가 간단하고 simple하기 때문에 inexpensive 한 과정이라고 한다. (사실 이 특징 때문에, AI의 패러다임이 모델 중심에서 데이터 중심으로 바뀐 것 아닌가 싶다.) 

 

Experiments

  • BERT를 이용해서 11개의 NLP task를 실험했다. 
  • GLUE(General Language Understanding Evaluation)를 포함한 다양한 언어 모델에서 다른 모델들을 능가하는 performance를 보여준다. 
  • 실험에서 놀랄만한 점은, BERT가 인간보다 높은 성능을 보이는 테스트도 있다는 것이다. 

→ BERT도 GPT-1과 마찬가지로, 논문 자체가 실용성에 초점을 맞추고 있다 보니, 학습 부분을 자세히 설명해 놓았다. 자세한 내용은 논문을 직접 참고하는 게 좋을 것 같다. 

 

Conclusion

  • 최근에(그 당시에) 수많은 unlabeled 데이터를 통해, unsupervised pre-training을 진행하는 것이 NLP 분야에 엄청난 발전을 이뤘다. 
  • 이 논문의 가장 큰 contribution은 이러한 방법을 통합하는 bidirectional 구조를 제안했다는 것이고, 이러한 pre-trainin g구조가 다양한 NLP 분야에 활용할 수 있다는 점이다.   

출처

Jacob Devlin, Ming-Wei Chang, Kenton Lee, and Kristina Toutanova. 2019. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. In Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long and Short Papers), pages 4171–4186, Minneapolis, Minnesota. Association for Computational Linguistics.

 

총평

지금 생각하면 당연한 것인데, Bidirectional 구조를 제안하고, 실제 NLP 분야에서 좋은 성능을 보여줬다는 것이 신기하다. 개인적으로 논문 전체가 GPT를 신경 쓰고 있다는 느낌이 들어, 역시 Google 사람들은 혜안이 있구나 하는 생각이 들었다. 아직 BERT 뒤에 논문들을 읽어보지 못했지만, 전체적으로 NLP 논문들이 작은 단위(근처 단어)를 보다가, 큰 단위(이 논문에서는 next sentence prediction으로 인접 문장까지) 봤다는 것을 봐서, 점점 참조하는 범위가 늘어나겠구나라는 것을 유추해 볼 수 있을 것 같다.  

반응형

💬 한국어 텍스트 데이터 전처리

  • 텍스트 데이터는 보통 그 자체로 사용하기보다, 의미의 단위로 나눠서 활용 여부나 사이 연관 관계를 찾는다.
  • 저번 장에서 확인한 대로, 데이터셋의 텍스트 데이터는 한국어 문장으로 구성되어 있다.
  • 학습할 때마다 한국어 형태소 분리를 실행해도 되지만, 시간이 너무 많이 걸려서, 텍스트 데이터를 전처리 해놓기로 한다. 

한국어 텍스트 데이터 전처리 방법

  • 텍스트 데이터의 전처리 단계는 다음과 같다.
1. 텍스트 데이터를 형태소 단위로 분리한다.
2. 분리된 데이터 중, 불용어를 제거한다. (Optional)
3. 동의어를 mapping 할 수 있다면, 동의어를 mapping한다. (Optional)
4. word dictionary를 생성
5. word를 정수 인코딩한다.

1. 한국어 형태소 분리 (Tokenization)

  • 한국어의 경우에는 영어와 달리, 의미의 단위가 띄어쓰기와 정확히 일치하지 않는다.
  • 과거부터 한국어 형태소 분리가 연구되어 여러 방법들이 존재한다.
  • 파이썬은 "konlpy" 라이브러리에서 다양한 형태소 분석기를 제공한다. (자세한 내용은 https://konlpy.org/ko/latest/index.html 참조)
  • konlpy에서는 다양한 형태소 분석기를 제공해 주지만, 그중 "Okt"(Twitter에서 개발한 오픈소스 한국어 처리기)를 사용하여 한국어 형태소 분리 처리를 하기로 한다. (선택한 이유는 속도 때문이다.)
처리 전 처리 후
"아버지가 방에 들어가신다."  ["아버지","가","방","에","들어가신다","."]

2. 불용어 처리

  • 불용어(Stopword)는 분석에 필요하지 않거나, 분석 결과에 영향을 미치는 단어를 말한다. (예시: 은,는,이,가)
  • 자연어 처리에서는 불용어 제거가 매우 중요하다. 불용어는 실제 분석에는 이용되지 않지만, 일반적으로 문장에서 등장하는 빈도수가 높아져서, 해당 단어들이 중요한 단어로 인식될 수가 있다. 
  • 또한, 불용어 제거는 전처리 과정에서 처리할 텍스트 데이터의 양이 줄어서 처리 속도 향상을 위해 꼭 필요하다. 
  • 다만, 불용어는 분석의 목적에 따라 달라지는 상대적인 개념이기 때문에, 분석에 영향을 미치지 않는 단어만 넣도록 한다. 예를 들어, 일반적으로 '?'는 Elastic Search 등의 텍스트 검색을 위한 처리에서 불용어 처리가 될 수 있지만, 우리가 다루고자 하는 비윤리적 텍스트 검출에서는 상대를 비꼬는 문장을 찾을 수 있는 중요한 단서가 되기도 한다. 
  • 일반적으로 특수문자는 문장에서 제거한 후에, 한국어 형태소 분리하지만, 해당 Task에서는 특수문자가 분류에 많이 사용될 것으로 생각되어서, 실제 사용되지 않을 것으로 보이는 특수문자만 불용어로 처리하였다.  
불용어 예시 : 

stopwords = ['','','','','','','','','','','으로','','하다','!','?','<','>','(',')','[',']','|','#','.']

3. 동의어 처리

  • 동의어 처리는 일반적으로 텍스트 검색 기능에서 유사한 단어를 찾기 위해 자주 사용된다. 
  • 비윤리적 텍스트 문장 검출 데이터셋에서는 일반적인 단어를 특수문자나 축약어로 표현해 놓은 데이터가 많다. (예시: ㅇㅋ, Ok, 오키, 옿키)
  • 좋은 성능의 검출 모델을 만들기 위해서 동의어 처리도 매우 중요할 것으로 생각되지만, 현실적으로 공수가 너무 많이 소요되어, 별도의 동의어 처리는 하지 않았다. 

4. Word Dictionary 생성 

  • 학습 데이터셋을 형태소 분리하고, 불용어와 동의어 처리까지 처리한 후, 학습 데이터를 기반으로 워드 딕셔너리를 생성한다.
  • 실사용 시, Word Dictionary에 포함되지 않는 단어가 등장했을 경우에는 모델은 해당 단어에 대한 정보를 사용할 수 없다. (자연어 처리 시, 다양하고 풍부한 학습 데이터가 필요한 이유이기도 하다.) 
  • 각 단어에 대한 고유의 번호를 지정한다. 
  • 모든 단어를 사용하는 것이 다양성 측면에서는 좋겠지만, 속도나 성능을 고려하면, word dictionary의 크기를 무작정 늘리는 것은 좋지 않다. (일반적으로 최대 단어 개수를 지정한다. )
  • 정수 인코딩과 모델 테스트 시 빠른 사용을 위해, 인덱싱(key: 숫자, value: word)과 역인덱싱(key: word, value: 숫자)을 모두 진행해 놓는 것이 좋다.  
문장 형태소 분리 Word Dictionary 인덱싱
"아버지가 방에 들어가신다." ["아버지","가","방","에","들어가신다","."]  {<unk>:0,<pad>:1,"아버지":2, "방":3, "들어가신다":4} {'0':<unk>,'1':<pad>,'2': "아버지", '3':"방", '4':"들어가신다"}

5. 텍스트의 Word를 정수 인코딩

  • 모델의 학습을 위해, 텍스트를 정수로 인코딩해주는 작업이 필요하다. 
  • Word Dictionary를 기반으로 학습 데이터의 각 단어들을 정수로 변환한다.
  • Word Dictionary에 포함되지 않은 불용어 등은 "<unk>"라는 wildcard로 치환한다. 이를 통해, 모델이 입력받는 word 데이터의 종류는 Word Dictionary에 존재하는 단어 개수로 제한된다. 
  • 정수 인코딩을 진행하면, 문장마다의 인코딩 벡터의 길이는 전부 다르다. 학습을 위해 데이터를 정형화하는 편이 좋기 때문에, 인코딩 벡터의 끝부분에 "<pad>"값을 넣어, 벡터의 길이를 모두 같게 만들어준다. 
처리 전 처리 후
"아버지가 방에 들어가신다."  2,0,3,0,4,0,1,1,1,1

 

데이터 전처리 코드 구현

  • 전처리 과정을 사전에 진행해 놓기 위한, 코드를 구현하였다. 다만, 학습과 테스트 시 코드 통일성을 위해, 정수 인코딩 부분은 모델 데이터셋 정의 과정에 넣었다. (테스트 데이터도 정수 인코딩은 진행해야 하기 때문에, Dataset 구성 파트에서 설명 예정)
  • 자연어 Dataset 처리를 용이하게 하기 위해, "torchtext"라는 pytorch에서 제공해 주는 자연어 처리용 패키지를 사용하였다. (하지만, pytorch는 데이터셋의 종류에 따른 전처리를 모두 통일하기 위해 현재는 torch를 사용하도록 권장하고 있다. )
  • Okt가 빠르긴 하지만, 처리 데이터가 많기 때문에 전처리에 시간이 많이 소요된다. 
  • 데이터 전처리 단계를 대략적으로 구성하였지만, 실사용에서는 불용어 지정이나 어느 종류의 형태소 분석기를 사용할 것인지, word dictionary를 어떻게 구성할 것인지 등이 성능을 결정하는 매우 중요한 단계이다. 
from konlpy.tag import *
from torchtext import data 
import json

import pandas as pd

tokenizer = Okt()
stopwords = ['의','가','에','들','는','잘','걍','과','도','를','으로','한','하다','!','?','<','>','(',')','[',']','|','#','.']

# 텍스트 전처리 함수
def norm_morphs(x):
    x = tokenizer.normalize(x) # 텍스트 Normalization
    x = tokenizer.morphs(x) # 형태소 분리
    x = [word for word in x if not word in stopwords] #불용어 처리
    return x


if __name__ =='__main__':
    # 데이터셋 위치 지정
    data_dir = r"..\korean_language\data"

    # ID: 문서의 번호, TEXT: 문장 데이터(전처리 함수를 지정할 수 있음), LABEL: 윤리성 유무를 나타내는 LABEL 
    ID = data.Field(sequential=False, use_vocab=False)
    TEXT = data.Field(sequential=True, use_vocab=True, tokenize = norm_morphs, batch_first=True, tokenizer_language='ko')
    LABEL = data.Field(sequential=False, use_vocab=False, is_target=True)

    # Torch Text의 splits를 이용해서, 데이터를 한번에 불러올 수 있다. 
    train_data, test_data = data.TabularDataset.splits(path=data_dir, train='train', test='test', format='tsv', fields=[('id',ID), ('label',LABEL),('temp1',None),('temp2',None),('temp3',None),('text',TEXT)], skip_header=True)

    # word dictionary를 만듬 (최대 크기와, 최소 빈도수를 지정)
    TEXT.build_vocab(train_data, min_freq=2, max_size=100000)

    # word dictionary를 저장
    with open('./dictionary.json','w') as f:
        json.dump(TEXT.vocab.stoi, f, ensure_ascii=False, indent=4)

    # Index dictionary를 저장 
    index_dict = {v: k for k, v in TEXT.vocab.stoi.items()}
    with open('./index_dictionary.json','w') as f:
        json.dump(index_dict, f, ensure_ascii=False, indent=4)


    id_list = []
    text_list = []
    label_list = []
    df = pd.DataFrame()

    for id, data_dict in enumerate(train_data):
        id_list.append(id)
        text_list.append('|'.join(data_dict.text))
        label_list.append(data_dict.label)

    df['id'] = id_list
    df['text'] = text_list
    df['label'] = label_list
    df.to_csv('train.csv', index=False,sep = '#')

    id_list = []
    text_list = []
    label_list = []
    df = pd.DataFrame()

    for id, data_dict in enumerate(test_data):
        id_list.append(id)
        text_list.append('|'.join(data_dict.text))
        label_list.append(data_dict.label)

    df['id'] = id_list
    df['text'] = text_list
    df['label'] = label_list

    df.to_csv('test.csv', index=False,sep = '#')


    print("Train Data :",len(train_data))
    print("Test Data :",len(test_data))

 

전처리를 진행하였으니, Dataset을 정의하고, 모델을 만들어볼 차례이다!

반응형

💬 비윤리적 텍스트 검출 데이터셋 분석

  • 지난 장에서, '텍스트 윤리검증 데이터'의 train, validation, test 데이터의 양과 형태에 대해서 확인해보았다.
  • 이번 장에서는, 텍스트 데이터를 조금 더 자세하게 분석해보기로 한다.
  • 텍스트 데이터를 분석하는 것은 추후 불용어나, 텍스트 정수 인코딩에서 빈도수 제한을 거는 등에 활용되어, 더 좋은 모델을 만드는데 사용될 수 있다.

  • 텍스트의 윤리검증 기준은 사람마다 다르다. 데이터셋을 구성한 명확한 기준을 알 수 없기에, 우선 데이터셋으로 구성된 비윤리적 텍스트들에는 어떠한 공통점이 있는지 확인해보면 좋을 것이다.

 

data_dir = r"{설치위치}\data\val"
df = pd.read_csv(data_dir, sep='\t', header=None)
df_true = df[df[1]==True]

우선, validation 데이터 파일을 다시 불러온다.(train 데이터의 텍스트를 분석하는 것이 더 좋겠지만, 너무 양이 많아서 오래 걸린다.

 

from konlpy.tag import Hannanum

word_parser = Hannanum()

text_list = list(df_true[5].values)
word_list = []

for text in text_list:
    word_list += word_parser.morphs(text)

 

"Hannanum"이라는 한국어 형태소 분석기를 통해, 데이터셋에 존재하는 text들을 parsing할 것이다. 형태소 분석을 하는 이유는, 형태소 단위로 의미있는 형용사나 명사를 추출하기 위함이다. 

위의 코드에서 "비윤리적" 텍스트들을 형태소 단위로 parsing하여 "word_list"에 넣어주었다. 

 

"word_list"에는 "비윤리적" 텍스트들이 list 형태로 들어가있다. 그중 여러 텍스트들에서 공통되는 단어들은 중복으로 들어가 있을 것이다. 우리는 어느 단어가 많이 등장하는지를 확인하기 위해, "Counter" 함수를 사용할 것이다.

 

from collections import Counter

c = Counter(word_list)
c_dict = dict(c)
c_dict = sorted(c_dict.items(), reverse=True, key=lambda item: item[1])

"word_list"를 "Counter" 함수를 통해 각 단어의 빈도수를 구했고, "sorted" 함수를 통해, 빈도수대로 정렬하였다.

 

비윤리적 텍스트 데이터 단어 빈도수

 

빈도수를 확인해보면, '이','하','는' 등등 "비윤리적" 텍스트들의 특징이라기보다는 한국어 텍스트 데이터들에서 공통으로 찾아볼 수 있는 단어들이 많이 등장하는 것을 볼 수 있다.

 

보통 검색엔진 등에서는 index 구성 시, stopword(불용어)라는 단계를 추가하여 이러한 데이터들을 제거하는데, 우리는 아직 데이터 분석 단계니, 해당 과정을 거치지 않는다. 

 

한 글자로는공통되는 단어가 직관적으로 파악되지 않아, 2글자 이상의 글자만 다시 확인해본다.  

 

word_list = [word for word in word_list if len(word)>1]

c = Counter(word_list)
c_dict = dict(c)
c_dict = sorted(c_dict.items(), 
                              reverse=True, 
                              key=lambda item: item[1])

2글자 이상에서 다시 확인해보니, 의미 있는 단어들이나, 이해가는 단어들이 등장하기 시작하였다. 

 

마찬가지로, 3글자 이상도 추출해본다. 

한 눈에 봐도, 비윤리적으로 보이는 단어들도 다수 등장한다.

 

해당 과정을 반복하면, 단어의 길이가 길수록 빈도수는 적지만, 단어 그 자체로 좋지 않은 의미를 담고 있는 단어들이 많다는 것을 확인 할 수 있다.

 

추후에 word를 정수로 인코딩하는 과정이 들어가는데, word_list에 존재하는 frequency에 따라 해당 단어를 정수로 encoding 할 것인지, 모르는 단어로 놔둘 것인지 설정할 수 있다.

 

이 단계에서 encoding 단계에서 매우 낮은 frequency 기준을 잡아야겠다는 생각을 할 수 있다.

 

 

사실, 이 단계에서 끝내도 되지만, 이왕한 김에 빈도를 wordcloud로 확인해보기로한다. 

 

from wordcloud import WordCloud
import matplotlib.pyplot as plt

wc = WordCloud(font_path='malgun', width=400, height=400, scale=2.0, max_font_size=250)
gen = wc.generate_from_frequencies(c)
plt.figure()
plt.imshow(gen)

 

 

2글자 이상의 데이터를 wordcloud 한 결과는 다음과 같다. (2글자까지는 그나마, 모자이크가 필요없다.)

 

윤리적 데이터에 대해서도 wordcloud를 만들어본다. 

내가 평소에 많이하는 '아니', '어서', '진짜' 같은 단어 들이 많다. 

 

데이터들을 직접 살펴보면서 분석의 방향을 잡은 것은 다음과 같다.

1. 윤리적 기준이 사람마다 달라서 단순 단어의 유무로 판단하는 것은 문제가 있다. (문맥을 파악해야할 것 같다.)
2. 글자 하나가 있냐 없냐에 따라, 의미가 완전히 달라져서 불용어를 최대한 조심해서 사용해야할 것 같다.
3. 긴 단어일수록, 데이터셋 내에서 빈도수는 적지만, 그 단어 하나가 판정에 powerful한 역할을 할 것 같다.
4. 데이터셋의 비윤리적 텍스트와 윤리적 텍스트의 양에 어느 정도 차이가 있다.  (Class Imbalance가 일어날 정도는 아닌 것 같은데, 추후 확장을 생각했을 때 고려해야한다.)
5. 윤리적/비윤리적 데이터의 소스가 비슷해서 그런지 서로 겹치는 단어들이 너무 많다. 추후 확장성을 생각한다면 윤리적 데이터를 추가적으로 더해서 학습해야할 것 같다. 
6. 형태소 분석에 시간이 꽤나 오래 걸려서, 미리 전처리를 해놔야겠다. 

 

지금까지 데이터를 분석해보았다. 다음 장부터, 본격적으로 데이터 모델을 만들고 처리하는 과정을 담도록 하겠다.

반응형

💬 자연어처리(NLP) 모델 만들기


💎 배경

  • 요즘 ChatGPT가 대세다. 석사 과정때는 이미지 처리 중심으로 연구를 진행했어서, 자연어처리에 관련해서 공부를 해보고 싶다는 생각이 들어 자연어처리의 초기 모델부터 현재 ChatGPT까지 흐름을 직접 코드를 짜보면서 이해해보고자 한다.

데이터셋 준비

  • 기본적으로 딥러닝 모델을 만들때, 가장 중요한 것은 “어떤 데이터를 처리하고자 하는가?”이다. 이왕 공부하는 김에 재밌는 데이터를 처리하고 싶어서, 자연어 처리에 필요한 데이터를 뒤져보았다.
  • 내가 선택한 데이터는 한국지능정보사회진흥원에서 운영하는 “AI Hub”에서 다운로드 받을 수 있는 “_텍스트 윤리검증 데이터_”이다. (내국인은 로그인 후, 다운 받을 수 있다)

  • 해당 데이터는 인터넷 상에서 윤리적인 데이터와 비윤리적인 데이터를 구분하기 위해 구축된 데이터로 451,110 문장을 대상으로 하였다고한다.
  • 구축 및 갱신 년도가 나름 최근이여서, 데이터셋을 확인해보았을때, 현재 인터넷에서 난무하는 밈들이나 악플들을 담고 있다. (심신이 약하면 데이터셋을 직접 눈으로 확인안하는 것을 추천한다... 정말 나쁜 글들이 많다.)
  • 해당 데이터를 선택한 이유는 다음과 같다.

① 데이터 및 만들고자 하는 모델이 흥미롭다. (실제로 필요하다고 생각이 들기도하고, 최신 데이터라 그런지 고전 데이터셋 특유의 정적인 맛이 덜해서 좋았다.)
② 데이터가 무겁지 않다.
③ 풀고자 하는 문제가 명확하다. (윤리 VS 비윤리)
④ 참과 거짓 간의 기준이 모호하다
→ 윤리와 비윤리의 정의는 사람마다 기준이 다르기 때문에 그 경계선이 모호하다. 예를들어, "이거 진짜 골때린다"라는 문장이 있을때, 이 문장은 윤리적일까 비윤리적일까? 이렇게 Class간 모호한 기준이 있는 데이터들은 오히려 학습 모델과 학습 방법에 따른 효과를 더 드라마틱하게 확인 가능하고, 추후 개선 아이디어도 만들기 좋다.

 

  • 데이터셋 설치 방법은 다음과 같다.

1. Raw 데이터를 다운 받는다. 

Raw 데이터 다운로드

 

2. 아래로 내려서, 데이터에 대한 전체적인 소개를 읽어본 후, 아래의 AI 샘플코드를 받는다.

(윤리 검증 이진 분류 학습용으로 전처리된 데이터를 포함)

전처리된 데이터 다운로드

 

데이터에 대한 상세한 설명은 다음 장에 진행하도록한다...

 

개발 환경 셋팅

  • Anaconda 환경에서 가상환경을 신규로 구축한 뒤, pypi를 이용하여 몇개의 라이브러리를 설치해준다.
pip install torch   
pip install torchtext==0.6.0
pip install konlpy
pip install pandas
  • torch : 딥러닝 도구 pytorch (CUDA 환경인 경우 홈페이지 설치 추천합니다)
  • torchtext : 자연어처리 분야에서 torch 활용을 쉽게 할 수 있도록 만들어진 라이브러리, 추후 데이터 loader 작성 시 쉽게 활용하기 위해 설치함. torchtext는 버전 0.6.0을 추천함. (이유는 추후에 별도로 설명할 계획)
  • konlpy : 한국어 정보처리를 위한 파이썬 라이브러리, 추후 한국어 형태소 분석에 필요한 모듈들을 사용할 계획임.
  • pandas : 데이터를 분석 조작하기 위해, 쉽게 만들어진 파이썬 라이브러리, 데이터 전처리 과정을 용이하게 진행하기 위해 활용할 계획임.

데이터와 개발 환경 셋팅이 모두 마무리되었다면, 다음 장에서 데이터 전처리를 해보자!

+ Recent posts