Почему моя нейронная сеть не может выучить функцию abs(x1-x2)?

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

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

У меня есть столбцы x1, x2, x3, x4 с 4 классами для предсказания.

Если тренировать только на x1, x2, x3, x4, то я получаю точность 88%

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

Три новые функции:

  1. df['x12'] = abs (df['x1']-df['x2'])

  2. df['x13'] = abs (df['x1']-df['x3'])

  3. df['x14'] = abs (df['x1']-df['x4'])

Если я обучаю модель на x1, x2, x3, x4 и abs(x1-x2), abs(x1-x3), abs(x1-x4), то получаю точность 98%

Я хочу получить 98% точности без использования abs(x1-x2), abs(x1-x3), abs(x1-x4)

С этими новыми вручную созданными функциями я получаю точность валидации 98%, что отлично.

Однако, когда я убираю эти функции, точность валидации падает до 88%.

Мой вопрос: функция abs(x1-x2) должна быть достаточно простой, чтобы модель могла обучаться сама, без моего ручного создания признаков.

Почему же точность падает, когда я убираю эти три (очень простые) функции?

Не способна ли модель выучить это самостоятельно?

Вот как выглядит моя модель:


    inputs = Input(shape=input_shape)

    x = Dense(units=64)(inputs)
    x = PReLU()(x)  
    x = BatchNormalization()(x)
    x = Dropout(rate=0.3)(x)

    x = Dense(units=64)(x)
    x = PReLU()(x)  
    x = BatchNormalization()(x)
    x = Dropout(rate=0.3)(x)

    x = Dense(units=64)(x)
    x = PReLU()(x)  
    x = BatchNormalization()(x)
    x = Dropout(rate=0.3)(x)

    x = Dense(units=64)(x)
    x = PReLU()(x)  
    x = BatchNormalization()(x)
    x = Dropout(rate=0.3)(x)

    x = Dense(units=32)(x)
    x = PReLU()(x)  
    x = BatchNormalization()(x)
    x = Dropout(rate=0.3)(x)

    multiclass_output = Dense(units=num_outputs, activation='softmax')(x)

    model = Model(inputs=inputs, outputs=multiclass_output)

    model.compile(
        loss="categorical_crossentropy",
        metrics=["accuracy"],
        optimizer=Adam(learning_rate=LR)
    )

    return model
```

Трудно ответить на этот вопрос конкретно без дополнительных деталей. Тем не менее, вот несколько вещей, о которых стоит подумать.

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

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

  3. Вещи, которые кажутся “простыми” для людей, могут не быть легкими для нейронных сетей. Я не вижу причин, по которым нейронная сеть должна “легко” изучать скрытые представления, которые захватывают абсолютные значения различий между входами.

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

Ваш вопрос о том, почему ваша нейронная сеть не может самостоятельно выучить функцию abs(x1-x2), действительно имеет несколько аспектов, которые следует рассмотреть.

  1. Увеличение размерности входных данных: Когда вы добавляете новые функции (x12, x13, x14), вы не только позволяете модели лучше представлять данные, но и, возможно, увеличиваете количество параметров в модели. Это дает модели больше возможностей для обучения, что может привести к более высокому качеству предсказания. Попробуйте добавить дубликаты оригинальных функций и посмотрите, как это повлияет на точность. Это может дать понять, насколько увеличение размерности и параметров важно.

  2. Нормализация данных: Если вы применяете нормализацию (например, стандартизацию), это может повлиять на способность модели учиться на абсолютных различиях между переменными. Абсолютные значения могут не сохранять свои относительные величины после нормализации. Убедитесь, что вы нормализуете данные корректно и учитываете влияние новых признаков на усредненные значения.

  3. Сложность обучения для нейронных сетей: Хотя простая функция abs(x1-x2) может казаться интуитивно понятной, для нейронной сети это может представлять собой некую сложность, так как она не оптимизирована для выявления явных арифметических операций между переменными. Модели обучаются на основе открытых паттернов и корреляций в данных, и они могут не улавливать простейшие зависимости, если они не представлены явно как новые признаки. Эта особенность делает обучение зависимостей с использованием чисто нейронных методов менее предсказуемым.

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

  5. Контекст обучающей выборки: Возможно, что распределение значений в ваших функциях x1, x2, x3 и x4 создает сложности для нахождения зависимости, если модель обучалась на данных, где abs(x1-x2) не проявляет четких паттернов. Вы можете попробовать уменьшить шум в данных или рассмотреть дополнительные методы предобработки.

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

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

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

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