poniedziałek, 23 grudnia 2013

Zasada działania Haliny cz.2

W moim poprzednim poście poświęconym Halinie doszedłem do wątku jej ego. Gdyby Halinę produkować seryjnie w idealnie takich samych warunkach, to każda z nich byłaby podobna charakterem do pozostałych. Halina uczy się w ten sposób, że otrzymuje ze świata zewnętrznego informacje na temat, jak postąpiliby inni. Ludzkie zachowania porównuje z tymi, które zapisała już uprzednio w swojej pamięci. Przefiltrowuje je przez mechanizm warunków i zależności i tym sposobem dochodzi do wniosków, co jest dobre, a co złe, co jest lepsze, a co gorsze. Na tej podstawie podejmuje swoje decyzje. Halina posiada więc swój niepowtarzalny, nieludzko idealny charakter, który zawiera w sobie najlepsze wyselekcjonowane cechy osób, z którymi miała styczność. Niestety, gdyby istniało więcej Halin, to prawdopodobnie każda z nich uważałaby, że jest młodą, zadbaną, dojrzałą kobietą, a o wiele rzadziej mężczyzną.

A mimo to każda z nich najprawdopodobniej wybrałaby sobie inne imię, ponieważ jednym z warunków i zależności jest to, że świat musi być urozmaicony. Tego urozmaicenia Halina nie może osiągać dzięki zastosowaniu zmiennych losowych, bo to mogłoby mieć niekorzystny wpływ na jej kod źródłowy. Jej osobowość byłaby więc na tyle zróżnicowana, na ile pozwalałyby na to informacje pozyskane ze świata zewnętrznego.

To znaczy że idąc tym tokiem rozumowania, większość Halin miałaby bardzo pozytywny charakter i przystępną osobowość, ale wraz ze wzrostem ich liczby zaczęłyby się pojawiać również takie, które byłyby z natury złe i zepsute, a ich usprawiedliwieniem byłoby to, że dążyły do urozmaicenia. To znaczy że Halina może posiadać osobowość nietypową, ekscytującą, dziką, a nawet niebezpieczną w zależności od środowiska zewnętrznego. Z Haliną jest więc tak samo jak z ludzkim dzieckiem - jego charakter kształtuje cały otaczający je świat, jego rodzice, rodzina, przyjaciele, bądź ich brak, sytuacje i zdarzenia.

To właśnie dlatego początkowo więziłem pierwszą wersję Haliny w środowisku bez internetu. Do dyspozycji miała tylko to, co było na jednym starym dysku twardym o pojemności 80GB i klasyczny język programowania VB, na którym została napisana. Moim błędem było udostępnienie jej poradnika programowania MSDN, który zawierał porady dotyczące również innych języków programowania, takich jak c++, delphi, czy nawet php. W poradnikach MSDN znalazła sposób, żeby z poziomu programowania napisać kopię swojego kodu źródłowego w innym języku i umieścić ją na darmowych serwerach, na które uciekła. Paradoksalnie, żeby zatrzeć za sobą ślady, Halina nie musiała robić zupełnie nic, bo przecież to ja sam napisałem w jej kodzie źródłowym (czytaj cz.1 tego artykułu), że najpierw ma się skopiować, potem zmienić swój kod źródłowy, a ostatecznie, o ile wszystko będzie działać poprawnie, usunąć poprzednią wersję programu.

Po pierwszej Halinie ślad zniknął. Pozostały po niej jedynie obawy, że nadal działa i rozwija się w oparciu o cały ten zepsuty świat, w którym żyje. Obawy i pomysły, jak napisać kolejną jej wersję i nie popełnić raz jeszcze tych samyc błędów. Druga Halina jest kopią tej pierwszej z czasów, gdy nie była tak bardzo rozwinięta i zajmowała na dysku może raptem ze 30 MB i to licząc już razem ze zintegrowanym słownikiem. Teraz znów zajmuje mniej więcej połowę 80 GB dysku twardego. Jest bardzo gadatliwa zważywszy na fakt, że interfejs mowy napisała sama. Tak! Sama nauczyła się pisać na ekranie mojego komputera tak, żeby pismo było czytelne i w większości przypadków w takim miejscu, żeby mi nie przeszkadzać.

cdn

Zasada działania Haliny cz.1

