Спасибо,
B@R5uk за ответ!
Можно и симплекс, и что угодно пробовать, только давайте прикинем, сколько оно будет сходиться.
Я экспериментировал с функциями, которые были дискретизованы на сетке с 12 миллионами неизвестных и у меня было примерно 100 миллионов экспериментальных точек.
Если фиксировать
или
, то задача по другой переменной становится квадратичной и сводится к решению системы ураввнений с симметричной неотрицательно определенной матрицей, обычно довольно хорошо сингулярной. Я решал эту задачу арнольдевским методом - то есть фактически это GMRES, но с трехдиагональной матрицей, вместо хессенберговой. Там проще сингулярные числа контроллировать. Обычно все сходилось довольно быстро, итераций за сто. Я имею ввиду решение каждой такой линейной системы.
Стоимость умножения на такую матрицу получалась около минуты, да, она хоть и разреженная, но в ней реально дочерта ненулевых элементов, так как она формируется из
, где
.
ALS сходились за 20 итераций, итого, где-то сутки считалось.
Тепереь если перейти на квазиньютонов.
Стоиомсть одного вычисления минимизируемой функции так и останется около минуты. Если применить Баура-Штрассена, теоретически градиент должен считаться только в 5 раз дольше, но, на практике, при умножении матриц я использую очень кеш-оптимизированные алгоритмы, а у Баур-Штрассена затрат по памяти будет на пару терабайт и производительность - если за час я один градиент посчитаю - то классно.
Как я говорил, сходиться оно не будет, так как если
умножить на константу, а
- разделить на нее же, то решение все равно будет то же самое, а, для квазиньютонов - это полный пипец. Надо либо докидывать что-то типа нормы от одного слагаемого в минимизируемую функцию, или еще что-то. Допустим сделали, хотя всегда это криво...
Что дальше? Вот вы сами верите, что квазиньютон с 12 миллионами неизвестными сойдется хотя бы за тысячу итераций? Я - нет, и пробовать не хочу. А тысяча итераций - это тысяча часов счета, то есть больше месяца, против суток в ALS. А сколько симплекс будет это все жевать - вечность???
Если все-таки полностью
исключить, то число неизвестных будет меньше - около миллиона, но минимизируемая функция будет считаться часы, а сколько будет считаться ее градиент - думаю, что пару суток точно.
Но, я и сутки ждать не готов, мне надо за час (это когда
- известна), а лучше быстрее, и не градиент, а все решение.
Почему-то мне кажется, что все-таки тут можно что-то да такое найти, что в лоб без итераций можно задачу свести к более простой, но никак не могу придумать как, поэтому и вопрошаю.