[PYTHON] Implementierung einer "schrägen dreieckigen Lernrate" in Keras, die bei der BERT-Feinabstimmung wirksam ist

Überblick

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 ↓

Implementiert von Keras

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

Recommended Posts

Implementierung einer "schrägen dreieckigen Lernrate" in Keras, die bei der BERT-Feinabstimmung wirksam ist
Versuchen Sie die Feinabstimmung (Transferlernen), die bei Bildern mit Keras der Mainstream ist, mit Datenlernen
Hard-Swish mit Keras implementiert