04.09.2017

Перевод «Создай свою нейросеть» — 5

В 5 части перевода привожу сразу 3 связанных по смыслу раздела.

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

Вы можете скачать PDF версию перевода.

Приятного чтения!

Оглавление

1 Глава. Как они работают.

1.7 Проход сигнала через нейросеть

Согласитесь, картинка с изображением трехслойной нейросети, в который каждый нейрон связан со всеми нейронами в следующем и предыдущем слоях, выглядит классно.

Но проводить столько вычислений ради получения выхода, да еще по нескольку раз по мере обучения сети! Это очень тяжелая работа! Да, тяжелая. Но в дальнейшем эту работу будет выполнять компьютер. Сейчас же наша задача — научиться понимать, что происходит с сигналами внутри нейронной сети. Для простоты мы будем рассматривать простую нейросеть, состоящую из 2 слоев, в каждом из которых есть по 2 нейрона:

Давайте представим, что на входы подаются ​\( 1 \)​ и ​\( 0.5 \)​:

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

\[ y = \frac{1}{1+e^{-x}}, \]

где ​\( y \)​ является выходом нейрона, а ​\( x \)​ — сумма поступивших сигналов.

А что с весами связей? Это отличный вопрос. Для начала возьмем случайные веса:

  • \( w_{1,1} = 0.9 \)
  • \( w_{1,2} = 0.2 \)
  • \( w_{2,1} = 0.3 \)
  • \( w_{2,2} = 0.8 \)

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

Отметим на диаграмме нашей нейросети веса связей:

Давайте считать!

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

На втором слое уже нужно считать. Для каждого нейрона нужно что-то сделать с суммой входящих в него сигналов. Модифицировать сумму входящих сигналов мы будем с помощью сигмоиды:

\[ y = \frac{1}{1+e^{-x}} \]

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

Проведем все эти вычисления для первого нейрона во втором слое. Оба нейрона из первого слоя связаны с ним. Они получают на вход ​\( 1 \)​ и ​\( 0.5 \)​. Вес связи первого нейрона — ​\( 0.9 \)​. Вес связи второго — ​\( 0.3 \)​. Значит сумма взвешенных входов:

\[ x = (\text{выход первого нейрона} \times \text{вес}) + (\text{выход второго нейрона} \times \text{вес}) \]

\[ \begin{gather*} x = (1 \times 0.9) + (0.5 \times 0.3) \\ x = 0.9 + 0.15 \\ x = 1.05 \end{gather*} \]

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

Мы получили сумму взвешенных входов нейрона ​\( x \)​. Теперь надо пропустить эту сумму через функцию активации, роль которой выполняет сигмоид.

\[ y = \frac{1}{1+e^{-x}} \]

Тут можно воспользоваться калькулятором. Получаем ​\( y = 0.7408 \)​.

Отличная работа! Теперь мы имеем реальный выход одного из нейронов нашей нейросети.

Займемся теперь вторым нейроном второго слоя. Считаем сумму взвешенных входов:

\[ \begin{gather*} x = (1 \times 0.2) + (0.5 \times 0.8) \\ x = 0.2 + 0.4 \\ x = 0.6 \end{gather*} \]

Мы получили ​\( x \)​. Выход этого нейрона равен ​\( y = 0.6457 \)​.

Отобразим результаты работы нейросети на диаграмме:

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

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

И тут нам на помощью вновь приходит математика, у которой есть специальные объекты, с помощью которых можно считать выход нейросети любого размера очень быстро и с помощью коротких команд.

Эти объекты называют матрицами. Ими мы сейчас и займемся.

1.8 Умножать матрицы полезно… Серьезно!

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

В предыдущем разделе мы вручную посчитали выходы нейросети из 2 слоев с 2 нейронами в каждом слое. Работы было немало. А теперь представьте, сколько всего придется считать для нейросети из 5 слоев по 100 нейронов в каждом? Да просто запись самих вычисляемых выражений представляет из себя уже серьезную проблему … все эти суммы сигналов, помноженных на их веса, которые затем попадают в функцию активации … все надо считать для каждого нейрона, для каждого слоя … ужас!

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

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

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

Матрица — просто таблица, заполненная числами. Вот и все.

Наверняка многие из вас работали с Excel, или с другими программами для работы с таблицами. В таком случае вас уже не испугает обыкновенная таблица с числами. В Excel и других программах используют термин таблица. Мы можем называть ее и матрицей. На картинке ниже изображен фрагмент сайта «Google Таблицы».

