2015-11-15 4 views
28

एक खिलौना उदाहरण के रूप में मैं 100 नो-शोर डेटा पॉइंट्स से f(x) = 1/x फ़ंक्शन फिट करने का प्रयास कर रहा हूं। Matlab डिफ़ॉल्ट कार्यान्वयन औसत वर्ग अंतर ~ 10^-10 के साथ असाधारण रूप से सफल है, और पूरी तरह से interpolates।यह टेंसरफ्लो कार्यान्वयन Matlab के एनएन की तुलना में काफी कम सफल क्यों है?

मैं 10 सिग्मोइड न्यूरॉन्स की एक छिपी हुई परत के साथ एक तंत्रिका नेटवर्क को लागू करता हूं। मैं तंत्रिका नेटवर्क पर एक नौसिखिया हूं इसलिए गूंगा कोड के खिलाफ अपने गार्ड पर रहो।

import tensorflow as tf 
import numpy as np 

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 

#Can't make tensorflow consume ordinary lists unless they're parsed to ndarray 
def toNd(lst): 
    lgt = len(lst) 
    x = np.zeros((1, lgt), dtype='float32') 
    for i in range(0, lgt): 
     x[0,i] = lst[i] 
    return x 

xBasic = np.linspace(0.2, 0.8, 101) 
xTrain = toNd(xBasic) 
yTrain = toNd(map(lambda x: 1/x, xBasic)) 

x = tf.placeholder("float", [1,None]) 
hiddenDim = 10 

b = bias_variable([hiddenDim,1]) 
W = weight_variable([hiddenDim, 1]) 

b2 = bias_variable([1]) 
W2 = weight_variable([1, hiddenDim]) 

hidden = tf.nn.sigmoid(tf.matmul(W, x) + b) 
y = tf.matmul(W2, hidden) + b2 

# Minimize the squared errors. 
loss = tf.reduce_mean(tf.square(y - yTrain)) 
optimizer = tf.train.GradientDescentOptimizer(0.5) 
train = optimizer.minimize(loss) 

# For initializing the variables. 
init = tf.initialize_all_variables() 

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

for step in xrange(0, 4001): 
    train.run({x: xTrain}, sess) 
    if step % 500 == 0: 
     print loss.eval({x: xTrain}, sess) 

मीन स्क्वायर अंतर ~ 2 * 10^-3 पर समाप्त होता है, इसलिए मैटलैब की तुलना में परिमाण के 7 ऑर्डर खराब होते हैं।

xTest = np.linspace(0.2, 0.8, 1001) 
yTest = y.eval({x:toNd(xTest)}, sess) 
import matplotlib.pyplot as plt 
plt.plot(xTest,yTest.transpose().tolist()) 
plt.plot(xTest,map(lambda x: 1/x, xTest)) 
plt.show() 

हम फिट देख सकते हैं साथ विज्युअलाइजिंग व्यवस्थित अपूर्ण है: enter image description here जबकि matlab एक मतभेद समान रूप से < 10^-5 के साथ नग्न आंखों के लिए एकदम सही लग रहा है: enter image description here मैं के साथ दोहराने की कोशिश की है मैटलैब नेटवर्क का चित्र TensorFlow:

enter image description here

संयोग से, आरेख अवग्रह एक्टिवा के बजाय एक tanh मतलब लगता है टयन समारोह। मुझे यह सुनिश्चित करने के लिए दस्तावेज़ में कहीं भी नहीं मिल रहा है। हालांकि, जब मैं टेंसरफ्लो में एक तनह न्यूरॉन का उपयोग करने का प्रयास करता हूं तो फिटिंग जल्दी से nan के साथ चर के लिए विफल रहता है। मुझे नहीं पता क्यों।

मैटलैब लेवेनबर्ग-मार्वार्ड प्रशिक्षण एल्गोरिदम का उपयोग करता है। Bayesian नियमितकरण 10^-12 पर औसत वर्गों के साथ और भी सफल है (हम शायद फ्लोट अंकगणित के वाष्प के क्षेत्र में हैं)।

टेंसरफ्लो कार्यान्वयन इतना खराब क्यों है, और मैं इसे बेहतर बनाने के लिए क्या कर सकता हूं?

+0

मैंने अभी तक टेंसर प्रवाह में नहीं देखा है, इसलिए इसके बारे में खेद है, लेकिन आप उस 'toNd' फ़ंक्शन के साथ कुछ विचित्र चीजें कर रहे हैं। 'एनपी।लिंस्पेस पहले से ही एक ndarray लौटाता है, एक सूची नहीं, अगर आप एक सूची को एक एनन्ड्रे में परिवर्तित करना चाहते हैं, तो आपको केवल 'np.array (my_list)' करना है, और यदि आपको अतिरिक्त अक्ष की आवश्यकता है, तो आप कर सकते हैं 'new_array = my_array [np.newaxis,:]'। यह सिर्फ शून्य त्रुटि से कम हो सकता है क्योंकि ऐसा करना है। अधिकांश डेटा में शोर होता है और आप जरूरी नहीं कि शून्य प्रशिक्षण त्रुटि चाहते हैं। 'Reduce_mean' द्वारा निर्णय, यह क्रॉस-सत्यापन का उपयोग कर सकता है। –

+0

