2017-03-28 4 views
9

के लिए टेन्सफोर्लो में 'इष्टतम' चर प्रारंभिकरण और सीखने की दर मैं मैन्स्रिक्स कारककरण की समस्या - टेन्सफोर्लो में एक बहुत ही सरल अनुकूलन की कोशिश कर रहा हूं। एक मैट्रिक्स V (m X n) को देखते हुए, इसे W (m X r) और में विघटित करें। मैं here से मैट्रिक्स कारककरण के लिए एक ढाल वंश आधारित टेन्सफोर्लो आधारित कार्यान्वयन उधार ले रहा हूं।मैट्रिक्स कारककरण

मैट्रिक्स वी अपने मूल रूप में के बारे में विवरण, प्रविष्टियों की हिस्टोग्राम के रूप में किया जाएगा इस प्रकार है: enter image description here

की [0, 1], मैं निम्नलिखित पूर्व प्रसंस्करण प्रदर्शन के पैमाने पर प्रविष्टियों लाने के लिए।

f(x) = f(x)-min(V)/(max(V)-min(V)) 

सामान्य करने के बाद, डेटा के हिस्टोग्राम की तरह लग रहे हैं निम्नलिखित: enter image description here

मेरे प्रश्न हैं:

  1. डेटा की प्रकृति को देखते हुए: 0 और 1 और सबसे करीब प्रविष्टियों के बीच 1 से 0 तक, W और H के लिए इष्टतम प्रारंभिकता क्या होगी?
  2. विभिन्न लागत फ़ंक्शन के आधार पर सीखने की दर को कैसे परिभाषित किया जाना चाहिए: |A-WH|_F और |(A-WH)/A|?

न्यूनतम काम कर उदाहरण के रूप में निम्नानुसार होगा:

import tensorflow as tf 
import numpy as np 
import pandas as pd 

V_df = pd.DataFrame([[3, 4, 5, 2], 
       [4, 4, 3, 3], 
       [5, 5, 4, 4]], dtype=np.float32).T 

इस प्रकार, V_df लगता है:

0 1 2 
0 3.0 4.0 5.0 
1 4.0 4.0 5.0 
2 5.0 3.0 4.0 
3 2.0 3.0 4.0 

अब, कोड को परिभाषित डब्ल्यू, एच

V = tf.constant(V_df.values) 
shape = V_df.shape 
rank = 2 #latent factors 

initializer = tf.random_normal_initializer(mean=V_df.mean().mean()/5,stddev=0.1) 
#initializer = tf.random_uniform_initializer(maxval=V_df.max().max()) 

H = tf.get_variable("H", [rank, shape[1]], 
           initializer=initializer) 
W = tf.get_variable(name="W", shape=[shape[0], rank], 
           initializer=initializer) 
WH = tf.matmul(W, H) 

लागत और अनुकूलक को परिभाषित करना:

f_norm = tf.reduce_sum(tf.pow(V - WH, 2)) 
lr = 0.01 
optimize = tf.train.AdagradOptimizer(lr).minimize(f_norm) 

सत्र चल रहा है:

max_iter=10000 
display_step = 50 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

    for i in xrange(max_iter): 

     loss, _ = sess.run([f_norm, optimize]) 
     if i%display_step==0: 
      print loss, i 
    W_out = sess.run(W) 
    H_out = sess.run(H) 
    WH_out = sess.run(WH) 

मैंने महसूस किया कि जब मैं initializer = tf.random_uniform_initializer(maxval=V_df.max().max()) की तरह कुछ के लिए इस्तेमाल किया, मैं मैट्रिक्स डब्ल्यू और एच ऐसे मिल गया है कि उनके उत्पाद वी की तुलना में काफी अधिक था मैं भी महसूस किया कि सीखने दर रखने (lr) .0001 होने के लिए शायद बहुत धीमी थी।

मैं सोच रहा था कि मैट्रिक्स कारककरण की समस्या के लिए अच्छी शुरुआत और सीखने की दर को परिभाषित करने के लिए अंगूठे के नियम हैं या नहीं।

+2

प्रश्न बहुत है अच्छी तरह से उजागर, लेकिन आईएमओ यह विषय है। सीखने की दर और प्रारंभिक matrices की तरह ट्यूनिंग पैरामीटर, आमतौर पर संबोधित समस्या पर निर्भर करता है, और आप अनुकूलक दस्तावेज में प्रदान की तुलना में बेहतर ** राय ** नहीं मिलेगा। – rll

+0

