Главное разочарование, которое у меня было, когда я пытался узнать о нейронных сетях, заключалось в том, что большинство руководств либо слишком математически ориентированы, либо слишком сложны для понимания, и вы чувствуете, что никогда не поймете, о чем они на самом деле говорят. , или что они слишком поверхностны и просто представляют вам структуру, которая делает все за вас. В обоих случаях вы в конечном итоге не совсем понимаете, что происходит под капотом. Большинство книг расскажут вам об алгоритме обратного распространения, который является стандартным алгоритмом для обучения нейронных сетей, но они не дадут вам интуитивного объяснения того, как он работает и что именно происходит. Также попробуйте найти в Интернете несколько учебных пособий по нейронным сетям, и вы сразу поймете, о чем я говорю. Вы обнаружите, что многие из них просто скажут вам, что нейронная сеть - это просто стопка слоев, и каждый слой имеет от одного до любого количества нейронов. И что каждый нейрон в одном слое будет подключаться к каждому нейрону в следующем слое, давая полную графоподобную структуру. И что нейрон будет получать некоторые входные данные, и каждый вход умножается на весовой коэффициент a.i. число с действительным значением, и, в конце концов, все эти продукты будут суммированы, и они будут проходить через функцию, подобную сигмоиде, и этот процесс повторяется на каждом нейроне в каждом слое. И, используя алгоритм обратного распространения, каким-то волшебным образом эта гигантская структура умножения сможет распознавать лица на изображениях и сможет переводить текст с английского на французский и так далее. Это, безусловно, выглядит очень волшебно и устрашающе, когда вы пытаетесь понять, почему набор умножений и сумм действительных чисел действительно делает трюки, о которых обычный алгоритм мог бы только мечтать. Хотя стандартная нейроноподобная структура по какой-то причине выглядит очень простой, если у вас их достаточно и достаточно данных для обучения, эти очень простые структуры будут вычислять самые сложные вещи. Вещи, которые невозможно вычислить с помощью обычного алгоритма, несмотря на то, насколько они сложны и изощренны.

Основная цель этого поста - попытаться немного углубиться в детали того, что на самом деле означает обучение нейронной сети. Чтобы понять, что происходит и как меняются веса, чтобы сделать эту довольно простую систему нейроноподобных структур настолько эффективной при вычислении почти всего. Мы не собираемся представлять здесь какой-либо фреймворк, и вы не увидите никакого исходного кода. Эта лекция предназначена для понимания теоретических аспектов обучения нейронной сети и того, почему некоторые вещи выполняются именно так, как они делаются, не вдаваясь в очень сложные математические или статистические аспекты этого. Я изо всех сил старался, чтобы математика была как можно проще. Например, многие учебники расскажут вам, что обратное распространение в значительной степени зависит от частичной дифференциации. Но, читая многие из этих руководств, вы не поймете, зачем нужна частичная дифференциация. Он представлен в виде черного ящика, который творит за вас чудеса. Просто нужно как-то ему доверять. По крайней мере, так было у меня.

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

Думаю, нам следует начать. Повеселись :)

Прежде чем вдаваться в подробности, мы должны начать с некоторых примеров того, на что способна простая нейронная сеть. Например, довольно простая нейронная сеть, которая может распознавать рукописные цифры, примет в качестве входных данных изображения размером 28 * 28 пикселей каждое и выведет число, отображаемое на этом изображении. Вход можно представить как массив из 784 (28 * 28) записей, каждая из которых представляет интенсивность пикселей в виде числа от 0 (черный) до 255 (белый), а на выходе будет массив из 10 (все цифры от 0 до 9. ), которые равны либо 0, либо 1. Так, если, например, мы дадим нейронной сети в качестве входных данных изображение с рукописной цифрой 1 на нем, мы ожидаем, что выходной вектор будет равен 0, а вторая позиция будет равна 1. Итак, вы получите смысл. Между входным слоем из 784 нейронов и выходным слоем из 10 нейронов мы можем иметь столько слоев, сколько захотим, каждый из которых имеет разные размеры. Обычно в этом случае у нас будет один скрытый слой из 300 нейронов. Сильфон - это изображение этой нейронной сети. Очевидно, я не смог представить ни все 784 нейрона на входном слое, ни 300 на скрытом слое.

Это образец изображения, которое может распознать нейронная сеть:

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

