«Оптимальная» инициализация переменных и скорость обучения в Tensorflow для матричной факторизации

Я пытаюсь очень простая оптимизация в Tensorflow – проблема матричной факторизации. Для матрицы V (m X n) разложим ее на W (m X r) и H (r X n) . Я беру на себя основанную на градиентном смене платформу, основанную на тензорном потоке, для матричной факторизации.

Подробная информация о матрице V. В ее первоначальном виде гистограмма записей будет выглядеть следующим образом: введите описание изображения здесь

Чтобы ввести записи по шкале от [0, 1], я выполняю следующую предварительную обработку.

 f(x) = f(x)-min(V)/(max(V)-min(V)) 

После нормализации гистограмма данных будет выглядеть следующим образом: введите описание изображения здесь

Мои вопросы:

  1. Учитывая характер данных: между 0 и 1 и большинством записей ближе к 0, чем 1, что было бы оптимальной инициализацией для W и H ?
  2. Как следует определять уровни обучения на основе различной функции затрат: |A-WH|_F и |(A-WH)/A| ?

Минимальный рабочий пример будет следующим:

 import tensorflow as tf import numpy as np import pandas as pd V_df = pd.DataFrame([[3, 4, 5, 2], [4, 4, 3, 3], [5, 5, 4, 4]], dtype=np.float32).T 

Таким образом, V_df выглядит так:

  0 1 2 0 3.0 4.0 5.0 1 4.0 4.0 5.0 2 5.0 3.0 4.0 3 2.0 3.0 4.0 

Теперь код, определяющий W, H

 V = tf.constant(V_df.values) shape = V_df.shape rank = 2 #latent factors initializer = tf.random_normal_initializer(mean=V_df.mean().mean()/5,stddev=0.1 ) #initializer = tf.random_uniform_initializer(maxval=V_df.max().max()) H = tf.get_variable("H", [rank, shape[1]], initializer=initializer) W = tf.get_variable(name="W", shape=[shape[0], rank], initializer=initializer) WH = tf.matmul(W, H) 

Определение стоимости и оптимизатора:

 f_norm = tf.reduce_sum(tf.pow(V - WH, 2)) lr = 0.01 optimize = tf.train.AdagradOptimizer(lr).minimize(f_norm) 

Запуск сеанса:

 max_iter=10000 display_step = 50 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in xrange(max_iter): loss, _ = sess.run([f_norm, optimize]) if i%display_step==0: print loss, i W_out = sess.run(W) H_out = sess.run(H) WH_out = sess.run(WH) 

Я понял, что когда я использовал что-то вроде initializer = tf.random_uniform_initializer(maxval=V_df.max().max()) , я получил матрицы W и H, чтобы их произведение было намного больше V. Я также понял, что сохранение скорости обучения ( lr ) был 0,0001, вероятно, слишком медленным.

Мне было интересно, существуют ли какие-либо эмпирические правила для определения хороших инициализаций и скорости обучения для проблемы матричной факторизации.

    One Solution collect form web for “«Оптимальная» инициализация переменных и скорость обучения в Tensorflow для матричной факторизации”

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

    Однако при настройке скорости инициализации и обучения следует соблюдать осторожность, поскольку некоторые значения никогда не будут сходиться в зависимости от проблемы машинного обучения. Одно эмпирическое правило состоит в том, чтобы вручную изменить величину с шагом 3, а не 10 (согласно Andrew Ng): вместо перехода от 0,1 до 1,0 вы должны перейти от 0,1 до 0,3.

    Для ваших конкретных данных, которые имеют несколько значений около 0, можно найти оптимальные значения инициализации с учетом конкретной «гипотезы» / модели. Однако вам нужно определить «оптимальный». Должен ли метод быть как можно более быстрым, насколько это возможно, или в какой-то средней точке между этими крайностями? (Точность не всегда является проблемой при поиске точных решений. Однако, если это так, выбор правила остановки и критерии сокращения ошибок могут повлиять на результат.)

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

    Для конкретного алгоритма, который использует стохастический градиент приличный, похоже, нет простых ответов *. Документация TensorFlow относится к двум источникам:

    * «Надеюсь, что ясно, что выбор хорошей матрицы B в обновлении … может существенно улучшить стандартный градиентный метод … Часто, однако, такой выбор не очевиден, а в стохастических настройках … он сильно отличается -очевидно, как выбрать эту матрицу. Более того, во многих стохастических настройках мы даже не знаем истинной функции, которую мы минимизируем, поскольку данные просто поступают в поток, поэтому предварительная вычисление хорошей матрицы, генерирующей расстояние, невозможно ». Duchi & Singer, 2013, p. 5

    Python - лучший язык программирования в мире.