이 게시글은 서울대학교 데이터사이언스대학원 조요한 교수님의
거대언어모델과 대화형 인공지능 강의를
학습을 위해 재구성하였습니다

오늘의 내용은 BERT

지난 시간 내용에 대해서 살짝 복습해보자
지난 시간에는 트랜스포머 아키텍처에 대해서 배웠었다

그 중에서도 주로 인코더 부분에 대해서 배웠는데
트랜스포머의 인코더에서는
토큰들이 입력으로 들어가면 embedding matrix와 position matrix를 거쳐서
하나의 initial vector로 변환을 했었다
그 이후 각각의 Transformer layer에 대해서 self attention을 수행한다
multi-head attention head가 3개가 있다고 가정했을 때
Wq, Wk, Wv라는 matrix를
각 token의 query, key, value vector를 각각의 head별로 따로 구한다
그런식으로해서 contextualized 시키고 싶은 단어에 대해서
각각의 head별로 다른 단어들 간의 관련성을 계산해서
attention weight를 계산해준다
중간에 residual connection도 존재하고
각각에 대해서 layer norm도 거쳐서 학습을 안정시켰었다

오늘은 BERT에 대해서 배워보자
이런 트랜스포머같은 아키텍처들만 봤을 때는
이렇게해서 어떻게 좋은 foundation model이 만들어진다는걸까?
이걸 직관적으로 이해하는게 힘들 수 있다
이 아키텍처를 이용해서 어떤 학습을 하냐에 따라
좋은 모델이 될 수도 있고 아닐 수도 있는 것이다
그런 의미에서 BERT에서 사용한 pretraining이 이런 아키텍처를 이용해서
좋은 fundation model이 될 수 있을지 한 번 살펴보고
결과적으로 학습이 된 모델들이 어떤 좋은 특징을 갖고있는지 이해해보자


트랜스포머는 각각 인코더와 디코더 구조가 있는데
인코더만 쓰는 대표적인 모델이 BERT와
BERT의 다음 버전인 RoBERTa이다

트랜스포머의 인코더를 학습시킨 모델이 BERT이다
핵심은 pretraining 방식인데 이걸 어떻게 시켰는지가 중요하다
굉장히 큰 corpora에다가 사전학습을 시켜서
좋은 foundation model을 만든 것이다

토큰들이 입력으로 들어오는데 tokenize를 시켜서 각각의 토큰을 넣는다
한가지 특징은 그 text의 가장 앞에 cls라는 토큰을 집어넣는 것이다
이건 특별한 목적을 위해 만들어진 special token으로
이 cls token을 같이 붙여서 contextualized를 시키게 된다

pretraining 과정에서 굉장히 큰 corpus에 대해서 학습을 시킨다
텍스트를 구성하고 있는 언어의 underlying pattern과 structure를 이해할 수 있도록 만드는 것이
이 pretraining의 목적이다
따라서 이 pretraining task는 크게 2가지 task가 있는데
첫 번째는 masked language modeling이고
두 번째는 next sentence prediction이다

Masked Language Modeling은 가장 중요한 pretraining task이다
한 마디로 fill in the blank라는 task를 수행하는 것이다
예를 들어서 문장이 하나 있따고 해보자
이 텍스트에서 일부를 masking을 시킨다
이렇게 masking 된 부분이 어떤 단어였을지를 맞추는 것이다
위 ppt에서 각 토큰들이 있고 masked token의 마지막 contextualized embedding을 가지고
그걸 바탕으로 이 mask 자리에 원리 단어가 무엇이었을지를 맞추는 classification task이다
이게 classification인 이유는 정답 후보가 vocabulary에 있는 애들 중 하나이기 때문이다
학습을 시킬 때 i번쨰가 masking 된 부분이라면 저 부분의 확률을 높이는 방식으로 학습을 시킨다
vocabulary size로 projection된 벡터를 보통 logit = z이라고 부른다
여기서 p(wi)는 z라는 logit vector를 softmax를 취해서 확률분포로 만든 값이다
이런 classificaiton에서는 loss로 cross entropy loss를 사용하는데
그래서 손실함수는 -logP(wi)가 된다
결국 이 pretraining task는 저 loss 자체를 최소화하는 방향으로 학습을 시키게 된다
이게 위에서부터 쭈욱 내려가면서 graident가 업데이트되면서 학습이 된다
이걸 모든 masked token에 대해서 반복한다
그럼 이 다음에 자연스럽게 따라오는 질문이 있다
이게 왜 도움이 될까?
이렇게 하는게 왜 좋은 foundation model을 만들 수 있는 것일까?
내용을 보기 전에 우리가 한 번 생각해보자
우리도 어떤 문장이 있을 때 중간에 빈칸이 있고 그 빈칸에
들어갈 단어가 무엇인지 맞추려고하면 생각보다 복잡하다는 것을 알 수 있다

