Синаптические веса в нейронных сетях – просто и доступно
Этой статьей начинается серия статей, рассказывающих просто и доступно о нейронных сетях и искусственном интеллекте.
Автоматические методы обучения искусственных нейронных сетей совершенствуются постоянно. Уже сейчас автоматизм достиг такого уровня, что начальные значения весов можно задавать любые. Действительно, компьютерная программа будет постепенно корректировать веса в сторону уменьшения ошибки, и откуда начинать – не так уж и важно. Чем дальше начальная совокупность от решения, тем больше времени пройдет, вот и вся разница. Все близко к тому, что нажал кнопку, пошел в бассейн, пришел – сеть обучена. Если сеть посерьезнее, то нажал кнопку, уехал в отпуск, приехал через две недели – сеть обучена. Перед нажатием кнопки нужно только архитектуру задать. Хотя программы могут уже сами корректировать архитектуру сети, все более и более автоматизируясь. Так, с некоторой точки зрения, совокупность весов, а также методы их подбора, могут быть некими черными ящиками, в которых что-то как-то происходит и на выходе получаем допустимый уровень ошибки. Есть случаи, когда никто и не ожидал наличия закономерностей, а черный ящик взял и нашел. Например, в сеть заложили параметры – рост и вес. И результат – мужчина/женщина. Сеть самообучилась и выявила закономерность, и смогла на тестовой выборке достаточно точно определять, это мужчина или женщина. Хотя до этого никто и не задумывался именно об этой закономерности. Так что в принципе, можно совсем не изучать этот вопрос, полностью полагаясь на математическую теорию и компьютерное моделирование.
С другой стороны, часть специалистов предпочитает владеть своим вопросом в совершенстве, переходя ко все более усложняющимся задачам. В таких случаях понимание сути синаптических весов оказывается весьма полезным навыком.
В этой статье разберем суть синаптических весов на простом наглядном примере.
Прежде всего, освежим термины. Что есть нейронная сеть, синапсы и веса.
Термином «искусственная нейронная сеть» или просто «нейронная сеть» часто обозначают математическую модель, очень упрощенно описывающую общий алгоритм работы человеческой нервной системы.
Нервную систему человека можно рассматривать как трехступенчатую.
Центром нервной системы является мозг, представленный сетью нейронов. Специальные рецепторы преобразовывают сигналы от тела и из окружающей среды в электрические импульсы и передают ее в мозг. Мозг получает информацию от рецепторов в виде электрических импульсов, анализирует ее и выдает соответствующие решения эффекторам также в виде электрических импульсов. Эффекторы преобразовывают электрические импульсы, сгенерированные мозгом, в выходные сигналы.
Каждая нервная клетка, нейрон, отдельно работает по такой же трехступенчатой модели. У нервных клеток есть дендриты и аксоны. Дендриты — рецепторы, зоны приема — похожи на дерево, представляют собой неровную поверхность со множеством окончаний. Аксон же у каждой нервной клетки один и похож на кабель или линию электропередачи, по которой дальше передается некий сигнал, полученный в результате прохождения через клетку совокупности сигналов от дендритов. То есть все поступившие сигналы как бы смешиваются, «суммируются», и полученный «обработанный» сигнал передается дальше.
Синапсы – места соединения аксона одного нейрона с телом или отростком (дендритом или аксоном) другого нейрона. Через синапсы сигналы передаются от нейрона к нейрону.
У каждого синапса есть свой «вес», то есть как бы своя «важность», придаваемая значению сигнала, проходящего через данный синапс.
Получаем модель нейрона из трех элементов:
- Совокупность синапсов, каждый из которых характеризуется своим весом.
- Сумматор, складывающий входные сигналы, взвешенные относительно соответствующих синапсов нейрона. Математически, это просто сумма значений входных сигналов, умноженных на их вес («важность»).
- Функция активации.
В простом варианте дендриты и аксоны группируются в последовательные слои. Выходные сигналы одного слоя поступают на рецепторы следующего слоя и так далее. Такие сети отличаются между собой размерами и количествами слоев. Математика при этом не меняется.
Что все эти линии, кружочки и взвешенные суммы означают на практике?
Предположим, нужно определить, является ли объект автомобилем. Подходим, начинаем осматривать, заполняем чек-лист. Крыша есть – ставим галочку, добавляем баллы. Стекла есть, двери есть, щетки-дворники есть, четыре колеса есть – все это плюс баллы. При достижении заданного количества баллов считаем, что перед нами автомобиль. А вот если есть пропеллер, то это уже не автомобиль. Это может быть самолет, вертолет, какая-то специальная лодка, но не автомобиль. То есть важность наличия пропеллера такова, что сразу перечеркивает все «автомобильные» баллы до этого. В этом случае наличию пропеллера мы придадим большой «отрицательный» вес. Теперь посмотрим на крышу. Есть автомобили и без крыши. То есть наличие крыши не так важно для определения, что перед нами автомобиль, как, например, наличие колес. Наличие крыши скажет нам, что перед нами скорее автомобиль, чем котик или кружка, но не скажет точно, это автомобиль или нет. «Вес» наличия крыши будет меньше «веса» наличия колес. А если мы будем сравнивать автомобиль и телегу, то по наличию четырех колес можно и перепутать. Хорошо, что наличие мотора исправит ситуацию. Когда мы сложим все баллы, показывающие важность наличия данного пункта, мы определим, что баллов «автомобиль» больше, чем баллов «телега» или баллов «самолет». Вот так и определяется важность какого-либо параметра. Аналогично, для определения, что это котик важно наличие ушек, глаз, лап, усов, хвоста и так далее.
Дальше у нас сразу же встает задача «следующего слоя» — как определить, что есть крыша, есть колеса, есть ушки, лапки и прочее. Эти элементы раскладываются на составляющие и так происходит многократно, число слоев увеличивается до тех пор, когда кажется, что раскладывать дальше некуда.
Суть синаптических весов от этого не меняется. В сети в 200 слоев и в сети в 1 слой – суть остается той же. Поэтому рассмотрим простой наглядный пример.
Рассмотрим обычный 13-ти сегментный цифровой индикатор.
Задача – определить цифру по горящим сегментам.
Каждый сегмент будем считать рецептором.
Если сегмент горит, то его значение равно 1, если не горит, то 0.
Теперь, говоря научным языком, приступим к обучению нейронной сети, то есть подбору коэффициентов. Собственно говоря, все обучение и сводится к подбору коэффициентов различными способами.
Составим таблицу где сторонами будут номер сегмента 1-13 и цифра 1-9.
В нашем примере нужно заполнить таблицу коэффициентами таким образом, чтобы при построчном суммировании перемножений коэффициентов и значений сегментов (1 – горит, 0 – не горит) максимальная сумма была бы в строке, соответствующей горящей цифре.
Другими словами, будем умножать коэффициенты на значения соответствующих сегментов и складывать получаемые значения построчно. В какой строке сумма максимальна, та цифра и горит.
Зададим первоначальные веса.
Там, где сегмент участвует в изображении цифры, зададим начальный вес 1, а там, где не участвует, зададим большой отрицательный вес. Смысл большого отрицательного веса в том, что если горит сегмент, который не участвует в изображении цифры, то слагаемое 1*(-100) = -100 уменьшит общую сумму в данной строке настолько сильно, что в этой строке сумма точно не будет максимальной.
Когда горят все сегменты, то максимальная сумма равна 13 и соответствует цифре «8».
Отключим сегмент 13. Это соответствует цифре «0».
Видим, что максимальная сумма равна 12, но одновременно в двух строках – цифры «8» и «0». Нужно скорректировать коэффициенты таким образом, чтобы сумма 12 горящих сегментов цифры «0» превышала бы сумму 13 горящих сегментов цифры «8». В нашем случае коэффициент должен быть просто больше 13/12, например, 1.1.
Теперь видим, что если горят сегменты цифры «0», то сумма в строке цифры «0» максимальна.
Аналогичным образом обстоит дело с коэффициентами для цифр «6» и «9» — также 1.1.
Затем идут цифры «2», «3», «5» — 11 сегментов, коэффициенты 1.2.
Цифра «4» — 9 сегментов, коэффициенты 1.5.
Цифра «7» — 7 сегментов, коэффициенты 1.9.
Цифра «1» — 5 сегментов, коэффициенты 2.6.
Таким образом получаем конечную совокупность весов.
При зажигании различных сегментов горящая цифра будет определяться по максимальной сумме.
В данном примере веса получались путем рассуждений и ручных расчетов. Конечно, сейчас обучение нейронных сетей осуществляется автоматически, с использованием различных методов компьютерного программирования и моделирования. Компьютерная программа по заданному алгоритму перебирает и подбирает соответствующие коэффициенты, корректирует размеры и количество слоев, уменьшает процент ошибок, увеличивает точность и так далее, о чем будет рассказано в следующих статьях. В данной статье мы лишь затронули понятие и суть синаптических весов на очень простом наглядном примере.
- искусственный интеллект
- нейронная сеть
- синапс
- нейрон
- нейросети
- обучение нейросети
Веса нейронных сетей
При корректировании весов в нейронной сети, один из весов стал минусовый . Использую функцию активации логистической функции.Могут ли веса в нейронных сетях быть минусовыми ?
Отслеживать
True-hacker
задан 13 фев 2018 в 19:26
True-hacker True-hacker
411 4 4 серебряных знака 25 25 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Часто под логистической функцией подразумевают сигмоиду, если это так, тогда ответ — да, веса могут быть отрицательными. Если взвешенная сумма весов — 0, тогда сигмоида будет равна 0,5, соответственно при плюсовой взвешенной сумме сигмоида будет стремиться к единице, при отрицательной — к нулю.
Отслеживать
ответ дан 8 мар 2018 в 22:51
arachnoden arachnoden
1,148 1 1 золотой знак 16 16 серебряных знаков 37 37 бронзовых знаков
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Нейронные сети, перцептрон
Искусственная нейронная сеть (ИНС) (англ. Artificial neural network (ANN)) — упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом [1] . В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть [2] , а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.
Структура нейронной сети
Рисунок 2. Схема искусственного нейрона
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг — сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон — это такая функция [math]\mathbb^n \rightarrow \mathbb[/math] , которая преобразует несколько входных параметров в один выходной.
Как видно на рисунке справа, у нейрона есть [math]n[/math] входов [math]x_i[/math] , у каждого из которого есть вес [math]w_i[/math] , на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы [math]x_i \cdot w_i[/math] направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют [math]net[/math] . Таким образом, [math]net = \sum_^ w_i \cdot x_i = w^T \cdot x[/math] .
Просто так передавать взвешенную сумму [math]net[/math] на выход достаточно бессмысленно — нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации, которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается [math]\phi(net)[/math] . Таким образом, выходов искусственного нейрона является [math]\phi(net)[/math] .
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:
- Функция единичного скачка. Если [math]net \gt threshold[/math] , [math]\phi(net) = 1[/math] , а иначе [math]0[/math] ;
- Сигмоидальная функция. [math]\phi(net) = \frac[/math] , где параметр [math]a[/math] характеризует степень крутизны функции;
- Гиперболический тангенс. [math]\phi(net) = tanh(\frac)[/math] , где параметр [math]a[/math] также определяет степень крутизны графика функции;
- Rectified linear units (ReLU). [math]ReLU(x) = \begin x & x \geq 0 \\ 0 & x \lt 0 \end = \max(x, 0)[/math] .
Виды нейронных сетей
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.
Как правило, в большинстве нейронных сетей есть так называемый входной слой, который выполняет только одну задачу — распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.
Однослойные нейронные сети
Рисунок 3. Схема однослойной нейронной сети
Однослойная нейронная сеть (англ. Single-layer neural network) — сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы [math]x_1, x_2, \ldots x_n[/math] поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число — вес соответствующей связи.
Многослойные нейронные сети
Рисунок 4. Схема многослойной нейронной сети
Многослойная нейронная сеть (англ. Multilayer neural network) — нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, скрытые слои. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям на станках. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.
Сети прямого распространения
Сети прямого распространения (англ. Feedforward neural network) (feedforward сети) — искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.
Однако сигнал в нейронных сетях может идти и в обратную сторону.
Сети с обратными связями
Рисунок 5. Схема сети с обратными связями
Сети с обратными связями (англ. Recurrent neural network) — искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).
Обучение нейронной сети
Обучение нейронной сети — поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.
Это определение «обучения нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей, каждая из которых в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Наш мозг обучается благодаря изменению синапсов — элементов, которые усиливают или ослабляют входной сигнал.
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ», а как только мы подадим немного измененный сигнал, вместо правильного ответа получим бессмыслицу. Мы ждем от сети способности обобщать какие-то признаки и решать задачу на различных входных данных. Именно с этой целью и создаются обучающие выборки.
Обучающая выборка — конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой тестовой выборке.
Тестовая выборка — конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.
Само обучение нейронной сети можно разделить на два подхода: обучение с учителем [на 28.01.19 не создан] и обучение без учителя [на 28.01.19 не создан] . В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.
Перцептрон
Рисунок 6. Схема перцептрона
Перцептрон (англ. Perceptron) — простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.
История
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его «перцептроном» (от латинского perceptio — восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер — «Марк-1», который был способен распознавать некоторые буквы английского алфавита.
Таким образом перцептрон является одной из первых моделей нейросетей, а «Марк-1» — первым в мире нейрокомпьютером.
Описание
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.
Принцип работы перцептрона следующий:
- Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен 0), либо в состоянии возбуждения (сигнал равен 1);
- Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только -1, 0 или 1;
- Затем сигналы от сенсорных элементов, прошедших по S-A связям, попадают в A-элементы, которые еще называют ассоциативными элементами;
- Одному A-элементу может соответствовать несколько S-элементов;
- Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог [math]\theta[/math] , то этот A-элемент возбуждается и выдает сигнал, равный 1;
- В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал;
- Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса (которые уже могут принимать любые значения, в отличие от S-A связей);
- R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем
- если превышен определенный порог, генерирует выходной сигнал, равный 1;
- eсли порог не превышен, то выход перцептрона равен -1.
Для элементов перцептрона используют следующие названия:
- S-элементы называют сенсорами;
- A-элементы называют ассоциативными;
- R-элементы называют реагирующими.
Классификация перцептронов
Рисунок 7. Схема однослойного перцептрона
Перцептрон с одним скрытым слоем (элементарный перцептрон, англ. elementary perceptron) — перцептрон, у которого имеется только по одному слою S, A и R элементов.
Однослойный персептрон (англ. Single-layer perceptron) — перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес 1, а порог любого А-элемента равен 1. Часть однослойного персептрона соответствует модели искусственного нейрона.
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный +1, а порог A элементов равен 1. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон — это искусственный нейрон, который на вход принимает только 0 и 1.
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.
Многослойный перцептрон по Розенблатту (англ. Rosenblatt multilayer perceptron) — перцептрон, который содержит более 1 слоя А-элементов.
Многослойный перцептрон по Румельхарту (англ. Rumelhart multilater perceptron) — частный случай многослойного персептрона по Розенблатту, с двумя особенностями:
- S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;
- Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.
Обучение перцептрона
Задача обучения перцептрона — подобрать такие [math]w_0, w_1, w_2, \ldots, w_n[/math] , чтобы [math]sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))[/math] как можно чаще совпадал с [math]y(x)[/math] — значением в обучающей выборке (здесь [math]\sigma[/math] — функция активации). Для удобства, чтобы не тащить за собой свободный член [math]w_0[/math] , добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что [math]x = (1, x_1, x_2, \ldots, x_n)[/math] . Тогда [math]w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n[/math] можно заменить на [math]w^T \cdot x[/math] .
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать градиентным спуском. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый критерий перцептрона: [math]E_P(w) = -\sum_ y(x)(\sigma(w^T \cdot x))[/math] , где [math]M[/math] — множество примеров, которые перцептрон с весами [math]w[/math] классифицирует неправильно.
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на [math]y(x)[/math] здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ −1, значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.
Теперь [math]E_P(w)[/math] можно оптимизировать градиентным спуском. На очередном шаге получаем: [math]w^ = w^ − \eta\triangledown_w E_P(w)[/math] .
Алгоритм такой — мы последовательно проходим примеры [math]x_1, x_2, \ldots[/math] из обучающего множества, и для каждого [math]x_n[/math] :
- если он классифицирован правильно, не меняем ничего;
- а если неправильно, прибавляем [math]\eta \triangledown_w E_P(w)[/math] .
Ошибка на примере [math]x_n[/math] при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется — правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.
Применение
- Решение задач классификации, если объекты классификации обладают свойством линейной разделимости;
- Прогнозирование и распознавание образов;
- Управление агентами [3] .
Примеры кода
Пример использования с помощью scikit-learn [4]
Будем классифицировать с помощью перцептрона датасет MNIST [5] .
# Load required libraries from sklearn import datasets from sklearn.preprocessing import StandardScaler from sklearn.linear_model import Perceptron #Single-layer perceptron from sklearn.neural_network import MLPClassifier #Multilayer perceptron from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import numpy as np
# Load the mnist dataset mnist = datasets.load_digits()
# Create our X and y data n_samples = len(mnist.images) X = mnist.images.reshape((n_samples, -1)) y = mnist.target
# Split the data into 70% training data and 30% test data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# Train the scaler, which standarizes all the features to have mean=0 and unit variance sc = StandardScaler() sc.fit(X_train)
# Apply the scaler to the X training data X_train_std = sc.transform(X_train)
# Apply the SAME scaler to the X test data X_test_std = sc.transform(X_test)
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1 ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0) # Create a multilayer perceptron object mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(256, 512, 128), random_state=1)
# Train the perceptrons ppn.fit(X_train_std, y_train) mppn.fit(X_train_std, y_train)
# Apply the trained perceptrons on the X data to make predicts for the y test data y_pred = ppn.predict(X_test_std) multi_y_pred = mppn.predict(X_test_std)
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations) print('Single-layer perceptron accuracy: %.4f' % accuracy_score(y_test, y_pred)) print('Multilayer perceptron accuracy: %.4f' % accuracy_score(y_test, multi_y_pred))
Single-layer perceptron accuracy: 0.9574 Multilayer perceptron accuracy: 0.9759
Пример использования с помощью tensorflow [6]
Будем классифицировать цифры из того же датасета MNIST.
# Load required libraries import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data
#Load MNIST dataset mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
#placeholder for test data x = tf.placeholder(tf.float32, [None, 784]) #placeholder for weights and bias W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) #tensorflow model y = tf.nn.softmax(tf.matmul(x, W) + b) #loss function y_ = tf.placeholder(tf.float32, [None, 10]) cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
#gradient descent step train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict=) correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print("Accuracy: %s" % sess.run(accuracy, feed_dict=))
Рисунок 8.
Правильные метки — 5, 4, 9, 7.
Результат классификации — 6, 6, 4, 4.
Accuracy: 0.9164
На рисунке справа показаны четыре типичных изображения, на которых классификаторы ошибаются. Согласитесь, случаи действительно тяжелые.
Пример на языке Java
Пример классификации с применением weka.classifiers.functions.MultilayerPerceptron [7]
nz.ac.waikato.cms.weka weka-stable 3.8.0
import weka.classifiers.functions.MultilayerPerceptron; import weka.core.converters.CSVLoader; import java.io.File;
// read train & test datasets and build MLP classifier var trainds = new DataSource("etc/train.csv"); var train = trainds.getDataSet(); train.setClassIndex(train.numAttributes() - 1); var testds = new DataSource("etc/test.csv"); var test = testds.getDataSet(); test.setClassIndex(test.numAttributes() - 1); var mlp = new MultilayerPerceptron(); mlp.buildClassifier(train); // Test the model var eTest = new Evaluation(train); eTest.evaluateModel(mlp, test); // Print the result à la Weka explorer: var strSummary = eTest.toSummaryString(); System.out.println(strSummary);
См. также
- Сверточные нейронные сети
- Рекуррентные нейронные сети
- Рекурсивные нейронные сети [на 28.01.19 не создан]
Примечания
- ↑Artificial neuron, Wikipedia
- ↑Perceptron, Wikipedia
- ↑Применения перцептрона, Wikipedia
- ↑Библиотека scikit-learn для Python
- ↑Датасет MNIST
- ↑Библиотека tensorflow для Python
- ↑Weka, MLP
Источники информации
- Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.
- Нейронные сети — учебник
Как обучить нейросеть?
Обучение нейронной сети — это процесс, при котором модель на основе данных «учится» распознавать паттерны, делать предсказания или выполнять другие задачи. Прежде чем разбираться, как такое обучение проводится, стоит определиться с основными понятиями.
Оглавление
Основные термины
Нейросеть
Нейронная сеть — это компьютерная модель, которая имитирует работу человеческого мозга. Она состоит из множества маленьких строительных блоков, называемых нейронами. Мы уже разбирали как она работает, но если кратко: нейронная сеть — это компьютерная программа, использующая математические операции для обработки информации. Внутри нейронной сети есть слои нейронов, которые обрабатывают входные данные и производят выходные данные.
Веса
Веса — это числа, которые связывают нейроны друг с другом. Каждый нейрон имеет свои входы и выходы. Когда данные поступают на входы нейрона, он выполняет некоторые вычисления и передает результат на выход. Веса определяют, насколько сильно входные данные влияют на результат вычислений нейрона. Если вес большой, то входные данные сильно влияют на выход нейрона. Если вес маленький, то влияние на выход будет слабым.
Веса нейронной сети настраиваются в процессе обучения и определяют, какие данные будут учитываться и насколько они будут влиять на выводы сети.
Градиент нейросети
Градиент — вектор, который показывает направление наибольшего увеличения функции. В контексте обучения нейронных сетей градиент используется для оптимизации функции ошибки, которая показывает, насколько хорошо модель предсказывает правильные ответы на обучающих данных.
При обучении градиент вычисляется путем нахождения производной функции ошибки по каждому параметру модели (весам и смещениям). Затем он используется для обновления параметров модели таким образом, чтобы уменьшить значение функции ошибки. Если градиент большой, то изменение параметров модели будет большим, что может привести к ускоренной сходимости, то есть быстрому, но очень приблизительному результату.
При использовании методов градиентного спуска градиент показывает направление, в котором нужно изменять параметры модели, чтобы минимизировать функцию ошибки.
Другие Статьи
12 основных видов нейросетей
Можно ли считать контент, сгенерированный нейросетью, уникальным?
Как писать запрос (промпт) для нейросети
Смещение
В обучении нейросети термин «смещение» относится к дополнительному параметру, который помогает нейросети лучше обрабатывать данные и делать более точные прогнозы.
Для понимания смещения давайте рассмотрим, как работает нейросеть. Она состоит из множества нейронов, которые обрабатывают входные данные и передают свои выходные значения следующим нейронам. Каждый нейрон имеет свои веса, которые учитывают важность различных входных данных. Веса определяются в процессе обучения нейросети.
Смещение же — дополнительный параметр для каждого нейрона. Он позволяет нейросети смещать выходное значение нейрона в определенном направлении, независимо от входных данных. Можно сказать, что смещение определяет базовый уровень активации нейрона.
Взаимодействие между весами и смещениями позволяет нейросети находить оптимальные значения для достижения желаемых результатов.
Сходимость нейросети
Сходимость нейросети в простых словах означает, что она достигла оптимального состояния обучения. Когда нейросеть обучается, она пытается улучшить свою производительность на основе предоставленных данных. В процессе обучения нейросеть корректирует свои веса и параметры, чтобы минимизировать ошибку между предсказаниями и ожидаемыми результатами.
Сходимость происходит, когда нейросеть достигает стабильного состояния, в котором она достаточно хорошо предсказывает желаемые результаты. Это означает, что дальнейшее обучение не приводит к значительному улучшению производительности. На практике это обычно проявляется в том, что ошибка обучения нейросети начинает медленно снижаться или перестает меняться в значительной степени.
Основные этапы обучения нейросетей
Процесс обучения нейронной сети обычно включает следующие этапы:
- Сбор данных: сбор репрезентативного и разнообразного набора данных, который включает помеченные примеры проблемы, которую вы хотите решить с помощью нейронной сети.
- Предварительная обработка данных: очистка и предварительная обработка данных, чтобы обеспечить формат, подходящий для обучения. Это может включать такие задачи, как нормализация, масштабирование функций и обработка пропущенных значений.
- Проект архитектуры модели: выбор подходящей архитектуры нейронной сети для вашей задачи, включая определение количества и типа слоев, функций активации и шаблонов подключения.
- Инициализация: инициализация весов и смещений нейронной сети. Этот шаг важен, поскольку начальные значения могут повлиять на конвергенцию и производительность сети.
- Прямое распространение: подача входных данных через сеть в прямом проходе, где активации и выходные данные каждого слоя рассчитываются на основе текущих весов и смещений.
- Расчет потерь: сравнение прогнозируемых выходных данных сети с истинными метками в обучающих данных и вычисление метрики потерь или ошибок, которая количественно определяет расхождение между ними.
- Обратное распространение: распространение вычисленных потерь обратно по сети для обновления весов и смещений. Этот шаг включает в себя вычисление градиентов потерь по отношению к параметрам сети с использованием цепного правила.
- Оптимизация: применение алгоритма оптимизации, такого как градиентный спуск, для итеративного обновления параметров сети. Цель состоит в том, чтобы свести к минимуму потери и улучшить производительность сети на обучающих данных.
- Итерации обучения: повторение прямого распространения, расчета потерь, обратного распространения и шагов оптимизации для нескольких итераций или эпох. Это позволяет сети постепенно корректировать свои веса и улучшать способность делать точные прогнозы.
- Проверка и мониторинг: периодическая оценка производительности сети на отдельном наборе данных проверки для отслеживания ее способности к обобщению и обнаружения переобучения. Это помогает в настройке гиперпараметров или ранней остановке процесса обучения, если это необходимо.
- Тестирование: после завершения обучения оценка окончательной обученной модели на независимом наборе данных для тестирования, чтобы оценить ее производительность и подтвердить ее эффективность при решении поставленной задачи.
- Тонкая настройка и развертывание. После начального обучения можно выполнить дальнейшую тонкую настройку и оптимизацию модели на основе конкретных требований или отзывов. Наконец, обученную модель можно использовать для прогнозирования новых, невидимых данных.
Методы обучения нейросети
Основных методов обучения нейронных сетей три: с учителем, без учителя и с подкреплением. К ним стоит добавить трансферное обучение. Рассмотрим их подробнее.
Обучение с учителем
Обучение с учителем является наиболее распространенным и широко используемым методом обучения нейронных сетей. При обучении с учителем предоставляется помеченный набор данных для обучения нейронной сети, состоящий из входных выборок и соответствующих им целевых выходных данных. Сеть учится сопоставлять входные данные с желаемыми выходными данными, итеративно корректируя свои веса и смещения.
Решающую роль в обучении с учителем играет алгоритм обратного распространения. Он вычисляет градиент ошибки сети по отношению к ее весам, позволяя настраивать параметры с помощью методов оптимизации градиентного спуска. Этот итеративный процесс продолжается до тех пор, пока сеть не сойдется к состоянию, в котором ее прогнозы точно совпадают с желаемыми выходными данными.
Обучение с учителем особенно эффективно для таких задач, как классификация изображений, распознавание речи и анализ тональности, где легко доступны размеченные данные.
Обучение без учителя
Обучение без учителя отличается от обучения с учителем тем, что оно имеет дело с немаркированными данными. В этом методе обучения сеть учится обнаруживать внутренние структуры, шаблоны и отношения в данных без явных целевых выходных данных.
Кластеризация и уменьшение размерности — два распространенных применения обучения без учителя. Алгоритмы кластеризации группируют схожие точки данных вместе на основе их внутренних свойств. Методы уменьшения размерности, такие как анализ основных компонентов, автоэнкодеры, уменьшают сложность многомерных данных, сохраняя при этом их важные функции.
Изучая базовую структуру данных, обучение без учителя позволяет нейронным сетям узнавать представления, которые собирают важную информацию и облегчают последующие задачи, такие как обнаружение аномалий, сжатие данных и системы рекомендаций.
Обучение с подкреплением
Обучение нейронной сети с подкреплением использует другой подход. Вместо использования помеченных данных, такое обучение полагается на взаимодействие агента с окружающей средой и получение обратной связи в виде вознаграждений или наказаний. Агент учится предпринимать действия, которые со временем максимизируют совокупное вознаграждение.
При обучении с подкреплением нейронная сеть учится методом проб и ошибок. Она исследует различные действия, наблюдает за последствиями и корректирует свои действия в зависимости от полученных вознаграждений. Обучение с подкреплением продемонстрировало значительный успех в таких областях, как игры, робототехника и автономные транспортные средства. Способность учиться на взаимодействиях и адаптироваться к динамичной среде делает его мощным методом обучения.
Трансферное обучение
Трансферное обучение — это метод обучения, который использует знания, полученные при выполнении одной задачи, для повышения производительности при выполнении другой связанной задачи. Он включает в себя предварительное обучение нейронной сети на большом наборе данных, а затем ее точную настройку на меньшем наборе данных, специфичном для целевой задачи.
Используя трансферное обучение, сеть может извлечь выгоду из представлений, полученных из исходной задачи, что значительно сэкономит время и ресурсы. Это особенно полезно в сценариях, где помеченные данные для целевой задачи ограничены или дороги для получения.
Алгоритмы обучения нейросети
В разделе методов упоминались некоторые алгоритмы обучения нейронных сетей. На сегодняшний день их достаточно много, остановимся на самых распространенных.
Алгоритм обратного распространения
Метод обратного распространения заключается в многократном повторении двух шагов: прямого и обратного. Шаг прямого распространения включает в себя передачу входной выборки через нейронную сеть и вычисление прогнозируемого результата. Выход каждого нейрона вычисляется путем применения функции активации к взвешенной сумме его входов.
Начиная с входного слоя, входные значения распространяются вперед слой за слоем, пока не будет достигнут выходной слой. Выходной слой обеспечивает прогнозируемый вывод нейронной сети для данного ввода.
На этапе обратного распространения ошибка между прогнозируемым выходом и истинным выходом вычисляется с использованием предопределенной функции потерь (например, среднеквадратичной ошибки или перекрестной энтропийной потери). Затем ошибка распространяется обратно по сети для вычисления градиентов функции потерь по отношению к весам каждого нейрона.
Градиенты рассчитываются с использованием цепного правила исчисления, которое позволяет отнести ошибку к каждому весу в сети. Градиенты указывают направление и величину обновлений веса, которые уменьшают функцию потерь.
Веса обновляются путем выполнения шага в направлении, противоположном градиентам, масштабируемого по скорости обучения, которая определяет размер обновления.
Обратное распространение имеет решающее значение для обучения глубоких нейронных сетей с несколькими слоями, поскольку оно позволяет эффективно распространять градиенты по сети. Без обратного распространения было бы сложно оптимизировать веса нейронной сети, особенно в глубоких архитектурах, где количество параметров может быть очень большим.
Стоит отметить, что, хотя обратное распространение является широко используемым и эффективным методом обучения, существуют варианты и расширения алгоритма, которые решают такие проблемы, как исчезающие градиенты, взрывающиеся градиенты и переоснащение. Эти варианты включают в себя такие методы, как отсечение градиента, пропуск соединений (например, в остаточных сетях) и более продвинутые алгоритмы оптимизации, такие как Adam или RMSprop, которые адаптивно регулируют скорость обучения.
Алгоритм упругого распространения
Метод Rprop (Resilient Backpropagation) — это алгоритм оптимизации, который используется в нейронных сетях для обучения на основе обратного распространения ошибки. Он относится к группе методов обновления весов, которые применяются в процессе обучения нейронных сетей.
Проще говоря, во время обучения нейронные сети пытаются свести к минимуму разницу между их предсказанными выходными данными и желаемыми выходными данными. Это включает в себя настройку веса связей между нейронами. Метод Rprop фокусируется на том, как выполняются эти корректировки веса.
Rprop вычисляет обновления веса на основе знака градиента, который указывает направление, в котором веса должны быть скорректированы. В отличие от других методов, использующих фиксированную скорость обучения, Rprop адаптирует скорость обучения для каждого веса отдельно. Если знак градиента остается прежним, Rprop увеличивает скорость обучения, чтобы внести большие корректировки веса. Если знак меняется, это снижает скорость обучения, чтобы внести меньшие корректировки. Таким образом, Rprop «гибко» адаптируется к поведению каждого веса, обеспечивая более быструю и эффективную тренировку.
Регулируя скорость обучения индивидуально, Rprop может эффективно перемещаться по сложным и многомерным весовым пространствам, помогая нейронным сетям быстрее и надежнее сходиться к оптимальным решениям.
Генетический алгоритм обучения
Генетический алгоритм обучения нейросети — это метод машинного обучения, который использует идеи из генетики, чтобы настроить параметры нейросети для максимальной производительности на задаче.
Процесс начинается с создания случайной популяции нейросетей, где каждая сеть имеет случайно заданные параметры, такие как веса и смещения. Эта популяция оценивается на заданной задаче, например, на классификации изображений.
Затем из популяции выбираются наиболее успешные сети, которые будут использованы для создания следующего поколения. Это происходит путем применения генетических операторов, таких как скрещивание и мутация, для создания новых нейросетей на основе наиболее успешных.
Новое поколение сетей оценивается на задаче, и процесс повторяется до тех пор, пока не будет достигнут определенный критерий остановки, например, достижение определенной точности.
Из сказанного выше очевидно, что обучение нейронных сетей — сложный процесс, требующий специальных знаний и времени. Более того, современное обучение находится на начальных ступенях развития. В будущем появится немало новых алгоритмов и методов, позволяющих эффективно использовать нейросети — замечательное изобретение человечества.