Agenci rozwiązujący problemy

Wyobraź sobie agenta cieszącego się wakacjami w Rumunii. Agent chce podziwiać widoki, poprawić swój rumuński, cieszyć się życiem nocnym, unikać kaca i tak dalej. Problem decyzyjny jest złożony. Załóżmy teraz, że agent jest obecnie w mieście Arad i ma bezzwrotny bilet na lot z Bukaresztu następnego dnia. Agent obserwuje znaki drogowe i widzi, że z Aradu wychodzą trzy drogi: jedna w kierunku Sibiu, jedna do Timisoary i jedna do Zerind. Żadne z nich nie jest celem, więc dopóki agent nie zna geografii Rumunii, nie będzie wiedział, którą drogą podążać. Jeśli agent nie ma dodatkowych informacji — to znaczy, jeśli środowisko jest nieznane — agent nie może zrobić nic lepszego niż losowe wykonanie jednej z akcji. Ta smutna sytuacja została omówiona później  . Tu założymy, że nasi agenci zawsze mają dostęp do informacji o świecie, takich jak mapa na rysunku  .

Dzięki tym informacjom agent może śledzić ten czterofazowy proces rozwiązywania problemów:

* Sformułowanie celu: Agent przyjmuje cel dotarcia do Bukaresztu. Cele organizują zachowanie, ograniczając cele, a tym samym działania, które należy wziąć pod uwagę.

* SFORMULOWANIE PROBLEMU: Agent opracowuje opis stanów i działań niezbędnych do osiągnięcia celu – abstrakcyjnego modelu odpowiedniej części świata. Dla naszego agenta dobrym modelem jest rozważenie czynności przemieszczania się z jednego miasta do sąsiedniego miasta, a zatem jedynym faktem o stanie świata, który zmieni się w wyniku działania, jest obecne miasto.

* WYSZUKIWANIE: Przed podjęciem jakichkolwiek działań w świecie rzeczywistym agent symuluje sekwencje działań w swoim modelu, szukając, aż znajdzie sekwencję działań, która osiągnie cel. Taka sekwencja nazywana jest rozwiązaniem. Agent może być zmuszony do zasymulowania wielu sekwencji, które nie osiągną celu, ale w końcu znajdzie rozwiązanie (takie jak przejście z Arad do Sybinu, Fagaras do Bukaresztu) lub stwierdzi, że żadne rozwiązanie nie jest możliwe.

* WYKONANIE: Agent może teraz wykonywać akcje w rozwiązaniu, pojedynczo. Ważną cechą jest to, że w całkowicie obserwowalnym, deterministycznym, znanym środowisku rozwiązaniem każdego problemu jest ustalona sekwencja działań: przejazd do Sybinu, potem Fagaras, potem Bukareszt. Jeśli model jest poprawny, to po znalezieniu rozwiązania agent może zignorować swoje spostrzeżenia podczas wykonywania działań – zamykając oczy, że tak powiem – ponieważ rozwiązanie gwarantuje, że doprowadzi do celu. Teoretycy sterowania nazywają to systemem otwartej pętli: ignorowanie percepcji przerywa pętlę między agentem a środowiskiem. Jeśli istnieje szansa, że ​​model jest niepoprawny lub środowisko jest niedeterministyczne, agent byłby bezpieczniejszy

stosując podejście zamkniętej pętli, które monitoruje spostrzeżenia. W środowiskach częściowo obserwowalnych lub niedeterministycznych rozwiązaniem byłaby strategia rozgałęziania, która zaleca różne przyszłe działania w zależności od tego, jakie spostrzeżenia nadejdą. Na przykład agent może planować przejazd z Arad do Sibiu, ale może potrzebować planu awaryjnego na wypadek, gdyby przypadkowo dotarł do Zerind lub natrafił na tabliczkę z napisem „Drum Închis” (droga zamknięta).

Rozwiązywanie problemów przez wyszukiwanie

Gdy właściwe działanie do podjęcia nie jest od razu oczywiste, agent może być zmuszony do zaplanowania z wyprzedzeniem: rozważenia sekwencji działań, które tworzą ścieżkę do stanu celu. Taki agent nazywa się agentem rozwiązującym problemy, a proces obliczeniowy, który podejmuje, nazywa się wyszukiwaniem. Agenci rozwiązujący problemy wykorzystują reprezentacje atomowe, czyli stany świata traktowane są jako całość, bez wewnętrznej struktury widocznej dla algorytmów rozwiązywania problemów. Agenci wykorzystujący faktoryczne lub ustrukturyzowane reprezentacje stanów są nazywane agentami planowania i zostaną omówione później. Omówimy kilka algorytmów wyszukiwania. Tu rozważymy tylko najprostsze środowiska: epizodyczne, pojedynczego agenta, w pełni obserwowalne, deterministyczne, statyczne, dyskretne i znane. Rozróżniamy algorytmy poinformowane, w których agent może oszacować odległość od celu, oraz algorytmy niedoinformowane, w których takie oszacowanie nie jest dostępne. W tym rozdziale wykorzystano koncepcje asymptotycznej złożoności (czyli notacji O(n))

Podsumowanie

Najważniejsze punkty do przypomnienia są następujące:

* Agent to coś, co postrzega i działa w środowisku. Funkcja agenta dla agenta określa działanie podejmowane przez agenta w odpowiedzi na dowolną sekwencję percept.