ppt에서 위 문장만 보아도
뒤에서 'she'가 나 오기 때문에 첫번째 mask에는 여성을 지칭하는 단어가 와야하고
두번째 mask를 맞추기 위해서는 앞에 suddenly가 나오기 때문에
어떤 상황이 바뀌는 단어가 들어와야한다는 것을 유추할 수 있다
이게 되게 단순한 태스크 같지만 모델 입장에서는 어려울 수 있다
따라서 이런 정보들을 잘 끌어오도록 학습을 시켜야하는 것이다

attention task가 그렇다면 뭘 배우는지 생각해보자
어떤 mask된 단어를 맞추기 위해서는
그 masked token의 hidden state는 주변의 단어들의 정보를 쭈욱 끌어아ㅗ야한다
the cat licked <mask> paw라고 하면 중간의 mask에 'its'가 와야함을 맞춰야한다
이게 그럼 cat, licked, paw 이런 단어들을 잘 알아야만
mask된 곳이 its라는 것을 알 수가 있는 것이다
그래서 주변 단어들의 정보를 attention head가 Hidden state로 쭈욱 보내준다
위 ppt에서 pronoun을 맞추려면 선행사가 무엇인지 정보를 가져와야하고
paw를 맞추려면 동사가 무엇인지에 대한 정보를 가져와야하고
preposition을 맞추려면 주어가 뭐고 목적어가 무엇인지에 대한 정보를 가져와야한다

기본적으로 주변의 문법적인 정보를 hidden state에 잘 갖고있어야 좋다
그래서 자기 자신의 정보도 잘 갖고있어야하고
주변 contextualized word들의 정보도 잘 흡수를 하도록 학습이 된다
그래서 이런 방식으로 pretraining을 시키면
attention head는 문맥에 필요한 정보들을 잘 흡수하도록 학습이 될 수밖에 없는 것이다

그래서 하나의 linguistic feature만 가지고는 제대로 예측할 수가 없다
성별, 수, 품사, semantic한 정보 등등 .. 굉장히 많은 것들을 고려해야한다
이러한 정보들을 잘 보존할 수 있어야 prediction task를 잘 수행할 수 있다
그래서 이 attention head는 한 가지 구체적인 linguistic feature들을
잘 capture 할 수 있도록 specialized하는 경향이 있다
이렇게 함으로써 결국 모델이 상황이 따라서 selective하게
이 prediction을 잘하기 위해서 linguistic feature를 사용할 수가 있는 것이다

구체적으로 그렇다면 어떤 linguistic feature들을 잡을까?
이건 9번째 레이어의 6번째 헤드를 분석한 결과이다
이 레이어의 다음 토큰이 어떤 단어에서 강한 weight를 주고 있는지 시각화 한 것이다
이런식으로 attention weight의 세기를 가지고 분석을 했더니
9번째 레이어의 6번째 head는 preposition들이 그 전치사의 목적어에
강한 attention을 주고있는 현상을 확인할 수 있었다
저 빨간선이 in, to 같은 젗니사들이 자기의 목적어에 해당하는
active, trading 이런거에 큰 attention을 주고
거기서 정보를 가져오는 것을 학습하더라는 것이다
8번째 레이어의 11번 head를 봤더니
noun modifier들이 해당되는 noun에 해당되는 큰 attention을 주고있는 것을 확인할 수가 있었다

