문제

이것은의 맥락에 있습니다 자동 차별화 - 그러한 시스템은 다음과 같은 기능으로 무엇을 할 것인가 map, 또는 filter - 또는 심지어 하나의 스키 콤비네이터?

예 : 다음 기능이 있습니다.

def func(x):
    return sum(map(lambda a: a**x, range(20)))

그 파생물은 무엇입니까? AD 시스템은 결과적으로 무엇을 생산할 것인가? (이 기능은 실제 입력에 잘 정의되어 있습니다).

도움이 되었습니까?

해결책

고차 함수는 개별적입니다. 그들은 일부 n 차원 공간을 포인트하기 위해 잘 정의 된 맵핑을 가진 논쟁을 가진 데카르트 품질이 없습니다.

그러나 답변에 대한 설명과 함께 말할 수있는 몇 가지 사항이 있습니다. 상징적으로 일부 고차 기능을 차별화하는 것이 가능하지만 잘 알려진 기능으로 해결되는 특정 호출 패턴에 대해서만 가능합니다.

아마, 수치 차별화 주어진 함수를 반복적으로 평가함으로써 미분을 추정 할 수 있기 때문에 더 유익 할 것입니다.

또한, 완전히 일반적인 기능 - 그리고 당신의 예제는 비교적 임의의 기능을 사용하여 그런 방식으로 향하고 있습니다. 결국 튜링 완전성에 부딪 힐 것입니다. 이는 상징적 차별화 요소의 일부에 대한 영리성이 없을 것임을 의미합니다. 기능을 자동으로 구별합니다.

다른 팁

좋은 광고 시스템은 어려움없이 산들 바람을 낼 것입니다. 광고 코드가 소스 변환에 소스를 수행하면 문제가 발생할 수 있습니다. sum. 그러나 산술 연산자에 과부하로 작동하는 광고 시스템이라면 광고 코드는 실제로 '참조'하지 않습니다. sum 기능, 그냥 + 그 운영 sum 기능 호출.

나는 당신이 더 높은 순위 함수를 유용하게 구별 할 수 없거나, 실제로 그것을 실제로 보여줌으로써 특히 작은 하위 집합으로 자신을 제한해야한다는 인정 된 답변에 동의하지 않기를 원합니다.

내 Haskell 'Ad'패키지를 사용하여 다음을 얻을 수 있습니다.

ghci> :m + Numeric.AD
ghci> diff (\x -> sum (map (**x) [1..20])) 10
7.073726805128313e13

추적 된 숫자 유형을 남용하여 수행 한 일을 추출하여 파생 상품에 대한 질문에 답변 할 수 있습니다.

ghci> :m + Debug.Traced
ghci> putStrLn $ showAsExp $ diff (\x -> sum (map (**x) [1..20])) (unknown "x" :: Traced Double) 
1.0 * (1.0 ** x * log 1.0) + 
1.0 * (2.0 ** x * log 2.0) +
1.0 * (3.0 ** x * log 3.0) +
1.0 * (4.0 ** x * log 4.0) +
1.0 * (5.0 ** x * log 5.0) +
1.0 * (6.0 ** x * log 6.0) +
1.0 * (7.0 ** x * log 7.0) +
1.0 * (8.0 ** x * log 8.0) +
1.0 * (9.0 ** x * log 9.0) +
1.0 * (10.0 ** x * log 10.0) +
1.0 * (11.0 ** x * log 11.0) +
1.0 * (12.0 ** x * log 12.0) +
1.0 * (13.0 ** x * log 13.0) +
1.0 * (14.0 ** x * log 14.0) +
1.0 * (15.0 ** x * log 15.0) +
1.0 * (16.0 ** x * log 16.0) +
1.0 * (17.0 ** x * log 17.0) +
1.0 * (18.0 ** x * log 18.0) +
1.0 * (19.0 ** x * log 19.0) +
1.0 * (20.0 ** x * log 20.0)