* Miara wydajności ocenia zachowanie agenta w środowisku. Racjonalny agent działa tak, aby zmaksymalizować oczekiwaną wartość miary wydajności, biorąc pod uwagę sekwencję percepcji, którą do tej pory widział.

* Specyfikacja środowiska zadań obejmuje miarę wydajności, środowisko zewnętrzne, siłowniki i czujniki. Projektując agenta, pierwszym krokiem zawsze musi być jak najpełniejsze określenie środowiska zadań.

* Środowiska zadań różnią się w kilku istotnych wymiarach. Mogą być w pełni lub częściowo obserwowalne, jedno- lub wieloagentowe, deterministyczne lub niedeterministyczne, epizodyczne lub sekwencyjne, statyczne lub dynamiczne, dyskretne lub ciągłe, znane lub nieznane.

* W przypadkach, gdy miara wydajności jest nieznana lub trudna do poprawnego określenia, istnieje znaczne ryzyko, że agent zoptymalizuje niewłaściwy cel. W takich przypadkach projekt agenta powinien odzwierciedlać niepewność co do prawdziwego celu.

* Program agenta implementuje funkcję agenta. Istnieje szereg podstawowych projektów programów agentowych, odzwierciedlających rodzaj informacji, które są jawne i wykorzystywane w procesie decyzyjnym. Projekty różnią się wydajnością, zwartością i elastycznością. Odpowiedni projekt programu agentowego zależy od charakteru środowiska.

* Proste środki odruchowe reagują bezpośrednio na spostrzeżenia, podczas gdy środki odruchowe oparte na modelach utrzymują stan wewnętrzny, aby śledzić aspekty świata, które nie są widoczne w obecnym spostrzeżeniu. Agenci zorientowani na cele działają, aby osiągnąć swoje cele, a agenci zorientowani na użyteczność starają się zmaksymalizować swoje własne oczekiwane „szczęście”. Wszyscy agenci mogą poprawić swoją wydajność poprzez naukę.

Jak działają komponenty programów agentów

Programy agentowe (bardzo wysokopoziomowe) opisaliśmy jako składające się z różnych komponentów, których funkcją jest odpowiadanie na pytania typu: „Jaki jest teraz świat?” „Co powinienem teraz zrobić?” „Co robią moje działania?” Następne pytanie dla studenta AI brzmi: „Jak, u licha, działają te komponenty?” Prawidłowa odpowiedź na to pytanie zajmuje około tysiąca stron, ale tutaj chcemy zwrócić uwagę czytelnika na kilka podstawowych różnic między różnymi sposobami, w jakie komponenty mogą reprezentować środowisko, w którym przebywa agent. Z grubsza mówiąc, możemy umieścić reprezentacje wzdłuż osi rosnącej złożoności i ekspresyjnej potęgi atomowej, podzielonej na czynniki i zorganizowanej. Aby zilustrować te pomysły, warto rozważyć konkretny komponent agenta, taki jak ten, który zajmuje się „Co robią moje działania”. Ten komponent opisuje zmiany, które mogą wystąpić w środowisku w wyniku podjęcia działania, a Rysunek  przedstawia schematyczne przedstawienie tego, jak te przejścia mogą być reprezentowane

W atomowej reprezentacji każdy stan świata jest niepodzielny — nie ma wewnętrznej struktury. Rozważ zadanie znalezienia trasy dojazdu z jednego końca kraju do drugiego przez pewną sekwencję miast. W celu rozwiązania tego problemu może wystarczyć sprowadzenie stanu świata do nazwy miasta, w którym się znajdujemy — pojedynczego atomu wiedzy, „czarnej skrzynki”, której jedyną dostrzegalną własnością jest identyczność z lub różni się od innej czarnej skrzynki. Standardowe algorytmy leżące u podstaw wyszukiwania i gry , ukrytych modeli Markowa i procesów decyzyjnych Markowa działają z reprezentacjami atomowymi. Reprezentacja podzielona na czynniki dzieli każdy stan na ustalony zestaw zmiennych lub atrybutów, z których każdy może mieć wartość. Rozważ opis o wyższej wierności dla tego samego problemu z prowadzeniem pojazdu, w którym musimy zajmować się czymś więcej niż tylko lokalizacją atomową w jednym lub innym mieście; być może będziemy musieli zwrócić uwagę na to, ile paliwa znajduje się w zbiorniku, nasze aktualne współrzędne GPS, czy lampka ostrzegawcza oleju działa, ile mamy pieniędzy na opłaty drogowe, jaka stacja jest w radiu i tak dalej. Chociaż dwa różne stany atomowe nie mają ze sobą nic wspólnego — są to po prostu różne czarne skrzynki — dwa różne stany na czynniki mogą mieć wspólne atrybuty (takie jak bycie w określonej lokalizacji GPS), a inne (takie jak posiadanie dużej ilości gazu lub brak gazu). ; dzięki temu znacznie łatwiej jest wypracować sposób przekształcenia jednego stanu w inny. Wiele ważnych obszarów sztucznej inteligencji opiera się na reprezentacjach faktorycznych, w tym algorytmy spełniania ograniczeń, logika zdań , planowanie, sieci bayesowskie oraz różne algorytmy uczenia maszynowego. Z wielu powodów musimy rozumieć świat jako zawierający rzeczy, które są ze sobą powiązane, a nie tylko zmienne z wartościami. Na przykład możemy zauważyć, że duża ciężarówka przed nami wjeżdża tyłem na podjazd farmy mlecznej, ale luźna krowa blokuje drogę ciężarówce. Jest mało prawdopodobne, aby reprezentacja podzielona na czynniki była wstępnie wyposażona w atrybut TruckAheadBackingIntoDairyFarmDrivewayBlockedByLooseCow o wartości true lub false. Zamiast tego potrzebowalibyśmy ustrukturyzowanej reprezentacji, w której obiekty takie jak krowy i ciężarówki oraz ich różne i zróżnicowane relacje mogą być wyraźnie opisane. Reprezentacje strukturalne leżą u podstaw relacyjnych baz danych i logiki pierwszego rzędu, modeli prawdopodobieństwa pierwszego rzędu oraz większości zrozumienia języka naturalnego. W rzeczywistości wiele z tego, co ludzie wyrażają w języku naturalnym, dotyczy przedmiotów i ich relacji. Jak wspomnieliśmy wcześniej, oś, wzdłuż której leżą reprezentacje atomowe, czynnikowe i strukturalne, jest osią rosnącej ekspresji. Z grubsza mówiąc, bardziej ekspresyjna reprezentacja może uchwycić, przynajmniej tak samo zwięźle, wszystko, co można uchwycić mniej ekspresywną, plus trochę więcej. Często bardziej ekspresyjny język jest znacznie bardziej zwięzły; na przykład reguły gry w szachy mogą być napisane na jednej lub dwóch stronach w języku strukturalnej reprezentacji, takim jak logika pierwszego rzędu, ale wymagają tysięcy stron, gdy są napisane w języku reprezentacji faktorowej, takim jak logika zdań i około 1038 stron, gdy są napisane w języku język atomowy, taki jak język automatów skończonych. Z drugiej strony, rozumowanie i uczenie się stają się bardziej złożone wraz ze wzrostem siły wyrazu reprezentacji. Aby uzyskać korzyści płynące z wyrazistych reprezentacji przy jednoczesnym uniknięciu ich wad, inteligentne systemy dla świata rzeczywistego mogą wymagać jednoczesnej pracy we wszystkich punktach wzdłuż osi.