Как мы уже выяснили, матрица представляет собой просто таблицу из чисел. Вот пример матрицы с размерностью 2 на 3:

\[ \left(\begin{matrix}23 & 43 & 22 \\ 43 & 12 & 54\end{matrix}\right) \]

С размерностью 2 на 3 означает, что в матрице 2 строки и 3 столбца.

Некоторые люди предпочитают использовать квадратные скобки вокруг матрицы:

\[ \left[\hspace{5pt}\begin{matrix} 23 & 43 & 22 \\ 43 & 12 & 54 \end{matrix}\hspace{5pt}\right] \]

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

\[ \left(\begin{matrix} \text{длина корабля} & \text{длина самолета} \\ \text{ширина корабля} & \text{ширина самолета} \end{matrix}\right) \]

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

В примере ниже мы умножаем две простые матрицы друг на друга:

\[ \begin{align*} \left(\begin{matrix} 1 & 2 \\ 3 & 4 \end{matrix}\right) \left(\begin{matrix} 5 & 6 \\ 7 & 8 \end{matrix}\right) &= \left(\begin{matrix} (1\times 5) + (2\times 7) & (1\times 6) + (2\times 8) \\ (3\times 5) + (4\times 7) & (3\times 6) + (4\times 8) \end{matrix}\right) \\ &=\left(\begin{matrix} 19 & 22 \\ 43 & 50 \end{matrix}\right) \end{align*} \]

Можно заметить, что мы не просто умножаем соответствующие элементы друг на друга, как можно было ожидать исходя из названия операции «умножение матриц». Если бы это было так, что левый верхний элемент итоговой матрицы равнялся бы ​\( 1\times 5 \)​, а правый нижний ​\( 4\times 8 \)​.

Умножение матриц происходит по-другому. Возможно, вы уже заметили, как оно происходит по приму выше. Вот подсказка:

Верхний левый элемент итоговой матрицы мы получаем, беря элементы первой строки первой матрицы и первого столбца второй матрицы. Мы умножаем соответствующие по номеру следования элементы друг на друга и складываем друг с другом. Разберем подробно. Ищем левый верхней элемент итоговой матрицы. Берем ​\( 1 \)​ из верхней строки первой матрицы и умножаем на ​\( 5 \)​ из левого столбца второй матрицы. Получаем ​\( 1 \times 5 = 5 \)​. Запоминаем результат и идем дальше вправо в первой матрице и вниз во второй. В первой матрице у нас следующим вправо элементом идет ​\( 2 \)​. Во второй матрице следующим вниз элементом идет ​\( 7 \)​. Умножаем ​\( 2\times 7 = 14 \)​ и складываем с предыдущим результатом: ​\( 5 + 14 = 19 \)​. Так мы получили левый верхний элемент итоговой матрицы.

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

Когда мы хотим найти значение элемента итоговой матрицы, мы смотрим номер строки и столбца искомого элемента (в этом примере — вторая строка и второй столбец), умножаем соответствующие по номеру элементы (​\( 3\times 6 \)​ и ​\( 4\times 8 \)​) и складываем результаты друг с другом: ​\( 18 + 32 = 50 \)​.

А вот умножение матриц, в которых вместо чисел используются переменные:

\[ \begin{align*} \left(\begin{matrix} a & b & \cdots \\ c & d & \cdots \end{matrix}\right) \left(\begin{matrix} e & f \\ g & h \\ \cdots & \cdots \end{matrix}\right) &= \left(\begin{matrix} (a\times e) + (b\times g) + \cdots & (a\times f) + (b\times h) + \cdots \\ (c\times e) + (d\times g) + \cdots & (c\times f) + (d\times h) + \cdots \end{matrix}\right) \\ &=\left(\begin{matrix} ae + bg + \cdots & af+bh+\cdots \\ ce+dg+\cdots & cf+dh+\cdots \end{matrix}\right) \end{align*} \]

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

Нельзя просто так взять и умножить две матрицы друг на друга. Они должны быть совместимы. Возможно, вы уже заметили это. Две матрицы совместимы, если количество столбцов первой матрицы равно количеству строк второй матрицы. В противном случае при умножении вам просто не хватит элементов. Например, матрицу «2 на 2» не получится умножить на матрицу «5 на 5».

Как это применить к нейросетям? Мы можем написать следующее:

Магия!

