GN⁺: 트랜스포머 작동 원리 해설: 그 뒤에 숨은 수학 이해
(osanseviero.github.io)Encoder
- 텍스트를 벡터로 변환하는 과정과 이를 통해 얻은 임베딩에 위치 정보를 추가하는 과정을 설명함.
- 입력 텍스트의 의미 정보를 포착하는 임베딩을 생성하는 것이 목표임.
1. 텍스트 임베딩
- "Hello World"를 벡터로 변환하여 임베딩을 생성함.
- 각 토큰에 대해 임의의 값을 할당하여 벡터를 생성함.
2. 위치 인코딩
- 임베딩에 단어의 위치 정보를 추가하기 위해 위치 인코딩을 더함.
- 고정된 벡터를 사용하여 각 위치에 고유하면서 일관된 패턴의 숫자를 할당함.
3. 위치 인코딩과 임베딩의 결합
- 위치 인코딩과 임베딩을 더하여 인코더의 입력으로 사용할 새로운 행렬을 생성함.
Self-attention
- 모델이 입력의 특정 부분에 집중할 수 있게 하는 메커니즘인 어텐션을 설명함.
- 다중 헤드 어텐션을 사용하여 다양한 표현 공간에서 정보에 동시에 집중할 수 있음.
4.1 행렬 정의
- 각 어텐션 헤드에 대한 K, V, Q 행렬을 정의함.
4.2 키, 쿼리, 값 계산
- 입력 임베딩과 가중치 행렬을 곱하여 키, 쿼리, 값 행렬을 계산함.
4.3 어텐션 계산
- 쿼리와 각 키 벡터의 내적을 계산하고, 결과를 키 벡터의 차원의 제곱근으로 나눔.
- 소프트맥스 함수를 적용하여 어텐션 가중치를 얻음.
- 각 값 벡터에 어텐션 가중치를 곱함.
Feed-forward layer
- 인코더에는 자기 주의 레이어 다음에 피드포워드 신경망이 있음.
- 이 신경망은 두 개의 선형 변환과 ReLU 활성화 함수를 사용함.
5.1 기본 피드포워드 레이어
- 첫 번째 선형 레이어는 입력의 차원을 확장하고, ReLU 활성화 함수를 적용한 후, 두 번째 선형 레이어가 차원을 원래대로 축소함.
5.2 인코더의 모든 과정 결합
- 다중 헤드 어텐션과 피드포워드 레이어를 포함하는 인코더 블록을 코드로 작성함.
5.3 잔차 연결과 레이어 정규화
- 잔차 연결은 레이어의 입력을 출력에 더하는 것이며, 레이어 정규화는 레이어의 입력을 정규화하는 기술임.
GN⁺의 의견
- 이 글은 트랜스포머 모델의 수학적 이해를 돕기 위해 복잡한 수학을 단순화하여 설명함.
- 특히, 자기 주의 메커니즘과 피드포워드 신경망의 작동 원리를 이해하는 데 도움이 됨.
- 잔차 연결과 레이어 정규화 같은 기술이 신경망의 안정성과 성능에 어떻게 기여하는지를 보여줌으로써, 심층 신경망의 학습 문제를 해결하는 방법에 대한 통찰을 제공함.
Hacker News 의견
-
트랜스포머의 "미스터리"는 각 레이어에서 정적 가중치와 값의 선형 시퀀스 대신, 동일한 입력에서 학습된 가중치의 곱셈을 통해 얻은 3개의 다른 행렬을 사용하고, 이 행렬들을 서로 곱하는 것임. 이는 병렬 처리를 더 많이 가능하게 하지만, 주의(attention) 공식이 정적이기 때문에 매우 제한적임.
- 계산 그래프를 학습 가능한 매개변수로 일반화할 수 있는 방법이 나오기 전까지는 더 이상의 진전을 보기 어려움.
- 기존의 기울기 방식으로는 작은 변화가 성능에 큰 변동을 일으키는 혼돈 효과 때문에 전통적인 의미에서 가능한지 확실하지 않음.
- 아마도 유전 알고리즘 또는 PSO와 같은 형태가 내부적으로 일어나야 할 것임.
-
더 건조하고 공식적이며 간결한 접근을 원한다면, John Thickstun의 "The Transformer Model in Equations"을 참조하면 됨. 전체 내용이 표준 수학 표기법을 사용하여 단 한 페이지에 들어감.
-
글을 읽다 보면 질문이 생김.
- "Hello"와 "World"에 대응하는 벡터가 무작위로 보이지만 패턴이 있는 것처럼 보임.
- 벡터에서 2가 중복되는 것이 의미가 있는지, 아니면 전체 세트가 고유한 것인지 궁금함.
-
트랜스포머가 단순히 "다음 토큰 예측기"로 작동하면서도 훈련 데이터셋에 없는 단어나 서브워드/토큰을 처리할 수 있는 이유에 대한 논문이나 기사를 찾고 싶음.
- 예를 들어, pandas에서 "sdsfs_ff", "fsdf_value"라는 열을 가진 테이블을 생성하는 경우나 훈련 데이터셋에 없는 예제를 만들고 LLM에 유사한 출력을 요청하는 경우.
- 위치 임베딩에 대한 토론이 담긴 링크도 있으면 좋겠음. 사인/코사인의 사용과 (곱셈 대 비교)에 대한 만족스러운 답을 얻지 못함.
-
트랜스포머 튜토리얼은 새로운 모나드 튜토리얼일 수 있음. 이해하기 어려운 개념이지만, 컴퓨터 과학의 많은 부분처럼 이해하기 위해 고군분투하고 예제를 연습해야 함.
-
일부 단어들을 알고 있음.
-
TensorFlow를 사용하지 않고 스크래치부터 ANN을 작성한 경험이 있는 사람으로서, 이 설명이 여전히 혼란스러움.
- ChatGPT에게 행렬이나 벡터라는 용어를 사용하지 않고 기본 ANN을 수정하여 자기 주의(self-attention)를 구현하는 방법을 설명해달라고 요청했을 때, 정말 간단한 설명을 해줌.
- 노드, 가중치, 레이어 측면에서 모든 것을 생각하는 것을 선호함. 행렬과 벡터는 ANN에서 무슨 일이 일어나고 있는지를 관련시키기 어렵게 만듦.
- ANN을 작성하는 데 익숙한 방식은 각 입력 노드가 스칼라이지만, feed forward 알고리즘이 벡터-행렬 곱셈처럼 보이는데, 이는 모든 입력 노드를 가중치에 곱한 다음 합산하기 때문임.
-
Quarto 웹사이트가 마음에 듦. 더 많은 파이썬 사용자들이 출판을 위해 Quarto를 사용하는 것을 보임.
-
디코더의 7단계에서
Z_encoder_decoder = layer_norm(Z_encoder_decoder + Z)
대신Z_encoder_decoder = layer_norm(Z_encoder_decoder + Z_self_attention)
이 되어야 하는지, 그리고 디코더의 8단계에서 layer_norm이 누락되었는지 궁금함. -
LLM이 신경망을 사용하는지, 그리고 "뉴런"을 구성하는 것이 무엇인지 궁금함. 즉, 뉴런을 뒷받침하는 코드 구조가 있는지, 아니면 "그저" 복잡한 수학일 뿐인지 의문임.