Мы берем на вход кортеж из 784 действительных чисел (интенсивность каждого пикселя в изображении) и выводим кортеж из 10 чисел, которые могут иметь только значения 0 или 1. В нашем случае только одно значение будет равно 1, остальные будут быть 0. Мы не говорим о частном случае, когда входное изображение вообще не содержит никаких цифр. Мы собираемся здесь упростить. Нейронная сеть в этом случае попытается получить достаточно аннотированных обучающих данных, чтобы аппроксимировать эту очень сложную функцию. С математической точки зрения нейронная сеть на самом деле представляет собой универсальный аппроксиматор функций. вот что делает их такими мощными и эффективными. Одним из примеров приближения функции с определенной степенью погрешности является статистический метод, известный как регрессия. Он широко используется в машинном обучении. Вы можете найти больше о регрессии в Интернете. В этом посте мы ограничимся простейшим типом регрессии. Линейная регрессия.

Линейная регрессия

В общем, у нас есть набор данных, которые мы будем называть обучающими данными. Данные обучения будут содержать пары ввода и желаемого вывода. В нашем рукописном примере обучающие данные будут содержать несколько тысяч пар, таких как (X, y), где X - массив из 784 значений, а y - массив из 10 значений 0 или 1. Затем мы создаем нашу нейронную сеть, в которой все веса инициализируются некоторыми случайными значениями. Поскольку значения случайны, мы ожидаем, что когда мы дадим нейронной сети изображение на входе, результат не будет соответствовать желаемому выходу для этого конкретного изображения. Поэтому работа по обучению нейронной сети состоит в том, чтобы убедиться, что мы находим способ настроить веса таким образом, чтобы результат нейронной сети, когда мы даем ей в качестве входных данных любое изображение, был как можно ближе к желаемому результату этого изображения. из данных обучения.

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

Вместо того, чтобы думать, что у нас есть обучающие данные из тысяч изображений, мы собираемся иметь «обучающий набор» всего из 8 точек на плоскости xOy. Каждая точка будет парой в форме (x, y), где координата x - это «данные», а координата y - это желаемый результат.

Поскольку изображение стоит тысячи слов, я думаю, что лучше увидеть несколько примеров:

Нарисовано несколько точек

Как видите, мы нарисовали здесь 8 точек. Большая проблема заключается в том, что мы хотим найти функцию, модель или нейронную сеть, если хотите, которая может аппроксимировать эти наборы точек. Проще говоря, проблема в том, что мы хотим найти прямую линию (прямая линия будет вне «модели»), которая может наилучшим образом аппроксимировать эти точки. Что значит приблизить эти точки? Во-первых, каждая прямая на плоскости имеет уравнение вида y = mx + b. x - входной параметр. Это значение на оси Ox. Основываясь на этом значении, мы можем использовать приведенную выше формулу, чтобы найти соответствующую точку, которая находится на этой линии. A.i. точка, которая имеет координаты (x, y). Не вдаваясь в подробности, поскольку вы можете найти много материала в сети, каждая линия на плоскости имеет точку пересечения и наклон. Для каждого значения на оси Ox мы можем найти соответствующее значение y точки, которая находится на линии, имеющей в качестве координат значения x и y, используя формулу уравнения линии. M - это наклон линии, а b - точка пересечения. A.i. значение на оси Oy в месте пересечения линией.

Мы можем думать о значениях m и b как о параметрах нашей очень простой модели. Фактически, mx + b можно рассматривать как один нейрон / перцептрон с одной записью. x - это вход, который умножается на значение m, известное как наклон линии, или вес в терминологии нейронных сетей, а затем мы добавляем точку пересечения линии или смещение в терминологии нейронных сетей. В этом примере мы не используем никаких функций активации, потому что хотим, чтобы это выглядело просто.

Теперь, учитывая точки, которые мы нанесли ранее, давайте проведем случайную линию. Под случайной линией я подразумеваю, что мы случайным образом выбираем наклон и точку пересечения. Беллоу мог бы пример этого:

Теперь, если мы посмотрим, например, на первую точку. Значение x равно 1, а значение y - 2. Соответствующая точка на линии (под соответствующей я подразумеваю точку, которая находится на линии с таким же значением x) имеет значение y, равное 1,125 . Мы рассчитали это с помощью линейного уравнения, которое в данном случае имеет вид y = x / 8 + 1. На изображении ниже показаны все соответствующие точки на линии для заданных точек на графике:

