Как реализовать функцию оптимизации в тензорном потоке?

minΣ(||xi-Xci||^2+ λ||ci||),

с.т кии = 0,

где X представляет собой матрицу формы d * n, а C имеет форму n * n, xi и ci означает столбец X и C по отдельности.

X здесь известен, и на основе X мы хотим найти C.


person xxx222    schedule 14.07.2016    source источник


Ответы (1)


Обычно с такой потерей вам нужно векторизовать ее, а не работать со столбцами:

loss = X - tf.matmul(X, C)
loss = tf.reduce_sum(tf.square(loss))

reg_loss = tf.reduce_sum(tf.square(C), 0)  # L2 loss for each column
reg_loss = tf.reduce_sum(tf.sqrt(reg_loss))

total_loss = loss + lambd * reg_loss

Чтобы реализовать нулевое ограничение на диагонали C, лучше всего добавить его к потерям с другой константой lambd2:

reg_loss2 = tf.trace(tf.square(C))
total_loss = total_loss + lambd2 * reg_loss2
person Olivier Moindrot    schedule 15.07.2016
comment
Большое спасибо! Я думал об использовании tf.slice() для получения столбца матрицы, как вы думаете, это тоже сработает? Каков механизм tf.slice()? - person xxx222; 15.07.2016
comment
Это также будет работать, поскольку градиент будет распространяться обратно на исходную переменную C (и X), но это будет очень неэффективно. - person Olivier Moindrot; 15.07.2016