몇 가지 예시가 더 있다고 한다
10번째는 direct obejct라고 한다

그렇다면 모든 attention head가 의미있는 학습을 진행하느냐?
그런건 또 아니다
위 ppt같은 경우는 각각의 단어가 다음 단어에게 attention을 주는 방식으로 학습을 한다
모든 head가 의미있는 언어적 특성을 학습하는 것은 아니다

BERT에다가 input으로 저 문장을 넣는다고 해보자
mask 자리에서 BERT 모델은 무언가를 예측을 해야한다
만약 사전학습이 잘 되었다고 한다면 저 자리에 apple을 예측할 것이다
그런데 이렇게 되면 이건 world knowledge를 배운 것이 된다
iPhone과 apple이 관련이 있다는 것을 배운 것이기 때문이다
그렇다면 어떻게 이 BERT 모델은 world knowledge를 학습하게 된 것일까?
그 과정을 한 번 살펴보자
이런 문장이 들어왔을 때 저 마스크 자리에 apple을 예측하려면
모델의 구조상 마지막 단의 hidden state에서 apple이라는 정보가 들어있어야한다
그렇다면 그때 사용되는 벡터는 여기저기서 정보를 받아와서 만들어진 context vector이다
그럼 그 apple이라는 정보는 과연 어떤 단어가 그 vector에 넣어주게 된 것일까?
attention을 이용해서 정보를 가져오는데 앞의 어떤 단어에서
attention weight를 가장 많이 가져왔을까?
상식적으로 생각했을 때 iPhone이라는 단어일 것이다
실제로 모델에서도 그렇게 작동을 한다
그럼 이 iPhone이라는 토큰에서 어딘가 apple이라는 정보가 hidden state에 만들어지는데
어떤 메커니즘을 통해서 이런 정보가 들어가게 되는지 봤더니
FeedForward Network의 메커니즘에서 이런 일이 발생하는 경우가 많더라는 것이다
우리가 하나의 FFN layer를 떼서 살펴보자
위 Ppt에서 input vector는 아이폰에 대한 벡터이다
이 FFN이 어떻게 작동하는지를 살펴보면
input matrix를 한 번 거쳐서 중간 벡터를 만들고
ReLU 함수를 통해서 0보다 작은 값들은 0으로 만들고 0보다 큰 값들만 남긴다
여기서 activation에 해당되는 row들만 들어가게 되는데
iPhone을 만든 곳이 apple이라는 정보가 저 안에 들어가있어서
output vector에 결과적으로 남게되더라는게 밝혀진 사실이다
그래서 그 정보가 attention을 통해서 흘러들어가게되고 거기서 apple을 예측하게 된다
그렇다면 FFN의 output vector에는 iPhone에 대한 다른 정보들도 많을 것이다
apple은 지금 iPhone을 만든 곳에 대한 정보이고 그 이외에도 많을 것인데
BERT는 다른 정보들도 다 담을 필요는 없다
지금 저 문장은 iPhone은 어디서 만들었는지에 대해서만 얘기하고 있기 때문에
해당 정보만 activate를 시킬 수가 있다
따라서 이러한 world knowlege는 FFN 안에 주로 많이 담겨있더라는게
실험적으로 밝혀진 사실이다

