강의 복습 내용
- Transformer(self-attention)
- RNN기반 모델의 단점을 해결하기 위해 처음 등장
- attention연산만을 이용해 입력 문장을 학습하며 학습속도가 빠르다는 장점이있다.
얻은 지식
Transformer
- RNN구조를 걷어내고 attention에만 집중
- 기존 rnn의 attention
- 왼쪽에 나타난 정보가 오른쪽으로 점차 축적되면서 정보가 흐려진다.
- 양뱡향 rnn의 attention
- 왼쪽부터 진행된 forward,오른쪽부터 진행된 backward를 결합
- 여기서 rnn이라는 순차적으로 진행되는 과정을 제외하고 attention만 집중
long term dependency
- 단어별로 입력x가 있고, 출력 h를 나온다.
- 따로 encoder와 decoder로 나뉘지않고 자기자신을 이용해 attention을 한다
- query벡터
- 자기자신
- key벡터
- 어느 정보를 가져올지 필요한 각각의 단어의 정보
- query와 각 key들과 연산을 진행
- 연산결과들은 softmax를 통해 가중치를 구한다.
- value벡터
- softmax의 결과를 가중치로 사용한다.
-
qeury는 하나이며, key와 value벡터는 각자 쌍으로 존재한다.
- 특징
- 각 출력은 모든 입력을 고려하고 있다.
- 멀리있어도 한번에 보면서 계산을 한다.
- 멀리 있는 정보들도 rnn에서는 반복적으로 통과되면서 손실되는 한계를 개선한 모델이다.
Scaled Dot-product attenction
- 입력
- 하나의 query q
- key-value쌍 (k,v)
- 출력
- value벡터의 가중평균
- value벡터의 가중치는 query와 key의 inner product값
- query와 key는 같은 차원 d_k를 가져야한다.
- 둘은 계산이 되야하므로
- value의 차원은 달라도된다.d_v
- value는 나중에 가중치를 이용하므로
- 최종적인 결과의 차원이다.
- i번째 key로부터의 softmax를 지난 유사도를 구하는 식이 된다.
- 행렬식으로 정리
- K는 transpose되어 Q와 내적이 되도록 한다.
- Q의 하나의 가로와 K의 세로를 통해 하나의 scala값을 구한다.
- 하나의 Q에 대해 각 K마다의 연산을 진행, 하나의 row에 표현된다.
- 이 결과는 row-wise softmax로 가로를 기준으로 1이되는 확률로서의 결과를 만든다.
- 나온 softmax의 하나의 row와 모든 V에 대해 가중치로 계산이된다.
- Q와K^T가 계산된결과의 row한줄은 한단어가 각 단어마다의 가중치를 계산한다.
- 이 가중치를 V와 행렬곱을통해 V의 세로줄로 행렬곱이 되면서 해당 가중치만큼의 결과를 구할 수 있다.
- 헷갈리면 직접 그려보면 됨
- 문제점
- query와 key의 차원에 따라 분산이 커질수있다.
- 분산이 커지면 특정부분에 집중될 수 있으므로 이를 scalling해줘야한다.
- 평균은 0, 분산은1로 만드는 과정이 필요
- 이를 위해 루트 d_k로 나눠준다.
Multi-Head Attention
- 좀더 확장된 transformer
- 입력에 대해 여러 버전의 attention을 진행
- Multi-Head Attention
- attention결과를 concat한다.
- W_O를 통해 concat한결과를 출력값으로 나타낸다.
- 각 i번째 head는 Attention을 구한다.
- 이런 head가 여러개라는 소리
- 왜 사용하는지?
- 서로 다른 기준으로 여러 측면에서 정보를 가져와야 하는 경우가 생김
- 여러개의 head로부터 나온 결과 Z0~7이 나온다.
- 이들을 concat하여 하나의 행렬로 만든다.
- 원하는 행렬Z를 얻기위한 W_o를 계산한다.
복잡도로 보는 rnn,self-attention 정리
- 레이어별 복잡도
- self attention
- o(n^2d) - 각 Q마다 모든입력 n개의 K들을 연산하므로
- recurrent
- o(nd^2) - ht-1에서 ht로 진행될때 whh는 (d,d)이고 ht-1은 (d,1)이되어 계산되어 d를 d번 계산하는 방식이 된다고 한다.
- d는 hidden state의 차원으로 우리가 임의로 정해주지만 n은 입력길이다.
- self attention이 좀더 메모리를 요구한다.
- self attention
- sequentioal operations
- self attention
- o(1) - 한벙의 입력으로 바로 출력, 학습이 빠르다.
- recurrent
- o(n) - 무조건 한단어 사용되고 나서 계산이 일어나므로 병렬화가 불가능
- self attention
- Maximum path length
- self attention
- o(1) - 한번에 학습하므로 아무리 멀어도 필요한 만큼 정보를 바로 얻을 수 있다.
- recurrent
- o(n) - 맨끝의 n번째 단어는 1번째 단어를 참고하기위해서는 n번의 계산을 거친것을 통해 본다.
- self attention
Block-Based Model
- MHA를 핵심으로 하여 후처리하는 모듈?
- 입력이 V,K,Q가 들어간다.
- MHA를 수행
- resnet과 같은 residual connection을 사용하였다.
- 추가적으로 ADD & Norm을 수행한다.
- 이후 Feed Forward를 통과하고, Add & Norm을 수행
- Add는 입력과 출력을 더해준다.
- 왜 FF가 있나?(나의 생각)
- 기존의 RNN의 문제를 해결하기 위해 FeedForward에 Attention을 넣은게 Transformer
- Attention은 문장의 관계와 연관들을 알기위해 추가적으로 넣은 모듈로 생각함
Layer Normalization
- 여러 normalize가 있다.
- batch, layer, instance, group
- layer normalization은 입력에 대해 평균은 0, 분산은 1로 통계값을 바꾸는것
- 너무큰차이를 평준화하는것
- 차원이 커지면 분산이 커진다
- 2차원에서 3차원이 되면서 하나의 차원때문에 사이의 거리가 늘어나게 된다.
- layer normalization은 각 입력마다 진행을 한다.
- batch normalization은 각feature
![그림]
Positional Encoding
- 순서가 없다.
- i go home과 home go i 가 차이없이 계산된다.
- sin과 cos같은 주기를 이용하여 해당position만의 특정한값을 만들어서 사용.
- 하나의 key값과 같이 결정, 매번 다른값이 나오지않는다.
Warm-up Learning Rate Scheduler
- learning rate도 중간에 수정되면서 적절히 학습을 하도록 하는것
- 초반은 lerning rate를 적게
- 점차 learning rate를 점차 증가하다가 다시 감소하는 형태를 보인다.
High-Levl View
- Transformer의 전체적인 구조
- encoding쪽은 N번 해당 블럭을 반복적으로 진행된다.
- 이 결과물을 Decode에 사용된다.
Encoder Self Attention Visualization
- 위쪽은 입력한 단어들
- 아래는 MHA의 결과인 attention되는 것을 색으로 표현되고있다.
- row는 MHA의 head, column은 각 출력될 단어들
- 한줄씩보면 각 head가 어느 단어에 attention하는지 확인이 된다.
- 일부 head는 자기자신을 attention하기도 하는것을 본다.
- 링크
Decoder
- ground truth를 sos토큰으로 시작하여 masked MHA를 진행한다
- decoder에서 만든것은 Q로 encoder의 결과를 V와K로 입력을 하는 MHA를 진행한다.
- encoder vector중에 어느것을 사용할지를 attention하는 과정을 가진다.
- 이후 추가적인 Feed Forward를 진행한다.
Masked Self-attention
- 입력이 “SOS”, “나는”, “집에”
- 예측으로 각각 “나는”, “집에”, “간다” 가 된다.
- self attention을 통해 encoding하는 과정에서 정보의 접근 가능 여부에 관련있다.
- self attention으로 query와 key를 softmax로 계산
- 결과물은 sos일때 sos,나는,집에라는 단어 각각 얼마정도의 유사도를 가질지의 정보를 가진다.
- 하지만
- 각 단어가 나머지 모든 단어에 대해 정보를 접근이 가능하면
- sos만 주어졌을때 학습데이터로 나는,집에가 주어져야 하지만,
- 예측으로는 sos로부터 나는을 예측해야 한다.
- sos시에는 나는,집에는 접근이 안되도록 가려줘야한다고 한다.
- 현재 위치이후 나오는 결과들을 전부 0으로 하여 학습
- 현재 단어와 이전단어는 볼 수 있고, 다음 나올 단어는 보지 못하게 한다.
좀더 찾아보기
- Transformer
- masked MHA
- Positional Encoding
- sin과 cos주기가 무슨 의미인지?
- label smoothing
- cnn에서는 이미지를 일부 자르거나 붙이는 과정
- 뭘까?
피어세션 정리
- 어제 과제
- batch사이즈변경
- batch늘리는거랑 lr을 줄이는거랑 비슷한효과
- epoch증가
- criterion의 label_smoothed_cross_entropy와 label_smoothed_cross_entropy_with_alignment가 무엇인지?
- alignment로 바꾸니 성능이 올랐다. 왜 오르는지?
- batch사이즈변경
- position
- 벡터에서 특정 정보가 위치를 알기위해 상수를 더해준다고 한다.
- 위치에 맞는 값을 해줘야 한다.
- sin, cos는 계속 바뀌는것
- 이들을 조합해서 해당위치만의 특별한 값을 만들어서 사용한다는 의미라고 생각
further question
- attention은 이름 그대로 어떤 다넝의 정보를 얼마나 가져올지 알려주는 직관적인 방법처럼 보인다.
- attention을 모델의 ouput을 설명하는데에 활용할 수 있을까?
- 지금까지 설명한건 out도 같이 보면서 설명해줬기때문에
- 논문 확인해보기
실습
- MHA
- Masked MHA
과제 설명 fairseq
- fairseq 라이브러리 익숙해지기
- command-line tool를 통해 학습하는 방법 공부
- library reference에는 model로 여러 모델이 제공된다.
- 세부적인 모델조작과 데이터 처리가 어렵다.
- 모든 argument를 설명해주지 않아서 애매하다고한다.
- 기타 라이브러리
- openmnt
- huggingface
- 좀더 잘 정리되어있다고 한다.
- example을 참고해서 진행
Hyper parameter Tuning in pytorch
- model free hyperparameter
- learning rate, batch size, training epoch
- learning rate scheduler, optimizer
- weight initialization
- ealy stop strategy
- regularization
- dropout
- perturbation or noise of an input
- model
- kernel size
- layer, hidden units, embedding units 갯수
- pooling
- activation function
- 전부고려하면 엄청많음
- 기타
- accumulation step
- 한번 학습하는 batch가 적으면 학습이 잘안된다.
- 16batch, 4batch를 4accumulation성능이 다를때가 있다.
- batch-wise operation
- random seed
- 특정 seed가 있다.
- mrpc,rte,cola,sst
- number of evaluation
- accumulation step
- random search
- 랜덤하게 표현
- grid보다 좀더 좋다.
- 최적화
- grid search
- 일정한 간격으로
- learning late
- fine-grained
- grid search