Первая матрица содержит веса связей нейросети. Вторая матрица содержит поступившие на первый слой сети сигналы. Результат умножения этих двух матриц — матрица с суммой взвешенных входов. Это действительно так. Помните в предыдущем разделе следующее выражение?

\[ x = (\text{выход первого нейрона} \times \text{вес}) + (\text{выход второго нейрона} \times \text{вес}) \]

Вот мы и получили сумму взвешенных входов для обоих нейронов сразу:

 

Затем эти значения ​\( x \)​ мы использовали в качестве аргумента функции активации.

Если у вас еще остались сомнения, вот наглядная демонстрация:

Это очень удобно!

Почему? Потому что теперь мы можем все суммы всех взвешенных входов нейронов сразу с помощью произведения матриц. Это можно выразить так:

\[ \textbf{X} = \textbf{W}\times\textbf{I} \]

В равенстве выше ​\( \textbf{W} \)​ — матрица весов связей, соединяющих первый и второй слои нейросети, ​\( \textbf{I} \)​ — матрица входов сети и ​\( \textbf{X} \)​ — итоговая матрица, содержащая суммы всех взвешенных входов для второго слоя. Буквы, означающие матрице в математике обычно выделяют заглавными буквами (часто выделяют еще и жирным), чтобы не спутать их с переменными.

Теперь можно особо не париться насчет количества нейронов в каждом слое. Если их будет больше, то вырастут размеры матриц. Но сами наши записи не увеличатся в размерах. Мы все также будем писать ​\( \textbf{X} = \textbf{W}\times\textbf{I} \)​ в случае если у нас 2 нейрона или 200!

Если используемый нами язык программирования умеет работать с матрицами, он может самостоятельно найти значение ​\( \textbf{X} = \textbf{W}\times\textbf{I} \)​. Нам больше не придется записывать отдельные выражения для получения суммы взвешенных входов каждого нейрона в каждом слое и вычислять их по отдельности.

Фантастика! Такая несложная вещь, как умножение матриц предстает очень удобным инструментом для работы с нейросетями.

А что насчет функции активации? Тут все просто и не требует произведения матриц. Нужно всего лишь каждый элемент из матрицы ​\( \textbf{X} \)​ использовать в качестве аргумента в функции активации:

\[ y = \frac{1}{1+e^{-x}} \]

Это действительно настолько просто. Все суммы взвешенных входов у нас уже имеются в матрице ​\( \textbf{X} \)​. Как мы видели ранее, функция активации играет роль порога и «сжимателя» выхода нейрона. Примерно так работают биологические нейроны. Итак, матрица, содержащая все выходы нейронов слоя получается так:

\[ \textbf{O} = \text{сигмоид}(\textbf{X}) \]

Важно помнить, что ​\( \textbf{X} = \textbf{W}\times\textbf{I} \)​ применяется для вычислений между двумя соседними слоями. Если в нейросети у нас 3 слоя, то нам придется вычислить это выражение для 1 и 2 слоев. Потом, после получения выходов нейронов 2-го слоя мы должны вновь выполнить произведение матриц для 2 и 3 слоев.

Хватит теории. Давайте проверим все эти формулы в деле. Сейчас мы будем использовать нейросеть из 3 слоев по 3 нейрона в каждом.

Ключевые моменты

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

1.9 Трехслойная нейросеть и произведение матриц

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

На диаграмме ниже представлена трехслойная нейросеть с 3 нейронами в каждом слое. Некоторые веса связей не отображены для сохранения опрятности рисунка.

В теории нейросетей существует несколько понятий, которые надо запомнить. У любой нейросети есть входной слой, нейроны которого принимают сигналы. У любой нейросети также есть выходной слой, который отвечает за результат работы сети. Наконец, в нейросетях есть скрытые слои. Звучит таинственно и зловеще. К сожалению, нет никаких ужасных и темных причин для такого названия. Оно закрепилось потому что выходы нейронов в слоях между входным и выходным слоями не являются итоговым результатом работы нейросети, а значит они «скрытые». Согласен, что такое название звучит немного по-дурацки, но трудно придумать что-то лучше.

Переходим к вычислениями. На нейроны входного слоя подаются следующие сигналы: ​\( 0.9 \)​, ​\( 0.1 \)​ и ​\( 0.8 \)​. Тогда наша матрица входов ​\( \textbf{I} \)​ выглядит так:

\[ \textbf{I} = \left(\begin{matrix}0.9\\0.1\\0.8\end{matrix}\right) \]

