예를 들어 큰 야 코비 행렬을 다룰 때 숫자 코드의 복잡성을 처리하는 방법은 무엇입니까?


10

나는 비선형 결합 방정식 시스템을 풀고 이산 시스템의 야곱을 계산했습니다. 결과는 정말 복잡합니다. 아래는 의 처음 3 열입니다.×9

부분 야 코비 행렬

(수치 체계가 안정성을 위해 지수 피팅을 요구하기 때문에 복잡성이 부분적으로 발생합니다.)

Jacobians를 사용하여 숫자 코드를 구현하는 것에 대한 일반적인 질문이 있습니다.

계속해서이 매트릭스를 코드로 구현할 수 있습니다. 그러나 내 직감은 복잡한 복잡성과 오류를 피할 수 없기 때문에 며칠 (어쩌면 몇 주일) 지루한 디버깅을 기대한다고 말하고 있습니다. 숫자 코드에서 이와 같은 복잡성에 어떻게 대처할 수 있습니까? 기호 패키지에서 자동 코드 생성 을 사용 합니까 (코드를 직접 조정)?

먼저 유한 차분 근사법으로 분석 Jacobian을 디버깅 할 계획입니다. 함정을 알고 있어야합니까? 코드에서 비슷한 문제를 어떻게 처리합니까?

최신 정보

나는 이것을 파이썬으로 코딩하고 야곱 을 생성하기 위해 sympy 를 사용 했습니다 . 코드 생성 기능을 사용할 수 있습니까?


Jacobian 식을 생성하기 위해 어떤 컴퓨터 대수 시스템을 사용하고 있습니까? 메이플을 사용하는 경우 codegen각 표현식 또는 모든 표현식에 대해 컴팩트하고 효율적인 C 또는 포트란 코드를 자동으로 생성 할 수 있으므로 패키지 를 살펴볼 수 있습니다.
페드로

여기에 많은 유용한 답변이 있습니다. 하나를 선택하는 것은 의미가 없습니다. 이것을 커뮤니티 위키 게시물로 만들어야합니까?
boyfarrell

답변:


6

한 마디 : 모듈성 .

자코비 안에는 자신의 기능으로 쓰여질 수있는 반복 된 표현이 많이 있습니다. 동일한 작업을 두 번 이상 작성할 이유가 없으므로 디버깅이 쉬워집니다. 한 번만 쓰면 오류의 이론이 하나 뿐인 곳이 있습니다.

모듈 식 코드는 테스트를 더 쉽게 만들어줍니다. 전체 행렬을 테스트하는 대신 Jacobian의 각 구성 요소에 대한 테스트를 작성할 수 있습니다. 예를 들어, 함수 am ()을 모듈 방식으로 작성하면 쉽게 온 전성 테스트를 작성하고 올바르게 차별화하는지 확인할 수 있습니다.

또 다른 제안은 Jacobian을 조립하기위한 자동 차별화 라이브러리를 살펴 보는 것입니다. 오류가 없다고 보장 할 수는 없지만 직접 작성하는 것보다 디버깅 / 오류가 적을 것입니다. 당신이 그것을보고 싶을 수도있는 몇 가지가 있습니다 :

  • 사카도 (산 디아 랩스)
  • ADIC (아르곤)

죄송합니다. 파이썬을 사용하고 계신 것을 보았습니다. ScientificPython은 AD를 지원합니다.


좋은 조언. 중간 표현식은 종종 자체 함수를 가질 필요가 없으며 중간 변수에 저장하면됩니다.
David Ketcheson

5

이야기가 시작되는 몇 가지주의 단어로 여기에 무게를 두겠습니다. 오래 전에, 나는 막 시작했을 때 동료와 함께 일했습니다. 그는 다소 지저분한 목표로 해결해야 할 최적화 문제가있었습니다. 그의 해결책은 최적화를 위해 분석 파생물을 생성하는 것이 었습니다.

내가 본 문제는 이러한 파생물이 불쾌하다는 것이었다. Macsyma를 사용하여 생성하고 포트란 코드로 변환 한 결과 각각 수십 개의 연속 문이었습니다. 실제로 Fortran 컴파일러는 최대 연속 문 수를 초과하여 그에 화를 냈습니다. 이 문제를 해결할 수있는 깃발을 찾았지만 다른 문제가있었습니다.

  • CA 시스템에서 일반적으로 생성되는 긴 표현에서는 큰 빼기 취소의 위험이 있습니다. 큰 숫자를 많이 계산하십시오. 작은 숫자를 만들기 위해 서로를 취소합니다.

  • 종종 분석적으로 생성 된 파생 상품은 유한 한 차이를 사용하여 수치 적으로 생성 된 파생 상품보다 평가 비용이 더 많이 듭니다. n 개의 변수에 대한 기울기는 목적 함수 평가 비용보다 n 배 이상 걸릴 수 있습니다. (여러 용어가 여러 파생어에서 재사용 될 수 있기 때문에 시간을 절약 할 수 있지만 컴퓨터 생성 표현식을 사용하는 대신 신중하게 수작업으로 코딩해야합니다. 오류의 확률은 사소하지 않습니다. 이러한 미분 값이 정확한지 확인하십시오.)

