Мы начинаем урок, в котором обсудим различные особенности, с которыми вы можете столкнуться при применении линейных моделей к реальным задачам. И первый аспект, о котором мы поговорим, это масштабирование признаков. Давайте начнем с простого примера, на котором поймём необходимость масштабирования. Представьте, что нам нужно найти минимум простой функции w1²+ w2². В общем-то понятно, что минимум достигается в точке (0, 0), но давайте посмотрим, что будет, если мы воспользуемся градиентным спуском для минимизации этой функции. Её линии уровня выглядят как-то так. Это круги. Поскольку переменные в этой функции симметричны, можно поменять местами w1 и w2, то линии уровня тоже симметричные. Если вы решите запустить градиентный спуск из точки (1, 1), то вектор антиградиента будет смотреть влево и вниз, а его координаты равны (-2, -2). Этот вектор проходит через точку минимума (0, 0). Если вы подберёте правильный размер шага при этом антиградиенте, то уже на первом шаге градиентного спуска попадёте строго в точку минимума этой функции. Градиентный спуск будет хорошо работать на этой функции. Давайте теперь немного её изменим. Добавим перед слагаемым w2² коэффициент 100. В этом случае функционал будет выглядеть вот так. Он уже несимметричный. Перед переменной w2 стоит большой коэффициент. В этом случае линии уровня будут выглядеть вот так. Это уже эллипсы, сильно вытянутые вдоль оси x, поскольку перед второй переменной стоит большой коэффициент, изменение по ней при небольшом изменении w2 гораздо сильнее. Если мы, опять же, запустим градиентный спуск из точки (1, 1), то вектор антиградиента в этой точке будет иметь координаты -2 и -200, он будет смотреть практически строго вниз и проходить мимо точки минимума функции. Если вы сделаете шаг у этого вектора, то промахнётесь, и у вас есть шанс стать ещё дальше от минимума, чем вы были в начальном приближении. Градиентный спуск будет иметь большие проблемы, если вы запустите его на этой функции. Итак. Градиентный спуск работает хорошо, если линии уровня функции похожи на круги, как на этом примере. В этом случае, откуда бы вы ни начали, вектор антиградиента будет смотреть в сторону минимума функции и будет сходиться довольно быстро. Если же линии уровня вот такие, то градиентный спуск будет иметь проблемы. Направление антиградиента будет слабо совпадать с направлением в сторону минимума функции, и градиентный спуск будет делать много лишних шагов. Его сходимость будет медленная. И более того, есть риск расхождения градиентного спуска, если размер шага будет подобран неправильно. Вот ещё один пример. Представьте, что у вас есть некая заявка на грант, и вам нужно предсказать, будет ли выдан грант по этой заявке, будет ли она одобрена. И представьте, что у вас есть два признака. Первый признак говорит, сколько уже успешных заявок было у данного заявителя. Понятно, что если много его предыдущих заявок было одобрено, у него большой опыт, у него хорошо получается писать заявки, и данная, скорее всего, тоже будет одобрена. Второй признак — это год рождения заявителя. Масштабы у этих признаков очень разные. Число одобренных грантов — это, скорее всего, единицы, а год рождения — это тысячи. У них разный масштаб. И из-за этого линии уровня функции будут скорее выглядеть как вытянутые эллипсы, чем как круги. Именно различие в масштабе признаков приводит к тому, что линии уровня не похожи на круги. Чтобы бороться с этой проблемой, чтобы у градиентного спуска не было никаких плохих нюансов при применении к таким выборкам, признаки нужно масштабировать, то есть приводить к одному масштабу. Мы разберём два способа масштабирования. И первый из них называется нормализацией. Итак. Представьте, что мы хотим отмасштабировать j-тый признак. В этом случае нам нужно сначала вычислить две вспомогательные величины: среднее значение этого признака и стандартное отклонение этого признака. Для вычисления среднего мы просто суммируем значение этого признака на всех объектах обучающей выборки, и делим на размер выборки. Чтобы вычислить стандартное отклонение, мы суммируем квадраты отклонений значений этого признака на объектах обучающей выборки от среднего значения μj. И делим на число объектов обучающей выборки, после чего извлекаем корень. После этого нам известны среднее значение μj-тое и стандартное отклонение σj-тое. Теперь, чтобы отмасштабировать признак, мы берём каждое его значение, например на i-том объекте xij-тое, вычитаем из него среднее μj-тое и делим на стандартное отклонение σj-тое. После этих операций мы уберём сдвиги и различия в масштабах у всех признаков, и они будут иметь примерно одинаковый масштаб. Второй подход называется масштабированием на отрезок [0, 1]. В этом случае нам нужно тоже вычислить две вспомогательные величины, но немного другие. Это будут минимальное и максимальное значение данного признака на всей обучающей выборке. Минимальное значение обозначаем буквой mj-тое, максимальное значение буквой Mj-тое. После того, как они найдены, мы берём значение данного признака на конкретном объекте, вычитаем из него минимальное значение данного признака и делим на разность между максимальным и минимальным значением данного признака. После такого преобразования минимальное значение признака будет отображено в ноль, максимальное в единицу. Получается, что данный признак отмасштабирован на отрезок [0, 1]. Итак. Мы с вами обсудили, что различия в масштабах признаков — это очень плохо, применение градиентного спуска к таким выборкам может привести к его очень плохой сходимости или даже к его расхождению. Чтобы бороться с этим признаки нужно масштабировать. Мы обсудили два способа масштабирования признаков. Первый называется нормализацией, в котором мы вычитаем среднее и делим остаток на отклонение признака, второй — это масштабирование на [0, 1]. В следующем видео мы поговорим о том, как использовать в линейных моделях нелинейные признаки.