뮤트 개발일지

AIFFEL 아이펠 33일차 본문

AIFFEL

AIFFEL 아이펠 33일차

박뮤트 2022. 2. 17. 12:28

트랜스포머로 만드는 대화형 챗봇

트랜스포머 모델은 RNN과 비슷하지만, 임베딩벡터 다음에 포지셔널 임코딩을 더해준 것이 다르다. 트랜스포머는 RNN과 달리 문장의 모든 단어를 한번에 입력으로 받기 때문에 어순을 알려주기 위해 포지셔널 인코딩이 필요한 것이다. 즉, 단어의 임베딩 벡터에 위치 정보를 가진 벡터(Positional Encoding)값을 더해서 모델의 입력으로 삼는 것이다.

 

어텐션

어텐션 함수는 주어진 쿼지Query에 대해서 모든 키Key와의 유사도를 각각 구한다. 그리고 구한 유사도를 키와 맵핑되어있는 각각의 값Value에 반영한다. 반영된 값을 모두 더한 것이 최종 결과인 어텐션 값이된다.

=> 쿼리, 키, 값은 단어 정보를 함축한 벡터이다.(초기 입력으로 사용된 임베딩 벡터가 아닌, 트랜스포머의 여러 연산을 거친 후의 단어 벡터이다.)

트랜스포머 모델은 3개의 어텐션을 사용한다.

1. 인코더 셀프 어텐션: 인코더에서 이뤄진다. 인코더의 입력으로 들어간 문장 내 단어들이 서로 유사도를 구한다.

2. 디코더 셀프 어텐션: 디코더에서 이뤄진다. 단어를 1개씩 생성하는 디코더가 이미 생성된 앞 단어들과의 유사도를 구한다.

3. 인코더-디코더 어텐션: 디코더에서 이뤄진다. 디코더가 잘 예측하기 위해서 인코더에 입력된 단어들과 유사도를 구한다.

 

셀프 어텐션: 유사도를 구하는 대상이 다른 문장의 단어가 아니라 현재 문장 내의 단어들이 서로 유사도를 구하는 경우를 말한다.

 

스케일드 닷 프로덕트 어텐션

1. Q, K, V는 단어 벡터를 행으로 하는 문장 행렬이다.

2. 벡터의 내적(dot product)은 벡터의 유사도를 의미한다.

3. 특정 값을 분모로 사용하는 것은 값의 크기를 조절하는 스케일링을 위함이다.

스케일드 닷 프로덕트 어텐션: 내적을 통해 단어 벡터 간 유사도를 구한 후, 특정 값을 분모로 나눠주는 방식으로 Q, K의 유사도를 구한다.

닷 프로덕트 어텐션: 분모에 특정 값을 나눠주는 부분을 사용하지 않은 것

 

병렬로 어텐션 수행하기

num_heads: 병렬적으로 몇 개의 어텐션 연산을 수행할지 결정하는 하이퍼파라미터

d_model: 임베딩 벡터의 차원

트랜스포머의 초기 입력인 문장 행렬은 문장의 길이를 행으로, d_model을 열의 크기로 가진다.

트랜스포머는 이렇게 입력된 문장 행렬을 num_heads의 수만큼 쪼개서 어텐션을 수행하고, 얻은 num_heads의 개수만큼의 어텐션 값 행렬을 다시 하나로 이어준다.(concatenate

 

멀티-헤드 어텐션: 어텐션을 병렬로 수행하는 것

 

마스킹

특정 값들을 가려서 실제 연산에 방해가 되지 않도록 하는 기법

1. 패딩 마스킹(Padding masking)

패딩: 문장의 길이가 서로 다를 때, 정해진 길이보다 짧은 문장의 경우 숫자 0을 넣어 문장의 길이를 맞춰주는 자연어 전처리 방법

패딩 마스킹: 패딩으로 만들어진 숫자0은 의미가 있는 단어가 아니므로 실제 어텐션과 같은 연산에서는 제외해야한다. 패딩 마스킹은 이를 위해 숫자 0인 위치를 체크한다.

2. 룩 어헤드 마스킹(Look-ahead masking)

이전 단어들로부터 다음 단어를 예측하는 훈련을 제대로 하기 위해, 자신보다 다음에 나올 단어를 참고하지 않도록 가리는 기법. 이 기법은 어텐션을 수행할 때, Query 단어 뒤에 나오는 Key 단어들에 대해서 마스킹한다.

 

인코더

 

http://jalammar.github.io/illustrated-transformer/

두 개의 서브 층sublayer으로 되어 있다.

1. 셀프 어텐션(멀티-헤드 어텐션으로 병렬적으로 이뤄짐), 2. 피드 포워드 신경망

이렇게 구현한 인코더 층을 임베딩층과 포지셔넝 인코딩을 연결하고, 사용자가 원하는 만큼 인코더 층을 쌓음으로써 트랜스포머의 인코더가 완성된다. 인코더와 디코더 내부에는 각 서브층 이후에 훈련을 돕는 Layer Normalization이 사용된다. 하이퍼 파라미터인 num_layers 개수의 인코더 층을 쌓는다.

 

디코더

 

http://jalammar.github.io/illustrated-transformer/

3개의 층으로 되어있다.

1. 셀프 어텐션, 2. 인코더-디코더 어텐션, 3. 피드 포워드 신경망

디코더의 층도 임베딩층과 포지셔널 인코딩을 연경하고, 사용자가 원하는 만큼 디코더 층을 쌓아 트랜스포머의 디코더를 완성시킨다. 인코더와 마찬가지로 num_layers개수의 층을 쌓는다.

'AIFFEL' 카테고리의 다른 글

AIFFEL 아이펠 35일차  (0) 2022.02.18
AIFFEL 아이펠 34일차  (0) 2022.02.17
AIFFEL 아이펠 32일차  (0) 2022.02.16
AIFFEL 아이펠 31일차  (0) 2022.02.16
AIFFEL 아이펠 30일차  (0) 2022.02.11