Сегодняшние темы - это трансферное обучение и НЛП.
Смешивание / сглаживание этикеток
10b_mixup_label_smoothing.ipynb
Это то, что может заменить все другие техники увеличения. Он хорошо распространяется на все домены и определенно то, на что каждый должен обратить внимание.
Идея состоит в том, чтобы объединить два изображения, взяв некоторое количество другого изображения и некоторое количество другого. Так же поступаем и с этикетками. Так, например, мы можем взять 30% плоского изображения и 70% изображения собаки, а затем меткой для этой комбинации будет 30% плоскости и 70% собаки.
Как мы решаем, какое количество снимков нужно сделать? Когда мы должны это сделать?
Приведенный выше график используется для определения количества снимков для определенного изображения. Это показывает, что в большинстве случаев мы берем ноль процентов другого и один процент другого, но иногда мы берем что-то среднее между этими числами.
Чтобы использовать бета-распределение, нам нужно использовать гамма-функцию. Давайте посмотрим, как это работает.
Чтобы легко использовать букву Греции, вам нужно найти клавишу набора на клавиатуре. У меня Ubuntu 18, и настройка ключа компоновки заняла довольно много времени. Https://superuser.com/questions/28932/how-do-i-input-greek-characters-in-ubuntu/29262 Этот разговор приблизит вас к результату.
Factorial = n!
https://en.wikipedia.org/wiki/Factorial
линейная комбинация = экспоненциально взвешенное скользящее среднее
В softmax одно число намного выше других. Это не годится для путаницы. Сглаживание меток - это то, в чем мы не используем горячее кодирование, а используем что-то вроде 0,9-горячего кодирования. Это означает, что вместо того, чтобы пытаться дать единицу для какого-то класса, он пытается дать 0,9 для одного класса и 0,1 для других классов.
Это простой, но очень эффективный метод для зашумленных данных. На самом деле вы хотите использовать это почти всегда, если не уверены, что существует только один правильный ярлык.
Смешанная высокоточная тренировка
10c_fp16.ipynb
Обучение смешанной точности - это метод, в котором вместо 32-битных чисел с плавающей запятой мы используем 16-битные числа с плавающей запятой. Это ускорит обучение примерно в 3 раза. Он работает только с современными драйверами Nvidia, и вот объяснение.
Мы не можем сделать все в 16-битном формате, потому что это неточно. На приведенном выше графике вы можете увидеть, что делается в 16-битном и что следует делать в 32-битном. Как видите, прямой и обратный проход выполняются в 16-битном формате, что отнимает много времени.
В блокноте показано, как использовать библиотеку APEX для этого на практике.
11_train_imagenette.ipynb
XResNet
Это похоже на ResNet, но с некоторыми хитростями. 1. твик называется ResNet-C. Идея состоит в том, что вместо ядра 7x7 мы используем 3 раза ядро 3x3. 2. настройка заключается в том, что мы инициализируем пакетную норму, чтобы иногда весы были равны 0, а иногда - 1. Идея заключается в том, что иногда ResBlock можно игнорировать. Таким образом, мы можем обучать очень глубокие модели с высокой скоростью обучения, потому что, если модели не нужен слой, она может пропустить его, оставив веса норм пакета равными нулю. 3. настройка состоит в том, чтобы переместить два шага на один виток вверх.
Газета, о которой говорит Джереми: https://arxiv.org/abs/1812.01187 (набор хитростей)
Крупные компании пытаются похвастаться тем, насколько большие партии они могут обучить за один раз. Для нас, нормальных людей, повышение скорости обучения - это то, чего мы хотим. Таким образом мы сможем ускорить обучение и лучше обобщить.
Джереми показал, как, используя эти методы, он создал 3-ю лучшую модель ImageNet. Две вышеперечисленные модели намного больше и требуют большой вычислительной мощности.
11a_transfer_learning.ipynb
Используя те же методы, мы можем создать хорошие модели для трансферного обучения.
Чтобы сохранить модель, мы называем ее learn.model.state_dict()
. Мы этого не писали, но, по словам Джереми, это всего лишь три строки кода.
Затем, чтобы использовать эти предварительно обученные веса, нам нужно удалить последний линейный слой и заменить его другим слоем с нужным количеством выходов.
При точной настройке важно отметить, что норма партии может нарушить точность, если она будет заморожена. Решение этой проблемы - заморозить только те слои, которые не содержат норм партии.
Дискриминационные группы LR и param
Дискриминационный LR был тем, что у нас разная скорость обучения для разных слоев.
Вопрос: Почему вы против установки перекрестной проверки? Хорошо, если у вас недостаточно данных для создания правильного набора для проверки, но если у вас есть даже тысяча точек данных, это часто бессмысленно. Так что Джереми не против, но в большинстве случаев это бессмысленно, потому что данных достаточно.
Вопрос: Рекомендации по отладке модели глубокого обучения? Во-первых, не делайте ошибок. Постарайтесь построить настолько простую модель, чтобы не было ошибок. Проверяйте каждый шаг во время обучения, чтобы убедиться, что все работает так, как вы ожидали. Отслеживайте все, что вы делаете, чтобы позже было легче увидеть, что могло пойти не так. Отладка действительно сложна, поэтому вы должны постоянно проверять, все ли работает. Тесты внутри кода великолепны, потому что вы сразу заметите, если что-то сломалось, пока не стало слишком поздно.
Обработка естественного языка
ULMFiT - это трансферное обучение, применяемое к AWD-LSTM.
Хотя многие люди думают, что ULMFiT предназначен только для текста, на самом деле его можно использовать для множества различных задач. Это может быть использовано во многих задачах, содержащих последовательные данные.
Языковая модель = предсказать следующий элемент в последовательности
Далее мы посмотрим, как ULMFiT работает с нуля. Есть четыре разных блокнота, в которых показаны этапы построения окончательной модели.
12_text.ipynb
Сначала мы импортируем набор данных IMDb, который содержит 50 000 обзоров ярлыков и 50 000 обзоров без ярлыков. Таким образом, есть наборы данных train, test и unsup (unsupervised = no label).
Мы не можем дать модели чистый текст, поэтому мы токенизируем и нумеруем текст.
До нормальной токенизации происходят две вещи. Прежде всего, мы меняем такие вещи, как <br />
на \n
, чтобы текст был согласован. Мы также определяем некоторые специальные токены, которые мы можем использовать в тексте, чтобы облегчить понимание модели.
Такая предварительная обработка упрощает понимание текста модели. Когда есть жетон для повторяющихся символов, модели легче понять сходство 5 вопросительных знаков и 6 вопросительных знаков.
Как всегда, нам нужен способ использования текста в виде пакетов. Давайте рассмотрим пример, чтобы лучше понять, как происходит пакетирование.
Вот где люди запутались. Обычно в задачах по зрению пакет - это что-то, что содержит много изображений, но в NLP один текстовый документ может быть разбит на несколько пакетов. Эти пакеты используются для согласованности текста.
Вопрос: Почему вы не использовали обычные методы предварительной обработки НЛП, такие как удаление стоп-слов, выделение корней или лемматизация? Они полезны в традиционном НЛП, но при использовании нейронных сетей они просто забирают важную информацию из модели.
Вопрос: Как выбрать соотношение bptt и bs? Попробуйте разные вещи. Нет никаких исследований по этому поводу.
Нам также необходимо создать способ использования текстов разного размера. Прежде всего, необходимо отсортировать пакеты по длине. Первый пакет - это текст с наибольшим количеством токенов, а последний - текст с наименьшим количеством токенов. Есть некоторая доля случайности, но в среднем это выглядит так. Затем для пакетов сортировщика мы добавляем «заполнение», которое представляет собой просто некоторый токен, который используется как пустой в каждом месте.
12a_awd_lstm.ipynb
Теперь мы импортировали и предварительно обработали данные. Далее мы собираемся создать AWD-LSTM. Сначала мы начнем с создания RNN с нуля.
Сигмовидная функция (σ) = [0,1]
tanh = [-1,1]
Xₜ = вход
hₜ-₁ = скрытое состояние
cₜ-₁ = ячейка ( Как и скрытое состояние, только тензор первого ранга)
Сначала мы умножаем входное и скрытое состояние на некоторую матрицу весов, как обычно, а затем объединяем их. Мы разбиваем результат на четыре тензора равного размера, которые затем вводим в четыре разных места. Первый путь называется воротами забвения. Идея состоит в том, что он умножается на ячейку, и когда значения находятся между нулем и единицей, он может удалить некоторые значения ячейки. Затем идут входные ворота и ворота ячейки. Входные ворота умножаются на ворота ячейки, а затем результат добавляется, чтобы забыть результат ворот. Затем сумма этих трех ворот переходит к следующему слою, и она также проходит через tanh и после этого добавляется к четвертой входной части.
Dropout. Dropout просто создает группу из нулей и двоек (две, потому что стандартное значение равно 1, что означает, что выпадение может быть удалено, не влияя на масштабирование активаций). В RNN важно исключить всю последовательность в время. Есть еще что-то, что называется «выпадение веса», что означает просто выпадение веса. Третий вид исключения - это исключение встраивания, при котором встраивание слова прекращается полностью.
Все это вместе называется AWD LSTM. В языковой модели у нас есть один линейный слой поверх AWD LSTM, чтобы получить размер вывода встраивания слова, который является предсказанием следующего слова.
12b_lm_pretrained.ipynb
Этот ноутбук буквально сочетает в себе два предыдущих ноутбука. На высоком уровне есть два шага:
- импорт и предварительная обработка данных
- создать модель, которую мы сделали в предыдущем блокноте
12c_ulmfit.ipynb
Теперь воспользуемся моделью, которую обучили в предыдущем блокноте. Важно отметить, что в наборе данных IMDb мы использовали другой словарь, чем в викитексте 103. Чтобы решить эту проблему, мы просто объединяем два словаря, перезаписывая другие и используя вложения из викитекста 103.
Это все. В ULMFiT нет ничего особенного. Это просто использование трансферного обучения для получения лучших результатов.
Быстрый
Напоследок Джереми хотел сказать несколько слов о Свифте.
Вопрос: Как лучше всего изучить Swift и Tensorflow тем, кто ничего об этом не знает? Мы не требуем от вас понимания Swift в ходе курса.
Краткое содержание этой части: Swift - отличный язык для изучения. Вероятно, это будет важно в будущем, и если вы не научитесь этому сейчас, вам нужно это сделать в какой-то момент. Сообщество сейчас очень маленькое, так что это отличный способ стать частью чего-то, что может стать действительно большим в будущем. Это может быть один из тех моментов, когда вы позже оглядываетесь назад и сожалеете, что выбрали неправильный ответ, поэтому потратьте некоторое время на размышления. Просмотрите хотя бы следующие уроки и примите решение узнать больше, когда у вас появится некоторый уровень понимания.
Это не имеет ничего общего с курсом, но я просто хочу добавить ссылку на проект, над которым я работал с начала 2019 года. TrimmedNews - самый быстрый способ обсуждать новости. Вы можете присоединиться или создать частные группы, в которых пользователи могут комментировать интересные новости. Я использую глубокое обучение почти везде, и одна интересная функция - это обобщение новостей. Я понял, сколько времени провожу за чтением новостей, которых я не ожидал. С помощью этого приложения мне гораздо легче находить интересные новости, чем просто читать заголовки.
Примечания к уроку 8
Примечания к уроку 9
Примечания к уроку 10
Примечания к уроку 11
Примечания к 12 уроку
Заметки к 13 уроку
Заметки к 14 уроку
~ Ланкинен