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:
где, 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 равны
Тензор 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, список списков неотрицательных вещественных чисел (или эквивалентные итерируемые объекты) или одно неотрицательное вещественное число.
|
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 | Операция для инициализации состояния рабочего узла один раз перед началом любых обновлений. Обратите внимание, что именно это инициализирует кэш весов строк и столбцов на рабочих узлах, когда |
Методы
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