Pytanie:
Dlaczego Fishtesting testuje Sztokfisz przeciwko sobie, a nie innym silnikom?
Allure
2019-06-07 05:21:00 UTC
view on stackexchange narkive permalink

Jak rozumiem tak zwane testy rybne, ludzie piszą poprawki, a następnie próbują je porównać z obecną wersją Stockfisha. Jeśli nowa wersja działa lepiej, jest promowana jako wersja główna; w przeciwnym razie zostanie odrzucona.

Pytanie: po co testować z obecną wersją Stockfisha? W przeszłości działało, a obecny sztokfisz jest znacznie silniejszy niż dwuletni sztokfisz. Jednak widzimy również ograniczenia tego podejścia. Chociaż Stockfish jest teraz w stanie całkowicie zniszczyć inne tradycyjne silniki, ostatnio przegrał również superfinał TCEC S15 przeciwko Leela. Dlaczego więc nie przetestować każdej nowej wersji przeciwko Leeli?

Oczywistą odpowiedzią jest to, że zasoby Fishtesting pochodzą z procesorów, a Leela jest okropna dla procesora. Jednak to nie powinno być śmiertelne: można po prostu dać Leeli więcej czasu, np. z Sztokfiszem działającym przy 10 sekundach na grę, daj Leeli 100 na mecz lub jakiekolwiek inne szanse czasowe są konieczne, aby uzyskać stosunek Leela do stosunku w superfinale. To z pewnością spowolni testy rybne, ale jeśli doprowadzi do silnika, który może pokonać Leelę w meczu, może to być tego warte.

Sześć odpowiedzi:
Inertial Ignorance
2019-06-07 09:27:43 UTC
view on stackexchange narkive permalink

Celem testów ryb jest sprawdzenie, czy nowsza wersja Stockfisha stała się silniejsza . Definicja silniejszego polega na pokonaniu poprzedniej wersji.

Nie jestem pewien, jak pomogłoby przetestowanie każdej nowej wersji z silnikiem takim jak Leela. Twoim pomysłem może być zaakceptowanie nowej wersji Stockfisha tylko wtedy, gdy będzie ona skuteczniejsza przeciwko Leeli niż poprzednia wersja Stockfisha. Więc teraz każda wersja Stockfisha gwarantuje lepszą grę przeciwko Leeli, ale nie gwarantuje, że będzie ogólnie lepszym szachistą. Powodem jest to, że Stockfish mógł polegać na pewnych cechach gry Leeli, aby wygrywać więcej gier.

EDYCJA - pomyślałem o przykładzie, który mógłby tutaj pomóc. Załóżmy, że kilka lat temu zostałeś sklasyfikowany jako 1500, a teraz masz 1800. Jeśli rozegrałeś swój poprzedni mecz, jasne jest, że wygrasz. Ale ze względu na dyskusję jest możliwe, że twoje 1500 ja byłoby lepsze przeciwko Kasparowowi niż twoje obecne 1800 ja. Może ta 1500-osobowa osoba była mniej konserwatywna i podejmowała znacznie większe ryzyko. To udaje się pokonać Kasparowa w rzadkiej grze, podczas gdy twoje obecne 1800 ja przegrywa za każdym razem (ale gry byłyby średnio nieco bliżej).

Ostatecznie określenie „Nieco bliżej” byłoby trudne do oszacowania. Najlepiej grać samodzielnie.
Wydaje się, że to semantyka, ale co sprawia, że ​​mówisz „silniejszy”, to pokonanie poprzedniej wersji? Można również argumentować, że „silniejszy” to facet, który pokonał Kasparowa, wygrał turniej i zdobył całą chwałę, a nie ten, który wygrał pojedynek.
@Allure Myślę, że bezpośrednia współpraca jest po prostu najbardziej obiektywną miarą „siły”. Jeśli A pokonuje B, A grał lepiej niż B, ergo A jest silniejszy niż B. Ale jeśli A radzi sobie nieco gorzej z C niż B z C, czy to koniecznie oznacza, że ​​A> B? A jeśli B wypadłby lepiej przeciwko D, E, F, G ... niż A?
Ale masz rację. System Kandydatów do Mistrzostw Świata to duży turniej, ale kiedyś między graczami odbywały się indywidualne mecze. W przypadku dużego turnieju A może przegrać z B, ale mimo to wygrać turniej i zostać uznany za „najsilniejszy”. Dzieje się tak jednak dlatego, że A pokonał wielu różnych graczy, a nie tylko jednego gracza C. Może więc można by zastosować testy silnika tam, gdzie nowsza wersja obsługuje wiele różnych silników, ale szybsze i prostsze jest po prostu przetestowanie ze starszą wersją.
Fabian Fichter
2019-06-14 14:26:26 UTC
view on stackexchange narkive permalink

