Zapoznaj się z naszymimateriałami na stronie

🚩 Programowanie sztucznej inteligencji: Q-learning

Potrzebne materiały:

  • Co najmniej 1 robot lub symulacja w oprogramowaniu
  • 1 komputer/robot
  • Przynajmniej niewielka arena

Konfiguracja oprogramowania:

  • przykładowa konfiguracja: edycja ręczna: „zablokowane vs ruch”

Czas trwania:

2–3 godziny

Wiek:

+ 15 lat

Zalety tej aktywności: 

  • Można to wykonać (częściowo) za pomocą symulatora.

Programowanie funkcji nagrody, jaką otrzymuje robot za wykonanie oryginalnego zadania: podążanie za linią za pomocą kamery… lub coś innego!

Programowanie sieci neuronowej

Na początku pracuj z symulowanym robotem – będzie to łatwiejsze, a na koniec będziesz mógł wrócić do prawdziwych robotów. Wyłącz robota, aby oszczędzać baterie.

W zakładce „AI” wybierz algorytm: „kod ucznia”, a następnie na zadane pytanie odpowiedz „Nowy” i wybierz nazwę pliku, w którym chcesz zapisać swój kod.

Zmodyfikujcie kod trzech funkcji: „init”, „learn” i „take_decision”, aby stworzyć własną sieć neuronową.

Zrozumienie trzech funkcji

  1. Dodajcie wydruki w każdej z trzech funkcji i zauważcie, że 
  • Funkcja `init` jest wywoływana po naciśnięciu przycisku „Zresetuj AI”
  • Funkcja learn jest wywoływana tak często, jak to możliwe (ale tylko wtedy, gdy przycisk „Uczenie się” jest włączony i w pamięci doświadczeń znajdują się dane do nauki)
  • Funkcja `take_decision` jest wywoływana za każdym razem, gdy program chce podjąć decyzję (w rzeczywistości jest wywoływana dwa razy na każdym etapie: raz w celu wyświetlenia wartości na ekranie, a raz w celu podjęcia decyzji przez robota)
  1. Zmień wartość zwracaną przez funkcję take_decision: określa ona działanie, jakie wybiera robot w trybie autonomicznym

Napisać kod pierwszej sieci „poza” oprogramowaniem

Oto kod, który tworzy sieć neuronową z 1 wejściem, 2 wyjściami (odpowiadającymi 2 kategoriom) oraz warstwą pośrednią składającą się ze 100 neuronów.

Przeprowadza go przez zestaw trzech danych (x=-2 🡪 kategoria 1), (x=0 🡪 kategoria 0), (x=2 🡪 kategoria 1) i sprawdza, czy po zakończeniu uczenia się błąd jest niewielki.

    import torch jako th

    import nn z modułu torch

    import numpy jako np

    ninput = 1

    noutput = 2

    # Przykładowy zbiór danych

    data = [[-2], [0], [2]]

    klasy = [1, 0, 1]

    data = th.Tensor(data)

    klasy = th.LongTensor(klasy)

    # Inicjowanie sieci neuronowej

    sieć = nn.Sequential(

            nn.Linear(ninput, 100),

            nn.LeakyReLU(),

            nn.Linear(100, noutput),

    )    

    print("pierwsza warstwa: wagi = ", network[0].weight)

    print("pierwsza warstwa: bias = ", network[0].bias)

    # Sprawdź dane wyjściowe sieci przed rozpoczęciem uczenia

    sensors = th.Tensor([[0], [1], [2]])

    output = sieć(czujniki)

    print(wynik)

    # Funkcja straty początkowej

    lossfn = nn.CrossEntropyLoss()

    pred = sieć(dane)

    print("strata:", lossfn(pred, classes))

    # Optymalizator inicjalizacji

    optimizer = th.optim.SGD(network.parameters(), lr=1e-1)

    # Nauka

    nrepeat = 2000

    for i in range(nrepeat):

        optimizer.zero_grad()

        pred = sieć(dane)

        loss = lossfn(pred, classes)

        print("loss:", lossfn(pred, classes))

        loss.backward() # oblicza to gradient, czyli pochodne

        optimizer.step()

    # Sprawdź dane wyjściowe sieci po zakończeniu uczenia

    pred = sieć(dane)

    print("Strata po", nrepeat, "krokach uczenia się:", lossfn(pred, classes))

    print("pierwsza warstwa: wagi = ", network[0].weight)

    print("pierwsza warstwa: bias = ", network[0].bias)

  1. Wpisz poniższy kod na końcu pliku w języku Python i przetestuj go, klikając przycisk „Zresetuj AI” (wyniki poleceń ` print` będą widoczne w konsoli).
  2. Teraz należy zrealizować trzy funkcje: init, learn i take_decision:

Na początku pliku zdefiniuj następujące zmienne, które będą dostępne w poszczególnych funkcjach

sieć = funkcja straty = optymalizator = None

W ramach każdej z tych trzech funkcji udostępnij te zmienne za pomocą następującego wiersza:

sieć globalna, lossfn, optymalizator

Przenieś sekcję „inicjalizacja sieci” do funkcji init

Przenieś część dotyczącą „uczenia się” do funkcji learn (ale usuń pętlę for: umieść tylko jeden etap uczenia się, pamiętając, że funkcja ta będzie wywoływana wiele razy)

Napisz funkcję `take_decision`, która powinna zwracać numer kategorii odpowiadający wpisowi „sensors”, czyli 0 lub 1

  1. Przetestuj swój program w oprogramowaniu, najpierw na symulowanym robocie, a potem na prawdziwym robocie!

Podsumowanie i wnioski

Mamy nadzieję, że to spotkanie pomogło wam na nowo odkryć sieci neuronowe w praktyce!!

W programowaniu lista funkcji dostępnych w programie nazywa się API, co oznacza Application Programming Interface(interfejs programowania aplikacji). Programiści korzystają z niej, aby dowiedzieć się, w jaki sposób można współpracować z programem. API modułu python alphai można znaleźć pod tym linkiem: https://drive.google.com/file/d/1C4ovPW_eH5KFz5Y9JvSrzLhtmdOpcp6-/view