Поэтому, если нашей «модели» присвоено значение, например, 1, желаемый результат будет 2. Мы используем линейное уравнение, нашу «модель» для расчета выходных данных, и получаем значение 1,125, которое отличается от 2. Не только это отличается, но и кажется, что это даже не близко к 2, желаемому значению.

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

На изображении выше красные полосы (также известные как предел погрешности или остаточная ошибка) представляют собой расстояния между заданной точкой и соответствующей точкой на линии. Суммируя все эти различия, мы получим примерно следующее:

. Эта сумма даст нам оценку ошибки нашего приближения. В приведенном выше случае очевидно, что ошибка будет довольно высокой, что может означать, что, возможно, эта линия с этим уравнением может быть не лучшим приближением для данных точек. Давайте посчитаем погрешность, чтобы увидеть своими глазами.

Учитывая, что линейное уравнение f (x) = x / 8 + 1, у нас есть следующие значения:

Первая точка: y1 = 1 / x + 1 = ›y1 = 1,125 =› расстояние между нанесенной точкой и точкой на прямой (та же координата x) составляет 2–1,125 = 0,875.

Для второй точки расстояние (ошибка) составляет 1,75. Ошибка третьего пункта: 2.15. Ошибка точки аппроксимации: 0,5. Ошибка пятой точки: 1,0625. Ошибка шестого балла: 1,55. Ошибка седьмой точки: 1,65 и, наконец, ошибка последней точки: 2,5375

Теперь, если мы воспользуемся приведенной выше формулой для вычисления всей ошибки, мы получим следующее:

0,875+1,75+2,15+0,5+1,0625+1,55+1,65+2,5375= 12,075.

Теперь разделив это на количество баллов, мы получим: 1,509375. Это общая ошибка для этой линии, пытающейся приблизиться к нанесенным точкам. Обратите внимание, что мы делим на количество баллов, потому что нас интересует средняя ошибка. Если, скажем, несколько точек имеют очень маленькую ошибку, в конечном итоге это будет значить не так много, поскольку нас интересует средняя ошибка по всем точкам. Мы хотим, чтобы ошибка была в среднем небольшой. Приведенная выше формула известна как MSE или среднеквадратичная ошибка. Для получения дополнительной информации проверьте эту ссылку: Среднеквадратичная ошибка. Причина квадратного корня в формуле исходит из формулы евклидова расстояния, но поскольку у нас одинаковая координата X для точек и их аналогов на линии, это отличие от формула расстояния равна нулю. Вы можете сказать, зачем нам извлекать квадратный корень, возводящий в квадрат разность. Две операции, квадратный и квадратный корень, поскольку они обратны, будут отменены. Причина в том, что мы хотим, чтобы полученная ошибка была положительным числом. Либо используйте это, либо абсолютное значение этой разницы. Такие как :

Не имеет значения, используем ли мы одну из двух формул. Итак, мы только что вычислили общую ошибку на основе некоторых конкретных значений наклона и точки пересечения линии, которую мы нарисовали. Что, если мы изменим наклон линии или точку пересечения. У нас будет другая стоимость. Если линия перемещается из текущего положения «ближе» к точкам, мы получим более низкую стоимость и, следовательно, лучшее приближение. Другими словами, функция стоимости, показанная выше, является функцией наклона и точки пересечения линии. Таким образом, функция ошибок является функцией двух переменных в данном случае m и b. Очевидно, что в реальных ситуациях, таких как распознавание рукописных цифр, мы будем иметь дело с нейронными сетями с множеством параметров, поэтому функция стоимости будет функцией тысяч или даже миллионов параметров. В нашем случае функция стоимости, назовем ее C (m, b), будет иметь следующий вид:

где y '(m, b) - значение координаты Y на линии (вычисленное «моделью»), а y - координата Y заданной точки или желаемое значение из обучающих данных, если хотите.
Давайте немного поиграем и со значением точки пересечения, и со значением наклона, чтобы получить более точное представление о том, что происходит, и о том, как будет выглядеть сама функция стоимости.
Давайте зафиксируем наклон до a определенное значение, и давайте изменим точку пересечения и посмотрим, что мы получим.
При m = 1/8 и b = 0 будет следующая ситуация :

Стоимость функции ошибок в этом случае составляет:

