Определение нейронной сети для состояния кэша

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

Я работаю над проектом, связанным с набором данных примеров промахов кэша. Входные признаки модели структурированы следующим образом:

Особенности для каждого пути и входящей строки:

[Индекс пути, адрес памяти, будущий RD, рейтинг давно не использовавшихся, количество обращений, тип последнего доступа, количество загрузок, количество RFO, количество предвыборок]

Чтобы идентифицировать входящую строку, мы присваиваем ей way_index = 16, что также помогает, потому что если не производится выселение, симулятор возвращает victim_way = 16, следуя тому же механизму.

Тем не менее, учитывая, что всего есть 17 путей (включая входящую строку), это приводит к общему количеству 153 признаков на пример (17 × 9).

Особенности уровня набора:

Набор, вовлеченный в этот пример, представлен вектором, содержащим:

[Индекс набора, будущий RD набора, коэффициент промаха набора, коэффициент попадания набора]

Это приводит к 4 признакам на набор на пример.

Информация, связанная с доступом

Операция доступа, вызвавшая промах, кодируется со следующими атрибутами:

[Адрес ПК доступа, количество обращений, количество обращений с момента промаха, тип доступа] 4 признака на доступ на пример

Решение эксперта – Метка

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

Я попробовал следующую модель:
{
class BCModel(nn.Module):
def init(self):
super(BCModel, self).init()

    # Кодировщики
    self.set_encoder = nn.Linear(4, 16)  # Кодировщик уровня набора
    self.cache_encoder = nn.Linear(153, 64)  # Кодировщик кэш-пути
    self.access_encoder = nn.Linear(4, 16)  # Кодировщик уровня доступа
    
    # Нормализация после кодировщиков
    self.bn_set = nn.BatchNorm1d(16)
    self.bn_cache = nn.BatchNorm1d(64)
    self.bn_access = nn.BatchNorm1d(16)

    # Слой внимания
    self.set_attention = nn.Linear(16 + 64, 32)  # Слой внимания уровня набора
    self.access_attention = nn.Linear(16 + 64, 32)  # Слой внимания уровня доступа
    
    # Полностью связанная сеть (FNN)
    self.fc1 = nn.Linear(32 + 32, 64) # объединяет выходы внимания
    self.fc2 = nn.Linear(64, 32) # сокращает сложность
    self.output_layer = nn.Linear(32, 17)  # прогнозирует вероятности выселения для 17 путей выселения
    
def forward(self, set_features, cache_features, access_features):
    """
    Прямой проход модели.
    :param set_features: Тензор формы (batch_size, 4)
    :param cache_features: Тензор формы (batch_size, 153)
    :param access_features: Тензор формы (batch_size, 4)
    :return: Ранжирование выселения для каждого пути кэша (batch_size, 17)
    """

    batch_size = cache_features.shape[0]  # Получить размер пакета
    cache_features = cache_features.view(batch_size, -1)  # Изменить форму с (batch_size, 17, 9) → (batch_size, 153)

    # Кодировочные слои
    set_encoded = F.relu(self.set_encoder(set_features))
    cache_encoded = F.relu(self.cache_encoder(cache_features))
    access_encoded = F.relu(self.access_encoder(access_features))
    
    # Слой внимания
    set_attention_out = F.relu(self.set_attention(torch.cat([set_encoded, cache_encoded], dim=1)))
    access_attention_out = F.relu(self.access_attention(torch.cat([access_encoded, cache_encoded], dim=1)))
    
    # Слой слияния для комбинирования выходов внимания 
    fused = torch.cat([set_attention_out, access_attention_out], dim=1)
    
    # Полностью связанные слои
    x = F.relu(self.fc1(fused))
    x = F.relu(self.fc2(x))

    # Генерация начальных оценок выселения (логиты)
    probabilities = self.output_layer(x) 
    
    # Конвертация вероятностей в ранги выселения
    _, eviction_ranks = torch.sort(probabilities, descending=True, dim=1)  # Сортировка в порядке убывания
    
    return probabilities, eviction_ranks

}

Я постоянно наблюдаю высокий уровень потерь на валидации (около 2.3), что заставляет меня сомневаться, правильно ли моя модель структурирована для этой задачи. Есть ли у вас какие-либо предложения по ее улучшению?

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

Теория

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

Ваша задача требует построения архитектуры нейронной сети, которая эффективно обучается на данных, состоящих из трех главных аспектов: особенностей самих линий кэша (Per-Way Features), сетевых особенностей (Set-Level Features) и информации, связанной с доступом (Access Related Information). Для решения таких задач часто применяют различные методы кодирования и внимания, что позволяет модели фокусироваться на значимых признаках и объединять информацию из различных источников.

Пример

Вы привели пример реализации модели на PyTorch, которая включает три отдельных кодировочных слоя для каждой группы признаков, слои внимания для фокусировки модели на ключевых характеристиках и полностью связанный слой для комбинирования результатов. Несмотря на такие компоненты, ваша модель демонстрирует высокую валидационную потерю (около 2.3), что может свидетельствовать о неправильной настройке модели или недостаточном учете особенностей данных.

Применение

Для оптимизации вашей модели следует рассмотреть несколько аспектов:

  1. Улучшение кодировщиков и слоев внимания:

    • Попробуйте увеличить размерность слоев кодировщиков, особенно если объем данных значителен и вы хотите улучшить способность модели к извлечению особенностей. Например, попробуйте увеличить размерности cache_encoder до 128 и аналогично изменить параметры остальных кодировщиков.
    • Добавьте более сложные механизмы внимания, такие как механизм самовнимания (self-attention), который может захватить более сложные зависимости между признаками.
  2. Регуляризация и нормализация данных:

    • Добавление L2-регуляризации и/или Dropout слоев между слоями внимания и полной связностью может помочь снизить переобучение.
    • Убедитесь, что данные правильно нормализованы. Ненормализованные данные могут значительно ухудшить производительность нейронной сети.
  3. Оптимизация процесса обучения:

    • Экспериментируйте с различными оптимизаторами, такими как Adam или RMSProp, и настройте скорость обучения. Возможно, имеет смысл использовать адаптивное уменьшение скорости обучения (learning rate scheduling).
  4. Проблема дисбаланса данных:

    • Если в данных присутствует значительный дисбаланс в классах (например, одни классы доминируют над другими), рассмотрите возможность использования методов для борьбы с этим, например, селективное увеличение выборки (oversampling), уменьшение выборки (undersampling) или применение взвешенного критерия потерь.
  5. Дополнительные вложенные архитектуры:

    • Подумайте о возможности использования рекуррентных компонентов, таких как LSTM или GRU, для захвата временных зависимостей, особенно для признаков, связанных с последовательностями доступа.
  6. Интерпретация и отладка:

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

Заключение

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

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

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