Inna oś reprezentacji obejmuje mapowanie pojęć do lokalizacji w pamięci fizycznej, czy to w komputerze, czy w mózgu. Jeśli istnieje mapowanie jeden-do-jednego między pojęciami a miejscami w pamięci, nazywamy to reprezentacją lokalistyczną. Z drugiej strony, jeśli reprezentacja koncepcji jest rozłożona na wiele lokalizacji w pamięci, a każde miejsce w pamięci jest wykorzystywane jako część reprezentacji wielu różnych koncepcji, nazywamy to reprezentacją rozproszoną. Reprezentacje rozproszone są bardziej odporne na zakłócenia i utratę informacji. W przypadku reprezentacji lokalnej mapowanie od koncepcji do lokalizacji w pamięci jest arbitralne, a jeśli błąd transmisji zniekształci kilka bitów, możemy pomylić ciężarówkę z niepowiązanym pojęciem rozejmu. Ale w przypadku reprezentacji rozproszonej możesz pomyśleć o każdym pojęciu reprezentującym punkt w przestrzeni wielowymiarowej, a jeśli zniekształcisz kilka bitów, przeniesiesz się do pobliskiego punktu w tej przestrzeni, który będzie miał podobne znaczenie.

Agenci uczący się

Opisaliśmy programy agentowe z różnymi metodami wybierania akcji. Jak dotąd nie wyjaśniliśmy, jak powstają programy agentowe. W swoim słynnym, wczesnym artykule Turing (1950) rozważa pomysł ręcznego programowania inteligentnych maszyn. Szacuje, ile pracy może to zająć, i podsumowuje: „Pożądana wydaje się szybsza metoda”. Proponowana przez niego metoda polega na zbudowaniu uczących się maszyn, a następnie nauczaniu ich. W wielu obszarach sztucznej inteligencji jest to obecnie preferowana metoda tworzenia najnowocześniejszych systemów. Każdy rodzaj agenta (oparty na modelu, oparty na celu, oparty na użyteczności itp.) może być zbudowany jako agent uczący się (lub nie). Uczenie ma jeszcze jedną zaletę, jak zauważyliśmy wcześniej: pozwala agentowi działać w początkowo nieznanych środowiskach i stać się bardziej kompetentnymi, niż pozwalała na to sama jego początkowa wiedza. W tej sekcji pokrótce przedstawiamy główne idee uczące się agentów. Agentów uczących się można podzielić na cztery komponenty pojęciowe, jak pokazano na rysunku .

Najważniejszym rozróżnieniem jest element uczenia się, który odpowiada za wprowadzanie ulepszeń, oraz element wydajności, który odpowiada za wybór działań zewnętrznych. Elementem performatywnym jest to, co wcześniej uważaliśmy za całego agenta: przyjmuje percepcje i decyduje o działaniach. Element uczenia się wykorzystuje informację zwrotną od krytyka na temat tego, jak sprawuje się agent, i określa, w jaki sposób należy zmodyfikować element wydajności, aby działał lepiej w przyszłości.

