2024. 8. 19. 10:17ㆍML/NLP
Transformer는 long-term dependency 문제를 해결하기 위해 RNN의 순환 구조를 버리고 attention 기법을 적극 활용한 모델이다.
Encoder-Decoder Attention
RNN의 순환구조는 최근 입력 embedding vector에 치중된 context vector만 디코더로 넘겨준다.
Attention 기법은 각 출력 시점마다 필요한 입력 embedding vector를 파악하고 이들로 context vector를 생성해 디코더로 전달한다.
구체적으로, 각 출력 시점마다 각 입력 embedding vector가 얼마나 중요한지를 파악(by dot product & softmax)하고, 중요도가 높은 입력 embedding vector에 더 큰 가중치를 부여하는 방식(by weighted sum)으로 context vector를 생성한다.
중요성을 파악할 때 내적을 사용하기 때문에, 입출력 데이터 간의 관계성을 파악한다고 볼 수 있다.
이때 놀랍게도, $t$번째 출력 embedding vector $\mathbf s_t$는 $t+1$ 시점 출력과 연관성이 깊은 입력 embedding vector와 가까워지게 학습된다.
Self-Attention
RNN의 순환구조는 멀리 있는 입력 데이터 간의 연관성을 잘 파악하지 못해 embedding vector를 제대로 구하지 못한다.
Transformer의 self-attention은 attention 기법을 활용해 입력 데이터 간의 연관성을 파악하고 이를 활용해 embedding vector를 contextualize(문맥화)한다.
구체적으로, 입력 데이터 간의 연관성을 파악(by dot product & softmax)하고, 연관성이 깊은 입력 데이터에 더 큰 가중치를 부여하는 방식(by weighted sum)으로 contextualized embedding vector를 생성한다.
연관성을 파악할 때 내적을 사용하기 때문에, 입력 데이터 간의 관계성을 파악한다고 볼 수 있다.
참고로, embedding vector $\mathbf h_t$란 입력 데이터 $\mathbf x_t$의 의미를 담아낸 벡터다.
Input Embedding
Transformer는 데이터 형태에 따라 input shape이 달라진다.
데이터 형태가 이미지면, input shape는 (batch, channel, row, col)이다.
batch는 배치 크기, channel은 이미지의 채널 수(e.g., RGB), row는 이미지의 행 개수, col은 이미지의 열 개수를 의미한다.
데이터 형태가 텍스트면, input shape는 (batch, max_len, vocabulary size)이며, 각 토큰을 one-hot vector로 표현한다.
batch는 배치 크기, max_len는 한 문장에 사용 가능한 토큰 최대 개수, vocabulary size는 단어장에 있는 토큰의 총 개수를 의미한다.
실제 구현에서는 one-hot vector가 아닌 hot-index로 각 토큰을 표현한다. 그렇기 때문에, 실제 input shape는 (batch, token)이다.
이해를 돕기 위해 이번 글에서는 데이터 형태를 텍스트로 가정하고 설명하겠다.
1. Token Embedding
Transformer는 선형 변환 $\mathbf W_\text{token_emb}$을 거쳐 (토큰의 의미 정보가 담긴 벡터인) token embedding vector를 구한다.
각 토큰은 one-hot vector로 표현되기 때문에 $\mathbf W_\text{token_emb}$의 shape는 $\text{vocab_size} \times d_\text{model}$가 된다.
($d_\text{model}$ is dimension of embedding vector)
실제 구현에서는 one-hot vector가 아닌 hot-index로 표현되기 때문에, token embedding을 $\mathbf W_\text{token_emb}$에서 해당 토큰에 대응되는 행을 뽑는 과정으로 볼 수 있다.
2. Positional Embedding
Transformer의 embedding vector에는 순서 정보가 없다. 즉, 입력 순서를 바꿔도 대응되는 출력 결과가 동일하다.
Transformer는 선형변환과 attention으로만 구성되어 있기 때문이다.
그렇기 때문에 Transformer는 토큰의 단어 위치를 one-hot encoding한 후 선형 변환 $\mathbf W_\text{pos_emb}$을 거쳐 (토큰의 순서 정보가 담긴 벡터인) position embedding vector를 구한다.
단어 위치를 one-hot encoding 하면 길이는 max_len이 되기 때문에, $\mathbf W_\text{pos_emb}$의 shape는 $\text{max_len} \times d_\text{model}$가 된다.
이도 실제 구현에서는 one-hot vector가 아닌 hot-index로 표현되기 때문에, positional embedding도 $\mathbf W_\text{pos_emb}$에서 해당 위치에 대응되는 행을 뽑는 과정으로 볼 수 있다.
2.1. Positional Encoding
positional encoding은 positional embedding과 다르게 학습 파라미터를 사용하지 않고 고정된 벡터를 사용하는 기법이다. 아래 수식은 Transformer 논문에서 제시한 positional encoding 방법이다.
$$PE_{\text{pos}, 2i} = \sin \left( {\text{pos} \over 10000^{2i/d_\text{model}}} \right), \quad PE_{\text{pos}, 2i+1} = \cos \left( {\text{pos} \over 10000^{2i/d_\text{model}}} \right)$$
참고로, 최근에는 positional embedding을 사용하는 추세다.
이렇게 구한 token embedding vector와 position embedding vector를 더해 의미와 순서 정보가 담겨 있는 input embedding vector를 구하면 input embedding 과정은 끝이 난다. 아래 그림은 input embedding을 순서도로 표현한 것이다.
scaled dot product attention
이전 글에서 살펴본 encoder-decoder attention 과정은 다음과 같다.
$$<\mathbf s_t \cdot \mathbf h_i> = \mathbf s_t \mathbf h_i^\top$$
$$a_{t, i} = \text{softmax}(<\mathbf s_t \cdot \mathbf h_i>) = {e^{<\mathbf s_t \cdot \mathbf h_i>} \over \sum_{j=1}^\text{max_len} e^{<\mathbf s_t \ \cdot \mathbf h_j>}}$$
$$\mathbf c_{t} = a_{t, 1} \mathbf h_1 + a_{t, 2} \mathbf h_2 + \cdots + a_{t, \text{max_len}} \mathbf h_{\text{max_len}}$$
$(\underset{1 \times d_\text{model}}{\mathbf s_t}=t\text{th output embedding vector}, \ \underset{1 \times d_\text{model}}{\mathbf h_i}=i\text{th input embedding vector})$
(참고로, self-attention의 경우 $\mathbf s$와 $\mathbf h$가 동일해야 한다. embedding vector를 구하는 과정이기 때문이다.)
Transformer는 해당 과정에서 보다 유의미한 $\mathbf c_t$를 얻기 위해, embedding vector(dot product의 $\mathbf s_t, \mathbf h_i$ 그리고 weighted sum의 $\mathbf h_i$)를 $\mathbf Q_t$, $\mathbf K_i$, $\mathbf V_i$로 선현 변환해주는 과정을 추가했다. 즉, 학습 파라미터 $\mathbf W_q$, $\mathbf W_k$, $\mathbf W_v$를 추가했다.
$$<\mathbf Q_t \cdot \mathbf K_i> = \mathbf Q_t \mathbf K_i^\top$$
$$a_{t, i} = \text{softmax}\left({<\mathbf Q_t \cdot \mathbf K_i> \over \sqrt{d_k}}\right) = {e^{<\mathbf Q_t \cdot \mathbf K_i> / \sqrt{d_k}} \over \sum_{j=1}^\text{max_len} e^{<\mathbf Q_t \ \cdot \mathbf K_j> / \sqrt{d_k}}}, \quad (d_k = \text{dimension of }\mathbf K)$$
$$\mathbf a_{t} = a_{t, 1} \mathbf V_1 + a_{t, 2} \mathbf V_2 + \cdots + a_{t, \text{max_len}} \mathbf V_{\text{max_len}}$$
수식에서 유추할 수 있듯이, $\mathbf Q_t$, $\mathbf K_i$, $\mathbf V_i$가 의미하는 바는 다음과 같다.
$\mathbf Q_t$ (Query): 관계를 물어볼 기준 벡터(=$\mathbf s_t$와의 관계에 대한 질의문 벡터)
$\mathbf K_i$ (Key): $\mathbf s_t$와의 관계를 알아볼 벡터(=$\mathbf h_i$ 관점에서 질의응답 준비를 한 벡터)
$\mathbf V_i$ (Value): $\mathbf h_i$의 의미를 담은 벡터(=$\mathbf h_i$의 표현 벡터)
$\mathbf Q_t \mathbf K_i^\top$은 $\mathbf s_t$와 $\mathbf h_i$ 간의 관계를 의미하며, 이를 "$\mathbf s_t$와의 관계 질의문에 대한 $\mathbf h_i$ 관점에서의 답변"으로 해석할 수 있기 때문이고,
$a_{t, i} \mathbf V_i$를 "$\mathbf s_t$와 $\mathbf h_i$ 간의 관계만큼 $\mathbf h_i$의 의미를 사용한 것"으로 해석할 수 있기 때문이다.
그렇기 때문에, $\mathbf a_{t}$는 $\mathbf Q_t \mathbf K_i^\top$ 관계로 중요도를 파악하고 중요도만큼 구성($a_{t, i} \mathbf V_i$)된다고 볼 수 있다.
그렇기 때문에, $\mathbf Q$는 질의문을 잘 작성해야 하고, $\mathbf K$는 질의응답 준비를 잘해야 하고, $\mathbf V$는 의미 표현을 잘해야 한다.
이처럼, $\mathbf Q$, $\mathbf K$, $\mathbf V$의 역할이 서로 다르기 때문에 학습 파라미터를 따로 할당한 것이다.
학습 초기에는 $d_k$가 커질수록 $\mathbf Q \mathbf K^\top$의 분산이 커져 softmax 값이 1로 근사될 가능성이 높아진다. 이를 방지하기 위해, 내적을 $\sqrt{d_k}$로 나눈다.
위 과정을 그림으로 표현하면 다음과 같다.
첫번째 그림은 embedding vector를 $\mathbf Q$, $\mathbf K$, $\mathbf V$로 선형 변환하는 과정을 표현한 것이다.
두번째 그림과 마지막 그림은 각각 scaled dot product attention 과정과 순서도를 나타낸 것이다.
scaled dot product attention 수식을 한 줄로 요약하면 다음과 같다.
$$\text{Attention}(\mathbf Q, \mathbf K, \mathbf V) = \text{softmax}({\mathbf Q \mathbf K^\top \over \sqrt{d_k}})\mathbf V$$
Multi-Head Attention
실제로 Transformer는 $\mathbf W_q$, $\mathbf W_k$, $\mathbf W_v$를 여러(=$h$) 개로 쪼개고 각각에 대해 scaled dot product attetion을 수행한 다음, 이를 모두 concat하여 $\mathbf W_o$를 통과시킨다.
위 과정을 multi-head attention이라 부르며, 수식은 다음과 같이 표현할 수 있다.
$$\mathbf Q^i = \mathbf s {\mathbf W_q^i}^\top, \ \mathbf K^i = \mathbf h {\mathbf W_k^i}^\top, \ \mathbf V^i = \mathbf h {\mathbf W_v^i}^\top, \quad (i=1, 2, \cdots, h)$$
$$\mathbf H^i = \text{Attention}(\mathbf Q^i, \mathbf K^i, \mathbf V^i), \quad (i=1, 2, \cdots, h)$$
$$\mathbf H = [\mathbf H^1, \mathbf H^2, \cdots, \mathbf H^h] \mathbf W_o^\top$$
($\mathbf W_q^i, \mathbf W_k^i, \mathbf W_v^i \text{ are } d_k \times d_\text{model} \text{matrics, where } d_k = d_\text{model} / h \text{ and } \ \mathbf W_o \text{ is } d_\text{model} \times d_\text{model} \text{ matrix}$)
$\mathbf W_q^\top$ vs $[{\mathbf W_q^1}^\top, {\mathbf W_q^2}^\top, \cdots, {\mathbf W_q^h}^\top]$
비유를 하자면, $\mathbf W_q$, $\mathbf W_k$, $\mathbf W_v$는 $d_\text{model}$ 차원에 있는 절대신이고, $\mathbf W_q^i$, $\mathbf W_k^i$, $\mathbf W_v^i$는 $d_k$ 차원에 있는 평범한 신이다.
절대신은 평범한 신보다 높은 차원에 있기 때문에 보다 정확한 관점을 제시해준다. 다른 말로, 평범한 신의 관점은 차원이 낮아 절대신 관점에 비해 부족하다.
하지만, 여러 평범한 신이 각기 서로 다른 관점을 제시하면 여러 측면에서 바라볼 수 있어 부족한 점을 매꿀 수 있다.
근데 굳이 $\mathbf W_q$, $\mathbf W_k$, $\mathbf W_v$를 여러 개로 쪼개 사용하는 것일까?
안정적으로 여러 차원을 다양하게 활용하기 위해 쪼개는거 같다.
절대신이더라도 사용 가능한 차원 중 특정 차원의 중요도가 상대적으로 너무 크면 그 외의 차원은 묻히게 되어 활용할 수 없게 된다.
평범한 신이 사용할 수 있는 차원의 개수는 한정적이지만, 여럿이서 서로 다른 관점을 제시할 때, 사용되는 차원의 개수를 모두 더하면 절대신보다 많을 것이다.
비교 과정을 수식으로 표현하면 다음과 같다.
$$\mathbf s \mathbf W_q^\top = [\mathbf s {\mathbf W_q^1}^\top, \mathbf s {\mathbf W_q^2}^\top, \mathbf s {\mathbf W_q^3}^\top]$$
$$\mathbf h \mathbf W_k^\top = [\mathbf h {\mathbf W_k^1}^\top, \mathbf h {\mathbf W_k^2}^\top, \mathbf h {\mathbf W_k^3}^\top]$$
$$\mathbf h \mathbf W_v^\top = [\mathbf h {\mathbf W_v^1}^\top, \mathbf h {\mathbf W_v^2}^\top, \mathbf h {\mathbf W_v^3}^\top]$$
$$\text{so, }\mathbf Q = [\mathbf Q^1, \mathbf Q^2, \mathbf Q^3], \mathbf K = [\mathbf K^1, \mathbf K^2, \mathbf K^3], \mathbf V = [\mathbf V^1, \mathbf V^2, \mathbf V^3]$$
절대신을 택할 경우, attention 수식은 다음과 같다.
$$\mathbf Q \mathbf K^\top \mathbf V = (\mathbf Q^1 {\mathbf K^1}^\top + \mathbf Q^2 {\mathbf K^2}^\top + \mathbf Q^3 {\mathbf K^3}^\top)[\mathbf V^1, \mathbf V^2, \mathbf V^3]$$
반면, 일반 신 여럿을 택할 경우, attention 수식은 다음과 같다.
$$[\mathbf Q^1 {\mathbf K^1}^\top \mathbf V^1, \mathbf Q^2 {\mathbf K^2}^\top \mathbf V^2, \mathbf Q^3 {\mathbf K^3}^\top \mathbf V^3]$$
수식에서 알 수 있듯이, 절대신은 일반 신 여럿 관점을 합한 관점을 갖고 있다. 그렇기 때문에 보다 일반적이고 정확하다.
하지만, 절대신은 전체적인 관점 $\mathbf Q^1 {\mathbf K^1}^\top + \mathbf Q^2 {\mathbf K^2}^\top + \mathbf Q^3 {\mathbf K^3}^\top$에서 중요도가 높은 차원만 활용한다. 세부적인 관점을 보지 않는다.
그에 반해, 후자의 경우에는 각 세부적인 관점($\mathbf Q^1 {\mathbf K^1}^\top$, $\mathbf Q^2 {\mathbf K^2}^\top$, $\mathbf Q^3 {\mathbf K^3}^\top$)마다 중요도가 높은 차원을 모두 활용한다. 즉, 세부적인 관점을 적극 활용하겠다는 의지가 보인다.
마지막으로 모든 $\mathbf H^i$를 concat하고 $\mathbf W_o$를 통과시키는 과정은 신들끼리 서로 의견을 조율 및 공유하여 하나의 통합된 관점을 도출하는 행위로 해석할 수 있다.
Transformer의 Encoder
Transformer의 인코더는 6개의 인코더 레이어를 차곡차곡 쌓은 형태로 구성되어 있다.
그리고, 인코더의 각 레이어는 두 가지 블록으로 쌓여있다.
1. Multi-Head Attention: 인코더의 self-attention은 적절한 입력 embedding vector($\mathbf h$)를 구하는데 필요한 모든 입력 데이터 정보를 long term dependency 문제 없이 참조할 수 있게 해준다.
2. Feed Forward: MLP → ReLU → MLP로 구성되어 있다. 해당 블록의 hidden dim($d_{ff}$)은 일반적으로 MHA의 4배($4d_\text{model}$)로 잡는다.
(hidden dim을 줄이지 않고 키운 이유는 정보가 압축되어 정보 손실이 발생할 수 있기 때문이다.)
추가로, Transformer의 모든 블록은 ResNet의 skip-connection과 layer normalization 기법을 적용하고 있다.
뿐만 아니라, dropout (& attention dropout)기법도 적용되어 있다.
attention dropout은 $\text{softmax}({\mathbf Q \mathbf K^\top \over \sqrt{d_k}})$에 dropout을 적용하는 기법이다.
특정 embedding vector(=토큰)의 의존도는 낮추기 위함이다.
모든 embedding vector에 동등한 기회를 주고 골고루 활용해보길 권유하는 기법으로 해석할 수 있다.
Transformer의 Decoder
Transformer의 디코더도 6개의 디코더 레이어를 차곡차곡 쌓은 형태로 구성되어 있다.
하지만, 인코더와 다르게 디코더의 각 레이어는 세 가지 블록으로 쌓여있다.
1. Masked Multi-Head Attention: 디코더의 self-attention은 이후 출력을 보는 것을 부정행위이기 때문에 이를 막기 위해 마스킹을 해야 한다. 그렇기에, 디코더 masked self-attention은 적절한 출력 embedding vector($\mathbf s$)를 구하는데 필요한 출력 데이터 정보 중 이전 출력 데이터 정보만 long term dependency 문제 없이 참조할 수 있게 해준다.
(당연한 것이지만 집고 넘어가자면, transformer도 seq2seq 모델이기 때문에 teacher forcing 기법을 사용한다.)
2. Encoder-Decoder Attention: Encoder-Decoder Attention는 디코더가 적절한 출력 추론하는데 필요한 모든 입력 데이터 정보(입력 embedding vector=마지막 인코더 레이어의 출력값)를 long term dependency 문제 없이 참조할 수 있게 해준다.
직관적으로 말하자면, 해당 블록은 입력 데이터를 다시 한번 드려다 보면서 무엇을 주목해야 할지 찾는 과정으로 보면 된다.
3. Feed Forward: 인코더와 동일한 Feed Forward 블록이다.
Transformer의 output layer
Transformer의 출력 레이어는 출력 토큰의 확률분포를 반환한다.
구체적으로, 선형 변환 $\mathbf W_\text{out_layer}$을 하고, softmax를 거쳐 출력 토큰의 확률분포를 반환한다.
출력 토큰의 확률분포 구하기 위해서는 vocabulary에 있는 모든 토큰의 출력 확률을 알아야 하기 때문에, $\mathbf W_\text{out_layer}$의 shape는 $d_\text{model} \times \text{vocab_size}$가 된다.
참고로, $\mathbf W_\text{out_layer}$을 학습하지 않고 token embedding에서 사용한 $\mathbf W_\text{token_emb}^\top$을 사용하는 방법도 존재한다.
추론 시, 출력 토큰을 하나 뽑고, 이를 입력 토큰에 넣는 과정을 반복한다.
출력 토큰을 뽑는 방법에는 가장 확률을 높은 출력값을 선정하는 greedy search를 사용하거나, 누적 확률 top-k로 출력값을 선정하는 beam search를 사용한다.
이를 끝으로 Transformer의 모든 구조를 파악해봤다.
Transfomer는 무엇을 학습하는가?
Transformer는 임베딩 벡터를 어디에 위치시킬지를 학습한다.
구체적으로, 주목해야할 벡터와 같은 방향으로 가까워지게 하고 주목하지 말아야할 벡터와는 반대 방향으로 멀어지게 하는 선형 변환 $\mathbf W_q, \mathbf W_k, \mathbf W_v$를 학습한다.
의문: 주목하지 말아야할 벡터는 왜 수직 방향(내적=0)이 아닌 반대 방향(내적=음수)일까? 반대 방향일 때 softmax 값이 더 작기 때문이다. ($e^{<0} < e^0$)
skip-connection 기법 관점에서 보면, 각 블록의 출력 벡터는 입력 벡터를 특정 방향 및 세기로 톡 친 벡터로 볼 수 있다.
그렇기 때문에, 각 블록은 입력 벡터를 어디 방향으로 얼만큼 톡 칠 것인지를 즉, 차이 벡터(=출력 벡터 - 입력 벡터)를 학습한다.
Transformer는 input embedding 벡터를 톡톡 쳐가는 방식으로 embedding vector 조율하는 모델이다.
추가: Transformer의 비선형은 어디서 나오는가?
1. Feed Forward 블록의 ReLU
2. $\mathbf {QK}^\top = \mathbf {XW}_q \mathbf W_k^\top \mathbf X^\top$은 이차 형식(quadratic form)이다. 쉽게 말해, 이차 방정식이다. 여기에 $\mathbf V$까지 추가하면 삼차 형식(cubic form)될 뿐만 아니라, 중간에 softmax 연산까지 있다.
Evaluation
언어 모델링(=next token predict)에서 accuracy는 좋지 못한 평가 지표다.
언어 모델링 평가에 적합한 평가 지표로는 PPL(Perplexity)와 BLEU score가 있다.
PPL(Perplexity)
Perplexity는 한국어로 바꿔 표현하면 당혹감이다.
그럼, PPL을 "헷갈려하는 정도"로 해석할 수 있다.
PPL 수식은 다음과 같다.
$$P(w_1, w_2, \cdots, w_N)^{-{1 \over N}} = \left(P(w_1)\prod_{i=2}^N P(w_i | w_{i-1}, w_{i-2}, \cdots, w_1)\right)^{-{1 \over N}}$$
헷갈려하는 정도가 낮을수록 좋은거 처럼 PPL도 작을수록 좋다.
PPL이 $K$이면 토큰을 뽑을 때 평균적($-{1 \over N}$)으로 $K$개 토큰 중 뭘 골라야할지 헷갈렸다는 것으로 해석할 수 있다.
(곱으로 확률값을 누적시켰기 때문에, $-{1 \over N}$제곱로 평균을 낸다.)
PPL와 Cross-Entropy의 관계
Transformer의 Cross-Entropy Loss 수식은 다음과 같다.
$$\text{cross entropy loss} = {1 \over N}\left( -\log P(w_1) + \sum_{i=2}^N P(w_i|w_{i-1}, w_{i-2}, \cdots, w_1)\right) = \log \left(P(w_1)\prod_{i=2}^N P(w_i | w_{i-1}, w_{i-2}, \cdots, w_1)\right)^{-{1 \over N}} = \log \text{PPL}$$
결론, loss에 exp를 취하면 PPL이다.
BLEU(Bilingual Evaluation Understudy) score
BLEU score는 예측 문장과 정답 문장이 얼마나 비슷한지를 수치화한 것으로 볼 수 있다. 점수는 0부터 1로, 클수록 좋다.
$$\text{BLEU} = \text{BP} \cdot \prod_{n=1}^N p_n^{w_n}$$
$p_n$은 n-gram precision이다.
n-gram precision: (예측 문장의 n-gram과 정답 문장의 n-gram이 서로 일치하는 쌍의 개수) / (예측 문장의 n-gram 개수)
이때 주의해야할 점은 일대다(one-to-many)가 아닌 일대일(one-to-one)로 대응(=clipping 기법)시켜야 한다는 점이다.
정의역이 예측 문장의 n-gram이고, 공역이 정답 문장의 n-gram일 때 일대다로 대응시키면 중복 카운트가 발생한다.
$w_n$: n-gram의 중요도다. 일반적으로 동등하게 1/N로 잡는다. 참고로, N의 default 값은 4다.
unigram(1-gram)만 사용하지 않는 이유는 토큰 순서도 고려하기 위함이다.
토큰 순서가 중요하면 n이 커질수록 $w_n$을 높혀 원하는 지표값을 얻도록 하자.
BP(Brevity penalty): 짧은 문장 길이에 대한 페널티다. 점수를 잘 받기 위해 너무 짧게 생성하는 것은 꼼수다.
그렇기 때문에 예측 문장 길이가 정답 문장 길이보다 짧으면 패널티로 점수를 일정 비율 깍는다.
결론, 짧은 문장 생성을 지양하기 위해 도입했다. 수식은 다음과 같다.
$$\text{BP} = \begin{cases} 1, & \mbox{ if} c \ge r \\ e^{1-r/c}, & \mbox{ if} c < r \end{cases}$$
($c$는 예측 문장의 토큰 개수, $r$은 정답 문장의 토큰 개수다.)
문장을 너무 길게 생성하면 n-gram precision 점수가 낮아지고 너무 짧으면 생성하면 BP 점수가 낮아진다.
여러 문장에 대한 BLEU score 계산할 경우
n-gram precision: $\sum_\text{sentences}$(예측 문장의 n-gram과 정답 문장의 n-gram이 서로 일치하는 쌍의 개수) / $\sum_\text{sentences}$(예측 문장의 n-gram 개수)
쉽게 말해, 각 문장의 n-gram precision의 분모와 분자끼리 모두 더한 후 나눈다.
$$\text{BP} = \begin{cases} 1, & \mbox{ if} \sum c \ge \sum r \\ e^{1-\sum r/\sum c}, & \mbox{ if} \sum c < \sum r \end{cases}$$
($\sum c$는 모든 예측 문장의 토큰 총 개수, $\sum r$은 모든 정답 문장의 토큰 총 개수다.)
끝으로...
Transformer는 내적과 가중합 연산 과정인 $\text{softmax}({\mathbf Q \mathbf K^\top \over \sqrt{d_k}})\mathbf V$으로 수많은 성공을 거두었다.
각 토큰의 의미 혹은 뜻을 파악할 때 다른 토큰 간의 관계를 함께 고려하기 위해 즉, embedding vector를 contextualize(문맥화)하기 위해, 내적으로 토큰 간의 관계를 파악하고 가중합으로 연관성이 깊은 토큰 위주로 활용하는 의도 및 아이디어가 좋았기 때문이다.
이처럼, 특정 분야(=도메인)의 지식을 바탕으로한 직관으로 좋은 아이디어(=좋은 의도와 해석이 담긴 어떠한 연산 과정)를 딥러닝 모델(DNN)에 적용해볼 수 있다.
'ML > NLP' 카테고리의 다른 글
[NLP] RNN, LSTM, Attention (0) | 2024.03.31 |
---|