(1,875 + 2,75 + 3,15 + 1,5 + 2,0625 + 1,95 + 2,65 + 3,5375) / 8 = 2,434375. Вы это сами вычислите.

Когда m = 1/8 и b = 1 мы будем иметь следующую ситуацию:

Очевидно, что вам не нужно рассчитывать стоимость, чтобы увидеть, что она на самом деле меньше предыдущей. Линия находится ближе к нанесенным точкам, чем это было на предыдущем рисунке. Мы все равно рассчитаем стоимость на всякий случай.

(0,875+1,75+2,15+0,5+1,0625+1,55+1,65+2,5375)/8 = 1,509375

Когда m = 1/8 и b = 1,5, мы имеем следующее:

Теперь стоимость составляет (0,375 + 1,25 + 1,65 + 0 + 0,5625 + 1,05 + 1,15 + 2,0375) / 8 = 1,009375
Когда m = 1/8 и b = 2 мы имеем следующее:

Стоимость теперь равна (0,125 + 0,75 + 1,15 + 0,5 + 0,0625 + 0,55 + 0,65 + 1,5375) / 8 = 0,665625
Как вы можете видеть, линия в основном находится в «середине» точек, что делает ее ближе ко всем точкам, чем на любом другом изображении. Таким образом, с b = 0 до b = 2 стоимость уменьшилась. Это очевидно почему. Когда b было равно 0, линия находилась дальше от нанесенных на график точек, чем на самом деле. когда b = 2. Теперь, если мы продолжим изменять b еще больше, то есть увеличиваем его значение сверх значения 2, стоимость начнет увеличиваться, что снова имеет смысл, потому что линия станет дальше Помимо нанесенных точек, давайте посмотрим на картинку, чтобы увидеть в точности.

Когда m = 1/8 и b = 3,5, мы имеем следующее:

Стоимость теперь равна (1,625 + 0,75 + 0,35 + 2 + 1,4375 + 0,95 + 0,85 + 0,0375) / 8 = 1. Намного большее значение, чем в ситуации, когда b было 2.

Когда m = 1/8 и b = 4, мы получаем следующее:

Стоимость теперь равна (2,125 + 1,25 + 0,85 + 2,5 + 1,9375 + 1,45 + 1,35 + 0,4625) / 8 = 1,490625. Даже выше, чем раньше. Очевидно, теперь вы видите тенденцию. Когда значение наклона фиксировано и мы изменяем точку пересечения от малых значений до более высоких значений. Функция стоимости сначала будет изменяться с более высокого значения, но по мере увеличения b мы будем приближаться к нанесенных точек, и, как следствие, стоимость будет уменьшаться, пока мы не дойдем до минимального значения. С этого момента, если мы продолжим увеличивать значение b, стоимость снова начнет расти. Таким образом, при высоком значении, затем снижается до некоторого минимального значения, а затем снова увеличивается. шаблон. Если мы представим функцию стоимости как функцию параметров m и b, тогда мы сможем построить точки, представляющие все вышеупомянутые вычисленные значения функции стоимости, когда m = 1/8 и b варьируется от 0 до 4. Давайте сделаем это:

Выше у нас нанесены 6 точек, которые представляют значение функции стоимости, когда m было зафиксировано на 1/8, а b имело значения 0, 1, 1.5, 2, 3.5 и 4
Теперь давайте поиграем так же, как и раньше, но на этот раз мы зафиксируем значение b = 2 и вместо этого изменит значение m.
Когда m = 1 и b = 2, мы будем иметь следующую ситуацию:

Теперь функция стоимости выглядит так: (1 + 1 + 1,3 + 4 + 3,7 + 4 + 4,6 + 4,5) / 8 = 3,0125.

Давайте изменим m дальше. На этот раз m будет 0,7. И мы получим такую ​​картину:

Стоимость теперь: (0,7 + 0,4 + 0,46 + 2,8 + 2,41 + 2,44 + 2,8 + 2,43) / 8 = 1,805. Явно лучше, чем в предыдущей настройке. Продолжим настройку m. Если мы изменим m с 0,7 на 0,3, мы получим следующее:

Стоимость теперь: (0,3 + 0,4 + 0,66 + 1,2 + 0,69 + 0,36 + 0,4 + 0,33) / 8 = 0,5425 . Как видите, становится лучше. Теперь уменьшим значение m до нуля. Вот что мы получим:

