GPT-2 PyTorch models + better tips for BERT
This commit is contained in:
@@ -27,7 +27,13 @@ Tips:
|
|||||||
|
|
||||||
- BERT is a model with absolute position embeddings so it's usually advised to pad the inputs on
|
- BERT is a model with absolute position embeddings so it's usually advised to pad the inputs on
|
||||||
the right rather than the left.
|
the right rather than the left.
|
||||||
|
- BERT was trained with a masked language modeling (MLM) objective. It is therefore efficient at predicting masked
|
||||||
|
tokens and at NLU in general, but is not optimal for text generation. Models trained with a causal language
|
||||||
|
modeling (CLM) objective are better in that regard.
|
||||||
|
- Alongside MLM, BERT was trained using a next sentence prediction (NSP) objective using the [CLS] token as a sequence
|
||||||
|
approximate. The user may use this token (the first token in a sequence built with special tokens) to get a sequence
|
||||||
|
prediction rather than a token prediction. However, averaging over the sequence may yield better results than using
|
||||||
|
the [CLS] token.
|
||||||
|
|
||||||
BertConfig
|
BertConfig
|
||||||
~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|||||||
@@ -1,6 +1,36 @@
|
|||||||
OpenAI GPT2
|
OpenAI GPT2
|
||||||
----------------------------------------------------
|
----------------------------------------------------
|
||||||
|
|
||||||
|
Overview
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
OpenAI GPT-2 model was proposed in
|
||||||
|
`Language Models are Unsupervised Multitask Learners`_
|
||||||
|
by Alec Radford*, Jeffrey Wu*, Rewon Child, David Luan, Dario Amodei** and Ilya Sutskever**.
|
||||||
|
It's a causal (unidirectional) transformer pre-trained using language modeling on a very large
|
||||||
|
corpus of ~40 GB of text data.
|
||||||
|
|
||||||
|
The abstract from the paper is the following:
|
||||||
|
|
||||||
|
*GPT-2 is a large transformer-based language model with 1.5 billion parameters, trained on a dataset[1]
|
||||||
|
of 8 million web pages. GPT-2 is trained with a simple objective: predict the next word, given all of the previous
|
||||||
|
words within some text. The diversity of the dataset causes this simple goal to contain naturally occurring
|
||||||
|
demonstrations of many tasks across diverse domains. GPT-2 is a direct scale-up of GPT, with more than 10X
|
||||||
|
the parameters and trained on more than 10X the amount of data.*
|
||||||
|
|
||||||
|
Tips:
|
||||||
|
|
||||||
|
- GPT-2 is a model with absolute position embeddings so it's usually advised to pad the inputs on
|
||||||
|
the right rather than the left.
|
||||||
|
- GPT-2 was trained with a causal language modeling (CLM) objective and is therefore powerful at predicting the next
|
||||||
|
token in a sequence. Leveraging this feature allows GPT-2 to generate syntactically coherent text as
|
||||||
|
it can be observed in the `run_generation.py` example script.
|
||||||
|
- The PyTorch models can take the `past` as input, which is the previously computed key/value attention pairs. Using
|
||||||
|
this `past` value prevents the model from re-computing pre-computed values in the context of text generation.
|
||||||
|
See `reusing the past in generative models <../quickstart.html#using-the-past>`_ for more information on the usage
|
||||||
|
of this argument.
|
||||||
|
|
||||||
|
|
||||||
``GPT2Config``
|
``GPT2Config``
|
||||||
~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import torch.nn as nn
|
|||||||
from torch.nn import CrossEntropyLoss
|
from torch.nn import CrossEntropyLoss
|
||||||
|
|
||||||
from .configuration_gpt2 import GPT2Config
|
from .configuration_gpt2 import GPT2Config
|
||||||
from .file_utils import add_start_docstrings
|
from .file_utils import add_start_docstrings, add_start_docstrings_to_callable
|
||||||
from .modeling_utils import Conv1D, PreTrainedModel, SequenceSummary, prune_conv1d_layer
|
from .modeling_utils import Conv1D, PreTrainedModel, SequenceSummary, prune_conv1d_layer
|
||||||
|
|
||||||
|
|
||||||
@@ -265,12 +265,7 @@ class GPT2PreTrainedModel(PreTrainedModel):
|
|||||||
module.weight.data.fill_(1.0)
|
module.weight.data.fill_(1.0)
|
||||||
|
|
||||||
|
|
||||||
GPT2_START_DOCSTRING = r""" OpenAI GPT-2 model was proposed in
|
GPT2_START_DOCSTRING = r"""
|
||||||
`Language Models are Unsupervised Multitask Learners`_
|
|
||||||
by Alec Radford*, Jeffrey Wu*, Rewon Child, David Luan, Dario Amodei** and Ilya Sutskever**.
|
|
||||||
It's a causal (unidirectional) transformer pre-trained using language modeling on a very large
|
|
||||||
corpus of ~40 GB of text data.
|
|
||||||
|
|
||||||
This model is a PyTorch `torch.nn.Module`_ sub-class. Use it as a regular PyTorch Module and
|
This model is a PyTorch `torch.nn.Module`_ sub-class. Use it as a regular PyTorch Module and
|
||||||
refer to the PyTorch documentation for all matter related to general usage and behavior.
|
refer to the PyTorch documentation for all matter related to general usage and behavior.
|
||||||
|
|
||||||
@@ -286,36 +281,43 @@ GPT2_START_DOCSTRING = r""" OpenAI GPT-2 model was proposed in
|
|||||||
Check out the :meth:`~transformers.PreTrainedModel.from_pretrained` method to load the model weights.
|
Check out the :meth:`~transformers.PreTrainedModel.from_pretrained` method to load the model weights.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
GPT2_INPUTS_DOCSTRING = r""" Inputs:
|
GPT2_INPUTS_DOCSTRING = r"""
|
||||||
**input_ids**: ``torch.LongTensor`` of shape ``(batch_size, sequence_length)``:
|
Args:
|
||||||
|
input_id (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`):
|
||||||
Indices of input sequence tokens in the vocabulary.
|
Indices of input sequence tokens in the vocabulary.
|
||||||
GPT-2 is a model with absolute position embeddings so it's usually advised to pad the inputs on
|
|
||||||
the right rather than the left.
|
|
||||||
Indices can be obtained using :class:`transformers.GPT2Tokenizer`.
|
Indices can be obtained using :class:`transformers.GPT2Tokenizer`.
|
||||||
See :func:`transformers.PreTrainedTokenizer.encode` and
|
See :func:`transformers.PreTrainedTokenizer.encode` and
|
||||||
:func:`transformers.PreTrainedTokenizer.convert_tokens_to_ids` for details.
|
:func:`transformers.PreTrainedTokenizer.encode_plus` for details.
|
||||||
**past**:
|
|
||||||
list of ``torch.FloatTensor`` (one for each layer):
|
`What are input IDs? <../glossary.html#input-ids>`__
|
||||||
that contains pre-computed hidden-states (key and values in the attention blocks) as computed by the model
|
past (:obj:`List[torch.FloatTensor]` of length :obj:`config.n_layers`):
|
||||||
|
Contains pre-computed hidden-states (key and values in the attention blocks) as computed by the model
|
||||||
(see `past` output below). Can be used to speed up sequential decoding. The token ids which have their past given to this model
|
(see `past` output below). Can be used to speed up sequential decoding. The token ids which have their past given to this model
|
||||||
should not be passed as input ids as they have already been computed.
|
should not be passed as input ids as they have already been computed.
|
||||||
**attention_mask**: (`optional`) ``torch.FloatTensor`` of shape ``(batch_size, sequence_length)``:
|
attention_mask (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`, defaults to :obj:`None`):
|
||||||
Mask to avoid performing attention on padding token indices.
|
Mask to avoid performing attention on padding token indices.
|
||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
``1`` for tokens that are NOT MASKED, ``0`` for MASKED tokens.
|
``1`` for tokens that are NOT MASKED, ``0`` for MASKED tokens.
|
||||||
**token_type_ids**: (`optional`) ``torch.LongTensor`` of shape ``(batch_size, sequence_length)``:
|
|
||||||
A parallel sequence of tokens (can be used to indicate various portions of the inputs).
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
The embeddings from these tokens will be summed with the respective token embeddings.
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`, defaults to :obj:`None`):
|
||||||
Indices are selected in the vocabulary (unlike BERT which has a specific vocabulary for segment indices).
|
Segment token indices to indicate first and second portions of the inputs.
|
||||||
**position_ids**: (`optional`) ``torch.LongTensor`` of shape ``(batch_size, sequence_length)``:
|
Indices are selected in ``[0, 1]``: ``0`` corresponds to a `sentence A` token, ``1``
|
||||||
|
corresponds to a `sentence B` token
|
||||||
|
|
||||||
|
`What are token type IDs? <../glossary.html#token-type-ids>`_
|
||||||
|
position_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`, defaults to :obj:`None`):
|
||||||
Indices of positions of each input sequence tokens in the position embeddings.
|
Indices of positions of each input sequence tokens in the position embeddings.
|
||||||
Selected in the range ``[0, config.max_position_embeddings - 1]``.
|
Selected in the range ``[0, config.max_position_embeddings - 1]``.
|
||||||
**head_mask**: (`optional`) ``torch.FloatTensor`` of shape ``(num_heads,)`` or ``(num_layers, num_heads)``:
|
|
||||||
|
`What are position IDs? <../glossary.html#position-ids>`_
|
||||||
|
head_mask (:obj:`torch.FloatTensor` of shape :obj:`(num_heads,)` or :obj:`(num_layers, num_heads)`, `optional`, defaults to :obj:`None`):
|
||||||
Mask to nullify selected heads of the self-attention modules.
|
Mask to nullify selected heads of the self-attention modules.
|
||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
``1`` indicates the head is **not masked**, ``0`` indicates the head is **masked**.
|
:obj:`1` indicates the head is **not masked**, :obj:`0` indicates the head is **masked**.
|
||||||
**inputs_embeds**: (`optional`) ``torch.FloatTensor`` of shape ``(batch_size, sequence_length, embedding_dim)``:
|
input_embeds (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length, hidden_size)`, `optional`, defaults to :obj:`None`):
|
||||||
Optionally, instead of passing ``input_ids`` you can choose to directly pass an embedded representation.
|
Optionally, instead of passing :obj:`input_ids` you can choose to directly pass an embedded representation.
|
||||||
This is useful if you want more control over how to convert `input_ids` indices into associated vectors
|
This is useful if you want more control over how to convert `input_ids` indices into associated vectors
|
||||||
than the model's internal embedding lookup matrix.
|
than the model's internal embedding lookup matrix.
|
||||||
"""
|
"""
|
||||||
@@ -324,35 +326,8 @@ GPT2_INPUTS_DOCSTRING = r""" Inputs:
|
|||||||
@add_start_docstrings(
|
@add_start_docstrings(
|
||||||
"The bare GPT2 Model transformer outputting raw hidden-states without any specific head on top.",
|
"The bare GPT2 Model transformer outputting raw hidden-states without any specific head on top.",
|
||||||
GPT2_START_DOCSTRING,
|
GPT2_START_DOCSTRING,
|
||||||
GPT2_INPUTS_DOCSTRING,
|
|
||||||
)
|
)
|
||||||
class GPT2Model(GPT2PreTrainedModel):
|
class GPT2Model(GPT2PreTrainedModel):
|
||||||
r"""
|
|
||||||
Outputs: `Tuple` comprising various elements depending on the configuration (config) and inputs:
|
|
||||||
**last_hidden_state**: ``torch.FloatTensor`` of shape ``(batch_size, sequence_length, hidden_size)``
|
|
||||||
Sequence of hidden-states at the last layer of the model.
|
|
||||||
**past**:
|
|
||||||
list of ``torch.FloatTensor`` (one for each layer) of shape ``(2, batch_size, num_heads, sequence_length, embed_size_per_head)``:
|
|
||||||
that contains pre-computed hidden-states (key and values in the attention blocks).
|
|
||||||
Can be used (see `past` input) to speed up sequential decoding. The token ids which have their past given to this model
|
|
||||||
should not be passed as input ids as they have already been computed.
|
|
||||||
**hidden_states**: (`optional`, returned when ``config.output_hidden_states=True``)
|
|
||||||
list of ``torch.FloatTensor`` (one for the output of each layer + the output of the embeddings)
|
|
||||||
of shape ``(batch_size, sequence_length, hidden_size)``:
|
|
||||||
Hidden-states of the model at the output of each layer plus the initial embedding outputs.
|
|
||||||
**attentions**: (`optional`, returned when ``config.output_attentions=True``)
|
|
||||||
list of ``torch.FloatTensor`` (one for each layer) of shape ``(batch_size, num_heads, sequence_length, sequence_length)``:
|
|
||||||
Attentions weights after the attention softmax, used to compute the weighted average in the self-attention heads.
|
|
||||||
|
|
||||||
Examples::
|
|
||||||
|
|
||||||
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
|
|
||||||
model = GPT2Model.from_pretrained('gpt2')
|
|
||||||
input_ids = torch.tensor(tokenizer.encode("Hello, my dog is cute", add_special_tokens=True)).unsqueeze(0) # Batch size 1
|
|
||||||
outputs = model(input_ids)
|
|
||||||
last_hidden_states = outputs[0] # The last hidden-state is the first element of the output tuple
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
super().__init__(config)
|
super().__init__(config)
|
||||||
@@ -381,6 +356,7 @@ class GPT2Model(GPT2PreTrainedModel):
|
|||||||
for layer, heads in heads_to_prune.items():
|
for layer, heads in heads_to_prune.items():
|
||||||
self.h[layer].attn.prune_heads(heads)
|
self.h[layer].attn.prune_heads(heads)
|
||||||
|
|
||||||
|
@add_start_docstrings_to_callable(GPT2_INPUTS_DOCSTRING)
|
||||||
def forward(
|
def forward(
|
||||||
self,
|
self,
|
||||||
input_ids=None,
|
input_ids=None,
|
||||||
@@ -391,6 +367,36 @@ class GPT2Model(GPT2PreTrainedModel):
|
|||||||
head_mask=None,
|
head_mask=None,
|
||||||
inputs_embeds=None,
|
inputs_embeds=None,
|
||||||
):
|
):
|
||||||
|
r"""
|
||||||
|
Return:
|
||||||
|
:obj:`tuple(torch.FloatTensor)` comprising various elements depending on the configuration (config) and inputs:
|
||||||
|
last_hidden_state (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length, hidden_size)`):
|
||||||
|
Sequence of hidden-states at the last layer of the model.
|
||||||
|
past (:obj:`List[torch.FloatTensor]` of length :obj:`config.n_layers` with each tensor of shape :obj:`(2, batch_size, num_heads, sequence_length, embed_size_per_head)`):
|
||||||
|
Contains pre-computed hidden-states (key and values in the attention blocks).
|
||||||
|
Can be used (see `past` input) to speed up sequential decoding. The token ids which have their past given to this model
|
||||||
|
should not be passed as input ids as they have already been computed.
|
||||||
|
hidden_states (:obj:`tuple(torch.FloatTensor)`, `optional`, returned when ``config.output_hidden_states=True``):
|
||||||
|
Tuple of :obj:`torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer)
|
||||||
|
of shape :obj:`(batch_size, sequence_length, hidden_size)`.
|
||||||
|
|
||||||
|
Hidden-states of the model at the output of each layer plus the initial embedding outputs.
|
||||||
|
attentions (:obj:`tuple(torch.FloatTensor)`, `optional`, returned when ``config.output_attentions=True``):
|
||||||
|
Tuple of :obj:`torch.FloatTensor` (one for each layer) of shape
|
||||||
|
:obj:`(batch_size, num_heads, sequence_length, sequence_length)`.
|
||||||
|
|
||||||
|
Attentions weights after the attention softmax, used to compute the weighted average in the self-attention
|
||||||
|
heads.
|
||||||
|
|
||||||
|
Examples::
|
||||||
|
|
||||||
|
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
|
||||||
|
model = GPT2Model.from_pretrained('gpt2')
|
||||||
|
input_ids = torch.tensor(tokenizer.encode("Hello, my dog is cute", add_special_tokens=True)).unsqueeze(0) # Batch size 1
|
||||||
|
outputs = model(input_ids)
|
||||||
|
last_hidden_states = outputs[0] # The last hidden-state is the first element of the output tuple
|
||||||
|
|
||||||
|
"""
|
||||||
if input_ids is not None and inputs_embeds is not None:
|
if input_ids is not None and inputs_embeds is not None:
|
||||||
raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time")
|
raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time")
|
||||||
elif input_ids is not None:
|
elif input_ids is not None:
|
||||||
@@ -504,50 +510,10 @@ class GPT2Model(GPT2PreTrainedModel):
|
|||||||
|
|
||||||
@add_start_docstrings(
|
@add_start_docstrings(
|
||||||
"""The GPT2 Model transformer with a language modeling head on top
|
"""The GPT2 Model transformer with a language modeling head on top
|
||||||
(linear layer with weights tied to the input embeddings). """,
|
(linear layer with weights tied to the input embeddings). """,
|
||||||
GPT2_START_DOCSTRING,
|
GPT2_START_DOCSTRING,
|
||||||
GPT2_INPUTS_DOCSTRING,
|
|
||||||
)
|
)
|
||||||
class GPT2LMHeadModel(GPT2PreTrainedModel):
|
class GPT2LMHeadModel(GPT2PreTrainedModel):
|
||||||
r"""
|
|
||||||
**labels**: (`optional`) ``torch.LongTensor`` of shape ``(batch_size, sequence_length)``:
|
|
||||||
Labels for language modeling.
|
|
||||||
Note that the labels **are shifted** inside the model, i.e. you can set ``lm_labels = input_ids``
|
|
||||||
Indices are selected in ``[-100, 0, ..., config.vocab_size]``
|
|
||||||
All labels set to ``-100`` are ignored (masked), the loss is only
|
|
||||||
computed for labels in ``[0, ..., config.vocab_size]``
|
|
||||||
|
|
||||||
Outputs: `Tuple` comprising various elements depending on the configuration (config) and inputs:
|
|
||||||
**loss**: (`optional`, returned when ``labels`` is provided) ``torch.FloatTensor`` of shape ``(1,)``:
|
|
||||||
Language modeling loss.
|
|
||||||
**prediction_scores**: ``torch.FloatTensor`` of shape ``(batch_size, sequence_length, config.vocab_size)``
|
|
||||||
Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax).
|
|
||||||
**past**:
|
|
||||||
list of ``torch.FloatTensor`` (one for each layer) of shape ``(2, batch_size, num_heads, sequence_length, embed_size_per_head)``:
|
|
||||||
that contains pre-computed hidden-states (key and values in the attention blocks).
|
|
||||||
Can be used (see `past` input) to speed up sequential decoding. The token ids which have their past given to this model
|
|
||||||
should not be passed as input ids as they have already been computed.
|
|
||||||
**hidden_states**: (`optional`, returned when ``config.output_hidden_states=True``)
|
|
||||||
list of ``torch.FloatTensor`` (one for the output of each layer + the output of the embeddings)
|
|
||||||
of shape ``(batch_size, sequence_length, hidden_size)``:
|
|
||||||
Hidden-states of the model at the output of each layer plus the initial embedding outputs.
|
|
||||||
**attentions**: (`optional`, returned when ``config.output_attentions=True``)
|
|
||||||
list of ``torch.FloatTensor`` (one for each layer) of shape ``(batch_size, num_heads, sequence_length, sequence_length)``:
|
|
||||||
Attentions weights after the attention softmax, used to compute the weighted average in the self-attention heads.
|
|
||||||
|
|
||||||
Examples::
|
|
||||||
|
|
||||||
import torch
|
|
||||||
from transformers import GPT2Tokenizer, GPT2LMHeadModel
|
|
||||||
|
|
||||||
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
|
|
||||||
model = GPT2LMHeadModel.from_pretrained('gpt2')
|
|
||||||
|
|
||||||
input_ids = torch.tensor(tokenizer.encode("Hello, my dog is cute", add_special_tokens=True)).unsqueeze(0) # Batch size 1
|
|
||||||
outputs = model(input_ids, labels=input_ids)
|
|
||||||
loss, logits = outputs[:2]
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
super().__init__(config)
|
super().__init__(config)
|
||||||
@@ -568,6 +534,7 @@ class GPT2LMHeadModel(GPT2PreTrainedModel):
|
|||||||
inputs.update(kwargs)
|
inputs.update(kwargs)
|
||||||
return inputs
|
return inputs
|
||||||
|
|
||||||
|
@add_start_docstrings_to_callable(GPT2_INPUTS_DOCSTRING)
|
||||||
def forward(
|
def forward(
|
||||||
self,
|
self,
|
||||||
input_ids=None,
|
input_ids=None,
|
||||||
@@ -579,6 +546,49 @@ class GPT2LMHeadModel(GPT2PreTrainedModel):
|
|||||||
inputs_embeds=None,
|
inputs_embeds=None,
|
||||||
labels=None,
|
labels=None,
|
||||||
):
|
):
|
||||||
|
r"""
|
||||||
|
labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`, defaults to :obj:`None`):
|
||||||
|
Labels for language modeling.
|
||||||
|
Note that the labels **are shifted** inside the model, i.e. you can set ``lm_labels = input_ids``
|
||||||
|
Indices are selected in ``[-100, 0, ..., config.vocab_size]``
|
||||||
|
All labels set to ``-100`` are ignored (masked), the loss is only
|
||||||
|
computed for labels in ``[0, ..., config.vocab_size]``
|
||||||
|
|
||||||
|
Return:
|
||||||
|
:obj:`tuple(torch.FloatTensor)` comprising various elements depending on the configuration (:obj:`~transformers.GPT2Config`) and inputs:
|
||||||
|
loss (:obj:`torch.FloatTensor` of shape `(1,)`, `optional`, returned when ``labels`` is provided)
|
||||||
|
Language modeling loss.
|
||||||
|
prediction_scores (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length, config.vocab_size)`):
|
||||||
|
Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax).
|
||||||
|
past (:obj:`List[torch.FloatTensor]` of length :obj:`config.n_layers` with each tensor of shape :obj:`(2, batch_size, num_heads, sequence_length, embed_size_per_head)`):
|
||||||
|
Contains pre-computed hidden-states (key and values in the attention blocks).
|
||||||
|
Can be used (see `past` input) to speed up sequential decoding. The token ids which have their past given to this model
|
||||||
|
should not be passed as input ids as they have already been computed.
|
||||||
|
hidden_states (:obj:`tuple(torch.FloatTensor)`, `optional`, returned when ``config.output_hidden_states=True``):
|
||||||
|
Tuple of :obj:`torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer)
|
||||||
|
of shape :obj:`(batch_size, sequence_length, hidden_size)`.
|
||||||
|
|
||||||
|
Hidden-states of the model at the output of each layer plus the initial embedding outputs.
|
||||||
|
attentions (:obj:`tuple(torch.FloatTensor)`, `optional`, returned when ``config.output_attentions=True``):
|
||||||
|
Tuple of :obj:`torch.FloatTensor` (one for each layer) of shape
|
||||||
|
:obj:`(batch_size, num_heads, sequence_length, sequence_length)`.
|
||||||
|
|
||||||
|
Attentions weights after the attention softmax, used to compute the weighted average in the self-attention
|
||||||
|
heads.
|
||||||
|
|
||||||
|
Examples::
|
||||||
|
|
||||||
|
import torch
|
||||||
|
from transformers import GPT2Tokenizer, GPT2LMHeadModel
|
||||||
|
|
||||||
|
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
|
||||||
|
model = GPT2LMHeadModel.from_pretrained('gpt2')
|
||||||
|
|
||||||
|
input_ids = torch.tensor(tokenizer.encode("Hello, my dog is cute", add_special_tokens=True)).unsqueeze(0) # Batch size 1
|
||||||
|
outputs = model(input_ids, labels=input_ids)
|
||||||
|
loss, logits = outputs[:2]
|
||||||
|
|
||||||
|
"""
|
||||||
transformer_outputs = self.transformer(
|
transformer_outputs = self.transformer(
|
||||||
input_ids,
|
input_ids,
|
||||||
past=past,
|
past=past,
|
||||||
@@ -607,50 +617,80 @@ class GPT2LMHeadModel(GPT2PreTrainedModel):
|
|||||||
|
|
||||||
@add_start_docstrings(
|
@add_start_docstrings(
|
||||||
"""The GPT2 Model transformer with a language modeling and a multiple-choice classification
|
"""The GPT2 Model transformer with a language modeling and a multiple-choice classification
|
||||||
head on top e.g. for RocStories/SWAG tasks. The two heads are two linear layers.
|
head on top e.g. for RocStories/SWAG tasks. The two heads are two linear layers.
|
||||||
The language modeling head has its weights tied to the input embeddings,
|
The language modeling head has its weights tied to the input embeddings,
|
||||||
the classification head takes as input the input of a specified classification token index in the input sequence).
|
the classification head takes as input the input of a specified classification token index in the input sequence).
|
||||||
""",
|
""",
|
||||||
GPT2_START_DOCSTRING,
|
GPT2_START_DOCSTRING,
|
||||||
GPT2_INPUTS_DOCSTRING,
|
|
||||||
)
|
)
|
||||||
class GPT2DoubleHeadsModel(GPT2PreTrainedModel):
|
class GPT2DoubleHeadsModel(GPT2PreTrainedModel):
|
||||||
r"""
|
|
||||||
**mc_token_ids**: (`optional`, default to index of the last token of the input) ``torch.LongTensor`` of shape ``(batch_size, num_choices)``:
|
def __init__(self, config):
|
||||||
|
super().__init__(config)
|
||||||
|
config.num_labels = 1
|
||||||
|
self.transformer = GPT2Model(config)
|
||||||
|
self.lm_head = nn.Linear(config.n_embd, config.vocab_size, bias=False)
|
||||||
|
self.multiple_choice_head = SequenceSummary(config)
|
||||||
|
|
||||||
|
self.init_weights()
|
||||||
|
|
||||||
|
def get_output_embeddings(self):
|
||||||
|
return self.lm_head
|
||||||
|
|
||||||
|
@add_start_docstrings_to_callable(GPT2_INPUTS_DOCSTRING)
|
||||||
|
def forward(
|
||||||
|
self,
|
||||||
|
input_ids=None,
|
||||||
|
past=None,
|
||||||
|
attention_mask=None,
|
||||||
|
token_type_ids=None,
|
||||||
|
position_ids=None,
|
||||||
|
head_mask=None,
|
||||||
|
inputs_embeds=None,
|
||||||
|
mc_token_ids=None,
|
||||||
|
lm_labels=None,
|
||||||
|
mc_labels=None,
|
||||||
|
):
|
||||||
|
r"""
|
||||||
|
mc_token_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, num_choices)`, `optional`, default to index of the last token of the input)
|
||||||
Index of the classification token in each input sequence.
|
Index of the classification token in each input sequence.
|
||||||
Selected in the range ``[0, input_ids.size(-1) - 1[``.
|
Selected in the range ``[0, input_ids.size(-1) - 1[``.
|
||||||
**lm_labels**: (`optional`) ``torch.LongTensor`` of shape ``(batch_size, sequence_length)``:
|
lm_labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`, defaults to :obj:`None`)
|
||||||
Labels for language modeling.
|
Labels for language modeling.
|
||||||
Note that the labels **are shifted** inside the model, i.e. you can set ``lm_labels = input_ids``
|
Note that the labels **are shifted** inside the model, i.e. you can set ``lm_labels = input_ids``
|
||||||
Indices are selected in ``[-1, 0, ..., config.vocab_size]``
|
Indices are selected in ``[-1, 0, ..., config.vocab_size]``
|
||||||
All labels set to ``-100`` are ignored (masked), the loss is only
|
All labels set to ``-100`` are ignored (masked), the loss is only
|
||||||
computed for labels in ``[0, ..., config.vocab_size]``
|
computed for labels in ``[0, ..., config.vocab_size]``
|
||||||
**mc_labels**: (`optional`) ``torch.LongTensor`` of shape ``(batch_size)``:
|
mc_labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size)`, `optional`, defaults to :obj:`None`)
|
||||||
Labels for computing the multiple choice classification loss.
|
Labels for computing the multiple choice classification loss.
|
||||||
Indices should be in ``[0, ..., num_choices]`` where `num_choices` is the size of the second dimension
|
Indices should be in ``[0, ..., num_choices]`` where `num_choices` is the size of the second dimension
|
||||||
of the input tensors. (see `input_ids` above)
|
of the input tensors. (see `input_ids` above)
|
||||||
|
|
||||||
Outputs: `Tuple` comprising various elements depending on the configuration (config) and inputs:
|
Return:
|
||||||
**lm_loss**: (`optional`, returned when ``lm_labels`` is provided) ``torch.FloatTensor`` of shape ``(1,)``:
|
:obj:`tuple(torch.FloatTensor)` comprising various elements depending on the configuration (:obj:`~transformers.GPT2Config`) and inputs:
|
||||||
|
lm_loss (:obj:`torch.FloatTensor` of shape :obj:`(1,)`, `optional`, returned when ``lm_labels`` is provided):
|
||||||
Language modeling loss.
|
Language modeling loss.
|
||||||
**mc_loss**: (`optional`, returned when ``multiple_choice_labels`` is provided) ``torch.FloatTensor`` of shape ``(1,)``:
|
mc_loss (:obj:`torch.FloatTensor` of shape :obj:`(1,)`, `optional`, returned when :obj:`multiple_choice_labels` is provided):
|
||||||
Multiple choice classification loss.
|
Multiple choice classification loss.
|
||||||
**lm_prediction_scores**: ``torch.FloatTensor`` of shape ``(batch_size, num_choices, sequence_length, config.vocab_size)``
|
lm_prediction_scores (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, num_choices, sequence_length, config.vocab_size)`):
|
||||||
Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax).
|
Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax).
|
||||||
**mc_prediction_scores**: ``torch.FloatTensor`` of shape ``(batch_size, num_choices)``
|
mc_prediction_scores (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, num_choices)`):
|
||||||
Prediction scores of the multiplechoice classification head (scores for each choice before SoftMax).
|
Prediction scores of the multiple choice classification head (scores for each choice before SoftMax).
|
||||||
**past**:
|
past (:obj:`List[torch.FloatTensor]` of length :obj:`config.n_layers` with each tensor of shape :obj:`(2, batch_size, num_heads, sequence_length, embed_size_per_head)`):
|
||||||
list of ``torch.FloatTensor`` (one for each layer) of shape ``(2, batch_size, num_heads, sequence_length, embed_size_per_head)``:
|
Contains pre-computed hidden-states (key and values in the attention blocks).
|
||||||
that contains pre-computed hidden-states (key and values in the attention blocks).
|
|
||||||
Can be used (see `past` input) to speed up sequential decoding. The token ids which have their past given to this model
|
Can be used (see `past` input) to speed up sequential decoding. The token ids which have their past given to this model
|
||||||
should not be passed as input ids as they have already been computed.
|
should not be passed as input ids as they have already been computed.
|
||||||
**hidden_states**: (`optional`, returned when ``config.output_hidden_states=True``)
|
hidden_states (:obj:`tuple(torch.FloatTensor)`, `optional`, returned when ``config.output_hidden_states=True``):
|
||||||
list of ``torch.FloatTensor`` (one for the output of each layer + the output of the embeddings)
|
Tuple of :obj:`torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer)
|
||||||
of shape ``(batch_size, sequence_length, hidden_size)``:
|
of shape :obj:`(batch_size, sequence_length, hidden_size)`.
|
||||||
|
|
||||||
Hidden-states of the model at the output of each layer plus the initial embedding outputs.
|
Hidden-states of the model at the output of each layer plus the initial embedding outputs.
|
||||||
**attentions**: (`optional`, returned when ``config.output_attentions=True``)
|
attentions (:obj:`tuple(torch.FloatTensor)`, `optional`, returned when ``config.output_attentions=True``):
|
||||||
list of ``torch.FloatTensor`` (one for each layer) of shape ``(batch_size, num_heads, sequence_length, sequence_length)``:
|
Tuple of :obj:`torch.FloatTensor` (one for each layer) of shape
|
||||||
Attentions weights after the attention softmax, used to compute the weighted average in the self-attention heads.
|
:obj:`(batch_size, num_heads, sequence_length, sequence_length)`.
|
||||||
|
|
||||||
|
Attentions weights after the attention softmax, used to compute the weighted average in the self-attention
|
||||||
|
heads.
|
||||||
|
|
||||||
Examples::
|
Examples::
|
||||||
|
|
||||||
@@ -675,33 +715,7 @@ class GPT2DoubleHeadsModel(GPT2PreTrainedModel):
|
|||||||
outputs = model(input_ids, mc_token_ids=mc_token_ids)
|
outputs = model(input_ids, mc_token_ids=mc_token_ids)
|
||||||
lm_prediction_scores, mc_prediction_scores = outputs[:2]
|
lm_prediction_scores, mc_prediction_scores = outputs[:2]
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, config):
|
|
||||||
super().__init__(config)
|
|
||||||
config.num_labels = 1
|
|
||||||
self.transformer = GPT2Model(config)
|
|
||||||
self.lm_head = nn.Linear(config.n_embd, config.vocab_size, bias=False)
|
|
||||||
self.multiple_choice_head = SequenceSummary(config)
|
|
||||||
|
|
||||||
self.init_weights()
|
|
||||||
|
|
||||||
def get_output_embeddings(self):
|
|
||||||
return self.lm_head
|
|
||||||
|
|
||||||
def forward(
|
|
||||||
self,
|
|
||||||
input_ids=None,
|
|
||||||
past=None,
|
|
||||||
attention_mask=None,
|
|
||||||
token_type_ids=None,
|
|
||||||
position_ids=None,
|
|
||||||
head_mask=None,
|
|
||||||
inputs_embeds=None,
|
|
||||||
mc_token_ids=None,
|
|
||||||
lm_labels=None,
|
|
||||||
mc_labels=None,
|
|
||||||
):
|
|
||||||
transformer_outputs = self.transformer(
|
transformer_outputs = self.transformer(
|
||||||
input_ids,
|
input_ids,
|
||||||
past=past,
|
past=past,
|
||||||
|
|||||||
Reference in New Issue
Block a user