Упражнения по достижению успеха в машинном обучении

Вы знаете больше, чем думаете

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

Итак, начнём с того, что многие из вас в качестве конечной цели ставили себе понять, как работают позднейшие и крупнейшие нейронные сети в глубоком обучении – свёрточные и рекуррентные нейронные сети вроде LSTM. Вы можете спросить: «Всё, что я узнал в этом курсе, – это как находить производные. Как это может научить меня свёрточным нейронным сетям и LSTM?». Что же, я рад, что вы спросили. В нескольких следующих слайдах я расскажу вам о новых и очень популярных разработках в сфере глубокого обучения и каким образом полученные в данном курсе навыки могут вам помочь.

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

y = \sigma (Wx).

Именно так делается прогноз.

Что мы делаем при обучении?

Мы берём производную функции затрат по J относительно W и двигаем W в этом направлении:

W \leftarrow W - \eta \frac {\partial J}{\partial W}.

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

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

y = \sigma (W_1 \sigma (W_2x)).

А как мы обучаем? Так же, как и ранее – берём производную и двигаемся в её направлении. При этом надо учитывать, что мы можем сделать нашу сеть сколь угодно глубокой и иметь w1, w2, w3 и так далее:

W_i \leftarrow W_i - \eta \frac {\partial J}{\partial W_i}.

В этом курсе вы видели, что мы можем включить любое количество весовых коэффициентов.

А что со свёрточными нейронными сетями? Ну, в данном случае вам прежде всего надо знать о свёртке, которая на самом деле относится не к машинному обучению, а к обработке сигналов. Тем не менее, в моём курсе по свёрточным нейронным сетям рассматриваются несколько примеров. Итак, как мы делаем прогноз? Точно так же, только в произведение Wx добавляется «звёздочка»:

y = \sigma (W_1 \sigma (W_2*x)).

где * означает свёртку.

Как и в случае с обычными нейронными сетями, у нас может быть любое количество свёрточных и обычных слоёв.

А как мы обучаем сеть? Опять же, как и ранее – берём производную и двигаемся в этом направлении:

W_i \leftarrow W_i - \eta \frac {\partial J}{\partial W_i}.

Вы, наверное, уже заметили повторяющийся элемент.

И про рекуррентные нейронные сети. Как и в случае со свёрточными нейронными сетями, мы должны познакомиться с новым элементом – временем. В частности, прогноз вычисляется в два приёма, причём текущее значение первой функции имеет несложную зависимость от её предыдущего значения:

h(t) = \sigma (W_xx(t) + W_hh (t-1)),

