Зачем нам нужна функция init_weight в предварительно обученной модели BERT в Huggingface Transformers? - PullRequest
0 голосов
/ 27 мая 2020

В коде трансформаторов Hugginface есть много моделей тонкой настройки, имеющих функцию init_weight. Например ( здесь ), наконец-то есть функция init_weight.

class BertForSequenceClassification(BertPreTrainedModel):
    def __init__(self, config):
        super().__init__(config)
        self.num_labels = config.num_labels

        self.bert = BertModel(config)
        self.dropout = nn.Dropout(config.hidden_dropout_prob)
        self.classifier = nn.Linear(config.hidden_size, config.num_labels)

        self.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, BertLayerNorm):
        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_()

Мой вопрос: Если мы загружаем предварительно обученную модель, зачем нам нужно инициализировать вес для каждого модуля?

Думаю, я что-то не понимаю здесь.

Ответы [ 3 ]

0 голосов
/ 01 июня 2020

Посмотрите код для .from_pretrained(). На самом деле происходит примерно следующее:

  • найти правильный класс базовой модели для инициализации
  • инициализировать этот класс псевдослучайной инициализацией (используя функцию _init_weights, которую вы упомянули )
  • найти файл с предварительно обученными весами
  • перезаписать веса модели, которую мы только что создали, с предварительно обученными весами, где применимо

Это гарантирует, что слои не были предварительно обученный (например, в некоторых случаях последний уровень классификации) сделать инициализировать в _init_weights, но не переопределить.

0 голосов
/ 18 июня 2020

Итак, при использовании библиотеки трансформаторов мне нужно вызывать init_weights ()

Я имею в виду, достаточно ли приведенного ниже кода?

class SentimentClassifier(nn.Module):
def __init__(self, num_classes):
    super(SentimentClassifier, self).__init__()
    self.bert_layer = BertModel.from_pretrained('bert-base-uncased')

    self.cls_layer = nn.Linear(768, num_classes)


def forward().....
0 голосов
/ 28 мая 2020

BertPreTrainedModel - это абстрактный класс, если вы проверите, и ошибка: BertPreTrainedModel класс не имеет конструктора, даже если он даже подумал, что он вызывается, вы можете нарядить этот код с PR, но убедитесь, что вы создали выпуск первый.

...