> который хорошо адаптируется под разные ML-задачи.
Так уж под все? А как быть, если у нас очень большая размерность задачи, и относительно мало обучающих примеров?
Или, скажем, есть много категориальных фич с большим числом значений (таким, чтобы было не выгодно переводить их в бинарные)?
Насколько я помню, на Optical Flow и поиске лэндмарков на лице НН все еще несколько сливают традиционным подходом. Причем поиск лэндмарков так же делается с использованием МЛ.
Разница в 10 раз между итерациями LM и GD это еще хорошо) У меня на некоторых задачах выходило что-то в духе двух-трех порядков.
Тем не менее, надо помнить, что каждая итерация LM это довольно дорогая операция, т.к. надо накопить немаленький якобиан, перемножить его и решить довольно большую СЛАУ
Для задач Deep Learning оказалось, выгодней делать много маленьких и не особо точных шажков.
Да и в целом, для ML сводить ошибку на обучающей выборке к нулю не то чтобы сильно нужно.
А разбор интересно было бы посмотреть.
Там между перемножением матриц есть нелинейные преобразования (ReLU, сигмоида и т.д.), так что схлопнуть (как мне кажется) не выйдет.
Теперь понял. Кажется
Градиентный спуск описанный в посте вполне должен работать и для нелинейных случаев. Не так хорошо как Гаусс-Ньютон, но вполне себе, особенно если сбоку прикрутить что-то типа линейного поиска.
Что касается локальных минимумов (если я не ошибаюсь), что LM, что градиентный спуск сходятся к локальному минимуму.
А можно немного пояснить комментарий?
Ну т.е. я вроде нигде не говорил что нельзя использовать Gauss-Newton для обучения сетей. Можно, как и большую часть алгоритмов нелинейной оптимизации (SR1, (L)BFGS, CG, etc). Но в большинстве статей по Deep Learning что я встречал народ предпочитает SGD, включая Yann Lecun
Если я правильно понимаю, то квази-Ньютоновские методы и методы второго порядка особо не используются при обучении нейронок на сегодняшний день. Все используют разные модификации SGD.
Я бы добавил, что сам по себе метод градиентного спуска с фиксированным шагом является довольно не эффективным алгоритмом оптимизации. На практике, стараются его (шаг) выбирать адаптивно тем или иным образом (например, при помощи line search).
Я не то чтобы хорошо знаю С++, но возникло несколько вопросов.
1. Если действительно нужно выделять много объектов на куче, что мешает использовать кастомный аллокатор который будет заранее выделять большие куски памяти?
2. (Я вот как-то не использую смарт-поинтеры, поэтому могу ошибаться) Разве декремент/инкремент не будет возникать только в ситуации, когда мы пытаемся расшарить владение и когда «владелец» убивает поинтер? Во всех остальных случаях можно передавать объект по ссылке, и вроде как оверхеда не будет.
4. А можно чуть подробнее про оператор == и заголовок (точнее что имеется ввиду под заголовком).
5. В С++ и модулей то нет. А если разместить реализацию ф-ии в .h должно же работать?
Очень бы хотелось увидеть какое-нить описание архитектуры библиотеки/список доступных МЛ алгоритмов.
Еще бы сравнение с существующими инструментами, особенно по части производительности.
Коду в статье очень не хватает развернутых комментариев (например, что такое tree). И выравнивания. На момент написания комментария код очень трудно читать.
А кто нам мешает использовать модель нейрона, который возвращает пришедший сигнал как он есть? Получим вполне себе линейный регрессор.
Для новичков линейная модель будет явно проще. А потом сверху можно и пороговую ф-ию накрутить, или чего-нить еще.
А почему? Вроде НС вполне можно использовать для регрессии.
А для обучения (в смысле обучения людей) линейный классификатор чуть хуже, т.к. чуть больше формул и чуть менее наглядные примеры
Еще можно притвориться что оптимизируешь сумму модулей при помощи взвешивания и МНК (IRLS) https://en.wikipedia.org/wiki/Iteratively_reweighted_least_squares
Еще (могу ошибиться, на самом деле) вроде стохастический градиентный спуск нормально работает с негладкими ф-иями потерь.
Ну я же не предлагаю совсем отказаться от GUI в С++, я говорю, что в стандартной библиотеке (которая должна создаваться из расчета, что ее API не будет меняться десятилетиями, и что она будет реализованна для множества платформ) GUI явно излишен.
Для графического интерфейса, в мире С++ есть решения. Тот же Qt.
Если нужен быстрый старт, то берем Qt Creator и вперед. Подозреваю что подключить Qt в других IDE тоже не особо сложно.
Так уж под все? А как быть, если у нас очень большая размерность задачи, и относительно мало обучающих примеров?
Или, скажем, есть много категориальных фич с большим числом значений (таким, чтобы было не выгодно переводить их в бинарные)?
А не подскажите, где в посте они упоминались?
Тем не менее, надо помнить, что каждая итерация LM это довольно дорогая операция, т.к. надо накопить немаленький якобиан, перемножить его и решить довольно большую СЛАУ
Для задач Deep Learning оказалось, выгодней делать много маленьких и не особо точных шажков.
Да и в целом, для ML сводить ошибку на обучающей выборке к нулю не то чтобы сильно нужно.
А разбор интересно было бы посмотреть.
Там между перемножением матриц есть нелинейные преобразования (ReLU, сигмоида и т.д.), так что схлопнуть (как мне кажется) не выйдет.
Градиентный спуск описанный в посте вполне должен работать и для нелинейных случаев. Не так хорошо как Гаусс-Ньютон, но вполне себе, особенно если сбоку прикрутить что-то типа линейного поиска.
Что касается локальных минимумов (если я не ошибаюсь), что LM, что градиентный спуск сходятся к локальному минимуму.
Ну т.е. я вроде нигде не говорил что нельзя использовать Gauss-Newton для обучения сетей. Можно, как и большую часть алгоритмов нелинейной оптимизации (SR1, (L)BFGS, CG, etc). Но в большинстве статей по Deep Learning что я встречал народ предпочитает SGD, включая Yann Lecun
Заголовок слайда
>Convex Shmonvex
Что-то в голос
Dog Leg?
Если я правильно понимаю, то квази-Ньютоновские методы и методы второго порядка особо не используются при обучении нейронок на сегодняшний день. Все используют разные модификации SGD.
1. Если действительно нужно выделять много объектов на куче, что мешает использовать кастомный аллокатор который будет заранее выделять большие куски памяти?
2. (Я вот как-то не использую смарт-поинтеры, поэтому могу ошибаться) Разве декремент/инкремент не будет возникать только в ситуации, когда мы пытаемся расшарить владение и когда «владелец» убивает поинтер? Во всех остальных случаях можно передавать объект по ссылке, и вроде как оверхеда не будет.
4. А можно чуть подробнее про оператор == и заголовок (точнее что имеется ввиду под заголовком).
5. В С++ и модулей то нет. А если разместить реализацию ф-ии в .h должно же работать?
Еще бы сравнение с существующими инструментами, особенно по части производительности.
Коду в статье очень не хватает развернутых комментариев (например, что такое tree). И выравнивания. На момент написания комментария код очень трудно читать.
Для новичков линейная модель будет явно проще. А потом сверху можно и пороговую ф-ию накрутить, или чего-нить еще.
А для обучения (в смысле обучения людей) линейный классификатор чуть хуже, т.к. чуть больше формул и чуть менее наглядные примеры
Еще (могу ошибиться, на самом деле) вроде стохастический градиентный спуск нормально работает с негладкими ф-иями потерь.
Для графического интерфейса, в мире С++ есть решения. Тот же Qt.
Если нужен быстрый старт, то берем Qt Creator и вперед. Подозреваю что подключить Qt в других IDE тоже не особо сложно.
Ну и в таком случае, надо отсылать к понятным библиотекам.