그렇다면 이러한 Masked Langugage Modeling이
왜 downstream task에서 유용하게 사용될까?
결국 attention head들이 무엇을 학습했냐가 중요한 것이다
앞에서 각각의 attention head들이 개별적인 speciality를 갖게 된다고 했다
이런 것들이 대부분의 NLP task에서 유용하게 작동할 수가 있다
그러고 모델이 기본적으로 world knowledge를 파라미터에 저장하고 있기 때문에
이게 다른 NLP task에서도 정보를 제공해주는 역할을 할 수가 있다
이렇게 pretraining을 잘 시켜놓으면
우리가 어떤 task가 있을 때 finetuning을 시킬 수가 있다
finetuining이라는 것은 pretraining을 통해서 학습을 해놨던 attention head는
finetuining task에 좀 더 특화되기 위해 polish를 시키는 과정이다
그 capability와 information을 조금 더 특화 시키는 과정이다
위 ppt에서 SGD, SQL, C++ 이런 개념을 잘 알고있으면
(pretraining이 잘 되어있으면)
나중에 Adam, PostgreSQL, Java와 같은 추가적인 것들을 이해하는데에 훨씬 쉬운것과 유사하다
(finetuining이 잘 된다)
그리고 MLM이 좋은 이유 중에 하나는
학습 데이터를 만들기가 너무 쉽다는 것이다
기존에 문장들을 다 가져와서 mask를 뚫기만 하면 된다
그리고 대부분의 학습 데이터들이 무료다
이러한 학습 방법을 self-supervision이라고 한다

그렇다면 BERT는 어떻게 마스킹을 시키는가?
보통 BookCorpus와 Wikipedia에서 데이터를 가져온다
학습데이터에서 모든 ㅎ학습데이터를 masked token으로 바꾸는 것은 아니다
80% 정도만 masked라는 special token으로 바꾸고
나머지 10%는 랜덤으로 다른 단어를 준 다음 정답을 맞추도록
그 나머지 10%는 masking을 하지 않고 그냥 원래 단어를 맞추도록 학습을 시킨다고 한다

그렇다면 이런 MLM과 word2vec은 어떤 관계가 있을까?
위가 트랜스포머의 encoder 구조라고 해보자
모든 단어가 모든 단어로부터 attention을 갖는 구조라고 해보자
정보가 모든 단어들로부터 위처럼 확산이 된다

이런 information flow가 존재하도록 학습이 되는데
이게 word2vec에서의 skipgram 알고리즘과 꽤 유사하다는 것을 알 수 있다

차이점이라고 한다면 MLM은 이 단어 하나만 하는게 아니고
주위 단어들도 다 contextualized를 시킨다는 점이다

이렇게 하면 CBOW 방식과 유사하다
CBOW와의 차이점은 MLM은 단어들이 자기 자신의 정보만 갖고있는게 아니고
contextualized vector를 갖고있다는 점이다
따라서 word2vec 자체가 구시대적인 아이디어가 아니고
현재 언어모델들의 근간이 되는 철학을 갖고있다는 것이다

두 번쨰 pretraining task는 next sentence prediction이다
두개의 문장을 넣어준 다음 다음 문장을 예측하는 것인데ㅐ
두 개의 문장을 구분하기 위해서 SEP라는 토큰을 넣는다
이는 binary classification task가 된다

next sentence를 예측하도록 하는 것인데
모델은 각각의 sentence의 전반적인 의미를 학습하게 되지 않을까? 했던 것이다
masked token prediction을 잘한다고해서 모든 문장의 전반적인 의미가
잘 capture 된다고는 볼 수 없었기 때문이다
그래서 next sentence prediction은 이걸 명시적으로 task로 만들어버린 것이다
그래서 이 문장의 의미가 잘 들어가야만 얘네들의 문장이 다음에 들어가는지 아닌지를 맞출 수가 있기 때문이다
training data는 2개의 문장 A, B를 둔 다음
실제로 B가 다음 문장인 것 50%
실제로 B가 다음 문장이 아닌 것 50%를 만들어서 학습시켰다
결론부터 말하면 next sentence prediction은
생각만큼 유용한 task는 아니라는 것이 후속연구에서 밝혀졌다

실제로는 우리가 앞서 배운 2가지 task를 하나의 input안에 동시에 학습시켰다
그래서 위 문장을 가지고 MLM도 next sentence prediction도 학습을 시켰다