Projekt elementu uczenia się zależy w dużej mierze od projektu elementu wydajności. Kiedy próbujesz zaprojektować agenta, który uczy się pewnych zdolności, pierwsze pytanie nie brzmi: „Jak mam go przekonać, żeby się tego nauczył?”. ale „Jakiego rodzaju elementu wydajności użyje mój agent, aby to zrobić, gdy nauczy się, jak?” Biorąc pod uwagę projekt elementu wydajności, można skonstruować mechanizmy uczenia się, aby ulepszyć każdą część agenta. Krytyk mówi elementowi uczenia się, jak dobrze agent radzi sobie w odniesieniu do ustalonego standardu wydajności. Krytyk jest konieczny, ponieważ same spostrzeżenia nie wskazują na sukces agenta. Na przykład program szachowy może otrzymać percept wskazujący, że zamatował swojego przeciwnika, ale potrzebuje standardu wykonania, aby wiedzieć, że to dobra rzecz; samo postrzeganie tego nie mówi. Ważne jest ustalenie standardu wydajności. Koncepcyjnie należy myśleć o nim jako o całkowicie poza agentem, ponieważ agent nie może go modyfikować, aby pasował do jego własnego zachowania. Ostatnim składnikiem agenta uczącego jest generator problemów. Jest odpowiedzialny za proponowanie działań, które doprowadzą do nowych i pouczających doświadczeń. Jeśli element wydajności miałby swój sposób, nadal wykonywałby działania, które są najlepsze, biorąc pod uwagę to, co wie, ale jeśli agent chce trochę zbadać i wykonać kilka, być może nieoptymalnych działań na krótką metę, może odkryć znacznie lepsze działania na dłuższą metę. Zadaniem generatora problemów jest zasugerowanie tych działań eksploracyjnych. To właśnie robią naukowcy, kiedy przeprowadzają eksperymenty. Galileusz nie uważał, by zrzucanie kamieni ze szczytu wieży w Pizie było samo w sobie wartościowe. Nie próbował rozbijać skał ani modyfikować mózgów nieszczęsnych przechodniów. Jego celem było zmodyfikowanie własnego mózgu poprzez zidentyfikowanie lepszej teorii ruchu obiektów. Element uczący się może dokonywać zmian w dowolnym z komponentów „wiedzy” przedstawionych na diagramach agentów. Najprostsze przypadki polegają na uczeniu się bezpośrednio na podstawie sekwencji percepcji. Obserwacja par kolejnych stanów otoczenia może pozwolić agentowi na poznanie „Co robią moje działania” i „Jak ewoluuje świat” w odpowiedzi na jego działania. Na przykład, jeśli zautomatyzowana taksówka wywiera określone ciśnienie hamowania podczas jazdy po mokrej drodze, wkrótce dowie się, jak duże opóźnienie zostało faktycznie osiągnięte i czy zjeżdża z drogi. Generator problemów może zidentyfikować pewne części modelu, które wymagają poprawy i zasugerować eksperymenty, takie jak wypróbowanie hamulców na różnych nawierzchniach w różnych warunkach.

Poprawienie komponentów modelu agenta opartego na modelu, tak aby lepiej odpowiadały rzeczywistości, jest prawie zawsze dobrym pomysłem, niezależnie od zewnętrznego standardu wydajności. (W niektórych przypadkach z obliczeniowego punktu widzenia lepiej jest mieć prosty, ale nieco niedokładny model, niż doskonały, ale piekielnie złożony model). Informacje ze standardu zewnętrznego są potrzebne, gdy próbujemy nauczyć się składnika odruchowego lub funkcji użyteczności . Załóżmy na przykład, że taksówkarz nie otrzymuje napiwków od pasażerów, którzy zostali mocno wstrząśnięci podczas podróży. Zewnętrzny standard wydajności musi informować agenta, że ​​utrata napiwków ma negatywny wpływ na jego ogólną wydajność; wtedy agent może być w stanie dowiedzieć się, że gwałtowne manewry nie przyczyniają się do jego własnej użyteczności. W pewnym sensie standard wydajności rozróżnia część nadchodzącej percepcji jako nagrodę (lub karę), która zapewnia bezpośrednią informację zwrotną na temat jakości zachowania agenta. W ten sposób można zrozumieć ustalone na stałe standardy wydajności, takie jak ból i głód u zwierząt. Bardziej ogólnie, ludzkie wybory mogą dostarczyć informacji o ludzkich preferencjach. Załóżmy na przykład, że taksówka nie wie, że ludzie na ogół nie lubią głośnych dźwięków, i poprzestaje na idei ciągłego trąbienia klaksonem, aby upewnić się, że piesi wiedzą, że nadjeżdża. Wynikające z tego ludzkie zachowanie — zakrywanie uszu, używanie wulgarnego języka i prawdopodobnie przecinanie przewodów do klaksonu -dostarczyłoby agentowi dowodów, dzięki którym może zaktualizować swoją funkcję użytkową. Podsumowując, agenci mają różne komponenty, które mogą być reprezentowane w programie agenta na wiele sposobów, więc wydaje się, że istnieje duża różnorodność metod uczenia się. Jest jednak jeden wspólny motyw. Uczenie się inteligentnych agentów można podsumować jako proces modyfikacji każdego komponentu agenta, aby lepiej dopasować komponenty do dostępnych informacji zwrotnych, poprawiając w ten sposób ogólną wydajność agenta.

Agenci narzędziowi

