Вывод из предварительно подготовленной модели elmo

#tensorflow #sentiment-analysis #word-embedding #tensorflow-hub #elmo

#tensorflow #анализ настроений #встраивание слов #tensorflow-концентратор #elmo

Вопрос:

Я работаю над анализом настроений. Я использую метод elmo для получения вложений word. Но меня смущает вывод, который выдает этот метод. Рассмотрим код, приведенный на веб-сайте tensor flow:

  elmo = hub.Module("https://tfhub.dev/google/elmo/2", trainable=True)
    embeddings = elmo(["the cat is on the mat", "dogs are in the fog"],
    signature="default",as_dict=True)["elmo"]
  

Векторы вложения для конкретного предложения различаются в зависимости от количества приведенных вами строк. Чтобы объяснить подробно, давайте

  x = "the cat is on the mat"
 y = "dogs are in the fog"
 x1 = elmo([x],signature="default",as_dict=True)["elmo"]
 z1 = elmo([x,y] ,signature="default",as_dict=True)["elmo"] 
  

Поэтому x1[0] не будет равно z1[0] . Это изменяется по мере изменения входного списка строк. Почему вывод для одного предложения зависит от другого. Я не обучаю данные. Я использую только существующую предварительно подготовленную модель. Поскольку это так, я не понимаю, как преобразовать текст моих комментариев во вложения и использовать для анализа настроений. Пожалуйста, объясните.
Примечание: Для получения векторов встраивания я использую следующий код:

  with tf.Session() as sess:
            sess.run(tf.global_variables_initializer())
            sess.run(tf.tables_initializer())
            # return average of ELMo features
            return sess.run(tf.reduce_mean(x1,1))
  

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

1. Ваш вопрос дал мне подсказку для решения моей проблемы.

Ответ №1:

Когда я запускаю ваш код, x1 [0] и z1 [0] совпадают. Однако z1[1] отличается от результата

 y1 = elmo([y],signature="default",as_dict=True)["elmo"]
return sess.run(tf.reduce_mean(y1,1))
  

поскольку у y меньше токенов, чем у x, и слепое сокращение выходных данных после завершения приведет к появлению мусора.

Я рекомендую использовать вывод «по умолчанию» вместо «elmo», который выполняет предполагаемое сокращение. Пожалуйста, ознакомьтесь с документацией модуля.

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

1. x1 = массив([[ 0.05517201 , -0.02187633, -0.17496817, …, -0.36848053,0.09267851, 0.23179102]], dtype=float32) и z1 = array([[ 0.05517215 , -0.02187647, -0.17496812, …, -0.36848068, 0.09267855, 0.23179094], [-0.00665377, 0.12139908, -0.1935362 , …, -0.08462355,0.07242572, 0.19882451]], dtype= float32) . Использование [«elmo»] дало мне другой результат (пожалуйста, обратите внимание на последние десятичные знаки), и это продолжает меняться по мере увеличения размера списка, т. Е. мы получаем разные векторы для одного предложения.

2. Также почему z1 [1] отличается от y1? Векторное представление должно быть одинаковым для предложения. Предложения (строки) в z = [x, y, …] независимы (рассмотрим случай анализа разных твитов). Итак, независимо от размера или строк, присутствующих в z , это не должно влиять на векторы elmo, верно? Я также пытался изменить trainable = False, но не сработало

3. Повторите «последние десятичные дроби»: здесь происходит много математики с одинарной точностью. Я не совсем уверен, как разные примеры в пакете взаимодействуют друг с другом, но совпадение в пяти значащих цифрах соответствует моей планке «равно» для глубокого обучения.

4. Повторно «отличается от y1»: Пожалуйста, смотрите документацию модуля для определения значимости входных длин и рекомендации использовать вывод «по умолчанию». Когда рекуррентная нейронная сеть обрабатывает пакет последовательностей с неодинаковой длиной, она выполняет итерацию до максимальной длины и оставляет ее на этапе постобработки («маскирования») для удаления конечных выходных данных более коротких последовательностей.

5. Повторите «последние десятичные дроби»: поскольку разница составляет только одну строку, разница в значениях незначительна. Но если (скажем) z = [список из 1000 строк], значения изменяются с самой первой десятичной точки. Я сделал много проверок. Я повторяю ‘мы получаем разные векторы для каждого предложения’ и почему это? Обучаются ли веса (но я не обучаю модель, просто извлекаю векторы из предварительно подготовленной модели)?