Просто наперед: я довольно новичок в мире машинного обучения и параллельных вычислений. Я приложу все усилия, чтобы использовать правильную терминологию, но дружественные исправления были бы весьма полезны.
Я пытался настроить гиперпараметры для Keras MLP (работающего поверх TensorFlow) с помощью sklearn's RandomizedSearchCV, завернуть мою модель в KerasClassifier в соответствии с многочисленными уроками. Для этого я пытался распараллелить этот процесс через встроенную систему RandomizedSearchCV. Это работало более или менее нормально, но потом, когда я начал использовать около 6 потоков, программа все еще работала, но я начинал получать потери NaN, которые приводили к ошибкам после завершения поиска.
Теперь, Я знаю, что есть кучка обычных подозреваемых для градиентных взрывов, но здесь было кое-что интересное: эта проблема исчезла, когда я уменьшил pre_dispatch
достаточно (в данном случае до n_jobs
вместо 2*n_jobs
).
Есть ли причина, по которой это могло бы произойти? Мои наборы данных довольно большие, но, похоже, что после начала поиска каждое задание использует только около 1-2% доступной памяти (также этот процент не изменяется при сокращении предварительно отправленных заданий?), И я ' у меня больше не возникает проблем с использованием памяти.
Во-вторых, есть ли более практичный пример, есть ли какой-нибудь простой способ заставить мой код сломаться в RandomSearchCV, как только возникнет потеря NaN? Это сэкономило бы некоторое время, а не позволило бы ему продолжаться до конца поиска - что, при полной реализации, вероятно, займет день или более - и затем выдаст ошибку. Я также думал об изменении error_score
на -1 или что-то. Будет ли это на самом деле лучше? Я думаю, что, вероятно, стоит знать, что определенные комбинации гиперпараметров приводят к увеличению градиента, но не только из-за этой проблемы распараллеливания.