Same cele nie wystarczą do wygenerowania wysokiej jakości zachowań w większości środowisk. Na przykład wiele sekwencji działań doprowadzi taksówkę do miejsca przeznaczenia (tym samym osiągając cel), ale niektóre są szybsze, bezpieczniejsze, bardziej niezawodne lub tańsze niż inne. Cele zapewniają jedynie prymitywne, binarne rozróżnienie między stanami „szczęśliwymi” i „nieszczęśliwymi”. Bardziej ogólna miara wydajności powinna umożliwiać porównanie różnych stanów świata według tego, jak dokładnie uszczęśliwiłyby agenta. Ponieważ „szczęśliwy” nie brzmi zbyt naukowo, ekonomiści i informatycy zamiast tego używają terminu „użyteczność”. Widzieliśmy już, że miara wydajności przypisuje punktację do dowolnej sekwencji stanów środowiska, dzięki czemu może łatwo odróżnić bardziej i mniej pożądane sposoby dotarcia do miejsca docelowego taksówki. Funkcja użyteczności agenta jest zasadniczo internalizacją miary wydajności. Zakładając, że wewnętrzna funkcja użyteczności i zewnętrzna miara wydajności są zgodne, agent, który wybiera działania w celu maksymalizacji swojej użyteczności, będzie racjonalny zgodnie z zewnętrzną miarą wydajności. Podkreślmy jeszcze raz, że nie jest to jedyny sposób na bycie racjonalnym — widzieliśmy już racjonalny program agenta dla świata próżni, który nie ma pojęcia, jaka jest jego użyteczność , ale podobnie jak agenty oparte na celach, agent oparty na narzędziach ma wiele zalet pod względem elastyczności i uczenia się. Co więcej, w dwóch przypadkach cele są nieadekwatne, ale podmiot oparty na użyteczności może nadal podejmować racjonalne decyzje. Po pierwsze, gdy istnieją sprzeczne cele, z których tylko niektóre można osiągnąć (na przykład szybkość i bezpieczeństwo), funkcja użyteczności określa odpowiedni kompromis. Po drugie, gdy istnieje kilka celów, do których może dążyć agent, z których żadnego nie można osiągnąć z całą pewnością, użyteczność zapewnia sposób, w jaki prawdopodobieństwo sukcesu można porównać ze znaczeniem celów. Częściowa obserwowalność i niedeterminizm są wszechobecne w realnym świecie, a zatem podejmowanie decyzji odbywa się w warunkach niepewności. Technicznie rzecz biorąc, podmiot racjonalny oparty na użyteczności wybiera działanie, które maksymalizuje oczekiwaną użyteczność wyników działania, tj. użyteczność, którą agent oczekuje średnio, biorąc pod uwagę prawdopodobieństwa i użyteczności każdego z nich.

Później  pokazujemy, że każdy racjonalny podmiot musi zachowywać się tak, jakby posiadał funkcję użyteczności, której wartość oczekiwaną próbuje zmaksymalizować. Agent posiadający jawną funkcję użyteczności może podejmować racjonalne decyzje za pomocą algorytmu ogólnego przeznaczenia, który nie zależy od maksymalizacji określonej funkcji użyteczności. W ten sposób „globalna” definicja racjonalności – określająca jako racjonalne te funkcje agenta, które mają najwyższą wydajność – zostaje przekształcona w „lokalne” ograniczenie na racjonalne projekty agenta, które można wyrazić w prostym programie. Struktura agenta oparta na narzędziach została przedstawiona na rysunku.

W tym momencie czytelnik może się zastanawiać: „Czy to takie proste? Po prostu budujemy agentów, które maksymalizują oczekiwaną użyteczność i gotowe?” To prawda, że ​​tacy agenci byliby inteligentni, ale to nie jest proste. Agent oparty na narzędziach musi modelować i śledzić swoje środowisko, zadania, które wymagały wielu badań dotyczących percepcji, reprezentacji, rozumowania i uczenia się. Wyniki tych badań wypełniają wiele części tej książki. Wybór sposobu działania maksymalizującego użyteczność jest również trudnym zadaniem, wymagającym pomysłowych algorytmów wypełniających jeszcze kilka rozdziałów. Nawet w przypadku tych algorytmów doskonała racjonalność jest zwykle nieosiągalna w praktyce ze względu na złożoność obliczeniową, jak zauważyliśmy w Części 1 . Zauważamy również, że nie wszystkie agenty oparte na narzędziach są oparte na modelach; Zobaczymy w rozdziałach 22 i 26, że agent wolny od modeli może dowiedzieć się, jakie działanie jest najlepsze w konkretnej sytuacji, nigdy nie dowiadując się dokładnie, jak to działanie zmienia środowisko. Wreszcie, wszystko to zakłada, że ​​projektant może poprawnie określić funkcję narzędzia.

Agenci zorientowani na cele

Wiedza o aktualnym stanie środowiska nie zawsze wystarcza do podjęcia decyzji, co zrobić. Na przykład na skrzyżowaniu dróg taksówka może skręcić w lewo, skręcić w prawo lub jechać prosto. Właściwa decyzja zależy od tego, dokąd próbuje dojechać taksówka. Innymi słowy, oprócz opisu stanu bieżącego agent potrzebuje pewnego rodzaju informacji o celu, które opisują pożądane sytuacje, na przykład bycie w określonym miejscu docelowym. Program agenta może połączyć to z modelem (te same informacje, które zostały użyte w agencie odruchowym opartym na modelu), aby wybrać działania, które osiągają cel. Rysunek przedstawia strukturę agenta opartego na celu.

