NLP 공부: WikiDocs 딥 러닝을 이용한 자연어 처리 입문 16. Transformer

syi07030·2022년 5월 30일
1

ML

목록 보기
9/9

내용 및 사진 출처: WikiDocs 딥러닝을 이용한 자연어 처리 입문(https://wikidocs.net/book/2155)

  1. 기존의 seq2seq 모델의 한계
  • seq2seq 모델: encoder(입력 시퀀스를 하나의 벡터로 압축)-decoder 구조(압축된 벡터를 통해서 출력 시퀀스 생성)
  • 입력 시퀀스의 정보가 일부 손실 -> 해결책으로 attention 등장
  • 이 때, attention을 RNN의 보정을 위한 용도가 아닌 attention만으로 encoder&decoder를 생성하면?
  1. Transformer의 주요 하이퍼파라미터
  • d_model: Transformer의 인코더와 디코더에서의 정해진 입력과 출력의 크기 의미, 임베딩 벡터의 차원, 각 인코더와 디코더가 다음 층의 인코더와 디코더로 값을 보낼 때도 이 차원 유지
  • num_layers: 인코더와 디코더가 각 몇 층으로 구성되어있는지
  • num_heads: Transformer에서는 어텐션을 사용할 때, 한 번 하는 것보다 여러 개로 분할해서 병렬로 어텐션 수행, 결과값을 다시 하나로 합치는 방식, 이 때의 병렬 개수
  •  d_ff: Transformer 내부의 피드 포워드 신경망의 은닉층 크기, 피드포워드 신경망의 입력층과 출력층의 크기는 d_model
  1. Transformer
  • RNN 사용 X, 인코더-디코더 구조 유지
  1. Positional Encoding
  • Transformer의 입력: Embedding + Positional Encoding
  • 기존의 RNN에서는 단어의 위치에 따라 순차적으로 입려받아서 처리하기 때문에 단어의 위치정보를 가질 수 O
  • Transformer에서는 단어 입력을 순차적으로 받는 방식이 아니므로 각 단어의 Embedding vector에 위치 정보들을 더하여 모델의 입력으로 사용
    - 임베딩 벡터 내의 각 차원의 인덱스가 짝수일 경우에는 사인 함수, 홀수인 경우에는 코사인 함수를 사용하여 해당 계산값을 임베딩 벡터에 더해준다
  1. Attention
  • Transformer에서 사용하는 세 가지 어텐션, Encoder self-attention, Masked decoder self-attention, Encoder-decoder attention

    *self-attention: query, key, value 벡터 출처가 동일
  1. Encoder
  2. Encoder Self-attention
    1) self-attention의 의미와 이점: query에 대해서 모든 key와의 유사도를 구해야하는데 기본 attention에서는 가중치로 하여 key와 매핑되어 있는 각 value에 반영하고 모두 가중합하여 attention value를 리턴하는 반면 self-attention은 어텐션을 자기 자신에게 수행하기 대문에 Q,K,V 모두 입력 문장의 모든 단어 벡터들로 동일
    2) Q,K,V 벡터 얻기: d_model 차원을 갖는 인코더의 초기 입력 단어 벡터들로부터 더 작은 차원(d_model/num_heads)의 벡터들을 얻는다
    3) Scaled dot-product Attention: attention score를 softmax 계층에 통과시키고 그 값과 V 벡터를 곱한 값들을 더하여 attention value인 최종 맥락 벡터 c를 얻는다 

    4) 행렬 연산으로 일괄 처리
    5) scaled dot-product attention 구현하기
    6) Multi-head Attention: 한 번의 어텐션보다 여러 번의 어텐션을 병렬로 수행하는 것이 효과적, 이 때 각각의 어텐션 값 행렬을 어텐션 헤드로, Q,K,V에 대한 가중치 행렬들은 어텐션 헤드마다 전부 다름, 어텐션 병렬로 수행하여 다른 시각으로 정보를 수집할 수 있는 효과, 병렬 어텐션 수행 완료 후 어텐션 헤드 모두 연결
    7) Multi-head attention 구현하기
    8) Padding Mask: 입력 문장에 토큰이 있을 경우 어텐션에서 사실상 제외하기 위한 연산, 이에 대해서는 유사도를 구하지 않도록 Masking
  3. Position-wise FFNN(인코더의 두 번째 서브층)
  • 인코더와 디코더에서 공통적으로 가지고 있는 서브층
  • Fully-connected FFNN
  1. Residual connection & Layer Normalization
    1) Residual connection: skip 연결, short cut과 동일, 손실되는 데이터 방지 효과, 서브층의 입력과 출력을 더하는 것
    2) Layer Normalization: 텐서의 마지막 차원에 대해서 평균과 분산을 구하고 이를 가지고 수식을 통해 값을 정규화하여 학습을 도움
  2. 인코더 구현하기: 멀티 헤드 어텐션 서브층 & 피드 포워드 시경망 서브층 -> 드롭 아웃&잔차 연결&층 정규화
  3. 인코더 쌓기: 인코더 층을 num_layers 개만큼 쌓고 마지막 인코더 층에서 얻은 (seq_len,d_model) 크기의 행렬을 디코더로 보내줌
  4. 인코더에서 디코더로: 디코더 또한 num_layers만큼 연산, 이 때마다 인코더가 보낸 출력을 각 디코더 층 연상에서 사용
  5. 디코더의 첫번째 서브층: 셀프 어텐션과 룩-어헤드 마스크
    - 트랜스포커 또한 seq2seq와 마찬가지로 teacher forcing을 사용하여 훈련된다
  • 디코더는 입력받은 문장 행렬로부터 각 시점의 단어를 예측하도록 훈력
  • 한번에 입력 문장이 입력되므로 현재 시점의 단어를 예측하고자 할 때 입력 문장 행렬로부터 미래 시점의 단어까지 참고 가능
    -> 현재 시점의 예측보다 미래의 단어들을 참고하지 못하도록 look-ahead mask 도입
  • 이 때 look-ahead mask한다고 해서 패딩 마스크가 불필요한 건 X
  1. 디코더의 두번째 서브층: 인코더-디코더 어텐션
  • Multi-head, self-attention X(query-디코더, key/value-인코더)
  1. 디코더 구현하기: 총 3개의 서브층으로 구성, 첫번째, 두번째 서브층은 멀티 헤드 어텐션, 세 개의 서브층 모두 서브층 연산 후 드롭 아웃, 잔차 연결, 층 정규화 수행
  2. 디코더 쌓기: num_layers 만큼 쌓기
  3. transformer 구현하기
  • 인코더의 출력은 디코더의 인코더-디코더 어텐션에서 사용되기 위해 디코더로 전달
  • 디코더 끝단에는 다중 클래스 분류 문제를 풀 수 있도록 vocab-size만큼의 뉴런을 갖는 출력층 추가
  1. transformer 하이퍼파라미터 정하기
  2. 손실 함수 정의하기
  3. 학습률
  • Learning rate Scheduler: 미리 학습 일정을 정해두고 그 일정에 따라 학습률이 조정되는 방법
  • Transformer 경우, 사용자가 정한 단계까지는 학습률 증가, 일정 단계에 이르면 학습률을 점차적으로 떨어뜨리는 방식
profile
잭과 근나물

0개의 댓글