본문 바로가기

🥾 프로젝트/(STEP)파이썬을 활용한 인공지능 자연어 처리

6-1회차) 자연어 처리를 위한 Transformer 적용

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 방지를 위함