Формулировка задачи для демонстрации работы нейрона — КиберПедия 

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Формулировка задачи для демонстрации работы нейрона

2019-11-18 86
Формулировка задачи для демонстрации работы нейрона 0.00 из 5.00 0 оценок
Заказать работу

Что такое нейрон

Нейрон – чёрный ящик со множеством входов и одним выходом. В нейронных сетях принято считать значение сигнала на выходе по формуле:

y = 𝑓(w₁ * x₁ + w₂ * x₂ + …),

где 𝑓 – так называемая функция активации, а wₖ – веса каждого из входов. Чем больше вес, там больше вклад входа в результирующее значение. Вклад может быть и отрицательным.

Остальные детали рассмотрим на примере. Сформулируем задачу для нашего нейрона.

Формулировка задачи для демонстрации работы нейрона

Задача: дан набор точек, про которые известно, что они: или чёрные, или белые. Найти цвета других точек.

Набор точек на Python:

 

problem = [

'...?.....?............#',

'......?.......?....####',

'.?........?.....#####?#',

'.......?.....#####?####',

'..?..?....#############',

'.......######?######?##',

'....#####?#######?#####',

'.###################?##']

 

Там, где стоят «.» – это белые точки, там, где «#» – чёрные. А «?» надо отгадать.

Запрограммирует один единственный нейрон:

 

wx = 24

wy = 8

wb = -171

 

def neuron(x, y, bias=1):

f = wx * x + wy * y + wb * bias

if f < 0:

   return -1

return 1

 

Нейрон принимает три входных сигнала: две координаты и «опорный сигнал», который всегда постоянен.

На выходе он выдаёт или «–1», или «+1» – это ответ белое, или чёрное.

Следующий фрагмент кода «пробегает» по всем точкам-символам задачи. Там, где находит вопросительный знак – вызывает наш нейрон, передавая ему координаты точки.

И выводит результат: для белых точек «!», для чёрных – «%».

 

y = 0

for line in problem:

x = 0

new_line = ''

for char in line:

   if char == '?':

       # спрашиваем у нейрона, что он думает про эту точку

       r = neuron(x, y)

       if r < 0:

           char = '!'

       else:

           char = '%'

   new_line += char

   x += 1

print new_line

y += 1

 

На выходе получим:

 

...!.....!............#

......!.......!....####

.!........!.....#####%#

.......!.....#####%####

..!..!....#############

.......######%######%##

....#####%#######%#####

.###################%##

 

Таким образом, наш нейрон ведёт себя вполне разумно.

Откуда мы взяли правильные веса-коэффициенты? Как обучить нейрон?


Пример обучения нейрона

Обучение нейрона заключается в «подборе» весов входных сигналов.

1. Положим все веса произвольными. Например, нулевыми.

2. Подадим нейрону точку, для которой мы знаем правильный ответ.

3. Посчитаем функцию ошибки: error = desired – neuron(x, y) – разность того, что мы считаем правильным и того, что выдал нейрон.

В нашем случае, когда все наши величины принимают только значения «–1» и «+1», функция ошибки может принимать только три значения: «–2», «0» и «2».

4. Скорректируем веса на величину пропорциональную ошибке, входному сигналу и некоему «коэффициенту обучения».

Здесь всё кажется понятным, кроме, возможно, последнего пункта. Его логика проста. Чем больше ошибка, тем больше должна быть поправка. Чем больше сигнал на входе (чем больше был вклад этого входа в ответ), тем сильнее корректируем вес этого входа. А «константа обучения» задаёт скорость, с которой нейрон делает выводы. Если эта константа мала, то нейрон будет обучаться медленно. Если она слишком велика, то нейрон будет делать слишком поспешные выводы и впадать в крайности.

Обучающая процедура будет выглядеть так:

 

def learn(x, y, desired):

global wx, wy, wb

learning_constant = 0.1

error = desired - neuron(x, y)

wx += error * x * learning_constant

wy += error * y * learning_constant

wb += error * 1 * learning_constant # bias = 1


Цикл обучения можно записать так:

 

def one_step_of_learning():

