Необходимая процедура для нормальной (быстрой) работы градиентного спуска по многим переменным. Суть процедуры в том, чтобы привести все переменные x1, ... xN в единый "масштаб". Например, чтобы все факторы лежали в диапазоне от 0 до 1. Таким образом вместо реальных факторов x1, ..., xN мы строим отмасштабированные z1, ... , zN следующим образом: 1) Для всех x1 считаем max и min. После этого для каждого x1 считаем z1 = (x1-min)/(max-min) -- в результате все значение z1 будут как раз лежать в диапазоне от 0 до 1. Здесь может быть проблема в случае если есть очень редкие min, max, а большинство значений лежат в гораздо более узком диапазоне. На этот случай можно использовать более сложный подход... 2) Вместо min и max берём перцентили (например 5% и 95%), в остальном без изменений -- здесь всё ещё может не повезти с формой распределения, но очень сильного перекоса из-за одного большого значения уже не будет. 3) Совсем другой подход: считаем среднее и среднее квадратичное отклонение по каждой оси и потом вычитаем среднее и делим на среднее квадратичное -- так мы получаем величину имеющую в среднем единичное среднеквадратичное отклонение, независимо от того, какой это распределение формы. Такая коррекция наиболее популярно.
Если осуществлять градиентный спуск с переменными сильно разного масштаба, сходимость алгоритма будет замедлена (может быть и в десятки раз), т.к. шаг градиента будет неравномерен по разным осям и где-то он будет слишком большим, нам придётся уменьшать шаг (а он уменьшится по всем осям), как следствие будут оси, где шаг градиента будет слишком маленьким и мы будем слишком много итераций идти к минимуму. Это можно понять на примере оптимизации функции y = x1**2 + 1000 * x2**2. Шаг градиента по x2 будет типично в 1000 раз больше, чем по x1. Если шаг обучения приемлем для x2, то для x1 с этим шагом мы будем идти в 1000 раз дольше, чем могли бы.