Files
DBAdmin/brain/raw/articles/Software 2.0.md
T
2026-05-18 06:40:19 +00:00

16 KiB

title, source, author, published, created, description, tags
title source author published created description tags
Software 2.0 https://karpathy.medium.com/software-2-0-a64152b37c35
Andrej Karpathy
2017-11-11 2026-05-14 60K
clippings

Czasem widzę, że ludzie nazywają sieci neuronowe po prostu "kolejnym narzędziem w twoim zestawie narzędzi uczenia maszynowego". Mają swoje plusy i minusy, działają tu i tam, a czasem można ich wykorzystać, by wygrać konkursy Kaggle. Niestety, ta interpretacja całkowicie pomija las dla drzew. ==Sieci neuronowe to nie tylko kolejny klasyfikator, ale stanowią początek fundamentalnej zmiany w sposobie, w jaki tworzymy oprogramowanie. To Oprogramowanie 2.0.==

"Klasyczny stos" Software 1.0 to to, co wszyscy znamy — jest napisany w językach takich jak Python, C++ itd. Składa się z jawnych instrukcji dla komputera napisanych przez programistę. Pisząc każdą linijkę kodu, programista identyfikuje konkretny punkt w przestrzeni programu o pożądanym zachowaniu.

Dla porównania, Software 2.0 jest napisane w znacznie bardziej abstrakcyjnym, nieprzyjaznym dla człowieka języku, takim jak wagi sieci neuronowej. Żaden człowiek nie bierze udziału w pisaniu tego kodu, bo jest dużo wag (typowe sieci mogą mieć ich miliony), a kodowanie bezpośrednio w wagach jest dość trudne (próbowałem).

Zamiast tego nasze podejście polega na określeniu celu dotyczącym zachowania pożądanego programu (np. "spełnienie zbioru danych par przykładów wejściowych i wyjściowych" lub "wygranie gry w Go"), napisanie szkieletu kodu (czyli architektury sieci neuronowej), który identyfikuje podzbiór przestrzeni programowej do przeszukiwania, oraz wykorzystanie dostępnych zasobów obliczeniowych do przeszukania w tej przestrzeni w poszukiwaniu działającego programu. W przypadku sieci neuronowych ograniczamy przeszukiwanie do ciągłego podzbioru przestrzeni programowej, gdzie proces wyszukiwania można uczynić (co nieco zaskakujące) efektywnym dzięki wstecznej propagacji i stochastycznemu zejściu gradientu.

Aby to wyjaśnić jednocześnie, w Software 1.0 kod źródłowy stworzony przez człowieka (np. niektóre pliki.cpp) jest kompilowany w formę binarną, która wykonuje użyteczną pracę. W Programowaniu 2.0 kod źródłowy najczęściej składa się z 1) zbioru danych definiującego pożądane zachowanie oraz 2) architektury sieci neuronowej, która daje przybliżony szkielet kodu, ale z wieloma szczegółami (wagami) do uzupełnienia. Proces trenowania sieci neuronowej kompiluje zbiór danych do systemu binarnego — ostatecznej sieci neuronowej. W większości praktycznych zastosowań architektury sieci neuronowych i systemy treningowe są coraz bardziej standaryzowane do standardu, więc większość aktywnego "rozwoju oprogramowania" polega na kuratorstwie, uprawiaaniu, masowaniu i czyszczeniu oznaczonych zbiorów danych. To zasadniczo zmienia paradygmat programowania, w którym iterujemy nasze oprogramowanie, ponieważ zespoły dzielą się na dwie części: programiści 2.0 (labelerzy danych) edytują i rozwijają zbiory danych, podczas gdy kilku programistów 1.0 utrzymuje i iteruje otaczającą infrastrukturę kodu treningowego, analitykę, wizualizacje i interfejsy etykietowania.

Okazuje się, że duża część rzeczywistych problemów ma tę cechę, że znacznie łatwiej jest zebrać dane (lub bardziej ogólnie zidentyfikować pożądane zachowanie) niż jawnie napisać program. Z powodu tego i wielu innych korzyści płynących z programów Software 2.0, o których opowiem poniżej, jesteśmy świadkami ogromnej transformacji w branży, gdzie wiele kodu 1.0 jest przenoszonych do kodu 2.0. Oprogramowanie (1.0) pożera świat, a teraz AI (Oprogramowanie 2.0) pożera oprogramowanie.

