Можно ли использовать разные параметры регуляризации L1 / L2 для разных наборов весов в цепочке или в цепочке?
(В качестве примера) При реализации простой линейной модели для noutput
целевые значения как нейронная сеть в pytorch:
l1=L.Linear(ninput, noutput)
(вызов)
y = self.l1(x)
return y
Добавление этого хука сделает регуляризацию L2 на всех весах, наложив одинаковую альфа=0,01 везде:
optimizer.add_hook(optimizer.WeightDecay(rate=0.01))
Можно ли использовать разные альфа для каждого набора весов, ведущих из всех ninput
входные единицы к одному из noutput
выходные единицы?
1 ответ
Поскольку мы работаем в pytorch, можно добавить другие скаляры в функцию потерь самостоятельно. Итак, предположим, что потери от вашего classfier - это L (предположим, что это перекрестная энтропийная потеря), и у вас есть линейный слой, определенный как:
l1 = nn.Linear(in,out)
Теперь, если вы хотите иметь различную регуляризацию для каждого набора весов, тогда все, что вам нужно сделать, это собрать весы, используя (т.е. выбрать, используя индекс) и добавить к окончательному проигрышу:
loss = L (crossentropy loss) + sum ( alpha * norm(l1.weight[k]))
альфа гиперпараметры и норма в основном L2 норма, в pytorch это просто torch.norm(l1.weight)
где index k - тензор индексов весов, которые вы хотите выбрать. Наконец, вам не нужно выполнять глобальную регуляризацию, как в коде.