Теперь стоимость в этой настройке с m = 0 составляет: (0 + 1 + 1,5 + 0 + 0,6 + 1,2 + 1,4 + 2,4) / 8 = 1,0125.

Ну видимо кажется, что сейчас стоимость снова растет. Давайте попробуем другое окончательное значение для m. Мы установим его на -0,5:

Теперь стоимость: (0,5 + 2 + 2,9 + 2 + 2,75 + 3,8 + 4,4 + 5,85) / 8 = 3,025.

Что ж, это очень плохо. Чем больше мы уменьшаем значение m после этой точки, тем хуже будет цена. Так же, как и в случае настройки значения b, мы видим тот же параболический паттерн. Стоимость снижается, а затем снова повышается. Мы также решили отобразить приведенные выше значения стоимости в 3D, чтобы увидеть, как они выглядят:

Поскольку функция стоимости представляет собой параболу по m и параболу по b, мы можем заключить, что график функции стоимости представляет собой поверхность в форме чаши, как на изображении ниже:

Синяя точка, которую вы видите на графике, - это минимум этой функции. Итак, чтобы резюмировать то, что мы сделали до сих пор, мы начали со случайного значения для m и случайного значения для b. С такими значениями функция стоимости имела довольно большое значение. Это означает, что он представляет собой конкретную точку на чашеобразной поверхности функции стоимости. И наша заявленная миссия состоит в том, чтобы найти такие значения для m и b, чтобы ошибка была минимально возможной, или минимальной. Нам нужно найти такие значения m и b, чтобы значение функции ошибок было синей точкой, которую мы видим на картинке. Теперь предположим, что мы начали с верхней точки на изображении ниже. Наша миссия - добраться до точки на дне чаши.

Один из способов сделать это - использовать производные. А точнее градиентный спуск. На самом деле это математический инструмент, который используется алгоритмом обратного распространения для обучения нейронной сети. Основная идея градиентного спуска - представить, что у нас есть шар, который изначально находится в верхней точке. И мы позволяем шарику катиться до дна чашеобразной поверхности. Когда мяч достигает дна поверхности, он просто останавливается. Я не буду вдаваться в подробности того, что такое производные. В сети есть много отличных материалов по этому поводу. Лучшее, на мой взгляд, можно найти в Khan Academy, в курсе исчисления. Но мы собираемся немного поговорить о производных и частных производных, чтобы получить общую картину. Таким образом, вкратце, производная функции - это скорость изменения этой функции, или, говоря более математически, производная кривой в точке - это наклон касательной к этой кривой в этой точке. Таким образом, мы можем использовать производную для изменения нашего положения на кривой. Я думаю, что некоторые изображения будут полезными, чтобы понять, что я пытаюсь здесь передать. Предположим, что у нас есть функция, подобная классической функции параболы:

График этой функции - парабола. Теперь представьте, что мы находимся в синей точке на графике, как в следующем примере:

Поскольку производная x2 равна 2x, а мы находимся в точке x = 4, производная, или, точнее, наклон касательной к кривой в синей точке равен 2 * 4 = 8. Теперь градиент будет использовать информацию о производной для двигаться в любом из двух направлений. a.i вверх или вниз. Поскольку производная положительна, если мы добавим производную в этой точке к значению x этой точки, мы получим новое значение на кривой. Если вместо этого мы вычтем значение производной из значения x, мы окажемся где-нибудь на кривой. В этом случае 4–8 даст новое значение x равное -4. Не очень шустро. Мы промахнулись по другую сторону графика. Мы этого не хотим. Нам нужно плавное скольжение от нашего текущего положения до нижней части кривой. Так что, возможно, было бы неразумно использовать всю стоимость производной, а только небольшую ее часть. И вот как мы это сделаем:

Здесь α - небольшое значение между (0,1), которое играет роль небольшой части значения производной. Итак, предположим, что в данном случае α равно 0,1. Используя эту формулу, следующим значением на кривой будет x = 4–0,1 * 8 = ›x = 4–0,8 =› x = 3,2. Итак, мы обновили нашу текущую форму позиции 4 до 3.2. На изображении ниже вы можете видеть, что мы переместились от синей точки к новой красной точке. И мы сделали это с помощью формулы градиентного спуска.