y(t) = \sigma (W_0 (h(t)).

А если вы полагаете, что обучение вновь состоит в нахождении производной функции затрат и движении в соответствующем направлении, – вы будете совершенно правы:

W_i \leftarrow W_i - \eta \frac {\partial J}{\partial W_i}.

И последнее, что мы рассмотрим, – автокодировщики, где префикс «авто-» понимается в смысле «само-». Это всего лишь нейронная сеть, в которой целевая переменная является одновременно и входной. Это даже более простая концепция, чем лежащие в основе свёрточных и рекуррентных сетей, поскольку вы сможете её понять, пользуясь лишь теми сведениями, которые почерпнули из данного курса, просто вместо обучения X и Y мы обучаем X и X. Но если автокодировщики просты, это не значит, что они не удивительны. Одно из крупнейших достижений в глубоком обучении состоит в том, что мы узнали, что можно взять ряд автокодировщиков, добавить в конце логистическую регрессию и получить даже лучшие прогнозы, чем просто глубокая нейронная сеть. Всё это вы можете сделать, пользуясь лишь теми знаниями, которые вы получили в этом курсе.

В чём мораль?

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

Упражнения по достижению успеха в глубоком обучении

Итак поговорим о том, как достичь успеха в глубоком обучении.

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

Глубокое обучение и модели машинного обучения в целом используются для составления прогнозов. Итак, что вы хотите спрогнозировать? Чем вы интересуетесь? Надеюсь, вы можете ответить самим себе на эти вопросы. Существует множество стандартных наборов данных для машинного обучения, которые исследователи используют в качестве проверочных тестов. Они бесплатных и их легко найти, хотя они не так хороши, как интересующие именно вас вещи. Но вы можете просмотреть базы данных MNIST, CIFAR, SVHN, Iris, а также правительственные данные, базу электронных писем Enron и многое другое.

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

В качестве контрольного задания я бы предложил удостовериться, что вы можете самостоятельно, поэтапно и не пересматривая видео, выполнить следующие действия. Итак, вы должны уметь находить производные сигмоиды, гиперболического тангенса и функции софтмакс. Далее, вы должны уметь находить производную функции затрат относительно весовых коэффициентов, используя функцию софтмакс, и это куда более трудная задача, чем вам может показаться, поскольку она требует не какой-то дополнительной математики, а аккуратности в вычислениях. Обратите внимание, я специально оставил этот вопрос в курсе в качестве упражнения для вас. Следующее – попытайтесь найти производную функции затрат относительно весовых коэффициентов в случае очень глубокой сети и удостоверьтесь, что видите и понимаете рекурсию в её структуре. И наконец вы должны уметь переписать уравнения обновления весовых коэффициентов в векторной форме, чтобы быть в состоянии написать соответствующий код в Numpy.

Повторю ещё раз: прогностические модели предназначены для обработки данных. Только вы можете выбрать данные для обработки, поскольку только вы знаете, что вам интересно. Чтобы достичь успеха в глубоком обучении, вы должны практиковаться в использовании этих моделей. Глубокое обучение не работает по принципу «подставляй и решай» – вы должны будете подобрать правильное количество скрытых узлов и скрытых слоёв, правильную скорость обучения, правильную регуляризацию и так далее. Потребуется очень много времени, но вы добьётесь успеха, лишь пытаясь сделать всё самостоятельно. Попытка освоить глубокое обучение, просто просматривая видео, подобна попытке овладеть теннисом, лишь читая книги о нём, – у вас ничего не получится, пока вы не начнёте играть в теннис. Если и когда вы столкнётесь с проблемами, не стесняйтесь задавать вопросы на форуме.

Однозначно, вам стоит проверять значение функции затрат в процессе градиентного спуска – именно поэтому я всегда вывожу её значение на экран, когда заканчивается обучение модели. Если вы видите, что функция затрат растёт или вообще увеличивается взрывообразно, значит что-то определённо идёт не так.

Практикуясь, вам придётся искать ответы на вопросы, вроде «Что, если у моих данных есть аномальные скачки?» или «Что, если не хватает данных?», или «Как мне обрабатывать изображения, звуки и предложения?»

Заметьте, на этих занятиях мы работаем с абстрактными векторами. Один из общих методов предварительной обработки данных является его нормализация – то есть сделать так, чтобы все входные данные лежали в диапазоне между 0 и 1, или вычитать из фактического значения переменной среднее значение и делить на стандартное отклонение. Что касается слов и предложений, вы можете использовать метод мешка слов, являющийся приёмом прямого кодирования, или применить более сложные методы вроде TF-IDF.

Вы можете узнать о прямом кодировании и других основных приёмах машинного обучения и обработки данных в моём первом курсе «Линейная регрессия на языке Python». Я разработал эти курсы таким образом, чтобы на каждом последующем уровне сложность немного повышалась, а поддержка в обучении – снижалась. Это значит, что вначале вы будете видеть более подробный код и не слишком строгие математические выкладки, но продвигаясь дальше, мы будем пропускать всё больше промежуточных этапов и писать всё более лаконичный код.

Подводя итог в вопросе, как преуспеть в глубоком обучении, скажем так: глубокое обучение – это инструмент, а хорошо умеют пользоваться инструментами только те, кто их постоянно их использует.

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

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