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

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

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

Чем эта запись в блоге не является: получение максимально возможной точности с максимальной обобщаемостью.

Обзор

  1. Загрузка, импорт и предварительная обработка набора данных
  2. Графики настройки для сравнения точности и потерь
  3. Создайте и оцените образец классификатора настроений
  4. Оцените различные гиперпараметры классификатора настроений, созданного на шаге 3.

Мы будем оценивать гиперпараметры в 6 частях

Мы будем использовать простой классификатор настроений и поэтапно оценивать его эффективность по нескольким параметрам.

A. Activation Function 
B. Cost function 
C. Number of epochs 
D. Gradient Estimation 
E. Network Architectures 
F. Network Initialization

Мы постараемся ответить на следующие два вопроса для каждой части.

  1. Как изменение гиперпараметров влияет на точность?
  2. Как это влияет на скорость стабилизации сети?

В конце мы ответим Каковы лучшие гиперпараметры? по результатам нашего эксперимента.

1. Загрузите, импортируйте и предварительно обработайте набор данных

Набор данных Yelp имеет соответствующее количество отзывов, опубликованных людьми с более чем 4 континентов.
Мы будем использовать только часть большого набора данных. Для получения более подробной информации перейдите по ссылке https://www.yelp.com/dataset/documentation/json.

review.json

Содержит полные текстовые данные отзыва, включая user_id, для которого написан отзыв, и business_id, для которого написан отзыв.

Общий размер набора данных: 3.6GB с 4.7 Million отзывами

Я всегда храню данные yelp в mongoDB для своих экспериментов по анализу текста.

Вы можете загрузить вышеуказанный набор данных и импортировать его в mongoDB с помощью

Мы также можем напрямую загрузить набор данных в память в кадр данных pandas, используя

{'_id': ObjectId('5a0f13033f1fccaeb911ce15'), 
'business_id': 'uYHaNptLzDLoV_JZ_MuzUA', 
'cool': 0, 
'date': '2016-07-12', 
'funny': 0, 
'review_id': 'VfBHSwC5Vz_pbFluy07i9Q', 
'stars': 5, 
'text': 'My girlfriend and I stayed here for 3 nights and loved it. The location of this hotel and very decent price makes this an amazing deal. When you walk out the front door Scott Monument and Princes street are right in front of you, Edinburgh Castle and the Royal Mile is a 2 minute walk via a close right around the corner, and there are so many hidden gems nearby including Calton Hill and the newly opened Arches that made this location incredible.\n\nThe hotel itself was also very nice with a reasonably priced bar, very considerate staff, and small but comfortable rooms with excellent bathrooms and showers. Only two minor complaints are no telephones in room for room service (not a huge deal for us) and no AC in the room, but they have huge windows which can be fully opened. The staff were incredible though, letting us borrow umbrellas for the rain, giving us maps and directions, and also when we had lost our only UK adapter for charging our phones gave us a very fancy one for free.\n\nI would highly recommend this hotel to friends, and when I return to Edinburgh (which I most definitely will) I will be staying here without any hesitation.', 'useful': 0, 'user_id': 'cjpdDjZyprfyDG3RlkVG3w'}

Разделяйте настроения на основе звездочек

  • исключение: звездочки ‹ 3
  • положительно: звезды › 3
  • нейтральный: звездочки == 3, которые не учитываются в этом эксперименте, чтобы сообщение было лаконичным.

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

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

1020
3123833
1042245
1020 1020
1020 1020

2. Графики настройки для сравнения точности и потерь

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

Теперь давайте воспользуемся GridSpec API для создания сетки из нескольких подграфиков, которые мы создали выше.

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

3. Создайте и оцените образец классификатора настроений

Давайте построим модель RNN, чтобы классифицировать текстовое предложение как положительное или отрицательное.

Keras using TensorFlow backend.

Загрузить данные и преобразовать в индексную последовательность

Note: Total Vocabulary is 12568 but we'll only be using the top 10000 most frequent words
Total number of Training records (2000, 10) 
Total number of Validation records (20, 10) 
Total number of Test records (20, 10)

