Создание ансамбля для последовательных (seq2seq) моделей тензорного потока?
Я подготовил модель тензорного потока seq2seq для 30 эпох и сохранил контрольную точку для каждой эпохи. Сейчас я хочу объединить лучшие X из этих контрольных точек (на основе результатов на наборе разработки). В частности, я ищу способ, позволяющий мне усреднять различные веса моделей и объединять их в новую модель, которую можно использовать для декодирования. Тем не менее, похоже, что для этого нет определенного пути, и загрузка разных моделей может быть немного сложнее. Но даже если это удастся, я не могу найти хороший ответ о том, как объединить веса в новой модели.
Любая помощь будет принята с благодарностью.
Смежные вопросы (которые на мой взгляд не дают достаточного ответа):
Построение нескольких моделей в одном графике
Как загрузить несколько одинаковых моделей из файлов сохранения в один сеанс в Tensorflow
2 ответа
Сначала немного терминологии:
В ансамблях (как я их понимаю) у вас есть N моделей во время тестирования, и вы комбинируете их прогнозы (путем голосования или, что еще лучше, комбинируя вероятностные распределения и используя в качестве входных данных для дальнейшего декодирования в случае авторегрессионных декодеров seq2seq). Вы можете иметь независимые ансамбли (обучение каждой модели независимо от нуля, с различной случайной инициализацией) или ансамбли контрольных точек (взятие N последних контрольных точек или, возможно, N контрольных точек с наилучшим баллом проверки). См., Например, Sennrich et al., 2017 для сравнения этих двух типов ансамблей.
При усреднении вы усредняете веса N моделей, поэтому во время тестирования у вас есть только одна усредненная модель. Обычно это дает худшие результаты, чем в реальных ансамблях, но гораздо быстрее, поэтому вы можете позволить себе более высокое N. Если модели обучаются совершенно независимо с различной случайной инициализацией, усреднение не работает вообще. Однако, если модели имеют разумное количество начальных этапов обучения, усреднение может работать. Особый случай - усреднение по контрольным точкам, где последние N контрольных точек усредняются, но вы можете попробовать даже "разветвить" обучение и использовать "полунезависимые" модели для усреднения (в дополнение к усреднению по контрольным точкам). Может быть очень полезно использовать постоянную или циклическую скорость обучения, см. Измайлов и др., 2018.
Что касается вашего вопроса, как выполнить усреднение контрольных точек Tensorflow: см. Avg_checkpoints.py или t2t-avg-all.
Выполнение среднего веса нескольких моделей для получения новой модели вряд ли даст полезный результат.
Для простого примера, подумайте о классической CNN, такой как AlexNet. Его первый слой будет содержать серию 2d-фильтров, ищущих различные функции изображения. Для каждой модели, которую вы тренируете с нуля, вполне вероятно, что аналогичные функции могут отображаться в фильтрах, но порядок их появления будет очень разным, поэтому простое усреднение весов уничтожит большую часть информации.