Обзор практического машинного обучения с помощью Scikit-Learn, Keras и Tensorflow Орельена Жерона

Резюме

В этой главе основное внимание уделяется глубокому обучению и методам, которые можно использовать для предотвращения выхода нейронных сетей из-под контроля по мере того, как их сложность становится все глубже. Традиционно Deep Learning определяется как нейронная сеть, которая содержит 3 или более слоев. Но с этим добавлением слоев возникает дополнительная сложность, а со сложностью появляется больше способов сломать проект. Большая часть этой главы посвящена тому, чтобы познакомить нас с методами, которые мы можем использовать, чтобы свести к минимуму эти поломки при обучении глубоких моделей.

Исчезающие/взрывающиеся градиенты

Нейронные сети обучаются с помощью обратного распространения с использованием градиентного спуска, чтобы настроить их взвешивание так, чтобы мы получили ожидаемый результат. Однако по мере того, как нейронные сети становятся глубже, они могут столкнуться с проблемой, когда эти веса могут становиться настолько маленькими или настолько большими, что они больше не влияют на модель или чрезмерно влияют на нее. Но поскольку эта проблема очень распространена, мы можем предотвратить ее множеством способов по мере того, как наши модели становятся все глубже и глубже.

Пакетная нормализация — наиболее распространенный способ решения проблемы исчезающего/взрывающегося градиента. Это достигается путем добавления слоя пакетной нормализации, обычно перед каждым обучением позже, для повторного центрирования и масштабирования данных. Это нормализует данные даже по мере того, как данные становятся все глубже и глубже, предотвращая рост веса каких-либо единичных узлов настолько большим или настолько маленьким, что это приводит к расхождению модели. При построении ваших моделей вы используете keras.layers.BatchNormalization() перед каждым слоем (хотя вопрос о том, идет ли он до или после слоев, несколько оспаривается).

Отсечение градиента — это метод, при котором градиент любого шага буквально обрезается до определенного значения. Например, keras.optimizers.SGD(clipvalue=1.0) обрезает каждый компонент вектора градиента до значения от -1 до 1. Эти границы помогают предотвратить проблему взрывающихся градиентов, в частности, в рекуррентных нейронных сетях.

Повторное использование предварительно обученных слоев

Эта техника именно то, на что она похожа. Вы в буквальном смысле используете предварительно обученные слои, которые другие обучили до вас на аналогичных проблемах, чтобы ускорить время, необходимое вам для создания решения вашей проблемы, или когда вы строите модели, в которых не хватает больших объемов данных. Одним из примеров этого может быть то, что ваша компания требует от вас создания модели для проверки различий между хорошей и плохой дорожными инфраструктурами. Таким образом, вместо того, чтобы полностью создавать свою собственную модель, вы можете украсть первые несколько слоев Tesla или Waymo, которые сосредоточены на дорожных условиях, а затем построить свое обнаружение выбоин и других подобных угроз безопасности поверх этих первых нескольких слоев. Этот пример не будет работать, потому что упомянутые данные строго засекречены, но есть много ресурсов с открытым исходным кодом, таких как TensorFlow Hub и PyTorch Hub, которые предлагают предварительно обученные модели.

Чтобы реализовать это в TensorFlow 2.0, вам нужно сначала импортировать модель, которую вы хотите использовать, через

model1 = keras.models.load_model(<model name>) 

а затем добавить создать модель с этими слоями с

model2 = keras.models.Sequential(model1.layers[<slice the layers you need>])

а затем добавить свои собственные слои

model2.add(<your own layer>)

Затем, наконец, вам нужно отключить обучаемый атрибут предварительно загруженного слоя, чтобы вы могли просто обучать новые слои, которые вы реализовали.

for layer in model2.layers[<slice the model 1 layers>]:
   layer.trainable = False

Отсюда вы сможете запускать свои предварительно обученные модели!

(но сначала вы должны взять клон своей оригинальной модели, чтобы не потерять ее оригинальную архитектуру

model1_clone = keras.models.clone_model(model1)
model1_clone = set_weights(model1.get_weights())

Более быстрые оптимизаторы

Хотя использование предыдущих методов ускорит наше время обучения, мы также можем ускорить используемый нами оптимизатор. Хотя обычный градиентный спуск является основой для большинства этих алгоритмов, мы можем использовать более быстрые оптимизаторы, такие как оптимизация импульса, ускоренный градиент Нестерова, AdaGrad, RMSProp и оптимизация Адама или Надама. Эти более быстрые оптимизаторы в настоящее время являются одними из лучших стабильных оптимизаторов, но очень скоро их станет больше, поскольку машинное обучение продолжает быстро расти.

Мои мысли

Эта глава была нашим первым введением в глубокое обучение, и автор решил сосредоточиться на ошибках, с которыми мы столкнемся при построении моделей глубокого обучения, вместо того, чтобы учить нас создавать модели глубокого обучения и объяснять проблемы после этого. Я думаю, что это был интересный подход, но, надеюсь, он поможет мне помнить об этих методах, поскольку мы продолжаем изучать все более и более сложные методы. Единственное, чего мне хотелось от этой главы, так это большей ясности в том, в чем заключались настоящие проблемы. Я понял их все на высоком уровне, но хотел бы увидеть примеры некоторых из них, как они встречаются на практике.

Спасибо за чтение!

Если у вас есть какие-либо вопросы или отзывы, пожалуйста, свяжитесь со мной в твиттере @wtothdev или оставьте комментарий!

Кроме того, я хотел бы выразить огромную благодарность Орельен Жерон за написание такой прекрасной книги. Вы можете приобрести указанную книгу здесь (не партнерская).

Отказ от ответственности: я не зарабатываю деньги ни на одной из упомянутых услуг и решил прочитать и просмотреть эту книгу по своей собственной воле.