Theano - ตัวอย่างการฝึกอบรมเล็กน้อย

Theano ค่อนข้างมีประโยชน์ในการฝึกโครงข่ายประสาทเทียมที่เราต้องคำนวณต้นทุนซ้ำ ๆ และไล่ระดับสีเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด ในชุดข้อมูลขนาดใหญ่จะมีการคำนวณอย่างเข้มข้น Theano ทำได้อย่างมีประสิทธิภาพเนื่องจากการเพิ่มประสิทธิภาพภายในของกราฟการคำนวณที่เราได้เห็นก่อนหน้านี้

คำชี้แจงปัญหา

ตอนนี้เราจะเรียนรู้วิธีใช้ห้องสมุด Theano เพื่อฝึกอบรมเครือข่าย เราจะใช้กรณีง่ายๆที่เราเริ่มต้นด้วยชุดข้อมูลคุณลักษณะสี่ชุด เราคำนวณผลรวมของคุณลักษณะเหล่านี้หลังจากใช้น้ำหนัก (ความสำคัญ) ที่แน่นอนกับแต่ละคุณลักษณะ

เป้าหมายของการฝึกคือการปรับเปลี่ยนน้ำหนักที่กำหนดให้กับแต่ละคุณสมบัติเพื่อให้ผลรวมมีค่าตามเป้าหมายที่ 100

sum = f1 * w1 + f2 * w2 + f3 * w3 + f4 * w4

ที่ไหน f1, f2, ... คือค่าคุณลักษณะและ w1, w2, ... คือน้ำหนัก

ให้ฉันหาตัวอย่างเชิงปริมาณเพื่อความเข้าใจที่ดีขึ้นเกี่ยวกับคำชี้แจงปัญหา เราจะถือว่าค่าเริ่มต้นเป็น 1.0 สำหรับแต่ละคุณสมบัติและเราจะใช้ w1 เท่ากับ0.1, w2 เท่ากับ 0.25, w3 เท่ากับ 0.15และ w4 เท่ากับ 0.3. ไม่มีตรรกะที่แน่นอนในการกำหนดค่าน้ำหนักมันเป็นเพียงสัญชาตญาณของเรา ดังนั้นผลรวมเริ่มต้นจึงเป็นดังนี้ -

sum = 1.0 * 0.1 + 1.0 * 0.25 + 1.0 * 0.15 + 1.0 * 0.3

ซึ่งรวมถึง 0.8. ตอนนี้เราจะปรับเปลี่ยนการกำหนดน้ำหนักเพื่อให้ผลรวมเข้าใกล้ 100 ค่าผลลัพธ์ปัจจุบันของ0.8 อยู่ห่างจากค่าเป้าหมายที่เราต้องการคือ 100 ในแง่ Machine Learning เรากำหนด costเนื่องจากความแตกต่างระหว่างค่าเป้าหมายลบด้วยค่าเอาต์พุตปัจจุบันโดยทั่วไปจะยกกำลังสองเพื่อระเบิดข้อผิดพลาด เราลดต้นทุนนี้ในการวนซ้ำแต่ละครั้งโดยคำนวณการไล่ระดับสีและอัปเดตเวกเตอร์น้ำหนักของเรา

ให้เราดูว่าตรรกะทั้งหมดนี้ถูกนำไปใช้ใน Theano อย่างไร

การประกาศตัวแปร

ก่อนอื่นเราประกาศเวกเตอร์อินพุต x ดังนี้ -

x = tensor.fvector('x')

ที่ไหน x คืออาร์เรย์มิติเดียวของค่าลอย

เรากำหนดสเกลาร์ target ตัวแปรตามที่ระบุด้านล่าง -

target = tensor.fscalar('target')

ต่อไปเราจะสร้างน้ำหนักเทนเซอร์ W ด้วยค่าเริ่มต้นตามที่กล่าวไว้ข้างต้น -

W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')

นิยาม Theano Expression

ตอนนี้เราคำนวณผลลัพธ์โดยใช้นิพจน์ต่อไปนี้ -

y = (x * W).sum()

โปรดสังเกตว่าในข้อความข้างต้น x และ Wเป็นเวกเตอร์ไม่ใช่ตัวแปรสเกลาร์ธรรมดา ตอนนี้เราคำนวณข้อผิดพลาด (ต้นทุน) ด้วยนิพจน์ต่อไปนี้ -

cost = tensor.sqr(target - y)

ต้นทุนคือความแตกต่างระหว่างมูลค่าเป้าหมายและผลลัพธ์ปัจจุบันกำลังสอง

ในการคำนวณการไล่ระดับสีซึ่งบอกเราว่าเราอยู่ห่างจากเป้าหมายมากแค่ไหนเราใช้บิวท์อิน grad วิธีการดังนี้ -

