2016-09-25 12 views
0

У меня есть специальный аналитический градиент, который я использую для вычисления моей стоимости f (x, y) и градиентов dx и dy. Он работает, но я не могу сказать, разрушен ли мой градиентный спуск. Должен ли я строить свои частные производные x и y?Код не сходящийся ванильный градиентный спуск

import math 

gamma = 0.00001 # learning rate 
iterations = 10000 #steps 
theta = np.array([0,5]) #starting value 
thetas = [] 
costs = [] 

# calculate cost of any point 
def cost(theta): 
    x = theta[0] 
    y = theta[1] 
    return 100*x*math.exp(-0.5*x*x+0.5*x-0.5*y*y-y+math.pi) 

def gradient(theta): 
    x = theta[0] 
    y = theta[1] 
    dx = 100*math.exp(-0.5*x*x+0.5*x-0.0035*y*y-y+math.pi)*(1+x*(-x + 0.5)) 
    dy = 100*x*math.exp(-0.5*x*x+0.5*x-0.05*y*y-y+math.pi)*(-y-1) 
    gradients = np.array([dx,dy]) 
    return gradients 

#for 2 features 
for step in range(iterations): 
    theta = theta - gamma*gradient(theta) 
    value = cost(theta) 
    thetas.append(theta) 
    costs.append(value) 

thetas = np.array(thetas) 
X = thetas[:,0] 
Y = thetas[:,1] 
Z = np.array(costs) 

iterations = [num for num in range(iterations)] 

plt.plot(Z) 
plt.xlabel("num. iteration") 
plt.ylabel("cost") 
+0

Похоже, вы пытаетесь найти минимум, но эта функция неограничена ниже на любой строке y = c, так как x -> neg inf. –

ответ

2

я настоятельно рекомендую вам проверить, действительно ли ваш аналитический градиент работает correcly по первой оценке его от численного градиента. I. Убедитесь, что ваш f '(x) = (f (x + h) - f (x))/h для некоторого малого h.

После этого убедитесь, что ваши обновления находятся в правильном направлении, выбрав точку, в которой вы знаете, x или y должны уменьшаться, а затем проверять знак выхода функции градиента.

Конечно, убедитесь, что ваша цель - это минимизация и максимизация.