Có thể phân biệt

public protocol Differentiable

Một kiểu biểu thị về mặt toán học một đa tạp có thể phân biệt có không gian tiếp tuyến là hữu hạn chiều.

  • Một loại đại diện cho các dẫn xuất của một giá trị có thể phân biệt được.

    Về mặt toán học, điều này tương đương với gói tiếp tuyến của đa tạp có thể phân biệt được biểu diễn bằng loại có thể phân biệt.

    Tuyên ngôn

    associatedtype TangentVector: Differentiable & AdditiveArithmetic
      where TangentVector.TangentVector == TangentVector
  • Di chuyển self theo hướng nhất định. Trong hình học Riemann, điều này tương đương với bản đồ mũ, trong đó di chuyển self trên bề mặt đo đạc dọc theo vector tiếp xúc nhất định.

    Tuyên ngôn

    mutating mutating func move(along direction: TangentVector)
  • Một đóng cửa sản xuất một vector không tiếp xúc, nắm bắt thông tin cần thiết tối thiểu từ self .

    move(along: zeroTangentVectorInitializer()) không nên thay đổi self .

    Trong một số trường hợp, các vector zero tang của self bằng TangentVector.zero . Trong trường hợp khác, vector không tiếp xúc phụ thuộc vào thông tin trong self , chẳng hạn như hình dạng cho một loại mảng n chiều. Đối với lập trình vi, nó là nhiều bộ nhớ hiệu quả để xác định một tùy chỉnh zeroTangentVectorInitializer tài sản mà trả về một kết thúc mà chụp và sử dụng chỉ thông tin cần thiết để tạo ra một vector không tiếp xúc. Ví dụ:

    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) }
        }
    }
    

    Tuyên ngôn

    var zeroTangentVectorInitializer: () -> TangentVector { get }
  • zeroTangentVector

    Phương pháp mở rộng

    Một vector tiếp tuyến khởi tạo sử dụng zeroTangentVectorInitializer . move(along: zeroTangentVector) không nên thay đổi self .

    Tuyên ngôn

    var zeroTangentVector: TangentVector { get }
  • withRecomputationInPullbacks (_ :)

    Phương pháp mở rộng

    Tuyên ngôn

    @differentiable(wrt: self)
    func withRecomputationInPullbacks<Result : Differentiable>(
      _ body: @escaping @differentiable (Self) -> Result
    ) -> Result
  • withDerivative (_ :)

    Phương pháp mở rộng

    Áp dụng việc đóng cửa trao cho đạo hàm của self .

    Returns self như một chức năng nhận dạng. Khi giá trị trả về được sử dụng trong ngữ cảnh mà nó được phân biệt đối với, hãy áp dụng cách đóng đã cho cho phái sinh của giá trị trả về.

    Tuyên ngôn

    @differentiable(wrt: self)
    func withDerivative(_ body: @escaping (inout TangentVector) -> Void) -> Self
  • tuần tự (thông qua: _ :)

    Phương pháp mở rộng

    Lợi nhuận đầu ra tính bằng cách áp dụng một chuỗi các lớp để sản xuất các lớp trước, ngoại trừ việc đầu vào lớp đầu tiên là self .

    Tuyên ngôn

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

    Thông số

    l1

    Lớp đầu tiên.

    l2

    Lớp thứ hai.

    Giá trị trả lại

    Đầu ra của lớp cuối cùng sau khi ứng dụng tuần tự.

  • tuần tự (thông qua: _: _ :)

    Phương pháp mở rộng

    Lợi nhuận đầu ra tính bằng cách áp dụng một chuỗi các lớp để sản xuất các lớp trước, ngoại trừ việc đầu vào lớp đầu tiên là self .

    Tuyên ngôn

    @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

    Thông số

    l1

    Lớp đầu tiên.

    l2

    Lớp thứ hai.

    l3

    Lớp thứ ba.

    Giá trị trả lại

    Đầu ra của lớp cuối cùng sau khi ứng dụng tuần tự.

  • tuần tự (thông qua: _: _: _ :)

    Phương pháp mở rộng

    Lợi nhuận đầu ra tính bằng cách áp dụng một chuỗi các lớp để sản xuất các lớp trước, ngoại trừ việc đầu vào lớp đầu tiên là self .

    Tuyên ngôn

    @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

    Thông số

    l1

    Lớp đầu tiên.

    l2

    Lớp thứ hai.

    l3

    Lớp thứ ba.

    l4

    Lớp thứ tư.

    Giá trị trả lại

    Đầu ra của lớp cuối cùng sau khi ứng dụng tuần tự.

  • tuần tự (thông qua: _: _: _: _ :)

    Phương pháp mở rộng

    Lợi nhuận đầu ra tính bằng cách áp dụng một chuỗi các lớp để sản xuất các lớp trước, ngoại trừ việc đầu vào lớp đầu tiên là self .

    Tuyên ngôn

    @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

    Thông số

    l1

    Lớp đầu tiên.

    l2

    Lớp thứ hai.

    l3

    Lớp thứ ba.

    l4

    Lớp thứ ba.

    l5

    Lớp thứ năm.

    Giá trị trả lại

    Đầu ra của lớp cuối cùng sau khi ứng dụng tuần tự.

  • tuần tự (thông qua: _: _: _: _: _ :)

    Phương pháp mở rộng

    Lợi nhuận đầu ra tính bằng cách áp dụng một chuỗi các lớp để sản xuất các lớp trước, ngoại trừ việc đầu vào lớp đầu tiên là self .

    Tuyên ngôn

    @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

    Thông số

    l1

    Lớp đầu tiên.

    l2

    Lớp thứ hai.

    l3

    Lớp thứ ba.

    l4

    Lớp thứ ba.

    l5

    Lớp thứ năm.

    l6

    Lớp thứ sáu.

    Giá trị trả lại

    Đầu ra của lớp cuối cùng sau khi ứng dụng tuần tự.