Можно ли использовать разные параметры регуляризации 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 - тензор индексов весов, которые вы хотите выбрать. Наконец, вам не нужно выполнять глобальную регуляризацию, как в коде.

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