Po pierwsze, z innych odpowiedzi nie wynika jasno, że w zasadzie możesz użyć dowolnego przeciwnika (o stałej sile gry) do porównania siły gry dwóch wersji programu.

Istnieje jednak kilka dobrych powodów, aby przetestować wersje bezpośrednio ze sobą, niezależnie od tego, czy tworzysz silnik Stockfisha, czy inny:

  • Porównanie siły gry podmiotów grających w szachy zazwyczaj tak nie spełnia przechodniości, tj. jeśli A> B i B> C, A < C jest nadal możliwe. Tak długo, jak porównanie z dużą pulą przeciwników (w celu uśrednienia problemu przechodniości) nie jest wykonalne, bezpośrednie porównanie powinno być najbardziej wiarygodnym pomiarem, chociaż oczywiście możesz mieć ten sam problem dla trzech wersji testu pojedynczy program.
  • Wykonując bezpośrednie porównanie, zmniejszasz wymaganą liczbę gier w testowaniu, ponieważ wystarczy uruchomić tylko jeden mecz zamiast dwóch, a jednocześnie otrzymujesz mniejsze paski błędów dla różnica siły gry.
  • Testowanie przeciw przeciwnikowi o (prawie) równej sile maksymalizuje statystyczną wrażliwość wyniku pojedynczego meczu, więc ponownie oszczędzasz koszty sprzętu. Jeśli różnica w sile gry jest bardzo duża, informacja / entropia pojedynczej gry jest bardzo niska.

Ponadto w przypadku testu ryb / sztokfisza istnieje kilka konkretnych powodów, dla których bezpośrednie porównanie było najbardziej zasadniczym wyborem:

  • W czasie, gdy początkowo testowano ryby, Leela nie była dostępna.
  • Używanie komercyjnych silników, takich jak Komodo i Houdini, było / nie jest opcja z powodu problemów licencyjnych.
  • Korzystanie z innych programów może powodować zagrożenia bezpieczeństwa, a także dodatkowe zależności oprogramowania lub wymagania sprzętowe, których chcesz uniknąć w rozproszonym środowisku komputerowym.
  • Przed Leela w zasadzie nie istniał silnik open source, który byłby wystarczająco silny, aby uzyskać statystycznie istotne wyniki podczas dopasowywania do Stockfish.
