Kontrolni test: veštačka inteligencija

Modul 6 · Lekcija 2 od 2 · Veštačka inteligencija

Test proverava gradivo celog kursa: šta je AI i kako je nastala, kako mašina uči, kako se AI programira, kako radi na uređajima i kakva su njena etička pitanja. Ima dva dela: test znanja sa 20 pitanja i dva praktična zadatka u Pythonu.

Šta treba znati

  • razliku između običnog programa i mašinskog učenja; šta je model i šta su podaci za učenje i proveru
  • važne trenutke iz istorije AI i šta proverava Tjuringov test
  • vrste AI (uska i opšta, generativna) i kako rade četbotovi (predviđanje sledeće reči)
  • kako uče neuronske mreže i zašto podaci mogu da budu pristrasni
  • algoritam k najbližih suseda, perceptron i stablo odlučivanja
  • zašto se na ESP32 i micro:bit-u koriste mali modeli (TinyML)
  • svest, etika, lažni sadržaji, privatnost i budućnost poslova

Kako izgleda test

  • Trajanje: dva školska časa – prvi za test znanja, drugi za praktične zadatke (ili kod kuće, kao vežba).
  • Test znanja: 20 pitanja sa ponuđenim odgovorima, svako po 2 poena.
  • Praktični zadaci: 2 zadatka po 10 poena. Za pun broj poena program mora da radi i da bude pregledan, sa komentarima.
Poeni (od 60)0–2324–3233–4243–5152–60
Ocena12345

Skala je predlog za samostalnu proveru; nastavnik može da je prilagodi. Učenici koji nisu radili modul 3 mogu da rade samo test znanja (skala se tada deli na pola: 40 poena).

Kako da vežbaš: reši test i zadatke bez gledanja u lekcije, rešenja i AI alate. Tek posle toga otvori rešenja i uporedi.

Test znanja (20 pitanja)

Za svako pitanje izaberi jedan odgovor i klikni „Proveri“. Svaki tačan odgovor nosi 2 poena.

Otvori test

Test znanja: veštačka inteligencija (20 pitanja)

1. Po čemu se mašinsko učenje razlikuje od običnog programa?




2. Ko je 1950. postavio pitanje „Mogu li mašine da misle?“




3. Šta proverava Tjuringov test?




4. Šta je „AI zima“?




5. Koji primer je uska (specijalizovana) AI?




6. Šta je model u mašinskom učenju?




7. Zašto se podaci dele na deo za učenje i deo za proveru?




8. Šta se dešava ako u podacima za učenje skoro nema primera jedne grupe?




9. Šta radi jedan veštački neuron?




10. Šta se menja dok neuronska mreža uči?




11. Kako četbot pravi odgovor?




12. Zašto četbot ponekad „izmišlja“?




13. Kako algoritam k-NN odlučuje?




14. Šta perceptron NE može da nauči sa jednim neuronom?




15. Zašto se za ESP32 često bira stablo odlučivanja?




16. Šta je TinyML?




17. Šta je deepfake?




18. Šta od ovoga ne treba pisati četbotu?




19. Da li to što četbot napiše „srećan sam“ dokazuje da oseća?




20. Ko je odgovoran kada AI sistem pogreši?




Praktični zadaci

Bodovanje: program radi 6 poena, tačan odgovor na pitanje uz zadatak 2 poena, pregledan kod sa komentarima 2 poena.

  1. k najbližih suseda (bez biblioteka). Date su liste:
    ucenje = [
        ((2, 6), "nije"), ((1, 7), "nije"), ((3, 5), "nije"),
        ((2, 8), "nije"), ((4, 6), "nije"),
        ((6, 8), "jeste"), ((7, 7), "jeste"), ((5, 9), "jeste"),
        ((8, 8), "jeste"), ((6, 7), "jeste"),
    ]
    provera = [((3, 7), "nije"), ((7, 9), "jeste"),
               ((5, 6), "jeste"), ((1, 9), "nije")]
    
    Svaki primer je (sati učenja nedeljno, sati spavanja po noći) i da li je učenik položio test. Napiši funkciju predvidi(tacka, k=3) koja vraća odgovor većine od k najbližih primera, i izračunaj tačnost na listi provera. Pitanje: na kom primeru model greši i zašto?
  2. Stablo odlučivanja za učionicu. Iz 13 merenja (temperatura, vlažnost → hladno, prijatno, toplo, zagušljivo) nauči stablo odlučivanja dubine najviše 3 i ispiši njegova pravila. Zatim:
    • predvidi stanje za merenja (19,5 °C, 50 %), (22 °C, 76 %) i (26 °C, 40 %);
    • prepiši naučeno stablo kao običnu funkciju stanje(temperatura, vlaznost) sa if – else (ko je radio modul 4, može i kao C++ funkciju za ESP32).
    Pitanje: zašto je za ESP32 bolje stablo nego velika neuronska mreža?
    X = [[17.5, 50], [18.2, 45], [19.0, 60], [20.5, 48], [21.0, 52], [22.3, 47],
         [23.0, 55], [21.8, 74], [22.5, 78], [20.9, 80], [25.2, 50], [26.8, 45], [27.5, 60]]
    y = ["hladno", "hladno", "hladno", "prijatno", "prijatno", "prijatno",
         "prijatno", "zagušljivo", "zagušljivo", "zagušljivo", "toplo", "toplo", "toplo"]
    
