Nếu tôi hiểu bạn một cách chính xác, bạn muốn sai lầm khi đánh giá quá cao. Nếu vậy, bạn cần một hàm chi phí không đối xứng thích hợp. Một ứng cử viên đơn giản là điều chỉnh tổn thất bình phương:
L:(x,α)→x2(sgnx+α)2
trong đó −1<α<1 là tham số bạn có thể sử dụng để đánh đổi hình phạt đánh giá thấp so với đánh giá quá cao. Các giá trị dương của α bị phạt quá mức, vì vậy bạn sẽ muốn đặt α âm. Trong python điều này trông giống nhưdef loss(x, a): return x**2 * (numpy.sign(x) + a)**2
Tiếp theo hãy tạo một số dữ liệu:
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))
Cuối cùng, chúng tôi sẽ thực hiện hồi quy của mình tensorflow
, một thư viện máy học từ Google hỗ trợ phân biệt tự động (làm cho việc tối ưu hóa dựa trên độ dốc của các vấn đề như vậy trở nên đơn giản hơn). Tôi sẽ sử dụng ví dụ này như một điểm khởi đầu.
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
là lỗi bình phương thông thường, trong khi đó acost
là hàm mất bất đối xứng đã nói ở trên.
Nếu bạn sử dụng cost
bạn nhận được
1.00764 -3.32445
Nếu bạn sử dụng acost
bạn nhận được
1.02604 -1.07742
acost
rõ ràng cố gắng không đánh giá thấp. Tôi đã không kiểm tra sự hội tụ, nhưng bạn có ý tưởng.