МОДЕЛЬ ГЛУБОКОГО ОБУЧЕНИЯ

  • Мы создадим модель глубокого обучения и проверим точность.
  • Модель глубокого обучения представляет собой рекуррентную нейронную сеть (RNN) для кодирования последовательной структуры обзоров в yelp с использованием LSTM/GRU и одного/нескольких слоев с последним слоем сигмоиды для вывода вероятности того, является ли отзыв положительным или отрицательно.

A. Определите сетевую архитектуру

B. Компиляция сети

_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding_2 (Embedding) (None, 10, 10) 100010 _________________________________________________________________ lstm_2 (LSTM) (None, 512) 1071104 _________________________________________________________________ dropout_2 (Dropout) (None, 512) 0 _________________________________________________________________ dense_2 (Dense) (None, 1) 513 ================================================================= Total params: 1,171,627 Trainable params: 1,171,627 Non-trainable params: 0 _________________________________________________________________

C. Подходящая сеть

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

  1. Ранняя остановка, если потери проверки не меняются в течение 10 эпох
  2. Мы снизим скорость обучения на 0,2, если потери при проверке не изменятся в течение 5 эпох до 10e-4.
  3. Контрольный указатель для сохранения нашей модели, если точность проверки увеличивается по сравнению с прошлым разом каждые 5 эпох.
  4. Вы также могли заметить, что мы загружаем данные последовательно, поэтому также перетасовываем наши данные при обучении.
Train on 2000 samples, validate on 20 samples 
Epoch 1/10 2000/2000 [==============================] - 2s 1ms/step - loss: 0.6906 - acc: 0.5405 - val_loss: 0.6327 - val_acc: 0.5000 Epoch 2/10 2000/2000 [==============================] - 1s 354us/step - loss: 0.5710 - acc: 0.7065 - val_loss: 0.5471 - val_acc: 0.6500 
Epoch 3/10 2000/2000 [==============================] - 1s 473us/step - loss: 0.4071 - acc: 0.8220 - val_loss: 0.4945 - val_acc: 0.7000 
Epoch 4/10 2000/2000 [==============================] - 1s 571us/step - loss: 0.2934 - acc: 0.8740 - val_loss: 0.5234 - val_acc: 0.7000 Epoch 5/10 2000/2000 [==============================] - 1s 494us/step - loss: 0.2219 - acc: 0.9130 - val_loss: 0.4714 - val_acc: 0.7500 
Epoch 6/10 2000/2000 [==============================] - 1s 539us/step - loss: 0.1600 - acc: 0.9330 - val_loss: 0.4838 - val_acc: 0.7000 Epoch 7/10 2000/2000 [==============================] - 1s 479us/step - loss: 0.1325 - acc: 0.9485 - val_loss: 0.5398 - val_acc: 0.7500 Epoch 8/10 2000/2000 [==============================] - 1s 493us/step - loss: 0.1144 - acc: 0.9555 - val_loss: 0.6874 - val_acc: 0.7000 
Epoch 9/10 2000/2000 [==============================] - 1s 473us/step - loss: 0.0908 - acc: 0.9690 - val_loss: 0.9427 - val_acc: 0.7000 
Epoch 10/10 2000/2000 [==============================] - 1s 418us/step - loss: 0.0770 - acc: 0.9700 - val_loss: 0.9480 - val_acc: 0.6000

D. Оцените сеть

20/20 [==============================] - 0s 499us/step 
Test loss: 1.203082799911499 Test Accuracy: 0.6499999761581421

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

E. Делайте прогнозы

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

Text                    True Predicted
bad service             NEGATIVE NEGATIVE 
good service            POSITIVE POSITIVE
I think the food is bad NEGATIVE NEGATIVE 
if only food was good   NEGATIVE NEGATIVE 
beautiful but bad       NEGATIVE NEGATIVE 
good food               POSITIVE NEGATIVE 
the good food           POSITIVE NEGATIVE 
love good food          POSITIVE NEGATIVE 
love the good food      POSITIVE NEGATIVE

Мы должны использовать матрицу путаницы, но даже без нее мы видим, что приведенные выше результаты точны на 50%.

F. Очистка памяти

4. Оцените различные гиперпараметры классификатора настроений, созданного на шаге 3.

А. Функция активации