그럼 이 next sentence prediction을 위해서는 2개의 문장이 필요한데
word embedding 단에서 같이 넣어준다
각각의 단어에 임베딩을 할 때
원래는 word embedding과 position embedding 2개만 해줬는데
BERT에서는 segment embedding도 추가해서 initial embedding에 넣어준다
semgemt는 2개의 dimension을 가진 one hot vector인데
아무튼 저 임베딩들을 같은 크기의 벡터들로 만들어주고
쟤네를 transformer layer에 넣어주면
transformer layer에서의 initial embedding 역할을 하게 된다

그래서 결론적으로 학습은 위와같이 진행이 되었다
BERT는 크게 2가지 종류가 있는데 아키텍처의 차이는 아니고
레이어 개수나 attention head, parameter 개수의 차이이다

그래서 지금까지 우리가 BERT의 사전학습을 살펴봤고
이제는 downstream task를 잠깐 살펴보자
실제로 우리가 정말로 풀고싶은 문제가 downstream task라고 할 수 있다
finetuning task라고도 부른다
이 BERT 논문에서는 여러가지 downstream task에서 좋은 성능을 보인다라는 것을 보이기 위해서
크게 4가지 부분에 대해서 설명하였다
첫 번째 task는 sentence pair classificaiton task인데
여기서 Natural Language Inference(NLI)는 NLP task에서 굉장히 중요한 task이다
기본적으로 어떤 context task(premise)가 주어지는데
그런 다음에 어떤 가설이 주어진다
그렇다면 처음 premise를 기반으로 했을 때
뒤에 나오는 가설이 사실인지 거짓인지 아니면 알 수 없는지를 맞추는 task이다
위 ppt에서의 예시같은 경우는 logically true이기 때문에
label은 entail이 된다
이 task를 위해서 BERT 모델에는 premise가 앞에 들어가고
SEP 토큰이 들어가고 뒤에 hypothesis가 들어가게 된다
BERT에서 임베딩이 들어가면 CLS의 자리에서 마지막 워드 임베딩에 class label을 달아서
이게 entail인지 contradict인지 neural인지
3개의 class 중에 하나를 예측하도록 task를 디자인한다
이렇게해서 NLI task를 finetuning 시킨다
두 번째 task로는 Single Sentence Classification Task란게 있는데
대표적인게 sentiment classificiation이다
single sentence가 들어가서 CLS에 이게 positive인지 negative인지 학습을 시키는 것이다
세 번째는 Question Answering Task이다
여기서 유명한게 SQuAD dataset이 잇는데
이 paragraph에 정답에 해당되는 span이 들어가 있다
따라서 어떤 글을 보고 문제에 대한 정답을 맞출 때
정답의 시작이 어디고 끝이 어딘지를 맞추는 task이다
이걸 BERT 모델에 집어넣을 때는 question과 paragraph 2개가 들어가서
segment1, segment2가 들어간다
어디가 정답의 시작 위치이고 어디가 끝 위치인지를 맞춰야하기 때문에
paragraph의 token embedding에 대해서 얘가 시작인지? 끝인지? 아니면 아무것도 아닌지를
맞추도록 하는 방식으로 학습을 시킨다
네번째는 Single Sentence Tagging Task이다
이 중에 하나로 NER이라는 task가 있는데
어떤 텍스트가 주어지고 named entity에 해당되는 span을 찾아내는 태스크이다
개체명이라고 하는데 이게 사람이름인지, 장소인지, 어떤 기관인지
이런것들을 Named Entity(NE)라고 한다
따라서 주어진 텍스트에 등장하는 모든 개체명을 맞추도록 하는 태스크이다

Downstream task에 대한 성능이다
기존의 SOTA 모델들이 냈던 성능과 GPT1이 냈던 성능
그리고 BERT의 2개 모델들을 파인튜닝 시킨 모델들의 성능을 비교하였다
BERT base와 BERT large를 파인튜닝 시킨 것들이
모든 task에서 가장 좋은 성능을 낸 것을 알 수 있다


