Pull to refresh

Comments 35

Буквально сегодня наткнулся на первую часть и за её давностью подумал, что второй уже и не будет. А тут такой сюрприз. Спасибо!
Спасибо огромное, что берёте на себя такой труд. Очень хорошая статья, и очень нужная.

Отличчя стаття. Особенно гениальны примеры. Не смотря на знание предметной области, прочитал от начала до конца для того, что б освежить память. Продолжайте в том же духе!

Спасибо за статью! Возможно ли применение каких-либо численных методов для подбора гиперпараметров?
Спасибо за статью :) Не хотите больше написать о использовании НС для прогнозирования направления цен акций?
Я пока не понял вот что. Все формулы, вычисляющие корректировки при обратном проходе у вас не зависят от ошибки. Я что то пропустил? Ткните носом, пожалуйста…
Вопрос снимается, покурил еще раз тест и увидел что ошибка берется из дельты Oideal-Oout для выходного нейрона. Т.е. у нас есть две ошибки — первая в первой части статьи для эпохи, и вторая тут для обратного прохода с коррекцией.
Все правильно, ошибка вычисляется у выходного нейрона и «записывается» в дельту, а все остальные нейроны наследуют эту ошибку из цепочки дельт. На счет 2 ошибок. Ошибка на самом деле одна. Она формируется после каждой итерации, просто в конце эпохи ошибка имеет большее значение так как она учитывает проход по всей выборке данных.
Побольше бы преподавателей в школах и вузах с изложением материала как у вас! Наглядные, понятные и логичные примеры. А обычно это выглядит так: это же просто, надо лямбду от икс в пятидесятой степени, пропустить через функцию галилео ньютона, применить градиент от корня константы джорджа синявкина и будет вам щщщастье! Огромное спасибище! Буду ждать с нетерпением дальнейших статей.
Автор, большое спасибо! С нетерпением жду дальнейших статей.

Вот классная анимация методов оптимизации. Там интересно поиграться с шагом градиентного спуска.



Стиль изложения нравится, единственное – напрягает такое отображение формул. Хабр нынче и LaTeX поддерживает.

у вас очень своеобразное видение нейросетей, если понимаете о чем я
вот уже вторая часть прочитана — и мне пока ещё ВСЁ понятно :))
очень хороший стиль изложения, буду ждать продолжения… прямо даже интерес появился к теме нейросетей

Очень полезная статья. Хорошее продолжение первой части

Недавно начал разбираться с нейронными сетями, не все понял. Получается, что мы для каждого элемента обучающей выборки считаем ошибку, и корректируем веса нейронов каждую итерацию, или каждую эпоху?

Бывают ли ситуации, когда разные элементы обучающей выборки двигают веса в противоположные стороны, и сеть не обучается?
Мы вычисляем ошибку после каждой итерации и в соответствии с этим меняем веса. Такой случай, что каждый элемент тянет в свою сторону бывает, но в конечном случае это редко приводит к несходимости, разве что в том случае, когда элементы выборки противоречат друг другу.

Есть разные способы/формулы для вычисления ошибки результата НС: половина квадрата Евклидового расстояния, логарифмическое подобие и т.д. Возможно я это упустил, но какой тип используется здесь? И как изменяться формулы в статье, если мы захотим использовать другой тип?

Здесь используется MSE (квадратичная ошибка). О способах вычисления ошибок я писал в первой статье.
Подскажите, пожалуйста, почему для расчета градиентов весов w1-w4 берется произведение самого веса на дельту скрытого нейрона, а не произведение той же дельты на выходное значение входного нейрона (0 или 1)?
Вы абсолютно правы! Извиняюсь, по своей невнимательности неправильно подставил значения в формулу. На конечный результат это конечно не сильно повлияло, но в таком случае бы НС врядли бы смогла найти решение.
Возник вопрос по поводу рассчета градиента (и, соответственно, ошибки) для ребер, исходящих из входных нейронов. По формуле он равен произведению выхода нейрона в начале ребра на ошибку нейрона в конце ребра. С ошибкой все понятно, насчет выхода начальных нейронов не совсем. В примере при рассчете градиента ребер w1 — w4 на месте выхода нейрона в произведении стоит вес ребра. Но разве выход нейрона I2 не будет равен нулю, ведь на него подается входной сигнал, равный нулю (I2 = 0), а выход равен Wi * I2?

По сути это вполне логично, так как если входной сигнал какого-то нейрона — 0, то и веса всех исходящих ребер домножатся на 0 и не повлияют на ответ, а значит, мы не сможем оценить, какую ошибку внес вес этого ребра. Или я чего-то не понимаю?

Если я все-же прав, то в общем случае outA в формуле градиента можно выразить как wAB * outputA, где outputA = f(inputA), при этом для входных нейронов f(x) = x, для остальных f(x) = sigmoid(x)?