Czy na pewno testowanie na trzecim silniku zwiększy liczbę wymaganych gier? Wygląda na to, że robi to tylko za pierwszym razem. Na przykład, powiedzmy, że trzeci silnik to E, a wypróbowane wersje Stockfisha to A, B i C. Gramy A i B 20 000 razy przeciwko E i otrzymujemy wynik. To, co robi lepiej, zostaje zachowane, a słabsze odrzucone. Powiedz A jest zachowane. Jeśli chodzi o testowanie wersji C, mamy już wyniki A-E, więc musimy uzyskać tylko wyniki C-E i to samo dotyczy wszystkich przyszłych wersji.
Nawet jeśli zawsze testujesz z tą samą wersją swojego silnika referencyjnego (co sprawia, że ​​jest on bardzo podatny na overfitting), statystyczna niepewność dotycząca wynikowej różnicy Elo będzie nadal większa, ponieważ łącząc wyniki z dwóch przebiegów (np. EloC - EloB ) należy również [połączyć niepewności statystyczne] (https://en.wikipedia.org/wiki/Propagation_of_uncertainty), co zwykle zwiększa niepewność o współczynnik sqrt (2). Aby to zrekompensować, musiałbyś uruchomić więcej gier.
Arlen
2019-06-12 01:23:26 UTC
view on stackexchange narkive permalink

Zasadniczo zgadzam się z @inertialignorance, ale chciałbym nieco wyjaśnić to stanowisko.

Kiedy człowiek gra człowiekiem, wynik jednej gry jest stosunkowo bez znaczenia, biorąc pod uwagę ekstremalną zmienność ludzkiej zabawy. (Jako przykładu tej zmienności użyję Kasparowa v Deep Blue - w dobry dzień ja mógłbym prawdopodobnie pokonać Kasparowa w grze, którą popełnił przeciwko DB.) Więc po prostu zignorujmy ludzkość w to i skoncentruj się na maszynie.

Maszyny grają na znacznie bardziej stałym poziomie umiejętności niż ludzie. Dlatego pojedyncza gra znaczy więcej, a seria gier wiele znaczy. Dlatego warto przetestować proponowane ulepszenie Stockfish na maszynie. Ale dlaczego Stockfish?

Po prostu dlatego, że nie ma sposobu na ilościowe określenie „radzi sobie lepiej z Leela” w żaden znaczący sposób. Mógłby działać lepiej i nadal przegrywać. Ale jaki jest standard na lepsze, w takim przypadku? Jak udowodnisz, że zagrał lepiej? Nie widzę realnego standardu.

O wiele łatwiej jest udowodnić, że Stockfish prime jest ulepszeniem w stosunku do oryginału Stockfish, po prostu grając w zestaw gier i licząc wyniki.

Edward Deming utrzymywał, że wybór właściwej miary ma pierwszorzędne znaczenie, ponieważ wiesz, że poprawiasz się tylko dzięki temu, co mierzysz. Zadaj więc pytanie: jaki jest cel tego procesu? Dlaczego proponujesz łatkę dla Stockfisha?

Czy naprawdę ostatecznym celem łatki jest pokonanie Leeli? A może raczej sprawić, by Stockfish grał lepiej w szachy? Powiedziałbym, że to drugie. Pokonanie Leeli nastąpi samoistnie, jeśli tylko Stockfish będzie nadal wystarczająco się poprawiał.

Tak, ścieżka stopniowego doskonalenia dla Stockfisha może dojść do płaskowyżu. Mimo to jedyną możliwą do zweryfikowania ścieżką z tego płaskowyżu będzie wprowadzenie zmian, które uczynią go lepszym. Jeśli podejście „uderza w ścianę”, ciągłe poszukiwanie ulepszeń wyznaczy inną ścieżkę. Jeśli proponowana ścieżka alternatywna nie może pokonać bieżącej ścieżki, dlaczego ją wybrać?

* Jak udowodnisz, że grał lepiej? * Powinno być całkiem proste, nie? Po prostu zagraj w poprzednią wersję 20 000 razy z Leelą, a także w nową 20 000 razy, a następnie porównaj wyniki.
@Allure Ale hipotetycznie, co by było, gdyby Stockfish Prime pokonał starego Stockfisha, ale stary Stockfish poradził sobie lepiej z Leelą (i jak wspomniał Arlen, jak w ogóle porównać, który Stockfish „wypadł lepiej” przeciwko Leeli). Czy nie utrzymałbyś wtedy sztokfisza na szczycie? Ten proces weryfikacji wydaje się wadliwy.
@InertialIgnorance Podobnie, co by było, gdyby Stockfish Prime wypadł lepiej przeciwko Leeli, ale nie zdołał pokonać starego Stockfisha, czy nie zatrzymałbyś wtedy Stockfish Prime? Sprowadza się to do tego, jak definiuje się „silniejszego” i nie jest dla mnie jasne, że „silniejszy” wygrywa w pojedynkę.
@Allure Przyznaję, że nadal istnieje powód do konfliktu, ale w takim przypadku bardziej jasne jest, że wolę Stockfish Prime. Kiedy chcesz porównać, które dwie rzeczy są lepsze (czy to politycy, sportowcy, itp.), Najczęściej zmuszasz ich do konkurowania ze sobą w jakiś sposób. Nie widzieć, kto poradził sobie lepiej z arbitralnie wybranym rówieśnikiem.
@InertialIgnorance nadal, gdyby Karjakin wygrał mistrzostwa świata w 2016 roku, trudno mi sobie wyobrazić, że większość ludzi uzna go za najsilniejszego gracza na świecie. Tak, pokonałby Carlsena w pojedynku jeden na jednego, ale zwycięstwa Carlsena w turniejach wskazywałyby na coś odwrotnego. Podobnie, gdy Kasparow nie był mistrzem świata, większość ludzi nadal uważała go za najsilniejszego.
Nie myśl, że to sprawiedliwe, że Leela jest „arbitralnie wybraną rówieśniczką” - w końcu jest to aktualny mistrz TCEC, a jeśli Leela kiedykolwiek zostanie zdetronizowana, przejście do następnego mistrza jako sparingpartnera byłoby (powinno?) .
@Allure Jednak celem testów ryb nie jest upewnienie się, że nowsza wersja Stockfisha jest najsilniejszym silnikiem na świecie. Próbuje tylko sprawdzić, czy jest najprawdopodobniej silniejszy niż poprzednia wersja Stockfisha.
Możliwe, że sztokfisz prime będzie grał lepiej w szachy i nadal będzie miał ten sam wynik przeciwko Leeli. Mogłoby to na przykład wykazać lepsze zrozumienie pozycji, a jednocześnie nie być wystarczająco lepsze, aby zmienić wyniki. Jednak dzięki tej poprawie pokonałby starego sztokfisza w meczu. Podobnie możliwe jest, że poprawa pojawi się w okolicznościach, które nie występują w przypadku Leela; pozycje szachowe nie są przydzielane losowo; wyrastają ze świadomych wyborów.
Allure
2019-06-14 07:06:54 UTC
view on stackexchange narkive permalink

Wygląda na to, że istnieje sprzętowy powód, dla którego nie należy wprowadzać tej zmiany.

Głównym problemem związanym z używaniem Leeli jako sparingowego przeciwnika jest to, że Leela działa najlepiej na GPU. Możliwe jest uruchomienie Leeli na procesorze, ale wydajność Leeli bardzo cierpi. OP sugeruje podanie Leeli szans czasowych na wyrównanie, ale szanse czasowe nie działają zbyt dobrze: wydajność Leeli słabnie tak bardzo, że wymagane szanse czasowe są przytłaczająco długie.

Aby zorientować się, jak słabsza jest Leela na CPU, możemy przyjrzeć się Leeli w 12. sezonie TCEC, kiedy nie miała obsługi GPU i działała na CPU. Oto przykładowa gra, w którą wtedy grała Leela. Jeśli spojrzeć na osiągane prędkości, to około 1-3 kn / s, czyli 1000-3000 pozycji na sekundę. Dla porównania, w ostatnim 15 sezonie, kiedy Leela działała na potężnych procesorach graficznych, osiągała około 50 kN / s ( przykładowa gra). Dlatego, aby móc przetestować Stockfisha przeciwko Leeli na równych warunkach, należy podać Leeli około 25-krotne szanse czasowe. Jeśli sztokfisz ma minutę, Leela potrzebuje 25 minut.

W chwili pisania tego tekstu, testy Fishtesting przy dwóch kontrolach czasowych: 10 s + 0,1 s / ruch i 60 s + 0,6 s / ruch (poprawki, które przejdą pierwszy, krótkotrwały test kontrolny, są promowane do jeden i ponownie przetestowany. Łatki, które przejdą drugą, stają się „nową” wersją). Przy prawdopodobieństwie 25x Leela potrzebuje 250s + 2,5s / ruch w pierwszej kontroli czasu i 1500s + 15s / ruch w drugiej kontroli czasu. Spowolnienie jest ogromne; w efekcie Leela grałaby przy szybkich kontrolach czasu, a nie kulą. Liczba gier, które można ukończyć w jednostkowym czasie, również spadłaby o około 25x. Testy rybne regularnie wymagają dziesiątek tysięcy gier, aby przetestować każdy patch; ukończenie każdego testu trwa 25 razy dłużej. Brzmi niedopuszczalnie wolno.

O ile wiem, Leela miała mniejszą sieć w sezonie 12, aby dodać paliwa do ognia - najnowsze sieci mogły działać jeszcze wolniej teraz na CPU.

Możliwe, że któregoś dnia, jeśli Fishtesting dostanie zasoby GPU do przetestowania z Leela, może się zmienić; jednak jeszcze nie jesteśmy na tym etapie.

Edycja : Lc0-CPU gra obecnie na TCEC. Dostaje około 5 knps. Jednak według niektórych osób na czacie, Lc0-CPU jest zmodyfikowany do gry na CPU; niezmodyfikowany, jest około 80 razy wolniejszy niż na GPU. Dlatego użycie procesora Lc0 jako przeciwnika testowego wiąże się z realnymi kosztami sprzętowymi.

Wątpię, żeby to się stało. Prawie wszyscy autorzy silników testują swój silnik głównie przeciwko sobie, a nie przeciwko innym (prawdopodobnie mocniejszym) silnikom. Warto dodatkowo przeprowadzić kontrole krzyżowe, porównując je z innymi silnikami, ale nie powinno to być główną częścią testów, ponieważ jest mniej wydajne.
@FabianFichter dlaczego testowanie z innymi silnikami jest mniej wydajne?
Jak opisałem w mojej odpowiedzi (https://chess.stackexchange.com/a/24714/15415) jest mniej wydajna, ponieważ potrzebujesz więcej gier (tj. Więcej sprzętu lub czasu), aby osiągnąć tę samą statystyczną precyzję pomiaru Elo .
Allure
2020-06-04 08:26:10 UTC
view on stackexchange narkive permalink

(Dodaję inną odpowiedź, ponieważ tak naprawdę nie jest moja)

Programista Stockfish o nazwisku Михаил Чалый napisał to w grupach dyskusyjnych Fishcooking (w zasadzie na forum dla programistów Stockfisha), kiedy ten sam pomysł został zasugerowany:

1) Na większości maszyn nie mamy sprzętu odpowiedniego dla lc0 (80 +% maszyn to maszyny noob * w / o GPU);

2) testowanie z zewnętrznym silnikiem podwoi paski błędów, co zwiększy czterokrotnie liczbę gier, w których test będzie wiarygodny;

