본 포스팅은 서울대학교 이준석 교수님의 '시각적 이해를 위한 머신러닝 (2023 spring)' 강의를 바탕으로 작성되었습니다.
모든 내용의 출처는 해당 강의에 있습니다.
Courses: http://viplab.snu.ac.kr/viplab/courses/mlvu_2023_1/index.html
Youtube: https://www.youtube.com/watch?v=NIFnKN2tWsE&list=PL0E_1UqNACXDTwuxUzCl5AeEjXBfWxCwc&index=14
Word Embedding
- 이미지 처럼 단어도 벡터로 표현될 수 있음
- d 차원의 공간 상에서 벡터로 표현
- 이에 따라 문장도 벡터로 표현 가능
Word2vec
- 대규모 코퍼스를 이용하여
- 주변 단어들로부터 현재 단어를 예측 (Common Bag of Words; CBOW) 하거나
- 현재 단어로부터 주변 단어들을 예측 (Skip-gram)
- 단어의 의미는 주변 단어들에 의해 결정됨 (어떤 단어는 특정 단어들과 더 많이 쓰임)
- 단어 벡터들이 likelihood를 최대화하도록 설계됨
- 수식은 모든 단어들에 대해(i) 주변 단어들(j)에 대한 확률을 모두 곱하는 것을 의미
GloVe
- Global Vectors
- 두 단어 임베딩이 co-occurrence 비율을 따라가도록 학습
- 표의 마지막 행을 보면, k에 어떤 단어가 오느냐에 따라 ratio 값이 달라짐
- ice를 대체하는 solid가 오면 커지고, steam을 대체하는 gas가 오면 작아짐
- water는 그 중간 정도, 아예 상관 없는 단어가 나오면 1에 가깝게
Transformers
Review: MLP, CNN and RNN
- MLP and CNN
- 입력 x를 레이블 y로 가장 잘 매핑할 수 있는 가중치를 찾는 것
- 조금 더 러프하게 표현하자면 출력은 입력의 가중합을 의미
- RNN
- RNN 또한 마찬가지로 출력은 입력의 가중합으로 표현되고 가중치를 찾는 것이 목적
Main Idea
- Assumption
- 입력 x는 서로 유기적으로 관계 있는 multiple elements로 분리될 수 있음
- 단어들로 이루어진 문장
- 프레임들로 이루어진 비디오
- 입력 x는 서로 유기적으로 관계 있는 multiple elements로 분리될 수 있음
- Self-attention
- 이렇게 분리된 요소들 간의 문맥을 파악하여 개별 요소들의 의미(표현)를 찾음
- 마찬가지로 가중합이지만, 다른 요소들의 가중합임
- Query, Key, and Value
- \( x_1, x_2, ..., x_N \)의 입력 토큰이 있을 때
- 각각의 토큰 \( x_i \)는 이전 어텐션과 달리 Query, Key, Value 모두로 변환될 수 있음
- 이때, 선형 변환을 위한 각각의 가중치 \( W_Q, W_K, W_V \)가 존재하고 이 가중치들이 학습되는 파라미터
- 또 다른 학습 파라미터 \( W_O \)가 존재하는데 이는 Attention value를 다시 토큰으로 복구하는 역할을 함
- Example1
- 각각의 토큰 \( x_i \)가 Query가 되며, 자기 자신을 포함하여 모든 토큰들을 참조함
- 그림과 같이 각각의 토큰 \( x_i \)가 또 다른 형태의 가중합으로 변환된다는 의미에서 트랜스포머라고 불림
- \( z_i = W_1V_1 + ... + W_NV_N \), 그리고 \( W_j = cos(Q_j, K_j) \)
- \( W_o \)는 Value를 다시 원래의 임베딩 공간으로 되돌리는 역할
- 결과 임베딩 \( z_1 \)은 원래의 토큰 \( x_1 \)과 여전히 가장 유사하지만 동일하지는 않음
- 자신을 표현하는 데에 있어 다른 토큰들을 활용 (contextualize)
- Example2
More Details on Transformers
Remaining Questions
- 출력은 여전히 (표현이 조금 달라진) 입력 토큰의 시퀀스인데, 이것으로 분류나 회귀와 같은 task에 어떻게 접목할 수 있는지
- 트랜스포머 모델을 어떻게 학습시켜야 하는지
- ground truth 설정은 어떻게 ?
- loss는 어디서 발생 ?
- RNN과 달리 토큰의 순서는 무시되는데 이는 어떻게 다루는지
Token Aggregation
- Average Pooling
- 가장 단순하게 모든 토큰에 평균을 취하는 방법
- 그리고 그 위에 classifier나 regressor를 붙임
- 시퀀스의 길이가 그리 길지 않거나 토큰들의 각각의 의미가 크게 차이가 나지 않는 경우에는 잘 작동함
- Classification Token
- [CLS]라고 하는 더미 역할을 하는 분류 토큰을 추가함
- 이 분류 토큰은 어떠한 입력 토큰에도 치우쳐져 있지 않기 때문에 문장 전체를 대변하는 역할을 하게 됨
- 단순 평균과 다른 이유는, 이 토큰 자체가 어텐션 매커니즘을 수행하기 때문
- 그림과 같이 분류 토큰이 변환된 \( z_0 \)에 분류기를 달 수 있고 task에 따라 나머지 토큰에도 달 수 있음
- 예를 들어, 유해 매체를 분류하는 task의 경우 개별 장면들이 중요하기 때문에 Token-level prediction 적용
Transformer: Encoder
Step 1: Input Embedding
- 입력은 동일한 크기의 벡터인 토큰들의 시퀀스
- Text: 사전 학습된 단어 임베딩
- Image: 동일한 크기의 작은 이미지 패치
- Video: 프레임 임베딩
Step 2: Contextualizing the Embeddings
- Query, Key, Value representations
- 그림과 같이 가중치를 이용해 입력(original embedding)을 Q, K, V로 변환
- Self-attention
- 모든 단어들에 대해 Q, K, V 각각 존재
- 각각의 단어들을 Q로서, K와의 연산을 통해 유사도를 구함
- 이 유사도를 가중치로서 V와 가중합
- 결과값인 attention value Z는 동일한 크기를 가지는 contextuaized된 새로운 단어
- Multi-head Self-attention
- 그림과 같이 주어진 문장에서는 대명사 it이 animal을 가리키지만, 문장이 달라지만 가리키는 단어 또한 달라질 수 있음
- 이러한 사실을 반영하여 Q, K, V로 multiple projection이 되게 하여 단어의 표현이 다양한 의미를 커버할 수 있도록 함
- 헤드의 개수는 4, 8, 12, ... 개로 사용
- multiple head에 따른 여러 개의 z들을 단순히 concatenation한 뒤에 가중치 \( W^o \)와 곱하여 원래 크기로 되돌림
- Whole Process
- 행렬 계산 → 개별 과정을 동시에 진행하는 것과 같음
- 행으로 뜯어서 살펴보면 개별 과정의 결과와 동일 (이때, Query만 분리해서 계산하는 게 편함)
- 동일 과정을 head 개수만큼 반복
- 결과 z가 다음 레이어에서 X 자리에 들어가서 새로운 입력이 됨. 레이어 개수만큼 다시 반복
Step 3: Feed-forward Layer
- Multi-head Attention을 거친 각각의 임베딩이 FC Layer를 통과함 (그게 더 성능이 좋다고 함)
- 이때, cross-token dependency 없이 각 임베딩이 개별적으로 통과
- 출력은 여전히 동일한 크기의 contextualized 토큰
- 어텐션 레이어와 FC 레이어 뒤에 Residual connection, layer normalization도 추가
- 이러한 Self-attention Block을 N번 쌓음
Positional Encoding
- i는 각 단어를 벡터로 표현했을 때 채널 인덱스
- 수식을 보면 i가 \( d_{model} \)에 가까워질 수록 사인 함수의 주기가 매우 작아짐. 즉 변동성이 거의 없음
- PE는 두 가지 목적이 있는데,
- 첫 번째는, 어떠한 두 단어도 동일한 인코딩을 갖지 않도록 함
- 이는 앞서 채널 인덱스 i에 따른 사인 함수의 주기에 변화를 주어서 구현
- 두 번째는, 인접한 두 단어끼리는 PE가 비슷하도록 함
- 문장 안에서 단어의 순서와 역할 간에 절대적인 연관성이 없다는 사실을 반영 (예를 들어, 문장이 길어지면서 주어는 더 뒤로 밀릴 수 있음)
- 이는 주기 함수(sin, cos)로서 구현
- 첫 번째는, 어떠한 두 단어도 동일한 인코딩을 갖지 않도록 함
Transformer: Decoder
Step 4: Decoder Input
- 앞서 인코더의 출력 \( Z = \{z_1, ..., z_n\} \)에 따라 디코더는 시퀀스를 auto-regressive하게 출력
- 예를 들어, 기계번역 task라면 번역된 단어들을 하나씩 생성해 나감
- Positional Encoding이 여기에서도 동일하게 적용
Step 5: Masked Multi-head Self-attention
- 'I am a student'라는 영어 문장을 '나는 학생이다'라는 한글 문장으로 번역하는 task라고 가정하면, 앞서 인코더를 통해 영어 문장이 일련의 임베딩 Z로 표현되었을 것임
- 이제 디코더는 [SOS]와 같은 시작 토큰을 받아서 '나는'이라는 단어를 예측해야 함 (정확히는 다음 단어에 대한 확률분포)
- 이 과정이 반복되면서 뒤에 올 단어들을 순차적으로 예측하며 문장을 완성
- '나는 학생'까지 예측했다면 다음 time step에 대한 정보가 없음 → 이를 masked 되어있다고 표현
- '나는 학생'이라는 문장만을 가지고 인코더와 동일하게 어텐션 수행 → Masked Multi-head Self-attention
Step 6: Encoder-Decoder Attention
- 그렇다면 뒤에 올 단어에 대한 정보가 없는 상태에서 어떻게 예측을 하는가?
- 이때 인코더로부터 Key, Value를 참조하여 Cross-attention 수행
- Query는 아래에서 올라온 자기 자신을 그대로 사용
Step 7: Feed-forward, Linear Layer
- 인코더와 동일하게 feed-forward layer 적용
- Residual, layer normalization, N stacked block도 마찬가지로 동일하게 적용
- Linear Layer를 추가하여 출력 임베딩을 class score로 매핑
Step 8: Softmax Layer
- 앞서 class score를 확률분포로 변환하기 위해 softmax를 취함
- 이 확률 분포가 1-hot-encoding된 ground truth와의 비교를 통해 loss가 계산되고 역전파가 이루어짐
- 이러한 디코딩 과정이 다음 단어를 [EOS]로 예측할 때까지 반복됨
- 가장 높은 확률을 가진 단어를 선택하는 greedy 방식, 혹은 top-k를 고려하는 beam search와 같은 방식이 사용될 수 있음
BERT
- Bidirectional Encoder Representations from Transformers
- 트랜스포머 모델의 인코더만을 사용하여 대규모 단어 임베딩을 pre-training
- Self-supervised 방식
- 오늘날 pre-trained BERT가 단어 임베딩에 거의 디폴트로 쓰임
- 입력 시퀀스는 다음과 같은 임베딩들을 합친 두 개의 문장으로 구성
- Token embedding: 사전 학습된 단어 임베딩
- [CLS]: Classification 토큰. 문장 전체를 대변하는 표현
- [SEP]: Separator 토큰. 문장의 마침표
- Segment embedding: 각 토큰이 첫 번째 문장, 두 번째 문장 둘 중 어디에 속하는지
- Position Embedding: 각 토큰의 위치
- Token embedding: 사전 학습된 단어 임베딩
- Training task 1: Masked Language Modeling (MLM)
- 그림과 같이 문맥을 보고 유추하여 문장을 완성하는 작업
- 15%의 토큰을 랜덤으로 마스킹 ([MASK]라는 토큰을 적용)
- 단어들을 가리기만 하면 되므로 매우 효율적인 self-supervised 학습 방식
- 해당 부분에 분류기를 달아서 학습
- 각 단어들의 의미를 배우기 위함
- Training task 2: Next Sentence Prediction (NSP)
- 두 문장이 연속적인지 아닌지를 판단하는 이진 분류 작업
- 학습 데이터의 절반은 실제로 연속된 문장으로, 나머지 절반은 랜덤으로 선택된 문장으로 구성
- 앞서 [CLS] 토큰에 분류기를 달아서 이진 분류를 학습시킴
- 문장과 문장 간의 관계성을 배우기 위함
- 나중에 밝혀진 사실로는 큰 의미는 없는 task이고 MLM이 훨씬 중요
'Computer Vision' 카테고리의 다른 글
[Computer Vision] Metric Learning (0) | 2024.10.01 |
---|---|
[Computer Vision] Segmentation (2) | 2024.09.30 |
[Computer Vision] Object Detection (1) | 2024.09.29 |
[Computer Vision] Transformers II (4) | 2024.09.27 |
[Computer Vision] RNN-based Video Models (3) | 2024.09.24 |