Как изменение функции активации влияет на точность?
Изменение функции активации не сильно влияет на точность, но сильно влияет на потери. Поскольку нашей целью здесь является бинарная классификация, любой другой функции активации нужно что-то, что может выдавать 0 или 1 в качестве вывода, для которого sigmoid — это путь. softmax и softplus дают нам лучшие потери и точность.
Несмотря на то, что мы могли бы использовать softmax вместо положительного и отрицательного класса с categorical_entropy, это лучше подходило бы для многоклассовой классификации, которая даст нам распределение вероятностей по всем классам, а затем взятие argmax по распределению даст нам наиболее вероятный класс.
elu дало нам самую высокую точность, но все же разница в точности для различных функций активации применяется здесь.

Как это влияет на скорость плато в сети?
Порядок убывания плато в сети:

  1. танх
  2. софтплюс
  3. сигмовидная
  4. Элу
  5. Селу
  6. релу

B. Функция стоимости

Измените функцию стоимости. Как это влияет на точность?
Изменение стоимости оказывает огромное влияние на точность некоторых функций, таких как шарнир и дивергенция KL. mean_squared_error очень подходит для RNN, что видно из графика, binary_crossentropy является лучшим из решений 0/1, что очевидно, поскольку дает нам самую высокую точность.

Как это влияет на скорость стабилизации сети?
Это сильно влияет на скорость стабилизации сети.

  • squared_hinge был крутым после каждой эпохи и был либо с максимальной точностью, либо с самой низкой.
  • kullback_leibler_divergence попал в локальный минимум и так и не вышел из него, в то время как cosine_proximity продолжает прыгать в минимумы и выходить из них.
  • mean_squared_error и logcosh близки к оптимальным и равномерно выходят на плато после 9-й эпохи.
  • binary_crossentropy дает нам самую высокую точность проверки около 5 эпох.

С. Эпохи

Изменить количество инициализируемых эпох. Как это влияет на точность?
Увеличение количества эпох с использованием оптимизатора adam и функций стоимости logcosh не повысило точность, а повысило точность с увеличением количества эпох меньше небольшого числа эпох.

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

D. Оценка градиента

Изменить количество оценок градиента. Как это влияет на точность?
Изменение оценки градиента влияет на то, как быстро мы достигаем оптимальной меры точности. Adadelta пересеклись, несмотря на то, что сильное разнообразие в поиске оптимумов привело нас к наивысшей точности 0,55 с тестовой потерей 0,12, сравнимой с sgd, которая эквивалентна и стабильна.

Как это влияет на скорость выхода сети на плато?
Примечательно, что SGD даже не достигла плато сети за 10 эпох и была очень нестабильной.

В порядке убывания количества эпох, затраченных каждым оценщиком на плато сети:

  1. RMSProp
  2. Надам (Нестеров Адам: так же, как Адам, по сути, является RMSprop с импульсом, Надам - ​​это Адам RMSprop с импульсом Нестерова.)
  3. Адам
  4. Адаград
  5. Ададельта
  6. SGD (стохастический градиентный спуск)

Д. Сетевая архитектура

Различные формы сетевой архитектуры:

  • Количество слоев
  • Размер каждого слоя
  • Тип соединения
  • Предварительно обученные компоненты, например. словесные вложения или веса, если современные модели, но мы не будем рассматривать эту часть.
