[10초면 OK] 트랜스포머 딥러닝 신경망 모델 알아보기

[Must Have] 텐초의 파이토치 딥러닝 특강
골든래빗 출판사
이종민(텐초) 지음

《Must Have 텐초의 파이토치 딥러닝 특강》에서 재미있는 글을 선별해 연재해보겠습니다.

  1. 파이토치 권고 코딩 스타일
  2. 파이토치로 사인함수 근사해보기
  3. 오차 역전파에서 가중치가 업데이트되는 과정
  4. 트랜스포머 소개

4. 트랜스포머 딥러닝 신경망 모델 알아보기

CNN을 이용하면 이미지로부터 특징을 추출해 이미지를 분류하거나, 물체의 위치를 예측하는 등의 처리를 할 수 있습니다. RNN을 이용하면 순서가 있는 데이터로부터 특징을 추출해 글을 쓰거나 번역할 수 있습니다. 그런데 CNN과 RNN 둘 다, 입력의 일부분만을 보도록 설계되어 있습니다. CNN은 커널을 이용하기 때문에 이미지의 특징을 추출하는 데 국소적인 부분만 고려합니다. RNN은 시간의 흐름에 따라 점점 과거의 정보가 흐려진다는 단점이 있습니다. 이를 극복하기 위해 어텐션 메커니즘이 등장했지만 여전히 RNN 계열의 알고리즘을 사용해야 합니다.

트랜스포머(transformer)는 RNN 계열의 알고리즘 없이, 순수하게 어텐션만으로 구성된 신경망 모델입니다. 트랜스포머는 RNN 계열 알고리즘과 다르게 인코더에서 모든 단어를 동시에 고려합니다. 11장에서 다룬 어텐션 메커니즘은 인코더에서 GRU층의 은닉 상태를 사용했기 때문에 모든 단어를 동시에 처리하지 못했습니다. GRU는 각 시점의 은닉 상태를 계산할 때 과거 시점의 정보가 흐려지는 RNN 계열의 알고리즘이기 때문에 어텐션 메커니즘을 사용하더라도 동시에 단어를 고려하지는 못합니다. 11장에서 다룬 어텐션 메커니즘과 트랜스포머의 가장 큰 차이는 트랜스포머는 입력에서 순서 정보가 없다는 겁니다. RNN 계열 알고리즘과 다르게 입력이 순차적으로 들어오지 않기 때문입니다.

앞의 그림이 트랜스포머의 구조를 나타낸 그림입니다. 트랜스포머는 기계 번역 알고리즘이기 때문에 11장과 유사한 구조를 갖고 있습니다. 은 단어 임베딩층을 나타냅니다. 10장에 사용한 임베딩층과 같습니다. 는 각 단어의 위치 정보를 나타내는 위치 임베딩층입니다. 트랜스포머의 입력은 순서 정보가 없기 때문에 위치 임베딩을 이용해 각 단어의 순서에 대한 정보를 만들어줘야 합니다. 단어 임베딩과 비슷하게 각 시점마다 겹치지 않도록 밀집 표현을 지정해줍니다. 은 트랜스포머의 인코더입니다. 여기서 입력 문장의 특징을 추출합니다. 는 인코더의 출력을 디코더의 입력으로 넣어주는 부분입니다. ➎는 디코더 입력의 단어 임베딩을 나타냅니다. ➏은 디코더 입력의 위치 임베딩을 나타냅니다. ➐은 트랜스포머의 디코더입니다. 여기서 변역하고자 하는 언어의 단어를 출력합니다.

1. 트랜스포머 인코더

트랜스포머의 인코더의 구성을 살펴봅시다.

멀티헤드 셀프 어텐션(multi-head self attention)은 어텐션 머케니즘의 일종입니다. 셀프 어텐션은 자기 자신을 이용해 어텐션을 계산하는 기법입니다. 11장의 어텐션 메커니즘은 디코더의 입력과 인코더의 출력에 대한 어텐션을 계산했습니다. 이렇게 일반적인 어텐션 메커니즘은 다른 두 대상에 대해서 계산합니다. 하지만 셀프 어텐션은 자기 자신만을 이용해 어텐션 메커니즘을 수행합니다.

 

멀티헤드 셀프 어텐션은 어텐션 메커니즘을 계산할 때, 하나의 벡터로 여러 특징을 추출할 수 있게 하는 알고리즘입니다. 셀프 어텐션은 한 번에 하나의 특징을 추출합니다. 멀티 헤드 셀프 어텐션은 한 번에 여러 개의 특징을 추출하도록 벡터를
나누어 계산하는 알고리즘입니다.