tokenization을 하는 방법 중에서 BERT가 쓰는 방법은 wordpiece tokenization이다
우리가 토큰을 space로 구분하지 않는데 그 이유는
runs와 running은 사실상 유사한 단어인데
전혀 다른 단어로 학습을 해서 비효율적으로 학습할 수 있기 때문이다
오늘날 많이 사용하는 tokenization방식은 Byte Pair Encoding 방식이다

지금부터 배우는 내용은 저 밑에 있는 링크의 유튜브 영상에서 가져온 것이다
더 자세한 내용을 알고싶다면 영상을 보면 될 것 같다
위 ppt에서 여러가지 텍스트들이 있는데
우선 가장 처음으로는 이걸 캐릭터 레벨로 다 끊어버린다
hugging face라는게 있으면
h, ##u, ##g .. 이런식으로 각각의 텍스트에 대해서 끊는다
그렇게 한 다음 캐릭터 레벨에서의 set을 구한다
이게 첫 번째 vocabulariy initial set이 된다
그런데 이것만 가지고 언어모델의 토큰이라고 하기에는 부족하다

지금 이렇게 split 시켜놓은 애들을 보면 옆에서 같이 등장하는 애들을 찾을 수 있다
h, ##u 이렇게 인접해서 등장하는 애들이 있다
이런 애들에 대해서 각각의 score를 계산한다
전체 corpus에서 pair로 같이 등장하는 횟수를 계산하는데
횟수만 가지고는 판단하기가 어려울 수 있기 때문에
분모로 각 element들이 등장하는 횟수를 곱한 값을 넣어준다
그래서 각 element들이 등장하는 횟수를 상대적으로 계산할 수가 있는 것이다
위 ppt에서 예시를 보자면
h가 등장하는 횟수는4, ##u가 등장하는 횟수는 4
h와 ##u가 같이 등장하는 횟수는 4이기 때문에
4*4가 분모로 가고 분자에는 4가 들어간다

이렇게 모든 score의 token들에 대해서 pair score를 계산한다
이 중에 가장 값이 큰 pair를 뽑아서 그걸 하나로 합친다
위 예시에서는 h, ##u가 0.25로 가장 크기 때문에
한 개로 합쳐서 hu가 되게 된다
이렇게 되면 vocab 1개에 추가가 되는 것이다

이렇게 vocab에 hu가 들어갔으면 이걸 가지고 또 pair score를 계산을 해서
pair score가 가장 큰 두 element들을 합쳐준다
그래서 이걸 또 vocab으로 추가를 한다

이 과정을 계속해서 반복해서 내가 원하는 vocabulary size가 될 때까지 반복한다

그렇다면 tokenize는 어떻게 시킬까?
여기서 지금 가장 긴 토큰과 일치하는 것을 찾는다
위 예시에서는 huggingface라는 단어에서 huggi가 가장 긴 일치하는 토큰이라서
쟤를 토큰으로 적용시켜준다
그럼 남은 ngface도 동일한 방식으로 가장 긴 일치하는 토큰을 찾아서 매칭시켜준다

그럼 결과로는 이렇게 나올 수가 있다

오늘 배운 강의에 대해서 간단하게 복습해보자
오늘은 BERT를 배웠다
MLM을 이용해서 많은 언어에서의 pattern과 structure를 배우는 방식으로
pretraining을 시킬 수가 있었다
각각의 attention head는 특별한 linguistic property를 학습해서 그걸 캡처한다
FFN은 world knowledge를 저장하는 역할을 하고있었다
이렇게 사전학습이 된 모델을 특정한 task에 finetuning하는 과정을 통해서
좀 더 optimization을 시킬 수가 있다
'강의 > NLP' 카테고리의 다른 글
| [NLP] Supervised Fine-tuning (Dialogue Fine-tuning) (0) | 2026.04.05 |
|---|---|
| [NLP] Language Models - GPT2, GPT3 and Decoding Methods (0) | 2026.03.31 |
| [NLP] Language Models - GPT (0) | 2026.03.30 |
| [NLP] Language Model - Transformer (1) | 2026.03.21 |
| [NLP] Language Models - Word2vec and Seq2seq (1) | 2026.03.08 |