Курс по созданию автомобилей для самостоятельного вождения №6 - Нейронные сети (часть 3)

Добро пожаловать на курс по самоуправлению, часть 6. Я надеюсь, что теперь мы понимаем терминологию, используемую при построении нейронных сетей. Если вы еще не читали, можете посетить часть 1 и часть 2. В этом разделе мы рассмотрим, как создавать эти нелинейные модели или нейронные сети и как работают эти глубокие нейронные сети. Этот раздел будет сложным с математикой и станет основой для создания беспилотных автомобилей. Итак, приступим.

Нейронные сети

Итак, давайте разберемся, что стоит за этими нейронными сетями? Нейронные сети объединяют несколько линейных моделей и преобразуют их в нелинейную модель. Как мы видим на изображении ниже, это похоже на математическую операцию, выполняемую над двумя линейными моделями:

Выбор редактора DDI - машинное обучение Стэнфордского университета

линейная модель 1 + линейная модель 2 = нелинейная модель 1

Попробуем понять это математически. Линейная модель - это то, что дает нам вероятность того, что каждая точка будет синей. Предположим, что первая линейная модель дает вероятность 0,7 для точки синего цвета, а вторая линейная модель дает оценку вероятности 0,8 для той же точки. Возникает вопрос, как совместить эти две модели?

Первое, что приходит в голову, это просто вычислить сумму оценок вероятности, то есть 0,7 + 0,8 = 1,5. Как мы видим, результирующая оценка составляет 1,5, что не похоже на оценку вероятности, поскольку оценка вероятности находится между 0 и 1. Как теперь преобразовать эти оценки в оценки вероятности? Что ж, мы сталкивались с подобными ситуациями в прошлом, и да, мы поместим эту оценку в сигмовидную функцию, которая дает нам вероятность 0,82. Аналогичным образом мы вычисляем вероятностное пространство для всех точек. Достаточно просто? правильно? давайте сделаем это немного сложнее.

Что, если мы хотим, чтобы 1-я линейная модель имела больший эффект, скажем 7, а 2-я модель имела меньший эффект (5)? Тогда у нас была бы взвешенная сумма, что-то вроде

(7 * 0,7) + (5 * 0,8) - 6 (член смещения) = 2,9

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

Многие из вас могут подумать, что диаграмма выше похожа на перцептрон. Не правда ли? Да, вы правы. Эти перцептроны являются строительными блоками нейронных сетей. Давайте копнем немного глубже и возьмем тот же пример, приведенный выше, и представим две линейные модели как перцептроны и посмотрим, как они образуют основные строительные блоки нейронных сетей. Предположим, что уравнение первой линейной модели имеет вид (5 * x1–2 * x2 +8), а для второй модели - (7 * x1–3 * x2 -1), и выходные данные этих моделей затем объединены с взвешенной точкой. продукт (7 * выход модели 1) + (5 * выход модели 2). Такое сочетание различных перцептронов со взвешенным скалярным произведением известно как нейронные сети.

Ребра слева говорят нам, какие уравнения имеют линейные модели, а ребра справа говорят нам, в какой линейной комбинации следует умножить эти модели, чтобы получить нелинейную кривую справа. -8 и 1 также могут быть представлены отдельно с 1 на узле и -8 и 1 на краях, как показано ниже.

Слои

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

Здесь, поскольку у нас есть только 2 входных узла, мы получаем выходной 2D-слой. Но что, если у нас есть 3 входных узла или даже больше? В случае 3 результат будет представлен как плоскость в трехмерном пространстве. До сих пор мы рассматривали двоичную классификацию, в которой точка отображается синим или красным цветом. Что делать, если результат имеет более двух возможных исходов? Такие проблемы известны как проблема многоклассовой классификации. Итак, если у нас есть изображение для классификации красных, зеленых и синих точек, тогда у нас есть выходной узел для каждого класса, дающий оценку вероятности для каждого из классов.

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

Feedforward

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

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

К настоящему моменту мы должны привыкнуть к изображению выше. Прежде чем понять, что такое сеть прямого распространения, давайте разберемся с обозначениями на изображении. В данном случае x1, x2 и 1 являются входными узлами со смещением. Матрица весов, обозначенная W (1) 11, верхний индекс 1 представляет 1-й уровень, а первая 1 в нижнем индексе представляет номер входного узла, а вторая 1 представляет номер скрытого узла. Точно так же W² представляет собой весовую матрицу для второго уровня. Значения в этой матрице говорят нам, в какой комбинации линейные модели из первого слоя должны быть объединены, чтобы получить оптимальное решение.

Сеть прямой связи умножает входные данные на весовую матрицу W¹. Затем выходные данные передаются сигмовидной функции, которая дает значения вероятности. Затем эти значения умножаются на W² и передаются другому сигмоиду, который дает окончательный прогноз ȳ. Получив этот прогноз, мы оценим производительность модели с помощью функции ошибок. Если вы не знаете, что такое функция ошибки, вы можете просмотреть ее здесь. Если вы немного запутались, не волнуйтесь, это нормально. Чтобы прояснить ситуацию, мы рассмотрим числовой пример.

