Первоначальное ознакомление с алгоритмами работы нейронной сети
Автор: Черных Дмитрий Александрович, педагог дополнительного образования, ОГБУ ДО «Ресурсный центр дополнительного образования», г. РязаньКонспект занятия объединения «Вычислительная техника и программирование» для детей 10-12 лет
Введение
Для начального обучения алгоритмизации, мне кажется, что нужно учитывать один важный фактор. Дело в том, что повсеместное увлечение объектно-ориентированным программированием обходит вниманием тот факт, что психологически при первоначальном знакомстве с программированием школьниками лучше усваивается материал с конкретными пошаговыми процедурами, действия которых можно непосредственно увидеть, тем более для некоторых программ процедурный код более эффективен. Не зря же в более новом языке С#, в отличие от С++ наряду с объектно-ориентированным подходом предусмотрено исполнение многих процедурных алгоритмов.
Идея алгоритма всегда далека от его реализации. Поэтому желательно, чтобы результат действия того или иного элемента алгоритма можно было бы посмотреть немедленно. Будем использовать алгоритмический язык без усложнённого синтаксиса процедурно ориентированный интерпретатор Qbasic. Фактически, это обычный алгоритмический язык с возможностями быстрого воспроизведения на компьютере. Именно он более всего подходит при начальном обучении программированию, когда программы не очень большие и не нужно предусматривать специальные средства их отладки, как в более продвинутых языках и средах.
Я привожу в этой работе содержание занятия, посвящённого первоначальному ознакомлению обучающихся с алгоритмом компьютерной модели простейшей нейронной сети. Разбираются принципы работы, составляется алгоритм решения задачи, пишется программа, запускается и обучающиеся убеждаются в работоспособности алгоритма. После этого анализируются полученные результаты, разбирается работа программы. Затем уже сами дети предлагают различные задачи и подходы к их решению на основе изученного материала.
Тема: «Ознакомление с алгоритмом работы нейронной сети».
Цель занятия
Познакомить обучающихся с подходами к алгоритмизации принципов работы нейронной сети. Организовать учебную деятельность, при которой обучающиеся сами смогут сформулировать задачи для «нейронной сети» и указать примерные пути их решения.
Возрастная группа: обучающиеся 10-12 лет
Продолжительность занятия 2 академических часа
Приобретаемые детьми навыки
- необходимость анализа структуры задачи для использования при её решении возможностей нейросетевого подхода;
- в процессе занятия обучающиеся отрабатывают взаимодействие различных элементов используемого алгоритмического языка;
- закрепляются понятия циклического алгоритма, подпрограммы, генерации случайного числа.
Особенности роли педагога
- в процессе работы добивается элементарного понимания обучающимися излагаемого материала;
- помогает вспомнить изученные ранее темы курса;
- после получения результатов, наглядно демонстрирует обучающимся эффективные методы работы нейронных сетей смоделированных на компьютере;
- даёт консультации для самостоятельной деятельности обучающихся по данной теме.
Оборудование
- кабинет информатики с индивидуальными рабочими местами;
- механическая модель нейронной сети из спичечных коробков;
- набор слайдов «Тайны мозга».
План занятия
Знакомство с новым материалом:
- Принципы работы нейронной сети.
- Алгоритм моделирующий работу простейшей нейросети.
- Нейросеть для игры Баше своими руками.
- 8 палочек. Алгоритм.
Практическая часть: составление программы.
Рефлексия.
Заключение.
Ход занятия
Принцип работы нейронной сети
Когда мы говорим об искусственном интеллекте, нелишне посмотреть, как работает интеллект естественный. Успехи в электронном сканировании мозга позволяют воочию наблюдать возбуждения в мозговой коре и её связи. Вот как выглядит расшифрованный снимок нейросети памяти:
Нейросеть памяти в мозге.
Структурный элемент мозга нейрон представляет из себя множество коротких отростков, реагирующих на различные воздействия, и один длинный, передающий результирующую этих сигналов дальше в мозг. Огромное количество таких нейронов и составляют основу мышления. Система работает следующим образом: малые отростки, поставляющие в нейрон нужные сигналы, приобретают большее влияние на результирующий сигнал, идущий по длинному отростку в мозг. А те отростки, которые дают не важную информацию, начинают игнорироваться. Происходит всё это не сразу, и этот процесс называется обучением, или настройкой нейронной сети.
Алгоритм простейшей нейросети
Компьютерная нейронная сеть построена таким же образом. Рассмотрим это на примере игры Баше:
Пусть два игрока берут по очереди со стола из горки в 8 палочек одну или две штуки. Кто берёт последнюю – тот проиграл. Рассмотрим схему этой игры для искусственного интеллекта начинающего первым.
Пустые кружки – проигрыш игрока, пустые квадратики – проигрыш сети. По этой модели нейронной сети мы видим связи, которые будут вести к проигрышу искусственного интеллекта. Зачеркнём их таким образом: ход сети обозначен жирной линией, идём вверх от проигрышного квадратика, зачёркивая эту линию. Если к узлу получившемуся после хода игрока (он обозначен кружком) подходят две зачёркнутые линии, такой узел назовём опасным. Если узел игрока опасный, то все связи идущие от него вверх тоже зачёркиваются. А вот для того, чтобы стал опасным узел нашего искусственного интеллекта (обозначен прямоугольниками), достаточно, чтобы к нему подошла только одна зачёркнутая линия (ведь противник-игрок будет выбирать наиболее опасный для компьютера ход)
Уберём все связи, ведущие к проигрышу
Нейросеть настроена.
Нейросеть для игры Баше своими руками.
Создадим теперь модель нейронной сети с помощью спичечных коробков. Возьмём 8 спичечных коробков и на первом нарисуем одну палочку, на втором – две, и так далее до восьмой коробки, на которой нарисуем 8 палочек. В каждую коробку положим по два шарика – красный и синий. Красный будет означать, что наша нейронная сеть хочет взять одну палочку, синий – что берёт две.
Игра проходит так:
Раскладываем на столе 8 палочек. Открываем коробку, на которой нарисовано тоже 8 палочек и с закрытыми глазами вытаскиваем из неё шарик. Открываем глаза. Если шарик красный, то убираем со стола одну палочку, если синий – то две. А сам этот шарик выкладываем на крышку той коробки, откуда он взят. Теперь ход человека. Берем со стола одну или две палочки. Смотрим, сколько палочек осталось на столе, и открываем коробку, на которой нарисовано это количество палочек. Закрываем глаза…
Игра идёт до тех пор, пока кто-то не проиграет. Теперь, внимание! Если проиграл человек, то все шарики с крышек возвращаются в свои коробки, а вот если проиграла машина, то поступаем следующим образом: тот шарик, который вытаскивался из коробок последним (из-за которого наша машина проиграла) в коробку не возвращается, а выбрасывается совсем. Теперь машина уже не допустит такой ход.
Играем следующий раунд. При проигрышах количество шариков в коробках будет всё время уменьшаться. Если окажется, что коробке нет ни одного шарика, то чтобы узнать ход машины просто бросьте монетку – орел - взять одну палочку, решка - две. На этой коробке шарика не будет, зато уберётся шарик со следующей (который тоже «виноват» в проигрыше. В конце концов, в коробках останутся только шарики, ведущие к выигрышу, и машина станет всё время выигрывать. Нейронная сеть настроена
8 палочек. Алгоритм.
Реализуем этот способ настройки сети на алгоритмическом языке Бейсик, который позволяет запускать написанный алгоритм на компьютере.
Введем массив из коробочек к(8), и массив крышек кр(8)
DIM k(8),kr(8)
И зарядим каждую из коробочек шариками: красный будет единицей, синий – двойкой, а в коробочку будем класть их сумму 1+2=3. Используем оператор цикла.
FOR i=1 TO 8
k(i)=3
NEXT
Начинаем игру.
n=8
start:
FOR i=1 TO 8
PRINT “ I “;
NEXT
Это мы нарисовали на мониторе 8 палочек. Теперь генерируем ход машины: сначала с помощью генератора случайных чисел генерируем число 1 или 2 (это мы смоделировали взятие шарика из коробочки с закрытыми глазами)
h=INT(RND(1)*2+1)
Но ведь там может быть только один шарик или вообще ничего. Поэтому разберём 3 случая:
1) в коробочке уже нет шариков (k(n)=0), то есть компьютер заведомо проигрывает. Оставляем в этом случае то число, которое выбрано генератором;
2) в коробочке лежит только один шарик, тогда игнорируем генератор, и берём как раз этот шарик;
3) в коробке оба шарика, то есть число 3, тогда берём сгенерированное число и вычитаем его из числа 3, в коробочке останется разность (если выбрано число 1, то в коробке останется число 2 – то есть другой шарик),присваиваем переменной «крышка» значение выбранное генератором, а переменной «коробка» разности тройки и этого значения
IF k(n)=0 THEN h=h
IF k(n)=1 OR k(n)=2 THEN h=k(n): k(n)=k(n)-h: kr(n)=h
IF k(n)=3 THEN k(n)=k(n)-h: kr(n)=h
Теперь вычитаем количество палочек, которое компьютер берёт «h» из общего количества палочек «n»
n=n-h
и рисуем получившиеся палочки (уже так делали)
FOR i=1 TO n
PRINT “ I “;
NEXT
Если наша компьютерная сеть ещё как следует не настроена, то она может взять последнюю палочку и проиграть. То есть сейчас надо проверить, не стало ли количество палочек (n) равным нулю, в этом случае уходим на финал игры с меткой win: (выигрыш игрока).
IF n<=0 GOTO win:
Если игра продолжается, то ход человека.
INPUT”бери”;h: IF h=99 THEN END
Предусматриваем выход из программы по кодовому числу 99, а также по коду 88 предусмотрим подпрограмму karta: по которой будем смотреть в каких коробках какие шарики остались. Располагаем её также в конце программы, только теперь используем обращение с возвратом GOSUB.
IF h=88 THEN GOSUB karta:
N=n-h
IF n<=0 GOTO loose:
Отняли взятые палочки и проверили, не проиграл ли человек. Возвращаемся на старт для следующего раунда
GOTO start:
Основная программа закончена.
Теперь рассмотрим три заключительных фрагмента – подпрограмму karta: и два финала: с выигрышем и проигрышем человека.
1) человек проиграл
loose:
PRINT”you loose”
Счёт выводим на монитор к1- машина,к2-человек
k1=k1+1:PRINT k1”:”k2
Так как машина выиграла, то все шарики с крышек возвращаем в коробки. А сами крышки зануляем.
FOR i=1 TO 8
k(i)=k(i)+kr(i):kr(i)=0
NEXT
Готовим для новой игры количество палочек и уходим на старт.
N=8
GOTO start:
2) человек выиграл
win:
k2=k2+1:PRINT”you win”:PRINT k1”:”k2
Человек выиграл, значит, проиграла машина и она должна выкинуть шарик, который её подвёл. Вспоминаем, как мы работали со спичечными коробками в случае проигрыша.
FOR i=1 TO 8
Начинаем с последней коробки, где палочек всего одна, просматривать крышки. Если на крышке ничего нет, то переходим к следующей, до тех пор, пока не обнаружим первый шарик. Вот его то и нужно выкинуть. А вот следующие шарики выбрасывать нельзя, их надо возвращать в свои коробочки, поэтому введём переменную F – флаг. 0 – флаг опущен, 1 – флаг поднят. После выкидывания шарика поднимаем флаг. Теперь если флаг поднят, то все шарики нужно возвращать в свои коробки как мы делали при проигрыше человека.
IF f=1 THEN k(i)=k(i)+kr(i):kr(i)=0
А если флаг не поднят, то первый же попавший нам шарик (крышка не равна нулю) мы выкидываем (зануляем крышку), и если его коробка не пуста (а если пуста, то надо выбросить и следующий шарик) - ставим флаг.
IF f=0 AND kr(i)<>0 THEN kr(i)=0:IF k(i)<>0 THEN f=1
NEXT
Опускаем флаг, он свою роль сыграл. Восстанавливаем количество шариков для следующей игры и идём на старт.
f=0
n=8
GOTO start:
3) осталась подпрограмма «карта»: восемь строчек под номерами указывающими номер коробки (количество нарисованных на ней палочек), второй столбец показывает содержимое коробки (3-лежат оба шарика, 0-коробка пуста), третий – что лежит на крышке.
karta:
FOR i=1 to 8
PRINT i, k(i) ,kr(i)
NEXT
Поскольку мы опять должны вернуться в игру:
INPUT”бери”;h
RETURN
Программа 8 палочек
DIM k(8),kr(8)
FOR i=1 TO 8
k(i)=3
NEXT
n=8
start:
FOR i=1 TO 8
PRINT “ I “;
NEXT
h=INT(RND(1)*2+1)
IF k(n)=0 THEN h=h
IF k(n)=1 OR k(n)=2 THEN h=k(n): k(n)=k(n)-h: kr(n)=h
IF k(n)=3 THEN k(n)=k(n)-h: kr(n)=h
n=n-h
FOR i=1 TO n
PRINT “ I “;
NEXT
IF n<=0 GOTO win:
INPUT”бери”;h: IF h=99 THEN END
IF h=88 THRN GOSUB karta:
N=n-h
IF n<=0 GOTO loose:
GOTO start:
loose:
PRINT”you loose”
k1=k1+1:PRINT k1”:”k2
FOR i=1 TO 8
k(i)=k(i)+kr(i):kr(i)=0
NEXT
N=8
GOTO start:
win:
k2=k2+1:PRINT”you win”:PRINT k1”:”k2
FOR i=1 TO 8
IF f=1 THEN k(i)=k(i)+kr(i):kr(i)=0
IF f=0 AND kr(i)<>0 THEN kr(i)=0:IF k(i)<>0 THEN f=1
NEXT
f=0
n=8
GOTO start:
karta:
FOR i=1 to 8
PRINT i, k(i) ,kr(i)
NEXT
INPUT”бери”;h
RETURN
Запустив её на компьютере и поиграв с ней несколько раз, обучающиеся видят, что с каждым разом программа играет всё лучше и лучше, а потом вообще перестаёт проигрывать.
Рефлексия
- Ребята, вы убедились, что нейронная сеть позволяет решить задачи, способы решения которых нам неизвестны.
- Какие задачи вы ещё можете предложить? Как можно видоизменить нашу программу для решения других задач?
Обучающиеся предлагают собственные задачи и обсуждают способы построения нейронной сети для их решения.
Педагог обращает внимание на то, все ли обучающиеся поняли принципы построения нейросетей, корректирует формулировки высказываемых предложений.
Заключение
В связи с увеличением мощности компьютеров стало возможным моделировать мощнейшие нейронные сети, но знакомство с ними лучше начинать с простых примеров. Мы разобрали в этом материале самые простые принципы организации нейронной сети и способы её моделирования.
После ознакомления, с данной темой обучающиеся самостоятельно придумывают виды игр, для которых оптимальным подходом будет создание нейронной сети. Составляют простейшие компьютерные модели для этих задач. Мы надеемся, что эти ребята впоследствии создадут искусственный интеллект, который станет надёжным помощником человека.
Литература
1. Спрол, Антон. Думай как программист. – Москва: Эксмо, 2018. – 272 с.
2. Дейсерот. Карл. Мозг видимый насквозь.- ж. В мире науки, - 12.2016.
Скачать вложение