앞에 나온 그림이 멀티헤드 셀프 어텐션을 계산하는 방법을 나타낸 그림입니다. 먼저 입력 텐서를 MLP층을 이용해 쿼리(query), 키(key), 밸류(value)를 계산합니다. 어텐션 메커니즘의 기본적인 골자는 쿼리와 키의 유사도를 밸류에 곱해 사용하는 겁니다. 쉽게 생각하면 쿼리는 디코더의 현재 입력, 키와 밸류는 인코더의 모든 시점의 은닉 상태입니다. 11장의 어텐션 메커니즘은 디코더의 입력과 인코더의 모든 은닉 상태의 유사도를 계산한 뒤, 인코더의 은닉 상태와 내적해 각 인코더 시점의 중요도를 구한 뒤, 그 중요도를 이용해 디코더의 출력을 결정했습니다. 트랜스포머는 훨씬 간단하게 쿼리, 키, 밸류 모두 인코더의 모든 입력 단어들이 됩니다.

쿼리, 키, 밸류를 계산했다면 다음은 각 벡터들을 균일하게 나누게 됩니다. 나누어진 벡터의 일부분을 헤드head라고 부르며, 헤드를 이용해 어텐션을 계산합니다. 쿼리, 키, 밸류를 그대로 어텐션 계산에 사용하면 한 번에 특징 하나만을 추출하지만, 여러 헤드로 나누면 한 번에 여러 특징을 추출할 수 있게 됩니다. 어텐션의 계산법은 11장과 같습니다. 쿼리와 키를 내적한 뒤, 소프트맥스 함수를 이용해 중요도를 구하고, 밸류에 곱해주면 됩니다.

앞의 그림이 어텐션을 계산할 때 가장 중요한 중요도 계산 방법입니다. 쿼리와 키를 내적한 결과를 소프트맥스 함수의 입력으로 사용해 각 단어끼리의 중요도를 얻습니다. 이 중요도를 밸류에 곱하면 어텐션 계산이 완료됩니다.

각 헤드의 어텐션 계산값을 하나로 합치면 멀티헤드 셀프 어텐션의 출력을 얻을 수 있습니다.

2. 트랜스포머 디코더

트랜스포머의 디코더는 어텐션을 두 번 계산합니다. 먼저 디코더 입력의 1 셀프 어텐션을 계산하고, 인코더 출력과 디코더 입력의 2 어텐션을 계산합니다.

앞의 그림이 트랜스포머의 디코더 구조를 나타낸 그림입니다. 먼저 디코더 입력의 셀프 어텐션을 구해야 합니다. 하지만 하나의 시점에서 앞으로 오게 될 단어를 미리 알 수는 없습니다. 따라서 현재 시점 이후의 시점은 크기가 아주 큰 음의 값을 넣어주는 것으로 소프트맥스를 계산했을 때 값이 0에 가깝게 나오도록 해서 미래의 단어는 고려하지 않도록 합니다. 이런 방식을 마스크드 멀티헤드 셀프 어텐션이라고 합니다.

앞의 그림이 마스크드 셀프 어텐션을 계산하는 방법을 나타낸 그림입니다. 일반적인 셀프 어텐션과 같습니다만, 마지막의 중요도에서 까맣게 칠해진 부분이 있습니다. 이 부분이 크기가 큰 음의 실수를 이용해 영향을 없애는 마스킹(masking)을 나타냅니다.

디코더의 셀프 어텐션 계산이 끝나면 다음은 인코더의 출력과 디코더의 어텐션을 계산합니다. 이때의 결과를 MLP층의 입력으로 넣어 디코더의 출력을 계산합니다.

이종민(텐초) 

일본 JAIST 정보과학 석사. 동경의 딥러닝 엔지니어로 Ghelia에서 B2B 인공지능 솔루션을 개발 중이다. 딥러닝의 유용함을 널리 알리고자 유튜버로  활동하고 글을 쓰고 책을 집필합니다. 쉬운 그림을 이용해 10초만에 핵심을 전달하자는 의미에서 닉네임을 텐초로 지어 활동하고 있습니다.

– SNS : www.youtube.com/c/텐초

Leave a Reply

©2020 GoldenRabbit. All rights reserved.
상호명 : 골든래빗 주식회사
(04051) 서울특별시 마포구 양화로 186, 5층 512호, 514호 (동교동, LC타워)
TEL : 0505-398-0505 / FAX : 0505-537-0505
대표이사 : 최현우
사업자등록번호 : 475-87-01581
통신판매업신고 : 2023-서울마포-2391호
master@goldenrabbit.co.kr
개인정보처리방침
배송/반품/환불/교환 안내