это очень хороший видеоролик: информация, графика - все на уровне! ты замотивировал меня сдуть пыль с моего старого проекта (писал свою версию такотрона2 для курсачча) и продолжить изучение нейронок и соответственно разработку проекта. жду еще видеороликов на подобные темы, которые объясняют самую базу. спасибо !
Круть. Все понятно. Это было у нас на теории эксперемента в институте. Только тогда питона небыло 😂😂😂. А что делать если есть 2 вершины.например график функции увеличивается, наступает локальный максимум потом уменьшается. Получается обучение застрянет на этом локальном максимуме, но дальше функция какое то время уменьшается, а потом опять увеличивается. И второй максимум например выше чем прошедший первый. Как убедится что мы нашли самый максимальный максимум за всю функцию, а не локальный?
Никак) Градиентный спуск находит именно локальный минимум, но с увеличением числа параметров появляются довольно интересные эффекты, из-за которых нам становится довольно все-равно на это. Может будет об этом еще отдельный ролик, но если вкратце: если у нас функция одной переменной, то мы по ней можем двигаться только "влево" и "вправо" и попадаем в минимум очень быстро. Если переменных две, то мы уже можем "огибать" некоторые возвышенности, перемещаясь по более сложной траектории. Когда мы попадаем в минимум, производная по всем производным становится нулем, а вокруг функция только возрастает. Так вот с увеличением количества параметров вероятность того, что по всем из них больше некуда двигаться уменьшается. Если у нас функция от миллиарда параметров, то надо еще очень постараться, чтобы найти хотя-бы локальный минимум. При этом в функции появляется огромное количество почти равнозначных минимумов, и мы просто будем идти в какой-то из них.
Ну это только пример, можно адаптировать под свои задачи. Например мы делам программу, в которой пользователь от руки рисует какую-то фигуру, например прямоугольник. Алгоритмом находим его углы и делаем их вершинами, чтобы выровнять используем этот алгоритм. Кажется, в corel draw что-то похожее было.
Краснотех, у тебя ошибка. На 4:46 ты говоришь, что стоит задача 2-ая - как сильнее двигаться на более крутых склонах. Наоборот, чем склон круче, т.е. чем сильнее ошибка минимизируется при малейшем изменении параметров, тем меньший шаг мы должны делать, а не сильнее двигаться. А вот при плоских склонах как раз-таки нужно побольше шаги делать. И да, ты не ответил на этот вопрос. У тебя константный выбор шага изменения параметров, т.е. ты всегда двигаешься с одинаковой скоростью. И я вот не могу понять, объясни. Пусть у нас 2 параметра. Их значение 15 и 20. Шаг прироста 1. Чтобы вычислить градиент, мы должны сделать их 16 и 21 и высчитать ошибку, верно? А дальше? Если ошибка оказалась меньше, чем при 15 и 20, значит на 1 увеличиваем оба параметра? А что если лучше было бы лишь 1 параметр увеличить, .е. 15 на 16, а 20 не изменять? Или градиентный спуск сможет это понять? С 1 переменной логика понятна, но с 2-мя - не понимаю.
Так он же сказал, что мы должны искать именно вектор к наилучшему решению из текущей позиции. То есть ты сначала замеряешь, что будет при изменении a на дельту, выбираешь лучшее изменение (то есть -1, 0 или +1), потом по b делаешь то же самое. Делаешь шаг и повторяешь процедуру, пока по обоим переменным изменение не будет 0. И ты правильно пишешь, что стоит изменять шаг при разных ситуациях и это уже будет считаться оптимизацией. То есть в зависимости от изменения loss относительно предыдущего шага мы может изменять дельту шага.
1. Нет, мы должны быстрее двигаться на более крутых склонах. Это точно правильно, посмотрите еще раз анимацию спуска, которая сразу после кода. Там значения взяты из того, что выдал тензорфлоу спуск, т.е. его не я написал, и он как раз двигается сильнее на более крутом склоне. Тут логика такая: Если склон крутой, то мы еще где-то далеко от ответа и надо двигаться быстрее. Если очень пологий, почти плато, то нужно двигаться на очень маленький шаг, ответ уже рядом и нужно отсюда не "улететь". 2. Вот эта подстановка чисел - это скорее про первый алгоритм поиск восхождением, он бы по честному проверял все 8 вариантов (какой изменять и куда). Градиентный спуск ничего не проверяет (я думал, это сказано достаточно явно, но видимо нужно было еще сильнее). Он использует производную функции, которая вычисляется где-то автоматически и по ней сразу понимает направление. Т.е. если там хоть 1000 параметров измерение он проводит одно, далее проводит одно измерение производной для каждого параметра (эти процессы на оптимизируются и данные проходят через нейросеть всего один раз) и мы сразу получаем численное значение ошибки и градиент.
@@КрасноТех Я имею ввиду, после рассчета вектора градиента, как правильно изменить веса? Судя по тому, как мне ответили - делаем это по знаку каждой частной производной. Если мы получили скажем такой вектор [-5, +3, -3], то мы должны 1 параметр уменьшить на минимальный шаг, второй увеличить, а третий - уменьшить. Я правильно понимаю? Ты просто этот момент не раскрыл с наглядными примерами, как мне показалось. Еще вопрос, ты шаришь за обратное распространение ошибки? Интересно было бы увидеть видос на эту тему, как никак самый главный инструмент для обучения многослойных сетей.
@@bunasha Просто прибавить вектор градиента к весам умноженный на learning rate, например, веса [10, 20, 30], градиент [1, -2, 0.5], lr = 0.1, тогда новые веса [10 + 0.1, 20 - 0.2, 30 + 0.05]. Обратное распространение это просто способ найти градиент, он сам считает производные по каждому параметру применяя формулу производной сложной функции много раз.
А я напомню, что анонсы роликов и что-то о текущих проектах иногда появляются в мое тг канале t.me/krasnoteh_ai
Информативность и подача материала отличная, анимация в видео с каждым роликом все лучше и лучше!
Ну наконец то видево, ты не пропадай там
Во-во
Очень сильно!
Ролики с каждым разом все круче!
Больше спасибо!
Ничего не понятно, но очень интересно. Огромное спасибо за ролик!
Спасибо. Давай еще.
это очень хороший видеоролик: информация, графика - все на уровне! ты замотивировал меня сдуть пыль с моего старого проекта (писал свою версию такотрона2 для курсачча) и продолжить изучение нейронок и соответственно разработку проекта. жду еще видеороликов на подобные темы, которые объясняют самую базу. спасибо !
Честно говоря, пока только начинаю в этой теме разбираться, но вроде всё так. Видео отличное
Очень хорошо объяснил спасибо
Интересные у вас видео про нейросети... Скажите, а на каком компе вы работаете, какой процессор, сколько оперативки?
Ноут просто, asus, лет 5 ему, средней ценовой категории, оператива 32 гб, проц ryzen radeon, gpu gtx 1650
Круть. Все понятно. Это было у нас на теории эксперемента в институте. Только тогда питона небыло 😂😂😂. А что делать если есть 2 вершины.например график функции увеличивается, наступает локальный максимум потом уменьшается. Получается обучение застрянет на этом локальном максимуме, но дальше функция какое то время уменьшается, а потом опять увеличивается. И второй максимум например выше чем прошедший первый. Как убедится что мы нашли самый максимальный максимум за всю функцию, а не локальный?
Никак) Градиентный спуск находит именно локальный минимум, но с увеличением числа параметров появляются довольно интересные эффекты, из-за которых нам становится довольно все-равно на это. Может будет об этом еще отдельный ролик, но если вкратце: если у нас функция одной переменной, то мы по ней можем двигаться только "влево" и "вправо" и попадаем в минимум очень быстро. Если переменных две, то мы уже можем "огибать" некоторые возвышенности, перемещаясь по более сложной траектории. Когда мы попадаем в минимум, производная по всем производным становится нулем, а вокруг функция только возрастает. Так вот с увеличением количества параметров вероятность того, что по всем из них больше некуда двигаться уменьшается. Если у нас функция от миллиарда параметров, то надо еще очень постараться, чтобы найти хотя-бы локальный минимум. При этом в функции появляется огромное количество почти равнозначных минимумов, и мы просто будем идти в какой-то из них.
@КрасноТех спасибо за ответ!
Пркатическое применение с изменением углов в графе подскажите пожалуйста.
Интересная задача, но где и для чего ее применить.
Спасибо!
Ну это только пример, можно адаптировать под свои задачи. Например мы делам программу, в которой пользователь от руки рисует какую-то фигуру, например прямоугольник. Алгоритмом находим его углы и делаем их вершинами, чтобы выровнять используем этот алгоритм. Кажется, в corel draw что-то похожее было.
Краснотех, у тебя ошибка. На 4:46 ты говоришь, что стоит задача 2-ая - как сильнее двигаться на более крутых склонах. Наоборот, чем склон круче, т.е. чем сильнее ошибка минимизируется при малейшем изменении параметров, тем меньший шаг мы должны делать, а не сильнее двигаться. А вот при плоских склонах как раз-таки нужно побольше шаги делать. И да, ты не ответил на этот вопрос. У тебя константный выбор шага изменения параметров, т.е. ты всегда двигаешься с одинаковой скоростью.
И я вот не могу понять, объясни. Пусть у нас 2 параметра. Их значение 15 и 20. Шаг прироста 1. Чтобы вычислить градиент, мы должны сделать их 16 и 21 и высчитать ошибку, верно? А дальше? Если ошибка оказалась меньше, чем при 15 и 20, значит на 1 увеличиваем оба параметра? А что если лучше было бы лишь 1 параметр увеличить, .е. 15 на 16, а 20 не изменять? Или градиентный спуск сможет это понять? С 1 переменной логика понятна, но с 2-мя - не понимаю.
Так он же сказал, что мы должны искать именно вектор к наилучшему решению из текущей позиции. То есть ты сначала замеряешь, что будет при изменении a на дельту, выбираешь лучшее изменение (то есть -1, 0 или +1), потом по b делаешь то же самое. Делаешь шаг и повторяешь процедуру, пока по обоим переменным изменение не будет 0. И ты правильно пишешь, что стоит изменять шаг при разных ситуациях и это уже будет считаться оптимизацией. То есть в зависимости от изменения loss относительно предыдущего шага мы может изменять дельту шага.
1. Нет, мы должны быстрее двигаться на более крутых склонах. Это точно правильно, посмотрите еще раз анимацию спуска, которая сразу после кода. Там значения взяты из того, что выдал тензорфлоу спуск, т.е. его не я написал, и он как раз двигается сильнее на более крутом склоне. Тут логика такая: Если склон крутой, то мы еще где-то далеко от ответа и надо двигаться быстрее. Если очень пологий, почти плато, то нужно двигаться на очень маленький шаг, ответ уже рядом и нужно отсюда не "улететь".
2. Вот эта подстановка чисел - это скорее про первый алгоритм поиск восхождением, он бы по честному проверял все 8 вариантов (какой изменять и куда). Градиентный спуск ничего не проверяет (я думал, это сказано достаточно явно, но видимо нужно было еще сильнее). Он использует производную функции, которая вычисляется где-то автоматически и по ней сразу понимает направление. Т.е. если там хоть 1000 параметров измерение он проводит одно, далее проводит одно измерение производной для каждого параметра (эти процессы на оптимизируются и данные проходят через нейросеть всего один раз) и мы сразу получаем численное значение ошибки и градиент.
@@КрасноТех Я имею ввиду, после рассчета вектора градиента, как правильно изменить веса? Судя по тому, как мне ответили - делаем это по знаку каждой частной производной. Если мы получили скажем такой вектор [-5, +3, -3], то мы должны 1 параметр уменьшить на минимальный шаг, второй увеличить, а третий - уменьшить. Я правильно понимаю? Ты просто этот момент не раскрыл с наглядными примерами, как мне показалось.
Еще вопрос, ты шаришь за обратное распространение ошибки? Интересно было бы увидеть видос на эту тему, как никак самый главный инструмент для обучения многослойных сетей.
@@bunasha Просто прибавить вектор градиента к весам умноженный на learning rate, например, веса [10, 20, 30], градиент [1, -2, 0.5], lr = 0.1, тогда новые веса [10 + 0.1, 20 - 0.2, 30 + 0.05].
Обратное распространение это просто способ найти градиент, он сам считает производные по каждому параметру применяя формулу производной сложной функции много раз.