Пора собрать в одну функцию всё, что было по частям: прогноз модели, промахи, градиент по четырём параметрам и шаг против него. Обучение — это их повторение по кругу: посчитать прогнозы, получить промахи, собрать из них градиент, шагнуть, начать заново.
Существенно, что все параметры обновляются после полного прохода по базе, а не внутри него: градиент считается в одной точке, значит и веса должны меняться все разом.
Это полный цикл обучения, написанный вами от первой строки до последней. После него любой фреймворк перестаёт быть чёрным ящиком: вы будете знать, что происходит внутри одного вызова обучения, потому что написали это сами.
Подробно: Все веса сразу.
Задание
База выполненных заказов. Три первых числа в строке — признаки заказа: километры, светофоры, свободные курьеры рядом. Четвёртое — сколько заказ ехал на самом деле, в минутах. Это и есть то, что модель учится предсказывать.
База вписана в тест, объявлять её в решении не нужно.
baza = [(4.0, 2, 6, 20.0), (2.0, 5, 4, 19.5), (6.0, 1, 2, 26.5), (1.5, 3, 8, 13.0),
(5.0, 0, 5, 20.5), (3.0, 4, 1, 22.5), (7.5, 2, 3, 32.0), (2.5, 6, 7, 21.0)]
Модель та же, что в пятом задании:
время = p[0] · км + p[1] · светофоры + p[2] · курьеры + p[3]
Последний параметр p[3] — постоянная часть времени, одинаковая для всех заказов: сборка и передача курьеру. Признака при нём нет, поэтому в производной на его месте стоит единица.
Напишите функцию
def fit(baza, lr, steps):
# возвращает (список из четырёх параметров, история MSE)
...
Начинайте со всех нулей. История — список значений MSE по шагам, по одному на шаг. Печать делается снаружи, функция ничего не печатает.
Градиент считайте своей функцией grad4 из предыдущего задания — переписывать производные заново не надо, объявите её в решении рядом.
Как проверить себя
При lr = 0.02 и 2000 шагах MSE опустится почти до нуля, но веса не совпадут с истинными 3, 1.5, −0.5 и 8. Подумайте, почему, и попробуйте lr = 0.03 — объясните, что стало с числами.
Потом прогоните базу через standardize из седьмого задания, обучите с lr = 0.3 за 120 шагов и верните веса. Сравните с первым результатом.
Числа сравниваются с допуском, а не как строки: достаточно совпадения в первых четырёх знаках. Печатать ничего не надо — функция возвращает значение.