Инициализация по умолчанию для состояний и весов Tensorflow LSTM?
Я использую ячейку LSTM в Tensorflow.
lstm_cell = tf.contrib.rnn.BasicLSTMCell(lstm_units)
Мне было интересно, как инициализируются веса и состояния или, скорее, каков инициализатор по умолчанию для ячеек LSTM (состояний и весов) в Tensorflow?
И есть ли простой способ установить инициализатор вручную?
Примечание: для tf.get_variable()
glorot_uniform_initializer используется, насколько я мог узнать из документации.
2 ответа
Я не думаю, что вы можете инициализировать отдельную ячейку, но когда вы выполняете LSTM с tf.nn.static_rnn
или же tf.nn.dynamic_rnn
Вы можете установить initial_state
аргумент для тензора, содержащий начальные значения LSTM.
Прежде всего, есть разница между весами LSTM (обычного набора параметров ANN), которые по умолчанию также инициализируются Glorot или также известны как инициализатор Xavier (как упомянуто в вопросе).
Другой аспект - это состояние ячейки и состояние начального рекуррентного ввода в LSTM. Они инициализируются матрицей, обычно обозначаемой как initial_state
,
Оставляя нас с вопросом, как это инициализировать initial_state
:
- Инициализация в нулевом состоянии - это хорошая практика, если влияние инициализации низкое
Подход по умолчанию к инициализации состояния RNN заключается в использовании нулевого состояния. Это часто работает хорошо, особенно для задач типа "последовательность-последовательность", таких как моделирование языка, где доля результатов, на которые значительное влияние оказывает исходное состояние, невелика.
- Инициализация нулевого состояния в каждой партии может привести к переоснащению
Нулевая инициализация для каждого пакета приведет к следующему: Потери на ранних этапах модели "последовательность-последовательность" (т. Е. Потери сразу после сброса состояния) будут больше, чем на более поздних этапах, потому что меньше истории. Таким образом, их вклад в градиент во время обучения будет относительно выше. Но если все сбросы состояния связаны с нулевым состоянием, модель может (и будет) узнавать, как именно это компенсировать. По мере увеличения отношения сброса состояния к общему количеству наблюдений параметры модели будут все больше настраиваться на это нулевое состояние, что может повлиять на производительность на более поздних временных шагах.
- У нас есть другие варианты?
Одно простое решение - сделать начальное состояние зашумленным (чтобы уменьшить потери для первого временного шага). Смотрите здесь для деталей и других идей