Числовая реализация

Мы рассмотрим, как реализовать многослойную сеть прямой связи персептрона, как показано на схеме ниже. Входной слой (i1, i2, i3), 1-й скрытый слой (j1, j2, j3), 2-й скрытый слой (k1, k2, k3) и выходной слой l, которые указывали, является ли данная точка синей.

Здесь мы видим, что входной параметр [0,1, 0,2, 0,7], а выход - [1,0], что указывает на то, что данная точка синего цвета. Поскольку есть 2 скрытых слоя, у нас будет 3 матрицы весов: одна будет между входом и первым скрытым слоем Wij, вторая между первым и вторым скрытым слоем Wjk и третья между вторым скрытым слоем и выходным слоем Wkl. Мы инициализировали эти весовые матрицы случайными числами в иллюстративных целях. Чтобы определить размерность весовой матрицы Wij, мы устанавливаем # строк в Wij равными # узлов в j, т.е. 3 и # столбца в Wij - это # ​​узлы в i т.е. 3.

Давайте начнем вычисление матрицы, как показано на изображении ниже для первого слоя.

После умножения входного вектора на 1-ю весовую матрицу Wij к нему применяется сигмоидальная функция, которая выводит значения для [j1, j2, j3]. Эти значения затем умножаются на 2-ю весовую матрицу Wjk, а затем снова на сигмовидную функцию, чтобы получить [k1, k2, k3].

И, наконец, мы умножаем эти выходные данные на Wkl, чтобы получить окончательные прогнозы (ȳ). Это вероятность того, что данная точка будет синей. Как мы видим, модель дает хороший прогноз, говорящий о 91% уверенности в том, что данная точка синего цвета. Но все же существует ошибка, которую можно вычислить по формуле.

В нашем случае, если мы подставим значения ȳi и yi, мы получим ошибку 0,041. Поскольку мы используем только один пример, мы не берем среднее значение ошибки. Мы уже знаем, что цель любой задачи машинного обучения или глубокого обучения - минимизировать эту ошибку. Но как нам это сделать? Здесь позвольте мне представить вам наиболее важную концепцию, которая полезна при обучении нейронных сетей, а именно обратное распространение ошибки.

Обратное распространение

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

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

Выходные данные прямой связи дают нам прогноз (ȳ). Затем мы вычисляем ошибку по формуле функции ошибки, а затем вычисляем градиент для функции ошибки. Перед вычислением градиент функции ошибок позволяет понять цепное правило, которое мы изучали в годы учебы в колледже. Понимание правила цепочки является предпосылкой для понимания вычисления градиента.

Правило цепочки гласит, что если у вас есть переменная x и вы примените функцию f, чтобы получить f (x), мы называем его A. И у нас есть еще одна функция g, которую мы применяем к функции f (x), чтобы получить gf (x), под названием B . Если мы хотим найти частную производную от B по x, она будет частной производной от B по отношению к A умноженный на частную производную A по x. Как мы знаем, прямая связь - это не что иное, как функции, применяемые к другим функциям и так далее, в то время как обратное распространение - это серия частных производных для каждой части применяемых функций. Смущенный??? Не волнуйтесь, мы рассмотрим численную реализацию, где все станет более ясным.

Теперь продолжим вычисление градиента для функции ошибок. Начнем с вычисления производной функции ошибок. Функция ошибок является функцией ȳ, а ȳ - функцией W¹ (W11, W12) и W² (W21, W22). Следовательно, функция ошибок может быть записана как функция на всех Wij. Таким образом, градиент функции ошибки - это вектор, образованный частной производной функции ошибки E по каждому из весов Wij, как показано на диаграмме ниже.

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

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

Уууссшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшш Я полагаю, что то же самое и с вами. Но я надеюсь, что теперь мы понимаем, что такое нейронные сети и что за этим стоит математика. Мы также поняли, как работают проходы вперед и назад. Если вы все еще не понимаете, что такое обратное распространение, мы постараемся прояснить ситуацию с помощью числовой реализации. Если вас не интересует математика, лежащая в основе обратного распространения, вам это разрешено, потому что есть библиотеки, такие как Tensorflow, Keras, Pytorch и многие другие, которые позволяют автоматическое дифференцирование и автоматически вычисляют производные. Нам не нужно кодировать сложные шаги, связанные с обратным распространением. Но хорошо знать, что происходит за кулисами. Итак, ребята, скоро увидимся, и давайте построим беспилотные автомобили, используя этот курс обучения беспилотным автомобилям. полная статья опубликована на https://theautonomousmachines.com/building-self-driving-cars-course-6/

Сообщение редактора. Иногда редакторы публикуют партнерские ссылки на полезные ресурсы. Если вы найдете их полезными и совершите покупку, мы заработаем большие деньги. Нет, я не говорю о том, чтобы увеличить количество картофеля фри. Я говорю о дополнительных пепперони на большой пицце вроде большой. Спасибо за вашу постоянную поддержку, мы продолжим усердно работать над публикацией p̶e̶p̶p̶e̶r̶o̶n̶i̶.