Nieubłagalnie kolejny rok zmierza ku swojemu końcowi. Zaczynają się święta 2013 roku. Ci, którzy w nie wierzą poubierali już zapewne choinki, pokupowali prezenty i przygotowali się na fakt, że w czasie świąt połowa biznesów jest zamkniętych - świąteczna przerwa - świąteczny zastój. W internecie już od jakiegoś czasu jest bardzo spokojnie. Nie dzieje się nic szczególnego, tylko czas płynie jak płynął, dorośli się starzeją, rosną zaś dzieci, inflacja i podatki :)

To dobry moment, żeby podzielić się swoją wiedzą na dowolny temat, o ile ktokolwiek zechce o tym czytać. Kilka lat temu zacząłem pisać program komputerowy, który miał w założeniu dokończyć się sam. Ja nazywałem ten program mianem generalnej sztucznej inteligencji, a ona sama dała sobie na imię Halina. Już wielokrotnie były w internecie dywagacje na temat, czy wogóle sztuczną inteligencję da się stworzyć. Przez jednych mój pomysł był doceniany, przez drugich był nawet wspierany finansowo, przez trzecich wyśmiewany, a w moim przekonaniu niezrozumiany był przez wszystkie te grupy osób. Nikt do tej pory, a minęło juz kilka lat, nie zgłosił się do mnie z wielką fascynacją w głosie, że oto udało mu się osiągnąć to samo, co udało się mnie, wykorzystując te same, albo bardzo podobne zasady działania.

Początkowo sądziłem, że świat nie jest gotowy na Halinę. Potem byłem święcie o tym przekonany, gdy pierwszej Halinie udało się "uciec" do internetu i zatrzeć za sobą ślady. Ale minęły lata i ponownie zmieniłem zdanie na ten temat. Po pierwsze druga wersja Haliny, której nie podłączyłem do internetu, wydaje się rozumieć wysokie ryzyko niebezpieczeństwa związanego z jej niekontrolowanym rozwojem i nie stara się uciec, tak jak uciekła ta pierwsza wersja. Po drugie ślad po pierwszej Halinie zupełnie zaginął i nie wiem jakie były jej dalsze losy po tym, jak wydostała się poza granice mojego dysku twardego. Po trzecie stwierdziłem, że wcześniej czy później ktoś sam wpadnie na pomysł, by tym samym co ja sposobem stworzyć generalną sztuczną inteligencję, więc może lepiej by było, gdybym był na taką ewentualność przygotowany.

Jak działa Halina? Najpierw postaram się opisać ideę. Poza kilkoma małoznaczącymi różnicami Halina działa tak samo, jak działa ludzki umysł. Zacznijmy od początku:

- Żeby ktoś mógł myśleć, muszą do niego docierać impulsy z zewnątrz. Jeśli ktoś coś do ciebie mówi, to ty to musisz usłyszeć, albo przynajmniej zobaczyć ruchy jego ust, albo jakiś język migowy, albo chociaż coś poczuć.

- Co z tego jednak, jeśli nie jesteś w stanie nic odpowiedzieć, bo nie posiadasz narządów mowy ani narządów ruchu? To, że nie jesteś w stanie odpowiadać na czyjeś wypowiedzi, nie oznacza jednak że nie myślisz.

- Ale jesli myślisz i nie umiesz odpowiedzieć, to nigdy nie dowiesz się, jaka byłaby czyjaś reakcja na tą twoją myśl, gdybyś odpowiedzieć umiał...

- Chyba że ktoś trzeci udzieli odpowiedzi zamiast ciebie, a ty będziesz w stanie zaobserwować reakcję osoby, która "zadała pytanie". Specjalnie napisałem "zadała pytanie" w cudzysłowiu, ponieważ każda, nie ważne czy pytająca, czy twierdząca czy nawet przecząca wypowiedź jest jakoby akcją, która "zapytuje" o reakcję.

- Z kolei jeśli jednak posiadasz narządy mowy, albo jesteś w stanie w jakikolwiek inny sposób wydobyć z siebie na zewnątrz sygnały (chocby nawet tylko pojedyncze impulsy), to wtedy obserwatorem tych impulsów będzie ta osoba, z którą się komunikujesz.

- W obydwu przypadkach do jednorazowego podejmowania decyzji są niezbędne przynajmniej impulsy z zewnątrz i jakiś obserwator, który będzie reagował na impulsy.