SINGLE LAYER GRU MODEL _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding_84 (Embedding) (None, 10, 10) 100010 _________________________________________________________________ gru_27 (GRU) (None, 512) 803328 _________________________________________________________________ dropout_94 (Dropout) (None, 512) 0 _________________________________________________________________ dense_84 (Dense) (None, 1) 513 ================================================================= Total params: 903,851 Trainable params: 903,851 Non-trainable params: 0 _________________________________________________________________
SINGLE LAYER GRU MODEL
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding_85 (Embedding) (None, 10, 10) 100010 _________________________________________________________________ gru_28 (GRU) (None, 512) 803328 _________________________________________________________________ dropout_95 (Dropout) (None, 512) 0 _________________________________________________________________ dense_85 (Dense) (None, 1) 513 ================================================================= Total params: 903,851 Trainable params: 903,851 Non-trainable params: 0 _________________________________________________________________
SINGLE LAYER BiDIRECTIONAL GRU MODEL
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding_86 (Embedding) (None, 10, 10) 100010 _________________________________________________________________ bidirectional_21 (Bidirectio (None, 1024) 1606656 _________________________________________________________________ dropout_96 (Dropout) (None, 1024) 0 _________________________________________________________________ dense_86 (Dense) (None, 1) 1025 ================================================================= Total params: 1,707,691 Trainable params: 1,707,691 Non-trainable params: 0 _________________________________________________________________
SINGLE LAYER BiDIRECTIONAL GRU MODEL
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding_87 (Embedding) (None, 10, 10) 100010 _________________________________________________________________ bidirectional_22 (Bidirectio (None, 1024) 1606656 _________________________________________________________________ dropout_97 (Dropout) (None, 1024) 0 _________________________________________________________________ dense_87 (Dense) (None, 1) 1025 ================================================================= Total params: 1,707,691 Trainable params: 1,707,691 Non-trainable params: 0 _________________________________________________________________
DOUBLE LAYER LSTM MODEL
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding_88 (Embedding) (None, 10, 10) 100010 _________________________________________________________________ lstm_68 (LSTM) (None, 10, 512) 1071104 _________________________________________________________________ dropout_98 (Dropout) (None, 10, 512) 0 _________________________________________________________________ lstm_69 (LSTM) (None, 512) 2099200 _________________________________________________________________ dropout_99 (Dropout) (None, 512) 0 _________________________________________________________________ dense_88 (Dense) (None, 1) 513 ================================================================= Total params: 3,270,827 Trainable params: 3,270,827 Non-trainable params: 0 _________________________________________________________________
DOUBLE LAYER BiDIRECTIONAL LSTM MODEL
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding_89 (Embedding) (None, 10, 10) 100010 _________________________________________________________________ bidirectional_23 (Bidirectio (None, 10, 1024) 2142208 _________________________________________________________________ dropout_100 (Dropout) (None, 10, 1024) 0 _________________________________________________________________ bidirectional_24 (Bidirectio (None, 1024) 6295552 _________________________________________________________________ dropout_101 (Dropout) (None, 1024) 0 _________________________________________________________________ dense_89 (Dense) (None, 1) 1025 ================================================================= Total params: 8,538,795 Trainable params: 8,538,795 Non-trainable params: 0 _________________________________________________________________

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

Изменить номер сетевой архитектуры. Как это влияет на точность?
Изменение архитектуры сети влияет на потери при тестировании больше, чем на точность, поскольку большинство систем достигли глобального оптимума при обучении, установленном к 20-й эпохе. Еще одна вещь, которую следует отметить, это то, что даже с увеличением количества слоев самая наивная из всех (первая сеть) оказалась сильным соперником по сравнению с глубокими двунаправленными двухслойными сетями с большим количеством слоев. Лучше всего предположить, что двойные слои действительно лучше захватывают, но, учитывая фиксированное количество эпох, здесь лучше всего использовать бритву Оккама.

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

F. Инициализация сети

Различные формы инициализации сети:

Изменить количество сетевых инициализаций. Как это влияет на точность?
Изменение инициализации сильно влияет на точность в этой сети, как мы видим, lecun_uniform дал нам самые низкие потери при тестировании и самую высокую точность, но точность проверки постоянно прыгала в минимумы все время. на протяжении всего обучения. Инициализация с zeros и ones дает нам аналогичные потери при тестировании.

Как это влияет на скорость выхода сети на плато?
Изменение инициализации влияет на плато, поскольку к концу 10-й эпохи все модели были нестабильны с точки зрения точности и потерь на проверочных наборах.

Вывод

Это лучшие параметры, которые мы нашли:

Dataset Size: 2000 samples
A. Activation Function    - sigmoid and softplus
B. Cost function          - logcosh
C. Number of epochs       - 30
D. Gradient Estimation    - Adadelta
E. Network Architectures  - Single Layer Bidirectional GRU 512 units
F. Network Initialization - lecun_uniform

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

Есть ряд будущих тестов, которые можно запустить с учетом времени и оборудования:

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

Спасибо за ваше терпение.

Спасибо Nik Bear Brown за идею опробовать различные параметры и Jake Bennett за создание http://markdowntomedium.com/, который помог мне преобразовать мой блокнот Jupyter. для уценки для этого поста.