Spec-Zone.ru › TensorFlow 1.15

tf.contrib.factorization.WALSModel

Модель для факторизации матриц методом взвешенных чередующихся наименьших квадратов.

tf.contrib.factorization.WALSModel(
    input_rows, input_cols, n_components, unobserved_weight=0.1,
    regularization=None, row_init='random', col_init='random', num_row_shards=1,
    num_col_shards=1, row_weights=1, col_weights=1, use_factors_weights_cache=True,
    use_gramian_cache=True, use_scoped_vars=False
)

Минимизирует следующую функцию потерь по U, V:

$$ \|\sqrt W \odot (A - U V^T)\|_F^2 + \lambda (\|U\|_F^2 + \|V\|_F^2) $$

где, A: входная матрица, W: весовая матрица. Обратите внимание, что квадратный корень от весов используется в целевой функции. U, V: матрицы row_factors и columnfactors, \(\lambda)\: регуляризация. Также предполагается, что W имеет следующий специальный вид: \( W{ij} = W_0 + R_i * Cj \) если \(A{ij} \ne 0\), \(W_{ij} = W_0\) в противном случае. где, \(W_0\): unobserved_weight, \(R_i\): row_weights, \(C_j\): col_weights.

Обратите внимание, что текущая реализация поддерживает два режима работы: По умолчанию, row_factors и col_factors помещаются в память каждого узла и кэшируются. Если это условие не выполняется, установка use_factors_weights_cache в False позволяет обрабатывать более крупные объемы данных с незначительной потерей производительности, так как это предотвращает создание кэшей на узлах, и вместо этого соответствующие значения весов и факторов извлекаются из серверов параметров на каждом шаге.

Вычисление потерь: Потери можно эффективно вычислить, разложив их на слагаемое для разреженных данных и слагаемое Грама, см. wals.md. Потери возвращаются функцией update_{col, row}_factors(sp_input), и нормализуются следующим образом: _, _, unregularized_loss, regularization, sum_weights = update_row_factors(sp_input) если sp_input содержит строки \({A_i, i \in I}\), и входная матрица A имеет n строк в целом, то потери на мини-партшн = unregularized_loss + regularization равны

$$ (\|\sqrt W_I \odot (A_I - U_I V^T)\|_F^2 + \lambda \|U_I\|_F^2) * n / |I| + \lambda \|V\|_F^2 $$

Тензор sum_weights содержит нормализованную сумму весов \(sum(W_I) * n / |I|\).

Пример типичного использования (псевдокод):

with tf.Graph().as_default(): # Настройка объекта модели. model = tf.contrib.factorization.WALSModel(....)

# To be run only once as part of session initialization. In distributed
# training setting, this should only be run by the chief trainer and all
# other trainers should block until this is done.
model_init_op = model.initialize_op

# To be run once per worker after session is available, prior to
# the prep_gramian_op for row(column) can be run.
worker_init_op = model.worker_init

# To be run once per iteration sweep before the row(column) update
# initialize ops can be run. Note that in the distributed training
# situations, this should only be run by the chief trainer. All other
# trainers need to block until this is done.
row_update_prep_gramian_op = model.row_update_prep_gramian_op
col_update_prep_gramian_op = model.col_update_prep_gramian_op

# To be run once per worker per iteration sweep. Must be run before
# any actual update ops can be run.
init_row_update_op = model.initialize_row_update_op
init_col_update_op = model.initialize_col_update_op

# Ops to update row(column). This can either take the entire sparse
# tensor or slices of sparse tensor. For distributed trainer, each
# trainer handles just part of the matrix.
_, row_update_op, unreg_row_loss, row_reg, _ = model.update_row_factors(
     sp_input=matrix_slices_from_queue_for_worker_shard)
row_loss = unreg_row_loss + row_reg
_, col_update_op, unreg_col_loss, col_reg, _ = model.update_col_factors(
     sp_input=transposed_matrix_slices_from_queue_for_worker_shard,
     transpose_input=True)
col_loss = unreg_col_loss + col_reg

...

# model_init_op is passed to Supervisor. Chief trainer runs it. Other
# trainers wait.
sv = tf.compat.v1.train.Supervisor(is_chief=is_chief,
                   ...,
                   init_op=tf.group(..., model_init_op, ...), ...)
...

with sv.managed_session(...) as sess:
  # All workers/trainers run it after session becomes available.
  worker_init_op.run(session=sess)

  ...

  while i in iterations:

    # All trainers need to sync up here.
    while not_all_ready:
      wait

    # Row update sweep.
    if is_chief:
      row_update_prep_gramian_op.run(session=sess)
    else:
      wait_for_chief

    # All workers run upate initialization.
    init_row_update_op.run(session=sess)

    # Go through the matrix.
    reset_matrix_slices_queue_for_worker_shard
    while_matrix_slices:
      row_update_op.run(session=sess)

    # All trainers need to sync up here.
    while not_all_ready:
      wait

    # Column update sweep.
    if is_chief:
      col_update_prep_gramian_op.run(session=sess)
    else:
      wait_for_chief

    # All workers run upate initialization.
    init_col_update_op.run(session=sess)

    # Go through the matrix.
    reset_transposed_matrix_slices_queue_for_worker_shard
    while_transposed_matrix_slices:
      col_update_op.run(session=sess)
