Обсуждение:Возможности перцептрона Розенблатта/Выполнение заданий/Neomant

От Neomant - Задание №1

править

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

1. Имеем перцептрон полностью соответствующий схеме из задания. Все веса первого словя(S-A связей) принимаем +1. Пороги θ всех элементов принимаем за ноль. Тогда, согласно описания A-элемента[1], все ассоциативные элементы будут возбуждены так сумма раздражающих сигналов в любом случае будет не отрицательной. Пришлось в моделе для активации A-элемента принять сумму раздражителей строго большей порога. Где правда?

2. В задании полагается, что имея 0 на выходе R-элемента имеем один распознаный образ(стимул), +1 - другой. В этом же задании предлагается сделать выборку из трёх образов. Я это вижу как добавление во второй слой ещё одного R-элемента и соединения всех его входов с выходами всех A-элементов. Но тогда возникает ситуация, при которой на выходе одного R-элемента имеем 0 или 1(первый или второй распознаный образ) и на выходе второго так-же. То есть неопрелённость. Мне кажется более правильным принять три состояния выхода R-элемента, как и описано там же [2]. Тогда при первой итерации, с нулевыми весами AR-связей, имем на выходе 0, что логично - образ не распознан так-как перцептрон ещё не обучен.

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

4. И ещё вопрос. Пытался описать класс перцептронов как можно более общим, но так-как не обладаю пока хорошими познаниями в теории имеем то, что имем. Я предполагаю, что любой элемент может иметь множество выходов, т. е. выход один, но идущий к входам различных элементов различных слоёв. Так ли это?

С обучением пока попробую разобраться самостоятельно. А матрицы A-элементов посчитать не сложно даже на пальцах: для квадрата, гриба, бедного квадрата и самолёта - 1 1 1; для пирамиды и стрелки - 0 1 0. Но тогда не понимаю как можно различить между собой образы из первой группы. То же самое и со второй группой. Или я где-то ошибаюсь?Neomant 07:11, 24 сентября 2010 (UTC)Ответить

  1. Тут противоречия нету. Вывод "все ассоциативные элементы будут возбуждены" - неверен. Работа А-элементов зависит не только от весов, но и от сигналов от S-элементов, если не будет сигнала, то и не будет возбуждения А-элемента, даже если вес +1. Поэтому возбуждение зависит в данном случае от того, какой образ на сетчатке (S-элементах). S.J. 10:08, 24 сентября 2010 (UTC)Ответить
  2. Несколько технических вопросов В этом же задании предлагается сделать выборку из трёх образов - можете дать цитату - где ? И принять три состояния выхода R-элемента, как и описано там же - для этого тоже дайте цитату (я автор и того и другого, но что-то не помню таких утверждений). "возникает ситуация, при которой на выходе одного R-элемента имеем 0 или 1(первый или второй распознаный образ) и на выходе второго так-же" - такая ситуация имеется только в самом начале, и затем во время обучения все настраивается как нужно. S.J. 10:16, 24 сентября 2010 (UTC)Ответить
  3. Для перцептрона с менее чем 30 А-элементами, могут возникнуть проблемы. Образы могут не различаться на А - элементах. Требование такое w:А матрица перцептрона - не должна быть вырожденной. Более 30 А-элементов уже этой проблемы нету см. [3] S.J. 10:24, 24 сентября 2010 (UTC)Ответить
  4. Тут боле правильно говорить, что элемент имеет N входов и один выход. При этом один выход может подаваться на любой подмножество входов. S.J. 10:27, 24 сентября 2010 (UTC)Ответить
  5. А-матрицы - давайте начнем только с двух образов, я думаю вы считаете их неверно. Посмотрите как это тут уже делалось другим участником. Приведите именно А - матрицу. Например, для пирамиды и стрелки должна быть матрица 2x3 (2 образа, 3 А элемента) S.J. 10:30, 24 сентября 2010 (UTC)Ответить

1. Отсутствие сигнала я полагаю нулём. По сему действительно не важно какие имеем весовые коэффициенты, если от соответствующих сенсоров не приходят на вход ассоциатора сигналы, в сумме произведений получаем ноль, ну, или не меняем изначального значения ассоциатора, которое я тоже полагаю нулевым. Далее сравнивая полученую сумму(нулевую) с порогом(нулевым по условию задания) делаем вывод - сумма больше или равна и переводим ассоциатор в возбуждённое состояние.
2. Задача: Рассчитать весовые коэффициенты связей второго слоя (между А-элементами и R-элементом), которые образуются во время обучения двум-трём произвольно выбранным образам.[4]
Простым R-элементом (реагирующим, то есть действующим) называется элемент, который выдаёт сигнал +1, если сумма его входных сигналов является строго положительной, и сигнал −1, если сумма его входных сигналов является строго отрицательной. Если сумма входных сигналов равна нулю, выход считается либо равным нулю, либо неопределённым.[5]. С утверждением, что во время обучения всё настраивается как нужно не согласен. Всё опять же потому, что не понимаем друг друга верно.
3. Прочту, осмыслю. Думаю, что правильно думаю.
4. Это и имелось в виду. Расту в своих глазах.
5. Да, с этим разобрался. А-матрица (2x3) - два образа, три элемента. Попробую изобразить.

