미분 가능

public protocol Differentiable

탄젠트 공간이 유한차원인 미분 가능한 다양체를 수학적으로 표현하는 형식입니다.

  • 미분 가능한 값의 도함수를 나타내는 유형입니다.

    수학적으로 이는 미분 가능 유형으로 표시되는 미분 가능 다양체의 접선 묶음과 동일합니다.

    선언

    associatedtype TangentVector: Differentiable & AdditiveArithmetic
      where TangentVector.TangentVector == TangentVector
  • 주어진 방향을 따라 self 움직인다. 리만 기하학에서 이는 주어진 접선 벡터를 따라 측지선 표면에서 self 이동하는 지수 지도와 동일합니다.

    선언

    mutating mutating func move(along direction: TangentVector)
  • self 에서 최소한의 필수 정보를 캡처하여 제로 탄젠트 벡터를 생성하는 클로저입니다.

    move(along: zeroTangentVectorInitializer()) self 수정해서는 안 됩니다.

    어떤 경우에는 self 의 접선 0 벡터가 TangentVector.zero 와 동일합니다. 다른 경우에는 제로 탄젠트 벡터가 n차원 배열 유형의 모양과 같은 self 의 정보에 따라 달라집니다. 미분 가능한 프로그래밍의 경우, 접선이 0인 벡터를 생성하는 데 필요한 정보만 캡처하고 사용하는 클로저를 반환하는 사용자 지정 zeroTangentVectorInitializer 속성을 정의하는 것이 메모리 효율적입니다. 예를 들어:

    struct Vector {
        var scalars: [Float]
        var count: Int { scalars.count }
        init(scalars: [Float]) { ... }
        init(repeating repeatedElement: Float, count: Int) { ... }
    }
    
    extension Vector: AdditiveArithmetic { ... }
    
    extension Vector: Differentiable {
        typealias TangentVector = Vector
    
        @noDerivative
        var zeroTangentVectorInitializer: () -> TangentVector {
            let count = self.count
            return { TangentVector(repeating: 0, count: count) }
        }
    }
    

    선언

    var zeroTangentVectorInitializer: () -> TangentVector { get }
  • 영접선벡터 확장 방법

    zeroTangentVectorInitializer 사용하여 초기화된 접선 벡터입니다. move(along: zeroTangentVector) self 수정해서는 안 됩니다.

    선언

    var zeroTangentVector: TangentVector { get }
  • 선언

    @differentiable(wrt: self)
    func withRecomputationInPullbacks<Result : Differentiable>(
      _ body: @escaping @differentiable (Self) -> Result
    ) -> Result
  • 파생상품(_:) 확장 방법

    주어진 클로저를 self 의 파생물에 적용합니다.

    항등 함수처럼 self 반환합니다. 반환 값이 구별되는 컨텍스트에서 사용되는 경우 반환 값의 파생 항목에 지정된 클로저를 적용합니다.

    선언

    @differentiable(wrt: self)
    func withDerivative(_ body: @escaping (inout TangentVector) -> Void) -> Self
  • 순서대로(:_:) 확장 방법

    첫 번째 레이어의 입력이 self 인 경우를 제외하고 이전 레이어의 출력에 일련의 레이어를 적용하여 계산된 출력을 반환합니다.

    선언

    @differentiable
    public func sequenced<L1: Layer, L2: Layer>(through l1: L1, _ l2: L2) -> L2.Output
    where L1.Input == Self, L1.Output == L2.Input

    매개변수

    l1

    첫 번째 레이어.

    l2

    두 번째 레이어.

    반환 값

    순차적 적용 후 최종 레이어의 출력입니다.

  • 순서대로(:_:_:) 확장 방법

    첫 번째 레이어의 입력이 self 인 경우를 제외하고 이전 레이어의 출력에 일련의 레이어를 적용하여 계산된 출력을 반환합니다.

    선언

    @differentiable
    public func sequenced<L1: Layer, L2: Layer, L3: Layer>(through l1: L1, _ l2: L2, _ l3: L3)
      -> L3.Output
    where L1.Input == Self, L1.Output == L2.Input, L2.Output == L3.Input

    매개변수

    l1

    첫 번째 레이어.

    l2

    두 번째 레이어.

    l3

    세 번째 레이어.

    반환 값

    순차적 적용 후 최종 레이어의 출력입니다.

  • 첫 번째 레이어의 입력이 self 인 경우를 제외하고 이전 레이어의 출력에 일련의 레이어를 적용하여 계산된 출력을 반환합니다.

    선언

    @differentiable
    public func sequenced<L1: Layer, L2: Layer, L3: Layer, L4: Layer>(
      through l1: L1, _ l2: L2, _ l3: L3, _ l4: L4
    ) -> L4.Output
    where
      L1.Input == Self, L1.Output == L2.Input, L2.Output == L3.Input,
      L3.Output == L4.Input

    매개변수

    l1

    첫 번째 레이어.

    l2

    두 번째 레이어.

    l3

    세 번째 레이어.

    l4

    네 번째 레이어.

    반환 값

    순차적 적용 후 최종 레이어의 출력입니다.

  • 순서대로(:_:_:_:_:) 확장 방법

    첫 번째 레이어의 입력이 self 인 경우를 제외하고 이전 레이어의 출력에 일련의 레이어를 적용하여 계산된 출력을 반환합니다.

    선언

    @differentiable
    public func sequenced<L1: Layer, L2: Layer, L3: Layer, L4: Layer, L5: Layer>(
      through l1: L1, _ l2: L2, _ l3: L3, _ l4: L4, _ l5: L5
    ) -> L5.Output
    where
      L1.Input == Self, L1.Output == L2.Input, L2.Output == L3.Input, L3.Output == L4.Input,
      L4.Output == L5.Input

    매개변수

    l1

    첫 번째 레이어.

    l2

    두 번째 레이어.

    l3

    세 번째 레이어.

    l4

    세 번째 레이어.

    l5

    다섯 번째 레이어.

    반환 값

    순차적 적용 후 최종 레이어의 출력입니다.

  • 첫 번째 레이어의 입력이 self 인 경우를 제외하고 이전 레이어의 출력에 일련의 레이어를 적용하여 계산된 출력을 반환합니다.

    선언

    @differentiable
    public func sequenced<L1: Layer, L2: Layer, L3: Layer, L4: Layer, L5: Layer, L6: Layer>(
      through l1: L1, _ l2: L2, _ l3: L3, _ l4: L4, _ l5: L5, _ l6: L6
    ) -> L6.Output
    where
      L1.Input == Self, L1.Output == L2.Input, L2.Output == L3.Input, L3.Output == L4.Input,
      L4.Output == L5.Input, L5.Output == L6.Input

    매개변수

    l1

    첫 번째 레이어.

    l2

    두 번째 레이어.

    l3

    세 번째 레이어.

    l4

    세 번째 레이어.

    l5

    다섯 번째 레이어.

    l6

    여섯 번째 레이어.

    반환 값

    순차적 적용 후 최종 레이어의 출력입니다.