Аргументы
input_rows общее количество строк для входной матрицы.
input_cols общее количество столбцов для входной матрицы.
n_components количество измерений для факторов.
unobserved_weight вес, присваиваемый неопределённым элементам матрицы.
regularization вес члена регуляризации L2. Если None, регуляризация не выполняется.
row_init инициализатор для фактора строки. Может быть тензором или numpy константой. Если установлено "random", значение инициализируется случайным образом.
col_init инициализатор для фактора столбца. Смотрите row_init для подробностей.
num_row_shards количество фрагментов для использования с факторами строк.
num_col_shards количество фрагментов для использования с факторами столбцов.
row_weights Должно быть в одном из следующих трёх форматов: None, список списков неотрицательных вещественных чисел (или эквивалентные итерируемые объекты) или одно неотрицательное вещественное число.
  • Если установлено в None, w_ij = unobserved_weight, что упрощает ALS. Обратите внимание, что col_weights также должны быть установлены в "None" в этом случае.
  • Если это список списков неотрицательных вещественных чисел, он должен иметь вид [[w_0, w_1, ...], [w_k, ... ], [...]], где количество внутренних списков соответствует количеству фрагментов фактора строки, а элементы в каждом внутреннем списке - веса для строк соответствующего фрагмента фактора строки. В этом случае w_ij = unobserved_weight + row_weights[i] * col_weights[j].
  • Если это единственное неотрицательное вещественное число, это значение используется для всех весов строк и (w_ij) = unobserved_weight + row_weights * col_weights[j]. Обратите внимание, что row_weights могут быть списком, а col_weights - числом, или наоборот.
col_weights См. row_weights.
use_factors_weights_cache Если True, факторы и веса будут кэшироваться на рабочих узлах до начала обновлений. По умолчанию True. Обратите внимание, что кэш весов инициализируется через worker_init, а кэш факторов строк/столбцов инициализируется через initialize_{col/row}_update_op. В случае, когда веса вычисляются вне и устанавливаются до начала итераций обучения, важно убедиться, что операция worker_init выполняется впоследствии, чтобы кэш весов вступил в силу.
use_gramian_cache Если True, матрицы Грама будут кэшироваться на рабочих узлах до начала обновлений. По умолчанию True.
use_scoped_vars Если True, переменные факторов и весов также будут вложены в tf.name_scope.
Атрибуты
col_factors Возвращает список тензоров, соответствующих фрагментам фактора столбца.
col_update_prep_gramian_op Операция для формирования матрицы Грама перед началом обновлений столбцов.

Должна выполняться перед initialize_col_update_op и должна выполняться только одним тренером (обычно главным) при распределённом обучении.

col_weights Возвращает список тензоров, соответствующих фрагментам весов столбцов.
initialize_col_update_op Операция для инициализации состояния рабочего узла перед началом обновлений столбцов.
initialize_op Возвращает операцию для инициализации переменных TensorFlow.
initialize_row_update_op Операция для инициализации состояния рабочего узла перед началом обновлений строк.
row_factors Возвращает список тензоров, соответствующих фрагментам фактора строки.
row_update_prep_gramian_op Операция для формирования матрицы Грама перед началом обновлений строк.

Должна выполняться перед initialize_row_update_op и должна выполняться только одним тренером (обычно главным) при распределённом обучении.

row_weights Возвращает список тензоров, соответствующих фрагментам весов строк.
worker_init Операция для инициализации состояния рабочего узла один раз перед началом любых обновлений.

Обратите внимание, что именно это инициализирует кэш весов строк и столбцов на рабочих узлах, когда use_factors_weights_cache имеет значение True. В этом случае, если эти веса вычисляются и сбрасываются после создания объекта, важно убедиться, что эта операция выполняется впоследствии, чтобы кэш отражал правильные значения.

Методы

project_col_factors

Просмотреть исходный код

project_col_factors(
    sp_input=None, transpose_input=False, projection_weights=None
)

Проецирует факторы столбцов.

Вычисляет вложения столбцов (v_j) для наблюдаемого столбца (a_j) путём решения одной итерации уравнений обновления.

Аргументы
sp_input Разреженный тензор, представляющий набор столбцов. Обратите внимание, что индексы строк этого разреженного тензора должны соответствовать индексации признаков строк модели, а индексы столбцов игнорируются. Результаты будут возвращены в том же порядке, что и входные столбцы.
transpose_input Если True, вход будет логически транспонирован, и столбцы, соответствующие транспонированному входу, будут проецированы.
projection_weights Веса столбцов, которые будут использоваться для проекции. Если None, используется 1.0. Это может быть скаляр или тензор ранга 1 с количеством элементов, соответствующим количеству столбцов для проекции. Обратите внимание, что веса строк будут определяться основной моделью WALS.
Возвращает
Проецированные факторы столбцов.

