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

Зачем мне учиться реализовывать исследовательские работы по машинному обучению?

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

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

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

Как только вы научитесь выполнять исследовательские работы, вы будете в состоянии сравняться с этими исследователями.

Эти исследователи также приобрели эти навыки благодаря практике чтения и выполнения исследовательских работ.

Как мне читать и оформлять документы?

Вы можете сказать: «Хм, у меня есть общее представление об алгоритмах глубокого обучения, таких как полностью связанные сети, сверточные нейронные сети, рекуррентные нейронные сети, но проблема в том, что я хотел бы разработать SOTA (современное состояние) клонирование голоса AI. но я ничего не знаю о клонировании голоса :( ».

Хорошо, вот ваш ответ (некоторые части моего метода взяты из Советов Эндрю Нг по чтению статей).

Если вы хотите узнать о конкретной теме:

  1. Соберите 5–6 статей, относящихся к определенной теме (вы можете просто выполнить поиск в arxiv или аналогичных веб-сайтах, чтобы найти статьи, связанные с темой).
  2. Не читайте полностью ни одной статьи, вместо этого просмотрите все статьи и выберите интересующий вас, или, если вы имели в виду конкретную статью, возьмите ее, никто не сможет вас остановить.
  3. Внимательно прочтите аннотацию и поймите идею на высоком уровне и посмотрите, сохраняется ли ваш интерес, если да, продолжайте бегло просматривать изображения и посмотреть, сможете ли вы сделать предположения о том, о чем может быть статья.
  4. Теперь внимательно прочтите введение, строка за строкой, потому что большая часть того, что содержится в статье, будет объяснена здесь самым простым способом с минимальными математическими вычислениями.
  5. Если хотите, можете пропустить математические уравнения на первом проходе, не пропускайте математику, если вам знакомы греческие буквы.
  6. В любой ситуации, если вы застряли или некоторые слова сбивают с толку, не стесняйтесь гуглить. Никто не рождается хозяином всего;)
  7. После выполнения первого прохода вы окажетесь в состоянии, в котором вы поймете высокоуровневое представление о том, что статья пытается доказать или улучшить.
  8. Во втором проходе попытайтесь понять почти все, что написано в документе, и, если вы столкнетесь с каким-либо псевдокодом, попробуйте преобразовать его в вашу библиотеку Python по вашему выбору (PyTorch, TensorFlow…)
  9. Вы можете получить больше статей для чтения и лучше понять область, перейдя к разделу ссылок в каждой статье (так же, как соединение точек).

💡 Несколько советов для лучшего понимания статьи:

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

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

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

По словам Эндрю Нг, если вы можете прочитать 5–10 статей по теме (например, клонирование голоса), вы будете в хорошем состоянии для реализации системы клонирования голоса но если вы прочтете 50–100 статей по этой теме, вы будете в состоянии проводить исследования или разрабатывать передовые технологии по этой теме.

Давайте обсудим статью

  1. Общий обзор

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

Мы рассмотрим статью Яна Гудфеллоу Generative Adversarial Nets (GAN) и реализуем то же самое с PyTorch.

Общий обзор содержания статьи четко обсуждается в аннотации статьи.

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

Не запутайтесь по названию, это просто названия, данные двум нейронным сетям.

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

Хорошо, позвольте мне немного прояснить это.

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

Генератор генерирует новые человеческие лица с такими же размерами (В × Ш × С), что и реальные изображения, и показывает их дискриминатору, дискриминатор сообщает, является ли изображение поддельным изображением, созданным генератором, или реальным изображением человека.

Теперь у вас может возникнуть вопрос: «Хм, как этот дискриминатор различает настоящие и поддельные изображения?», И вот ваш ответ:

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

💡DCGAN - это еще один тип GAN, который использует сверточные нейронные сети вместо полносвязных сетей и дает лучшие результаты.

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

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

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

Вот шаги, которые мы должны выполнить при реализации кода:

→ Загрузите набор данных, содержащий реальные изображения.

→ Создайте случайный двумерный тензор (распределение вероятностей поддельных данных).

→ Создайте модель дискриминатора и модель генератора.

→ Обучить дискриминатор на реальных и поддельных изображениях

→ Теперь подайте распределение вероятностей поддельного изображения в генератор и проверьте, может ли дискриминатор идентифицировать поддельное изображение, созданное генератором.

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

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

2. Функция потерь

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

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

Функция потерь из статьи: [log D (x)] + [log (1 - D (G (z)))]

x → реальное изображение

z → поддельные данные или шум (случайный тензор)

D → модель дискриминатора

G → модель генератора

G (z) → подача фальшивых данных или шума в генератор (вывод - фальшивое изображение)

D (x) → подача реального изображения на дискриминатор (выход 0 или 1)

D (G (z)) → поддельные данные поступают в генератор, генератор выводит изображение, а изображение передается на дискриминатор для предсказания (вывод 0 или 1)

Если вы хотите использовать функцию потерь из статьи, позвольте мне объяснить вам:

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

Возьмем первую часть уравнения:

- D (x) выводит 0 или 1, поэтому, когда мы максимизируем log [D (x)], он заставляет дискриминатор выводить значение, близкое к 1, когда x (реальное изображение) подается на него, и это то, что нам нужно.

Теперь давайте рассмотрим вторую часть уравнения:

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

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

Для генератора нам нужно минимизировать приведенное выше уравнение, но в статье рассматривается только вторая часть уравнения [log (1 - D (G (z)))] для минимизации.

- когда мы минимизируем D (G (z)), дискриминатор выводит значение, близкое к 0, а общий вывод уравнения становится близким к 1, и это то, чего хочет достичь наш генератор, дурак дискриминатор для предсказания 1 (реального), когда выдается поддельное изображение от генератора.

Ура, давайте перейдем к коду!

Я реализовал код в google colab, поэтому будет лучше, если вы попробуете код в google colab или jupyter notebook.

  1. Импортируйте необходимые библиотеки -

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

Мы загрузим изображение как изображение PIL с помощью библиотеки PIL, и мы изменим размер и превратим изображение в тензор, используя преобразование torchvision, а затем создадим искусственный шум размера (1 × 100) для генерации изображения.

3. Создайте модель дискриминатора, которая представляет собой не что иное, как полностью подключенную нейронную сеть, которая принимает реальное изображение или поддельное изображение и выводит 0 или 1.

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

5. Инициализируйте модели, оптимизаторы и функцию потерь, затем переместите их на желаемое устройство (cuda или cpu). Мы будем использовать двоичную кросс-энтропийную потерю для дискриминатора и функцию потерь, обсуждаемую в статье (log (1 - D (G (z)))) для генератора.

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

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

Последние мысли

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

Ссылка на полный код доступна здесь.