Czasami wybór działania na podstawie celu jest prosty — na przykład, gdy satysfakcja z celu wynika natychmiast z pojedynczego działania. Czasami będzie to trudniejsze – na przykład, gdy agent musi rozważyć długie sekwencje zwrotów akcji, aby znaleźć sposób na osiągnięcie celu. Wyszukiwanie i planowanie to podpola AI poświęcone znajdowaniu sekwencji działań, które osiągają cele agenta. Zauważ, że tego rodzaju podejmowanie decyzji różni się zasadniczo od opisanych wcześniej reguł warunku-działania, ponieważ wymaga rozważenia przyszłości: „Co się stanie, jeśli zrobię to a to?”. i „Czy to mnie uszczęśliwi?” W projektach agentów odruchów ta informacja nie jest jawnie reprezentowana, ponieważ wbudowane reguły mapują bezpośrednio z perceptów na akcje. Środek odruchowy hamuje, gdy widzi światła stopu, kropka. Nie ma pojęcia dlaczego. Agent nastawiony na cel hamuje, gdy widzi światła hamowania, ponieważ jest to jedyne działanie, które przewiduje, że osiągnie cel, jakim jest nie uderzenie w inne samochody. Chociaż agent zorientowany na cel wydaje się mniej wydajny, jest bardziej elastyczny, ponieważ wiedza, która wspiera jego decyzje, jest jawnie reprezentowana i może być modyfikowana. Na przykład zachowanie agenta opartego na celu można łatwo zmienić, aby przejść do innego miejsca docelowego, po prostu określając to miejsce docelowe jako cel. Zasady agenta odruchów dotyczące tego, kiedy skręcić, a kiedy jechać prosto, będą działać tylko w jednym miejscu; trzeba je wszystkie wymienić, aby móc udać się w nowe miejsce.

Środki odruchowe oparte na modelu

Najskuteczniejszym sposobem radzenia sobie z częściową obserwowalnością jest śledzenie przez agenta części świata, której teraz nie widzi. Oznacza to, że agent powinien utrzymywać pewien rodzaj stanu wewnętrznego, który zależy od historii percepcji, a tym samym odzwierciedla przynajmniej niektóre nieobserwowane aspekty obecnego stanu. Jeśli chodzi o problem z hamowaniem, stan wewnętrzny nie jest zbyt obszerny – tylko poprzednia klatka z kamery, pozwalająca agentowi wykryć, kiedy dwa czerwone światła na krawędzi pojazdu jednocześnie zapalają się lub gasną. W przypadku innych zadań związanych z prowadzeniem pojazdu, takich jak zmiana pasa, agent musi śledzić, gdzie znajdują się inne samochody, jeśli nie widzi ich wszystkich naraz. Aby każda jazda była możliwa, agent musi śledzić, gdzie znajdują się jego klucze.

Odruchy oparte na modelach

Najskuteczniejszym sposobem radzenia sobie z częściową obserwowalnością jest śledzenie przez agenta części świata, której teraz nie widzi. Oznacza to, że agent powinien utrzymywać pewien rodzaj stanu wewnętrznego, który zależy od historii percepcji, a tym samym odzwierciedla przynajmniej niektóre nieobserwowane aspekty obecnego stanu. Jeśli chodzi o problem z hamowaniem, stan wewnętrzny nie jest zbyt obszerny – tylko poprzednia klatka z kamery, pozwalająca agentowi wykryć, kiedy dwa czerwone światła na krawędzi pojazdu jednocześnie zapalają się lub gasną. W przypadku innych zadań związanych z prowadzeniem pojazdu, takich jak zmiana pasa, agent musi śledzić, gdzie znajdują się inne samochody, jeśli nie widzi ich wszystkich naraz. Aby każda jazda była możliwa, agent musi śledzić, gdzie znajdują się jego klucze. Po drugie, potrzebujemy informacji o tym, jak stan świata znajduje odzwierciedlenie w percepcjach sprawcy. Na przykład, gdy samochód jadący z przodu zaczyna hamować, na obrazie z kamery skierowanej do przodu pojawia się jeden lub więcej oświetlonych czerwonych obszarów, a gdy kamera się zamoczy, na obrazie pojawiają się obiekty w kształcie kropli, częściowo zasłaniające drogę. Ten rodzaj wiedzy nazywamy modelem czujnika. Razem model przejściowy i model czujnika pozwalają agentowi śledzić stan świata – w możliwym zakresie, biorąc pod uwagę ograniczenia czujników agenta. Agent korzystający z takich modeli nazywany jest agentem opartym na modelu. Rysunek przedstawia strukturę opartego na modelu czynnika odruchowego ze stanem wewnętrznym, pokazując, w jaki sposób obecny percept jest połączony ze starym stanem wewnętrznym w celu wygenerowania zaktualizowany opis obecnego stanu, oparty na modelu agenta działania świata.

Program agenta pokazano poniżej. Ciekawą częścią jest funkcja UPDATE-STATE, która odpowiada za stworzenie nowego opisu stanu wewnętrznego. Szczegóły dotyczące sposobu reprezentowania modeli i stanów różnią się znacznie w zależności od typu środowiska i konkretnej technologii użytej w projekcie agenta

Bez względu na rodzaj użytej reprezentacji, rzadko jest możliwe dokładne określenie przez agenta aktualnego stanu częściowo obserwowalnego środowiska. Zamiast tego ramka oznaczona „jaki świat jest teraz” przedstawia „najlepsze przypuszczenie” agenta (lub czasami najlepsze przypuszczenie, jeśli agent ma wiele możliwości). Na przykład zautomatyzowana taksówka może nie widzieć wokół dużej ciężarówki, która się przed nią zatrzymała i może jedynie zgadywać, co może być przyczyną zatrzymania. Zatem niepewność co do obecnego stanu może być nieunikniona, ale agent wciąż musi podjąć decyzję.

