티스토리 뷰

728x90
반응형

 

 

구글 BERT의 정석

인공지능, 자연어 처리를 위한 BERT의 모든 것

 

 

 

위 책을 읽으며 정리한 내용입니다.

 

 

1장, 트랜스포머 입문

 

 

트랜스포머(transformer) : 자연어처리에서 주로 사용하는 딥러닝 아키텍처 중 하나임.
--> 순환신경망(RNN), 장단기메모리(LSTM)는 트랜스포머로 대체됨.
BERT, GPT, T5 등과 같은 다양한 자연어처리(NLP) 모델에 트랜스포머 아키텍처가 적용되었음.


RNN, LSTM은 다음단어예측, 기계번역, 텍스트생성 등에 널리 사용되었으나, 장기 의존성 문제가 있어
트랜스포머라는 아키텍처가 제안되었음.


트랜스포머는 RNN에서 사용한 순환방식을 사용하지 않고, 순수하게 어텐션만 사용한 모델임
트랜스포머는 인코더-디코더로 구성된 모델이며,
인코더에 문장(원문)을 입력하면 입력문장의 표현 방법을 학습시키고, 그 결과를 디코더로 보냄.
디코더는 인코더에서 학습한 표현결과를 입력받아 사용자가 원하는 문장을 생성함.

1. 트랜스포머 인코더 이해하기
: 인코더의 구성요소로는 "멀티 헤드 어텐션"과 "피드포워드 네트워크" 두 요소가 있음.

1-1. 멀티 헤드 어텐션
: 멀티 헤드 어텐션을 이해하려면 셀프 어텐션이 어떤 원리로 작동하는지 이해해야함

1-2. 셀프 어텐션
: 문장안에 있는 다른 모든 단어의 표현과 연결해 단어가 문장 내에서 갖는 의미를 이해함.
(ex. A dog ate the food because it was hungry 에서 "it"이 dog라는 것을 단어표현과 연결하여 이해)
 쿼리, 키, 벨류 행렬의 내적 계산을 통해 유사도(연관성)를 계산함.
  --> 문장의 각 단어가 다른 모든 단어와 얼마나 유사한지 파악하는데 도움을 줌.
   1) 쿼리 행렬과 키 행렬 간의 내적을 계산하고 유사도 값을 산출
   2) 1)에서 계산한 값을 키 행렬의 차원의 제곱근으로 나눔
   3) 스코어 행렬에 소프트맥스 함수를 적용해 정규화 작업을 진행
   4) 스코어 행렬에 벨류 행렬을 곱해 어텐션 행렬을 산출

   어텐션 결과의 정확도를 높이기 위해서는 단일 헤드 어텐션 행렬이 아닌 멀티 헤드 어텐션을 사용한 후 그 결괏값을 더하는 형태로 진행됨.

1-3. 위치 인코딩으로 위치정보 학습
: RNN처럼 단어단위로 나누어서 입력하는 순환구조를 따르지 않고, 문장안에 있는 모든 단어를 병렬 형태로 입력함. (학습시간은 줄이고, 장기 의존성 문제를 해결)
하지만 단점으로는 단어의 순서정보가 유지되지 않은 상태에서 문장의 의미를 어떻게 이해할수 있느냐는 점. 따라서 트랜스포머에 단어의 순서정보를 제공해야 함.
이를 위해 위치 인코딩이라는 새로운 방법을 활용함. 즉, 입력행렬 X에 위치인코딩 P를 더한 후 네트워크에 입력하는 형태임.

==> 문장 -> 입력임베딩 -> 위치인코딩 추가 -> 인코더블록(멀티헤드어텐션->피드포워드) -> 표현

1-4. 피드포워드 네트워크
: 2개의 전결합층(dense layer)과 ReLU 할성화 함수로 구성됨.


인코더에서 중요한 요소 중 하나는 바로 add와 norm 관련 부분임. 이 부분은 서브레이어의 입력과 출력 부분에 연결되어 있음. 
서브레이어에서 멀티헤드어텐션과 피드포워드의 입력값과 출력값을 서로 연결함.
==> 문장 -> 입력임베딩 -> 위치인코딩 추가 -> 인코더블록(멀티헤드어텐션 -> Add & norm -> 피드포워드 -> add & norm )

add와 norm 요소는 기본적으로 레이어 정규화(layer normalization)의 잔차연결(residual connection)임.
레이어 정규화는 각 레이어값이 크게 변화하는 ㄱ성르 방지해 모델을 더 빠르게 학습할 수 있게 함



2. 트랜스포머 디코더 이해하기
: 인코더의 결괏값을 가져와서 디코더에 입력값으로 사용함.
 문장 -> 인코더 -> 표현 -> 디코더 -> 최종결과값

디코더 역시 입력값을 바로 입력하는 것이 아니라, 위치 인코딩을 추가한 값을 디코더의 입력값으로 사용함.
==>  마스크된 멀티 헤드 어텐션 (어텐션 부분이 마스크된) -> 멀티 헤드 어텐션 -> 피드포워드 네트워크

앞에서 셀프어텐션은 각 단어의 의미를 이해하기 위해 각 단어와 ㅁ누장 내 전체 단어를 연결했으나, 디코더에서는 이전 단계에서 생성한 단어만 입력 문장으로 넣음.
이런 데이터의 특성을 살려 모델 학습을 진행해야 함. 따라서, 모델이 아직 예측하지 않은 오른쪽의 모든 단어를 마스킹해 학습을 진행함.
이는 셀프 어텐션에서 입력되는 단어에만 집중해 단어를 정확하게 생성하는 긍정적인 효과를 가져옴.

인코더의 표현값과 마스크된 멀티헤드어텐션의 결과로 나온 어텐션 행렬,
여기서 인코더의 결과와 디코더 결과 사이에 상호작용이 일어남. "인코더-디코더 어텐션 레이어"라고 함.

3. 선형과 소프트맥스 레이어
: 디코더가 타깃 문장에 대한 표현을 학습시키면, 최상위 디코더에서 얻은 출력값을 선형 및 소프트맥스 레이어에 전달함.
==> 디코더1 -> 디코더2 -> 선형 -> 소프트맥스

선형 레이어의 경우 그 크기가 어휘(vocab) 크기와 같은 로짓 형태임. 
소프트맥스 함수를 사용해 이 로짓값을 확률값으로 변환, 디코더에서 가장 높은 확률값을 갖는 인덱스의 단어로 출력함. 
이 확률로 디코더는 타깃 문장의 다음 단어를 예측함. --> 최종으로 예측된 단어를 얻음.


4. 트랜스포머 학습
: 손실함수(loss function)를 최소화하는 방향으로 트랜스포머 네트워크를 학습시킬 수 있음.
올바른 문장을 생성하려면 예측확률 분포와 실제 확률분포 사이의 차이를 최소화하도록 모델을 학습해야 하는데, 이때 옵티마이저는 아담(adam)을 사용함.
여기서 과적합(overfitting)을 방지하려면 각 서브레이어의 출력에 드롭아웃(dropout)을 적용하고, 임베딩 및 위치 인코딩의 합을 구할 때도 드롭아웃을 적용해야함.


다음 2장에서는 본격적으로 BERT를 다룬다.


728x90
반응형
댓글