최적화를 위해 BFGS와 켤레 기울기 중에서 선택할 때 고려해야 할 사항은 무엇입니까? 이 변수에 맞추려고하는 함수는 지수 함수입니다. 그러나 실제 객관적인 기능은 무엇보다도 통합과 관련이 있으며, 그것이 도움이된다면 비용이 많이 듭니다.
최적화를 위해 BFGS와 켤레 기울기 중에서 선택할 때 고려해야 할 사항은 무엇입니까? 이 변수에 맞추려고하는 함수는 지수 함수입니다. 그러나 실제 객관적인 기능은 무엇보다도 통합과 관련이 있으며, 그것이 도움이된다면 비용이 많이 듭니다.
답변:
JM은 스토리지에 대한 권리입니다. BFGS에는 대략적인 Hessian이 필요하지만, 아이덴티티 매트릭스를 사용하여이를 초기화 한 다음, 그래디언트 정보를 가급적 유한 차이가 아닌 분석적으로 사용할 수있는 한 대략적인 Hessian에 대한 순위 2 업데이트를 계산할 수 있습니다. BFGS는 준-뉴턴 방법이며 CG보다 적은 수의 단계로 수렴되며 "반복"되는 경향이 적으며 각 반복에 대해 상당한 강하를 달성하기 위해 약간의 알고리즘 조정이 필요합니다.
반대로 CG에는 행렬-벡터 제품이 필요합니다. 이는 방향 미분을 계산할 수 있거나 (분석적으로 또는 유한 차분을 사용하여) 유용 할 수 있습니다. 방향 미분의 유한 차분 계산은 Hessian의 유한 차분 계산보다 훨씬 저렴하므로 유한 차분을 사용하여 알고리즘을 구성하려면 방향 미분을 직접 계산하면됩니다. 그러나이 관측치는 BFGS에는 적용되지 않으며, 그래디언트 정보의 내부 곱을 사용하여 근사 Hessians를 계산합니다.
스토리지가 문제가되지 않는다는 것을 알고 있다면 응용 프로그램의 작은 테스트 문제에 대한 두 알고리즘을 비교합니다. 문제의 특정 세부 사항을 알지 못하면 BFGS가 더 빠를 것이지만 두 알고리즘을 실제로 테스트하여 더 잘 작동하는 아이디어를 얻으십시오.
마지막으로, 자동 차별화에 대한 단어 : Fortran ( DAEPACK )의 사내 자동 차별화 (AD) 기능에 대한 경험이 있으면 AD 도구가 종종 까다 롭다는 것을 알 수 있습니다. 자신이 생성 한 코드를 반드시 구별하지 못할 수도 있습니다. AD 도구에는 두 가지 유형이 있습니다.
소스-소스 도구는 본질적으로 사용자가 작성한 소스 코드를 가져 와서 구문 분석하며 소스 코드에서 함수의 그라디언트를 계산하는 새로운 소스 코드를 자동으로 생성하는 수정 된 컴파일러입니다. 연산자 오버로드 AD 도구를 사용하려면 파생 코드를 계산할 수 있도록 소스 코드에서 오버로드 된 AD 연산자를 사용해야하므로 AD를 사용하여 분석 파생물을 계산하는 데 추가 노력이 필요합니다.
내 경험상 업데이트가 많은 BFGS는 현재 솔루션에서 너무 멀리 떨어져 정보를 저장하여 지연되지 않은 Jacobian을 근사화하는 데 실제로 유용하며 너무 많이 저장하면 실제로 수렴을 잃을 수 있습니다. 이러한 이유로 BFGS의 "메모리가없는"변형이 비선형 켤레 그라디언트 처럼 보입니다 (이들 중 하나에 대해 설명 된 최종 업데이트 참조). 따라서 BFGS 대신 L-BFGS를 수행하려는 경우 메모리 문제가 사라지고 방법이 관련 됩니다. 일화적인 증거는 때로는 불필요 하고 때로는 매우 필요 하기 때문에 다시 시작하는 것이 까다로운 문제라고 지적 합니다.
두 가지 중에서 선택하는 것도 관심있는 문제에 따라 크게 달라집니다. 리소스가있는 경우 문제를 해결하고 어느 쪽이 더 효과가 좋은지 결정할 수 있습니다. 예를 들어, 나는 개인적으로 이러한 알고리즘으로 최적화를 수행하지 않고 비선형 방정식 시스템의 솔루션에 관심을 기울입니다. 이를 위해 NCG가 더 잘 작동하고 비선형 사전 조건을 수행하는 것이 더 쉽다는 것을 알았습니다. BFGS가 더 강력합니다.
낮은 차원에서, 잘 구현 된 BFGS 방법은 특히 함수가 2 차에서 그리 멀지 않은 경우 일반적으로 CG보다 빠르고 강력합니다.
BFGS 나 CG 모두 볼록성에 대한 가정이 필요하지 않습니다. 초기 Hessian 근사치 (BFGS의 경우) 만 해당. 전제 조건 (CG의 경우)은 반드시 양수 여야합니다. 그러나 이것들은 항상 큰 해를 끼치 지 않고 낮은 차원에서 단위 행렬로 선택 될 수 있습니다. /scicomp//a/3213/1117 도 참조하십시오
프로그래밍 된 그래디언트가없는 경우, 특히 함수 값이 비싼 경우 수치 그래디언트를 사용하는 것은 많은 노력을 낭비합니다. 오히려, 미분없는 알고리즘을 사용해야합니다. 최근 설문 조사는 http://archimedes.cheme.cmu.edu/?q=dfocomp 를 참조하십시오 .