트랜스포머를 좀 더 자세히!
차원 계산 같은 건 나중에 좀 더 깊게 공부하자! 이건 차근히 하는 게 좋을 것 같다.

[Transfomer]
encoder
input embedding
입력 임베딩
입력을 벡터로 바꿔주는 부분
ViT에서는 CNN backbone 정도로 생각하면 될 듯!?
positional encoding
위치 인코딩
RNN처럼 시퀀셜하게 데이터를 처리하지 않기 때문에 사용하는 방법이다.
다음과 같은 수식을 사용한다.
(수식은 이해 안가면 너무 깊게 보지 말기!)

input embedding + positional embedding
두 값을 서로 더해서 멀티 헤드 어텐션에 넣어준다.
질문: 두 값을 ‘더하는 이유’?
claude의 설명…
단어 "강아지"를 예로 들어보겠습니다:
입력 임베딩(의미)
Copy "강아지" = [2.1, -0.5, 1.8, ...]
- 이 벡터는 "강아지"라는 단어의 의미적 특성을 나타냅니다
- 예를 들어 "고양이"와 비슷한 부분이 있고, "자동차"와는 매우 다른 벡터가 됩니다
위치 임베딩(위치)
Copy 첫 번째 위치 = [0.1, 0.3, -0.2, ...] 두 번째 위치 = [0.2, 0.1, -0.4, ...]
- 문장에서의 위치마다 고유한 벡터값을 가집니다
두 벡터를 더하면
Copy "첫 번째 위치의 강아지" = [2.2, -0.2, 1.6, ...] "두 번째 위치의 강아지" = [2.3, -0.4, 1.4, ...]
- 같은 "강아지"라도 위치가 다르면 최종 벡터값이 달라집니다
- 이를 통해 모델은 "강아지가 뛰어간다"와 "뛰어가는 강아지"를 구분할 수 있게 됩니다
이렇게 위치에 따라 살짝 다른 벡터값을 가지게 됨으로써, 모델은 같은 단어라도 문장 내 위치에 따라 다르게 처리할 수 있게 됩니다. 마치 한글을 쓸 때 같은 글자라도 위치에 따라 약간 다르게 쓰는 것처럼요!
A: 같은 단어이더라도 위치 상 의미 다를 수 있기 때문에 사용하는 것이 positional encoding이고, 이를 통해서 같은 단어라도 위치에 따른 context을 구분을 할 수 있게 끔 사용하는 것이 positional encoding이라고 이해해 두자! → 뭐 더불어 문장 구조 또한 이해할 수 있다고 한다.


multi-head attention
다중헤드 어텐션
입력 시퀀스 내에서 단어들 관계를 학습 → seq2seq에서의 attention과 약간은 차이를 가진다. 약간 분리해서(?) 공부해 보자.
트랜스포머에서는 self-attention을 사용한다. cross-attention이라는 것도 있다. self-attention과 유사하지만, 서로 다른 이미지(혹은 문장) 사이의 관계를 찾는 것이다. → 나중에 찾아보기!
이 과정은 다음과 같다

먼저 single head attention이 어떻게 동작하는지 알아보자.
1. input들을 Q,K,V로 나눈다.
** 이 때 transfomer는 input vector를 바로 Q,K,V로 사용하지 않고, 추가 작업을 거친 후에 Q,K,V를 사용한다!! **
다중헤드 어텐션에 들어간 input들을 세 개로 쪼개진 다음 각각 N*N matrix에 곱한다. 이 때 N*N matrix는 파라미터이다. (아마 q,k,v parameter가 이 matrix를 의미하는 게 아닌가 싶다)
+ 이 때 N은 embedding 차원!
다음과 같다. 이걸 K,V에 대해서도 한다.

2. Q와 K를 행렬 곱 해준다.
행렬 곱은 로 해준다.
3. 크기를 바꿔준다.
뭐 model size에 dependency하게 크기를 바꿔준다.
다음과 같다.

4. mask → 인코더에서는 사용하지 않는 부분이다.
5. 마지막으로 softmax 함수를 취해주면 self attention이 취해진 matrix가 나오게 된다.
→ 3/4/5과정은 우선 대략적으로만 이해하자
6. 마지막으로 self attention 행렬에 V를 곱한다.
이를 통해 우리는 입력+위치+어텐션이 합쳐진 행렬을 얻을 수 있는 것이다.
다음과 같다.

multi-head attention
말 그대로 위에 과정을 여러 개 동시에 하는 것이다.
6까지의 과정을 각각 해준 다음 각 행렬들을 concat해서 완전 연결층 파라미터를 곱해서 최종 아웃풋을 낸다.
→ 즉 내가 이해한 바로는 지금까지의 부분에서 파라미터는 총 Q,K,V,완전 연결층 세 부분에서 존재한다고 이해하면 될 것 같다.
add & norm
합과 정규화 과정이다.
이건 그냥 skip-connection 단이라고 이해하면 좋을 것 같다.
다음과 같다.

이후 이 행렬을 정규화 한 다음 사용한다.
feed forward layer
피드 포워드 레이어
그냥 linear layer를 여러 개 쌓은 부분이라고 생각해도 될 것 같다.
비선형성을 위한 레이어라고 한다.
다음과 같다. (화살표 부분은 ReLU를 거치는 부분, 따라서 음수인 파랑 부분은 0이 되게 된다)
여기서는 두 개의 층을 사용해서 피드 포워드 레이어를 구성한 예시를 보여주고 있다.


decoder
first multi-head attention
멀티 헤드 어텐션 부분에서 마스킹 부분이 추가 된다.
마스크 어텐션!?
우선 트랜스포머 디코더의 목적은 출력 단어 시퀀스를 생성해 내는 것이다.
인코더에서는 입력 문장 전체의 의미를 파악해야 하기 때문에 전체 단어들의 관계를 다 파악해야 할 필요가 있었지만,
디코더에서는 출력 문장을 한 단어씩 출력하는 것이 목적이었기 때문에 아직 출력 되지 않은 단어에 attention을 줄 수 없는 것이 당연하다.

그러므로 디코더를 학습 시킬 때는 특정 단어를 기준으로 미래에 나오는 단어는 가려서 계산에 영향을 주지 않도록 한다.

이를 어텐션에 적용하면 다음과 같이 변한다.

second multi-head attention
이 때는 K,V에 인코더의 최종 아웃풋을 넣어주고, Q에 디코더 first multi head attention 아웃풋을 넣어준다.
다음과 같다.

linear
최종적으로 model의 길이만큼 압축된 vector를 선형 계층을 통해 다시 키워줌으로써 원하는 결과를 얻을 수 있도록 해준다.
다음과 같다.
