Общеупотребимые нелинейные функции и их производные

Здравствуйте и вновь добро пожаловать на занятия по теме «Обработка данных: глубокое обучение на языке Python, часть 1».

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

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

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

И последняя функция, которую мы рассмотрим, – это функция relu (сокращение от rectifier linear unit). Название несколько непонятное, но график этой функции действительно похож на график линейной, да и сама функция действительно является линейной, но лишь в двух различных диапазонах.

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

Здравствуйте и вновь добро пожаловать на занятия по теме «Обработка данных: глубокое обучение на языке Python, часть 1».

На протяжении курса вы, вероятно, заметили, что некоторые действия кажутся произвольными. К примеру – как выбирается коэффициент обучения? Почему используется 4 скрытых единицы, а не 5, 10 или 1 000? В чём разница между гиперболическим тангенсом и функцией relu в качестве функции активации? Все эти важные элементы именуются гиперпараметрами. Это значит, что они являются параметрами, которые мы должны подобрать, но сами они не являются частью собственно модели. Как же подобрать правильные значения гиперпараметров?

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

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

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

Итак, пункт первый – практика приводит к успеху. Вы должны найти то, что вас интересует, и использовать свои знания. Если вы застряли – задавайте вопросы.

Теперь давайте поговорим о перекрёстной проверке. Это очень простая вещь, но если вы с ней не знакомы, то суть в следующем. Все данные – это сигнал плюс шум. Мы обучаем модель, чтобы она распознавала сигнал, а не шум. Если вы захотите добиться чересчур высокой точности, то вы получите «отличную» точность, но это значит, что модель будет соответствовать и сигналу, и шуму. На рисунке вы можете видеть, чем отличается хорошее соответствие модели (слева) от её переобученности (справа). Именно поэтому мы разделяем данные на учебный и проверочный наборы. Мы хотим отслеживать ошибку в обоих наборах – как с данными, на которых мы обучаем модель, так и на данных, на которых мы её не обучаем. Если вы переобучите модель, вы заметите, что ошибка проверочного набора начнёт расти. Чтобы получить статистический показатель этого процесса, мы измеряем ошибку несколько раз и находим среднее значение и дисперсию. Именно этому и служит перекрёстная проверка.

Суть в том, что вы делите данные на K частей. Предположим, K = 5, тогда у нас будет 5 итераций. При первой итерации мы обучаем модель на частях со 2-й по 5-ю, а проверяем на 1-й части данных. При второй итерации мы обучаем модель на частях 1, 3, 4 и 5, а проверяем модель на части 2. При третьей итерации модель обучается на частях 1, 2, 4 и 5, а проверяется на части 3. Всё это продолжается, K раз. Закончив эту процедуру, мы можем использовать среднее значение коэффициента классификации как меру того, насколько хороша данная конфигурация. Вы также можете использовать статистические тесты вроде Ttest, чтобы сравнить две модели и статистически определить, какая из них лучше, – такая функция есть в библиотеке Scipy. Нет особой необходимости проделывать эту процедуру, но, возможно, вам захочется проверить свою модель таким образом.

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

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

def crossValidation(model, X, Y< K=5)

X, Y = shuffle(X, Y)

sz = len(Y) / K

scores = []

for k in xrange(K):

xtr = np.concatenate([ X[:k*sz, :], X[ (k*sz + sz):, :] ])

ytr = np.concatenate([ Y[:k*sz, :], Y[ (k*sz + sz):, :] ])

xte = X[k*sz: (k*sz + sz), :]

yte = Y[k*sz: (k*sz + sz)]

model.fit(xtr, ytr)

score = model.score(xte, yte)

scores.append(score)

return np.mean(scores), np.std(scores)

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: