www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Оптимизация нейронной сети

Дата публикации Jun 27, 2019

«Цель состоит в том, чтобы попасть в точку оптимизации максимальной стоимости, где глупый риск сбалансирован с чрезмерной осторожностью», - Стивен Дж. Боуэн

Пример невыпуклой поверхности потерь с двумя параметрами. Обратите внимание, что в глубоких нейронных сетях мы имеем дело с миллионами параметров, но основной принцип остается неизменным. Источник:Йошуа Бенжио,

Эта статья является третьей в серии статей, направленных на демистификацию нейронных сетей и описание способов их проектирования и реализации. В этой статье я расскажу о следующих концепциях, связанных с оптимизацией нейронных сетей:

  • Проблемы с оптимизацией
  • инерция
  • Адаптивные курсы обучения
  • Инициализация параметра
  • Пакетная нормализация

Вы можете получить доступ к предыдущим статьям ниже. Первый предоставляет простое введение в тему нейронных сетей, для тех, кто незнаком. Вторая статья охватывает более промежуточные темы, такие как функции активации, нейронная архитектура и функции потерь.

Простое введение в нейронные сети

Подробный обзор нейронных сетей с множеством примеров и простых изображений.

towardsdatascience.com

Комплексное введение в архитектуру нейронной сети

Подробный обзор нейронной архитектуры, функций активации, функций потерь, блоков вывода.

towardsdatascience.com

Эти учебные пособия в значительной степени основаны на заметках и примерах из нескольких классов, преподаваемых в Гарварде и Стэнфорде на факультетах информатики и данных.

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

mrdragonbear / Neural-сети

Внесите свой вклад в развитие mrdragonbear / Neural-Networks, создав учетную запись на GitHub.

github.com

Проблемы с оптимизацией

Говоря об оптимизации в контексте нейронных сетей, мы обсуждаемневыпуклая оптимизация,

Выпуклая оптимизациявключает в себя функцию, в которой есть только один оптимум, соответствующий глобальному оптимуму (максимум или минимум). Для выпуклых задач оптимизации не существует понятия локальной оптимальности, что делает их относительно простыми для решения - это общие вводные темы в классах оптимизации для студентов и выпускников.

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

Для нейронной сети кривая или поверхность, о которой мы говорим, является поверхностью потерь. Поскольку мы пытаемся свести к минимуму ошибку прогнозирования сети, мы заинтересованы в поиске глобального минимума на этой поверхности потерь - это цель обучения нейронной сети.

Есть несколько проблем, связанных с этим:

  • Какова разумная скорость обучения?Слишком маленькая скорость обучения занимает слишком много времени, чтобы сходиться, а слишком большая скорость обучения будет означать, что сеть не будет сходиться.
  • Как нам избежать застревания в локальной оптиме?Один локальный оптимум может быть окружен особенно крутой функцией потерь, и может быть трудно «избежать» этого локального оптимума.
  • Что если морфология поверхности потери изменится?Даже если мы сможем найти глобальный минимум, нет гарантии, что он будет оставаться глобальным минимумом бесконечно долго. Хороший пример этого - когда тренируешься на наборе данных, который не является представителем фактического распределения данных - при применении к новым данным поверхность потерь будет другой. Это одна из причин, почему попытка сделать наборы обучающих и тестовых данных репрезентативными для общего распределения данных имеет такое большое значение. Другим хорошим примером являются данные, которые обычно изменяются в распределении из-за его динамического характера - примером этого могут быть пользовательские предпочтения для популярной музыки или фильмов, которые меняются изо дня в день и из месяца в месяц.

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


Местная Оптима

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


Седловые Очки

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

Седловая точка - одновременно локальный минимум и локальный максимум.

Примером функции, которая часто используется для тестирования производительности алгоритмов оптимизации на седловых точках, являетсяФункция Розенбрука, Функция описывается формулой:f (x, y) = (a-x) ² + b (y-x²) ²,который имеет глобальный минимум в(х, у) = (а, а²),

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

