Znaczenie ostrzeżenia o konwergencji w blasku

16

Korzystam z glmerfunkcji z lme4pakietu w R i używam bobyqaoptymalizatora (tj. Domyślnego w moim przypadku). Dostaję ostrzeżenie i jestem ciekaw, co to znaczy.

Warning message:
In optwrap(optimizer, devfun, start, rho$lower, control = control,  :
  convergence code 3 from bobyqa: bobyqa -- a trust region step failed to reduce q

Szukałem „krok regionu zaufania nie zmniejszył q”. Znalazłem pewne informacje w pakiecie minqa , który powiedział „Skonsultuj się z Powellem w celu uzyskania wyjaśnień”. Zrobiłem (możesz też, jeśli chcesz! Zobacz odnośniki i linki do nich poniżej), ale nie rozumiem. W rzeczywistości nie udało mi się znaleźć niczego na temat zmniejszenia q.

MJD Powell (2007) „Opracowanie NEWUOA na rzecz nieograniczonej minimalizacji bez pochodnych”, Cambridge University, Department of Applied Mathematics and Theoretical Physics, Numerical Analysis Group, Raport NA2007 / 05, http://www.damtp.cam.ac.uk/ użytkownik / na / NA_papers / NA2007_05.pdf .

MJD Powell (2009), „Algorytm BOBYQA dla ograniczonej optymalizacji bez pochodnych”, raport nr DAMTP 2009 / NA06, Centre for Mathematical Sciences, University of Cambridge, UK. http://www.damtp.cam.ac.uk/user/na/NA_papers/NA2009_06.pdf .

Ps Wiem, że mogę zmienić optymalizator i zobaczę, czy mogę uzyskać dane wyjściowe bez ostrzeżeń i błędów. Sprawdzę również gradient i Hesję, jeśli mogę, zgodnie z komentarzem / odpowiedzią Bena Bolkera . Używam od glmerwewnątrz i nie jestem pewien, czy odpowiedź Bena zadziała bez dodatkowego majsterkowania, ale popracuję nad tym, gdy mój komputer skończy to, co robi, zresztą dygresuję.dredgeMuMIn

Aktualizacja

Zgodnie z komentarzem dr Bolkera poniżej zacząłem przeglądać kod FORTRAN ( tutaj jest kod dla wszystkich zainteresowanych przeglądaniem, ale nie pobieraniem go ). „430” pojawia się w części kodu bobyqb.f. Po prostu wyszukaj „430” lub „zmniejsz Q”, aby znaleźć odpowiedni kod.

To jest moje pierwsze spotkanie z kodem FORTRAN, ale myślę, że kod mówi, że jeśli spełnione są następujące warunki, wygeneruj ostrzeżenie: NTRITS> 0, VQUAD> = 0, IPRINT> 0. „Liczba całkowita NTRITS jest ustawiona na liczbę„ region zaufania ” iteracje, które miały miejsce od ostatniej „alternatywnej” iteracji. VQUADpojawia się kilka razy i nie jestem jeszcze pewien jego znaczenia, ponieważ jego wartość wydaje się zależeć od wielu innych zmiennych, których wartości czasami zależą od innych zmiennych. Od bobyqa.f: „Wartość IPRINT powinna wynosić ustawioną na 0, 1, 2 lub 3, która kontroluje ilość wydruków. W szczególności nie ma danych wyjściowych, jeśli IPRINT = 0, a wyniki są zwracane tylko wtedy, gdy IPRINT = 1. ”.

Wygląda więc na to, że zadaniem jest ustalenie znaczenia VQUADbycia> = 0 i być może zrozumienie, jak / kiedy IPRINTstało się> 0. Będę musiał wrócić do gazety, aby się przyjrzeć, ale matematyki lub przynajmniej jego symboliczny wyraz, jest dla mnie trochę barierą. Chyba, że ​​ktoś wie o algorytmie lub chce się o nim dowiedzieć, myślę, że będę musiał iteracyjnie zwiększyć moje zrozumienie ostrzeżenia, przechodząc w obie strony między dokumentami, kodem i Internetem, dopóki nie zrozumiem, co to jest znaczy.

Jota
źródło
3
Myślę, że to pytanie może dotyczyć CV, ale wydaje się, że chodzi o zrozumienie pomysłów, a nie o pomoc w / R per se.
gung - Przywróć Monikę
Nie jestem pewien, czy mam w tej sprawie wiele do zaoferowania, poza szczegółowym przeglądaniem dokumentów i kodu FORTRAN (który znajduje się w srckatalogu cran.r-project.org/src/contrib/minqa_1. 2.3.tar.gz ) i dokładne widzenie, co się dzieje, gdy ten błąd (kod błędu 430 w kodzie) zostanie wyzwolony ...
Ben Bolker
1
Szybkie przeglądanie papieru Myślę, że ostrzeżenie wskazuje, że optymalizator nie może znaleźć kierunku, w którym zmniejsza się kwadratowe przybliżenie Q do funkcji, którą chcesz zminimalizować, F. Oznacza to, że optymalizator znajduje się w punkcie, który najprawdopodobniej nie jest optymalny, ale nie wie, w jaki sposób można poprawić cel. Dlatego utknął.
Sven
1
który z dwóch dokumentów przejrzałeś i gdzie w przybliżeniu znalazłeś te informacje? (Też przeszukiwałem, ale nie byłem w stanie łatwo zrobić korespondencji między papierem a kodem ...)
Ben Bolker,
Przeczytałem artykuł BOBYQA. Przeszedłem pierwszą połowę w około 5 minut, aby uzyskać ogólne pojęcie o tym, co jadą i co to jest Q. Naprawdę nie mogę wskazać konkretnej strony.
Sven

Odpowiedzi:

13

f(x)xkk

  • Δk
  • f(x)x=xkQ(x)
  • skQk(xk+sk)||sk||Δk
  • skxk+1=xk+sk
  • W przeciwnym razie udoskonal swój model i spróbuj ponownie

sk

Aby zrozumieć wartość VQUAD, musimy najpierw zrozumieć kilka innych zmiennych. Na szczęście są dobre komentarze tuż pod deklaracją SUBROUTINE BOBYQB. Istotne zmienne to:

  • GOPT, gradient modelu
  • HQ, Hesjan modelu
  • Dsk

Począwszy od kilku linii powyżej 410, zobaczysz DO 410 J=1,N. To rozpoczyna pętlę for (i zagnieżdżoną pętlę for), która ocenia zmianę przewidywaną przez model w kroku próbnym D. Gromadzi przewidywaną zmianę w VQUAD. Pierwsza część pętli for ocenia warunki pierwszego rzędu, a zagnieżdżona pętla for ocenia warunki drugiego rzędu. Prawdopodobnie łatwiej byłoby odczytać, gdyby pętle były wcięte, jak poniżej:

    DO 410 J=1,N
        VQUAD=VQUAD+D(J)*GOPT(J)
        DO 410 I=1,J
            IH=IH+1
            TEMP=D(I)*D(J)
            IF (I .EQ. J) TEMP=HALF*TEMP
410         VQUAD=VQUAD+HQ(IH)*TEMP

Po tym jest kolejna pętla for, która uwzględnia inne parametry w modelu. Muszę przyznać, że nie do końca to rozumiem - domyślam się, że jest to związane z tym, jak budują model.

Pod koniec tego wszystkiego VQUADutrzymuje zmianę funkcji celu przewidywaną przez model. Więc jeśli VQUADnie jest ujemny, to źle. Teraz ten konkretny solver może wykorzystywać alternatywne obliczenia krokowe (prawdopodobnie wyszukiwanie liniowe), które właśnie NTRITSwchodzą w grę. Logika przy 430 mówi: „Jeśli w ostatniej iteracji zastosowano alternatywne obliczenie kroku ORAZ model nie przewiduje spadku ORAZ IPRINT> 0, wydrukuj komunikat ostrzegawczy”. Zauważ, że solver zakończy działanie niezależnie od wartości IPRINT.

Mówiąc o IPRINT, ta wartość jest przekazywana BOBYQAprzez funkcję wywołującą. W takim przypadku procedura R jest funkcją wywoływania. Jest verboseparametr do glmer- Byłbym groszem do dolarów, do których ta sama wartość jest przekazywana BOBYQA. Spróbuj ustawić wartość verbose0, a prawdopodobnie nie zobaczysz ostrzeżenia. Ale oczywiście nie zmieni tego, co dzieje się pod maską.

Bill Woessner
źródło
1
To jest bardzo pomocne; Nie sądzę, żebym sobie poradził lepiej, przyznając nagrodę ...
Ben Bolker,
@BenBolker. Czy powinienem więc martwić się o to, co się tutaj dzieje, czy to naprawdę tylko uciążliwość w kodzie? (Innymi słowy, czy to ostrzeżenie oznacza, że ​​moje wyniki są nieprawidłowe?)
theforestecologist
1
ogólna rada w tym przypadku jest następująca ?lme4::convergence: bez wyczerpującej / szczegółowej oceny procedury optymalizacji, najlepiej jest porównać wyniki różnych optymalizatorów.
Ben Bolker