Почему функция ошибок становится постоянной при реализации стохастического градиентного спуска с использованием 2D-входных данных?
Согласно Q8,9 курса HW5, Caltech Learning from data, мы должны сгенерировать 100 тестовых точек формы (x1,x2) и получить их выходные данные 1/0 в зависимости от того, на какой стороне случайной линии они лежат. Нам необходимо использовать эти обучающие данные для стохастического градиентного спуска, используя ошибку кросс-энтропии, и вычислить ошибку E_out для данных тестирования, полученных аналогичным образом.
Для этого я использовал следующий код Python:
def sgd(inputs, outputs, weights = np.array([0,0,0]), eeta = 0.1):
weights.shape = (3,1)
jj = 0
datasets = len(outputs)
while(True):
temp = weights
iterator = np.random.permutation(datasets)
for i in iterator:
x = inputs[i]
y = outputs[i]
x.shape = (3,1)
w_x = np.dot(weights.transpose(), x)
delta = -(y*x)/(1 + exp(y*w_x))
weights = weights - eeta*delta
diff_abs = np.linalg.norm(temp-weights)
sume=0
for i in range(datasets):
y = outputs[i]
x = inputs[i]
x.shape = (3,1)
w_x = np.dot(weights.transpose(), x)
sume += log(1 + e**(-y*w_x))
ein = sume/datasets
if diff_abs<0.005:
print(jj,'\t',ein)
# print(ein)
return ein
break
jj+=1
return weights
def calc_eout(weights, datasets):
weights.shape = (3,1)
inputs = generate_inputs(datasets)
outputs = get_outputs(inputs)
sume = 0
for i in range(datasets):
y = outputs[i]
x = inputs[i]
x.shape = (3,1)
w_x = np.dot(weights.transpose(), x)
sume += log(1 + e**(-y*w_x))
return sume/datasets
eout = []
ein = []
for i in range(100):
print(i,'\n')
eeta = 0.01
datasets = 100
weights = np.array([0,0,0])
inputs = generate_inputs(datasets)
outputs = get_outputs(inputs)
weights = sgd(inputs, outputs, weights, eeta)
e_out = calc_eout(weights, datasets)
eout.append(e_out)
print("eout = ", sum(eout)/len(eout))
Используя этот код, e_in становится почти постоянным примерно до 35-38%, чего на самом деле не должно быть, поскольку данные правильно линейно разделяются. Во-вторых, ответ на этот вопрос заключается в том, что E_out составляет около 0,1 и достигает его примерно за 350 эпох. Пока моя ошибка становится почти постоянной до 0,38 за 100 эпох. Может кто-нибудь сказать мне, какую ошибку я делаю? Наверное, это что-то очень банальное.