1. Attention과Transformer 구현
1) Self-Attention과 Transformer
(1) Transformer Block 내부 구조
(2) Query, Key, Value 계산
2) Self-Attention 구현
- 각 글자(It's / a / grat / movie) 입력 값에 대해서 곱 연산 시행
- Q,K,V 대한 weight를 각 각 input 값에 곱 연산 시행
- 그 결과를 K,Q,V
(1) Query, Key, Value 계산
- WQ/WK/WV를 input 사이즈에 곱함
- transpose를 통해 변환
- contiquous함수를 통해 실제 연산을 실시.
- Query와 Key 가 커진다는 의미는 Query와 Key 벡터 공간에서 유사한 위치(가까운 위치)에 있다.
(2) Self-Attention의 계산
- bmm : 앞 배치 사이즈 만큼, 내적 연산을 한다.
- 추가 연산 실시(나눗셈)
- 왜 벡터 크기 루트를 씌우는 이유 : 쿼리와 키워 내적 행렬의 분산을 축소 / 기울기 손실 방지
- 이를 통해서 우리가 얻고자 하는 attention value 값을 얻을 수 있음.
- 위의 연산을 그림으로 정리.
- 쿼리에 키의transpose한 값을 곱해서, dot product을 계산.
- 키의 Dimension(64)의 루트를 씌어서 8
- 위의 값에 softmax을 적용
- 그 값에 Value를 곱해서, attention value를 계산다.
- 맨 아래 수식처럼 정리가 된다.
3) Transformer 구현
(1) Self-Attention 추가
- transformer 를 구현 시, self Attention 부분을 공부 함.
- SelfAttemtion 함수 정의
- 파라미터로는 dimension과 heads(self Attention의 head를 몇개 사용할지)
- self attention 추가
- 그 다음 단계는 layer norm 추가
- 주의깊게 봐야할 부분은 skip conntion(빨강색)
> 최초의 입력값 그대로를 layer norm 앞부분에 추가 함
> Self Attention의 결과 인, Attention value와 최초의 입력값 그대로 인 concat 하는 과정이 존재
> 이게 바로 residual network(skip connection)
- layer norm 추가
- forward 함수에 추가 함.
- x_prime + x : attention value 과 x(입력값 그대로)
> x_prime : attention value / self attention 의 연산 값
> x : 입력값
> + : residual network(skip connection) 한다는 의미
- 최근에 switch transformer 등장
-FFNN 파라미터가 많아서 연산 시간이 오래 걸림.
- 이 부분을 expert (전문가) 개념을 적용
> 파라미터 수를 줄이고, 속도 증가
- nn.Sequential : 순차적인 layer 추가
- Linear layer : FFNN 추가
- 활성화 함수 : 렐루
- 또 다시 Linear layer -> FFNN 추가
- 이를 통해서 FFNN 구현 (self.ff 에 저장)
- forward 함수에서 self.ff를 추가.
- 다음 단계는 layer Norm 추가
- overftting 방지를 위함
'🥾 프로젝트 > (STEP)파이썬을 활용한 인공지능 자연어 처리' 카테고리의 다른 글
7-1회차) 자연어 처리를 위한 BERT 모델 (0) | 2023.05.13 |
---|---|
6-2회차) 자연어 처리를 위한 Transformer 적용 (0) | 2023.05.11 |
5-2회차) 자연어 처리를 위한 RNN (0) | 2023.05.07 |
5-1회차) 자연어 처리를 위한 RNN (0) | 2023.05.07 |
4-3회차) 자연어 처리를 위한 토픽 모델링 (0) | 2023.05.04 |