Медленное обучение против Tensorflow и внезапное снижение производительности на данных поезда
Я пишу реализацию PyTorch Logic Tensor Networks для семантической интерпретации изображений, в которой есть код Tensorflow с открытым исходным кодом.
Мне удалось собрать сеть, и она может тренироваться. Я считаю, что правильно копирую гиперпараметры для оптимизатора, и я также проверил правильность основной математики. Поэтому я вполне уверен, что все правильно настроил. Однако я заметил две вещи, которые мне трудно объяснить:
- Сеть обучается намного медленнее, чем реализация Tensorflow. Реализация Tensorflow достигает средней производительности поезда около 95% за 1000 шагов, тогда как для моего кода требуется ~ 3000 шагов.
- Производительность поезда внезапно меняется, когда производительность увеличивается.
Я дам немного больше информации о каждом, ниже.
Медленное сетевое обучение Я думал, что это может быть связано с гиперпараметрами для оптимизатора. В статье используется 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
Спасибо!