Всем привет! Заметил такую особенность, что на одних и тех же входных данных при разных запусках, получаются разные вектора ELMO. Нормальная ли это ситуация?
Вектора получаются таким образом:
vectors = elmo([tx.split() for tx in X_train])
vectors = np.array(vectors)
vectors3 = elmo([tx.split() for tx in X_train])
vectors3 = np.array(vectors3)
Сравнение результатов двух прогонов: np.testing.assert_allclose(vectors3, vectors, rtol = 1e-04)
Not equal to tolerance rtol=0.0001, atol=0
Mismatched elements: 55296 / 58368 (94.7%)
Max absolute difference: 0.0737164
Max relative difference: 231.68636
фиксация параметра seed внутри elmo vectors =elmo([tx.split() for tx in X_train], seed=42)
*тут как понимаю просто некорректно передаются сиды, при этом elmo не ругается
фиксация параметра seed для tf и других библиотек
seed = 42
os.environ['PYTHONHASHSEED'] = str(seed)
# TF RNG
os.environ['PYTHONHASHSEED']=str(seed)
os.environ['TF_CUDNN_DETERMINISTIC'] = '1' # new flag present in tf 2.0+
tf.set_random_seed(seed)
# Python RNG
np.random.seed(seed)
random.seed(seed)
Что помогло:
при использования ELMO напрямую через tf_hub получается добиться детерминированности, но при этом очень сильно падает производительность. Из-за этого данный способ неработоспособен.
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
embeddings = elmo(["тестовый набор"], signature="default", as_dict=True)["elmo"]
embeddings = sess.run(embeddings)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
embeddings3 = elmo(["тестовый набор"], signature="default", as_dict=True)["elmo"]
embeddings3 = sess.run(embeddings3)
Что помогло уменьшить проблему:
Добавил tf.global_variables_initializer() перед каждым вызовом elmo. Также добавил tqdm для детализации процесса получения векторов.
Надо сбрасывать стейты напрямую в LSTM внутри ELMo, это быстро будет работать, но надо залезать в обертку на нижний уровень модели. Думаю можно во время рантайма (инференса) напрямую сбрасывать стейты