Proste środki odruchowe

Najprostszym rodzajem agenta jest prosty środek odruchowy. Agenci ci wybierają działania na podstawie bieżącego perceptu, ignorując resztę historii percepcji. Na przykład, czynnik próżniowy, którego funkcję agenta przedstawiono w tabeli na rysunku 2.3, jest prostym czynnikiem odruchowym, ponieważ jego decyzja opiera się tylko na bieżącej lokalizacji i na tym, czy ta lokalizacja zawiera brud. Program agenta dla tego agenta pokazano tu

funkcja REFLEX-VACUUM-AGENT([lokalizacja,stan]) zwraca akcję

jeśli status = Brudny, to zwróć Ssanie

w przeciwnym razie, jeśli lokalizacja = A,  następnie zwróć w prawo

w przeciwnym razie, jeśli lokalizacja = B,  następnie wróć w lewo

Zauważ, że program odkurzania jest rzeczywiście bardzo mały w porównaniu z odpowiednią tabelą. Najbardziej oczywista redukcja wynika z ignorowania historii percepcji, co zmniejsza liczbę odpowiednich sekwencji percepcji z zaledwie do 4. Kolejna niewielka redukcja wynika z faktu, że gdy bieżący kwadrat jest brudny, akcja nie zależy od lokalizacji . Chociaż napisaliśmy program agenta przy użyciu instrukcji if-then-else, jest on na tyle prosty, że można go również zaimplementować jako obwód logiczny. Proste zachowania odruchowe występują nawet w bardziej złożonych środowiskach. Wyobraź sobie, że jesteś kierowcą zautomatyzowanej taksówki. Jeśli samochód z przodu hamuje i zapalają się jego światła stopu, powinieneś to zauważyć i rozpocząć hamowanie. Innymi słowy, na wejściu wizualnym odbywa się pewne przetwarzanie, aby ustalić stan, który nazywamy „Samochód z przodu hamuje”. Następnie uruchamia to pewne nawiązane połączenie w programie agenta z akcją „zainicjuj hamowanie”. Takie połączenie nazywamy regułą warunek-działanie, napisaną, ponieważ ludzie również mają wiele takich połączeń, z których niektóre są wyuczonymi reakcjami (jak w przypadku prowadzenia pojazdu), a niektóre z nich są wrodzonymi odruchami (np. mruganie, gdy coś zbliża się do oka). Program powyższy jest specyficzny dla jednego konkretnego środowiska próżniowego. Bardziej ogólnym i elastycznym podejściem jest najpierw zbudowanie interpretera ogólnego przeznaczenia dla reguł akcji warunkowych, a następnie utworzenie zestawów reguł dla określonych środowisk zadań. Rysunek przedstawia strukturę tego ogólnego programu w formie schematycznej, pokazując, w jaki sposób reguły warunek-akcja pozwalają agentowi na nawiązanie połączenia od perceptu do akcji. Nie martw się, jeśli to wydaje się trywialne; wkrótce robi się ciekawiej.

Program agenta dla powyższego rysunku pokazano tu

Funkcja INTERPRET-INPUT generuje abstrakcyjny opis bieżącego stanu z perceptu, a funkcja RULEMATCH zwraca pierwszą regułę z zestawu reguł, która pasuje do podanego opisu stanu. Zauważ, że opis w terminach „reguły” i „dopasowanie” jest czysto koncepcyjny; jak wspomniano powyżej, rzeczywiste implementacje mogą być tak proste, jak zbiór bramek logicznych realizujących obwód logiczny. Alternatywnie można zastosować obwód „neurowy”, w którym bramki logiczne są zastąpione nieliniowymi jednostkami sztucznych sieci neuronowych. Proste środki odruchowe mają godną podziwu właściwość prostoty, ale mają ograniczoną inteligencję. Agent na rysunku będzie działał tylko wtedy, gdy właściwa decyzja może zostać podjęta na podstawie tylko bieżącej percepcji – to znaczy tylko wtedy, gdy środowisko jest w pełni obserwowalne. Nawet odrobina nieobserwowalności może spowodować poważne kłopoty. Na przykład, podana wcześniej reguła hamowania zakłada, że ​​stan samochodu z przodu hamuje można określić na podstawie aktualnego spostrzeżenia – pojedynczej klatki wideo. Działa to, jeśli samochód z przodu ma centralnie zamontowane (a tym samym jednoznacznie identyfikowalne) światło hamowania. Niestety, starsze modele mają różne konfiguracje tylnych świateł, świateł stopu i kierunkowskazów i nie zawsze można stwierdzić na podstawie jednego obrazu, czy samochód hamuje, czy po prostu ma włączone tylne światła. Prosty środek odruchowy jadący za takim samochodem albo hamowałby ciągle i niepotrzebnie, albo, co gorsza, wcale nie hamował. Podobny problem pojawia się w świecie próżni. Załóżmy, że prosty odruchowy odkurzacz pozbawiony jest czujnika położenia i ma tylko czujnik zanieczyszczenia. Taki agent ma tylko dwa możliwe spostrzeżenia: |Dirty| i |Clean| . Może zrobić |Suck|  w odpowiedzi na |Dirty| ; co powinien zrobić w odpowiedzi na |Clean| ? Poruszanie się  w  Lewo kończy się niepowodzeniem (na zawsze), jeśli zdarzy się, że rozpocznie się na polu A , a poruszenie się w Prawo nie powiedzie (na zawsze), jeśli zacznie się na polu B . Nieskończone pętle są często nieuniknione w przypadku prostych odruchów działających w częściowo obserwowalnych środowiskach. Ucieczka z nieskończonych pętli jest możliwa, jeśli agent może losować swoje działania. Na przykład, jeśli odkurzacz dostrzeże  |Clean|, może rzucić monetą, aby wybrać między Prawo i Lewo . Łatwo wykazać, że agent dotrze do drugiego placu średnio w dwóch krokach. Następnie, jeśli ten kwadrat jest brudny, agent go wyczyści i zadanie zostanie ukończone. W związku z tym randomizowany prosty czynnik odruchowy może przewyższać deterministyczny prosty czynnik odruchowy. Wspomnieliśmy, że losowe zachowanie odpowiedniego rodzaju może być racjonalne w niektórych środowiskach wieloagentowych. W środowiskach z jednym agentem randomizacja zwykle nie jest racjonalna. Jest to przydatna sztuczka, która w niektórych sytuacjach pomaga prostemu agentowi odruchowemu, ale w większości przypadków możemy zrobić znacznie lepiej z bardziej wyrafinowanymi agentami deterministycznymi.

