अगर मैं आपको सही तरीके से समझता हूं, तो आप overestimating के पक्ष में गलती करना चाहते हैं। यदि हां, तो आपको एक उपयुक्त, असममित लागत फ़ंक्शन की आवश्यकता है। एक साधारण उम्मीदवार चुकता नुकसान को मोड़ना है:
L:(x,α)→x2(sgnx+α)2
जहाँ एक पैरामीटर है जिसे आप ओवरस्टीमेशन के खिलाफ कम करके आंका जा सकता है। सकारात्मक मूल्य overestimation को दंडित करते हैं, इसलिए आप नकारात्मक सेट करना चाहेंगे । अजगर में यह दिखता है−1<α<1ααdef loss(x, a): return x**2 * (numpy.sign(x) + a)**2
अगला कुछ डेटा उत्पन्न करते हैं:
import numpy
x = numpy.arange(-10, 10, 0.1)
y = -0.1*x**2 + x + numpy.sin(x) + 0.1*numpy.random.randn(len(x))
अंत में, हम tensorflow
Google से एक मशीन लर्निंग लाइब्रेरी में अपना रिग्रेशन करेंगे , जो स्वचालित भेदभाव (ऐसी समस्याओं का ग्रेडिएंट-बेस्ड ऑप्टिमाइज़ेशन को सरल बनाने) का समर्थन करती है। मैं इस उदाहरण का उपयोग प्रारंभिक बिंदु के रूप में करूंगा ।
import tensorflow as tf
X = tf.placeholder("float") # create symbolic variables
Y = tf.placeholder("float")
w = tf.Variable(0.0, name="coeff")
b = tf.Variable(0.0, name="offset")
y_model = tf.mul(X, w) + b
cost = tf.pow(y_model-Y, 2) # use sqr error for cost function
def acost(a): return tf.pow(y_model-Y, 2) * tf.pow(tf.sign(y_model-Y) + a, 2)
train_op = tf.train.AdamOptimizer().minimize(cost)
train_op2 = tf.train.AdamOptimizer().minimize(acost(-0.5))
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
for i in range(100):
for (xi, yi) in zip(x, y):
# sess.run(train_op, feed_dict={X: xi, Y: yi})
sess.run(train_op2, feed_dict={X: xi, Y: yi})
print(sess.run(w), sess.run(b))
cost
नियमित रूप से चुकता त्रुटि है, जबकि acost
उपर्युक्त असममित हानि फ़ंक्शन है।
यदि आप उपयोग करते हैं cost
तो आप प्राप्त करते हैं
1.00764 -3.32445
यदि आप उपयोग करते हैं acost
तो आप प्राप्त करते हैं
1.02604 -1.07742
acost
स्पष्ट रूप से कम नहीं करने की कोशिश करता है। मैंने अभिसरण के लिए जाँच नहीं की, लेकिन आपको यह विचार मिल गया।