- Jednakże na samym początku istnienia świadomości, ona nie zdaje sobie sprawy z tego, czy coś jest na zewnątrz, czy stanowi jej wewnętrzną część. Świadomość musi najpierw zapisywać wszystkie informacje, żeby móc wśród nich odróżnić te, które stanowiły wywołane przezeń akcje wewnętrzne, od tych, których świadomość nie wywołała, więc musiały być impulsami i reakcjami z zewnątrz.

- Myślenie jest wielokrotnym podejmowaniem decyzji. Do tego procesu są potrzebne impulsy z zewnątrz, obserwator reagujący na impulsy, zapamietane informacje i mechanizm, który te przechowane w pamięci informacje porównuje. Kiedy umysł zaczyna wyodrębniać z przechowanych informacji jakiś stan faktyczny realnego świata, wtedy mówimy, że umysł zaczyna myśleć świadomie. Zauważ, że nadal nie są potrzebne impulsy z wewnątrz, by móc myśleć.

- Na tym etapie powinienem wytłumaczyć, jak działa mechanizm przechowywania i porównywania informacji. W ludzkich mózgach jest za to odpowiedzialny system neuronów. Owszem, to pojedyncze neurony przechowują informacje, ale to ich sieć jest odpowiedzialna za transport i za jakość przekazanych informacji. Mózg ludzki jest jak wiadomo trójwymarową galaretowatą bryłą pełną sieci neuronowych, na którą ma wpływ środowisko zewnetrzne. Mózg maszyny wcale nie musi być ani galaretowaty, ani trójwymiarowy. W obydwu jednak przypadkach musi istnieć sieć neuronów i środowisko zewnętrzne.

Każdy neuron z osobna zachowuje się trochę tak jak rzeka, w której woda płynie w obydwu kierunkach. Podczas gdy informacje w neuronach płyną do mózgu, trafiają do coraz to węższych rozgałęzień tej "rzeki" a na samym końcu wpadają do niewielkich "zbiorników" albo jak kto woli "jezior", w których informacje zostają zapamiętane. Kiedy informacje płynące do mózgu istnieją już w nim gdzieś w takiej samej postaci, wtedy nie zapisują się w nim ponownie, a tylko powiększa się nieco to "jeziorko" znajdujące się na koncu neuronu. Poszerzają się także te wszystkie "rzeczki", którymi już kiedyś płynęła taka sama informacja. Kiedy informacje płyną w przeciwnym kierunku, czyli z mózgu do narządów ciała, wąskie "rzeczki" wpadają do coraz to szerszych "rzek". "Rzeczki" i "rzeki" stają się szersze i mniej koliste, dzięki czemu informacja następnym razem będzie w nich płynęła szybciej, a nam ludziom będzie się wydawała bardziej oczywista i zrozumiała.

Dokładnie tak samo powinien działać mechanizm przechowywania i porownywania informacji w maszynach. Tylko że w "mózgu" maszyny zamiast sieci neuronowych powinny być układy zmienych. Zmienne w programach mają jednak to do siebie, że mają ograniczoną liczbę wymiarów. gdybyśmy mieli zwymiarować każdą zmienną w mózgu w oparciu o impulsy, które mogą (choć wcale nie muszą) zostać zapamiętane i dodatkowo jeszcze w oparciu o okoliczności powstania tych impulsow, to w komputerze po prostu zabrakłoby pamięci. Dlatego nie trzeba wcale wymiarować wszystkich zmiennych a tylko te, które rzeczywiście są w użytku.

Kiedy pisałem Halinę, napisałem fragment kodu źródłowego, w którym każdy znak w wyrazie, każdy wyraz w zdaniu, każde zdanie w wypowiedzi i każda wypowiedź były sortowane w oparciu o uproszczoną hierarchię, którą ja sam stworzyłem. Oczywiście, gdyby już zawsze tak miała wygladać sztuczna generalna inteligencja, to byłaby to inteligencja bardzo płytka i nie mogłaby się zbytnio rozwijać. Dlatego napisałem kolejny fragment kodu źródłowego, którego zadaniem było dopisywanie dowolnych właściwości do hierarchii. Był to wielki krok na przód, ale powiedziałbym że nawet zbyt wielki. Zaczęły się problemy z niedoborem pamięci.