Образ Вход
S1 S2 S3 S4 S5 S6
Пирамида 0 0 0 0 1 1
Стрелка 0 1 0 0 0 0

Весовые коэффициенты для S-A связей пологаем равными +1, поэтому опускаем их как множители и сразу будем складывать соответствующие входные сигналы от сенсоров. В общем виде имеем:
  ;
и в частности для пирамиды и стрелки:
  ;
или
  ;
и тогда
  ;  
Neomant 12:45, 24 сентября 2010 (UTC)Ответить

  1. Здесь ключевое больше или равна -> больше или равна. Действительно, в оригинале у Розеблатта указано больше или равна, но там порог должен быть больше нуля. Так теперь не делают, удобно пороги брать нулевыми, поэтому равно убирают с другой стороны. Статью в вики подправлю, чтобы не было разночтений. S.J. 14:48, 24 сентября 2010 (UTC)Ответить
  2. Ок, но эти три состояния не обязательны, и уж точно не связаны с тем, что может быть три образа. Если есть три образа - то лучше иметь три R элемента, каждый из которых говорит - есть или нет этот образ. Если же хочется экономить - то можно перевести в двоичную систему, тогда будет достаточно двух. см. w:Конфигурационное кодирование и w:Позиционное кодирование S.J. 15:03, 24 сентября 2010 (UTC)Ответить
  3. С А- матрицей все ок, но как раз нарвались на случай когда образы не различимы. Нужно изменить связи первого слоя. S.J. 15:18, 24 сентября 2010 (UTC)Ответить


Три состояния точно не связаны с тремя распознаваемыми образами, прекрасно это понимаю. Так же понимаю, что они и не обязательны, но в рамках постановки задачи с распознаванием трёх образов пришлось бы использовать либо три R-элемента с двумя состояниями (например: 1 - определённый образ распознан, 0 - не распознан) либо два R-элемента с тремя состояниями (у одного из них - +1 и -1 - распознавание разных образов, 0 - не распознавание их и у другого, например +1 - распознавание третьего образа и 0, -1 не распознавание его). Как-то так. С совпадением ассоциативных матриц похуже. В нашем случае Вы говорите нужно поменять связи. Но связи - это те же весовые коэффициенты. То есть можно представить, что выход каждого S-элемента соединён со входами всех A-элементов, только у некоторых связей весовой коэффициент 0. Таким образом поменяв связи мы просто меняем выборку весовых коэффициентов. Вроде кое-что начинаю понимать хоть и на интуитивном уровне. Хорошо. Попробую покрутить со связями(коэффициентами), разобраться с обучением и продумать какой простенький консольный интерфейс. Результаты отпишу уже на следующей неделе. Да, и ещё сегодня для себя почерпнул нового, хотя и предполагал это - у перцептрона два режим работы: обучение и собственно распознание. Для меня было это немало важно при написании класса. Теперь внесу соответствующие изменения. Neomant 16:11, 24 сентября 2010 (UTC)Ответить

Вижу со многим вы разобрались. Единственно, либо два R-элемента с тремя состояниями - это не обязательно, можно также либо два R-элемента с двумя состояниями. Честно говоря, это третье нулевое состояние, хоть оно и есть в оригинале - оно совершенно лишнее, как правило его можно приравнять к -1, и это вообще ни на что не повлияет. S.J. 20:04, 24 сентября 2010 (UTC)Ответить
С обучением разобрался. Оставил прежней сеть и все коэффициенты SA-связей принял за +1. Выборка из самолёта и стрелки даёт разные образы. Вот что получил в результате:
Веса Итерации
1 2 3 4
w1 1 1 1 1 1 1 1 1
w2 1 0 0 -1 -1 -1 -1 -1
w3 1 1 1 1 1 1 1 1
№ стимула 1 2 1 2 1 2 1 2
Neomant 19:15, 28 сентября 2010 (UTC)Ответить
Может выложите исходный код на C# ? Было бы на порядок проще проверить (и подсказать те или другие моменты) и полезнее окружающим .. S.J. 19:28, 28 сентября 2010 (UTC)Ответить
Выложил здесь [6]. Исходник без комментариев, нехорошая привычка конечно. Если будет необходимость, прокомментирую. Neomant 12:47, 29 сентября 2010 (UTC)Ответить

От Neomant - Задание №2