График функции Розенброка двух переменных. Здесь a = 1, b = 100, а минимальное значение нуля равно (1,1).
Анимация функции Розенброка от трех переменных.Источник

Плохое кондиционирование

Важной проблемой является конкретная форма функции ошибок, которая представляет проблему обучения. Давно замечено, что производные функции ошибки обычноплохо обусловленной, Эта плохая обусловленность отражается в ландшафтах ошибок, которые содержат много седловых точек и плоских участков

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

Гессиан может использоваться для определения того, является ли данная стационарная точка седловой или нет. Если гессиан неопределен в этом месте, эта стационарная точка является седловой. Это также можно обосновать аналогичным образом, посмотрев на собственные значения.

Вычисление и хранение полной матрицы Гессена занимаетO (N²)память, которая невозможна для многомерных функций, таких как функции потерь нейронных сетей. Для таких ситуацийусечены-Ньютона такжеквазиньютоновскийалгоритмы часто используются. Последнее семейство алгоритмов использует приближения к гессиану; один из самых популярных квазиньютоновских алгоритмовBFGS,

Часто для нейронных сетей матрица Гессеплохо обусловленный- выход изменяется быстро при небольшом изменении ввода. Это нежелательное свойство, поскольку оно означает, что процесс оптимизации не особенно стабилен. В этих средах обучение идет медленно, несмотря на наличие сильных градиентов, поскольку колебания замедляют процесс обучения.


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

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

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

Приведенные выше уравнения верны для одного слоя. Мы можем написать вывод дляNсеть:

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

Если значения больше 1, для большого значенияN(глубокая нейронная сеть), значения градиента будут быстро взрываться по мере их распространения по сети. Взрывающиеся градиенты приводят к «обрывам», если не реализовано ограничение градиента (градиент обрезается, если он превышает определенное пороговое значение).

Пример обрезанных и незарезанных градиентов.
Градиентное ограничение.

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


Так что же нам делать? Мы обнаружили, что нейронные сети обречены иметь большое количество локальных оптимумов, часто содержащих как острые, так и плоские долины, которые приводят к стагнации обучения и нестабильному обучению.

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

инерция

Одной из проблем, связанных со стохастическим градиентным спуском (SGD), является наличие колебаний, возникающих в результате обновлений, не использующих информацию о кривизне. Это приводит к медленной SGD при высокой кривизне.

(Слева) Ванильный SGD, (справа) SGD с импульсом. Goodfellow et al. (2016)

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

Название импульса происходит от того факта, что это аналогично понятию линейного импульса в физике. Объект, который имеет движение (в данном случае это общее направление, в котором движется алгоритм оптимизации), имеет некоторую инерцию, которая заставляет его стремиться двигаться в направлении движения. Таким образом, если алгоритм оптимизации движется в общем направлении, импульс заставляет его «сопротивляться» изменениям направления, что приводит к ослаблению колебаний для поверхностей с высокой кривизной.

Импульс - это дополнительный термин в целевой функции, который представляет собой значение от 0 до 1, которое увеличивает размер шагов, предпринимаемых к минимуму, пытаясь выпрыгнуть из локального минимума. Если срок импульса велик, то скорость обучения должна быть меньше. Большое значение импульса также означает, что конвергенция произойдет быстро. Но если и импульс, и скорость обучения поддерживаются на больших значениях, вы можете пропустить минимум с огромным шагом. Небольшое значение импульса не может надежно избежать локальных минимумов, а также может замедлить обучение системы. Импульс также помогает сгладить изменения, если градиент продолжает менять направление. Правильное значение импульса может быть получено либо методом проб и проб, либо путем перекрестной проверки.

Momentum использует градиенты прошлого для обновления значений, как показано в формуле ниже. Значениеvсвязанный с импульсом часто называют «скоростью». Больший вес применяется к более новым градиентам, создавая экспоненциально убывающее среднее значение градиентов.

