แตกต่างได้

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 จะเท่ากับ TangentVector.zero ในกรณีอื่นๆ เวกเตอร์แทนเจนต์ที่เป็นศูนย์จะขึ้นอยู่กับข้อมูลใน self เช่น รูปร่างสำหรับประเภทอาร์เรย์ n มิติ สำหรับการเขียนโปรแกรมที่สร้างความแตกต่าง จะมีประสิทธิภาพด้านหน่วยความจำมากกว่าในการกำหนดคุณสมบัติ 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

    ชั้นที่หก.

    ค่าส่งคืน

    ผลลัพธ์ของชั้นสุดท้ายหลังการใช้ตามลำดับ