править
  • Все хорошо. Но несколько мелких замечаний. Далее я предлагаю усовершенствовать и развить эту программу. Для этого нужно:
  1. структуры Element и Link превратить в классы, тогда метод resetState() - естественным образом уберется и перейдет в конструктор класса Element, а setLinks() в конструктор класса Link.
  2. Нужно создать класс "Образ", куда перенести описание 6 образов (square, mushroom, pyramid, poorSquare, airplane, arrow). Класс должен уметь загрузить образ из файла. Таким образом имеем 6 объектов класса "Образ", и в файлах задаем их описание - которое увеличим с одномерного до двух мерного, т.е. полного
  3. SALink - теперь задаем случаным образом, число А - элементов увеличиваем до 50 (нестрашно, что это излишнее), число R - элементов = 6 (по числу образом)
  4. Итого новая задача обучить перцептрон всем 6 двухмерным образам. И построить график обучения - число ошибок в зависимости от числа итераций обучения. S.J. 20:43, 29 сентября 2010 (UTC)Ответить
    1. Согласен, что структуры лучше заменить классами, но от resetState() это не избавит так-как метод используется для очистки сети перед её расчётом. Попробую избавиться от resetState() как-то подругому. Хотелось сделать класс перцептрона более универсальным, т.е. задавать количество элементов в разных слоях и их связи уже при создании объекта, поэтому с setLinks() так же ещё не определился.
    2. С этим полностью согласен, только для перцептрона понятия одномерный и двухмерный неразличимы.
    3. Случайным образом - это немного пугает, попытаюсь разобраться.
    4. Построить график - это перейти от консоли к GUI, так же придётся разбираться. Когда будут результаты, отпишусь. Neomant 14:44, 30 сентября 2010 (UTC)Ответить
    • "от resetState() это не избавит так-как метод используется для очистки" - для этого делается пересоздание объекта - вот и вся проблема ;). задавать количество элементов - тоже не проблема - это параметры для конструктора. для перцептрона понятия одномерный и двухмерный неразличимы - это конечно, но это для удобства человека задавать образы. Затем мы надеюсь перейдем к изображениям и там это будет еще актуальнее. Построить график - это перейти от консоли к GUI, так же придётся разбираться. - тут я вам даже не помощник, не пробывал заниматься графиками в С#, если не получится вы сможете выдать таблицу данных в файл, а потом построить график в Excel. Но конечно приятнее on-line внутри программы.S.J. 14:55, 30 сентября 2010 (UTC)Ответить
      • Есть некоторые результаты. Сеть 36-50-6 построил. SA связи задавал так: каждый S связан со всеми A, а вес связи случайный [-1, 0, 1]. Образы пока не сохранял и не читал из файлов. График тоже пока не рисовал, но с ним проблем так же не будет больших, а пока график не нужен. Сеть обучается полностью в среднем за 6 итераций. Конечно же понимаю, что для действительного обучения мало иметь по одному образу на каждую фигуру. При такой постановке задачи сеть даёт сбои уже при малейших ошибках в образах. Думаю стоит также подумать над сохранением конфигурации сети. Neomant 18:22, 4 октября 2010 (UTC)Ответить
        • При такой постановке задачи сеть даёт сбои уже при малейших ошибках в образах - всему свое время. Встройте чтение из файла, постройте график, и каждый S связан со всеми A, а вес связи случайный [-1, 0, 1] - это не оптимально по времени - нужно не обсчитывать те связи, которых нету. Затем увеличите число образов, например, до 30 - изображая цифры 0..9 тремя различными вариантами, например со смещением. S.J. 21:42, 4 октября 2010 (UTC)Ответить
          • Да, действительно забегаю вперёд. Такая уж человеческая натура: хочется всего и немедленно. Согласен с неоптимальностью построения SA связей, тем более, что избежать этого просто. Уже поправил. С сохранением/загрузкой образов из файла нужен совет: действительно образы можно представить в виде объёктов класса и хранить их состояние в бинарном файле. Реализовать это будет просто. Но так как количество образов возрасло, возникнет трудность с их редактированием. Нужен будет либо какой-то редактор образов, либо отказаться от сериализации и использовать, напимер, bmp формат. Neomant 07:50, 5 октября 2010 (UTC)Ответить
            • Лучше использовать простой текстовый файл: удобнее редактировать в ручную, да и разбирать программно легче и быстрее (не нужно распаковывать). S.J. 08:01, 5 октября 2010 (UTC)Ответить
              • Вот что получилось [7]. Добавил класс образа и менеджер образов. Менеджер считывает образы из xml файла. Формат файла простой, думаю объяснять нет необходимости. Теперь персептрон генерируется каждый раз новый для обучения. Количество R-элементов устанавливается равным количеству классов образов. Некоторые конфигурации персептрона не подлежат полному обучению, что, впрочем, очевидно. Что же далее? Жду комментариев.Neomant 10:00, 25 ноября 2010 (UTC)Ответить
Вернуться на страницу «Возможности перцептрона Розенблатта/Выполнение заданий/Neomant».