Онлайн час в Google Meet
Лого на 91. НЕГ „Проф. Константин Гълъбов“

11. клас · Избираем модул · Урок 18

Реализация на перцептрон на C#

Програма, която се учи от примери: масиви за примерите, метод за изхода на неврона, метод за една епоха и цикъл, който спира при нула грешки. Обучение върху И, ИЛИ и опит с XOR.

От таблицата към програмата

В миналия час попълнихте на ръка осем стъпки от обучението на И и спряхте. Компютърът може да продължи — и да покаже след колко епохи грешките изчезват. Днес правилото на перцептрона става програма на C#. Няма нищо ново откъм езика: масиви, цикъл for, две условия и два метода — както в Модул 1.

Програмата е първата в модула, която се учи: не ѝ казваме кои са теглата за И, а ѝ даваме четирите примера и тя ги намира.

Как е устроена програмата

Примерите — три масива

static int[] x1 = { 0, 0, 1, 1 };   // първи вход
static int[] x2 = { 0, 1, 0, 1 };   // втори вход
static int[] y  = { 0, 0, 0, 1 };   // етикет (очакван изход) — това е И

Пример номер i е x1[i], x2[i] с етикет y[i]. Масивите са static, за да са достъпни от всички методи. Смените ли масива y, сменяте задачата — програмата не знае, че учи И.

Теглата — три променливи

static int w1 = 1, w2 = 1, b = 0;   // начални тегла
static int skorost = 1;

Работим с цели числа — при входове 0 и 1 и скорост 1 всички тегла остават цели и изходът е точно този, който сметнахте на хартия.

Изходът на неврона — метод

static int Izhod(int a, int c)
{
    int z = w1 * a + w2 * c + b;
    if (z > 0) return 1;
    return 0;
}

Точно формулата от урок 16: претеглена сума и праг. Методът връща 0 или 1.

Една епоха — метод

static int Epoha()
{
    int greshki = 0;
    for (int i = 0; i < y.Length; i++)
    {
        int greshka = y[i] - Izhod(x1[i], x2[i]);
        if (greshka != 0)
        {
            w1 = w1 + skorost * greshka * x1[i];
            w2 = w2 + skorost * greshka * x2[i];
            b  = b  + skorost * greshka;
            greshki++;
        }
    }
    return greshki;
}

Цикълът минава през всички примери. За всеки смята грешката очакван − получен и ако не е нула, поправя теглата по правилото на перцептрона. Методът връща колко грешки е имало в епохата — това число решава кога да спрем.

Главният цикъл

for (int e = 1; e <= 20; e++)
{
    int greshki = Epoha();
    Console.WriteLine($"Епоха {e}: w1={w1} w2={w2} b={b} грешки={greshki}");
    if (greshki == 0) break;
}

Двете условия за спиране от урок 17 са тук: break при нула грешки и най-много 20 епохи от цикъла for.

Какво да очаквате на екрана

Първата програма започва от теглата (1, 1, 0) — същите като в таблицата от миналия час. Първите два реда на изхода трябва да съвпадат с края на епоха 1 и епоха 2 от вашата таблица:

Епохаw₁w₂bГрешки
12102
221−13
322−12
421−21
521−20

В епоха 5 няма грешки и цикълът спира. Забележете, че броят грешки не пада равномерно — в епоха 2 са повече, отколкото в епоха 1. Поправката за един пример разваля друг; чак след няколко обиколки всичко се намества.

Сходимост

Моментът, в който обучението спира да променя теглата, защото грешките са изчезнали. Броят епохи до сходимост зависи от задачата, от началните тегла и от реда на примерите.

Нов вход и обобщение

Втората програма обучава ИЛИ само върху три примера — (0,0), (0,1) и (1,0). Входът (1,1) нарочно го няма. След обучението питаме неврона за него. Това е обобщението от урок 15 на живо: отговор за вход, който не е бил сред примерите.

За ИЛИ невронът познава — научените тегла (1, 1, 0) дават 1 за (1,1). Но опитайте същото с етикети за И: трите примера са все с етикет 0, невронът не прави нито една грешка от самото начало и за новия вход отговаря 0. Грешно — и няма как да разбере. Примерите не са били достатъчно разнообразни.

Практикум: програмата се учи

Работете във Visual Studio с трите програми от раздела „Упражнения“. Първо пуснете всяка, както е дадена, и се уверете, че изходът съвпада с очаквания. После — задачите. Записвайте числата в тетрадката.

Какво трябва да запомниш

  • Програма, която се учи, има четири части: данни, модел (тегла + метод за изхода), обучение (епоха с поправки) и условие за спиране.
  • Примерите са масиви; етикетите са отделен масив — смени ли се той, сменя се задачата, не програмата.
  • Методът за епохата връща броя грешки; нула грешки означава сходимост и цикълът спира с break.
  • Броят епохи до сходимост зависи от началните тегла и от реда на примерите — не е свойство само на задачата.
  • За XOR грешките никога не стават нула — само предпазителят с максимален брой епохи спира програмата.