@AdamAcosta 'toNd' निश्चित रूप से अनुभव की कमी के लिए एक स्टॉप-गैप है। मैंने पहले 'np.array' की कोशिश की और समस्या यह प्रतीत होती है कि' np.array ([5,7])। आकार' '(2,)' और '(2,1)' नहीं है। 'my_array [np.newaxis,:] 'यह सही करने के लिए प्रतीत होता है, धन्यवाद! मैं अजगर का उपयोग नहीं करता बल्कि एफ # दिन-प्रतिदिन का उपयोग नहीं करता हूं। – Arbil

+0

@AdamAcostaI मुझे नहीं लगता कि 'reduce_mean' क्रॉस-सत्यापन करता है। दस्तावेज़ों से: 'टेंसर के आयामों के तत्वों के माध्य की गणना करता है'। Matlab पार-सत्यापन करता है जो मेरे दिमाग में कोई क्रॉस-सत्यापन की तुलना में प्रशिक्षण नमूना पर फिट को कम करना चाहिए, क्या यह सही है? – Arbil

उत्तर

23

मैंने 50000 पुनरावृत्तियों के लिए प्रशिक्षण की कोशिश की जो इसे 0.00012 त्रुटि मिली। टेस्ला के 40 में लगभग 180 सेकंड लगते हैं।

enter image description here

ऐसा लगता है कि इस तरह की समस्या के लिए, पहले के आदेश ढाल वंश एक अच्छा फिट (यमक इरादा) नहीं है, और आप Levenberg-Marquardt या एल-BFGS की जरूरत है। मुझे नहीं लगता कि किसी ने उन्हें अभी तक टेंसरफ्लो में लागू किया है।

इस समस्या के लिए tf.train.AdamOptimizer(0.1) का उपयोग करें। 4000 पुनरावृत्तियों के बाद यह 3.13729e-05 तक पहुंच जाता है। साथ ही, डिफ़ॉल्ट रणनीति के साथ जीपीयू भी इस समस्या के लिए एक बुरा विचार लगता है। कई छोटे ऑपरेशन हैं और ओवरहेड जीपीयू संस्करण को मेरी मशीन पर सीपीयू की तुलना में 3x धीमी गति से चलाने का कारण बनता है।

+0

इसे जांचने के लिए धन्यवाद। क्या आपका मतलब है कि मेरे 5000 लूप, तो 20 एम बुनियादी प्रशिक्षण चलता है? क्या आप पुष्टि कर सकते हैं कि छुपे हुए परत को तनह न्यूरॉन्स में बदलते समय यह विफल हो जाता है, और यदि ऐसा है, तो क्या आप जानते हैं कि ऐसा क्यों होता है? – Arbil

+1

मैंने अभी आपके xrange (4001) को xrange (5000) में बदल दिया है। तनह के लिए, यह सीखने की दर 0.5 के साथ प्रशिक्षण विचलन की तरह दिखता है। सामान्य रूप से ढाल वंश के लिए आपको प्रत्येक समस्या के लिए अपनी सीखने की दर को ट्यून करने की आवश्यकता होती है, ऐसा लगता है कि अगर मैं tf.train.GradientDescentOptimizer (0.1) –

+0

करता हूं तो मैं ढाल पैरामीटर के बारे में देखता हूं। यह बहुत अजीब xrange (0, 5000) आपको 4k रेंज की तुलना में बेहतर सटीकता का क्रम देता है और इसमें GPU पर 180s लगते हैं। मैं सटीकता अपरिवर्तित के साथ सीपीयू पर एक ही रेंज चलाता हूं और इसमें 10 से कम समय लगता है। – Arbil

16

बीटीडब्ल्यू, यहां उपरोक्त का थोड़ा साफ संस्करण है जो कुछ आकार के मुद्दों को साफ करता है और टीएफ और एनपी के बीच अनावश्यक बाउंसिंग करता है। यह 40k चरणों के बाद 3E-08 को प्राप्त होता है, या के बारे में 1.5e-5 4000 के बाद:

import tensorflow as tf 
import numpy as np 

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 

xTrain = np.linspace(0.2, 0.8, 101).reshape([1, -1]) 
yTrain = (1/xTrain) 

x = tf.placeholder(tf.float32, [1,None]) 
hiddenDim = 10 

b = bias_variable([hiddenDim,1]) 
W = weight_variable([hiddenDim, 1]) 

b2 = bias_variable([1]) 
W2 = weight_variable([1, hiddenDim]) 

hidden = tf.nn.sigmoid(tf.matmul(W, x) + b) 
y = tf.matmul(W2, hidden) + b2 

# Minimize the squared errors.                 
loss = tf.reduce_mean(tf.square(y - yTrain)) 
step = tf.Variable(0, trainable=False) 
rate = tf.train.exponential_decay(0.15, step, 1, 0.9999) 
optimizer = tf.train.AdamOptimizer(rate) 
train = optimizer.minimize(loss, global_step=step) 
init = tf.initialize_all_variables() 

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

for step in xrange(0, 40001): 
    train.run({x: xTrain}, sess) 
    if step % 500 == 0: 
     print loss.eval({x: xTrain}, sess) 

सब ने कहा, यह शायद बहुत आश्चर्य की बात नहीं है कि LMA एक फिटिंग के लिए एक अधिक सामान्य DNN शैली अनुकूलक की तुलना में बेहतर कर रहा है 2 डी वक्र। एडम और बाकी बहुत उच्च आयामी समस्याओं को लक्षित कर रहे हैं, और LMA starts to get glacially slow for very large networks (12-15 देखें)।

संबंधित मुद्दे