Автору большое спасибо за статью! Жду продожения
Пытаюсь по Вашим статьям разобраться с нейронными сетями.

Первая статья читалась легко, с этой есть непонимание

Вопросы:
1. В поиске минимума Вы упоминаете момент. Не понятно что это.

2. Насколько я понимаю, в зависимости от вида функции, у нее может быть очень много минимумов, причем глобальный минимум может быть очень узким. В таком случае найти его будет сложно — не зная устройства функции нужно фактически делать перебор огромного количества значений.
При этом, насколько я понимаю, входные параметры (это W(i) ) могут меняться в широких пределах (каких?).
Почему тут
image
нас не устроил последний вариант? Ведь там может быть спуск еще ниже.

Отсюда выводы:
а. либо нам на самом деле не так важно найти глобальный минимум
б. либо мы что-то знаем о функции, из-за чего можем считать, что этот минимум — нужный.

2. Вы упоминаете «дельту», но не ввели это понятие. Судя по формуле 1: ДельтаО=(Идеальное значение — реальное значение)* производную функции активации,

Эта ДельтаО по сути — то, насколько (и куда, это же вектор?) надо сместиться, чтобы предположительно попасть в минимум.

Что такое Дельтаh и Дельтаi — не понял.
Видимо, вы описываете то, насколько изменится выход конкретного нейрона (Делтаh) при изменении его входов (Делтаi). Но непонятно почему тогда это не работает с выходным нейроном — он же работает по тому же принципу.
Вы не понимаете сути градиентного спуска. Никакого перебора мы не делаем, следуя по градиенту мы просто будем скатываться в низину. Глобальный минимум — это обязательное условие и мы не считаем, что он нужный или нет. Алгоритм сам его найдет, если все параметры подобраны верно. Про момент написано в статье, прочитайте внимательнее.

Дельта это просто обозначение параметра. За ним нет никакого глубокого значения. Некоторые НС вообще используют другой алгоритм, в котором нет такого параметра как дельта.
Да, я не понимаю сути градиентного спуска и прошу мне объяснить. Уже часа три пытаюсь разобраться.

Если мы не опираемся на вид функции f(w), то давайте представим эту функцию так:
График
image

Точка старта обозначена пересечением красных линий. Я не понимаю как этот алгоритм найдет глобальный минимум на указанном интервале.

Соответственно, где-то я ошибаюсь.

Я подозреваю, что функция не может иметь такого вида (для любого одного нейрона с обычной функцией активации эта функция должна имеет более простой график, чем я указал) и в следствие этого алгоритм градиентного спуска видимо работает корректно.

Про момент написано почти в конце, а в этом месте уже очень большой накопившийся градус непонимания.
В большинстве случаев функция не будет на столько волнистой. Однако это не отменяет того факта, что мы можем случайной инициализацией весов поставить точку отсчета в заранее проигрышную позицию. Как и показано у вас на графике, начав ГС с точки в пересечении красных линий, мы никогда не попадем в глобальный минимум, который находиться по другую сторону склона. В таком случае помогает реинициализация весов или выбор другого алгоритма. Надо помнить, что градиентный спуск это самый примитивный алгоритм и далеко не самый продуктивный.
Спасибо. Статья очень понравилась.
Есть несколько моментов, которые сбивают с толку.
Первая картинка (анимация) после «Что такое Метод Обратного Распространения (МОР)?» показывает совсем другие формулы. При вычислении ошибки там не умножают на производную. Умножение на производную происходит при коррекции весов, при этом результат будет уже другим.
И такая строчка
«Запомните, что после подсчета дельты нейрона мы обязаны сразу обновить веса всех исходящих синапсов этого нейрона. Так как в случае с O1 их нет, мы переходим к нейронам скрытого уровня ...»
Вроде, зная дельту нейрона, мы можем обновить веса не исходящих, а входящих синапсов этого нейрона, в случае О1 они есть и их можно обновить.
Корректно ли сравнивать 2 итерации с одними и теми же входными данными? Должен же минимум сет один отработать? Т.е. в нашем случае 4 итерации, верно? Я это к тому, что вот я написал код, который работает точно как у вас в примере(ваши проверки корректно отрабатывают) и сходимость есть если также как и вы на вход давать одни и те же данные, но это же не корректно? Необходимо сначала подать 10, затем 00, затем 01, затем 11. Почему вы подаете 10, затем опять 10 и сравниваете эти данные? Вот если подавать разные данные, то сходимости нет. Пробывал уже и нейроны смещения добавлять и менять скорость и момент и количество итераций. Остается только дополнительные нейроны вводить?
Готовлюсь к экзамену по твоим статьям) Спасибо большое за материал, все супер!

Сейчас, конечно, 2023 уже, но статьи хорошие. Для не математиков в самый раз.

Sign up to leave a comment.

Articles