Построение нейронной сети снова и снова с одинаковыми параметрами дает разный результат

#tensorflow #keras #deep-learning

#tensorflow #keras #глубокое обучение

Вопрос:

Я использую tensorflow 2.3.0

Я создаю RNN для прогнозирования цен на акции, всякий раз, когда я перезапускаю jupyter notebook и повторно запускаю весь свой код, он выдает очень разные прогнозы. Почему это так, когда все гиперпараметры точно такие же?

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

Вот мой код:

 def GetStockData(ticker_name, period, start_date, end_date):
    tickerData = yf.Ticker(ticker_name)
    df = tickerData.history(period=period, start=start_date, end=end_date)
    return df

full_nvda_df = GetStockData("NVDA", "1d", "2016-01-01", "2020-10-10")
nvda_df = full_nvda_df[["Close"]].copy()
train_df = nvda_df[:1000]
test_df = nvda_df[1000:]

train_arr = np.array(train_df)
test_arr = np.array(test_df)

for i in range(30, len(train_df)):
    X_train.append(train_arr[i-30:i])
    y_train.append(train_arr[i, 0])
    
X_train, y_train = np.array(X_train), np.array(y_train)



np.random.seed(1337)
model = tf.keras.Sequential([
    tf.keras.layers.LSTM(units=60, activation='relu', return_sequences=True, input_shape=(X_train.shape[1], 1) ),
    tf.keras.layers.Dropout(0.2),
    
    tf.keras.layers.LSTM(units=60, activation='relu', return_sequences=True),
    tf.keras.layers.Dropout(0.2),
    
    tf.keras.layers.LSTM(units=80, activation='relu', return_sequences=True),
    tf.keras.layers.Dropout(0.2),
    
    tf.keras.layers.LSTM(units=120, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    
    tf.keras.layers.Dense(units=1)
])

model.summary()
model.compile(loss = "mean_squared_error",
              optimizer = "adam")
  

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

1. Что вы подразумеваете под «перезапуском и запуском». Вы переобучаете свою модель? Или ваша модель обучена (и исправлена), и вы получаете другой результат при выводе?

2. перезапустите мой ноутбук и запустите весь код снова от начала до конца

3. Мы не знаем, что у вас в записной книжке. Вы каждый раз переучиваете модель или нет?

4. Перезапуск jupyter notebook и обучающая модель снова переучиваются?

Ответ №1:

ОБНОВЛЕНИЕ (TF> = 2.9)

Начиная с TF 2.9 (TF> = 2.9), если вы хотите, чтобы ваши модели TF выполнялись детерминированно, в начале программы необходимо добавить следующие строки.

 import tensorflow as tf

tf.keras.utils.set_random_seed(1)
tf.config.experimental.enable_op_determinism()
  

Важное примечание: в первой строке задается случайное начальное значение для следующего: Python, NumPy и TensorFlow. Вторая строка делает каждую операцию TensorFlow детерминированной.

СТАРШЕ TF 2.8

Не видя вашего кода, я могу только сделать вывод, что это связано с тем, что веса нейронной сети инициализируются случайным образом; когда вы ссылаетесь на

«конфигурации все одинаковые»

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

Однако weights они инициализируются случайным образом, и это неизбежно приведет к другому пути конвергенции вашей сети и, следовательно, очевидно, к другому локальному оптимуму (т. Е. К Разным результатам).

Единственный способ обеспечить воспроизводимость (насколько мне известно) — это «заполнить все», как показано ниже:

 random.seed(seed)
np.random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
tf.random.set_seed(seed)
  

Согласно этой теме на GitHub https://github.com/keras-team/keras/issues/14986,

В TensorFlow >= 2.5 можно использовать TF_DETERMINISTIC_OPS=1 также решение для обеспечения воспроизводимости.

Однако упоминается, что все еще существуют некоторые операции GPU, которые невозможно воспроизвести, и что идеальная воспроизводимость результатов между CPU и GPU может никогда не быть достигнута.

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

1. Да, мои ожидания подтверждаются; вы ничего не меняете в коде, а просто перезапускаете его

2. Итак, если вы используете Rnn для перевода каждый раз, он будет переводиться по-разному, если я не заполню все?

3. Не обязательно. Вы достигнете другого локального оптимума, что означает, что ваш набор весов будет другим. Если ваш набор весов отличается, это может привести (но не обязательно) к другому переводу (возможно, первые 4 слова из перевода одинаковые, но 5-е отличается). Обратите внимание, что это доступно для всех задач / задач с нейронными сетями и недоступно только в случае машинного перевода.

4. Добро пожаловать. Если у вас возникнут еще какие-либо вопросы, я был бы готов / рад помочь.