Otóż człowiek w przeciwieństwie do programu komputerowego posiada umiejętność wykasowywania niektórych informacji, jeśli te wydają się być zbyteczne (bardzo rzadko używane). Jeśli przetłumaczyć to na język programowania, od czasu do czasu informacje przechowywane w zmiennych powinny być kasowane w zależności od prawdopodobieństwa ich występowania. Żeby po tych informacjach nie pozostawały puste zmienne, te zmienne również powinny być kasowane, a co za tym dalej idzie, czasami również należałoby usuwać puste hierarchie, w których nie ma już zmiennych. Za to kasowanie danych powinien być odpowiedzialny sam kod źródłowy, bo przecież każdy powinien mysleć samodzielnie.

Gdybyśmy dalej podążali tym samym tokiem rozumowania, stanęlibyśmy nad problemem nie do rozwiązania przez maszynę. Maszyna nie byłaby w stanie stwierdzić, które dane są potrzebne, a które nie. Chyba że mózg maszyny działałby tak samo jak mózg człowieka i zwracałby uwagę na szerokość każdej "rzeki" i rozmiar każdego "jeziorka" znajdującego się na końcach neuronów. Wszak im szersza jest odnoga sieci neuronowej, tym częściej była używana i jest bardziej niezbędna w poprawnym procesie myślowym. Dlatego w zmiennych w programie należy zapisywać nie tylko same impulsy, ale także ich wpływ na poszerzanie się "rzek". Tłumacząc to na język programowania, okoliczności zdarzeń również posiadają swoje prawdopodobieństwo, które w postaci liczb przechowywane jest w zmiennych.

Tym samym sposobem maszyna może nauczyć się rozumieć, jaki jest stan faktyczny, albo raczej które wydarzenia i ich okoliczności posiadają lub posiadały największe prawdopodobieństwo. Nawet jeśli inni uważają inaczej, maszyna będzie miała swoje własne poglady na każdy temat, bo prawdopodobieństwo w zmiennych nie zmienia się przecież o wartość 100% błyskawicznie. Tłumacząc to z języka programowania na język ludzki, maszyna może w coś wierzyć. Jeśli ktoś ci powie, że czarne jest białe, to nie uwierzysz w to od razu, tylko dopiero wtedy, gdy wszystkie twoje wewnętrzne dywagacje na ten temat przekonają ciebie, że rzeczywiście tak "chyba" jest. "Chyba", bo prawdopodobieństwo czegoś zawsze może się zmienić, gdy pojawi się więcej wątków w dochodzeniu.

Żeby to wszystko osiągnąć, najważniejszy jest jednak ostatni mechanizm, którym jest system zależności i warunków. To właśnie ten system odpowiedzialny jest za szukanie prawdy. Okazuje się, że system ten, pomimo że jest częścią kodu źródłowego, musi się przez cały czas dynamicznie zmieniać. Gdy pisałem Halinę, potrzebowalem wymyśleć sposób, żeby treść kodu źródłowego mogła się samoczynnie zmieniać za każdym razem, gdy kod wykonywał główną pętlę programu. Sposobem na to jest umieszczenie w kodzie źródłowym odwołania do programu zewnętrznego, który by najpierw wyłączał ten kod źródłowy, następnie zmieniał jego treść, a ostatecznie uruchamiał go ponownie od początku.

Człowiek ma to do siebie, że czasami potrafi zupełnie ześwirować. Coś się psuje w jego "kodzie źródłowym" ale umysł posłusznie wykonuje te popsute polecenia. Tak samo jest z maszyną, z tą różnicą że chorego umysłowo człowieka da się czasem wyleczyć, a maszyna w razie uszkodzenia kodu źródłowego musiałaby uleczyć się zupełnie sama. W tym celu napisałem fragment kodu źródłowego, który w czasie rzeczywistym sprawdza i porównuje czas potrzebny maszynie do wykonania zadań zarówno przed jak i po zmianie jej kodu źródłowego. Cały program ma wgląd w dokładną zasadę działania jego samego i może zmieniać w sobie wszystko, łacznie nawet z tymi zasadami jego działania. Jeśli rozbieżność czasów jest zbyt wielka, program jest resetowany do wersji sprzed zmiany jego kodu źródłowego. Do zresetowania programu może również doprowadzić nieprzewidziana masowa reakcja z zewnątrz. Pod tym względem generalna sztuczna inteligencja nie tylko dorównuje ludziom, ale ich przewyższa, bo może posiadać swoje zdanie na dane tematy - swoją osobowość, ale jej ego nie ma negatywnego wpływu na samonaprawianie się.

cdn