Почему только оптимизатор Adam работает хорошо в моем случае?

Вопрос или проблема

Я пытаюсь классифицировать тексты по категориям (один текст может иметь несколько категорий). Для этого я использовал one-hot кодированные метки (с помощью sklearn.preprocessing.MultiLbaleBinarizer()). Мои тексты также закодированы с использованием one-hot, но с keras.preprocessing.text.one_hot.

Вот мой код:

csv_data_name="learning_base"
df = pd.read_csv('../../datasets/csv/' + csv_data_name + '.csv ')
df['label_list'] = np.array(df.labels.str.split('|'))
df = df.drop(columns=['labels'])

# Удаляем неполные строки (строки без меток)
df = df.dropna()

encoder = MultiLabelBinarizer()
labels_binary = encoder.fit_transform(df.label_list)
output_dim = labels_binary.shape[1]

vocab_size = 200000
encoded_docs = [one_hot(d, vocab_size) for d in df.text]
max_length = 200
padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding='post')

# Разделение данных
training_set_data, testing_set_data_whole, training_set_target, testing_set_target_whole = train_test_split(
    padded_docs,
    labels_binary,
    test_size=0.1,
    random_state=0,
    shuffle=False)

model = Sequential()
model.add(Embedding(vocab_size, 200, input_length=max_length))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(output_dim, activation='sigmoid'))

model.compile(optimizer=TFOptimizer(tf.train.AdamOptimizer()), loss="mean_squared_error",
              metrics=['acc'])

model.fit(training_set_data, training_set_target, epochs=50, verbose=True, batch_size=200,
          callbacks=[EarlyStopping(monitor="acc", patience=3, verbose=True), tensorboard])

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

Вот мои результаты:

|Оптимизатор|Время на эпоху|Точность жесткой классификации|Точность|Полнота|эпоха|
|-------- | ----------- |-------------------------- | ------- |------|---|
|GradientDescent                             |00:21|0%|12.5%|0%|3 (ES)|
|GradientDescent (`learning_rate = 0.01`)    |00:21|0%|3.9%|16.1%|7 (ES)|
|Adadelta                                    |00:24|0%|3.1%|25.7%|3 (ES)|
|Adagrad                                     |00:26|0%"https://datascience.stackexchange.com/"https://datascience.stackexchange.com/"13 (ES)|
|Ftrl                                        |00:27|0%"https://datascience.stackexchange.com/"https://datascience.stackexchange.com/"8 (ES)|
|Momentum (`momentum = 0.01`)                |00:22|0%"https://datascience.stackexchange.com/"https://datascience.stackexchange.com/"18 (ES)|
|Adam (`learning_rate = 0.01` : default)     |02:37|53%|80%|60.54%|13 (ES)|

И вот тензорборд для точности:
tensorboard for accuracy plot

Могут быть несколько причин:

  1. Одна из причин может заключаться в том, что оптимизатор Adam является комбинацией нескольких других
    техник оптимизации (например, momentum и бегущего среднего
    квадратов градиента). Эта комбинация хорошо работает для
    мульти-меточной классификации текста.
  2. Другая причина может заключаться в том, что мульти-меточная классификация текста — это разреженная
    проблема. Оптимизатор Adam в TensorFlow имеет разрежённую
    реализацию.

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

Всегда ли метод градиентного спуска сходится к оптимуму?

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

Это, вероятно, не так. То, что вы сравниваете, не совсем честно. Чтобы сделать это правильно, вам следует попытаться найти лучшие гиперпараметры для всех оптимизаторов и сравнить их соответствующую производительность. То, что это говорит вам сейчас, по сути, это “какой оптимизатор работает лучше всего со стандартными гиперпараметрами и некоторыми произвольными, которые я выбрал”.

Ответ или решение

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

Изучение адаптивности оптимизаторов

  1. Adam как обобщение нескольких оптимизационных техник
    Adam объединяет лучшие черты нескольких алгоритмов: он использует моментум и экспоненциальные скользящие средние для ускорения градиентного спуска и стабилизации его сходимости. Это делает его особенно эффективным в задачах, где данные могут быть представлены в виде редких матриц, как это бывает с оne-hot закодированными текстами.

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

Проблемы других оптимизаторов

  1. Фиксированные или неподходящие гиперпараметры
    Один из ключевых моментов, который вы упомянули, это использование фиксированных гиперпараметров. Для достижения наилучших результатов нужно тщательно настраивать параметры каждого оптимизатора. То, что работает для Adam, может оказаться неподходящим для других алгоритмов.

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

Рекомендованные действия

  • Гиперпараметрический тюнинг
    Проведите систематический поиск по сетке (grid search) или используйте более современные методы, такие как Bayesian Optimization, для настройки гиперпараметров всех оптимизаторов.

  • Проверка работы вариаций Adam
    Попробуйте использовать NAG (Nesterov Accelerated Gradient) или Backtracking версии Adam, чтобы улучшить адаптацию шага обучения.

  • Экспериментируйте с другими адаптивными оптимизаторами
    Кроме Adam, попробуйте использовать оптимизаторы типа RMSProp, которые тоже демонстрируют хорошие результаты с разреженными данными.

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

Оцените материал
Добавить комментарий

Капча загружается...