Медленное обучение против Tensorflow и внезапное снижение производительности на данных поезда

Я пишу реализацию PyTorch Logic Tensor Networks для семантической интерпретации изображений, в которой есть код Tensorflow с открытым исходным кодом.

Мне удалось собрать сеть, и она может тренироваться. Я считаю, что правильно копирую гиперпараметры для оптимизатора, и я также проверил правильность основной математики. Поэтому я вполне уверен, что все правильно настроил. Однако я заметил две вещи, которые мне трудно объяснить:

  1. Сеть обучается намного медленнее, чем реализация Tensorflow. Реализация Tensorflow достигает средней производительности поезда около 95% за 1000 шагов, тогда как для моего кода требуется ~ 3000 шагов.
  2. Производительность поезда внезапно меняется, когда производительность увеличивается.

Я дам немного больше информации о каждом, ниже.

Медленное сетевое обучение Я думал, что это может быть связано с гиперпараметрами для оптимизатора. В статье используется RMSProp. Я заметил, что версия Tensorflow имеет следующие гиперпараметры:

  • learning_rate: Тензор или значение с плавающей запятой. Скорость обучения.
  • затухание: коэффициент дисконтирования для истории / приближающегося градиента
  • импульс: скалярный тензор.
  • epsilon: небольшое значение, чтобы избежать нулевого знаменателя.
  • use_locking: если True использовать блокировки для операции обновления.
  • по центру: если True, градиенты нормализуются по оценочной дисперсии градиента; если Ложь, вторым моментом без центра. Установка значения True может помочь в обучении, но немного дороже с точки зрения вычислений и памяти. По умолчанию False.
  • name: необязательный префикс имени для операций, создаваемых при применении градиентов. По умолчанию "RMSProp"

Версия PyTorch имеет:

  • params (итерируемый) - итерируемый параметр для оптимизации или диктующий определение группы параметров
  • lr (float, необязательно) - скорость обучения (по умолчанию: 1e-2)
  • импульс (плавающий, необязательный) - коэффициент импульса (по умолчанию: 0)
  • альфа (с плавающей запятой, необязательно) - постоянная сглаживания (по умолчанию: 0,99)
  • eps (float, необязательный) - термин, добавленный к знаменателю для улучшения числовой стабильности (по умолчанию: 1e-8)
  • центрированный (bool, необязательный) - если True, вычислить центрированный RMSProp, градиент нормализуется путем оценки его дисперсии
  • weight_decay (float, необязательный) - снижение веса (штраф L2) (по умолчанию: 0)

Следуя статье, для гиперпараметров PyTorch RMSProp я использую:

  • LR = 0,01
  • РЕГУЛЯРИЗАЦИЯ = 1e-15
  • АЛЬФА = 0,9
  • EPSILON = 1e-10 Я предполагаю, что
  • альфа эквивалент параметра затухания тензорного потока
  • Снижение веса - это регуляризация, тензорный поток которой необходимо добавить к потере извне

В статье оптимизатор инициализируется здесь. Регуляризация осуществляется здесь. Соответствующие гиперпараметры частично определяются, когда оптимизатор инициализируется, а затем также здесь (Примечание: гиперпараметры определяются несколько раз в разных местах, что приводит в замешательство, но я проверил, и ссылка, которую я даю, - это то, где устанавливаются окончательные значения),

Падение производительности Я использую среднее гармоническое для расчета средней производительности, которая очень чувствительна к более низким значениям. Но это все еще не объясняет, почему производительность внезапно изменилась. Я знаю, что установка плохой скорости обучения может привести к расхождению, но я вижу устойчивое (но медленное) повышение производительности, а затем внезапное изменение при высокой производительности. Кроме того, я копирую скорость обучения бумаги и проверил их код, который является быстрым и не показывает неустойчивое поведение производительности. Вот след вывода, показывающий, как изменяется производительность:

15:00:38 [root] [DEBUG]: ====== Итерация: 1799 ======

15:00:38 [root] [DEBUG]: == Статья: Clause_isOfType_bottle Оценка: 0,992330014705658

15:00:38 [root] [DEBUG]: == Статья: Clause_neg_isOfType_bottle Счет: 0,992296040058136

15:00:38 [root] [DEBUG]: == Статья: Clause_isOfType_body Счет: 0,9187692403793335

15:00:38 [root] [DEBUG]: == Статья: Clause_neg_isOfType_body Счет: 0,9190800189971924

15:00:38 [root] [DEBUG]: == Статья: Clause_isOfType_cap Счет: 0,9014581441879272

15:00:38 [root] [DEBUG]: == Статья: Clause_neg_isOfType_cap Счет: 0.9029223918914795

15:00:38 [root] [DEBUG]: == Статья: Clause_isOfType_pottedplant Счет: 0,9162445664405823

15:00:38 [root] [DEBUG]: == Статья: Clause_neg_isOfType_pottedplant Счет: 0,9166520237922668

15:00:38 [root] [DEBUG]: == Статья: Clause_isOfType_plant Счет: 0,8137131333351135

15:00:38 [root] [DEBUG]: == Статья: Clause_neg_isOfType_plant Счет: 0,8152325749397278

15:00:38 [root] [DEBUG]: == Статья: Clause_isOfType_pot Счет: 0,9676965475082397

15:00:38 [root] [DEBUG]: == Предложение: Clause_neg_isOfType_pot Счет: 0,9682645201683044

15:00:38 [root] [DEBUG]: == Статья: Clause_isOfType_tvmonitor Счет: 0,8954532146453857

15:00:38 [root] [DEBUG]: == Статья: Clause_neg_isOfType_tvmonitor Счет: 0,895622968673706

15:00:38 [root] [DEBUG]: == Статья: Clause_isOfType_screen Счет: 0,927297055721283

15:00:38 [root] [DEBUG]: == Статья: Clause_neg_isOfType_screen Счет: 0,9281954765319824

15:00:38 [root] [DEBUG]: == Статья: Clause_isOfType_chair Счет: 0,9460874795913696

15:00:38 [root] [DEBUG]: == Статья: Clause_neg_isOfType_chair Счет: 0,9469890594482422

15:00:38 [root] [DEBUG]: == Статья: Clause_isOfType_sofa Счет: 0,8196842074394226

15:00:38 [root] [DEBUG]: == Статья: Clause_neg_isOfType_sofa Счет: 0,820656418800354

15:00:38 [root] [DEBUG]: == Статья: Clause_isOfType_diningtable Счет: 0,889803409576416

15:00:38 [root] [DEBUG]: == Статья: Clause_neg_isOfType_diningtable Счет: 0,8908553123474121

15:00:38 [root] [DEBUG]: == Статья: Clause_partOf Счет: 0,9138585925102234

15:00:38 [root] [DEBUG]: == Статья: Clause_neg_partOf Счет: 0,9138901829719543

15:00:38 [root] [DEBUG]: == Счет: 0.9060626029968262 ==

15:00:38 [root] [DEBUG]: === Настройка подмножеств данных ===

15:00:39 [root] [DEBUG]: ====== Итерация: 1800 ======

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_bottle Счет: 0,990585446357727

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_bottle Счет: 0,9916159510612488

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_body Счет: 0,8670791387557983

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_body Счет: 0,7959716320037842

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_cap Счет: 0,8995224833488464

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_cap Счет: 0,8619083166122437

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_pottedplant Счет: 0,9155776500701904

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_pottedplant Счет: 0,7972513437271118

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_plant Счет: 0,8212026357650757

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_plant Счет: 0,7968321442604065

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_pot Счет: 0,9789061546325684

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_pot Счет: 0,981188952922821

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_tvmonitor Счет: 0,8427695631980896

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_tvmonitor Счет: 0,7958213090896606

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_screen Счет: 0,7628504037857056

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_screen Счет: 0,013370582833886147

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_chair Счет: 0,941319465637207

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_chair Счет: 0,11598806828260422

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_sofa Счет: 0,7932454943656921

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_sofa Счет: 0,8461207747459412

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_diningtable Счет: 0,8798862099647522

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_diningtable Счет: 0,8369185924530029

15:00:39 [root] [DEBUG]: == Статья: Clause_partOf Счет: 0,8789774179458618

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_partOf Счет: 0,7778722643852234

15:00:39 [root] [DEBUG]: == Балл: 0.22021272778511047 ==

