Почему функция ошибок становится постоянной при реализации стохастического градиентного спуска с использованием 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 эпох. Может кто-нибудь сказать мне, какую ошибку я делаю? Наверное, это что-то очень банальное.

0 ответов

Другие вопросы по тегам