Theano - Ví dụ về đào tạo tầm thường
Theano khá hữu ích trong việc đào tạo mạng nơ-ron nơi chúng ta phải tính toán nhiều lần chi phí và độ dốc để đạt được mức tối ưu. Trên các bộ dữ liệu lớn, điều này trở nên chuyên sâu về mặt tính toán. Theano thực hiện điều này một cách hiệu quả do các tối ưu hóa nội bộ của đồ thị tính toán mà chúng ta đã thấy trước đó.
Báo cáo vấn đề
Bây giờ chúng ta sẽ học cách sử dụng thư viện Theano để đào tạo một mạng. Chúng ta sẽ lấy một trường hợp đơn giản khi chúng ta bắt đầu với tập dữ liệu bốn tính năng. Chúng tôi tính tổng các tính năng này sau khi áp dụng một trọng số (tầm quan trọng) nhất định cho mỗi tính năng.
Mục tiêu của khóa đào tạo là sửa đổi trọng số được chỉ định cho từng đối tượng địa lý để tổng đạt giá trị mục tiêu là 100.
sum = f1 * w1 + f2 * w2 + f3 * w3 + f4 * w4
Ở đâu f1, f2, ... là các giá trị tính năng và w1, w2, ... là các trọng số.
Hãy để tôi lượng hóa ví dụ để hiểu rõ hơn về câu lệnh vấn đề. Chúng tôi sẽ giả định giá trị ban đầu là 1,0 cho mỗi tính năng và chúng tôi sẽ lấy w1 bằng0.1, w2 bằng 0.25, w3 bằng 0.15và w4 bằng 0.3. Không có logic nhất định trong việc ấn định các giá trị trọng số, nó chỉ là trực giác của chúng ta. Do đó, tổng ban đầu như sau:
sum = 1.0 * 0.1 + 1.0 * 0.25 + 1.0 * 0.15 + 1.0 * 0.3
Tổng số tiền là 0.8. Bây giờ, chúng ta sẽ tiếp tục sửa đổi phép gán trọng số để tổng này đạt tới 100. Giá trị kết quả hiện tại của0.8 cách xa giá trị mục tiêu mong muốn của chúng tôi là 100. Theo thuật ngữ Học máy, chúng tôi xác định costlà sự khác biệt giữa giá trị đích trừ đi giá trị đầu ra hiện tại, thường được bình phương để giải quyết lỗi. Chúng tôi giảm chi phí này trong mỗi lần lặp bằng cách tính toán độ dốc và cập nhật vectơ trọng số của chúng tôi.
Hãy để chúng tôi xem toàn bộ logic này được thực hiện như thế nào trong Theano.
Khai báo các biến
Đầu tiên chúng ta khai báo vector đầu vào x như sau:
x = tensor.fvector('x')
Ở đâu x là một mảng các giá trị float đơn chiều.
Chúng tôi xác định một đại lượng vô hướng target biến như được đưa ra bên dưới -
target = tensor.fscalar('target')
Tiếp theo, chúng tôi tạo một tensor trọng số W với các giá trị ban đầu như đã thảo luận ở trên -
W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')
Xác định Biểu thức Theano
Bây giờ chúng ta tính toán đầu ra bằng cách sử dụng biểu thức sau:
y = (x * W).sum()
Lưu ý rằng trong câu lệnh trên x và Wlà các vectơ và không phải là các biến vô hướng đơn giản. Bây giờ chúng ta tính toán sai số (chi phí) với biểu thức sau:
cost = tensor.sqr(target - y)
Chi phí là sự khác biệt giữa giá trị mục tiêu và sản lượng hiện tại, bình phương.
Để tính toán độ dốc cho chúng ta biết chúng ta còn cách mục tiêu bao xa, chúng ta sử dụng grad phương pháp như sau -
gradients = tensor.grad(cost, [W])
Bây giờ chúng tôi cập nhật weights vectơ bằng cách lấy tốc độ học là 0.1 như sau -
W_updated = W - (0.1 * gradients[0])
Tiếp theo, chúng ta cần cập nhật vectơ trọng số của mình bằng cách sử dụng các giá trị trên. Chúng tôi thực hiện điều này trong tuyên bố sau:
updates = [(W, W_updated)]
Xác định / Gọi hàm Theano
Cuối cùng, chúng tôi xác định một function trong Theano để tính tổng.
f = function([x, target], y, updates=updates)
Để gọi hàm trên một số lần nhất định, chúng ta tạo for vòng lặp như sau -
for i in range(10):
output = f([1.0, 1.0, 1.0, 1.0], 100.0)
Như đã nói trước đó, đầu vào cho hàm là một vectơ chứa các giá trị ban đầu cho bốn đối tượng - chúng tôi gán giá trị của 1.0cho mỗi tính năng mà không có bất kỳ lý do cụ thể Bạn có thể gán các giá trị khác nhau mà bạn chọn và kiểm tra xem cuối cùng hàm có hội tụ hay không. Chúng tôi sẽ in các giá trị của vector trọng số và đầu ra tương ứng trong mỗi lần lặp. Nó được hiển thị trong đoạn mã dưới đây -
print ("iteration: ", i)
print ("Modified Weights: ", W.get_value())
print ("Output: ", output)
Danh sách đầy đủ chương trình
Danh sách chương trình đầy đủ được sao chép ở đây để bạn tham khảo nhanh -
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)
Khi bạn chạy chương trình, bạn sẽ thấy kết quả sau:
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
Quan sát rằng sau bốn lần lặp lại, kết quả đầu ra là 99.96 và sau năm lần lặp lại, nó là 99.99, gần với mục tiêu mong muốn của chúng tôi là 100.0.
Tùy thuộc vào độ chính xác mong muốn, bạn có thể kết luận một cách an toàn rằng mạng được huấn luyện trong 4 đến 5 lần lặp. Sau khi quá trình huấn luyện hoàn thành, hãy tra cứu vectơ trọng số, sau 5 lần lặp sẽ nhận các giá trị sau:
iteration: 5
Modified Weights: [24.8984128 25.0484128 24.9484128 25.0984128]
Bây giờ bạn có thể sử dụng các giá trị này trong mạng của mình để triển khai mô hình.