15:00:39 [root] [DEBUG]: ====== Итерация: 1801 ======

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_bottle Счет: 0,99906085729598999

15:00:39 [root] [DEBUG]: == Предложение: Clause_neg_isOfType_bottle Счет: 0,9916187524795532

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_body Счет: 0,8675155639648438

15:00:39 [root] [DEBUG]: == Clause: Clause_neg_isOfType_body Счет: 0,7966839671134949

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_cap Счет: 0,8989664316177368

15:00:39 [root] [DEBUG]: == Предложение: Clause_neg_isOfType_cap Счет: 0,8625910878181458

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_pottedplant Счет: 0,9151699542999268

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_pottedplant Счет: 0,797529935836792

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_plant Счет: 0,8211848735809326

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_plant Счет: 0,7974907159805298

15:00:39 [root] [DEBUG]: == Предложение: Clause_isOfType_pot Счет: 0,9789376258850098

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_pot Счет: 0,9812048077583313

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_tvmonitor Счет: 0,8427335023880005

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_tvmonitor Счет: 0,7968791127204895

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_screen Счет: 0,0010666713351383805

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_screen Счет: 0,9761099815368652

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_chair Счет: 0,9172378778457642

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_chair Счет: 0,22136850655078888

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_sofa Счет: 0,7935158014297485

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_sofa Счет: 0,8462190628051758

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_diningtable Счет: 0,8791512846946716

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_diningtable Счет: 0,8383476138114929

15:00:39 [root] [DEBUG]: == Статья: Clause_partOf Счет: 0,8790765404701233

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_partOf Счет: 0,7791911959648132

15:00:39 [root] [DEBUG]: == Балл: 0.02481084130704403 ==

15:00:39 [root] [DEBUG]: ====== Итерация: 1802 ======

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_bottle Счет: 0,9906294345855713

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_bottle Счет: 0,991621196269989

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_body Счет: 0,867911159992218

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_body Счет: 0,797331690788269

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_cap Счет: 0,8984541893005371

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_cap Счет: 0,8632128238677979

15:00:39 [root] [DEBUG]: == Предложение: Clause_isOfType_pottedplant Счет: 0,9147946834564209

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_pottedplant Счет: 0,797791600227356

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_plant Счет: 0,8211624026298523

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_plant Счет: 0,798086941242218

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_pot Счет: 0,9789655208587646

15:00:39 [root] [DEBUG]: == Предложение: Clause_neg_isOfType_pot Счет: 0,9812188744544983

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_tvmonitor Счет: 0,8426967859268188

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_tvmonitor Счет: 0,7978458404541016

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_screen Счет: 9.303313163400162e-06

15:00:39 [root] [DEBUG]: == Предложение: Clause_neg_isOfType_screen Счет: 0,9993413686752319

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_chair Счет: 0,8807621598243713

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_chair Счет: 0,37268978357315063

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_sofa Счет: 0,7937597632408142

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_isOfType_sofa Счет: 0,846305787563324

15:00:39 [root] [DEBUG]: == Статья: Clause_isOfType_diningtable Счет: 0,8784731030464172

15:00:39 [root] [DEBUG]: == Предложение: Clause_neg_isOfType_diningtable Счет: 0,8396425843238831

15:00:39 [root] [DEBUG]: == Статья: Clause_partOf Оценка: 0,8791543841362

15:00:39 [root] [DEBUG]: == Статья: Clause_neg_partOf Счет: 0,7804265022277832

15:00:39 [root] [DEBUG]: == Счет: 0.00022322138829622418 ==

Затем счет продолжает падать до ~0.

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

def compute(self, inference, input_):
        """
        Compute predicate grounding for input_
        """
        stacked_inputs = input_
        batch_h = torch.bmm(
                torch.einsum('bi,ijk->bkj', (stacked_inputs, self.W)),
                stacked_inputs.unsqueeze(-1)
                ).squeeze(-1)
        mx_plus_b = torch.matmul(
                stacked_inputs, self.V) + self.B  # Broadcast on self.B
        non_linear = self.tanh(batch_h + mx_plus_b)
        output = self.sigmoid(
                torch.matmul(non_linear, self.U))
        return output

`` `

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

Я также разместил этот вопрос на форуме PyTorch

Спасибо!

0 ответов

Другие вопросы по тегам