Programy agentowe

Wszystkie programy agentów, które projektujemy, mają ten sam szkielet: pobierają prąd jako dane wejściowe z czujników i zwracają działanie do elementów wykonawczych. Zwróć uwagę na różnicę między programem agenta, który pobiera bieżący percept jako dane wejściowe, a funkcją agenta, która może zależeć od całej historii perceptu. Program agenta nie ma innego wyboru, jak tylko wziąć bieżący punkt widzenia jako dane wejściowe, ponieważ nic więcej nie jest dostępne ze środowiska; jeśli działania agenta muszą zależeć od całej sekwencji perceptów, agent będzie musiał zapamiętać percepty. Opisujemy programy agenta w prostym języku pseudokodu, który jest zdefiniowany w Dodatku B . (Repozytorium kodu online zawiera implementacje w rzeczywistych językach programowania.) Na przykład rysunek 2.7 przedstawia dość trywialny program agenta, który śledzi sekwencję percepcji, a następnie używa go do indeksowania w tabeli działań, aby zdecydować, co zrobić.

funkcja Table-Driven-Agent (percept) zwraca akcję

trwałe : percepty, sekwencja, początkowo pusta

table, tabela działań , indeksowana przez sekwencje percept, początkowo w pełni określona

dołącz percept do końca perceptów

akcje <- WYSZUKAJ(percepty, tabela)

zwrot akcja

Tabela reprezentuje jawnie funkcję agenta, którą uosabia program agenta. Aby w ten sposób zbudować racjonalnego agenta, my jako projektanci musimy skonstruować tabelę, która zawiera odpowiednią akcję dla każdej możliwej sekwencji percepcji.

Warto zastanowić się, dlaczego oparte na tabelach podejście do tworzenia agentów jest skazane na niepowodzenie. Niech P będzie zbiorem możliwych perceptów i niech T będzie czasem życia agenta (całkowitą liczbą perceptów, które otrzyma). Tabela przeglądowa będzie zawierać 

Rozważmy zautomatyzowaną taksówkę: obraz z jednej kamery (typowo osiem kamer) przychodzi z szybkością około 70 megabajtów na sekundę (30 klatek na sekundę, piksele z 24 bitami informacji o kolorze). Daje to tabelę przeglądową z ponad wpisami dla godziny jazdy. Nawet tablica przeglądowa szachów – mały, dobrze wychowany fragment realnego świata – ma (okazuje się) przynajmniej  10150 wpisy. Dla porównania, liczba atomów w obserwowalnym wszechświecie jest mniejsza niż 1080 . Zniechęcające rozmiary tych stołów oznaczają, że (a) żaden fizyczny agent w tym wszechświecie nie będzie miał miejsca na przechowywanie tabel; (b) projektant nie miałby czasu na stworzenie tabli; oraz (c) żaden agent nigdy nie mógł nauczyć się wszystkich właściwych wpisów do tabeli na podstawie swojego doświadczenia.

Mimo to TABLE-DRIVEN-AGENT robi to, co chcemy, zakładając, że tabela jest wypełniona poprawnie: implementuje żądaną funkcję agenta. Kluczowym wyzwaniem dla sztucznej inteligencji jest nauczenie się, jak pisać programy, które w miarę możliwości wytwarzają racjonalne zachowanie z niewielkiego programu, a nie z obszernej tabeli. Mamy wiele przykładów pokazujących, że można to zrobić z powodzeniem w innych dziedzinach: na przykład ogromne tabele pierwiastków kwadratowych używane przez inżynierów i uczniów przed latami 70. zostały teraz zastąpione pięciowierszowym programem do metody Newtona uruchamianym na kalkulatorach elektronicznych . Pytanie brzmi, czy sztuczna inteligencja może zrobić dla ogólnego zachowania inteligentnego to, co zrobił Newton dla pierwiastków kwadratowych? Wierzymy, że odpowiedź brzmi tak. W pozostałej części tej sekcji przedstawiamy cztery podstawowe rodzaje programów agentowych, które ucieleśniają zasady leżące u podstaw prawie wszystkich inteligentnych systemów:

* Proste środki odruchowe;

*Środki odruchowe oparte na modelu;

*Agenci zorientowani na cele; i

*Agenci narzędziowi.

Każdy rodzaj programu agentowego łączy poszczególne komponenty w określony sposób, aby generować akcje.