3) będziesz musiał napisz nową logikę, ponieważ a) nie możesz używać SPRT, b) musisz znormalizować prędkość leela / sf do jakiejś wartości (tak jak robimy z TC w normalnych testach), więc będziesz potrzebować asymetrycznej kontroli czasu;

4) istnieje 0 dowodów na to, że łatki działające w trybie samodzielnej gry nie działają w porównaniu z leela. W rzeczywistości istnieją przeciwne dowody, takie jak lista 16 rdzeni fastgm, gdzie sf 11 wyprzedza sf10 o 50 elo, co jest dokładnie tym, co mierzymy, jeśli porównasz je ze sobą.

Więc tldr - trudno lub prawie niemożliwe i tak naprawdę korzyści z tego nie istnieją.

* O ile wiem, „maszyny noob” to maszyny należące do innej osoby w społeczności o nazwie „noob”, która ma dużo dostępnego sprzętu CPU, ale nie ma sprzętu GPU.

SmallChess
2019-06-07 18:48:00 UTC
view on stackexchange narkive permalink

Inercja jest poprawna. Powinienem też dodać, że przed LC0 nie było silnego silnika open source. Zarówno Komodo, jak i Houdini miały ograniczenia licencyjne.

„brak silnego silnika open source”. Chyba masz na myśli _besides_ sztokfisz?
@Brandon_J tak, o to mi chodziło


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 4.0, w ramach której jest rozpowszechniana.
Loading...