완전한 공유를 통해 당신은 다소 끔찍한 결과를 얻습니다. 때로는 비대칭 적으로 더 효율적입니다.

ghci> putStrLn $ showAsExp $ reShare $ diff (\x -> sum (map (**x) [1..20])) 
      (unknown "x" :: Traced Double)
let _21 = 1.0 ** x;
    _23 = log 1.0;
    _20 = _21 * _23;
    _19 = 1.0 * _20;
    _26 = 2.0 ** x;
    _27 = log 2.0;
    _25 = _26 * _27;
    _24 = 1.0 * _25;
    _18 = _19 + _24;
    _30 = 3.0 ** x;
    _31 = log 3.0;
    _29 = _30 * _31;
    _28 = 1.0 * _29;
    _17 = _18 + _28;
    _34 = 4.0 ** x;
    _35 = log 4.0;
    _33 = _34 * _35;
    _32 = 1.0 * _33;
    _16 = _17 + _32;
    _38 = 5.0 ** x;
    _39 = log 5.0;
    _37 = _38 * _39;
    _36 = 1.0 * _37;
    _15 = _16 + _36;
    _42 = 6.0 ** x;
    _43 = log 6.0;
    _41 = _42 * _43;
    _40 = 1.0 * _41;
    _14 = _15 + _40;
    _46 = 7.0 ** x;
    _47 = log 7.0;
    _45 = _46 * _47;
    _44 = 1.0 * _45;
    _13 = _14 + _44;
    _50 = 8.0 ** x;
    _51 = log 8.0;
    _49 = _50 * _51;
    _48 = 1.0 * _49;
    _12 = _13 + _48;
    _54 = 9.0 ** x;
    _55 = log 9.0;
    _53 = _54 * _55;
    _52 = 1.0 * _53;
    _11 = _12 + _52;
    _58 = 10.0 ** x;
    _59 = log 10.0;
    _57 = _58 * _59;
    _56 = 1.0 * _57;
    _10 = _11 + _56;
    _62 = 11.0 ** x;
    _63 = log 11.0;
    _61 = _62 * _63;
    _60 = 1.0 * _61;
    _9 = _10 + _60;
    _66 = 12.0 ** x;
    _67 = log 12.0;
    _65 = _66 * _67;
    _64 = 1.0 * _65;
    _8 = _9 + _64;
    _70 = 13.0 ** x;
    _71 = log 13.0;
    _69 = _70 * _71;
    _68 = 1.0 * _69;
    _7 = _8 + _68;
    _74 = 14.0 ** x;
    _75 = log 14.0;
    _73 = _74 * _75;
    _72 = 1.0 * _73;
    _6 = _7 + _72;
    _78 = 15.0 ** x;
    _79 = log 15.0;
    _77 = _78 * _79;
    _76 = 1.0 * _77;
    _5 = _6 + _76;
    _82 = 16.0 ** x;
    _83 = log 16.0;
    _81 = _82 * _83;
    _80 = 1.0 * _81;
    _4 = _5 + _80;
    _86 = 17.0 ** x;
    _87 = log 17.0;
    _85 = _86 * _87;
    _84 = 1.0 * _85;
    _3 = _4 + _84;
    _90 = 18.0 ** x;
    _91 = log 18.0;
    _89 = _90 * _91;
    _88 = 1.0 * _89;
    _2 = _3 + _88;
    _94 = 19.0 ** x;
    _95 = log 19.0;
    _93 = _94 * _95;
    _92 = 1.0 * _93;
    _1 = _2 + _92;
    _98 = 20.0 ** x;
    _99 = log 20.0;
    _97 = _98 * _99;
    _96 = 1.0 * _97;
    _0 = _1 + _96;
in  _0

일반적으로 자동 차별화는 높은 순위 기능에 문제가 없습니다. 그러나 소스 간 번역은 특정 도구의 한계에 따라 몇 가지 Gotchas로 연결될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top