ถ้าฉันเข้าใจคุณอย่างถูกต้องคุณต้องการที่จะทำผิดพลาดในด้านของการประเมินค่าสูงเกินไป ถ้าเป็นเช่นนั้นคุณต้องมีฟังก์ชั่นค่าใช้จ่ายที่เหมาะสมและไม่สมมาตร หนึ่งในผู้สมัครที่ง่ายคือการปรับแต่งการสูญเสียกำลังสอง:
L:(x,α)→x2(sgnx+α)2
โดยที่เป็นพารามิเตอร์ที่คุณสามารถใช้เพื่อแลกเปลี่ยนกับบทลงโทษของการดูถูกดูแคลนต่อการประเมินค่าสูงไป ค่าบวกของลงโทษการประมาณค่าสูงเกินไปดังนั้นคุณจะต้องตั้งค่าเชิงลบ ในภาษาไพ ธ อนดูเหมือนว่าα α−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
พยายามอย่างชัดเจนที่จะไม่ประมาท ฉันไม่ได้ตรวจสอบการบรรจบกัน แต่คุณได้รับความคิด