Вот и все. С первым слоем покончено, потому что все, что делает входной слой — принимает входящие в нейросеть сигналы.

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

Из предыдущего раздела мы имеем формулу для вычисления всех сумм взвешенных входов нейрона:

\[ \textbf{X} = \textbf{W} \times \textbf{I} \]

У нас есть ​\( \textbf{I} \)​, но какие значения мы имеем в матрице ​\( \textbf{W} \)​? На диаграмме выше уже приведены некоторые веса связей. В матрице ниже приведены все веса связей между первым и вторым слоями нейросети. Все значения весов случайные:

\[ \textbf{W}_{1-2} = \left(\begin{matrix} 0.9 & 0.3 & 0.4 \\ 0.2 & 0.8 & 0.2 \\ 0.1 & 0.5 & 0.6 \end{matrix}\right) \]

Например, вес связи, которая соединяет первый нейрон во входном слое и первый нейрон в скрытом слое равен ​\( w_{1,1} = 0.9 \)​, как указано на диаграмме выше. Вес связи, которая соединяет второй нейрон входного слоя со вторым нейроном скрытого слоя равен ​\( w_{2,2} = 0.8 \)​, как указано на диаграмме выше. На диаграмме не указан вес связи, которая соединяет третий нейрон входного слоя с первым нейроном скрытого слоя. Поэтому мы взяли значение этого веса из головы: ​\( w_{3,1} = 0.1 \)​.

А зачем мы используем индекс ​\( 1-2 \)​ рядом с названием нашей матрицы весов ​\( \textbf{W}_{1-2} \)​? ​\( 1-2 \)​ означает, что наша матрица содержит веса связей, которые соединяют нейроны первого (входного) слоя со вторым (скрытым) слоем. Это сделано потому что далее нам потребуется другая матрица весов, которые соединяют нейроны скрытого слоя с нейронами выходного слоя. Она будет называться ​\( \textbf{W}_{2-3} \)​.

Ниже расположена матрица ​\( \textbf{W}_{2-3} \)​ с весами всех связей. Опять можете заметить, что вес связи, которая соединяет третий нейрон скрытого слоя с третьим нейроном выходного слоя равен ​\( w_{3,3} = 0.9 \)​.

\[ \textbf{W}_{2-3} = \left(\begin{matrix} 0.3 & 0.7 & 0.5 \\ 0.6 & 0.5 & 0.2 \\ 0.8 & 0.1 & 0.9 \end{matrix}\right) \]

Теперь у нас имеются все данные для проведения вычислений.

Давайте сейчас найдем матрицу сумм взвешенных входящих сигналов в нейроны скрытого слоя. Этой матрице тоже надо дать подходящее название, так как далее мы будем считать такую же матрицу, но уже для нейронов выходного слоя. Назовем ее ​\( \textbf{X}_2 \)​.

\[ \textbf{X}_2=\textbf{W}_{1-2}\times\textbf{I} \]

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

\[ \begin{gather*} \textbf{X}_2 = \left(\begin{matrix} 0.9 & 0.3 & 0.4 \\ 0.2 & 0.8 & 0.2 \\ 0.1 & 0.5 & 0.6 \end{matrix}\right) \times \left(\begin{matrix}0.9\\0.1\\0.8\end{matrix}\right) \end{gather*} \]

\[ \textbf{X}_2 = \left(\begin{matrix}1.16\\0.42\\0.62\end{matrix}\right) \]

Я просто использовал компьютер для вычисления этого произведения. Во второй части книги вы тоже будете использовать язык программирования Python для расчетов. Сейчас мы этого не делаем чтобы не отвлекаться от текущей задачи.

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

Давайте отобразим новые данные на диаграмме:

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

\[ \textbf{O}_2 = \text{сигмоид}(\textbf{X}_2) \]

Выражение выше означает, что каждый элемент из матрицы ​\( \textbf{X}_2 \)​ используется как аргумент в сигмоиде. Полученное значение и есть выход данного нейрона.

\[ \textbf{O}_2 = \text{сигмоид}\left(\begin{matrix}1.16\\0.42\\0.62\end{matrix}\right) \]

\[ \textbf{O}_2 = \left(\begin{matrix} 0.761 \\ 0.603 \\ 0.650 \end{matrix}\right) \]

На всякий случай перепроверим первый элемент. Уравнение сигмоиды:

\[ y=\frac{1}{1+e^{-x}} \]

