Ich nahm an Kaggles Wettbewerb zur Verarbeitung natürlicher Sprache teil und wollte BERT optimieren. Als ich die Information erhielt, dass die Slanted Triangular Learning Rate (STLR) gut war, und sie in Keras implementierte, verbesserte sich die Genauigkeit erheblich.
(Ergänzung) Danach konnte ich eine Silbermedaille bekommen.
Slanted triangualr learning rate
Ich habe auf den folgenden Artikel verwiesen.
Wie Sie in Abb. 2 sehen können, werden sowohl das Aufwärmen der Lernrate zu Beginn des Lernens als auch die Abschwächung der Lernrate nach der mittleren Stufe linearisiert. "Schräg-Dreieck", weil es wie ein geneigtes Dreieck aussieht.
Das Originalpapier, für das ich mich für STLR entschieden habe, ist übrigens ↓
Dies kann mithilfe des Keras-Rückrufmechanismus erreicht werden. Sie können "LearningRateScheduler" nicht verwenden, da STLR die Lernrate für jede Iteration (Schritte in der Keras-Terminologie) und nicht für jede Epoche ändern muss. Sie müssen die "Callbacks" -Klasse erben und sie kratzen lassen.
class SlantedTriangularScheduler(Callback):
def __init__(self,
lr_max: float = 0.001,
cut_frac: float = 0.1,
ratio: float = 32):
self.lr_max = lr_max
self.cut_frac = cut_frac
self.ratio = ratio
def on_train_begin(self, logs = None):
epochs = self.params['epochs']
steps = self.params['steps']
self.cut = epochs * steps * self.cut_frac
self.iteration = 0
def on_batch_begin(self, batch: int, logs = None):
t = self.iteration
cut = self.cut
if t < cut:
p = t / cut
else:
p = 1 - (t - cut) / (cut * (1 / self.cut_frac - 1))
lr = self.lr_max * (1 + p * (self.ratio - 1)) / self.ratio
K.set_value(self.model.optimizer.lr, lr)
self.iteration += 1
Für die Variablennamen werden so oft wie möglich dieselben wie in Gleichung (3) des Originalpapiers verwendet.
Wie in Feinabstimmung von BERT für die Textklassifizierung? gezeigt, funktionierte diese Kombination gut für die Feinabstimmung von BERT.
Hyperparameter | Wert |
---|---|
lr_max |
2e-5 |
cut_frac |
0.1 |
ratio |
32 |