Pravila ili učenje: isti zadatak na dva načina

Modul 3 · Lekcija 2 od 7 · Veštačka inteligencija

Da bismo zaista videli razliku između običnog programa i mašinskog učenja, rešićemo isti zadatak dva puta: jednom pravilom koje smislimo sami, a jednom tako da program pravilo sam nauči iz primera. Zadatak: na osnovu mase reći da li je plod jabuka ili pomorandža.

Ideja: prag

Pomorandže su uglavnom teže od jabuka. Pravilo zato može da glasi: ako je plod teži od nekog praga – pomorandža je, inače je jabuka. Pitanje je samo: koliki prag?

  • Čovek će reći „od oka“, npr. 170 g.
  • Program će probati sve pragove od 100 do 300 g i izabrati onaj sa najmanje grešaka na primerima za učenje. To je najjednostavniji oblik mašinskog učenja.

Program

# Isti zadatak na dva načina: jabuka ili pomorandža – prema masi ploda
# 1) pravilo koje smisli čovek, 2) pravilo (prag) koje program sam „nauči“ iz primera

# primeri za učenje: (masa u gramima, tačna oznaka)
ucenje = [(152, "jabuka"), (168, "jabuka"), (140, "jabuka"), (185, "jabuka"), (175, "jabuka"),
          (160, "jabuka"), (195, "jabuka"), (210, "pomorandza"), (230, "pomorandza"),
          (195, "pomorandza"), (245, "pomorandza"), (220, "pomorandza"), (205, "pomorandza")]
# primeri za proveru – program ih ne vidi dok uči
provera = [(148, "jabuka"), (172, "jabuka"), (158, "jabuka"), (238, "pomorandza"),
           (198, "pomorandza"), (215, "pomorandza"), (250, "pomorandza")]


def pogodi(masa, prag):
    """Pravilo: teže od praga je pomorandža, inače jabuka."""
    return "pomorandza" if masa > prag else "jabuka"


def broj_gresaka(primeri, prag):
    greske = 0
    for masa, tacno in primeri:
        if pogodi(masa, prag) != tacno:
            greske += 1
    return greske


# 1) pravilo „od oka“: čovek misli da je sve preko 170 g pomorandža
prag_coveka = 170
print("Pravilo čoveka (prag 170 g): grešaka na učenju =", broj_gresaka(ucenje, prag_coveka))

