Home | Research | For Students | Publications | Talks | Codes | WebLog | Personal |
AI stale idzie do przodu, dochodzimy powoli do momentu, w którym całkowicie osłupiające i zaskakujące działanie (a może już ,,zachowanie''?) Chat-botów powodują (przynajmniej u mnie) coś w rodzaju stanu surrealitycznej nierzeczywistości. Kolejną zmianą, która skłoniła mnie do użycia klawiatury, jest pojawienie się ,,myślących'' chatbotów w rodzaju o1-preview , a kilka dni temu jego chińskiego odpowiednika DeepSeek . Działają one na zasadzie monologu wewnętrznego, a wg. OpenAI dokładność odpowiedzi jest proporcjonalna do czasu zużytego na ,,myślenie''. I na ten moment nie widać żadnego ,,obcięcia'' dla tego typu skalowania. Ma to niebagatelne znaczenie, bo nawet gdyby faktycznie okazało się, że nie da się (czy też nie potrafimy) stworzyć AI przewyższającej ludzki mózg (co w fachowym slangu określa się jako ,,AI wall''), to nadal przewyższa ona człowieka, bo ten nie jest w stanie bezustannie myśleć nad danym problemem powiedzmy 100 lat bez przerwy . I faktycznie, wymyślenie relatywnie prostego, wymagającego tzw. ,,myślenia'' zadania z matematyki czy fizyki nierozwiązywalnego dla tego rodzaju AI jest praktycznie niemożliwe. W tym sensie, że jeżeli o1 go nie rozwiąże, lub rozwiąże źle, to jest niemal pewne, że polegnie na nim także prawie każdy człowiek .
Staramy się więc funkcjonować w nowej rzeczywistości, wykonując nadal to co niektórzy już nazywają ,,nostalgic jobs'' . Obyśmy nie skończyli jak chomiki biegające na kołowrotku. Pojawiła się potrzeba przetłumaczenia z Mathematici do Pythona sporego (500 linii) kodu numerycznej OTW, zawierającego dziesiątki operacji macierzowych. Narzędzia typu Claude 3.5 Sonnet robią to w dosyć błyskotliwy sposób, w osłupiającym tempie jakiegoś mentata czy Mozarta kodowania w rodzaju Billa Gatesa czy niektórych z moich kolegów astrofizyków. Którzy, jak kiedyś oszacowałem, napisali tyle programów, że mnie zajęłoby to 1000 lat. Niestety, jak komentują złośliwi doktoranci, napisanie takiego kodu samodzielnie zajęłoby 2 tygodnie, a AI pisze go w 3 godziny, po czym będziemy usuwać błędy przez miesiąc. Na razie mam za sobą 3 dni debugowania i wersja przetłmaczona nadal nie działa... A trzeba było tłumaczyć blok po bloku, nie cały kod na raz. Gdy zabraknie tzw. ,,długości kontekstu'' (pamięci czatbota), zjawiają się halucynacje. A wtedy LLM nawija bardziej jak raper na scenie, który na dodatek zapomniał tekstu, niż genialny poeta piszący poemat.
Konieczność debugowania, polegająca w tym wypadku na porównywaniu wyniku z Mathematici i Pythona linijka po linijce (macierz po macierzy), wymaga jakiejś sensownej miary zgodności 2 numerycznych wielkości . W klasycznej numeryce stosuje się dwie takie miary:
Ponieważ macierze w użytej metodzie spektralnej są dosyć ,,puste'', sporo elementów jest równych 0, należą one do klasy ,,sparse matrix''. W tej sytuacji błąd względny nie nadaje się do porównywania ich zgodności, z powodu dzielenia przez zero. Dlatego początkowo użyłem błędu absolutnego. Wszystko szło dobrze dopóki błędy były na poziomie 0.0, czy 2.2e16 , t.j. $MachineEpsilon . Dla wielkości rzędu 1.0 lepiej być nie może. Nie w precyzji 64-bitowych float-ów IEEE754. Niestety, zaczęły się też pojawiać większe różnice. Najpierw 1e-14 przy tzw. kompaktyfikacji zmiennej radialnej za pomocą funkcji tangens. Potem w niektórych macierzach 1e-12. To nadal nie jest alarm, numeryczna ,,reguła kciuka'' mówi, że błędy na poziomie Sqrt[$MachineEpsilon]=1.5e-8=2^(-26) są niewykluczone. Potem pojawiły się różnice 1e-8, aby w wyniku końcowym osiągnąć 0.00001. Co to oznacza? Błąd w tłumaczeniu kodu, o czym świadczą pojawiające się w ewolucji nan-y, czy może numeryka w Pythonie jest inna (gorsza?) niż w Mathematice? Bez wątpienia, ta ostatnia w razie potrzeby przechodzi do obliczeń dowolnej precyzji czy symbolicznych. Jak to ustalić? Błąd 0.00001 dla wielkości o rozmiarze 1e10 jest minimalny. Ale aby to ustalić, trzeba użyć REL_ERR, elementy macierzy podzielić, ale nie da się, bo dzielenie przez zero...
Jak wybrnąć z powyższego zaułka? Ignorować elementy zerowe? Ale tu też może być błąd, np. element który miał być równy zero nie jest! Pracując wcześniej nad całkami Fermieg-Diraca zastosowałem bardziej radykalny sposób mierzenia ,,błędu'': ULP, czyli dyskretna całkowita odległość pomiędzy dwoma liczbami zmiennoprzecinkowymi. W języku C , biblioteka math.h zawiera polecenie nextafter(ref,val), które zwraca następną w sensie binarnym liczbę zmiennoprzecinkową. Powtarzając to polecenie w pętli, możemy obliczyć, ile kroków należy wykonać, aby przejść z ref do val. Liczba tych kroków jest miarą błędu. Typowo, dla funkcji elementarnych jest to powiedzmy do 16 ULP, dla operacji arytmetycznych 1 ULP, dla f. specjalnych setki czy tysiące ULP. Trwa tu bezustanny cichy postęp i ulepszanie math.h oraz procesorów, co widać na skali kilkunastu lat bardzo wyraźnie.
OK, potrzebuję więc funkcji ULP_distance(ref,val), którą mam napisaną w C, ale muszę użyć w Mathematice. Odpalam więc Wolfram GPT , ale dostaję bzdury. Podobnie złe kody pisze Claude. Postanawiam użyć C w Mathmatice, co mam przećwiczone na funkcji EllipticX. Claude od ręki pisze odpowiedni "wrapper code", porównuję go z moim, wygląda OK. Niestety nie działa, nie rozumiem czemu. W akcie desperacji piszę kod testowy w C i ...... też nie działa! Ponieważ nie wiem co dalej robić, uruchamiam ,,myślącego'' chatbota DeepSeek w trybie Deep Think (深度思考). I tu zaczyna się najbardziej surrealistyczna część tego doświadczenia...
DeepSeek też nie wie czemu kod nie działa. Nic dziwnego, bo cały czas działał dobrze, tylko wpisane przeze mnie z głowy testowe przypadki były patologicznie nonsensowne. Kolejny raz przekonuję się, że najsłabszym ogniwem jest ludzki mózg, który lubi płatać figle . Ale chatbot tego nie wie i bardzo długo gada sam ze sobą usiłująć rozwiązać nieistniejący problem. I rozwiązuje go! Pisze kod, który działa na kompletnie innej zasadzie. Stosuje union, aby skonwertować float64 na int, po czym odejmuje wyniki. Co daje ULP! Tak proste, że aż niemożliwe, aby działało. Jednak testy pokazują, że to faktycznie tak jest: dodatnie liczby IEE754 są bitowo posortowane. Ale tylko dla liczb o tym samym znaku. Chatbot się zapętla i z uporem maniaka twierdzi, że nie istnieje taka miara jak ULP dla liczb o różnych znakach. Argumentacja typu, że mogę rozbić ULP=ULP1+ULP2, gdzie ULP1,2 są odległościami do 0.0 trafia w próżnię. O ile formalnie DeepThink wydaje się ,,mocniejszy'' niż o1-preview, to często urywa dyskusję. W tym momencie przeklejam kod z DeepSeek do o1-preview i pytam, czy nie może go poprawić. Dostaję, komentarz, że kod jest bez sensu (ten napisany przez DeepSeek, nie mój - mój działa bez ograniczeń!) i pojawia sie trzeci kod, jeszcze inny. Jeszcze prostszy, nie używa union, tylko memcpy(). Na dodatek działa dla dowolnych znaków, tak jak mój, tylko nieskończenie szybciej i bez ,,ogranicznika'' na maksymalny dystans. Czy uwzględnia liczby typu 0.0 ze znakiemi inne pato-liczby, typu denormals, nan i inf? Nie chce mi się tego analizować. Gdyby kogoś interesowały, wszystkie 3 wersje są w pliku ULP.c .
Ktoś zapytałby, co w tym surrealistycznego? Otóż w dyskusji udział biorą trzy ,,osoby'', z których każda ma swój pomysł jak rozwiązać problem. Każdy na pierwszy rzut oka dobry. Przyłapana na błędach idzie w zaparte, broni swojego podejścia. Dopiero trzeci, ,,niezależny arbiter'' pozwala na wyjście z impasu. Czy to Wam coś przypomina? Tak mogłaby wyglądać codzienna dyskusja nad problemami akademickimi czy technicznymi. Ale jej nie ma. Czemu? Można sparafrazować współczesne środowisko akademickie, parafrazując greckiego filozofa (Nic nie istnieje...) , czy Lem-a (Nikt nic nie czyta, a jeśli czyta, to nic nie rozumie, a jeśli nawet rozumie, to nic nie pamięta.):
Może kiedyś taka dyskusja była na porządku codziennym. Czy wraca w postaci wirtualnych asystentów AI? Nadal to ja inicjuję temat, to ja mam pomysły co robić. Pytam tylko ,,JAK''? To mój cel jest dyskutowany. Czy dojdziemy do momentu (tzw. ,,agentyzacja AI'') w którym chatboty same będą sobie wyznaczały cele? Nawet, gdy będą to cele pośrednie do większego celu, wyznaczonego przez nas samych? Rok 2025 pokaże.... Za tydzień 2 urodziny ChatGPT, są to też moje urodziny. OpenAI podobno szykuje prezenty.