หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

tf.custom_gradient

TensorFlow 1 เวอร์ชัน ดูแหล่งที่มาบน GitHub

มัณฑนากรเพื่อกำหนดฟังก์ชั่นที่มีการไล่ระดับสีที่กำหนดเอง

มัณฑนากรนี้ช่วยให้สามารถควบคุมการไล่ระดับสีของลำดับสำหรับการดำเนินการได้อย่างละเอียด สิ่งนี้อาจมีประโยชน์ด้วยเหตุผลหลายประการรวมถึงการให้การไล่ระดับสีที่มีประสิทธิภาพมากขึ้นหรือมีเสถียรภาพในเชิงตัวเลขสำหรับลำดับการดำเนินการ

ตัวอย่างเช่นพิจารณาฟังก์ชันต่อไปนี้ที่มักเกิดขึ้นในการคำนวณเอนโทรปีไขว้และโอกาสในการบันทึก:

 def log1pexp(x):
  return tf.math.log(1 + tf.exp(x))
 

เนื่องจากความไม่แน่นอนของตัวเลขการไล่ระดับสีของฟังก์ชันนี้ที่ประเมินที่ x = 100 คือ NaN ตัวอย่างเช่น:

 x = tf.constant(100.)
y = log1pexp(x)
dy = tf.gradients(y, x) # Will be NaN when evaluated.
 

นิพจน์การไล่ระดับสีสามารถวิเคราะห์ได้ง่ายขึ้นเพื่อให้ความเสถียรเชิงตัวเลข:

 @tf.custom_gradient
def log1pexp(x):
  e = tf.exp(x)
  def grad(dy):
    return dy * (1 - 1 / (1 + e))
  return tf.math.log(1 + e), grad
 

ด้วยคำจำกัดความนี้การไล่ระดับสีที่ x = 100 จะได้รับการประเมินอย่างถูกต้องเป็น 1.0

การไล่ระดับสีแบบกำหนดเองที่ซ้อนกันสามารถนำไปสู่ผลลัพธ์ที่ไม่ได้ตั้งใจ พฤติกรรมเริ่มต้นไม่สอดคล้องกับสัญญาซื้อขายล่วงหน้าลำดับที่ n ตัวอย่างเช่น

 @tf.custom_gradient
def op(x):
  y = op1(x)
  @tf.custom_gradient
  def grad_fn(dy):
    gdy = op2(x, y, dy)
    def grad_grad_fn(ddy):  # Not the 2nd order gradient of op w.r.t. x.
      return op3(x, y, dy, ddy)
    return gdy, grad_grad_fn
  return y, grad_fn
 

ฟังก์ชัน grad_grad_fn จะคำนวณการไล่ระดับสีอันดับแรกของ grad_fn ด้วยความเคารพต่อ dy ซึ่งใช้ในการสร้างกราฟการไล่ระดับสีไปข้างหน้าโหมดจากกราฟการไล่ระดับสีโหมดย้อนหลัง แต่ไม่เหมือนกับการไล่ระดับสีอันดับสองของ op เกี่ยวกับ x .

ให้ห่อ @tf.custom_gradients ซ้อนกันในฟังก์ชันอื่นแทน:

 @tf.custom_gradient
def op_with_fused_backprop(x):
  y, x_grad = fused_op(x)
  def first_order_gradient(dy):
    @tf.custom_gradient
    def first_order_custom(unused_x):
      def second_order_and_transpose(ddy):
        return second_order_for_x(...), gradient_wrt_dy(...)
      return x_grad, second_order_and_transpose
    return dy * first_order_custom(x)
  return y, first_order_gradient
 

อาร์กิวเมนต์เพิ่มเติมของฟังก์ชั่น inner @tf.custom_gradient -decorated จะควบคุมค่าส่งคืนที่คาดไว้ของฟังก์ชัน innermost

ดูเพิ่มเติม tf.RegisterGradient ซึ่งลงทะเบียนฟังก์ชันการไล่ระดับสีสำหรับการดำเนินการ TensorFlow แบบดั้งเดิม ในทางกลับกัน tf.custom_gradient ช่วยให้สามารถควบคุมการคำนวณการไล่ระดับสีของลำดับการดำเนินการได้อย่างละเอียด

โปรดสังเกตว่าถ้าฟังก์ชันตกแต่งใช้ Variable s ขอบเขตตัวแปรที่ปิดล้อมจะต้องใช้ ResourceVariable s

f ฟังก์ชัน f(*x) ที่ส่งคืนทูเพิล (y, grad_fn) โดยที่:

  • x คือลำดับของ (โครงสร้างที่ซ้อนกันของ) อินพุต Tensor ไปยังฟังก์ชัน
  • y คือ (โครงสร้างที่ซ้อนกัน) เอาต์พุต Tensor ของการใช้การดำเนินการ TensorFlow ใน f ถึง x
  • grad_fn เป็นฟังก์ชันที่มีลายเซ็น g(*grad_ys) ซึ่งส่งคืนรายการของ Tensor s ที่มีขนาดเท่ากับ (แบน) x - อนุพันธ์ของ Tensor s ใน y เทียบกับ Tensor s ใน x grad_ys เป็นลำดับของ Tensor ที่มีขนาดเท่ากับ (แบน) y โดยถือการไล่ระดับค่าเริ่มต้นสำหรับแต่ละ Tensor ใน y

ในแง่คณิตศาสตร์บริสุทธิ์อนุพันธ์ของฟังก์ชันเวกเตอร์ที่มีค่าเวกเตอร์ f ควรเป็น Jacobian matrix J ที่นี่เรากำลังแสดง Jacobian J เป็นฟังก์ชัน grad_fn ซึ่งกำหนดว่า J จะแปลงเวกเตอร์ grad_ys เมื่อคูณด้วยซ้าย ( grad_ys * J ผลิตภัณฑ์เวกเตอร์ - Jacobian หรือ VJP) การแสดงฟังก์ชันของเมทริกซ์นี้สะดวกในการใช้สำหรับการคำนวณกฎลูกโซ่ (เช่นอัลกอริธึมการแพร่กระ