• CVAE


    import torch
    import torch.nn as nn
    from sklearn.preprocessing import LabelBinarizer
    from torch.nn import functional as F
    
    # In[4]
    class TextRNN(nn.Module):
        def __init__(self, 
                     input_size = 256, 
                     hidden_size = 128,
                     output_size = 768,
                     n_layers = 2,
                     dropout =  0.5,
                     args = None
                     ):
            super(TextRNN, self).__init__()
            self.rnn = nn.LSTM(input_size = input_size, 
                               hidden_size = hidden_size, 
                               num_layers = n_layers, 
                               bidirectional = True, 
                               batch_first = True, 
                               dropout = dropout)
    
            self.fc = nn.Linear(hidden_size*2, output_size)     # 双向RNN,且arg1, arg2
            self.dropout = nn.Dropout(dropout) 
    
        def forward(self, input_ids):
            # [8, 80, 300] 
            arg_out = self.dropout(input_ids)
            # out: [batch, seq_len, hidden_dim * 2]
            # hideen: [batch, num_layers * 2, hidden_dim]
            # cell/c: [batch, num_layers * 2, hidden_dim]
            arg_out, (_, _) = self.rnn(arg_out)                                
    
            out = self.fc(arg_out)                                         # [8, 2]   
    
            return out
    
    # In[1]
    class CVAEModel(nn.Module):
        def __init__(self, 
                    input_size=256,
                    hidden_size=256,
                    output_size=768
                    ):
            super(CVAEModel, self).__init__()
    
            # [8, 256, 768]
            self.rnn01 = TextRNN(input_size=input_size, hidden_size = 128, output_size = 768)
            self.rnn02 = TextRNN(input_size=input_size, hidden_size = 128, output_size = 768)
            # 768 -> 256
            self.fc11 = nn.Linear(hidden_size, hidden_size // 2)
            self.fc12 = nn.Linear(hidden_size, hidden_size // 2)
    
            self.fc21 = nn.Linear(hidden_size // 2, hidden_size) 
            self.fc22 = nn.Linear(hidden_size, hidden_size) 
    
            self.layernorm = nn.LayerNorm(hidden_size)
            self.lb = LabelBinarizer()
        
        # 将标签进行one-hot编码
        def to_categrical(self, y):
            device = torch.device('cuda:1' if torch.cuda.is_available() else 'cpu')
            y_n = y.cpu().detach()
            self.lb.fit(list(range(0, 2)))
            y_one_hot = self.lb.transform(y_n)
            y_one_hot = torch.FloatTensor(y_one_hot).to(device)
            return y_one_hot
    
        def encode(self, x, y=None, Training=False):
            if Training:
                con = x
                # y_c = self.to_categrical(y)
                # y_c = y_c.unsqueeze(1)
                # # 输入样本和标签y的one-hot向量连接
                # con = con + y_c
                out = self.rnn01(con)
                return F.relu(self.fc11(out)), F.relu(self.fc12(out))
            else:
                return F.relu(self.rnn01(x))
            
        # 再参数化
        def reparameterize(self, mu, logvar):
            std = torch.exp(0.5 * logvar)
            eps = torch.randn_like(std)
            return eps.mul(std).add_(mu)
    
        def decode(self, z, y=None, Training=False):   
            con = z
            y_c = self.to_categrical(y)
            y_c = y_c.unsqueeze(1)
            con = con + y_c
            out = self.fc21(con)
            out = self.rnn02(out)  # 在这修改
            return F.relu(out)
            
    
        @classmethod
        def loss_function(cls, recon_x, x, mu, logvar):
            bz = x.shape[0]
            # print(recon_x.shape, x.shape)
            # recon_x, x = recon_x.view(bz, -1), x.view(-1)
            BCE = nn.MSELoss()(recon_x, x)
            # BCE = nn.CrossEntropyLoss(recon_x, x)
            # see Appendix B from VAE paper:
            # Kingma and Welling. Auto-Encoding Variational Bayes. ICLR, 2014
            # https://arxiv.org/abs/1312.6114
            # 0.5 * sum(1 + log(sigma^2) - mu^2 - sigma^2)
            KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
            return BCE + KLD
    
        def forward(self, x, y=None, Training=False):   
            # 训练 CVAE
            if Training:
                # Encode 
                mu, logvar = self.encode(x, y, Training)
                # 再参数化
                z = self.reparameterize(mu, logvar)
                # Decode
                out = self.decode(z, y, Training)
                
                return out, mu, logvar
            else:
                out = self.encode(x)
                return out
    
    
    # coding=utf-8
    # Copyright 2018 The Google AI Language Team Authors and The HuggingFace Inc. team.
    # Copyright (c) 2018, NVIDIA CORPORATION.  All rights reserved.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    """PyTorch RoBERTa model. """
    
    import math
    import warnings
    
    import torch
    import torch.nn as nn
    from torch.nn import CrossEntropyLoss, MSELoss
    
    from transformers.activations import ACT2FN, gelu
    from transformers.configuration_roberta import RobertaConfig
    from transformers.file_utils import (
        add_code_sample_docstrings,
        add_start_docstrings,
        add_start_docstrings_to_callable,
        replace_return_docstrings,
    )
    from transformers.modeling_outputs import (
        BaseModelOutput,
        BaseModelOutputWithPooling,
        CausalLMOutput,
        MaskedLMOutput,
        MultipleChoiceModelOutput,
        QuestionAnsweringModelOutput,
        SequenceClassifierOutput,
        TokenClassifierOutput,
    )
    from transformers.modeling_utils import (
        PreTrainedModel,
        apply_chunking_to_forward,
        find_pruneable_heads_and_indices,
        prune_linear_layer,
    )
    
    from .CVAEModel import CVAEModel
    from .Attention import AttentionInArgs
    from .GATModel import GAT
    
    import logging
    
    logger = logging.getLogger(__name__)
    
    _CONFIG_FOR_DOC = "RobertaConfig"
    _TOKENIZER_FOR_DOC = "RobertaTokenizer"
    
    ROBERTA_PRETRAINED_MODEL_ARCHIVE_LIST = [
        "roberta-base",
        "roberta-large",
        "roberta-large-mnli",
        "distilroberta-base",
        "roberta-base-openai-detector",
        "roberta-large-openai-detector",
        # See all RoBERTa models at https://huggingface.co/models?filter=roberta
    ]
    
    
    class RobertaEmbeddings(nn.Module):
        """
        Same as BertEmbeddings with a tiny tweak for positional embeddings indexing.
        """
    
        # Copied from transformers.modeling_bert.BertEmbeddings.__init__
        def __init__(self, config):
            super().__init__()
            self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id)
            self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size)
            self.token_type_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size)
    
            # self.LayerNorm is not snake-cased to stick with TensorFlow model variable name and be able to load
            # any TensorFlow checkpoint file
            self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
            self.dropout = nn.Dropout(config.hidden_dropout_prob)
    
            # position_ids (1, len position emb) is contiguous in memory and exported when serialized
            self.register_buffer("position_ids", torch.arange(config.max_position_embeddings).expand((1, -1)))
    
            # End copy
            self.padding_idx = config.pad_token_id
            self.position_embeddings = nn.Embedding(
                config.max_position_embeddings, config.hidden_size, padding_idx=self.padding_idx
            )
    
        def forward(self, input_ids=None, token_type_ids=None, position_ids=None, inputs_embeds=None):
            if position_ids is None:
                if input_ids is not None:
                    # Create the position ids from the input token ids. Any padded tokens remain padded.
                    position_ids = create_position_ids_from_input_ids(input_ids, self.padding_idx).to(input_ids.device)
                else:
                    position_ids = self.create_position_ids_from_inputs_embeds(inputs_embeds)
    
            # Copied from transformers.modeling_bert.BertEmbeddings.forward
            if input_ids is not None:
                input_shape = input_ids.size()
            else:
                input_shape = inputs_embeds.size()[:-1]
    
            seq_length = input_shape[1]
    
            if position_ids is None:
                position_ids = self.position_ids[:, :seq_length]
    
            if token_type_ids is None:
                token_type_ids = torch.zeros(input_shape, dtype=torch.long, device=self.position_ids.device)
    
            if inputs_embeds is None:
                inputs_embeds = self.word_embeddings(input_ids)
            position_embeddings = self.position_embeddings(position_ids)
            token_type_embeddings = self.token_type_embeddings(token_type_ids)
    
            embeddings = inputs_embeds + position_embeddings + token_type_embeddings
            embeddings = self.LayerNorm(embeddings)
            embeddings = self.dropout(embeddings)
            return embeddings
    
        def create_position_ids_from_inputs_embeds(self, inputs_embeds):
            """We are provided embeddings directly. We cannot infer which are padded so just generate
            sequential position ids.
    
            :param torch.Tensor inputs_embeds:
            :return torch.Tensor:
            """
            input_shape = inputs_embeds.size()[:-1]
            sequence_length = input_shape[1]
    
            position_ids = torch.arange(
                self.padding_idx + 1, sequence_length + self.padding_idx + 1, dtype=torch.long, device=inputs_embeds.device
            )
            return position_ids.unsqueeze(0).expand(input_shape)
    
    
    # Copied from transformers.modeling_bert.BertSelfAttention with Bert->Roberta
    class RobertaSelfAttention(nn.Module):
        def __init__(self, config):
            super().__init__()
            if config.hidden_size % config.num_attention_heads != 0 and not hasattr(config, "embedding_size"):
                raise ValueError(
                    "The hidden size (%d) is not a multiple of the number of attention "
                    "heads (%d)" % (config.hidden_size, config.num_attention_heads)
                )
    
            self.num_attention_heads = config.num_attention_heads
            self.attention_head_size = int(config.hidden_size / config.num_attention_heads)
            self.all_head_size = self.num_attention_heads * self.attention_head_size
    
            self.query = nn.Linear(config.hidden_size, self.all_head_size)
            self.key = nn.Linear(config.hidden_size, self.all_head_size)
            self.value = nn.Linear(config.hidden_size, self.all_head_size)
    
            self.dropout = nn.Dropout(config.attention_probs_dropout_prob)
    
        def transpose_for_scores(self, x):
            new_x_shape = x.size()[:-1] + (self.num_attention_heads, self.attention_head_size)
            x = x.view(*new_x_shape)
            return x.permute(0, 2, 1, 3)
    
        def forward(
            self,
            hidden_states,
            attention_mask=None,
            head_mask=None,
            encoder_hidden_states=None,
            encoder_attention_mask=None,
            output_attentions=False,
        ):
            mixed_query_layer = self.query(hidden_states)
    
            # If this is instantiated as a cross-attention module, the keys
            # and values come from an encoder; the attention mask needs to be
            # such that the encoder's padding tokens are not attended to.
            if encoder_hidden_states is not None:
                mixed_key_layer = self.key(encoder_hidden_states)
                mixed_value_layer = self.value(encoder_hidden_states)
                attention_mask = encoder_attention_mask
            else:
                mixed_key_layer = self.key(hidden_states)
                mixed_value_layer = self.value(hidden_states)
    
            query_layer = self.transpose_for_scores(mixed_query_layer)
            key_layer = self.transpose_for_scores(mixed_key_layer)
            value_layer = self.transpose_for_scores(mixed_value_layer)
    
            # Take the dot product between "query" and "key" to get the raw attention scores.
            attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2))
            attention_scores = attention_scores / math.sqrt(self.attention_head_size)
            if attention_mask is not None:
                # Apply the attention mask is (precomputed for all layers in RobertaModel forward() function)
                attention_scores = attention_scores + attention_mask
    
            # Normalize the attention scores to probabilities.
            attention_probs = nn.Softmax(dim=-1)(attention_scores)
    
            # This is actually dropping out entire tokens to attend to, which might
            # seem a bit unusual, but is taken from the original Transformer paper.
            attention_probs = self.dropout(attention_probs)
    
            # Mask heads if we want to
            if head_mask is not None:
                attention_probs = attention_probs * head_mask
    
            context_layer = torch.matmul(attention_probs, value_layer)
    
            context_layer = context_layer.permute(0, 2, 1, 3).contiguous()
            new_context_layer_shape = context_layer.size()[:-2] + (self.all_head_size,)
            context_layer = context_layer.view(*new_context_layer_shape)
    
            outputs = (context_layer, attention_probs) if output_attentions else (context_layer,)
            return outputs
    
    
    # Copied from transformers.modeling_bert.BertSelfOutput
    class RobertaSelfOutput(nn.Module):
        def __init__(self, config):
            super().__init__()
            self.dense = nn.Linear(config.hidden_size, config.hidden_size)
            self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
            self.dropout = nn.Dropout(config.hidden_dropout_prob)
    
        def forward(self, hidden_states, input_tensor):
            hidden_states = self.dense(hidden_states)
            hidden_states = self.dropout(hidden_states)
            hidden_states = self.LayerNorm(hidden_states + input_tensor)
            return hidden_states
    
    
    # Copied from transformers.modeling_bert.BertAttention with Bert->Roberta
    class RobertaAttention(nn.Module):
        def __init__(self, config):
            super().__init__()
            self.self = RobertaSelfAttention(config)
            self.output = RobertaSelfOutput(config)
            self.pruned_heads = set()
    
        def prune_heads(self, heads):
            if len(heads) == 0:
                return
            heads, index = find_pruneable_heads_and_indices(
                heads, self.self.num_attention_heads, self.self.attention_head_size, self.pruned_heads
            )
    
            # Prune linear layers
            self.self.query = prune_linear_layer(self.self.query, index)
            self.self.key = prune_linear_layer(self.self.key, index)
            self.self.value = prune_linear_layer(self.self.value, index)
            self.output.dense = prune_linear_layer(self.output.dense, index, dim=1)
    
            # Update hyper params and store pruned heads
            self.self.num_attention_heads = self.self.num_attention_heads - len(heads)
            self.self.all_head_size = self.self.attention_head_size * self.self.num_attention_heads
            self.pruned_heads = self.pruned_heads.union(heads)
    
        def forward(
            self,
            hidden_states,
            attention_mask=None,
            head_mask=None,
            encoder_hidden_states=None,
            encoder_attention_mask=None,
            output_attentions=False,
        ):
            self_outputs = self.self(
                hidden_states,
                attention_mask,
                head_mask,
                encoder_hidden_states,
                encoder_attention_mask,
                output_attentions,
            )
            attention_output = self.output(self_outputs[0], hidden_states)
            outputs = (attention_output,) + self_outputs[1:]  # add attentions if we output them
            return outputs
    
    
    # Copied from transformers.modeling_bert.BertIntermediate
    class RobertaIntermediate(nn.Module):
        def __init__(self, config):
            super().__init__()
            self.dense = nn.Linear(config.hidden_size, config.intermediate_size)
            if isinstance(config.hidden_act, str):
                self.intermediate_act_fn = ACT2FN[config.hidden_act]
            else:
                self.intermediate_act_fn = config.hidden_act
    
        def forward(self, hidden_states):
            hidden_states = self.dense(hidden_states)
            hidden_states = self.intermediate_act_fn(hidden_states)
            return hidden_states
    
    
    # Copied from transformers.modeling_bert.BertOutput
    class RobertaOutput(nn.Module):
        def __init__(self, config):
            super().__init__()
            self.dense = nn.Linear(config.intermediate_size, config.hidden_size)
            self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
            self.dropout = nn.Dropout(config.hidden_dropout_prob)
    
        def forward(self, hidden_states, input_tensor):
            hidden_states = self.dense(hidden_states)
            hidden_states = self.dropout(hidden_states)
            hidden_states = self.LayerNorm(hidden_states + input_tensor)
            return hidden_states
    
    
    # Copied from transformers.modeling_bert.BertLayer with Bert->Roberta
    class RobertaLayer(nn.Module):
        def __init__(self, config):
            super().__init__()
            self.chunk_size_feed_forward = config.chunk_size_feed_forward
            self.seq_len_dim = 1
            self.attention = RobertaAttention(config)
            self.is_decoder = config.is_decoder
            self.add_cross_attention = config.add_cross_attention
            if self.add_cross_attention:
                assert self.is_decoder, f"{self} should be used as a decoder model if cross attention is added"
                self.crossattention = RobertaAttention(config)
            self.intermediate = RobertaIntermediate(config)
            self.output = RobertaOutput(config)
    
        def forward(
            self,
            hidden_states,
            attention_mask=None,
            head_mask=None,
            encoder_hidden_states=None,
            encoder_attention_mask=None,
            output_attentions=False,
        ):
            self_attention_outputs = self.attention(
                hidden_states,
                attention_mask,
                head_mask,
                output_attentions=output_attentions,
            )
            attention_output = self_attention_outputs[0]
            outputs = self_attention_outputs[1:]  # add self attentions if we output attention weights
    
            if self.is_decoder and encoder_hidden_states is not None:
                assert hasattr(
                    self, "crossattention"
                ), f"If `encoder_hidden_states` are passed, {self} has to be instantiated with cross-attention layers by setting `config.add_cross_attention=True`"
                cross_attention_outputs = self.crossattention(
                    attention_output,
                    attention_mask,
                    head_mask,
                    encoder_hidden_states,
                    encoder_attention_mask,
                    output_attentions,
                )
                attention_output = cross_attention_outputs[0]
                outputs = outputs + cross_attention_outputs[1:]  # add cross attentions if we output attention weights
    
            layer_output = apply_chunking_to_forward(
                self.feed_forward_chunk, self.chunk_size_feed_forward, self.seq_len_dim, attention_output
            )
            outputs = (layer_output,) + outputs
            return outputs
    
        def feed_forward_chunk(self, attention_output):
            intermediate_output = self.intermediate(attention_output)
            layer_output = self.output(intermediate_output, attention_output)
            return layer_output
    
    
    # Copied from transformers.modeling_bert.BertEncoder with Bert->Roberta
    class RobertaEncoder(nn.Module):
        def __init__(self, config):
            super().__init__()
            self.config = config
            self.layer = nn.ModuleList([RobertaLayer(config) for _ in range(config.num_hidden_layers)])
    
        def forward(
            self,
            hidden_states,
            attention_mask=None,
            head_mask=None,
            encoder_hidden_states=None,
            encoder_attention_mask=None,
            output_attentions=False,
            output_hidden_states=False,
            return_dict=False,
        ):
            all_hidden_states = () if output_hidden_states else None
            all_attentions = () if output_attentions else None
            for i, layer_module in enumerate(self.layer):
                if output_hidden_states:
                    all_hidden_states = all_hidden_states + (hidden_states,)
    
                layer_head_mask = head_mask[i] if head_mask is not None else None
    
                if getattr(self.config, "gradient_checkpointing", False):
    
                    def create_custom_forward(module):
                        def custom_forward(*inputs):
                            return module(*inputs, output_attentions)
    
                        return custom_forward
    
                    layer_outputs = torch.utils.checkpoint.checkpoint(
                        create_custom_forward(layer_module),
                        hidden_states,
                        attention_mask,
                        layer_head_mask,
                        encoder_hidden_states,
                        encoder_attention_mask,
                    )
                else:
                    layer_outputs = layer_module(
                        hidden_states,
                        attention_mask,
                        layer_head_mask,
                        encoder_hidden_states,
                        encoder_attention_mask,
                        output_attentions,
                    )
                hidden_states = layer_outputs[0]
                if output_attentions:
                    all_attentions = all_attentions + (layer_outputs[1],)
    
            if output_hidden_states:
                all_hidden_states = all_hidden_states + (hidden_states,)
    
            if not return_dict:
                return tuple(v for v in [hidden_states, all_hidden_states, all_attentions] if v is not None)
            return BaseModelOutput(
                last_hidden_state=hidden_states, hidden_states=all_hidden_states, attentions=all_attentions
            )
    
    
    # Copied from transformers.modeling_bert.BertPooler
    class RobertaPooler(nn.Module):
        def __init__(self, config):
            super().__init__()
            self.dense = nn.Linear(config.hidden_size, config.hidden_size)
            self.activation = nn.Tanh()
    
        def forward(self, hidden_states):
            # We "pool" the model by simply taking the hidden state corresponding
            # to the first token.
            first_token_tensor = hidden_states[:, 0]
            pooled_output = self.dense(first_token_tensor)
            pooled_output = self.activation(pooled_output)
            return pooled_output
    
    
    class RobertaPreTrainedModel(PreTrainedModel):
        """An abstract class to handle weights initialization and
        a simple interface for downloading and loading pretrained models.
        """
    
        config_class = RobertaConfig
        base_model_prefix = "roberta"
    
        # Copied from transformers.modeling_bert.BertPreTrainedModel._init_weights
        def _init_weights(self, module):
            """ Initialize the weights """
            if isinstance(module, (nn.Linear, nn.Embedding)):
                # Slightly different from the TF version which uses truncated_normal for initialization
                # cf https://github.com/pytorch/pytorch/pull/5617
                module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
            elif isinstance(module, nn.LayerNorm):
                module.bias.data.zero_()
                module.weight.data.fill_(1.0)
            if isinstance(module, nn.Linear) and module.bias is not None:
                module.bias.data.zero_()
    
    
    ROBERTA_START_DOCSTRING = r"""
    
        This model inherits from :class:`~transformers.PreTrainedModel`. Check the superclass documentation for the generic
        methods the library implements for all its model (such as downloading or saving, resizing the input embeddings,
        pruning heads etc.)
    
        This model is also a PyTorch `torch.nn.Module <https://pytorch.org/docs/stable/nn.html#torch.nn.Module>`__ subclass.
        Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general
        usage and behavior.
    
        Parameters:
            config (:class:`~transformers.RobertaConfig`): Model configuration class with all the parameters of the
                model. Initializing with a config file does not load the weights associated with the model, only the configuration.
                Check out the :meth:`~transformers.PreTrainedModel.from_pretrained` method to load the model weights.
    """
    
    ROBERTA_INPUTS_DOCSTRING = r"""
        Args:
            input_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`):
                Indices of input sequence tokens in the vocabulary.
    
                Indices can be obtained using :class:`~transformers.RobertaTokenizer`.
                See :meth:`transformers.PreTrainedTokenizer.encode` and
                :meth:`transformers.PreTrainedTokenizer.__call__` for details.
    
                `What are input IDs? <../glossary.html#input-ids>`__
            attention_mask (:obj:`torch.FloatTensor` of shape :obj:`({0})`, `optional`):
                Mask to avoid performing attention on padding token indices.
                Mask values selected in ``[0, 1]``:
    
                - 1 for tokens that are **not masked**,
                - 0 for tokens that are **masked**.
    
                `What are attention masks? <../glossary.html#attention-mask>`__
            token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
                Segment token indices to indicate first and second portions of the inputs.
                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:`({0})`, `optional`):
                Indices of positions of each input sequence tokens in the position embeddings.
                Selected in the range ``[0, config.max_position_embeddings - 1]``.
    
                `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`):
                Mask to nullify selected heads of the self-attention modules.
                Mask values selected in ``[0, 1]``:
    
                - 1 indicates the head is **not masked**,
                - 0 indicates the head is **masked**.
    
            inputs_embeds (:obj:`torch.FloatTensor` of shape :obj:`({0}, hidden_size)`, `optional`):
                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 :obj:`input_ids` indices into associated
                vectors than the model's internal embedding lookup matrix.
            output_attentions (:obj:`bool`, `optional`):
                Whether or not to return the attentions tensors of all attention layers. See ``attentions`` under returned
                tensors for more detail.
            output_hidden_states (:obj:`bool`, `optional`):
                Whether or not to return the hidden states of all layers. See ``hidden_states`` under returned tensors for
                more detail.
            return_dict (:obj:`bool`, `optional`):
                Whether or not to return a :class:`~transformers.file_utils.ModelOutput` instead of a plain tuple.
    """
    
    
    @add_start_docstrings(
        "The bare RoBERTa Model transformer outputting raw hidden-states without any specific head on top.",
        ROBERTA_START_DOCSTRING,
    )
    class RobertaModel(RobertaPreTrainedModel):
        """
    
        The model can behave as an encoder (with only self-attention) as well
        as a decoder, in which case a layer of cross-attention is added between
        the self-attention layers, following the architecture described in `Attention is all you need`_ by Ashish Vaswani,
        Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser and Illia Polosukhin.
    
        To behave as an decoder the model needs to be initialized with the
        :obj:`is_decoder` argument of the configuration set to :obj:`True`.
        To be used in a Seq2Seq model, the model needs to initialized with both :obj:`is_decoder`
        argument and :obj:`add_cross_attention` set to :obj:`True`; an
        :obj:`encoder_hidden_states` is then expected as an input to the forward pass.
    
        .. _`Attention is all you need`:
            https://arxiv.org/abs/1706.03762
    
        """
    
        authorized_missing_keys = [r"position_ids"]
    
        # Copied from transformers.modeling_bert.BertModel.__init__ with Bert->Roberta
        def __init__(self, config, add_pooling_layer=True):
            super().__init__(config)
            self.config = config
    
            self.embeddings = RobertaEmbeddings(config)
            self.encoder = RobertaEncoder(config)
    
            self.pooler = RobertaPooler(config) if add_pooling_layer else None
    
            self.init_weights()
    
        def get_input_embeddings(self):
            return self.embeddings.word_embeddings
    
        def set_input_embeddings(self, value):
            self.embeddings.word_embeddings = value
    
        def _prune_heads(self, heads_to_prune):
            """Prunes heads of the model.
            heads_to_prune: dict of {layer_num: list of heads to prune in this layer}
            See base class PreTrainedModel
            """
            for layer, heads in heads_to_prune.items():
                self.encoder.layer[layer].attention.prune_heads(heads)
    
        @add_start_docstrings_to_callable(ROBERTA_INPUTS_DOCSTRING.format("(batch_size, sequence_length)"))
        @add_code_sample_docstrings(
            tokenizer_class=_TOKENIZER_FOR_DOC,
            checkpoint="roberta-base",
            output_type=BaseModelOutputWithPooling,
            config_class=_CONFIG_FOR_DOC,
        )
        # Copied from transformers.modeling_bert.BertModel.forward
        def forward(
            self,
            input_ids=None,
            attention_mask=None,
            token_type_ids=None,
            position_ids=None,
            head_mask=None,
            inputs_embeds=None,
            encoder_hidden_states=None,
            encoder_attention_mask=None,
            output_attentions=None,
            output_hidden_states=None,
            return_dict=None,
        ):
            r"""
            encoder_hidden_states  (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length, hidden_size)`, `optional`):
                Sequence of hidden-states at the output of the last layer of the encoder. Used in the cross-attention
                if the model is configured as a decoder.
            encoder_attention_mask (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
                Mask to avoid performing attention on the padding token indices of the encoder input. This mask
                is used in the cross-attention if the model is configured as a decoder.
                Mask values selected in ``[0, 1]``:
                ``1`` for tokens that are NOT MASKED, ``0`` for MASKED tokens.
            """
            output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
            output_hidden_states = (
                output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
            )
            return_dict = return_dict if return_dict is not None else self.config.use_return_dict
    
            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")
            elif input_ids is not None:
                input_shape = input_ids.size()
            elif inputs_embeds is not None:
                input_shape = inputs_embeds.size()[:-1]
            else:
                raise ValueError("You have to specify either input_ids or inputs_embeds")
    
            device = input_ids.device if input_ids is not None else inputs_embeds.device
    
            if attention_mask is None:
                attention_mask = torch.ones(input_shape, device=device)
            if token_type_ids is None:
                token_type_ids = torch.zeros(input_shape, dtype=torch.long, device=device)
    
            # We can provide a self-attention mask of dimensions [batch_size, from_seq_length, to_seq_length]
            # ourselves in which case we just need to make it broadcastable to all heads.
            extended_attention_mask: torch.Tensor = self.get_extended_attention_mask(attention_mask, input_shape, device)
    
            # If a 2D or 3D attention mask is provided for the cross-attention
            # we need to make broadcastable to [batch_size, num_heads, seq_length, seq_length]
            if self.config.is_decoder and encoder_hidden_states is not None:
                encoder_batch_size, encoder_sequence_length, _ = encoder_hidden_states.size()
                encoder_hidden_shape = (encoder_batch_size, encoder_sequence_length)
                if encoder_attention_mask is None:
                    encoder_attention_mask = torch.ones(encoder_hidden_shape, device=device)
                encoder_extended_attention_mask = self.invert_attention_mask(encoder_attention_mask)
            else:
                encoder_extended_attention_mask = None
    
            # 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
            # input head_mask has shape [num_heads] or [num_hidden_layers x num_heads]
            # and head_mask is converted to shape [num_hidden_layers x batch x num_heads x seq_length x seq_length]
            head_mask = self.get_head_mask(head_mask, self.config.num_hidden_layers)
    
            embedding_output = self.embeddings(
                input_ids=input_ids, position_ids=position_ids, token_type_ids=token_type_ids, inputs_embeds=inputs_embeds
            )
            encoder_outputs = self.encoder(
                embedding_output,
                attention_mask=extended_attention_mask,
                head_mask=head_mask,
                encoder_hidden_states=encoder_hidden_states,
                encoder_attention_mask=encoder_extended_attention_mask,
                output_attentions=output_attentions,
                output_hidden_states=output_hidden_states,
                return_dict=return_dict,
            )
            sequence_output = encoder_outputs[0]
            pooled_output = self.pooler(sequence_output) if self.pooler is not None else None
    
            if not return_dict:
                return (sequence_output, pooled_output) + encoder_outputs[1:]
    
            return BaseModelOutputWithPooling(
                last_hidden_state=sequence_output,
                pooler_output=pooled_output,
                hidden_states=encoder_outputs.hidden_states,
                attentions=encoder_outputs.attentions,
            )
    
    
    @add_start_docstrings(
        """RoBERTa Model with a `language modeling` head on top for CLM fine-tuning. """, ROBERTA_START_DOCSTRING
    )
    class RobertaForCausalLM(RobertaPreTrainedModel):
        authorized_missing_keys = [r"position_ids", r"predictions.decoder.bias"]
        authorized_unexpected_keys = [r"pooler"]
    
        def __init__(self, config):
            super().__init__(config)
    
            if not config.is_decoder:
                logger.warning("If you want to use `RobertaLMHeadModel` as a standalone, add `is_decoder=True.`")
    
            self.roberta = RobertaModel(config, add_pooling_layer=False)
            self.lm_head = RobertaLMHead(config)
    
            self.init_weights()
    
        def get_output_embeddings(self):
            return self.lm_head.decoder
    
        @add_start_docstrings_to_callable(ROBERTA_INPUTS_DOCSTRING.format("batch_size, sequence_length"))
        @replace_return_docstrings(output_type=CausalLMOutput, config_class=_CONFIG_FOR_DOC)
        def forward(
            self,
            input_ids=None,
            attention_mask=None,
            token_type_ids=None,
            position_ids=None,
            head_mask=None,
            inputs_embeds=None,
            encoder_hidden_states=None,
            encoder_attention_mask=None,
            labels=None,
            output_attentions=None,
            output_hidden_states=None,
            return_dict=None,
        ):
            r"""
            encoder_hidden_states  (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length, hidden_size)`, `optional`):
                Sequence of hidden-states at the output of the last layer of the encoder. Used in the cross-attention
                if the model is configured as a decoder.
            encoder_attention_mask (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
                Mask to avoid performing attention on the padding token indices of the encoder input. This mask
                is used in the cross-attention if the model is configured as a decoder.
                Mask values selected in ``[0, 1]``:
    
                - 1 for tokens that are **not masked**,
                - 0 for tokens that are **masked**.
    
            labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
                Labels for computing the left-to-right language modeling loss (next word prediction).
                Indices should be in ``[-100, 0, ..., config.vocab_size]`` (see ``input_ids`` docstring)
                Tokens with indices set to ``-100`` are ignored (masked), the loss is only computed for the tokens with
                labels in ``[0, ..., config.vocab_size]``
    
            Returns:
    
            Example::
    
                >>> from transformers import RobertaTokenizer, RobertaForCausalLM, RobertaConfig
                >>> import torch
    
                >>> tokenizer = RobertaTokenizer.from_pretrained('roberta-base')
                >>> config = RobertaConfig.from_pretrained("roberta-base", return_dict=True)
                >>> config.is_decoder = True
                >>> model = RobertaForCausalLM.from_pretrained('roberta-base', config=config)
    
                >>> inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
                >>> outputs = model(**inputs)
    
                >>> prediction_logits = outputs.logits
            """
            return_dict = return_dict if return_dict is not None else self.config.use_return_dict
    
            outputs = self.roberta(
                input_ids,
                attention_mask=attention_mask,
                token_type_ids=token_type_ids,
                position_ids=position_ids,
                head_mask=head_mask,
                inputs_embeds=inputs_embeds,
                encoder_hidden_states=encoder_hidden_states,
                encoder_attention_mask=encoder_attention_mask,
                output_attentions=output_attentions,
                output_hidden_states=output_hidden_states,
                return_dict=return_dict,
            )
    
            sequence_output = outputs[0]
            prediction_scores = self.lm_head(sequence_output)
    
            lm_loss = None
            if labels is not None:
                # we are doing next-token prediction; shift prediction scores and input ids by one
                shifted_prediction_scores = prediction_scores[:, :-1, :].contiguous()
                labels = labels[:, 1:].contiguous()
                loss_fct = CrossEntropyLoss()
                lm_loss = loss_fct(shifted_prediction_scores.view(-1, self.config.vocab_size), labels.view(-1))
    
            if not return_dict:
                output = (prediction_scores,) + outputs[2:]
                return ((lm_loss,) + output) if lm_loss is not None else output
    
            return CausalLMOutput(
                loss=lm_loss,
                logits=prediction_scores,
                hidden_states=outputs.hidden_states,
                attentions=outputs.attentions,
            )
    
        def prepare_inputs_for_generation(self, input_ids, attention_mask=None, **model_kwargs):
            input_shape = input_ids.shape
    
            # if model is used as a decoder in encoder-decoder model, the decoder attention mask is created on the fly
            if attention_mask is None:
                attention_mask = input_ids.new_ones(input_shape)
    
            return {"input_ids": input_ids, "attention_mask": attention_mask}
    
    
    @add_start_docstrings("""RoBERTa Model with a `language modeling` head on top. """, ROBERTA_START_DOCSTRING)
    class RobertaForMaskedLM(RobertaPreTrainedModel):
        authorized_missing_keys = [r"position_ids", r"predictions.decoder.bias"]
        authorized_unexpected_keys = [r"pooler"]
    
        def __init__(self, config):
            super().__init__(config)
    
            if config.is_decoder:
                logger.warning(
                    "If you want to use `RobertaForMaskedLM` make sure `config.is_decoder=False` for "
                    "bi-directional self-attention."
                )
    
            self.roberta = RobertaModel(config, add_pooling_layer=False)
            self.lm_head = RobertaLMHead(config)
    
            self.init_weights()
    
        def get_output_embeddings(self):
            return self.lm_head.decoder
    
        @add_start_docstrings_to_callable(ROBERTA_INPUTS_DOCSTRING.format("batch_size, sequence_length"))
        @add_code_sample_docstrings(
            tokenizer_class=_TOKENIZER_FOR_DOC,
            checkpoint="roberta-base",
            output_type=MaskedLMOutput,
            config_class=_CONFIG_FOR_DOC,
            mask="<mask>",
        )
        def forward(
            self,
            input_ids=None,
            attention_mask=None,
            token_type_ids=None,
            position_ids=None,
            head_mask=None,
            inputs_embeds=None,
            encoder_hidden_states=None,
            encoder_attention_mask=None,
            labels=None,
            output_attentions=None,
            output_hidden_states=None,
            return_dict=None,
            **kwargs
        ):
            r"""
            labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
                Labels for computing the masked language modeling loss.
                Indices should be in ``[-100, 0, ..., config.vocab_size]`` (see ``input_ids`` docstring)
                Tokens with indices set to ``-100`` are ignored (masked), the loss is only computed for the tokens with labels
                in ``[0, ..., config.vocab_size]``
            kwargs (:obj:`Dict[str, any]`, optional, defaults to `{}`):
                Used to hide legacy arguments that have been deprecated.
            """
            if "masked_lm_labels" in kwargs:
                warnings.warn(
                    "The `masked_lm_labels` argument is deprecated and will be removed in a future version, use `labels` instead.",
                    FutureWarning,
                )
                labels = kwargs.pop("masked_lm_labels")
            assert kwargs == {}, f"Unexpected keyword arguments: {list(kwargs.keys())}."
            return_dict = return_dict if return_dict is not None else self.config.use_return_dict
    
            outputs = self.roberta(
                input_ids,
                attention_mask=attention_mask,
                token_type_ids=token_type_ids,
                position_ids=position_ids,
                head_mask=head_mask,
                inputs_embeds=inputs_embeds,
                encoder_hidden_states=encoder_hidden_states,
                encoder_attention_mask=encoder_attention_mask,
                output_attentions=output_attentions,
                output_hidden_states=output_hidden_states,
                return_dict=return_dict,
            )
            sequence_output = outputs[0]
            prediction_scores = self.lm_head(sequence_output)
    
            masked_lm_loss = None
            if labels is not None:
                loss_fct = CrossEntropyLoss()
                masked_lm_loss = loss_fct(prediction_scores.view(-1, self.config.vocab_size), labels.view(-1))
    
            if not return_dict:
                output = (prediction_scores,) + outputs[2:]
                return ((masked_lm_loss,) + output) if masked_lm_loss is not None else output
    
            return MaskedLMOutput(
                loss=masked_lm_loss,
                logits=prediction_scores,
                hidden_states=outputs.hidden_states,
                attentions=outputs.attentions,
            )
    
    
    class RobertaLMHead(nn.Module):
        """Roberta Head for masked language modeling."""
    
        def __init__(self, config):
            super().__init__()
            self.dense = nn.Linear(config.hidden_size, config.hidden_size)
            self.layer_norm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
    
            self.decoder = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
            self.bias = nn.Parameter(torch.zeros(config.vocab_size))
    
            # Need a link between the two variables so that the bias is correctly resized with `resize_token_embeddings`
            self.decoder.bias = self.bias
    
        def forward(self, features, **kwargs):
            x = self.dense(features)
            x = gelu(x)
            x = self.layer_norm(x)
    
            # project back to size of vocabulary with bias
            x = self.decoder(x)
    
            return x
    
    
    class RobertaClassificationHead(nn.Module):
        """Head for sentence-level classification tasks."""
    
        def __init__(self, config):
            super().__init__()
            self.dense = nn.Linear(config.hidden_size, config.hidden_size)
            self.dropout = nn.Dropout(config.hidden_dropout_prob)
            self.out_proj = nn.Linear(config.hidden_size, config.num_labels)
    
        def forward(self, features, **kwargs):
            x = features[:, 0, :]  # take <s> token (equiv. to [CLS])
            x = self.dropout(x)
            x = self.dense(x)
            x = torch.tanh(x)
            x = self.dropout(x)
            x = self.out_proj(x)
            return x
    
    
    
    def create_position_ids_from_input_ids(input_ids, padding_idx):
        """Replace non-padding symbols with their position numbers. Position numbers begin at
        padding_idx+1. Padding symbols are ignored. This is modified from fairseq's
        `utils.make_positions`.
    
        :param torch.Tensor x:
        :return torch.Tensor:
        """
        # The series of casts and type-conversions here are carefully balanced to both work with ONNX export and XLA.
        mask = input_ids.ne(padding_idx).int()
        incremental_indices = torch.cumsum(mask, dim=1).type_as(mask) * mask
        return incremental_indices.long() + padding_idx
    
    
    
    @add_start_docstrings(
        """RoBERTa Model transformer with a sequence classification/regression head on top (a linear layer
        on top of the pooled output) e.g. for GLUE tasks. """,
        ROBERTA_START_DOCSTRING,
    )
    class RobertaPDTBModel(RobertaPreTrainedModel):
        authorized_missing_keys = [r"position_ids"]
    
        def __init__(self, config):
            super().__init__(config)
            self.num_labels = config.num_labels
    
            self.roberta = RobertaModel(config, add_pooling_layer=False)
            self.classifier = RobertaClassificationHead(config)
    
            self.laynorm = nn.LayerNorm(config.hidden_size)
    
            self.cvae = CVAEModel(config.hidden_size, config.hidden_size)
    
            self.init_weights()
    
        @add_start_docstrings_to_callable(ROBERTA_INPUTS_DOCSTRING.format("batch_size, sequence_length"))
        @add_code_sample_docstrings(
            tokenizer_class=_TOKENIZER_FOR_DOC,
            checkpoint="roberta-base",
            output_type=SequenceClassifierOutput,
            config_class=_CONFIG_FOR_DOC,
        )
        def forward(
            self,
            input_ids=None,
            attention_mask=None,
            token_type_ids=None,
            position_ids=None,
            head_mask=None,
            inputs_embeds=None,
            labels=None,
            output_attentions=None,
            output_hidden_states=None,
            return_dict=None,
            Training=False,
            do_cvae=0,              # 先做几次cvae
            args=None
        ):
            r"""
            labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size,)`, `optional`):
                Labels for computing the sequence classification/regression loss.
                Indices should be in :obj:`[0, ..., config.num_labels - 1]`.
                If :obj:`config.num_labels == 1` a regression loss is computed (Mean-Square loss),
                If :obj:`config.num_labels > 1` a classification loss is computed (Cross-Entropy).
            """
            return_dict = return_dict if return_dict is not None else self.config.use_return_dict
    
            outputs = self.roberta(
                input_ids,
                attention_mask=attention_mask,
                token_type_ids=token_type_ids,
                position_ids=position_ids,
                head_mask=head_mask,
                inputs_embeds=inputs_embeds,
                output_attentions=output_attentions,
                output_hidden_states=output_hidden_states,
                return_dict=return_dict,
            )
            sequence_output = outputs[0]
            
    
            # 在这修改代码
            sequence_output = self.laynorm(sequence_output)
    
            # logger.info('seq.shape: ' + str(sequence_output.shape))
            if do_cvae > 0:
                # 训练CVAE
                out, mu, logvar = self.cvae(x=sequence_output, y=labels, Training=True)
                # 原始数据+con
                y_c = self.cvae.to_categrical(labels)
                y_c = y_c.unsqueeze(1)
                # # 输入样本和标签y的one-hot向量连接
                con = sequence_output + y_c
                # cvae的loss,seq
                cvae_loss = CVAEModel.loss_function(recon_x=out, x=con, mu=mu, logvar=logvar)
                sequence_output = self.cvae(sequence_output)
            else:
                # 训练完毕,使用训练好的编码器
                sequence_output = self.cvae(sequence_output)
    
            logits = self.classifier(sequence_output)
            # logger.info('logits: ' + str(logits) + str(logits.shape))
            # logger.info('label: ' + str(labels) + str(labels.shape))
    
            loss = None
            if labels is not None:
                if self.num_labels == 1:
                    #  We are doing regression
                    loss_fct = MSELoss()
                    loss = loss_fct(logits.view(-1), labels.view(-1))
                else:
                    loss_fct = CrossEntropyLoss()
                    # [8, 2], [8]
                    loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1))
                    # 多任务?
                    if do_cvae > 0:
                        loss = loss + args.cvae_beta * cvae_loss
    
            if not return_dict:
                output = (logits,) + outputs[2:]
                return ((loss,) + output) if loss is not None else output
    
            return SequenceClassifierOutput(
                loss=loss,
                logits=logits,
                hidden_states=outputs.hidden_states,
                attentions=outputs.attentions,
            )
    
    
    
    
  • 相关阅读:
    当统计信息不准确时,CBO可能产生错误的执行计划,并在10053 trace中找到CBO出错的位置示例
    ruby class_eval的使用
    ruby修改TXT文件
    ruby格式化
    VIM常用命令集合
    Watir::IE.attach与IE7选项卡的设置关系
    ruby 连接mysql数据库
    AutoIT删除Internet临时文件
    watir学习之—如何遍历页面所有的超链接
    watir如何取到元素的css属性
  • 原文地址:https://www.cnblogs.com/douzujun/p/14660309.html
Copyright © 2020-2023  润新知