y = 0

for line in problem:

   x = 0

   for char in line:

       if char == '.':

           learn(x, y, -1)

       if char == '#':

           learn(x, y, 1)

       x += 1

   y += 1

 

print_solution()

for i in range(100):

one_step_of_learning()

print_solution()

 

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

 

def print_solution():

y = 0

for line in problem:

   x = 0

   new_line = ''

   for char in line:

       if char == '?':

           r = neuron(x, y)

           if r < 0:

               char = '!'

           else:

               char = '%'

       new_line += char

       x += 1

   print new_line

   y += 1

 

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

Можно варьировать задачу, коэффициент обучения, начальный веса.

 

Промежуточные результаты.

В самом начале (до обучения). Нейрон отвечает всегда одно и то же (чёрное):

 

...%.....%............#

......%.......%....####

.%........%.....#####%#

.......%.....#####%####

..%..%....#############

.......######%######%##

....#####%#######%#####

.###################%##

 

После третьей эпохи в ответах нейрона начинает появляться разнообразие:

 

...%.....%............#

......%.......%....####

.!........%.....#####%#

.......%.....#####%####

..%..%....#############

.......######%######%##

....#####%#######%#####

.###################%##

 

После 25 эпох:

 

...!.....%............#

......!.......%....####

.!........%.....#####%#

.......%.....#####%####

..!..%....#############

.......######%######%##

....#####%#######%#####

.###################%##

 

После 32 эпох все ответы правильные:

 

...!.....!............#

......!.......!....####

.!........!.....#####%#

.......!.....#####%####

..!..!....#############

.......######%######%##

....#####%#######%#####

.###################%##

Наш нейрон обучился. То есть мы нашли веса, с которыми нейрон выдаёт правильный ответ.

 

Рассмотрим, какие упрощения и допущения были сделаны.

Задача

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

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

Это универсальной свойство нейрона. Если бы входов было бы три – x, y, z (и ещё bias, конечно), то нейрон будет делить трёхмерное пространство по плоскости.

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

 

.?..............

......####......

....####?###....

......####......

............?...

 

Именно поэтому для реальных задач используются многослойные сети.

Что такое нейрон

Нейрон – чёрный ящик со множеством входов и одним выходом. В нейронных сетях принято считать значение сигнала на выходе по формуле:

y = 𝑓(w₁ * x₁ + w₂ * x₂ + …),

где 𝑓 – так называемая функция активации, а wₖ – веса каждого из входов. Чем больше вес, там больше вклад входа в результирующее значение. Вклад может быть и отрицательным.

Остальные детали рассмотрим на примере. Сформулируем задачу для нашего нейрона.

Формулировка задачи для демонстрации работы нейрона

Задача: дан набор точек, про которые известно, что они: или чёрные, или белые. Найти цвета других точек.

Набор точек на Python:

 

problem = [

'...?.....?............#',

'......?.......?....####',

'.?........?.....#####?#',

'.......?.....#####?####',

'..?..?....#############',

'.......######?######?##',

'....#####?#######?#####',

'.###################?##']

 

Там, где стоят «.» – это белые точки, там, где «#» – чёрные. А «?» надо отгадать.

Запрограммирует один единственный нейрон:

 

wx = 24

wy = 8

wb = -171

 

def neuron(x, y, bias=1):

f = wx * x + wy * y + wb * bias

if f < 0:

   return -1

return 1

 

Нейрон принимает три входных сигнала: две координаты и «опорный сигнал», который всегда постоянен.

На выходе он выдаёт или «–1», или «+1» – это ответ белое, или чёрное.

Следующий фрагмент кода «пробегает» по всем точкам-символам задачи. Там, где находит вопросительный знак – вызывает наш нейрон, передавая ему координаты точки.

И выводит результат: для белых точек «!», для чёрных – «%».

 

y = 0

for line in problem:

x = 0

new_line = ''

for char in line:

   if char == '?':

       # спрашиваем у нейрона, что он думает про эту точку

       r = neuron(x, y)

       if r < 0:

           char = '!'

       else:

           char = '%'

   new_line += char

   x += 1

