이야기가 시작되는 몇 가지주의 단어로 여기에 무게를 두겠습니다. 오래 전에, 나는 막 시작했을 때 동료와 함께 일했습니다. 그는 다소 지저분한 목표로 해결해야 할 최적화 문제가있었습니다. 그의 해결책은 최적화를 위해 분석 파생물을 생성하는 것이 었습니다.
내가 본 문제는 이러한 파생물이 불쾌하다는 것이었다. Macsyma를 사용하여 생성하고 포트란 코드로 변환 한 결과 각각 수십 개의 연속 문이었습니다. 실제로 Fortran 컴파일러는 최대 연속 문 수를 초과하여 그에 화를 냈습니다. 이 문제를 해결할 수있는 깃발을 찾았지만 다른 문제가있었습니다.
CA 시스템에서 일반적으로 생성되는 긴 표현에서는 큰 빼기 취소의 위험이 있습니다. 큰 숫자를 많이 계산하십시오. 작은 숫자를 만들기 위해 서로를 취소합니다.
종종 분석적으로 생성 된 파생 상품은 유한 한 차이를 사용하여 수치 적으로 생성 된 파생 상품보다 평가 비용이 더 많이 듭니다. n 개의 변수에 대한 기울기는 목적 함수 평가 비용보다 n 배 이상 걸릴 수 있습니다. (여러 용어가 여러 파생어에서 재사용 될 수 있기 때문에 시간을 절약 할 수 있지만 컴퓨터 생성 표현식을 사용하는 대신 신중하게 수작업으로 코딩해야합니다. 오류의 확률은 사소하지 않습니다. 이러한 미분 값이 정확한지 확인하십시오.)
내 이야기의 요점은 이러한 CA 생성 식에는 자체 문제가 있다는 것입니다. 재미있는 점은 제 동료가 실제로 문제의 복잡성을 자랑스럽게 생각했기 때문에 대수학이 너무 까다로워서 정말 어려운 문제를 분명히 해결하고 있다는 것입니다. 그가 생각하지 않은 것은 대수학이 실제로 올바른 것을 계산하고 있었는지, 정확하게 수행했는지, 효율적으로 수행했는지였습니다.
이 프로젝트에서 당시에 선임자 였다면 나는 폭동 행위를 읽었을 것입니다. 그의 자존심으로 인해 유한 한 차이 기반 기울기가 적절한 지 확인하지 않고도 불필요하게 복잡한 솔루션을 사용할 수있었습니다. 이 최적화를 실행하는 데 몇 주일이 걸렸을 것입니다. 최소한 나는 그레디언트를 조심스럽게 테스트하라고 조언했을 것이다. 정확 했습니까? 유한 차분 미분에 비해 얼마나 정확합니까? 실제로 오늘날에는 도함수 예측에서 오차의 추정치를 반환하는 도구가 있습니다. 이것은 MATLAB으로 작성한 적응 적 차별화 코드 (가장 파생 된)에 대해 확실히 사실입니다 .
코드를 테스트하십시오. 파생 상품을 확인하십시오.
그러나이 작업을 수행하기 전에 다른 더 나은 최적화 체계가 옵션인지 고려하십시오. 예를 들어, 지수 피팅을 수행하는 경우 분할 된 비선형 최소 제곱 (때로는 분리 가능한 최소 제곱이라고도 함)을 사용할 수있는 가능성이 매우 높습니다. 저는이 책에서 Seber와 Wild가 사용한 용어라고 생각합니다. 매개 변수 세트를 본질적으로 선형 및 본질적으로 비선형 세트로 나누는 것입니다. 비선형 매개 변수에서만 작동하는 최적화를 사용하십시오. 이러한 파라미터가 "알려진"경우, 본질적으로 선형 인 파라미터는 간단한 선형 최소 제곱을 사용하여 추정 할 수 있습니다. 이 체계는 최적화에서 매개 변수 공간을 줄입니다. 선형 매개 변수의 시작 값을 찾을 필요가 없으므로 문제가 더욱 강력 해집니다. 검색 공간의 차원을 줄이므로 문제가 더 빨리 실행됩니다. 다시 나는 공급했다이 목적을위한 도구 이지만 MATLAB에만 있습니다.
분석 도함수를 사용하는 경우 용어를 재사용하도록 코드화하십시오. 시간을 크게 절약 할 수 있으며 실제로 버그를 줄여서 시간을 절약 할 수 있습니다. 그러나 그 숫자를 확인하십시오!
codegen
각 표현식 또는 모든 표현식에 대해 컴팩트하고 효율적인 C 또는 포트란 코드를 자동으로 생성 할 수 있으므로 패키지 를 살펴볼 수 있습니다.