Вопрос или проблема
Я пытаюсь заставить простой автокодировщик работать с набором данных Iris, чтобы исследовать автокодировщики на базовом уровне. У меня возникает проблема, когда потери модели чрезвычайно высоки (>20).
Может, кто-то поможет мне понять, выглядит ли эта модель нормально на первый взгляд?
Некоторые вопросы, в которых я был бы рад помощи:
-
Существует 3 возможных выхода для y – поэтому я использовал Softmax на последнем слое – если я сделаю OHE для вывода, будет ли использование чего-то вроде Sigmoid более уместным, так как значения находятся в диапазоне от 0 до 1?
-
Изменение наименьшего изменения в слоях (слой кодирования изменен с 3 на 6) –> вызывает значительное изменение потерь – это нормально?
-
Каждый запуск автокодировщика дает другой результат – нормально ли, что он не детерминирован?
-
Почему последний слой должен быть того же размера (4), что и входное измерение – можем ли мы заставить его выдавать 3, например? Я знаю, что могу получать данные из латентного слоя, но тогда я не могу подгонять модель на основе этого слоя.
import pandas as pd import numpy as np from sklearn.model_selection import cross_val_score, train_test_split from sklearn.preprocessing import LabelEncoder, OneHotEncoder from sklearn.pipeline import Pipeline from sklearn import datasets from tensorflow.keras.layers import Input, Dense, BatchNormalization, LeakyReLU from tensorflow.keras import backend, layers, models, metrics, utils from tensorflow.keras import regularizers, Input, Model, optimizers iris = datasets.load_iris() x = iris.data y = iris.target.reshape(-1, 1) X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.20) input_dim = Input(shape=(X_train.shape[1],)) encoded = layers.Dense(6, input_dim='input_dim')(input_dim) encoded = BatchNormalization()(encoded) encoded = LeakyReLU()(encoded) encoded = layers.Dense(3)(encoded) decoded = layers.Dense(4, activation='softmax')(encoded) autoencoder = Model(inputs=input_dim, outputs=decoded) opt = optimizers.Adam(lr=0.00001) autoencoder.compile(optimizer=opt , loss="categorical_crossentropy" , metrics=[metrics.CategoricalAccuracy()]) history = autoencoder.fit([X_train] , [X_train] , epochs=16 , batch_size=2 , verbose=2 , validation_data=((X_test),(X_test)) )
Спасибо за любую помощь!
В вашем вопросе есть некоторая путаница, поскольку вы говорите об AE, но используете softmax в качестве вывода… что почти не имеет смысла
Прежде всего, потеря сама по себе не имеет значения:
Если я дам вам две модели с двумя разными потерями (в вашем случае, двумя AE), вы не сможете никаким образом угадать, какая из них лучшая (поэтому потеря в 20 ничего не значит)
Что касается ваших вопросов:
- зависит от распределения… one hot encoding выхода предполагает мультиномиальное распределение, которое можно аппроксимировать как softmax, так и sigmoid, но в 99% случаев вы должны использовать softmax, так как он непосредственно кодирует ограничения распределения, и НС не нужно их изучать (как при аппроксимации вероятности, вы можете использовать линейный выходной слой, но НС должна научиться выдавать значения от 0 до 1, и нет никаких гарантий, что она всегда это сделает)
- автокодировщик направлен на уменьшение размерности… вы начинаете с 4 признаков и позволяете ему использовать 6 измерений (в данном случае мы говорим об избыточном AE, но вам нужно какое-то ограничение, чтобы они работали как ожидается)
- добро пожаловать в мир не выпуклой оптимизации… если начальная точка случайна (что и есть, поскольку веса инициализируются случайно), вы, вероятно, попадете в другую локальную минимум
- автокодировщик нацелен на изучение функции идентичности ($decoder(encoder(x)) = x$), поэтому, очевидно, нет, вход должен иметь ту же форму, что и выход
На этом этапе я довольно уверен, что AE – это не то, что вы ищете, а скорее обычная дискриминационная НС (поскольку вы используете cat-cross-ent в качестве функции потерь)
Ответ или решение
Понимание Автоencoder и Проблемы с Высокой Ошибкой
Автоencoder — это тип нейронной сети, который используется для обучения представления данных, уменьшая их размерность через кодировку и декодирование. В вашей ситуации с использованием набора данных ирисов, вы столкнулись с высокой ошибкой и некоторыми концептуальными вопросами. Давайте рассмотрим их более подробно.
Высокая Ошибка в Модели
Ошибка, превышающая 20, может показаться настораживающей. Однако важно отметить, что абсолютное значение ошибки само по себе не имеет смысла без контекста. Разные модели или разные задачи могут иметь различные диапазоны ошибок. Основное внимание следует уделить относительным изменениям ошибки в процессе обучения и валидации, а не ее абсолютным значениям.
Ответы на Ваши Вопросы
-
Softmax и Sigmoid для Классификации:
Использование функции активации Softmax на выходном слое с 4 нейронами не совсем корректно для задачи автоencoder, который должен восстанавливать входные данные. Softmax применяется для многоклассовой классификации, тогда как функция активации Sigmoid подходит для бинарной классификации или многомерной (при одномерном выходе). В вашем случае, если вы хотите использовать OHE (one-hot encoding), Softmax подходит лучше, так как он выводит вероятности, которые суммируются до 1. Для автоencoder важно, чтобы выход совпадал с входом по размерности. -
Изменение Размерности Скрытых Слоёв:
Изменение числа нейронов в слоях автоencoder может значительно повлиять на производительность модели. Если вы увеличиваете размер слоя кодирования до 6, это может снизить способность сети к обобщению, поскольку модель становится "избыточной" и может научиться запоминать данные вместо их обобщения. Это явление нормально для автоencoders, которые часто требуют определённых ограничений на размерность, чтобы научиться эффективным представлениям. -
Детерминированность Результатов:
Автоencoder (и нейронные сети в целом) подвержены случайности из-за случайной инициализации весов и особенностей процесса тренировки. Это означает, что даже если вы используете одни и те же данные и архитектуру, вы можете получать разные результаты при каждом запуске. Чтобы добиться более предсказуемого поведения, можно использовать фиксированное значение случайного seed (начального значения генератора случайных чисел) при инициализации весов. -
Размерность Выходного Слоя:
Выходной слой автоencoder должен иметь такую же размерность, как и входной слой, так как задача заключается в восстановлении входного сигнала (идентичной функции). Если вы хотите иметь выход размером 3 (например, для классификации), это больше относится к задачам, связанным с классификацией, чем к автоencoder’ам. Вам нужно рассмотреть, возможно, использование обычной нейронной сети для классификации, где выходной слой будет соответствовать количеству классов.
Рекомендации
Если ваша цель состоит в изучении автоencoder’ов, убедитесь, что:
- Вы используете правильную архитектуру и функции активации, соответствующие цели.
- Размерность входа и выхода совпадает.
- Подумайте о добавлении регуляризации или других стратегий для снижения переобучения.
Стоит попробовать натренировать простую моделируемую архитектуру автоencoder’а без использования функций активации, не относящихся к запросу, чтобы увидеть, как это повлияет на ошибку.
Если ваша цель — классификация, рассмотрите возможность перехода к простой полносвязной сети с соответствующими выходами и функциями потерь для задачи классификации.
Заключение
Автоencoder’ы — мощный инструмент для обучения представлений и сжатия данных. Понимание архитектуры и соответствующих задач является ключевым для достижения успеха в работе с ними. Обязательно проведите дополнительные эксперименты, чтобы глубже понять, как различные изменения архитектуры влияют на качество модели.