рекомендации

четверг, 17 января 2019 г.

Простое объяснение алгоритма градиентного спуска

Градиентный спуск - это итерационный алгоритм оптимизации, позволяющий найти минимальное значение (локальный минимум) функции. Градиентный спуск эффективен как с линейными, так и с классификационными задачами и обеспечивает требуемую точность с несколькими параметрами (веса и смещения). Он включает следующие шаги: 
  
- инициализация параметров (весов и смещений) случайными значениями или просто как нули; 
- вычисление функции стоимости (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 
  
= [0,0.12,0.25,0.27,0.38,0.42,0.44,0.55,0.92,1.0] 
= [0,0.15,0.54,0.510.34,0.1,0.19,0.53,1.0,0.58] 
  
costs = [] 
#Step 1: Parameter initialization 
= 0.45 
= 0.75 
  
for in range(1100): 
      
#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: 
    = - 0.01*dw 
    = - 0.01*db 
      
    if i%10 == 0: 
        print("Cost at", i,"iteration = "cost) 
  
#Step 5: Repeat from Stepimplemented as a for loop with 1000 iterations 
  
#Plot the cost against noof iterations 
print("W = ", W,"& b = ",  b) 
plt.plot(costs) 
plt.ylabel('cost') 
plt.xlabel('iterations (per tens)') 
plt.show() 

Комментариев нет:

Отправить комментарий