print new_line

y += 1

 

На выходе получим:

 

...!.....!............#

......!.......!....####

.!........!.....#####%#

.......!.....#####%####

..!..!....#############

.......######%######%##

....#####%#######%#####

.###################%##

 

Таким образом, наш нейрон ведёт себя вполне разумно.

Откуда мы взяли правильные веса-коэффициенты? Как обучить нейрон?


Пример обучения нейрона

Обучение нейрона заключается в «подборе» весов входных сигналов.

1. Положим все веса произвольными. Например, нулевыми.

2. Подадим нейрону точку, для которой мы знаем правильный ответ.

3. Посчитаем функцию ошибки: error = desired – neuron(x, y) – разность того, что мы считаем правильным и того, что выдал нейрон.

В нашем случае, когда все наши величины принимают только значения «–1» и «+1», функция ошибки может принимать только три значения: «–2», «0» и «2».

4. Скорректируем веса на величину пропорциональную ошибке, входному сигналу и некоему «коэффициенту обучения».

Здесь всё кажется понятным, кроме, возможно, последнего пункта. Его логика проста. Чем больше ошибка, тем больше должна быть поправка. Чем больше сигнал на входе (чем больше был вклад этого входа в ответ), тем сильнее корректируем вес этого входа. А «константа обучения» задаёт скорость, с которой нейрон делает выводы. Если эта константа мала, то нейрон будет обучаться медленно. Если она слишком велика, то нейрон будет делать слишком поспешные выводы и впадать в крайности.

Обучающая процедура будет выглядеть так:

 

def learn(x, y, desired):

global wx, wy, wb

learning_constant = 0.1

error = desired - neuron(x, y)

wx += error * x * learning_constant

wy += error * y * learning_constant

wb += error * 1 * learning_constant # bias = 1


Цикл обучения можно записать так:

 

def one_step_of_learning():

y = 0

for line in problem:

   x = 0

   for char in line:

       if char == '.':

           learn(x, y, -1)

       if char == '#':

           learn(x, y, 1)

       x += 1

   y += 1

 

print_solution()

for i in range(100):

one_step_of_learning()

print_solution()

 

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

 

def print_solution():

y = 0

for line in problem:

   x = 0

   new_line = ''

   for char in line:

       if char == '?':

           r = neuron(x, y)

           if r < 0:

               char = '!'

           else:

               char = '%'

       new_line += char

       x += 1

   print new_line

   y += 1

 

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

Можно варьировать задачу, коэффициент обучения, начальный веса.

 

Промежуточные результаты.

В самом начале (до обучения). Нейрон отвечает всегда одно и то же (чёрное):

 

...%.....%............#

......%.......%....####

.%........%.....#####%#

.......%.....#####%####

..%..%....#############

.......######%######%##

....#####%#######%#####

.###################%##

 

После третьей эпохи в ответах нейрона начинает появляться разнообразие:

 

...%.....%............#

......%.......%....####

.!........%.....#####%#

.......%.....#####%####

..%..%....#############

.......######%######%##

....#####%#######%#####

.###################%##

 

После 25 эпох:

 

...!.....%............#

......!.......%....####

.!........%.....#####%#

.......%.....#####%####

..!..%....#############

.......######%######%##

....#####%#######%#####

.###################%##

 

После 32 эпох все ответы правильные:

 

...!.....!............#

......!.......!....####

.!........!.....#####%#

.......!.....#####%####

..!..!....#############

.......######%######%##

....#####%#######%#####

.###################%##

Наш нейрон обучился. То есть мы нашли веса, с которыми нейрон выдаёт правильный ответ.

 

Рассмотрим, какие упрощения и допущения были сделаны.

Задача

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

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

Это универсальной свойство нейрона. Если бы входов было бы три – x, y, z (и ещё bias, конечно), то нейрон будет делить трёхмерное пространство по плоскости.

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

 

.?..............

......####......

....####?###....

......####......

............?...

 

Именно поэтому для реальных задач используются многослойные сети.


Поделиться с друзьями:

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

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

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.114 с.