Если мы сделаем еще меньшие значения для α, то скольжение будет еще более плавным. Для α = 0,01 следующей позицией для x будет 3,9992, что очень близко к исходной позиции. Если мы будем использовать формулу градиента итеративно, мы перейдем от текущей позиции к следующей и так далее, пока не доберемся до позиции, в которой мы застрянем. Точка на графике с нулевой производной. В нашем примере это будет на дне чаши. В этой точке мы нашли минимум функции. Тот же алгоритм работает для функций с несколькими переменными. Разница в том, что мы будем использовать частные производные. Итак, поскольку у нас есть функция типа f (x, y), у нас будет две производные. Производная по x и производная по y. Первый сообщает нам скорость изменения в направлении x, а другой сообщает скорость изменения в направлении y. Самый интуитивный способ понять частную производную - это увидеть несколько картинок.

Вы можете представить себе частную производную по значению x, взяв плоскость, параллельную плоскости yOz. Желтая плоскость на изображении разрезает поверхность при постоянном значении y. Пересечение плоскости и поверхности даст нам кривую, выделенную красным. Взяв производную этой кривой в синей точке, мы получаем частную производную функции по x в синей точке. Любая производная этой кривой даст нам частную производную функции f (x, y) по x в том конкретном значении x, когда y имеет постоянное значение. То же верно и для частной производной функции f (x, y) по значению y.

На приведенном выше изображении у нас есть плоскость, которая параллельна плоскости xOz (x имеет постоянное значение), а пересечение между поверхностью и плоскостью образует параболу, и мы можем взять производную этой параболы в любой точке на этой парабола, и мы будем говорить, что мы берем частную производную функции f (x, y) по y на конкретном значении y. Ниже у нас есть обе плоскости, в направлении x и y, пересекающие поверхность и пересекающиеся в этой синей точке.

Как мы видели в 2D-примере, уравнение градиента даст нам новое значение для x, вычитая из текущего значения x небольшую часть производной кривой в этой точке. Другими словами, используя градиент, мы перемещаемся по оси Ox с очень маленькими приращениями к ближайшей точке с нулевой производной или к локальному / глобальному минимуму. Эти небольшие приращения можно рассматривать как векторы, которые представляют перемещение текущей точки в новое положение. Ниже вы можете видеть, что когда мы переместились от синей точки к красной, у нас есть эквивалентный зеленый вектор на оси Ox, который представляет приращение и направление движения.

То же самое верно и в трехмерном пространстве, за исключением того, что у нас будет вектор для каждого измерения:

Другими словами, градиент теперь представляет собой вектор, который имеет в качестве компонентов частные производные как по x, так и по y. Чтобы перейти от текущей верхней точки к следующей точке, которая находится на более низкой высоте, мы вычтем часть частной производной по x из текущего значения x, а также вычтем часть частной производной по y из текущее значение y, подобное этому:

Следующим пунктом будет:

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

Более подробную информацию о градиентном подъеме и градиентном спуске можно найти на Youtube-канале профессора Леонарда или в этом курсе:

Таким образом, градиентный спуск - это метод перехода от точки на поверхности функции ошибок (среднеквадратичная ошибка в данном случае) к ближайшей точке минимума или критической точке (точке, где обе производные равны нулю). Способ сделать это - вычислить частную производную по отношению к. к каждому параметру (в нашем случае только два из них. m и b) и вычитание из текущего значения каждого параметра доли его частной производной. Таким образом мы смоделируем мяч, катящийся с холма. Это очень простая презентация того, как отдельный нейрон с двумя параметрами, m и b, учится подгонять линию так, что это наилучшее возможное приближение для тех точек на графике, которые мы видели в начале этой лекции. На самом деле нейронные сети имеют множество нейронов с сотнями или тысячами входов каждый. Например, нейронная сеть, которая изначально была разработана для распознавания рукописных цифр, имеет более 25 тысяч параметров. Входные данные - это массив из 784 нейронов, а скрытый слой состоит из 300 нейронов. Это означает, что у нас 784 * 300 = 235200 весов только между входным слоем и скрытым слоем. Плюс 3000 весов между скрытым слоем из 300 нейронов и выходным слоем из 10 нейронов. Плюс 300 + 10 предубеждений. Очевидно, мы не можем построить график функции стоимости почти в 25 000 измерений. Мы не можем сделать это в четырех измерениях, не говоря уже о 25000. Вот почему для понимания внутреннего устройства этих систем лучше показать, как обучается простейший тип нейронной сети. Нейронная сеть с одним нейроном с одним весом и одним смещением.

Продолжение следует…