2016-03-16 23 views
5

Tôi bắt đầu với việc thực hiện đơn giản của biến gốc tuyến tính biến duy nhất nhưng không biết để mở rộng nó vào thuật toán gốc đa biến stochastic gradient?Làm thế nào để thực hiện thuật toán gốc ngẫu nhiên tuyến tính ngẫu nhiên đa biến trong dòng tensorflow?

Độc biến tuyến tính hồi quy

import tensorflow as tf 
import numpy as np 

# create random data 
x_data = np.random.rand(100).astype(np.float32) 
y_data = x_data * 0.5 

# Find values for W that compute y_data = W * x_data 
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) 
y = W * x_data 

# Minimize the mean squared errors. 
loss = tf.reduce_mean(tf.square(y - y_data)) 
optimizer = tf.train.GradientDescentOptimizer(0.01) 
train = optimizer.minimize(loss) 

# Before starting, initialize the variables 
init = tf.initialize_all_variables() 

# Launch the graph. 
sess = tf.Session() 
sess.run(init) 

# Fit the line. 
for step in xrange(2001): 
    sess.run(train) 
    if step % 200 == 0: 
     print(step, sess.run(W)) 

Trả lời

7

Bạn có hai phần trong câu hỏi của bạn:

  • Làm thế nào để thay đổi vấn đề này với một không gian chiều cao.
  • Làm thế nào để thay đổi từ độ dốc hàng loạt gốc xuống gốc gốc ngẫu nhiên.

Để có cài đặt chiều cao hơn, bạn có thể xác định vấn đề tuyến tính của mình y = <x, w>. Sau đó, bạn chỉ cần thay đổi thứ nguyên của Biến số W để khớp với một trong số w và thay thế phép nhân W*x_data bằng sản phẩm vô hướng tf.matmul(x_data, W) và mã của bạn sẽ chạy tốt.

Để thay đổi phương thức học thành gốc gốc ngẫu nhiên, bạn cần trừu tượng hóa đầu vào của hàm chi phí bằng cách sử dụng tf.placeholder.
Khi bạn đã xác định Xy_ để giữ đầu vào của mình ở mỗi bước, bạn có thể tạo cùng một chức năng chi phí. Sau đó, bạn cần phải gọi cho bước của bạn bằng cách cho ăn một lô nhỏ dữ liệu thích hợp.

Dưới đây là ví dụ về cách bạn có thể thực hiện hành vi như vậy và nó sẽ cho thấy rằng W nhanh chóng hội tụ thành w.

import tensorflow as tf 
import numpy as np 

# Define dimensions 
d = 10  # Size of the parameter space 
N = 1000 # Number of data sample 

# create random data 
w = .5*np.ones(d) 
x_data = np.random.random((N, d)).astype(np.float32) 
y_data = x_data.dot(w).reshape((-1, 1)) 

# Define placeholders to feed mini_batches 
X = tf.placeholder(tf.float32, shape=[None, d], name='X') 
y_ = tf.placeholder(tf.float32, shape=[None, 1], name='y') 

# Find values for W that compute y_data = <x, W> 
W = tf.Variable(tf.random_uniform([d, 1], -1.0, 1.0)) 
y = tf.matmul(X, W, name='y_pred') 

# Minimize the mean squared errors. 
loss = tf.reduce_mean(tf.square(y_ - y)) 
optimizer = tf.train.GradientDescentOptimizer(0.01) 
train = optimizer.minimize(loss) 

# Before starting, initialize the variables 
init = tf.initialize_all_variables() 

# Launch the graph. 
sess = tf.Session() 
sess.run(init) 

# Fit the line. 
mini_batch_size = 100 
n_batch = N // mini_batch_size + (N % mini_batch_size != 0) 
for step in range(2001): 
    i_batch = (step % n_batch)*mini_batch_size 
    batch = x_data[i_batch:i_batch+mini_batch_size], y_data[i_batch:i_batch+mini_batch_size] 
    sess.run(train, feed_dict={X: batch[0], y_: batch[1]}) 
    if step % 200 == 0: 
     print(step, sess.run(W)) 

Hai lưu ý phụ:

  • Việc thực hiện dưới đây được gọi là mini-lô gradient descent như tại mỗi bước, gradient được tính bằng một tập hợp các dữ liệu của chúng ta về kích thước mini_batch_size. Đây là một biến thể từ gốc dốc ngẫu nhiên thường được sử dụng để ổn định ước lượng gradient ở mỗi bước. Có thể thu được độ dốc gốc ngẫu nhiên bằng cách thiết lập mini_batch_size = 1.

  • Tập dữ liệu có thể xáo trộn ở mọi thời đại để có được triển khai gần hơn với việc xem xét lý thuyết. Một số công việc gần đây cũng chỉ xem xét việc sử dụng một lần thông qua tập dữ liệu của bạn vì nó ngăn chặn quá phù hợp. Để có giải thích chi tiết và toán học hơn, bạn có thể xem Bottou12. Điều này có thể dễ dàng thay đổi theo thiết lập vấn đề của bạn và thuộc tính thống kê mà bạn đang tìm kiếm.

+0

Chúng tôi không phải ngẫu nhiên trộn dữ liệu ở mỗi bước? –

+0

Theo bài viết wikipedia, đối với phiên bản lặp lại chúng tôi phải lặp lại mỗi lần thực hiện đào tạo tại mọi điểm, mặc dù đào tạo chỉ mất một hoặc nhiều điểm dữ liệu để cập nhật –

+0

Tôi không thể nhận được những gì bạn đã làm trong dòng n_batch = N // 100 + (N% 100! = 0) –

Các vấn đề liên quan