Trwająca transformacja

Przyjrzyjmy się krótko kilku konkretnym przykładom tej trwającej transformacji. W każdym z tych obszarów zaobserwowaliśmy postępy w ostatnich latach, gdy rezygnowaliśmy z prób rozwiązania złożonego problemu poprzez pisanie kodu jawnego i zamiast tego przenieśliśmy go do stosu 2.0.

Rozpoznawanie wizualne kiedyś składało się z funkcji inżynieryjnych z odrobiną uczenia maszynowego na końcu (np. SVM). Od tego czasu odkryliśmy znacznie potężniejsze cechy wizualne, zdobywając duże zbiory danych (np. ImageNet) i przeszukując architektury splotowych sieci neuronowych. Ostatnio nawet nie ufamy sobie w ręcznym kodowaniu architektur i zaczęliśmy je również przeszukiwać.

Rozpoznawanie mowy kiedyś wymagało wielu procesów wstępnych, modeli mieszanek Gaussa i ukrytych modeli Markowa, ale dziś składa się niemal wyłącznie z sieci neuronowej. Bardzo powiązany, często cytowany humorystyczny cytat przypisywany Fredowi Jelinekowi z 1985 roku brzmi: "Za każdym razem, gdy zwalniam lingwistę, wydajność naszego systemu rozpoznawania mowy rośnie".

Synteza mowy była historycznie realizowana za pomocą różnych mechanizmów zszywania, ale obecnie najnowocześniejszymi modelami są duże sieci konwersacyjne (np. WaveNet), które generują surowe sygnały dźwiękowe.

Tłumaczenie maszynowe zwykle opierało się na technikach statystycznych opartych na frazach, ale sieci neuronowe szybko stają się dominujące. Moje ulubione architektury są trenowane w wielojęzycznym środowisku, gdzie jeden model tłumaczy się z dowolnego języka źródłowego na dowolny język docelowy, oraz w słabo nadzorowanych (lub całkowicie nienadzorowanych) środowiskach.

Gry. Od dawna rozwijane są jawnie ręcznie kodowane programy do gry Go, ale AlphaGo Zero (ConvNet, który analizuje surowy stan planszy i wykonuje ruch) stał się zdecydowanie najsilniejszym graczem w tej grze. Spodziewam się, że zobaczymy bardzo podobne efekty w innych obszarach, np. w DOTA 2 czy StarCraft.

Bazy danych. Tradycyjne systemy poza sztuczną inteligencją również pojawiają się pierwsze oznaki przejścia. Na przykład " The Case for Learned Index Structures " zastępuje kluczowe komponenty systemu zarządzania danymi siecią neuronową, przewyższając zoptymalizowane pod względem pamięci podręcznej drzewa B-Trees nawet o 70% szybkości, jednocześnie oszczędzając rząd wielkości w pamięci.

Zauważysz, że wiele moich powyższych linków dotyczy pracy wykonanej w Google. ==Wynika to z faktu, że Google obecnie jest na czele przepisywania dużych fragmentów siebie w kod Software 2.0==. " Jeden model, który rządzi wszystkimi " daje wczesny szkic tego, jak to mogłoby wyglądać, gdzie statystyczna siła poszczególnych dziedzin jest połączona w jedno spójne rozumienie świata.

Korzyści płynące z Oprogramowania 2.0

Dlaczego mielibyśmy woleć przenosić złożone programy do Oprogramowania 2.0? Oczywiście, łatwa odpowiedź brzmi: lepiej sprawdzają się w praktyce. Jednak istnieje wiele innych wygodnych powodów, by preferować ten stos. Przyjrzyjmy się niektórym zaletom Software 2.0 (pomyśl: ConvNet) w porównaniu z Software 1.0 (pomyśl: baza kodu C++ na poziomie produkcyjnym). Oprogramowanie 2.0 to:

