RNN 기반 seq2seq 모델에서의 문제점
Attention
query vector를 blend vector들에 적용시키는 여러 방법들이 있다.
Bahdanau method
Query의 차원과 Hidden state의 차원이 달라도 가능
정보가 더해지는 경우(additive attention)
Dot method
정보의 내적 이용(dot product 수행)
General method
Query의 차원과 Hidden state의 차원이 달라도 가능
Query를 입력 항목과 동일한 모양으로 변환
정보의 내적 이용(dot product 수행)
Attention Score
decoder의 특정 예측 시점에서 decoder의 hidden state가 인코더의 각 모든 hidden state와 얼마나 유사한지를 나타낸 값
Bahdanau method를 기반으로 정리
Score 함수는 다음과 같다.
Bahdanau method를 이용하여 reactivity를 계산한 실습 코드
def _calculate_reactivity(self, query_vector, multiple_items):
B, N, H = multiple_items.shape # [B,N,H]
query_vector = query_vector.unsqueeze(1)
projected_q = self.W(query_vector) # projected_q : [B,1,Q] -> [B,1,D]
projected_item = self.U(multiple_items) # projected_item : [B,N,H] -> [B,N,D]
added_pp = projected_q + projected_item # added_pp : [B,1,D] + [B,N,D] -> [B,N,D]
tanh_pp = F.tanh(added_pp) # tanh_pp : [B,N,D]
v_t = self.v.transpose(1,0)
batch_v = v_t.expand(B, self.attention_dim,1) # batch_v : [B,D,1]
reactivity_scores = torch.bmm(tanh_pp, batch_v)
reactivity_scores = reactivity_scores.squeeze(-1)
# reactivity_score : [B,N,D] x [B,D,1] -> [B,N,1] -> squeeze(-1) -> [B,N]
return reactivity_scores
query_vector에서 unsqueeze(1)로 두번째에 1인 차원을 추가하고 query의 attention dimention인 W를 곱한다. [B,1,Q] -> [B,1,D]
item의 attention dimention인 U를 곱한다. [B,N,H] -> [B,N,D]
project를 한 두 값(projected_q+projected_item)을 더해 added_pp에 저장한다. [B,1,D] + [B,N,D] -> [B,N,D]
더한 값에 tanh 계산을 한 값을 tanh_pp에 저장한다. [B,N,D]
v를 transpose 해준 뒤 expand로 차원을 늘려준다. [B,D,1]
tanh_pp와 batch_v를 곱하여 reactivity_score를 구하고 squeeze(-1)로 1인 차원을 없애 [B,N]으로 만들어준다.
[B,N,D] x [B,D,1] -> [B,N,1] -> squeeze(-1) -> [B,N]
구현코드 github link
https://github.com/KimHyeYeon41/AISoftware/blob/main/%5BAI_03%5DAttention.ipynb
수업자료 이용(이론/실습)