Градиентный спуск - это итерационный алгоритм оптимизации, позволяющий найти минимальное значение (локальный минимум) функции. Градиентный спуск эффективен как с линейными, так и с классификационными задачами и обеспечивает требуемую точность с несколькими параметрами (веса и смещения). Он включает следующие шаги:
- инициализация параметров (весов и смещений) случайными значениями или просто как нули;
- вычисление функции стоимости (J);
- взятие частной производной функции стоимости по отношению к весам и смещениям (dW и db);
- изменение значения параметров:
Wnew = W - learning rate * dW
Bnew = b - learning rate * db
Снова начинаем со второго шага 2 новыми значениями W и b и повторяем то же самое для n итераций. С каждой итерацией стоимость будет постепенно снижаться и в конечном итоге станет постоянной.
Объяснение
Рассмотрим пример цен на жилье и применим к ним градиентный спуск.
Шаг 1: Мы инициализируем наши параметры случайными значениями как W = 0.45 и b = 0.75.
Шаг 2: Рассчитываем функцию стоимости (Cost )
Важно подчеркнуть, что данные должны быть в одном масштабе, поэтому сначала мы нормализуем наши данные, а затем вычисляем прогнозируемый результат, ошибку и функцию стоимости.
Loss error = ½ (predicted value – actual value)2
Cost (J) = 1/m (Sum of Loss error)
Шаг 3: Рассчитываем dW и db
dW = ( Ypredicted – Y ) *X
db = ( Ypredicted – Y )
Шаг 4: Обновляем значения параметров:
W = W – learning rate * dW = 0.45 – 0.01 * 2.2 = 0.43
b = b – learning rate * db = 0.75 – 0.01 * 5.52 = 0.69
Важно отметить, что новые значения W и b меньше, чем мы начальные. Давайте посмотрим эти значения на нашем графике функции стоимости.
Из графика видно, что мы двинулись к локальным минимумам. Скорость обучения (альфа) - это гиперпараметр, который отвечает за скорость приближения к локальным минимумам. Если мы выберем слишком малую скорость обучения, то для достижения минимальной точки потребуется слишком много времени, если она слишком велика, то есть шанс, что мы проскочим локальный минимум. Всегда рекомендуется проверять ваш алгоритм на нескольких скоростях обучения и выбирать наиболее подходящую. (типичные значения: 0,1, 0,01, 0,001, 0,0001 ... и т.д.)
Шаг 5: Повторяем шаг 2 с новыми значениями W и b до тех пор, пока дальнейшие изменения W и b не будут значительно уменьшать стоимость.
Наши оптимизированные параметры: W = 0.473 и b = 0.196
Код Python:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
X = [0,0.12,0.25,0.27,0.38,0.42,0.44,0.55,0.92,1.0]
Y = [0,0.15,0.54,0.51, 0.34,0.1,0.19,0.53,1.0,0.58]
costs = []
#Step 1: Parameter initialization
W = 0.45
b = 0.75
for i in range(1, 100):
#Step 2: Step 2: Calculate Cost
Y_pred = np.multiply(W, X) + b
Loss_error = 0.5 * (Y_pred - Y)**2
cost = np.sum(Loss_error)/10
#Step 3: Calculate dW and db
db = np.sum((Y_pred - Y))
dw = np.dot((Y_pred - Y), X)
costs.append(cost)
#Step 4: Update parameters:
W = W - 0.01*dw
b = b - 0.01*db
if i%10 == 0:
print("Cost at", i,"iteration = ", cost)
#Step 5: Repeat from Step, implemented as a for loop with 1000 iterations
#Plot the cost against no. of iterations
print("W = ", W,"& b = ", b)
plt.plot(costs)
plt.ylabel('cost')
plt.xlabel('iterations (per tens)')
plt.show()
Комментариев нет:
Отправить комментарий