@ आरएल: मैं आपके बिंदु को समझता हूं। मैंने इस सवाल को संपादित किया है और इस समस्या में शामिल डेटा की सटीक प्रकृति के बारे में अधिक जानकारी प्रदान की है। मुझे लगता है कि ऐसी सेटिंग्स काफी आम हो सकती हैं (0 और 1 के बीच सामान्यीकृत डेटा) –

+2

मैं आरएल के साथ सहमत हूं - इष्टतम सीखने की दर और प्रारंभिक matrices आपके पर निर्भर करता है डेटा/समस्या कथन और अक्सर आपके मॉडल से सर्वश्रेष्ठ प्रदर्शन प्राप्त करने के लिए मैन्युअल ट्यूनिंग की आवश्यकता होती है। वैसे, आपके द्वारा लिंक किए गए कोड उदाहरण में, वे गैर-नकारात्मक मैट्रिक्स कारककरण को हल कर रहे हैं। क्या आपके पास 'डब्ल्यू' और/या 'एच' पर भी यह बाधा है या क्या 'डब्ल्यू' और 'एच 'मनमाने ढंग से matrices हो सकता है? – kaufmanu

उत्तर

1

मुझे लगता है कि सीखने की दर का परीक्षण परीक्षण और त्रुटि का एक अनुभवजन्य मुद्दा है, जब तक कि आप इष्टतम मूल्यों को खोजने के लिए दूसरा एल्गोरिदम नहीं लगाते। गणना के लिए आपके पास कितना समय है, यह आपके द्वारा उपलब्ध कंप्यूटिंग संसाधनों के आधार पर यह एक व्यावहारिक चिंता भी है।

हालांकि, प्रारंभिकरण और सीखने की दर निर्धारित करते समय सावधान रहना चाहिए क्योंकि मशीन सीखने की समस्या के आधार पर कुछ मूल्य कभी एकत्र नहीं होंगे। अंगूठे का एक नियम मैन्युअल रूप से 3 के चरणों में परिमाण को बदलना है और 10 (एंड्रयू एनजी के अनुसार): 0.1 से 1.0 तक जाने की बजाय, आप 0.1 से 0.3 तक जाएंगे।

आपके विशिष्ट डेटा के लिए जो 0 के पास कई मान रखता है, विशिष्ट "परिकल्पना"/मॉडल दिए गए इष्टतम प्रारंभिक मानों को ढूंढना संभव है। हालांकि, आपको "इष्टतम" परिभाषित करने की आवश्यकता है। विधि जितनी जल्दी संभव हो सके, यथासंभव सटीक, या इन चरम सीमाओं के बीच कुछ मध्यबिंदु होना चाहिए? (सटीक समाधान की तलाश करते समय शुद्धता हमेशा एक समस्या नहीं होती है। हालांकि, नियम को रोकने और त्रुटियों को कम करने के मानदंडों के परिणाम को प्रभावित कर सकते हैं।)

भले ही आपको इस सेट के लिए इष्टतम पैरामीटर मिलते हैं डेटा, आपको अन्य डेटा सेट के लिए एक ही फॉर्मूला का उपयोग करने में समस्या हो सकती है। यदि आप एक अलग समस्या के लिए एक ही पैरामीटर का उपयोग करना चाहते हैं, तो आप सामान्यीकरण को खो देंगे, जब तक कि आपके पास अन्य डेटा सेटों को समान वितरण का पालन करने की अपेक्षा करने के मजबूत कारण न हों।

हाथ पर विशिष्ट एल्गोरिदम के लिए, जो स्टोकास्टिक ढाल सभ्य का उपयोग करता है, वहां कोई साधारण उत्तर नहीं होता है *। TensorFlow प्रलेखन दो स्रोतों को दर्शाता है:

* "यह उम्मीद है कि अद्यतन में एक अच्छा मैट्रिक्स बी चुनना ... मानक ढाल विधि में काफी सुधार कर सकता है ... अक्सर, हालांकि, ऐसी पसंद स्पष्ट नहीं है, और स्टोकास्टिक सेटिंग्स में। .. यह इस मैट्रिक्स को चुनने के लिए बेहद स्पष्ट नहीं है। इसके अलावा, कई स्टोकास्टिक सेटिंग्स में, हम उस वास्तविक कार्य को भी नहीं जानते हैं जो हम कम कर रहे हैं, क्योंकि डेटा बस एक स्ट्रीम में आता है, इसलिए एक अच्छी दूरी-उत्पन्न करने वाला मैट्रिक्स पूर्व-कंप्यूटिंग असंभव है। "Duchi & Singer, 2013, p. 5