Первый элемент матрицы ​\( \textbf{X}_2 \)​ равен ​\( 1.16 \)​. Значит ​\( e^{-1.16} = 0.3135 \)​. Итого имеем:

\[ y = \frac{1}{1+0.3135} = 0.761 \]

Кстати, вы могли заметить, что после прохода через функцию активации все значения находятся между ​\( 0 \)​ и ​\( 1 \)​. Так происходит потому что сигмоида не может выдавать другие значения. Действительно, знаменатель ​\( 1+e^{-x} \)​ всегда больше ​\( 1 \)​, а в числителе у нас ​\( 1 \)​. Поэтому мы всегда будет получать какую-ту часть ​\( 1 \)​.

Фух! Давайте сделаем остановку и посмотрим, что у нас получилось. Скрытый слой нашей нейросети полностью завершил свою работу — мы имеем выходы всех нейронов этого слоя. Эти выходы мы получили, применив функцию активации к сумме взвешенных входных сигналов, которые пришли на входы нейронов. Обновим нашу диаграмму.

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

Как действовать дальше? Да точно также, как мы работали со вторым слоем. Никакой разницы нет. Теперь у нас есть сигналы, поступающие на нейроны третьего слоя сети, также как до этого были сигналы, поступающие на нейроны второго слоя сети. Мы опять должны «взвесить» эти сигналы в зависимости от весов связей. Затем суммы этих взвешенных сигналов надо будет использовать в функции активации каждого нейрона. 3-й слой, 53-й или даже 103-й — все слои нейросети работают одинаково, вне зависимости от их номера.

Итак, давайте найдем матрицу сумм взвешенных сигналов, поступивших на входы третьего и последнего в сети слоя. Для этого мы должны умножить матрицу входов на матрицу весов связей. Матрица весов связей между 2 и 3 слоем у нас есть: ​\( \textbf{W}_{2-3} \)​. А матрица входов у нас равна матрице выходов нейронов второго слоя: ​\( \textbf{O}_2 \)​. Имеем:

\[ \textbf{X}_3 = \textbf{W}_{2-3}\times\textbf{O}_2 \]

Перейдем непосредственно к расчетам:

\[ \textbf{X}_3 = \left(\begin{matrix} 0.3 & 0.7 & 0.5 \\ 0.6 & 0.5 & 0.2 \\ 0.8 & 0.1 & 0.9 \end{matrix}\right)\times\left(\begin{matrix} 0.761 \\ 0.603 \\ 0.650 \end{matrix}\right) \]

\[ \textbf{X}_3 = \left(\begin{matrix} 0.975 \\ 0.888 \\ 1.254 \end{matrix}\right) \]

Обновим нашу диаграмму:

Осталось всего ничего! Надо лишь посчитать выходы всех нейронов выходного слоя нашей сети:

\[ \textbf{O}_3 = \text{сигмоид}\left(\begin{matrix} 0.975 \\ 0.888 \\ 1.254 \end{matrix}\right) \]

\[ \textbf{O}_3 = \left(\begin{matrix} 0.726 \\ 0.708 \\ 0.778 \end{matrix}\right) \]

Вот и все! У нас есть итоговый результат работы нейросети. Давайте отобразим его на диаграмме:

Итак, выходы сети равны: ​\( 0.726 \)​, ​\( 0.708 \)​ и ​\( 0.778 \)​.

Мы успешно прошли все этапы преобразования входящих в нейросеть сигналов.

А что делать с этим дальше?

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

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

Аватара автора Петр Радько

Петр Радько

Сфера интересов — нейросети как стык передовых исследований по математике, биологии, информатике и физике. Мне нравится делиться тем, что я узнал. Считаю, что любую концепцию можно изложить просто и наглядно. Нейронные сети на глазах меняют наш мир. И надо знать их и уметь ими пользоваться!

Комментарии

Спасибо за перевод и книгу! Жду продолжения! Как могу помочь финансово, хочу отблагодарить?

Anton
Anton

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

Круто! Прочитал 5 частей перевода на одном дыхании!
Очень просто и толково.
Жду продолжения…

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

Супер! Изучал эти матрицы почти 20 лет назад, мы их использовали для прорисовки вращения предметов в пространстве. Никогда не подумал бы, что они ещё на что-то сгодятся )

wpDiscuz
Вставить формулу как
Блок
Строка
Дополнительные настройки
Цвет формулы
Цвет текста
#333333
Используйте LaTeX для набора формулы
Предпросмотр
\({}\)
Формула не набрана
Вставить

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: