Давайте просто возьмем пример:

X — входной массив с [x1, x2…xn]. Любой элемент в X представлен xi.

y — выходные метки для каждого xi.

нам нужно найти параметр W , который неизвестен. Начнем со случайных назначений W.

Функция потерь определяется как разница между выходной меткой (y_pred) и истинной меткой (yi - при любом индексе i).

Нам нужно скорректировать значение W, чтобы минимизировать потери.

Возьмем пример:

Xs =[1,2,3]
y = [4,5,6]
#w = unknown — можно попробовать разные значения w для проверки потерь.

def forwards(xi, wi):
return wi*xi
def loss(xi,yi,wi):
 y_pred = forwards(xi,wi)
 loss = np.square(y_pred — yi) #square the difference
 return loss
# lets try different values of w to see how the loss changes.
w = [-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10]
loss_list = []
for wi in w: # iterate through different values of w
 loss_sum = 0
 for xi,yi in zip(Xs,y): #iterate through xi , yi 
  loss_sum += loss(xi,yi,wi)
 
 print(wi, loss_sum/len(Xs))  # mean squared error 
 loss_list.append(loss_sum/len(Xs))
# these lines show the w values and loss 
-3 131.66666666666666
-2 87.0
-1 51.666666666666664
0 25.666666666666668
1 9.0
2 1.6666666666666667
3 3.6666666666666665
4 15.0
5 35.666666666666664
6 65.66666666666667
7 105.0
8 153.66666666666666
9 211.66666666666666
10 279.0

Теперь мы можем построить график со списком w по оси x и различными потерями по оси y.

plt.plot(w, loss_list,'ro')

Мы видим, что при w = 2 потери минимальны. В идеале, если мы используем нейронную сеть, алгоритм градиентного спуска выполняет обратное распространение и обновляет веса на основе функции потерь.

Это идея линейной модели. Я удалил термин смещения «b», чтобы сделать его немного удобнее.