내 이야기의 요점은 이러한 CA 생성 식에는 자체 문제가 있다는 것입니다. 재미있는 점은 제 동료가 실제로 문제의 복잡성을 자랑스럽게 생각했기 때문에 대수학이 너무 까다로워서 정말 어려운 문제를 분명히 해결하고 있다는 것입니다. 그가 생각하지 않은 것은 대수학이 실제로 올바른 것을 계산하고 있었는지, 정확하게 수행했는지, 효율적으로 수행했는지였습니다.

이 프로젝트에서 당시에 선임자 였다면 나는 폭동 행위를 읽었을 것입니다. 그의 자존심으로 인해 유한 한 차이 기반 기울기가 적절한 지 확인하지 않고도 불필요하게 복잡한 솔루션을 사용할 수있었습니다. 이 최적화를 실행하는 데 몇 주일이 걸렸을 것입니다. 최소한 나는 그레디언트를 조심스럽게 테스트하라고 조언했을 것이다. 정확 했습니까? 유한 차분 미분에 비해 얼마나 정확합니까? 실제로 오늘날에는 도함수 예측에서 오차의 추정치를 반환하는 도구가 있습니다. 이것은 MATLAB으로 작성한 적응 적 차별화 코드 (가장 파생 된)에 대해 확실히 사실입니다 .

코드를 테스트하십시오. 파생 상품을 확인하십시오.

그러나이 작업을 수행하기 전에 다른 더 나은 최적화 체계가 옵션인지 고려하십시오. 예를 들어, 지수 피팅을 수행하는 경우 분할 된 비선형 최소 제곱 (때로는 분리 가능한 최소 제곱이라고도 함)을 사용할 수있는 가능성이 매우 높습니다. 저는이 책에서 Seber와 Wild가 사용한 용어라고 생각합니다. 매개 변수 세트를 본질적으로 선형 및 본질적으로 비선형 세트로 나누는 것입니다. 비선형 매개 변수에서만 작동하는 최적화를 사용하십시오. 이러한 파라미터가 "알려진"경우, 본질적으로 선형 인 파라미터는 간단한 선형 최소 제곱을 사용하여 추정 할 수 있습니다. 이 체계는 최적화에서 매개 변수 공간을 줄입니다. 선형 매개 변수의 시작 값을 찾을 필요가 없으므로 문제가 더욱 강력 해집니다. 검색 공간의 차원을 줄이므로 문제가 더 빨리 실행됩니다. 다시 나는 공급했다이 목적을위한 도구 이지만 MATLAB에만 있습니다.

분석 도함수를 사용하는 경우 용어를 재사용하도록 코드화하십시오. 시간을 크게 절약 할 수 있으며 실제로 버그를 줄여서 시간을 절약 할 수 있습니다. 그러나 그 숫자를 확인하십시오!


5

고려해야 할 몇 가지 전략이 있습니다.

  1. CAS를 사용하여 기호 형태의 파생 상품을 찾은 다음 파생 상품을 계산하기위한 코드를 내 보냅니다.

  2. 자동 미분 (AD) 도구를 사용하여 코드에서 파생물을 계산하여 함수를 계산하는 코드를 생성하십시오.

  3. 유한 차분 근사법을 사용하여 야곱과 근사합니다.

자동 미분은 전체 Jacobian을 계산하기위한보다 효율적인 코드를 생성 한 다음 기호 계산을 사용하여 행렬의 각 항목에 대한 공식을 생성 할 수 있습니다. 유한 차이는 파생 상품을 다시 확인하는 좋은 방법입니다.



1

BrianBorcher의 훌륭한 제안 외에도 실제 가치 함수에 대한 또 다른 가능한 접근 방식은 복소수 미분 근사를 사용하는 것입니다 ( 이 기사 (paywalled) 및 이 기사 참조 ). 경우에 따라이 접근 방식은 함수의 변수 값을 실수에서 복합으로 변경하는 비용으로보다 정확한 수치 미분을 산출합니다. 두 번째 기사에서는 복잡한 단계 함수 근사가 분해 될 수있는 경우를 나열합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.