Кораблик уже интересней, хотя совсем не понятно откуда такая плохая сегментация мачты.
Это вы так говорите, поскольку уже пробовали? :)
Вроде того. Накрашенные губы + макияж это наверное лучшее что можно придумать для сегментации, на самом деле. Естественная разметка, так сказать, вместе с очень удобным фоном. Нейронкам должно очень хорошо заходить, т.к. они легко учат текстуру. У вас где-то в видео, кстати, был забавный пример, где сегментация цепляет ботинки, т.к. они одного цвета со штанами.
Самая большая проблема это обветренные мужские губы с большим диапазоном движений (крики, закусывание губы и т.д.). Практически нереально разметить консистентно, т.к. зачастую не видна граница между губой и кожей + не очевидно где кончается губа, и начинается ротовая полость. Отдельно — проблемы из-за оттока крови на некоторых эмоциях.
Видео несколько спасает, но требуется очень большой фпс и отличный свет, чтобы избежать motion blur.
lua-torch мертв, по сути, все используют pytorch. Строго говоря, все популярные фреймворки ориентируются на python, в первую очередь. Если знаете C++, то необходимая база питона набирается за пару недель
У вас есть куча автодифф фреймворков на выбор (torch, chainer, mxnet, etc). Дробите свою сеть на части, сверяйте производные которые взяли руками с тем, что выдает фреймворк, правьте реализации, если результаты не совпадают.
Думается мне, что это был типа задел на еще одну статью про обучение нейронок. Тогда shuffle это для минибатчей, а случайная инициализация для того, чтобы сломать симметрию градиентов.
Прощупывать минимумы при помощи рандома конечно можно, но делают так редко ибо нет особых гарантий. Для мл, как мне кажется, проблема плохого минимума при обучении не особо стоит. Другое дело, что модели с разной инициализацией можно использовать для ансамблей.
задаём начальные случайные значения коэффициентам линейной регрессии
a = np.random.randn(1)
b = np.random.randn(1)
Никогда не понимал, ради чего. Это же выпуклая задача, не важно откуда мы стартуем, а работать с 0 в качестве инициализации проще. Зачем shuffle тоже не понятно
Ну и да, при наличии аналитического решения использовать GD как-то наивно
А ещё там можно обновлять не матрицу, а сразу разложение Холецкого
Про такое не слышал, а можно подробней?
А ещё есть трюки, чтобы сразу взять "хорошее" приближение для матрицы
А не поделитесь тем, что зашло?)
Линейный поиск стал для меня причиной отказа от BFGS в продакшене — слишком сложно тюнить для некоторых случаев. Гаусс-Ньютон не всегда хорош, но довольно робастен, на практике. К сожалению, расчет якобиана не очень хорошо ложится на автодифф, поэтому приходиться страдать.
Локально аппроксимируем нашу функцию ошибки в точке при помощи квадратичной функции, после чего делаем шаг в точку минимума нашей аппроксимации. Повторить до сходимости.
Можете представить себе участок функции ошибки, который выглядит как "узкий желоб" с небольшим наклоном (например что-то похожее на https://www.wolframalpha.com/input/?i=f%28x%2C+y%29+%3D+100*x%5E2+%2B+0.1*y%5E2+-+x*y). Предположим, что мы стоим на стенке. Метод наискорейшего спуска укажет в сторону противоположной стенки. Дальше, если у нас есть эффективный line search, то градиентному спуску надо сделать сначала шаг в пространство между стенками, а потом шаг в направлении наклона желоба. Если у нас нет эффективного line search, то градиентный спуск будет осцилировать между стенками, медленно смещаясь в сторону глобального минимума.
Метод Ньютона сразу будет делать эффективный шаг в минимум, т.к. помимо направления наискорейшего спуска им известна локальная форма функции.
В теории, методы третьего порядка должны давать еще более эффективные шаги, но на практике такую аппроксимацию очень сложно и дорого использовать.
alexkolzov а нет желания подробно разобрать BFGS? Что метод Ньютона, что Гаусса-Ньютона довольно хорошо разобраны в разных источниках, а для BFGS все обычно ограничиваются общей формулировкой (накапливаем значение матрицы обратной матрице Гессе), и выражением для шага. А метод ведь очень красивый, и использует только градиент ф-ии + line search
А еще лучше K-FAC (https://arxiv.org/abs/1503.05671). Там вообще все хорошо — идеи из метода Гаусса-Ньютона адаптируются для эффективного обучения нейронок. Правда его все еще никто особо не использует на практике :)
Тогда уж приводить параболу к плоскости, форма региона не меняется.
Не очень правильно выразился — парабола остается параболой, просто если оригинальная аппроксимация могла иметь довольно вытянутую форму (эллипс), то добавление регуляризации сделает ее менее вытянутой (сфера)
По идее вы правы, но я говорил о том, что не знаю строгого обоснования.
Так-то и метод Гаусса-Ньютона тоже во многом эмпиричен :) Если не ошибаюсь, то его сходимость не гарантируется, в отличие от метода Ньютона. Более того, что Левенберг-Марквардт, что Dog leg опираются на эвристики при подборе размера trust region.
К сожалению, мне не известно хоть сколь-нибудь строгого обоснования данного выбора, но в качестве эмпирической рекомендации он упоминается довольно часто.
Не настоящий сварщик, но есть версия, что это для того, чтобы скомпенсировать разный масштаб переменных, который не учитывается в дефолтной регуляризации с единичной матрицей. В этом случае, как раз, доверительный регион будет "эллипсом", а не "сферой"
Я не уверен, но похоже на локальный минимум
Рассмотрим одномерный случай — "картинку" размера 4, которая подается на вход свертке с ядром 3, а потом макспулингу размера 2, после чего мы имеем на выходе одно число
Пусть картинка имеет вид [10, 3, 5, -4]. Свертка состоящая из [1, 1, 1], без bias, даст на выходе картинку [18, 4], пулинг даст на выходе просто 18. Т.е. 18 и будет нашим целевым значением. Теперь мы стартуем со случайных весов, и пусть так получилось, что веса имеют вид [0, 3, 0]. Свертка даст на выходе вектор [9, 15], пулинг даст, соответственно, 15. Теперь, при оптимизации свертка будет ориентироваться только на правую часть картинки, т.к. макспулинг пустит их только в одну сторону. Мне немного лень считать конечный результат, но скорее всего оптимизация будет немного увеличивать все три значения ядра, до сходимости.
При этом ошибка будет нулевая, и итоговое ядро не будет совпадать с изначальным.
Но, т.к. вы, вероятно, пропускаете через свертку большую картинку, то у вас требуется чтобы свертка удовлетворяла сразу множеству выходов, и тут уже не все локальные минимумы позволяют получить нулевой лосс.
При этом, чем больше размер пуллинга, тем больше шансов получить другой локальный минимум, что согласуется с вашим экспериментом. По идее, должно быть меньше проблем, если поставить свертку после пуллинга
UPD — немного поправил пример, оптимизация не привела бы к моему решению, из указанного мной стартового ядра
Кораблик уже интересней, хотя совсем не понятно откуда такая плохая сегментация мачты.
Вроде того. Накрашенные губы + макияж это наверное лучшее что можно придумать для сегментации, на самом деле. Естественная разметка, так сказать, вместе с очень удобным фоном. Нейронкам должно очень хорошо заходить, т.к. они легко учат текстуру. У вас где-то в видео, кстати, был забавный пример, где сегментация цепляет ботинки, т.к. они одного цвета со штанами.
Самая большая проблема это обветренные мужские губы с большим диапазоном движений (крики, закусывание губы и т.д.). Практически нереально разметить консистентно, т.к. зачастую не видна граница между губой и кожей + не очевидно где кончается губа, и начинается ротовая полость. Отдельно — проблемы из-за оттока крови на некоторых эмоциях.
Видео несколько спасает, но требуется очень большой фпс и отличный свет, чтобы избежать motion blur.
А есть более сложные примеры? Накрашенные губы это же совсем халява :(
lua-torch мертв, по сути, все используют pytorch. Строго говоря, все популярные фреймворки ориентируются на python, в первую очередь. Если знаете C++, то необходимая база питона набирается за пару недель
Фреймворки проектируются так, чтобы ими можно было пользоваться имя минимальные навыки программирования
У вас есть куча автодифф фреймворков на выбор (torch, chainer, mxnet, etc). Дробите свою сеть на части, сверяйте производные которые взяли руками с тем, что выдает фреймворк, правьте реализации, если результаты не совпадают.
Все же еще не ноль?
Возможно пришло время осилить батчнорм
Думается мне, что это был типа задел на еще одну статью про обучение нейронок. Тогда shuffle это для минибатчей, а случайная инициализация для того, чтобы сломать симметрию градиентов.
Прощупывать минимумы при помощи рандома конечно можно, но делают так редко ибо нет особых гарантий. Для мл, как мне кажется, проблема плохого минимума при обучении не особо стоит. Другое дело, что модели с разной инициализацией можно использовать для ансамблей.
Никогда не понимал, ради чего. Это же выпуклая задача, не важно откуда мы стартуем, а работать с 0 в качестве инициализации проще. Зачем shuffle тоже не понятно
Ну и да, при наличии аналитического решения использовать GD как-то наивно
Спасибо! Почитаем
Спасибо!
Про такое не слышал, а можно подробней?
А не поделитесь тем, что зашло?)
Линейный поиск стал для меня причиной отказа от BFGS в продакшене — слишком сложно тюнить для некоторых случаев. Гаусс-Ньютон не всегда хорош, но довольно робастен, на практике. К сожалению, расчет якобиана не очень хорошо ложится на автодифф, поэтому приходиться страдать.
Локально аппроксимируем нашу функцию ошибки в точке при помощи квадратичной функции, после чего делаем шаг в точку минимума нашей аппроксимации. Повторить до сходимости.
Можете представить себе участок функции ошибки, который выглядит как "узкий желоб" с небольшим наклоном (например что-то похожее на https://www.wolframalpha.com/input/?i=f%28x%2C+y%29+%3D+100*x%5E2+%2B+0.1*y%5E2+-+x*y). Предположим, что мы стоим на стенке. Метод наискорейшего спуска укажет в сторону противоположной стенки. Дальше, если у нас есть эффективный line search, то градиентному спуску надо сделать сначала шаг в пространство между стенками, а потом шаг в направлении наклона желоба. Если у нас нет эффективного line search, то градиентный спуск будет осцилировать между стенками, медленно смещаясь в сторону глобального минимума.
Метод Ньютона сразу будет делать эффективный шаг в минимум, т.к. помимо направления наискорейшего спуска им известна локальная форма функции.
В теории, методы третьего порядка должны давать еще более эффективные шаги, но на практике такую аппроксимацию очень сложно и дорого использовать.
alexkolzov а нет желания подробно разобрать BFGS? Что метод Ньютона, что Гаусса-Ньютона довольно хорошо разобраны в разных источниках, а для BFGS все обычно ограничиваются общей формулировкой (накапливаем значение матрицы обратной матрице Гессе), и выражением для шага. А метод ведь очень красивый, и использует только градиент ф-ии + line search
А еще лучше K-FAC (https://arxiv.org/abs/1503.05671). Там вообще все хорошо — идеи из метода Гаусса-Ньютона адаптируются для эффективного обучения нейронок. Правда его все еще никто особо не использует на практике :)
Насчет сходимости Гаусса-Ньютона — https://en.wikipedia.org/wiki/Gauss%E2%80%93Newton_algorithm#Convergence_properties. Пишут что "However, convergence is not guaranteed, not even local convergence as in Newton's method, or convergence under the usual Wolfe conditions"
Вот их я и имел ввиду.
Почти любой метод второго порядка быстрее чем градиентный спуск, причем намного (как минимум для большинства практических задач).
Не очень правильно выразился — парабола остается параболой, просто если оригинальная аппроксимация могла иметь довольно вытянутую форму (эллипс), то добавление регуляризации сделает ее менее вытянутой (сфера)
Так-то и метод Гаусса-Ньютона тоже во многом эмпиричен :) Если не ошибаюсь, то его сходимость не гарантируется, в отличие от метода Ньютона. Более того, что Левенберг-Марквардт, что Dog leg опираются на эвристики при подборе размера trust region.
Пока мы не регуляризируем — да, но добавление lambda*I начинает приводить нашу параболу к сферической форме.
По идее так же работает диагональный прекондишенер в методе сопряженных градиентов
Не настоящий сварщик, но есть версия, что это для того, чтобы скомпенсировать разный масштаб переменных, который не учитывается в дефолтной регуляризации с единичной матрицей. В этом случае, как раз, доверительный регион будет "эллипсом", а не "сферой"
Я не уверен, но похоже на локальный минимум
Рассмотрим одномерный случай — "картинку" размера 4, которая подается на вход свертке с ядром 3, а потом макспулингу размера 2, после чего мы имеем на выходе одно число
Пусть картинка имеет вид
[10, 3, 5, -4]
. Свертка состоящая из[1, 1, 1]
, без bias, даст на выходе картинку[18, 4]
, пулинг даст на выходе просто18
. Т.е.18
и будет нашим целевым значением. Теперь мы стартуем со случайных весов, и пусть так получилось, что веса имеют вид[0, 3, 0]
. Свертка даст на выходе вектор[9, 15]
, пулинг даст, соответственно,15
. Теперь, при оптимизации свертка будет ориентироваться только на правую часть картинки, т.к. макспулинг пустит их только в одну сторону. Мне немного лень считать конечный результат, но скорее всего оптимизация будет немного увеличивать все три значения ядра, до сходимости.При этом ошибка будет нулевая, и итоговое ядро не будет совпадать с изначальным.
Но, т.к. вы, вероятно, пропускаете через свертку большую картинку, то у вас требуется чтобы свертка удовлетворяла сразу множеству выходов, и тут уже не все локальные минимумы позволяют получить нулевой лосс.
При этом, чем больше размер пуллинга, тем больше шансов получить другой локальный минимум, что согласуется с вашим экспериментом. По идее, должно быть меньше проблем, если поставить свертку после пуллинга
UPD — немного поправил пример, оптимизация не привела бы к моему решению, из указанного мной стартового ядра