Rešenje 1: k najbližih suseda
# Kontrolni test, zadatak 1: k-NN bez biblioteka
# Podaci: (sati učenja nedeljno, sati spavanja po noći) -> da li je učenik položio test
import math

ucenje = [
    ((2, 6), "nije"), ((1, 7), "nije"), ((3, 5), "nije"),
    ((2, 8), "nije"), ((4, 6), "nije"),
    ((6, 8), "jeste"), ((7, 7), "jeste"), ((5, 9), "jeste"),
    ((8, 8), "jeste"), ((6, 7), "jeste"),
]
provera = [((3, 7), "nije"), ((7, 9), "jeste"),
           ((5, 6), "jeste"), ((1, 9), "nije")]


def rastojanje(a, b):
    """Euklidsko rastojanje između dve tačke."""
    return math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2)


def predvidi(tacka, k=3):
    """Vrati odgovor koji ima većina od k najbližih primera."""
    najblizi = sorted(ucenje, key=lambda p: rastojanje(tacka, p[0]))[:k]
    glasovi = {}
    for _, odgovor in najblizi:
        glasovi[odgovor] = glasovi.get(odgovor, 0) + 1
    return max(glasovi, key=glasovi.get)


tacno = 0
for tacka, stvarno in provera:
    p = predvidi(tacka)
    print(tacka, "predviđeno:", p, "| stvarno:", stvarno)
    if p == stvarno:
        tacno += 1
print("Tačnost:", tacno, "od", len(provera))

Ispis programa:

(3, 7) predviđeno: nije | stvarno: nije
(7, 9) predviđeno: jeste | stvarno: jeste
(5, 6) predviđeno: nije | stvarno: jeste
(1, 9) predviđeno: nije | stvarno: nije
Tačnost: 3 od 4

Odgovor na pitanje: model greši za (5, 6). Među tri najbliža primera dva su „nije“ ((4, 6) i (3, 5)), a samo jedan „jeste“ ((6, 7)), pa većina kaže „nije“. Tačka je na granici između grupa, a primera za učenje je malo – sa više podataka ili drugačijim k rezultat bi mogao da bude drugačiji.

Rešenje 2: stablo odlučivanja
# Kontrolni test, zadatak 2: stablo odlučivanja za učionicu
from sklearn.tree import DecisionTreeClassifier, export_text

# (temperatura u °C, vlažnost u %) -> stanje učionice
X = [[17.5, 50], [18.2, 45], [19.0, 60], [20.5, 48], [21.0, 52], [22.3, 47],
     [23.0, 55], [21.8, 74], [22.5, 78], [20.9, 80], [25.2, 50], [26.8, 45], [27.5, 60]]
y = ["hladno", "hladno", "hladno", "prijatno", "prijatno", "prijatno",
     "prijatno", "zagušljivo", "zagušljivo", "zagušljivo", "toplo", "toplo", "toplo"]

model = DecisionTreeClassifier(max_depth=3, random_state=0)   # malo stablo – lako se čita
model.fit(X, y)
print(export_text(model, feature_names=["temperatura", "vlaznost"]))

for merenje in [[19.5, 50], [22.0, 76], [26.0, 40]]:
    print(merenje, "->", model.predict([merenje])[0])

Ispis programa:

|--- vlaznost <= 67.00
|   |--- temperatura <= 19.75
|   |   |--- class: hladno
|   |--- temperatura >  19.75
|   |   |--- temperatura <= 24.10
|   |   |   |--- class: prijatno
|   |   |--- temperatura >  24.10
|   |   |   |--- class: toplo
|--- vlaznost >  67.00
|   |--- class: zagušljivo

[19.5, 50] -> hladno
[22.0, 76] -> zagušljivo
[26.0, 40] -> toplo

Isto stablo, prepisano kao funkcija:

# Kontrolni test, zadatak 2b: stablo prepisano kao obična funkcija (if – else)
def stanje(temperatura, vlaznost):
    if vlaznost <= 67:
        if temperatura <= 19.75:
            return "hladno"
        elif temperatura <= 24.1:
            return "prijatno"
        else:
            return "toplo"
    else:
        return "zagušljivo"


print(stanje(19.5, 50), stanje(22.0, 76), stanje(26.0, 40))

Ispis programa:

hladno zagušljivo toplo

Varijanta za ESP32 (C++):

// Kontrolni test, zadatak 2b (varijanta za ESP32): ista pravila kao C++ funkcija
const char* stanje(float temperatura, float vlaznost) {
  if (vlaznost <= 67) {
    if (temperatura <= 19.75) return "hladno";
    else if (temperatura <= 24.1) return "prijatno";
    else return "toplo";
  }
  return "zagušljivo";
}

Provera: funkcija daje isti odgovor kao naučeni model na 3 250 merenja (temperature od 15 do 30 °C, vlažnost od 30 do 94 %).

Odgovor na pitanje: stablo ima samo nekoliko poređenja, pa staje u malu memoriju ESP32 i radi trenutno; čovek može da ga pročita i proveri. Velika neuronska mreža ima hiljade težina i traži mnogo više memorije i računanja (vidi TinyML).

Posle testa

Ako si negde izgubio poene, ponovi tu lekciju:

Čestitamo – završio si kurs! Sledeći korak je završni projekat, ako ga još nisi uradio.