Замораживающие слои в предварительно обученной модели Берта - PullRequest
0 голосов
/ 22 октября 2019

Pre Trained BERT Model

Как заморозить последние два слоя в вышеприведенной предварительно обученной модели (слои отсева и классификатора)? Так что, когда модель будет запущена, я получу плотный слой в качестве вывода.

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Я хотел бы указать вам определение BertForSequenceClassification , и вы можете легко избежать отсева и классификатора, используя:

model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
model.bert() # this will give you the dense layer output

Почему вы можете сделать выше? Если вы посмотрите на конструктор BertForSequenceClassification:

def __init__(self, config):
    super(BertForSequenceClassification, self).__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, self.config.num_labels)

    self.init_weights()

Как видите, вы просто хотите игнорировать слои dropout и classifier.

Еще одна вещь,замораживание слоя и удаление слоя это две разные вещи. В своем вопросе вы упомянули, что хотите заморозить слой классификатора, но замораживание слоя не поможет вам избежать этого. Замораживание означает, что вы не хотите тренировать слой.

2 голосов
/ 22 октября 2019

У вас уже есть плотный слой в качестве вывода (Linear).

Нет необходимости замораживать dropout, поскольку это только масштабирует активацию во время тренировки. Вы можете установить его в режим evaluation (по сути, этот слой потом ничего не будет делать), выдав:

model.dropout.eval()

Хотя он будет изменен, если вся модель установлена ​​на train через model.train()так что следите за этим.

Чтобы заморозить веса последнего слоя, вы можете ввести:

model.classifier.weight.requires_grad_(False)

(или bias, если вы хотите)

Если вы хотите изменить последний слой на другую фигуру вместо (768, 2), просто замените его другим модулем, например,

model.classifier = torch.nn.Linear(768, 10)

Для выходного тензора размера 10 (входная форма должна быть точно такой, как указанов модели, следовательно 768)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...