[PYTHON] Implémentation du "taux d'apprentissage triangulaire incliné" dans Keras, qui est efficace dans le réglage fin de BERT

Aperçu

Je participais au concours de traitement du langage naturel de Kaggle et je voulais peaufiner BERT. Lorsque j'ai appris que le taux d'apprentissage triangulaire incliné (STLR) était bon et que je l'ai implémenté dans Keras, la précision s'est considérablement améliorée.

(Ajout) Après cela, j'ai pu obtenir une médaille d'argent.

Slanted triangualr learning rate

J'ai fait référence à l'article ci-dessous.

Comme vous pouvez le voir sur la figure 2, l'échauffement de la vitesse d'apprentissage au début de l'apprentissage et l'atténuation de la vitesse d'apprentissage après l'étape intermédiaire sont rendus linéaires. "Triangulaire incliné" car il ressemble à un triangle incliné.

Au fait, le papier original que j'ai décidé d'utiliser STLR est ↓

Mis en œuvre par Keras

Ceci peut être réalisé en utilisant le mécanisme de «Callbacks» de Keras. Vous ne pouvez pas utiliser LearningRateScheduler car STLR doit changer le taux d'apprentissage pour chaque itération (étapes dans la terminologie Keras), pas pour chaque époque. Vous devez hériter de la classe Callbacks et la rendre vierge.

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

En ce qui concerne les noms de variables, les mêmes que Eq (3) de l'article original sont utilisés autant que possible.

Comme indiqué dans Comment affiner BERT pour la classification de texte?, cette combinaison a bien fonctionné pour le réglage fin de BERT.

Hyper paramètres valeur
lr_max 2e-5
cut_frac 0.1
ratio 32

Recommended Posts

Implémentation du "taux d'apprentissage triangulaire incliné" dans Keras, qui est efficace dans le réglage fin de BERT
Essayez Fine Tuning (apprentissage par transfert), qui est le courant dominant avec des images avec keras, avec apprentissage des données
Implémentation hard-swish avec Keras