project_row_factors

Просмотреть исходный код

project_row_factors(
    sp_input=None, transpose_input=False, projection_weights=None
)

Проецирует факторы строк.

Вычисляет вложения строк (u_i) для наблюдаемой строки (a_i) путём решения одной итерации уравнений обновления.

Аргументы
sp_input Разреженный тензор, представляющий набор строк. Обратите внимание, что индексы столбцов этого разреженного тензора должны соответствовать индексации признаков столбцов модели, а индексы строк игнорируются. Результаты будут возвращены в том же порядке, что и входные строки.
transpose_input Если True, вход будет логически транспонирован, и строки, соответствующие транспонированному входу, будут проецированы.
projection_weights Веса строк, которые будут использоваться для проекции. Если None, используется 1.0. Это может быть скаляр или тензор ранга 1 с количеством элементов, соответствующим количеству строк для проекции. Обратите внимание, что веса столбцов будут определяться основной моделью WALS.
Возвращает
Проецированные факторы строк.

scatter_update

Просмотреть исходный код

@classmethod
scatter_update(
    factor, indices, values, sharding_func, name=None
)

Вспомогательная функция для выполнения разбиения scatter update.

update_col_factors

Просмотреть исходный код

update_col_factors(
    sp_input=None, transpose_input=False
)

Обновляет факторы столбцов.

Аргументы
sp_input Разреженный тензор, представляющий подмножество столбцов полного входного значения. Обратитесь к комментариям к update_row_factors для ограничений.
transpose_input Если True, вход будет логически транспонирован, и столбцы, соответствующие транспонированному входу, будут обновлены.
Возвращаемое значение
Кортеж, содержащий следующие элементы:
new_values Новые значения для столбцовых факторов.
update_op Операция, которая присваивает новые вычисленные значения столбцовым факторам.
unregularized_loss Матрица (скаляр), содержащая нормированную потерю мини-пакета, соответствующую sp_input, без члена регуляризации. Если sp_input содержит столбцы \({A{:, j}, j \in J}\), а входная матрица A имеет m общих столбцов, то нерегуляризованная потеря равна: \(\|\sqrt W_J \odot (A_J - U V_J^T)\|_F^2 * m / |I|\) Полная потеря равна unregularized_loss + regularization.
regularization Матрица (скаляр), содержащая нормированный член регуляризации для потери мини-пакета, соответствующей sp_input. Если sp_input содержит столбцы \({A{:, j}, j \in J}\), а входная матрица A имеет m общих столбцов, то член регуляризации равен: \(\lambda \|V_J\|_F^2) * m / |J| + \lambda \|U\|_F^2\).
sum_weights Сумма весов W_J, соответствующих sp_input, нормированных на коэффициент \(m / |J|\). Корень взвешенной квадратичной ошибки равен: \sqrt(unregularized_loss / sum_weights).

update_row_factors

Посмотреть исходный код

update_row_factors(
    sp_input=None, transpose_input=False
)

Обновляет строковые факторы.

Аргументы
sp_input SparseTensor, представляющий подмножество строк полного входного значения в любом порядке. Обратите внимание, что этот SparseTensor должен сохранять индексацию, как в исходном входном значении.
transpose_input Если true, входное значение будет логически транспонировано, и строки, соответствующие транспонированному входному значению, будут обновлены.
Возвращаемое значение
Кортеж, содержащий следующие элементы:
new_values Новые значения для строковых факторов.
update_op Операция, которая присваивает новые вычисленные значения строковым факторам.
unregularized_loss Матрица (скаляр), содержащая нормированную потерю мини-пакета, соответствующую sp_input, без члена регуляризации. Если sp_input содержит строки \({A{i, :}, i \in I}\), а входная матрица A имеет n общих строк, то нерегуляризованная потеря равна: \(\|\sqrt W_I \odot (A_I - U_I V^T)\|_F^2 * n / |I|\) Полная потеря равна unregularized_loss + regularization.
regularization Матрица (скаляр), содержащая нормированный член регуляризации для потери мини-пакета, соответствующей sp_input. Если sp_input содержит строки \({A{i, :}, i \in I}\), а входная матрица A имеет n общих строк, то член регуляризации равен: \(\lambda \|U_I\|_F^2) * n / |I| + \lambda \|V\|_F^2\).
sum_weights Сумма весов W_I, соответствующих sp_input, нормированных на коэффициент \(n / |I|\). Корень взвешенной квадратичной ошибки равен: \sqrt(unregularized_loss / sum_weights).

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/contrib/factorization/WALSModel

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API