김기현 강사님의 '자연어처리 딥러닝 캠프(파이토치편)' 책을 공부하면서 정리한 글입니다.
* 수식으로 확인하는 Attention
> 지난 글 2021.05.12 - [자연어처리(NLP)] - [NLP] Attention Mechanism(어텐션)
class Attention(nn.Module):
def __init__(self, hidden_size):
super(Attention, self).__init__()
self.linear = nn.Linear(hidden_size, hidden_size, bias=False)
self.softmax = nn.Softmax(dim=-1)
torch.nn.Linear(in_features,out_features,bias=True,device=None,dtype=None) |
: 선형회귀모델을 구현하는 함수로 입력 차원과 출력차원을 인수로 입력합니다. : 만들어진 선형회귀 모델의 가중치와 편향은, weight()과 bias()로 구할수있으며, parameters()로 동시에 구할수도 있습니다 |
- Attention에서는 Query를 잘 변환(linear-transform)하는 방법을 배우는 과정이라는것 기억!
torch.nn.Softmax(dim=None) |
- input 텐서에 있는 숫자를 소프트맥수 함수를 통과시켜서, 0과 1사이에 있고, 그 합이 1인 output 텐서를 반환합니다. (※' dim'은 소프트맥스를 구할 차원의 방향을 의미합니다) |
def forward(self, h_src, h_t_tgt, mask=None):
# |h_src| = (batch_size, length, hidden_size)
# |h_t_tgt| = (batch_size, 1, hidden_size)
# |mask| = (batch_size, length) -> source senetence의 pad의 위치
query = self.linear(h_t_tgt)
# |query| = (batch_size, 1, hidden_size)
weight = torch.bmm(query, h_src.transpose(1, 2))
# |weight| = (batch_size, 1, length)
if mask is not None:
# Set each weight as -inf, if the mask value equals to 1.
# Since the softmax operation makes -inf to 0,
# masked weights would be set to 0 after softmax operation.
# Thus, if the sample is shorter than other samples in mini-batch,
# the weight for empty time-step would be set to 0.
weight.masked_fill_(mask.unsqueeze(1), -float('inf'))
weight = self.softmax(weight)
context_vector = torch.bmm(weight, h_src)
# |context_vector| = (batch_size, 1, hidden_size)
return context_vector
'AI > 파이토치(Pytorch)' 카테고리의 다른 글
[파이토치] 텐서 기초 (0) | 2021.09.08 |
---|---|
[딥러닝][파이토치] 이그나이트 이벤트(Ignite Events) (0) | 2021.09.03 |
[딥러닝][파이토치] 이그나이트_엔진(Ignite_Engine) (0) | 2021.09.03 |
[NLP][파이토치] seq2seq - Decoder(디코더) (0) | 2021.08.30 |
[NLP][파이토치] seq2seq - Encoder(인코더) (0) | 2021.08.29 |
댓글