Tensorflow `tf.train.Optimizer` คำนวณการไล่ระดับสีอย่างไร


10

ฉันกำลังติดตามบทช่วยสอนผู้ชาญฉลาด Tensorflow ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py )

บทช่วยสอนใช้tf.train.Optimizer.minimize(โดยเฉพาะtf.train.GradientDescentOptimizer) ฉันไม่เห็นข้อโต้แย้งใด ๆ ที่ถูกส่งผ่านไปที่ใดก็ได้เพื่อกำหนดการไล่ระดับสี

Tensor flow นั้นใช้ความแตกต่างของตัวเลขหรือไม่?

มีวิธีผ่านในการไล่ระดับสีอย่างที่คุณสามารถทำได้scipy.optimize.minimizeหรือไม่?

คำตอบ:


16

มันเป็นความแตกต่างไม่ได้ตัวเลขมันเป็นความแตกต่างโดยอัตโนมัติ นี่คือหนึ่งในเหตุผลหลักสำหรับการดำรงอยู่ของ tensorflow: โดยการระบุการดำเนินงานในกราฟ tenorflow (ด้วยการดำเนินงานในTensors และอื่น ๆ ), มันสามารถปฏิบัติตามกฎลูกโซ่ผ่านกราฟโดยอัตโนมัติและเนื่องจากมันรู้จักอนุพันธ์ของการปฏิบัติการแต่ละอย่างของคุณ ระบุมันสามารถรวมพวกเขาโดยอัตโนมัติ

gradient_override_mapหากมีเหตุผลบางอย่างที่คุณต้องการแทนที่ค่ว่ามันเป็นไปได้ด้วย


การแยกแบบอัตโนมัติไม่ได้ใช้การแยกความแตกต่างเชิงตัวเลขใช่หรือไม่
Aerin

@BYOR ไม่; ตรวจสอบลิงค์ Wikipedia ด้านบน แต่จริงๆแล้วสิ่งที่เทนเซอร์โฟลว์นั้นจริง ๆ แล้วอยู่ที่ไหนสักแห่งระหว่างออโต้โหมด "จริง" แบบย้อนกลับและความแตกต่างเชิงสัญลักษณ์
Dougal

@Dougal im โดยใช้โหมดกระตือรือร้นโดยไม่มีกราฟไม่มี tf.function decorator การแยกความแตกต่างอัตโนมัติรู้ความสัมพันธ์ระหว่างเทนเซอร์อย่างไร
datdinhquoc

1
@datdinhquoc มันเป็นอัลกอริทึมพื้นฐานเดียวกันเพียงเล็กน้อยของการใช้งานที่ซับซ้อน
Dougal

9

มันใช้ความแตกต่างอัตโนมัติ ที่ซึ่งมันใช้กฎลูกโซ่และย้อนกลับไปในกราฟที่กำหนดการไล่ระดับสี

สมมุติว่าเรามีเทนเซอร์ C เทนเซอร์นี้ทำขึ้นหลังจากการปฏิบัติการหลายชุดสมมติว่าโดยการเพิ่มการคูณการผ่านความไม่เชิงเส้นเป็นต้น

ดังนั้นหาก C นี้ขึ้นอยู่กับชุดของเทนเซอร์บางตัวที่เรียกว่า Xk เราจำเป็นต้องได้การไล่ระดับสี

Tensorflow ติดตามเส้นทางการปฏิบัติงานเสมอ ฉันหมายถึงพฤติกรรมต่อเนื่องของโหนดและการไหลของข้อมูลระหว่างพวกเขา ทำโดยกราฟ ป้อนคำอธิบายรูปภาพที่นี่

ถ้าเราจำเป็นต้องได้มาซึ่งการเปลี่ยนแปลงของค่าใช้จ่าย wrt X สิ่งที่สิ่งแรกที่จะทำคือมันโหลดพา ธ จากค่า x-input ไปยังค่าใช้จ่ายโดยขยายกราฟ

จากนั้นเริ่มต้นตามลำดับแม่น้ำ จากนั้นกระจายการไล่ระดับสีด้วยกฎลูกโซ่ (เหมือนกับ backpropagation)

วิธีใดก็ตามถ้าคุณอ่านซอร์สโค้ดนั้นเป็นของ tf.gradients () คุณจะพบว่าเทนเซอร์โฟลว์ได้ทำส่วนนี้ในการไล่ระดับสีในลักษณะที่ดี

ในขณะที่ backtracking tf โต้ตอบกับกราฟใน backword pass TF จะพบกับโหนดต่าง ๆ ภายในโหนดเหล่านี้มีการดำเนินการที่เราเรียกว่า (ops) matmal, softmax, relu, batch_normalization กราฟ

โหนดใหม่นี้ประกอบด้วยอนุพันธ์บางส่วนของการดำเนินการ get_gradient ()

ลองมาพูดคุยเกี่ยวกับโหนดที่เพิ่งเพิ่มเข้าไปใหม่

ภายในโหนดเหล่านี้เราเพิ่ม 2 สิ่ง 1. อนุพันธ์ที่เราคำนวณ ealier) 2. นอกจากนี้ยังมีอินพุตไปยังโพรเซสซิงออปชันในการส่งต่อ

ดังนั้นโดยกฎลูกโซ่เราสามารถคำนวณได้

ดังนั้นนี่เป็นเช่นเดียวกับ backword API

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

ดังนั้นเมื่อเรารู้ว่าเราต้องการตัวแปรส่งต่อเพื่อคำนวณการไล่ระดับสีดังนั้นเราจำเป็นต้องเก็บค่าอินเทอร์มิดิเนทไว้ในเทนเซอร์ซึ่งสามารถลดหน่วยความจำสำหรับการทำงานหลายอย่าง


1
ฉันกำลังใช้โหมดกระตือรือร้นไม่มีกราฟไม่มีมัณฑนากร tf.function ความแตกต่างอัตโนมัติจะทราบความสัมพันธ์ระหว่างเทนเซอร์อย่างไร
datdinhquoc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.