# 2) učenje: probamo sve pragove od 100 do 300 g i pamtimo one sa najmanje grešaka
najmanje = min(broj_gresaka(ucenje, prag) for prag in range(100, 301))
dobri = [prag for prag in range(100, 301) if broj_gresaka(ucenje, prag) == najmanje]
# od svih jednako dobrih pragova biramo onaj u sredini – najdalje od primera obe vrste
najbolji_prag = dobri[len(dobri) // 2]
print("Jednako dobri pragovi:", dobri[0], "do", dobri[-1], "g")
print("Naučen prag:", najbolji_prag, "g, grešaka na učenju =", najmanje)

# provera na novim primerima
for ime, prag in [("čovek", prag_coveka), ("naučeno", najbolji_prag)]:
    g = broj_gresaka(provera, prag)
    tacnost = (len(provera) - g) / len(provera) * 100
    print(f"Provera ({ime}): {len(provera) - g} od {len(provera)} tačno, tačnost {tacnost:.0f} %")

Ispis programa:

Pravilo čoveka (prag 170 g): grešaka na učenju = 3
Jednako dobri pragovi: 185 do 204 g
Naučen prag: 195 g, grešaka na učenju = 1
Provera (čovek): 6 od 7 tačno, tačnost 86 %
Provera (naučeno): 7 od 7 tačno, tačnost 100 %

Šta smo videli

  • Pravilo „od oka“ (170 g) greši 3 puta već na primerima za učenje.
  • Program je pronašao da su svi pragovi od 185 do 204 g jednako dobri (samo 1 greška). Izabrao je onaj u sredini (195 g) – najdalje od primera obe vrste, pa je najmanja šansa da novi plod padne „na pogrešnu stranu“.
  • Jednu grešku ne može da izbegne nijedan prag: u podacima su i jabuka i pomorandža od tačno 195 g. Samo po masi ih je nemoguće razlikovati – trebaće nam još jedna osobina (dužina) u sledećoj lekciji.
  • Na proveri (primeri koje program nije video) naučeni prag je pogodio svih 7, a pravilo čoveka 6.

Šta je ovde „učenje“?

  • Model je pravilo „teže od praga → pomorandža“, a parametar modela je prag.
  • Učenje je traženje vrednosti parametra koja daje najmanje grešaka na primerima.
  • Pravi modeli imaju hiljade ili milijarde parametara, pa ne mogu da se „probaju svi“ – zato postoje pametniji načini učenja (videćemo ih kod perceptrona). Ali ideja je ista.
Za čas (nastavnicima): trajanje 30 minuta; pribor: računari.
Učenici prvo na papiru pogađaju prag, zatim pokreću program i porede svoj prag sa naučenim. Diskusija: zašto se bira sredina?

Česte zablude

  • „Mašinsko učenje je nešto magično“ – ovde je to samo petlja koja proba pragove i broji greške.
  • „Naučeno pravilo je uvek savršeno“ – ako se primeri preklapaju (dva ploda od 195 g), nijedno pravilo ne može da bude bez greške.

Zadaci za vežbu

Pokušaj prvo sam, pa tek onda otvori rešenje.

  1. Promeni prag čoveka sa 170 na 190 g. Koliko sada grešaka ima na učenju i na proveri?
  2. Napiši program koji uči prag po dužini ploda za razlikovanje banane i jabuke.
  3. Zašto nijedan prag po masi ne može da bude bez greške za jabuke i pomorandže iz ove tabele?
Rešenje 1: prag 190 g

Zameni red prag_coveka = 170 sa prag_coveka = 190. Sada je na učenju 1 greška, a na proveri 7 od 7 tačno – jer je 190 g u opsegu dobrih pragova (185–204 g). Dobar „pogodak“ čoveka je moguć, ali program pronalazi dobar prag uvek i sam, i za podatke koje čovek ne može da „vidi“ golim okom.

Rešenje 2: prag po dužini
# Zadatak: program sam uči prag po DUŽINI ploda – banana ili jabuka
primeri = [(7.5, "jabuka"), (8.0, "jabuka"), (7.2, "jabuka"), (8.6, "jabuka"), (8.9, "jabuka"),
           (19.0, "banana"), (20.5, "banana"), (17.5, "banana"), (18.2, "banana"), (17.0, "banana")]


def broj_gresaka(prag):
    return sum(1 for d, v in primeri if ("banana" if d > prag else "jabuka") != v)


pragovi = [p / 10 for p in range(50, 250)]           # od 5,0 do 24,9 cm
najmanje = min(broj_gresaka(p) for p in pragovi)
dobri = [p for p in pragovi if broj_gresaka(p) == najmanje]
print("Grešaka:", najmanje)
print("Dobri pragovi od", dobri[0], "do", dobri[-1], "cm; biramo sredinu:", dobri[len(dobri) // 2], "cm")

Ispis programa:

Grešaka: 0
Dobri pragovi od 8.9 do 16.9 cm; biramo sredinu: 12.9 cm

Po dužini se banane i jabuke potpuno razlikuju, pa ima mnogo pragova bez ijedne greške; sredina je oko 12,9 cm.

Rešenje 3: objašnjenje

Zato što u podacima postoje jabuka i pomorandža iste mase (195 g). Prag mora da ih stavi na istu stranu, pa je jedan od njih uvek pogrešno razvrstan. Rešenje je dodati još jednu osobinu (npr. dužinu ili boju).

Proveri znanje

Otvori kviz

Kviz: pravila ili učenje

1. Šta je u ovoj lekciji „učenje“?




2. Zašto se od jednako dobrih pragova bira onaj u sredini?




3. Zašto nijedan prag po masi ne može da bude bez greške?




4. Šta je parametar modela u ovoj lekciji?