Весы Пирча не обновляются.. иногда

#pytorch

Вопрос:

Не знаю, что вызывает это, но иногда я начинаю тренировать свою нейронную сеть, и ни один из моих весов не обновляется. Это происходит, возможно, 4 из 5 раз, когда я инициализирую свой скрипт. В другой 1 раз он обновляет все, как ожидалось, обучает и прогнозирует, как ожидалось. У кого-нибудь есть какие-нибудь идеи, почему это происходит? Началось с того, что я изменил свою функцию потерь, если это уместно. Вот основная часть моего цикла обучения, дайте мне знать любой другой соответствующий код, который я должен включить.

 def train(model, train_loader, test_loader, test_data, full_test, args, epochs, early_stop=5):
    t0 = time()
    optimizer = Adam(model.parameters(), lr=args.lr)
    lr_decay = lr_scheduler.ExponentialLR(optimizer, gamma=args.lr_decay)
    best_val_acc, best_mae = 0, 500
    for epoch in range(epochs):
        model.train()
        ti = time()
        training_loss = 0.0
        for i, (x, y) in enumerate(train_loader):
            x, y = Variable(x.cuda()), Variable(y.cuda())
            y_pred = model(x, y)
            loss = mae_loss(y, y_pred)   rmse_loss(y, y_pred)
            loss.backward()
            training_loss  = loss.detach() * x.size(0)
            optimizer.step()
            optimizer.zero_grad()
        lr_decay.step()
 

Ответ №1:

Я считаю, что, безусловно, наиболее вероятная проблема заключается в том, что ваша функция потерь возвращает что-то неправильное. Попробуйте распечатать первые несколько потерь, чтобы увидеть, что это такое, и убедиться, что они соответствуют разумным и правильным типам данных и форме. Одна из возможных причин, по которой веса не обновляются, если ваши потери кажутся нормальными, заключается в том, что скорость обучения слишком низка для ваших потерь, и веса меняются на такую небольшую величину, что они либо округляются, либо не видны.

Комментарии:

1. Спасибо вам за это. Я взглянул на свою потерю, и, похоже, все работает так, как задумывалось. Я попробую изменить скорость обучения, чтобы посмотреть, влияет ли это на что-нибудь, хотя объясняет ли это, почему время от времени все работает так, как ожидалось?

2. В дополнение к повышению скорости обучения, вы можете попробовать возиться с инициализацией нейронной сети. Скорость обучения, безусловно, может объяснить, почему она иногда работает так, как ожидалось, но это, вероятно, лучше всего исправить, изменив имо инициализации (но, возможно, у кого-то другого есть лучшие теоретические аргументы для решения проблемы). Отдельно отметим, каков последний слой вашей нейронной сети? У вас есть функция активации на нем?

3. Последний слой-это просто линейный(256, 1) с РеЛЮ

4. Я думаю, что ваша проблема на самом деле, скорее всего, будет «умирающим РеЛУ». Это может быть решено за счет меньшей скорости обучения (что делает оптимизацию менее вероятной для части ReLU с плоским градиентом). Если это не сработает, вы можете переключиться на другую функцию активации (во всей вашей сети, а не только на последнем уровне). Кроме того, если ваши цели когда-либо будут отрицательными, вы, вероятно, захотите удалить ReLU на последнем слое (поскольку ReLU может быть только положительным). Если вы не хотите ограничивать вывод, конечный слой обычно является просто линейным слоем.

5. Кроме того, просто какая-то странная вещь, которая, вероятно, не имеет прямого отношения к делу. Ваша модель, похоже, принимает x и y. Я не знаю точно, что вы делаете, но вы намеревались ввести цель в модель?