|
|
|
@@ -104,7 +104,7 @@ class Attention(nn.Module):
|
|
|
|
|
# [switch nx => n_state from Block to Attention to keep identical to TF implem]
|
|
|
|
|
assert n_state % config.n_head == 0
|
|
|
|
|
self.register_buffer(
|
|
|
|
|
"bias", torch.tril(torch.ones((n_ctx, n_ctx), dtype=torch.uint8)).view(1, 1, n_ctx, n_ctx)
|
|
|
|
|
"bias", torch.tril(torch.ones((n_ctx, n_ctx), dtype=torch.bool)).view(1, 1, n_ctx, n_ctx)
|
|
|
|
|
)
|
|
|
|
|
self.register_buffer("masked_bias", torch.tensor(-1e4))
|
|
|
|
|
self.n_head = config.n_head
|
|
|
|
@@ -143,6 +143,7 @@ class Attention(nn.Module):
|
|
|
|
|
w = torch.matmul(q, k)
|
|
|
|
|
if self.scale:
|
|
|
|
|
w = w / (float(v.size(-1)) ** 0.5)
|
|
|
|
|
|
|
|
|
|
nd, ns = w.size(-2), w.size(-1)
|
|
|
|
|
mask = self.bias[:, :, ns - nd : ns, :ns]
|
|
|
|
|
w = torch.where(mask.bool(), w, self.masked_bias.to(w.dtype))
|
|
|
|
@@ -151,22 +152,22 @@ class Attention(nn.Module):
|
|
|
|
|
# Apply the attention mask
|
|
|
|
|
w = w + attention_mask
|
|
|
|
|
|
|
|
|
|
w = nn.Softmax(dim=-1)(w)
|
|
|
|
|
w = torch.softmax(w, dim=-1)
|
|
|
|
|
w = self.attn_dropout(w)
|
|
|
|
|
|
|
|
|
|
# Mask heads if we want to
|
|
|
|
|
if head_mask is not None:
|
|
|
|
|
w = w * head_mask
|
|
|
|
|
|
|
|
|
|
outputs = [torch.matmul(w, v)]
|
|
|
|
|
wv = torch.matmul(w, v)
|
|
|
|
|
if self.output_attentions:
|
|
|
|
|
outputs.append(w)
|
|
|
|
|
return outputs
|
|
|
|
|
return wv, w
|
|
|
|
|
else:
|
|
|
|
|
return (wv, )
|
|
|
|
|
|
|
|
|
|
def merge_heads(self, x):
|
|
|
|
|
x = x.permute(0, 2, 1, 3).contiguous()
|
|
|
|
|
new_x_shape = x.size()[:-2] + (x.size(-2) * x.size(-1),)
|
|
|
|
|
return x.view(*new_x_shape) # in Tensorflow implem: fct merge_states
|
|
|
|
|
x = x.transpose(2, 1).contiguous()
|
|
|
|
|
return x.flatten(2) # in Tensorflow implem: fct merge_states
|
|
|
|
|
|
|
|
|
|
def split_heads(self, x, k=False):
|
|
|
|
|
new_x_shape = x.size()[:-1] + (self.n_head, x.size(-1) // self.n_head)
|
|
|
|
@@ -174,11 +175,11 @@ class Attention(nn.Module):
|
|
|
|
|
if k:
|
|
|
|
|
return x.permute(0, 2, 3, 1) # (batch, head, head_features, seq_length)
|
|
|
|
|
else:
|
|
|
|
|
return x.permute(0, 2, 1, 3) # (batch, head, seq_length, head_features)
|
|
|
|
|
return x.transpose(2, 1) # (batch, head, seq_length, head_features)
|
|
|
|
|
|
|
|
|
|
def forward(self, x, layer_past=None, attention_mask=None, head_mask=None, use_cache=False):
|
|
|
|
|
x = self.c_attn(x)
|
|
|
|
|
query, key, value = x.split(self.split_size, dim=2)
|
|
|
|
|
query, key, value = x.chunk(3, dim=2)
|
|
|
|
|
query = self.split_heads(query)
|
|
|
|
|
key = self.split_heads(key, k=True)
|
|
|
|
|
value = self.split_heads(value)
|
|
|
|
@@ -199,8 +200,7 @@ class Attention(nn.Module):
|
|
|
|
|
a = self.c_proj(a)
|
|
|
|
|
a = self.resid_dropout(a)
|
|
|
|
|
|
|
|
|
|
outputs = [a, present] + attn_outputs[1:]
|
|
|
|
|
return outputs # a, present, (attentions)
|
|
|
|
|
return a, present, attn_outputs[1:]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MLP(nn.Module):
|
|
|
|
@@ -241,8 +241,7 @@ class Block(nn.Module):
|
|
|
|
|
m = self.mlp(self.ln_2(x))
|
|
|
|
|
x = x + m
|
|
|
|
|
|
|
|
|
|
outputs = [x] + output_attn[1:]
|
|
|
|
|
return outputs # x, present, (attentions)
|
|
|
|
|
return x, output_attn[1:]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GPT2PreTrainedModel(PreTrainedModel):
|
|
|
|
@@ -425,17 +424,17 @@ class GPT2Model(GPT2PreTrainedModel):
|
|
|
|
|
elif input_ids is not None:
|
|
|
|
|
input_shape = input_ids.size()
|
|
|
|
|
input_ids = input_ids.view(-1, input_shape[-1])
|
|
|
|
|
batch_size = input_ids.shape[0]
|
|
|
|
|
batch_size = input_ids.size(0)
|
|
|
|
|
elif inputs_embeds is not None:
|
|
|
|
|
input_shape = inputs_embeds.size()[:-1]
|
|
|
|
|
batch_size = inputs_embeds.shape[0]
|
|
|
|
|
batch_size = inputs_embeds.size(0)
|
|
|
|
|
else:
|
|
|
|
|
raise ValueError("You have to specify either input_ids or inputs_embeds")
|
|
|
|
|
|
|
|
|
|
if token_type_ids is not None:
|
|
|
|
|
token_type_ids = token_type_ids.view(-1, input_shape[-1])
|
|
|
|
|
token_type_ids = token_type_ids.view_as(input_ids)
|
|
|
|
|
if position_ids is not None:
|
|
|
|
|
position_ids = position_ids.view(-1, input_shape[-1])
|
|
|
|
|
position_ids = position_ids.view_as(input_ids)
|
|
|
|
|
|
|
|
|
|
if past is None:
|
|
|
|
|
past_length = 0
|
|
|
|
@@ -450,22 +449,25 @@ class GPT2Model(GPT2PreTrainedModel):
|
|
|
|
|
# Attention mask.
|
|
|
|
|
if attention_mask is not None:
|
|
|
|
|
assert batch_size > 0, "batch_size has to be defined and > 0"
|
|
|
|
|
attention_mask = attention_mask.view(batch_size, -1)
|
|
|
|
|
# We create a 3D attention mask from a 2D tensor mask.
|
|
|
|
|
# Sizes are [batch_size, 1, 1, to_seq_length]
|
|
|
|
|
# So we can broadcast to [batch_size, num_heads, from_seq_length, to_seq_length]
|
|
|
|
|
# this attention mask is more simple than the triangular masking of causal attention
|
|
|
|
|
# used in OpenAI GPT, we just need to prepare the broadcast dimension here.
|
|
|
|
|
attention_mask = attention_mask.unsqueeze(1).unsqueeze(2)
|
|
|
|
|
|
|
|
|
|
# Since attention_mask is 1.0 for positions we want to attend and 0.0 for
|
|
|
|
|
# masked positions, this operation will create a tensor which is 0.0 for
|
|
|
|
|
# positions we want to attend and -10000.0 for masked positions.
|
|
|
|
|
# Since we are adding it to the raw scores before the softmax, this is
|
|
|
|
|
# effectively the same as removing these entirely.
|
|
|
|
|
attention_mask = attention_mask.to(dtype=next(self.parameters()).dtype) # fp16 compatibility
|
|
|
|
|
|
|
|
|
|
# Computation is done over contiguous tensor (no view / unsqueeze) so probably faster
|
|
|
|
|
# Do the shaping ops afterwards
|
|
|
|
|
attention_mask = attention_mask.to(self.dtype) # fp16 compatibility
|
|
|
|
|
attention_mask = (1.0 - attention_mask) * -10000.0
|
|
|
|
|
|
|
|
|
|
# We create a 3D attention mask from a 2D tensor mask.
|
|
|
|
|
# Sizes are [batch_size, 1, 1, to_seq_length]
|
|
|
|
|
# So we can broadcast to [batch_size, num_heads, from_seq_length, to_seq_length]
|
|
|
|
|
# this attention mask is more simple than the triangular masking of causal attention
|
|
|
|
|
# used in OpenAI GPT, we just need to prepare the broadcast dimension here.
|
|
|
|
|
attention_mask = attention_mask.view(batch_size, 1, 1, -1)
|
|
|
|
|
|
|
|
|
|
# Prepare head mask if needed
|
|
|
|
|
# 1.0 in head_mask indicate we keep the head
|
|
|
|
|
# attention_probs has shape bsz x n_heads x N x N
|
|
|
|
@@ -478,7 +480,7 @@ class GPT2Model(GPT2PreTrainedModel):
|
|
|
|
|
if token_type_ids is not None:
|
|
|
|
|
token_type_embeds = self.wte(token_type_ids)
|
|
|
|
|
else:
|
|
|
|
|
token_type_embeds = 0
|
|
|
|
|
token_type_embeds = 0.
|
|
|
|
|
hidden_states = inputs_embeds + position_embeds + token_type_embeds
|
|
|
|
|
hidden_states = self.drop(hidden_states)
|
|
|
|
|
|
|
|
|
@@ -521,7 +523,7 @@ class GPT2Model(GPT2PreTrainedModel):
|
|
|
|
|
if self.output_attentions:
|
|
|
|
|
# let the number of heads free (-1) so we can extract attention even after head pruning
|
|
|
|
|
attention_output_shape = input_shape[:-1] + (-1,) + all_attentions[0].shape[-2:]
|
|
|
|
|
all_attentions = tuple(t.view(*attention_output_shape) for t in all_attentions)
|
|
|
|
|
all_attentions = tuple([t.view(*attention_output_shape) for t in all_attentions])
|
|
|
|
|
outputs = outputs + (all_attentions,)
|
|
|
|
|
return outputs # last hidden state, (presents), (all hidden_states), (attentions)
|
|
|
|
|
|
|
|
|
@@ -752,6 +754,7 @@ class GPT2DoubleHeadsModel(GPT2PreTrainedModel):
|
|
|
|
|
loss_fct = CrossEntropyLoss()
|
|
|
|
|
loss = loss_fct(mc_logits.view(-1, mc_logits.size(-1)), mc_labels.view(-1))
|
|
|
|
|
outputs = (loss,) + outputs
|
|
|
|
|
|
|
|
|
|
if lm_labels is not None:
|
|
|
|
|
shift_logits = lm_logits[..., :-1, :].contiguous()
|
|
|
|
|
shift_labels = lm_labels[..., 1:].contiguous()
|
|
|
|
|