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ểnself
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 đổiself
.Trong một số trường hợp, các vector zero tang của
self
bằngTangentVector.zero
. Trong trường hợp khác, vector không tiếp xúc phụ thuộc vào thông tin trongself
, 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ỉnhzeroTangentVectorInitializer
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 }
Một vector tiếp tuyến khởi tạo sử dụng
zeroTangentVectorInitializer
.move(along: zeroTangentVector)
không nên thay đổiself
.Tuyên ngôn
var zeroTangentVector: TangentVector { get }
Tuyên ngôn
@differentiable(wrt: self) func withRecomputationInPullbacks<Result : Differentiable>( _ body: @escaping @differentiable (Self) -> Result ) -> Result
Á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
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
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ự.
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
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ự.
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
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ự.
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
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ự.
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ự.