Машинное обучение: почему функция стоимости линейной регрессии сначала уменьшается, а затем увеличивается? - PullRequest
0 голосов
/ 19 октября 2019

Я обучил многомерную модель линейной регрессии на данных, доступных в этом файле .csv: https://www.kaggle.com/dgomonov/new-york-city-airbnb-open-data/downloads/new-york-city-airbnb-open-data.zip/3 Я обучил ее (градиентный спуск) следующим образом:

alpha = 0.1
rd: int = 0
while epoch <= 4000:
    rd = 0
    epoch += 1
    print("Epoch: "+str(epoch))
    while rd <= 48894:
        expected_y: float = x1a[rd] * w[0]
        expected_y += x1b[rd] * w[1]
        expected_y += x1c[rd] * w[2]
        expected_y += x1d[rd] * w[3]
        expected_y += x1e[rd] * w[4]
        expected_y += x2p[rd] * w[5]
        expected_y += x2e[rd] * w[6]
        expected_y += x2s[rd] * w[7]
        expected_y += x3[rd] * w[8]
        expected_y += x4[rd] * w[9]
        expected_y += x5[rd] * w[10]
        expected_y += x6[rd] * w[11]
        expected_y += x7[rd] * w[12] + b
        actual_y: float = y[rd]
        disparity: float = expected_y - actual_y
        b -= 2 * alpha * disparity * (1 / 48894)
        w[0] -= 2 * alpha * x1a[rd] * disparity * (1 / 48894)
        w[1] -= 2 * alpha * x1b[rd] * disparity * (1 / 48894)
        w[2] -= 2 * alpha * x1c[rd] * disparity * (1 / 48894)
        w[3] -= 2 * alpha * x1d[rd] * disparity * (1 / 48894)
        w[4] -= 2 * alpha * x1e[rd] * disparity * (1 / 48894)
        w[5] -= 2 * alpha * x2p[rd] * disparity * (1 / 48894)
        w[6] -= 2 * alpha * x2e[rd] * disparity * (1 / 48894)
        w[7] -= 2 * alpha * x2s[rd] * disparity * (1 / 48894)
        w[8] -= 2 * alpha * x3[rd] * disparity * (1 / 48894)
        w[9] -= 2 * alpha * x4[rd] * disparity * (1 / 48894)
        w[10] -= 2 * alpha * x5[rd] * disparity * (1 / 48894)
        w[11] -= 2 * alpha * x6[rd] * disparity * (1 / 48894)
        w[12] -= 2 * alpha * x7[rd] * disparity * (1 / 48894)
        rd += 1
    if epoch % 2 == 0:
        te = 0
        mean_squared_error: float = 0
        while te <= 48894:
            expected_y = x1a[te] * w[0] + x1b[te] * w[1] + x1c[te] * w[2] + x1d[te] * w[3] + x1e[te] * w[4]
            expected_y += x2p[te] * w[5]
            expected_y += x2e[te] * w[6] + x2s[te] * w[7] + x3[te] * w[8] + x4[te] * w[9] + x5[te] * w[10]
            expected_y += x6[te] * w[11]
            expected_y += x7[te] * w[12] + b
            actual_y = y[te]
            disparity = expected_y - actual_y
            mean_squared_error += disparity ** 2
            te += 1
        print("\t\tEpoch: " + str(epoch) + "\n\t\tMSE:" + str(mean_squared_error))

Функция потерь / затрат(среднеквадратическая ошибка) продолжает уменьшаться, как и ожидалось, до 712-й эпохи, затем начинает увеличиваться (хотя и медленно). Что это значит и как предотвратить это?

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Это потому, что ваша цель - минимизировать тета-функцию стоимости. Если вы используете градиентный спуск, вам нужно убедиться, что ваша скорость обучения альфа невелика. Ваша гипотеза должна оказаться в глобальном минимуме, а не в локальном оптимуме. Градиентный спуск должен предпринимать небольшие шаги в поиске глобального минимума, который наилучшим образом соответствует модели обучения.

0 голосов
/ 19 октября 2019

Это происходит, когда вы пытаетесь использовать большую скорость обучения (alpha), и это означает, что ваша модель делает огромный шаг в градиентном спуске, чтобы найти глобальный минимум, и может ваша функция стоимости после нескольких итераций уменьшит ееувеличивать и превышать глобальный минимум и не сходиться или даже расходиться. так что в вашем случае, вероятно, небольшие шаги (уменьшение скорости обучения alpha) гарантируют, что градиентный спуск сойдет к глобальным оптимумам.

...