Часть II • Введение в TensorFlow.js
оптимального места. По дороге мы обнаруживаем еще несколько интересных мест,
соответствующих недообученным и хорошо обученным моделям. В блоке Б рис. 2.7
показан график потерь модели как функции номера шага и отмечены аналогичные
интересные места. Блок В иллюстрирует модели с помощью весов в качестве срезов
состояния на показанных в блоке Б шагах.
Рис. 2.7.
Блок A: 200 не очень больших шагов на основе градиентного спуска приводят
значения параметров в глобальный экстремум. На рисунке отмечены начальные значения
весов и их значения после 20, 100 и 200 эпох. Блок Б: график потерь как функции от номера
эпохи с отмеченными значениями потерь в тех же точках. Блок В: функция зависимости timeSec
от sizeMB, воплощаемая обученной моделью после 10, 20, 100 и 200 эпох, повторенных здесь
для удобства сравнения местоположения на поверхности ошибок и результата работы модели.
Поэкспериментировать с этим кодом можно на codepen.io/tfjs-book/pen/JmerMM
Наша простая модель линейной регрессии — единственная в этой книге, где мы
можем позволить себе роскошь столь наглядной визуализации процесса градиентно
го спуска. Но, когда позже мы начнем рассматривать более сложные модели, учтите,
что сущность градиентного спуска остается той же самой: просто итеративный спуск
по склону сложной, многомерной поверхности в надежде, что рано или поздно мы
попадем в точку с очень низким значением функции потерь.
Глава 2. Приступим: простая линейная регрессия в TensorFlow.js
81
Изначально мы использовали размер шага по умолчанию (определяемый
скоро-
стью обучения по умолчанию
(default learning rate)), но всего десяти шагов прохода
по нашему ограниченному набору данных оказалось недостаточно для достижения
оптимального решения; 200 шагов же вполне достаточно.
Вообще говоря, как узнать, какую скорость обучения выбрать и когда его за
вершать? Существует несколько удобных эмпирических правил, которые мы будем
обсуждать по ходу книги, но универсального правила на все случаи жизни нет. Если
скорость обучения слишком мала, а значит, используется
слишком маленький
шаг, до
стичь оптимальных параметров за приемлемое время не получится. И напротив, при
слишком большой скорости обучения, а значит, и слишком
большом
размере шага мы
можем «проскочить» минимум и получить решение даже с б
ó
льшим значением функ
ции потерь, чем то, с которого начали. В результате параметры нашей модели будут
сильно колебаться около оптимальных, вместо того чтобы быстро и неприну жденно
приближаться к ним. На рис. 2.8 показано, что происходит, когда шаг градиента слиш
ком велик. В еще более экстремальных случаях, при большой скорости обучения,
значения параметров расходятся и стремятся к бесконечности, приводя к возникно
вению значений
NaN
(notanumber — «не число») весов, и полностью портят модель.
Рис. 2.8.
При очень большой скорости обучения шаг градиента слишком велик
и новые значения параметров могут оказаться хуже старых. Результатом могут стать колебания
значений или какой-либо другой вид неустойчивости, что приведет к бесконечным значениям
параметров (NaN). Можете попробовать увеличить скорость обучения в коде из CodePen до 0,5,
чтобы посмотреть на такое поведение
82
Do'stlaringiz bilan baham: |