Мы можем видеть влияние добавления импульса на алгоритм оптимизации. Первые несколько обновлений не показывают реального преимущества перед стандартным SGD - поскольку у нас нет предыдущих градиентов, которые мы могли бы использовать для нашего обновления. По мере того, как количество обновлений увеличивается, мы запускаем импульс и ускоряем конвергенцию.

SGD без импульса (черный) по сравнению с SGD с импульсом (красный).

Другой тип импульса, который существует - это импульс Нестерова, который мы кратко обсудим.


Нестеров Импульс

Хорошее обсуждение импульса Нестерова дано вСуцкевер, Мартенс и др. «О важности инициализации и импульса в глубоком обучении» 2013,

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

т.е. классический импульс:

vW(t+1) = momentum.*Vw(t) - scaling .* gradient_F( W(t) )
W(t+1) = W(t) + vW(t+1)

В то время как импульс Нестеров заключается в следующем:

vW(t+1) = momentum.*Vw(t) - scaling .* gradient_F( W(t) + momentum.*vW(t) )
W(t+1) = W(t) + vW(t+1)

Разница невелика, но на практике это может иметь огромное значение.

Эту концепцию может быть трудно понять, поэтому ниже приведено визуальное представление о разнице между традиционным обновлением импульса и импульсом Нестерова.

Источник (Стэнфордский класс CS231n)

Адаптивная скорость обучения

Колебания вдоль вертикального направления - Обучение должно быть медленнее по параметру 2 Использовать разную скорость обучения для каждого параметра?


AdaGrad

Momentum добавляет обновления наклона нашей функции ошибок и ускоряет SGD по очереди. AdaGrad адаптирует обновления к каждому отдельному параметру для выполнения больших или меньших обновлений в зависимости от их важности.

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

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


RMSProp

Для невыпуклых задач AdaGrad может преждевременно снизить скорость обучения. Мы можем использовать экспоненциально взвешенное среднее для накопления градиента.


Адам

Адам представляет собой комбинацию RMSprop и импульса (аналогично, Надам относится к комбинации RMSprop и Нестерова импульса). Адам относится кадаптивная оценка момента,и это самый популярный оптимизатор, используемый сегодня для нейронных сетей.

Адам вычисляет адаптивные показатели обучения для каждого параметра. В дополнение к хранению экспоненциально убывающего среднего значения прошлых квадратов градиентов vt, как Adadelta и RMSprop, Адам также сохраняет экспоненциально убывающее среднее значение прошлых градиентов, аналогично импульсу.

Инициализация параметра

В предыдущих разделах мы рассмотрели, как лучше ориентироваться на поверхности потерь целевой функции нейронной сети, чтобы сходиться к глобальному оптимуму (или приемлемому хорошему локальному оптимуму). Теперь мы рассмотрим, как мы можем манипулировать самой сетью, чтобы облегчить процедуру оптимизации.

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

Возьмем для примера сеть, которую мы инициализируем со всеми значениями нуля. Что произойдет в этом сценарии? Сеть на самом деле ничего не узнает. Даже после обновления градиента все веса будут по-прежнему равны нулю из-за того, как мы вычисляем обновления градиента.

Представьте, что мы реализовали это и решили, что это проблема, а затем решили установить для нашей инициализации сети все то же значение 0,5. Что теперь будет? Сеть действительно может чему-то научиться, но мы преждевременно прописали некоторую форму симметрии между нейронными единицами.

В целом, это хорошая идея, чтобы избежать предположения любой формы нейронной структуры путем рандомизации весов в соответствии с нормальным распределением. Это часто делается в Keras путем указания случайного состояния (которое обеспечивает случайность, но обеспечивает повторяемость измерений).

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


Xavier Initialization