Obliczeniowo jednorodny. Typowa sieć neuronowa składa się w pierwszym rzędzie z kanapki składającej się tylko z dwóch operacji: mnożenia macierzy i progowania przy zerze (ReLU). Porównaj to z zestawem instrukcji klasycznego oprogramowania, który jest znacznie bardziej heterogeniczny i złożony. Ponieważ implementacja oprogramowania 1.0 jest dostępna tylko dla niewielkiej liczby podstawowych prymitywów obliczeniowych (np. mnożenie macierzy), znacznie łatwiej jest tworzyć różne gwarancje poprawności i wydajności.

Proste do pieczenia z silikonem. W konsekwencji, ponieważ zestaw instrukcji sieci neuronowej jest stosunkowo niewielki, znacznie łatwiej jest zaimplementować te sieci znacznie bliżej krzemu, np. za pomocą niestandardowych ASIC, układów neuromorficznych i tak dalej. Świat się zmieni, gdy niskomocowa inteligencja stanie się wszechobecna wokół nas. Na przykład małe, tanie układy mogłyby mieć prewytrenowany ConvNet, rozpoznawacz mowy i sieć syntezy mowy WaveNet, wszystko zintegrowane w małym protomózgu, który można podłączyć do urządzeń.

Stały czas trwania. Każda iteracja typowego przejścia sieci neuronowej wymaga dokładnie tyle samo FLOPS. Nie ma żadnej zmienności w zależności od różnych ścieżek wykonania, które Twój kod może przeprowadzić przez rozległą bazę kodu C++. Oczywiście można mieć dynamiczne grafy obliczeniowe, ale przepływ wykonania jest zazwyczaj nadal znacznie ograniczony. W ten sposób niemal na pewno nigdy nie znajdziemy się w niezamierzonych, nieskończonych pętlach.

Ciągłe korzystanie z pamięci. W związku z powyższym, nie ma dynamicznie przydzielonej pamięci nigdzie, więc jest też niewielka możliwość przełączenia na dysk lub wycieków pamięci, które trzeba szukać w kodzie.

Jest bardzo przenośny. Ciąg mnożeń macierzy jest znacznie łatwiejszy do wykonania na dowolnych konfiguracjach obliczeniowych niż klasyczne binarki lub skrypty.

Jest bardzo zwinny. Jeśli miałbyś kod w C++ i ktoś chciałby, żebyś zrobił go dwa razy szybszego (kosztem wydajności, jeśli trzeba), to dostosowanie systemu do nowej specyfikacji byłoby bardzo niebanalne. Jednak w Software 2.0 możemy wziąć naszą sieć, usunąć połowę kanałów, przeprogramować i tam — działa dokładnie z dwukrotną prędkością i działa trochę gorzej. ==To magia. Z drugiej strony, jeśli masz więcej danych/obliczeń, możesz od razu poprawić działanie programu, dodając więcej kanałów i przeszkoleniając program.==

==Moduły mogą się łączyć w optymalną całość====.== Nasze oprogramowanie często jest rozkładane na moduły komunikujące się za pośrednictwem funkcji publicznych, API lub punktów końcowych. Jednak jeśli dwa moduły Software 2.0, które pierwotnie były trenowane osobno, wzajemnie współdziałają, możemy łatwo cofać się przez całość. Pomyśl, jak niesamowite mogłoby być, gdyby Twoja przeglądarka mogła automatycznie przeprojektować niskopoziomowe instrukcje systemowe o 10 warstw niżej, aby osiągnąć większą efektywność ładowania stron internetowych. Albo czy biblioteka komputerowego widzenia (np. OpenCV), którą zaimportowałeś, mogłaby być automatycznie dostrojona do twoich konkretnych danych. W wersji 2.0 to jest domyślne zachowanie.

To lepsze niż ty. Wreszcie, i co najważniejsze, sieć neuronowa to lepszy kawałek kodu niż cokolwiek, co ty czy ja możemy wymyślić w dużej części wartościowych pionów, które obecnie przynajmniej obejmują wszystko, co związane z obrazami/wideo i dźwiękiem/mową.

Ograniczenia oprogramowania 2.0

