이 글은 어쩌다 "BERT"라는 것을
알게 되어 찾아오신 분들을 위한
최대한 쉽게 작성한 글이다.
그렇기 때문에
특정 모델의 구조 혹은 개념에 대해 깊게 알아본다거나,
코드를 분석한다거나,
수식을 풀어쓰는 등의
기술적인 어려운 부분은 모두 배제하였다.
BERT가 뭐야?
먼저 BERT라는 녀석이
어느 분야에서 사용하는 것인지 알아보자.
BERT는 자연어 처리(Natural Language Processing, 이하 NLP)라는 분야에서
사용되는 Deep Learning(이하 딥러닝) 모델이다.
여기서 자연어란,
"안녕, 나는 헬창이야!",
"Where are you from?"처럼
사람들이 일상에서 사용하는 언어를 뜻한다.
지구의 크기는 어마어마하게 크기 때문에
인간은 필연적으로 무리끼리 떨어져 살게 됐고,
그러한 뭉친 사람들끼리만의 언어가
자연적으로 생긴 것이다.
이와 반대되는 개념으로
인공어라는 것도 있는데,
말 그대로 어떠한 의도나 목적에 따라 만든
인공적인 언어이다.
예를 들면,
특정 종교에서 본인들만 사용하는 언어를 만든다거나,
J.R.R. 톨킨과 같은
유명한 판타지 작가의 작품 세계에 나오는 '엘프어' 등을 뜻한다.
NLP? 자연어처리?
컴퓨터는 굉장히 똑똑하지만, 굉장히 멍청하다.
계산 능력은 인간보다 월등히 빠르지만,
컴퓨터가 그러한 계산을 할 수 있는 환경을 만들어줘야 하고
"1 더하기 1 결과가 뭐냐"라고 직접 입력도 해주어야 한다.
그렇기 때문에 위에서 설명했던 자연어를
컴퓨터에서 뭔가 지지고 볶고 하고 싶은 사람들에 의해
만들어진 분야가 NLP이다.
요즘처럼 딥러닝이 발전하기 전에는
여러 가지 개고생 하는 방법으로
자연어를 토막 내고 처리하는 등의 방식으로
컴퓨터에 입력해 주었다고 한다.
딥러닝에 대해서도 설명하고 싶지만,
워낙 쉽게 설명해놓은 블로그들이 많기 때문에
이 글에서는 패스하겠다.
물론, 어느 정도 딥러닝에 대한 개념이 있다면
하단의 글을 더욱 이해하기 쉬울 것 같다.
그래서 BERT가 뭔데?
BERT란,
2018년 구글이 발표한
"BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding"
라는 논문에서 사용된 모델이자,
Bidirectional Encoder Representations from Transformers의 줄임말이다.
길게 풀어쓰니까 징그럽고 토할 것 같지만,
직역을 해보자면
"Transformers로부터의 양방향(Bidirectional) Encoder 표현(Representations)"이다.
?..
대체 무슨 뜻인지 지금은 알기 힘들지만,
위의 문장을 대강이나마 이해하는 것을
이 글의 최종 목표로 잡고 차근차근 하나씩 살펴보자.
Transformers?
먼저 Transformers라는 것에 대해 알아보자.
Transformer도 BERT처럼
2017년 구글이 발표한
"Attention Is All You Need"라는 논문에서 사용된
딥러닝 모델이다.
논문 이름만 보면 뭔가 멋있어 보인다,
"Attention만 있으면 된다!"
Attention?
Attention이란 "어떠한 기능을 하는 함수" 정도로 알고 넘어가자.
Attention에 대해 제대로 이해하려면
seq2seq, 인코더/디코더, RNN 등 알아야 할 단계들이 많다.
(좀 더 자세히 알아보고 싶다면 여기에 있는 글을 읽어보면 좋다)
모델?
아까부터 계속 모델, 모델 거리는데
대체 모델이 무엇일까?
비유하자면,
우리가 중고등학교 때 수학에서 배웠던 함수와 유사한데
정말 러프하게 아래와 같은 과정을 거친다.
1. 어떠한 값을 입력하면
2. 모델 내에서 여러 일들이 벌어진 후에
3. "뿅!"하고 결괏값이 나온다.
대신 이러한 결괏값을 받아보려면,
모델에게 어떠한 데이터들을
특정 방법들로 "훈련"시키는 과정이 필요하다.
마치 우리가 어렸을 때,
한국어를 듣고 말하고 쓰고 읽으며 익히는 것처럼 말이다.
하여튼, 위의 "Attention is All You Need" 논문에서 사용된
Transformer라는 모델에는
Encoder라는 부품이 존재하는데,
이 부품을 사용하여 만든 것이 BERT이다.
그럼 이제 BERT를 직역한 문장에서
"Transformers로부터의 *** Encoder ***"의 의미를
대충이라도 알게 되었다.
Bidirectional?
이제 직역 문장 중에서 남은
"*** 양방향(Bidirectional) *** 표현(Representations)"에 대해 알아보자.
지금까지 우리가 대략적으로 살펴본
NLP 관련 모델들은 학습시킬 때,
좌에서 우, 혹은 우에서 좌 방향으로
입력 데이터를 학습시켰다.
이게 무슨 말이냐..?
설명의 편의를 위해
좌에서 우 방향으로만 데이터를 학습시키는 상황을 가정하자.
"좌에서 우 방향으로 데이터를 학습시킨다"라는 말은,
모델의 입력 데이터로 들어가는 문장이 있을 때
문장 앞의 N개의 단어를 이용하여
그 뒤에 나올 단어를 예측하는 것이다.
예를 들어,
"나는 헬스를 좋아하고 그중에서도 3대 운동을 좋아한다"라는
입력 문장이 있을 때,
"헬스", "좋아하고", "3대 운동"을 통해
뒤에 올 "좋아한다"를 예측하는 것이다.
하지만 BERT에서는 이러한 좌 -> 우,
혹은 우 -> 좌의 Unidirectional(단방향)한 방법 대신
Bidirectional(양방향)하게 학습을 시키는 방식을 택했다.
그렇다면 어떻게 학습을 시켜야 Bidirectional 하게 될까?
그전에 잠깐,
딥러닝 모델의 학습 방식에 대해
아주 쉽고 추상적으로 알아보고 가자.
딥러닝 모델 학습 방식은 크게 두 가지 단계를 거친다.
Pre-training과 Fine-tuning.
(Feature-based라는 추가적인 학습 방식도 존재하지만,
가장 널리 쓰이는 방식만 알아보자)
Pre-training?
위 Transformer 파트에서
모델에 관한 개념을 설명하며
"마치 우리가 어렸을 때,
한국어를 듣고 말하고 쓰고 읽으며 익히는 것처럼 말이다."
라는 언급을 했었다.
이것에 대해 좀 더 자세히 들여다보면
Pre-training이라는 개념에 대해서도 알 수 있다.
인간은 백지와도 같은 뇌로 태어나
한국이면 한국어,
미국이면 영어,
중국이면 중국어와 같은 언어를 배우게 된다.
한국어로 예를 들면,
아기 때부터 주위 사람들이 발음하는 것을 따라 하기도 하고
부모님이 사주시는 책도 읽으면서 한국어를 "훈련"하게 된다.
이것이 바로 사람이 언어를 배우는 과정에서의 Pre-training이라고 할 수 있으며,
모델이 언어를 배우는 과정도 이와 유사하다.
아무것도 모르는 백지와도 같은 모델에게는
많은 양의 언어 데이터를 입력 데이터로 Pre-training 시킨다.
(보통 Pre-training을 하기 위해서는 대량의 데이터가 필요하다)
이러한 Pre-training 과정을 거쳐
사람과 모델은 한국어를 어설프게나마 알아듣고
말할 수 있는 능력이 생긴다.
Fine-tuning?
위 Pre-training 파트에서 들었던 예시를 다시 사용하자.
사람은 한국어를 배운 후,
다양한 곳에서 사용한다.
예를 들어,
수능 국어 영역을 생각해보자.
평소 사람들과 대화할 정도로만 한국어를 알던 학생이
고등학교에 진학하여 수능을 준비하게 되었고,
매일 읽고 쓰고 말하고 듣던 한국어지만,
마치 외계어처럼 느껴지는
수능 국어의 비문학, 문학 등을 공부하게 된다.
이 단계가 바로 언어를 배운 사람이
그 언어를 이용하여 다른 task(일)를 할 수 있도록
다시 한번 배우게 되는 Fine-tuning이다.
이제 다시 딥러닝 모델의 경우를 생각해보자.
사람처럼 언어를 배운 모델도
다양한 곳에서 사용하게 될 것이다.
예를 들면,
모델에게 어떠한 질문을 했을 때 답을 하거나(QA),
입력한 수많은 문장들을 카테고리 별로 나눈다거나(Classification),
어떠한 글과 그 글에서 답변을 찾을 수 있는 질문을 입력했을 때
올바르게 답을 하는지(MRC) 등이 존재한다.
(Fine-tuning을 할 때는 Pre-training을 할 때처럼
많은 양의 데이터가 필요하지 않다)
BERT의 Bidirectional 한 훈련 방법
모델의 훈련 방법들에 대해 배웠으니
다시 원래의 목적으로 돌아와,
"어떻게 학습을 시켜야 Bidirectional 하게 될 것인가"하는
궁금증을 해결해보자.
사실 BERT는 이미 Pre-training이 수행되어 나온 모델이다.
구글이 대량의 Wikipedia 데이터를 이용하여
BERT를 Pre-training 했고,
사람들은 그러한 BERT 모델을 각자의 목적에 맞게
더욱 Pre-training 시키거나 Fine-tuning을 한다.
여기서 우리의 궁금증을 해결할 수 있는데,
기존의 좌->우, 우->좌 방식이 아닌
아래의 구글이 만든
Next Sentence Prediction(NSP) 방식과
Masked Language Model(MLM) 방식으로
Bidirectional 하게 학습시킬 수 있다.
이 글에서는 특정 개념에 대해
깊게 들어가지 않기로 했으므로,
아주 간단하게만 알고 넘어가자.
Next Sentence Prediction(NSP)
NSP는 두 개의 문장을 입력 데이터로 넣고
해당 문장들이 이어지는 문장인지 맞추도록
훈련시키는 것이다.
실제로 잘 이어지는 두 문장을 넣거나
랜덤 하게 추출된 두 문장을 50:50의 비율로 넣어
BERT가 맞추게 시킨다.
예를 들면,
"나는 헬스를 좋아한다."와
"당신은 고양이를 싫어하시는군요."라는
랜덤하게 추출된 두 문장이 있을 때,
BERT는 "두 문장은 이어지지 않는다!"라고
예측해야 되는 것이다.
Masked Language Model(MLM)
MLM은 입력 데이터 문장 중 일부분을
"<MASK>"라는 것으로 바꿔버려
학습시키는 방법이다.
예를 들어,
"나는 운동을 좋아한다.
특히 헬스를 좋아하는데 몸이 커질 수 있고
3대 운동도 재밌기 때문이다."라는 문장을 가정하자.
여기서 "헬스"라는 단어를 <MASK>로 바꾸어
입력 데이터를 만들고,
모델은 <MASK>에 어떤 단어가 들어갈 것인지
유추해내는 것이다.
이러한 MLM 학습 방식에서
모델은 기존의 방법처럼
단지 앞의 N개의 단어를 통해 유추하는 것이 아니라,
입력 문장 전체를 둘러보며 알아낸다.
위와 같은 방식을 통해
BERT는 Bidirectional 하게
학습을 진행하여 표현해낸다는 것을 알 수 있다.
이제 우리는
"*** 양방향(Bidirectional) *** 표현(Representations)"에 대해서도 알게 되었고,
우리의 최종 목표였던
"Transformers로부터 양방향(Bidirectional) Encoder 표현(Representations)"라는 문장이
어떤 뜻을 내포하고 있는지 어느 정도 알게 되었다.
작성하고 보니 꽤 긴 글이 되었다.
이 글을 쓰게 된 이유는,
NLP라는 분야에 거의 아는 것이 없었던 내가
이 분야에서 가장 유명하고 널리 쓰이는 BERT를
AI 스타트업의 인턴으로 근무하며
실제로 사용해야 하는 상황이 생겼는데,
대부분의 블로그들이
BERT 논문을 하나하나 분석해가며
모델의 구조를 파헤치거나
어려운 수식들을 써놓아
이해하는데 굉장히 큰 어려움을 겪었기 때문에
나 같은 사람들을 위해
아주 추상적인 개념을 먼저 이해할 수 있도록
작성하게 되었다.
나도 BERT에 대해 아주 자세히 공부한 것은 아니라
틀린 부분이 있을 수 있다.
그렇기에 이 글을 통해
BERT에 대한 대략적인 감만 익힌 다음,
다른 훌륭한 블로그의 글들을 보며
교차 검증하길 바란다.
끝!
'Study > ETC' 카테고리의 다른 글
[ETC][일상][배포] 인생 첫 배포 후기 (0) | 2021.01.06 |
---|---|
[ETC][일상][세미나] 2020 우아한 테크 콘서트 후기 (0) | 2020.12.21 |
[ETC] 매개변수(파라미터, Parameter), 인수(아규먼트, Argument) 차이 (0) | 2020.11.30 |
[ETC] *nix 란? (0) | 2020.11.23 |
[ETC] Framework와 Library 차이 (0) | 2020.07.16 |