Инициализация Xavier - это простая эвристика для назначения весов сети. С каждым проходящим слоем мы хотим, чтобы дисперсия оставалась неизменной. Это помогает нам не допустить взрыва сигнала до высоких значений или исчезновения до нуля. Другими словами, нам нужно инициализировать веса таким образом, чтобы дисперсия оставалась одинаковой как для ввода, так и для вывода.

Веса взяты из распределения с нулевым средним и определенной дисперсией. Для полностью связного слоя смвходы:

Значениеминогда называютвентилятор в:количество поступающих нейронов (входные единицы в весовом тензоре).

Важно помнить, что это эвристический подход и, следовательно, не имеет особой теоретической поддержки - он просто наблюдался эмпирически, чтобы продемонстрировать свою эффективность Вы можете прочитать оригинал статьиВот,


Он нормальная инициализация

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

В этом методе веса инициализируются с учетом размера предыдущего слоя, что помогает быстрее и эффективнее достичь глобального минимума функции стоимости. Веса все еще случайны, но различаются по дальности в зависимости от размера предыдущего слоя нейронов. Это обеспечивает контролируемую инициализацию, следовательно, более быстрый и эффективный градиентный спуск.

Для блоков ReLU рекомендуется:


Инициализация смещения

Смещение инициализации относится к тому, как смещения нейронов должны быть инициализированы. Мы уже описали, что веса должны быть случайным образом инициализированы с некоторой формой нормального распределения (чтобы нарушить симметрию), но как мы должны приблизиться к уклонам?

Перефразируя курс Stanford CS231n: Самый простой и распространенный способ инициализации смещений - установить их на ноль - поскольку нарушение асимметрии обеспечивается небольшими случайными числами в весах. Для нелинейностей ReLU некоторым людям нравится использовать небольшие постоянные значения, такие как 0,01 для всех смещений, потому что это гарантирует, что все блоки ReLU срабатывают в начале и, следовательно, получают и распространяют некоторый градиент. Тем не менее, неясно, обеспечивает ли это постоянное улучшение, и более распространено устанавливать смещения на ноль.

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


Предварительная инициализация

Еще один метод инициализации весов заключается в использовании предварительной инициализации. Это характерно для сверточных сетей, используемых для изучения изображений. Метод включает в себя импорт весов уже обученной сети (такой как VGG16) и использование их в качестве начальных весов обучаемой сети.

Этот метод действительно применим только для сетей, которые должны использоваться с данными, аналогичными тем, на которых сеть обучалась. Например, VGG16 был разработан для анализа изображений, если вы планируете анализировать изображения, но у вас мало образцов данных в наборе данных, предварительная инициализация может быть подходящим методом для использования. Это основная концепция, лежащая в основе трансферного обучения, но термины «предварительная инициализация» и «трансферное обучение» не обязательно являются синонимами.

Пакетная нормализация

До этого момента мы рассматривали способы навигации по поверхности потерь нейронной сети с использованием импульса и адаптивных скоростей обучения. Мы также рассмотрели несколько методов инициализации параметров, чтобы минимизироватьаприориуклоны внутри сети. В этом разделе мы рассмотрим, как мы можем манипулировать самими данными, чтобы помочь нашей оптимизации модели.

Для этого мы рассмотрим пакетную нормализацию и некоторые способы ее реализации, чтобы помочь оптимизации нейронных сетей.


Нормализация функций

Нормализация функций - это именно то, что она говорит, она включает в себя нормализацию функций перед применением алгоритма обучения. Это включает масштабирование функции и обычно выполняется во время предварительной обработки.

Согласно статье «Пакетная нормализация: ускорение глубокого сетевого обучения за счет уменьшения внутреннего ковариатного сдвигаГрадиентный спуск сходится гораздо быстрее при масштабировании объекта, чем без него.

Есть несколько способов масштабирования данных. Одним из распространенных методов являетсямин-макс нормализация, Посредством чего