Stos 2.0 ma też swoje wady. Na końcu optymalizacji zostajemy z dużymi sieciami, które działają dobrze, ale trudno powiedzieć jak. W wielu obszarach zastosowań możemy wybrać model w 90% dokładny, który rozumiemy, ==albo model w 99% dokładny, którego nie rozumiemy.==

Stos 2.0 może zawodzić w nieintuicyjny i kompromitujący sposób, a co gorsza, może "cicho zawiódć", np. poprzez ciche przyjmowanie uprzedzeń w danych treningowych, które są bardzo trudne do właściwej analizy i badania, gdy ich rozmiary w większości przypadków sięgają milionów.

Wreszcie, wciąż odkrywamy niektóre osobliwe właściwości tego stosu. ==Na przykład istnienie przykładów== ==i== ==ataków== ==adwersarialnych== ==podkreśla nieintuicyjny charakter tego stosu.==

Programowanie w stosie 2.0

Oprogramowanie 1.0 to kod, który piszemy. Software 2.0 to kod napisany przez optymalizację opartą na kryterium oceny (np. "poprawnie sklasyfikuj te dane treningowe"). Prawdopodobne jest, że każde ustawienie, w którym program nie jest oczywiste, ale można wielokrotnie oceniać jego wydajność (np. — czy poprawnie sklasyfikowałeś niektóre obrazy? czy wygrywasz w grach Go?), podlegnie tej zmianie, ponieważ optymalizacja może znaleźć znacznie lepszy kod niż ten, który napisałby człowiek.

Ma znaczenie soczewka, przez którą obserwujemy trendy. Jeśli uznamy Software 2.0 za nowy i wyłaniający się paradygmat programowania, zamiast traktować sieci neuronowe jako całkiem dobry klasyfikator w klasie technik uczenia maszynowego, ekstrapolacje stają się bardziej oczywiste i widać, że jest jeszcze wiele pracy do zrobienia.

W szczególności zbudowaliśmy ogromną ilość narzędzi wspierających ludzi w pisaniu kodu 1.0, takich jak potężne IDE z funkcjami takimi jak podświetlanie składni, debugery, profilery, go to def, integracja z gitem itd. W stosie 2.0 programowanie odbywa się poprzez gromadzenie, masowanie i czyszczenie zbiorów danych. Na przykład, gdy sieć zawodzi w trudnych lub rzadkich przypadkach, nie naprawiamy tych przewidywań przez pisanie kodu, lecz przez dodanie większej liczby oznaczonych przykładów tych przypadków. Kto opracuje pierwsze IDE Software 2.0, które pomogą we wszystkich procesach gromadzenia, wizualizacji, czyszczenia, etykietowania i pozyskiwania danych? Być może IDE generuje obrazy, które sieć podejrzewa o błędne oznakowanie na podstawie utraty na przykład, albo pomaga w oznaczaniu, zasiewając etykiety z przewidywaniami, albo sugeruje przydatne przykłady do etykietowania na podstawie niepewności prognoz sieci.

Podobnie Github jest bardzo udanym miejscem dla kodu Software 1.0. Czy jest miejsce na Software 2.0 na Githubie? W tym przypadku repozytoria to zbiory danych, a commity składają się z dodawania i edycji etykiet.

Tradycyjne menedżery pakietów oraz powiązana infrastruktura serwisowa, taka jak pip, conda, docker itp., pomagają nam łatwiej wdrażać i komponować pliki binarne. Jak skutecznie wdrażać, udostępniać, importować i pracować z plikami binarnymi Software 2.0? Jaki jest odpowiednik conda dla sieci neuronowych?

W krótkim okresie oprogramowanie 2.0 stanie się coraz bardziej powszechne w każdej dziedzinie, gdzie wielokrotna ocena jest możliwa i tania, a sam algorytm trudno jest zaprojektować wprost. Istnieje wiele ekscytujących okazji, by rozważyć cały ekosystem tworzenia oprogramowania i to, jak można go dostosować do tego nowego paradygmatu programowania. A w dłuższej perspektywie przyszłość tego paradygmatu jest jasna, ponieważ coraz bardziej oczywiste jest, że ==gdy opracujemy AGI, z pewnością zostanie ono napisane w Software 2.0.==