Có thể phân biệt được, có thể khác biệt được

public protocol Differentiable

Một kiểu biểu diễn về mặt toán học một đa tạp khả vi có các không gian tiếp tuyến là hữu hạn chiều.

  • Một loại đại diện cho đạo hàm của một giá trị khả vi.

    Về mặt toán học, điều này tương đương với bó tiếp tuyến của đa tạp khả vi được biểu thị bằng loại khả vi.

    Tuyên ngôn

    associatedtype TangentVector: Differentiable & AdditiveArithmetic
      where TangentVector.TangentVector == TangentVector
  • self di chuyển theo hướng đã cho. Trong hình học Riemannian, điều này tương đương với bản đồ hàm mũ, bản đồ này self di chuyển trên bề mặt trắc địa dọc theo vectơ tiếp tuyến đã cho.

    Tuyên ngôn

    mutating mutating func move(along direction: TangentVector)
  • Một bao đóng tạo ra một vectơ tiếp tuyến bằng 0, thu thập thông tin cần thiết tối thiểu từ self .

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

    Trong một số trường hợp, vectơ tiếp tuyến bằng 0 của self bằng TangentVector.zero . Trong các trường hợp khác, vectơ tiếp tuyến bằng 0 phụ thuộc vào thông tin trong self , chẳng hạn như hình dạng của kiểu mảng n chiều. Đối với lập trình vi phân, sẽ hiệu quả hơn về mặt bộ nhớ khi xác định thuộc tính zeroTangentVectorInitializer tùy chỉnh trả về một bao đóng nắm bắt và chỉ sử dụng thông tin cần thiết để tạo vectơ tiếp tuyến bằng 0. 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 vectơ tiếp tuyến được khởi tạo bằng zeroTangentVectorInitializer . move(along: zeroTangentVector) không nên sửa đổ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 bao đóng đã cho cho đạo hàm của self .

    Trả về self giống như một hàm nhận dạng. Khi giá trị trả về được sử dụng trong ngữ cảnh mà nó được phân biệt theo, hãy áp dụng bao đóng đã cho cho đạo hàm của giá trị trả về.

    Tuyên ngôn

    @differentiable(wrt: self)
    func withDerivative(_ body: @escaping (inout TangentVector) -> Void) -> Self
  • Trả về kết quả được tính toán bằng cách áp dụng một chuỗi các lớp cho đầu ra của lớp trước đó, ngoại trừ đầu vào của 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ả về

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

  • theo trình tự(thông qua:_:_:) Phương pháp mở rộng

    Trả về kết quả được tính toán bằng cách áp dụng một chuỗi các lớp cho đầu ra của lớp trước đó, ngoại trừ đầu vào của 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ả về

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

  • theo trình tự(thông qua:_:_:_:) Phương pháp mở rộng

    Trả về kết quả được tính toán bằng cách áp dụng một chuỗi các lớp cho đầu ra của lớp trước đó, ngoại trừ đầu vào của 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ả về

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

  • theo trình tự(thông qua:_:_:_:_:) Phương pháp mở rộng

    Trả về kết quả được tính toán bằng cách áp dụng một chuỗi các lớp cho đầu ra của lớp trước đó, ngoại trừ đầu vào của 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ả về

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

  • theo trình tự(thông qua:_:_:_:_:_:) Phương pháp mở rộng

    Trả về kết quả được tính toán bằng cách áp dụng một chuỗi các lớp cho đầu ra của lớp trước đó, ngoại trừ đầu vào của 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ả về

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

,
public protocol Differentiable

Một kiểu biểu diễn về mặt toán học một đa tạp khả vi có các không gian tiếp tuyến là hữu hạn chiều.

  • Một loại đại diện cho đạo hàm của một giá trị khả vi.

    Về mặt toán học, điều này tương đương với bó tiếp tuyến của đa tạp khả vi được biểu thị bằng loại khả vi.

    Tuyên ngôn

    associatedtype TangentVector: Differentiable & AdditiveArithmetic
      where TangentVector.TangentVector == TangentVector
  • self di chuyển theo hướng đã cho. Trong hình học Riemannian, điều này tương đương với bản đồ hàm mũ, bản đồ này self di chuyển trên bề mặt trắc địa dọc theo vectơ tiếp tuyến đã cho.

    Tuyên ngôn

    mutating mutating func move(along direction: TangentVector)
  • Một bao đóng tạo ra một vectơ tiếp tuyến bằng 0, thu thập thông tin cần thiết tối thiểu từ self .

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

    Trong một số trường hợp, vectơ tiếp tuyến bằng 0 của self bằng TangentVector.zero . Trong các trường hợp khác, vectơ tiếp tuyến bằng 0 phụ thuộc vào thông tin trong self , chẳng hạn như hình dạng của kiểu mảng n chiều. Đối với lập trình vi phân, sẽ hiệu quả hơn về mặt bộ nhớ khi xác định thuộc tính zeroTangentVectorInitializer tùy chỉnh trả về một bao đóng nắm bắt và chỉ sử dụng thông tin cần thiết để tạo vectơ tiếp tuyến bằng 0. 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 vectơ tiếp tuyến được khởi tạo bằng zeroTangentVectorInitializer . move(along: zeroTangentVector) không nên sửa đổ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 bao đóng đã cho cho đạo hàm của self .

    Trả về self giống như một hàm nhận dạng. Khi giá trị trả về được sử dụng trong ngữ cảnh mà nó được phân biệt theo, hãy áp dụng bao đóng đã cho cho đạo hàm của giá trị trả về.

    Tuyên ngôn

    @differentiable(wrt: self)
    func withDerivative(_ body: @escaping (inout TangentVector) -> Void) -> Self
  • Trả về kết quả được tính toán bằng cách áp dụng một chuỗi các lớp cho đầu ra của lớp trước đó, ngoại trừ đầu vào của 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ả về

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

  • theo trình tự(thông qua:_:_:) Phương pháp mở rộng

    Trả về kết quả được tính toán bằng cách áp dụng một chuỗi các lớp cho đầu ra của lớp trước đó, ngoại trừ đầu vào của 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ả về

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

  • theo trình tự(thông qua:_:_:_:) Phương pháp mở rộng

    Trả về kết quả được tính toán bằng cách áp dụng một chuỗi các lớp cho đầu ra của lớp trước đó, ngoại trừ đầu vào của 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ả về

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

  • theo trình tự(thông qua:_:_:_:_:) Phương pháp mở rộng

    Trả về kết quả được tính toán bằng cách áp dụng một chuỗi các lớp cho đầu ra của lớp trước đó, ngoại trừ đầu vào của 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ả về

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

  • theo trình tự(thông qua:_:_:_:_:_:) Phương pháp mở rộng

    Trả về kết quả được tính toán bằng cách áp dụng một chuỗi các lớp cho đầu ra của lớp trước đó, ngoại trừ đầu vào của 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ả về

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