Самый простой способ масштабирования данных известен какмин-макс нормализацияи включает масштабирование диапазона признаков для масштабирования диапазона в [0, 1] или [-1, 1]. Это делается путем вычитания каждого значения на минимальное значение, а затем масштабирования его на диапазон значений, представленных в наборе данных. Если распределение данных сильно искажено, это может привести к множеству значений, сгруппированных в одном месте. Если это происходит, его иногда можно смягчить, взяв логарифм переменной свойства (так как это имеет тенденцию сворачивать выбросы, поэтому они оказывают меньшее влияние на распределение).

Другой распространенный методсредняя нормализацияэто, по сути, то же самое, что и нормализация min-max, за исключением того, что из каждого значения вычитается среднее значение Это наименее распространенный из трех, обсуждаемых в этой статье.

Стандартизация функцийделает значения каждого признака в данных нулевым средним (при вычитании среднего в числителе) и единицей дисперсии. Этот метод широко используется для нормализации во многих алгоритмах машинного обучения (обычно таких, которые основаны на дистанционных методах). Общий метод расчета заключается в определении среднего распределения и стандартного отклонения для каждого признака. Далее мы вычитаем среднее значение из каждой функции. Затем мы делим значения (среднее значение уже вычтено) каждого признака на его стандартное отклонение.

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


Сдвиг внутренней ковариации

Эта идея также исходит из ранее упомянутой статьи «Пакетная нормализация: ускорение глубокого сетевого обучения за счет уменьшения внутреннего ковариатного сдвига».

Авторы определяютсдвиг внутренней ковариации:

Мы определяем Внутренний Сдвиг Covariate как изменение в распределении активаций сети из-за изменения параметров сети во время обучения.

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

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

Хорошо известно, что сети сходятся быстрее, если входные данные были отбелены (т. Е. Нулевое среднее, единичные отклонения) и являются некоррелированными, а внутреннее ковариатное смещение приводит к прямо противоположному.

Пакетная нормализацияявляется методом, предназначенным для уменьшения внутреннего ковариатного сдвига для нейронных сетей.


Пакетная нормализация

Пакетная нормализация является расширением идеи стандартизации функций для других уровней нейронной сети. Если входной слой может извлечь выгоду из стандартизации, почему бы не остальные сетевые уровни?

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

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

Однако после этого сдвига / шкалы активации по некоторым случайно инициализированным параметрам веса в следующем слое перестают быть оптимальными. SGD (Стохастический градиентный спуск) отменяет эту нормализацию, если это способ минимизировать функцию потерь.

Следовательно, пакетная нормализация добавляет два обучаемых параметра к каждому слою, поэтому нормализованный выходной сигнал умножается на параметр «стандартное отклонение» (γ) и добавляет «средний» параметр (β) Другими словами, пакетная нормализация позволяет SGD выполнять денормализацию, изменяя только эти два веса для каждой активации, вместо потери устойчивости сети путем изменения всех весов.

Эта процедура известна какпакетное преобразование нормализации,

Пакетное преобразование нормализации.

Чтобы проиллюстрировать это наглядно, мы можем проанализировать приведенный ниже рисунок. Мы смотрим на первый скрытый слой, сразу после входного слоя. Для каждого изNПо мини-партиям мы можем рассчитать среднее и стандартное отклонение выхода.

Впоследствии это повторяется для всех последующих скрытых слоев. После этого мы можем дифференцировать потерю сустава дляNмини-партии, а затем распространять обратно через операции нормализации.

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

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

Есть несколько преимуществ использования пакетной нормализации:

  1. Уменьшает внутренний ковариантный сдвиг.
  2. Уменьшает зависимость градиентов от масштаба параметров или их начальных значений.
  3. Регуляризация модели и снижение потребности в отсевах, фотометрических искажениях, нормализации местных реакций и других методах регуляризации.
  4. Позволяет использовать насыщающие нелинейности и более высокие скорости обучения.

Заключительные комментарии

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

Дальнейшее чтение

Курсы глубокого обучения:

НЛП-ориентированные:

Vision-ориентированные:

Важные статьи нейронной сети:

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map