gradients = tensor.grad(cost, [W])

ตอนนี้เราอัปเดตไฟล์ weights เวกเตอร์โดยใช้อัตราการเรียนรู้ของ 0.1 ดังต่อไปนี้ -

W_updated = W - (0.1 * gradients[0])

ต่อไปเราต้องอัปเดตเวกเตอร์น้ำหนักของเราโดยใช้ค่าข้างต้น เราทำสิ่งนี้ในข้อความต่อไปนี้ -

updates = [(W, W_updated)]

การกำหนด / เรียกใช้ฟังก์ชัน Theano

สุดท้ายเรากำหนด function ใน Theano เพื่อคำนวณผลรวม

f = function([x, target], y, updates=updates)

หากต้องการเรียกใช้ฟังก์ชันข้างต้นเป็นจำนวนครั้งเราจะสร้างไฟล์ for วนดังนี้ -

for i in range(10):
output = f([1.0, 1.0, 1.0, 1.0], 100.0)

ดังที่ได้กล่าวไว้ก่อนหน้านี้อินพุตของฟังก์ชันคือเวกเตอร์ที่มีค่าเริ่มต้นสำหรับคุณสมบัติทั้งสี่ - เรากำหนดค่าของ 1.0ไปยังแต่ละคุณลักษณะโดยไม่มีเหตุผลเฉพาะเจาะจง คุณอาจกำหนดค่าต่างๆที่คุณเลือกและตรวจสอบว่าฟังก์ชันมาบรรจบกันในท้ายที่สุดหรือไม่ เราจะพิมพ์ค่าของเวกเตอร์น้ำหนักและผลลัพธ์ที่สอดคล้องกันในการทำซ้ำแต่ละครั้ง แสดงในรหัสด้านล่าง -

print ("iteration: ", i)
print ("Modified Weights: ", W.get_value())
print ("Output: ", output)

รายชื่อโปรแกรมเต็ม

รายชื่อโปรแกรมทั้งหมดจะถูกทำซ้ำที่นี่เพื่อการอ้างอิงอย่างรวดเร็วของคุณ -

from theano import *
import numpy

x = tensor.fvector('x')
target = tensor.fscalar('target')

W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')
print ("Weights: ", W.get_value())

y = (x * W).sum()
cost = tensor.sqr(target - y)
gradients = tensor.grad(cost, [W])
W_updated = W - (0.1 * gradients[0])
updates = [(W, W_updated)]

f = function([x, target], y, updates=updates)
for i in range(10):
   output = f([1.0, 1.0, 1.0, 1.0], 100.0)
   print ("iteration: ", i)
   print ("Modified Weights: ", W.get_value())
   print ("Output: ", output)

เมื่อคุณรันโปรแกรมคุณจะเห็นผลลัพธ์ต่อไปนี้ -

Weights: [0.1 0.25 0.15 0.3 ]
iteration: 0
Modified Weights: [19.94 20.09 19.99 20.14]
Output: 0.8
iteration: 1
Modified Weights: [23.908 24.058 23.958 24.108]
Output: 80.16000000000001
iteration: 2
Modified Weights: [24.7016 24.8516 24.7516 24.9016]
Output: 96.03200000000001
iteration: 3
Modified Weights: [24.86032 25.01032 24.91032 25.06032]
Output: 99.2064
iteration: 4
Modified Weights: [24.892064 25.042064 24.942064 25.092064]
Output: 99.84128
iteration: 5
Modified Weights: [24.8984128 25.0484128 24.9484128 25.0984128]
Output: 99.968256
iteration: 6
Modified Weights: [24.89968256 25.04968256 24.94968256 25.09968256]
Output: 99.9936512
iteration: 7
Modified Weights: [24.89993651 25.04993651 24.94993651 25.09993651]
Output: 99.99873024
iteration: 8
Modified Weights: [24.8999873 25.0499873 24.9499873 25.0999873]
Output: 99.99974604799999
iteration: 9
Modified Weights: [24.89999746 25.04999746 24.94999746 25.09999746]
Output: 99.99994920960002

สังเกตว่าหลังจากการทำซ้ำสี่ครั้งผลลัพธ์คือ 99.96 และหลังจากทำซ้ำห้าครั้งก็เป็นเช่นนั้น 99.99ซึ่งใกล้เคียงกับเป้าหมายที่เราต้องการ 100.0.

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

iteration: 5
Modified Weights: [24.8984128 25.0484128 24.9484128 25.0984128]

ตอนนี้คุณสามารถใช้ค่าเหล่านี้ในเครือข่ายของคุณเพื่อปรับใช้โมเดล