Word Embedding
워드 임베딩은 단어를 벡터로 다루는 것입니다. 컴퓨터는 모든 거를 숫자로 다루어야 합니다. 픽셀 값 전부 RGB를 읽어서 처리해왔습니다. 각 클래스 또한 벡터로 나타냅니다. 벡터에서 하나만 핫 상태가 되는 원핫인코딩을 사용합니다.
원핫인코딩
CAT [1,0] DOG[0,1] 전체를 0 , 1 숫자로 표현해서 나누기
단어들을 벡터 상에 표현을 해야 합니다. 예를들면 apple이나 banana를 벡터로 표현하려고 한다면 원핫인코딩을 할 수 있겠지만 사전에 있는 모든 단어를 원핫인코딩을 한다면 10만개의 단어가 있다는 가정하에 10만차원을 할당해야 하는 문제가 발생합니다.
또한 원핫인코딩은 단어들간의 관계를무시해버립니다. 과일이나 탈 것 이런 범주 안에서는 같은 범주는 비슷한 곳에 있어야 하지만 원핫인코딩은 그것이 불가능합니다. 이러한 단어들을 벡터로 표현하는 방법은 바로 워드 임베딩입니다.
워드 임베딩
print(moddel.most_similar(positive=['father','woman], negative=['man']))
학습시키는 데이터에 따라 워드 임베딩의 결과도 달라집니다. word2vec Glove등 ..
token들을 일정길이를 가진 벡터로 표현할 수 있다.
토큰 단위로 자르고 각 토큰에 대한 아이디를 받아서 임베딩 레이어에서 뽑아서 neural network로 하는 것입니다.
각 I, LOVE, CHICKEN 에 대한 120 3942 9290 같은 토큰이 있고 이 토큰을 가져오면 해당 벡터가 나옵니다.
Transformer
번역을 할 때 앞뒤의 관계를 봅니다. 여기에서 따온 것이 Transformer입니다. 각 단어가 더 집중해야 할 즉 Attention 해야 할 구조가 가장 핵심적인 것이고 이를 NN로 표현한 것이 Transformer입니다.
배를 먹었더니, 배가 아프다.
모든 토큰들은 벡터로 표현할 수 있습니다. 처음부터 공간에서 구분할 수 있는 방법은 없습니다. 하지만 우리는 이것이 어떤 배인지 알고 있습니다. 먹었다, 아프라다른 단어를 보고 알 수 있는 것입니다.
트랜스포머를 거치면 문맥을 파악하고 벡터 공간에서 이를 나눠냅니다. Feature도 잘 구분되고 더 잘할 수 있는 것입니다.
- input에서 정보를 뽑아내는 encoder
- 뽑아낸 정보를 바탕으로 Text를 형성하는 디코더
왼쪽이 번역을 위해 정보를 추출하는 encoder
오른쪽이 추출된 정보를 가지고 generation하는 decoder
Input embedding : 단어 혹은 토큰을 벡터로 표현하는 부분
Positional encoding : 토큰의 위치를 벡터화해서 넣어주는 것, 토큰 단위로 순서대로 숫자 1, 2, 3, 등 번호표를 달아주는 것
Multi-Head Attention
Self-Attention
Mask는 생성형 모듈에 쓰임
토큰 벡터로 나눔
I ->
Love ->
You ->
all ->
20, embedding-dim으로 가정
input vector로부터 Query, Key, Vector를 보아야 합니다. 이때는 Linear layer를 사용해야 합니다. 해당 dimension은 정하기 나름이지만 dimension 크기는 5, attention_dim으로 봅니다.
Query는 각각의 단어들에 각각 어느 단어에 집중할지 질문하는 matrix
Key는 쿼리가 만든 질문에 응답하는 tensor
value 쿼리와 키가 매칭된 경우 그에 응답하는 tensor들
import torch
import torch.nn as nn
embed_dim = 20
atten_dim =5
class SelfAttention(nn.Module):
def __init__(self, embed_dim, atten_dim):
super().__init__()
self.query = nn.Linear(embed_dim, atten_dim)
self.key = nn.Linear(embed_dim, atten_dim)
self.value = nn.Linear(embed_dim, atten_dim)
def forward(self, x):
q = self.query(x)
k = self.key(x)
v = self.value(x)
return q, k, v
K를 전치 시키면 전치가 됩니다. 쿼리와 키를 행렬곱하면 4x4 matrix가 나오면 이것이 Score이 됩니다.
키값이 하나하나 매칭되어서 하는 것이며 이를 score로 나타낼 것인데 문맥상 매칭도가 낮다면 낮게, 높으면 높게 하면서 score를 낮추거나 높습니다. 각 score의 합은 1이 되도록 row 방향으로 softmax를 적용합니다. 거기에 value를 가져와서 곱한다면 합성되어서 결과값을 나타낼 것입니다.
똑같은 벡터에서 두개의 배가 시작하겠지만 먹었다는 벡터가 응답을 하면서 특정 방향으로 치우치고 배가 아프다도 마찬가지로 특정 방향으로 치우치면서 두개가 다른 벡터의 방향이 됩니다.
이것이 attension tensor입ㄴ디ㅏ.
루트의 dk가 있습니다. 이는 값이 극단적으로 나오지 않도록 smoothing해주는 역할입니다.
각각의 단어 토큰들에 대해서 해당 단어에 응답할 질문을 주는 쿼리, 답변의 키, value에 대해서 구조를 통해 문맥을 파악하고 vector를 섞어서 재배치
Multi-head attention
attention feature x h
attention feature를 여러번 뽑아내는 것입니다. 20에서 attention_dim 5로 가는 쿼리, 키, value를 만들고
서로다른 attention feature의 tensor를 만들어낸 것입니다.
'IT 프로그래밍 > AI' 카테고리의 다른 글
[Transformer]1 (0) | 2025.05.19 |
---|---|
[VLM] (0) | 2025.05.16 |
다중분류 이진분류 요약 (0) | 2025.03.30 |
인공신경망은 MLE 기계 (0) | 2025.03.30 |
[Loss function] MSE vs log-likelihood (0) | 2025.03.30 |