Başarıyla zayıflayan ALBERT, BERT'in yerini alabilir mi?

İçbükey tapınaktan on üç Qubit Raporu | Genel Hesap QbitAI

Parametreler BERT'den% 80 daha azdır, ancak performans iyileştirilmiştir.

Bu, Google'ın geçen yıl önerdiği "Başarılı Zayıflama BERT" modelidir. ALBERT .

Bu model piyasaya sürüldüğünde büyük ilgi gördü ve ikisi arasındaki karşılaştırma sıcak bir konu haline geldi.

Son zamanlarda netizen Naman Bansal bir soru sordu:

BERT yerine ALBERT kullanılmalı mı?

Bibi değiştirilip değiştirilemeyeceğini biliyor.

BERT ve ALBERT

BERT Model herkese tanıdık geliyor.

Google tarafından 2018'de önerilen eğitim külliyatı çok büyük ve 3,3 milyar kelime içeriyor.

Modelin yeniliği, sırasıyla kelime ve cümle seviyesi temsillerini yakalamak için Maskeli LM ve Sonraki Cümle Tahminini kullanan eğitim öncesi sürece odaklanır.

BERT'nin ortaya çıkışı, eğitim öncesi oluşturulan kelime vektörleri ile belirli aşağı akış NLP görevleri arasındaki ilişkiyi tamamen değiştirdi.

Bir yıl sonra Google tekrar teklif etti ALBERT , "Lite-BERT" olarak da bilinen omurga ağı BERT'e benzer, Transformatör kodlayıcı halen kullanılmaktadır ve aktivasyon işlevi de GELU'dur.

En büyük başarısı, parametre miktarının BERT'e göre% 80 daha az olması ve daha iyi sonuçlar elde etmesidir.

BERT ile karşılaştırıldığında iyileştirmeler, esas olarak, vektör parametreleştirmesinin yerleştirilmesinin faktörleştirilmesini, katmanlar arası parametre paylaşımını, cümleler arasında tutarlılık kaybı için SOP kullanımını ve bırakmanın kaldırılmasını içerir.

Aşağıdaki şekil SQuAD ve RACE veri setlerinde BERT ve ALBERT'in karşılaştırma sonuçlarını göstermektedir.

ALBERT performansının daha iyi sonuçlar elde ettiği görülmektedir.

Özel külliyat (eğitim öncesi) ALBERT nasıl uygulanır?

ALBERT'i daha iyi anlamak için bir sonraki adımda, ALBERT özel bir külliyatta uygulanacaktır.

Kullanılan veri kümesi "yemek inceleme veri kümesi" dir ve amaç şudur: ALBERT modeli aracılığıyla yemeğin adını belirleyin .

1. Adım: Veri setini indirin ve dosyayı hazırlayın

1 # Tüm dosyaları ve verileri indirme 23! Wget https://github.com/LydiaXiaohongLi/Albert_Finetune_with_Pretrain_on_Custom_Corpus/raw/master/data_toy/dish_name_train.csv 4! Wget https://github.com/LydiaXiaohongLi/Albert_Finetune_with_Pretrain_on_Custom_Corpus/raw/master/data_toy/dish_name_val.csv 5! Wget https://github.com/LydiaXiaohongLi/Albert_Finetune_with_Pretrain_on_Custom_Corpus/raw/master/data_toy/restaurant_review.txt 6! Wget https://github.com/LydiaXiaohongLi/Albert_Finetune_with_Pretrain_on_Custom_Corpus/raw/master/data_toy/restaurant_review_nopunct.txt 7! Wget https://github.com/LydiaXiaohongLi/Albert_Finetune_with_Pretrain_on_Custom_Corpus/raw/master/models_toy/albert_config.json 8! Wget https://github.com/LydiaXiaohongLi/Albert_Finetune_with_Pretrain_on_Custom_Corpus/raw/master/model_checkpoint/finetune_checkpoint 9! Wget https://github.com/LydiaXiaohongLi/Albert_Finetune_with_Pretrain_on_Custom_Corpus/raw/master/model_checkpoint/pretrain_checkpoint 1011 # Dosya oluşturma ve ALBERT'i kurma 1213! Pip cümle parçasını yükleyin 14! Git klon https://github.com/google-research/ALBERT 15! Python ./ALBERT/create_pretraining_data.py --input_file "restaurant_review.txt" --output_file "restaurant_review_train" --vocab_file "vocab.txt" --max_seq_length = 6416! Pip kurulum transformatörleri 17! Pip install tfrecord

Adım 2: Transformatörü kullanın ve katmanı tanımlayın

1 # ALBERT için Katmanları Tanımlama 23from transformers.modeling_albert import AlbertModel, AlbertPreTrainedModel 4from transformers.configuration_albert import AlbertConfig 5import torch.nn nn olarak 6class AlbertSequenceOrderHead (nn.Module): 7 def __init __ (self, config): 8 super () .__ init __ () 9 self.dense = nn.Linear (config.hidden_size, 2) 10 self.bias = nn.Parameter (torch.zeros (2)) 1112 def ileri (self, hidden_states): 13 hidden_states = self.dense (gizli_durumlar) 14 tahmin_dizisi = gizli_durumlar + self.bias 1516 tahmin_ skorları döndür 1718f from torch.nn import CrossEntropyLoss 19fromers.modeling_bert import ACT2FN 20 sınıf AlbertForPretrain (AlbertPreTrainedModel): yirmi bir 22 def __init __ (self, config): 23 super () .__ init __ (yapılandırma) yirmi dört 25 self.albert = AlbertModel (yapılandırma) 2627 # Maskeli LM için 28 # Orijinal sarılma yüzeyi uygulaması, yoğun katman yoluyla yeni çıktı ağırlıkları oluşturdu 29 # Ancak orijinal Albert 30 self.predictions_dense = nn.Linear (config.hidden_size, config.embedding_size) 31 self.predictions_activation = ACT2FN 32 self.predictions_LayerNorm = nn.LayerNorm (config.embedding_size) 33 self.predictions_bias = nn.Parameter (torch.zeros (config.vocab_size)) 34 self.predictions_decoder = nn.Linear (config.embedding_size, config.vocab_size) 3536 self.predictions_decoder.weight = self.albert.embeddings.word_embeddings.weight 3738 # Sıralı sıra tahmini için 39 self.seq_relationship = AlbertSequenceOrderHead (config) 404142 def ileri ( 43 öz, 44 input_ids = Yok, 45 care_mask = Yok, 46 token_type_ids = Yok, 47 position_ids = Yok, 48 head_mask = Yok, 49 inputs_embeds = Yok, 50 masked_lm_labels = Yok, 51 seq_relationship_labels = Yok, 52): 5354 çıktı = self.albert ( 55 input_ids, 56 dikkat maskesi = dikkat maskesi, 57 token_type_ids = token_type_ids, 58 position_ids = position_ids, 59 head_mask = head_mask, 60 inputs_embeds = inputs_embeds, 61) 6263 loss_fct = CrossEntropyLoss () 6465 sequence_output = çıktı 6667 sıra_çıktı = self.predictions_dense (sıra_çıktı) 68 sequence_output = self.predictions_activation (sequence_output) 69 dizi_çıktı = self.predictions_LayerNorm (sıra_çıktı) 70 tahmin_dizisi = self.predictions_decoder (sıra_çıktı) 717273 masked_lm_labels None değilse: 74 masked_lm_loss = loss_fct (prediction_scores.view (-1, self.config.vocab_size) 75, masked_lm_labels.view (-1)) 7677 pooled_output = çıktı 78 seq_relationship_scores = self.seq_relationship (pooled_output) 79 seq_relationship_labels None değilse: 80 seq_relationship_loss = loss_fct (seq_relationship_scores.view (-1, 2), seq_relationship_labels.view (-1)) 8182 kayıp = masked_lm_kaybı + seq_relationship_loss 8384 geri dönüş kaybı

3. Adım: LAMB iyileştiriciyi kullanın ve ALBERT'e ince ayar yapın

1 # LAMB iyileştiriciyi kullanma 2 # LAMB- "https://github.com/cybertronai/pytorch-lamb" 34 ithalat meşale Torch.optim import Optimizer'dan 56 sınıf Kuzu (Optimize Edici): 7 r "" "Lamb algoritmasını uygular. 8 'Derin Öğrenme için Büyük Toplu Optimizasyon: 76 dakikada BERT Eğitimi` bölümünde önerilmiştir. 9 Bağımsız Değişken: 10 parametre (yinelenebilir): optimize etmek için yinelenen parametreler veya tanımlamayı dikte edin 11 parametre grubu 12 lr (değişken, isteğe bağlı): öğrenme oranı (varsayılan: 1e-3) 13 beta (Tuple, isteğe bağlı): hesaplama için kullanılan katsayılar 14 çalışan gradyan ve karesi ortalamaları (varsayılan: (0,9, 0,999)) 15 eps (float, isteğe bağlı): iyileştirmek için paydaya eklenen terim 16 sayısal kararlılık (varsayılan: 1e-8) 17 weight_decay (float, isteğe bağlı): ağırlık azalması (L2 cezası) (varsayılan: 0) 18 adam (bool, isteğe bağlı): her zaman güven oranı = 1 kullanın, bu da bunu 19 Adam Karşılaştırma amaçlı kullanışlıdır. 20 .. _Derin Öğrenme için Büyük Toplu Optimizasyon: 76 dakikada BERT Eğitimi: 21 https://arxiv.org/abs/1904.00962 yirmi iki """ yirmi üç 24 def __init __ (öz, parametreler, lr = 1e-3, betas = (0.9, 0.999), eps = 1e-6, 25 weight_decay = 0, adam = False): 0.0 değilse 26 < = lr: 27 ValueError'ı artır ("Geçersiz öğrenme oranı: {}". Format (lr)) 0,0 değilse 28 < = eps: 29 ValueError yükselt ("Geçersiz epsilon değeri: {}". Format (eps)) 0,0 değilse 30 < = betalar < 1.0: 31 ValueError yükseltme ("0 dizininde geçersiz beta parametresi: {}". Format (betalar)) 0.0 değilse 32 < = betalar < 1.0: 33 ValueError yükseltmesi ("Dizin 1'de geçersiz beta parametresi: {}". Biçimi (betalar)) 34 varsayılan = dikte (lr = lr, betalar = betalar, eps = eps, 35 weight_decay = weight_decay) 36 self.adam = adam 37 super (Lamb, self) .__ init __ (parametreler, varsayılanlar) 3839 def adım (öz, kapanma = Yok): 40 "" "Tek bir optimizasyon adımı gerçekleştirir. 41 Argüman: 42 kapatma (çağrılabilir, isteğe bağlı): Modeli yeniden değerlendiren bir kapanış 43 ve kaybı iade eder. 44 "" " 45 kayıp = Yok 46 kapatma Yok değilse: 47 kayıp = kapanma () 48 Self.param_groups grubu için 49: Gruptaki p için 50: 51 p.grad Yok ise: Devam 5253 derece = p.grad.data 54 eğer grad.is_sparse: 55 RuntimeError yükseltmesi ('Lamb, seyrek degradeleri desteklemiyor, SparseAdam instad'ı düşünün.') 5657 devlet = self.state

5859 # Durum başlatma 60 eğer len (durum) == 0: 61 durum = 062 # Gradyan değerlerinin üstel hareketli ortalaması 63 durum = torch.zeros_like (p.data) 64 # Kare gradyan değerlerinin üstel hareketli ortalaması 65 durum = torch.zeros_like (p.data) 6667 exp_avg, exp_avg_sq = durum, durum 68 beta1, beta2 = grup 6970 eyalet + = 17172 # Birinci ve ikinci an çalışan ortalama katsayısını bozun 73 # m_t 74 exp_avg.mul_ (beta1) .add_ (1-beta1, grad) 75 # v_t 76 exp_avg_sq.mul_ (beta2) .addcmul_ (1-beta2, grad, grad) 7778 # Paper v3, debiasing kullanmaz. 79 # bias_correction1 = 1-beta1 ** state 80 # bias_correction2 = 1-beta2 ** durumu 81 # Yayını önlemek için lr'ye önyargı uygulayın. 82 step_size = grup # * math.sqrt (bias_correction2) / bias_correction18384 weight_norm = p.data.pow (2) .sum (). Sqrt (). Clamp (0, 10) 8586 adam_step = exp_avg / exp_avg_sq.sqrt (). Ekle (grup) 87 ise grup! = 0: 88 adam_step.add_ (grup, s. Veri) 8990 adam_norm = adam_step.pow (2) .sum (). Sqrt () 91, weight_norm == 0 veya adam_norm == 0 ise: 92 trust_ratio = 193 başka: 94 trust_ratio = weight_norm / adam_norm 95 durum = ağırlık_ormu 96 durum = adam_norm 97 durum = trust_ratio 98 self.adam ise: 99 trust_ratio = 1100101 p.data.add _ (- step_size * trust_ratio, adam_step) 102103 geri dönüş kaybı 104105 içe aktarma süresi 106import torch.nn, nn olarak 107 ithalat meşale 108frecord.torch.dataset'den TFRecordDataset içe aktarma Np olarak içe aktarım 110import işletim sistemi 111112LEARNING_RATE = 0,001113EPOCH = 40114BATCH_SIZE = 2115MAX_GRAD_NORM = 1.0116117print (f "--- Devam / Eğitime başla ---") 118feat_map = {"input_ids": "int", 119 "input_mask": "int", 120 "segment_ids": "int", 121 "next_sentence_labels": "int", 122 "masked_lm_positions": "int", 123 "masked_lm_ids": "int"} 124pretrain_file = 'restaurant_review_train' 125126 # Albert ön eğitim modeli oluşturun 127config = AlbertConfig.from_json_file ("albert_config.json") 128albert_pretrain = AlbertForPretrain (yapılandırma) 129 # Optimize edici oluştur 130optimizer = Kuzu (, lr = LEARNING_RATE) 131albert_pretrain.train () 132dataset = TFRecordDataset (pretrain_file, index_path = None, description = feat_map) 133loader = torch.utils.data.DataLoader (veri kümesi, batch_size = BATCH_SIZE) 134135tmp_loss = 0136start_time = time.time () 137138if os.path.isfile ('pretrain_checkpoint'): 139 baskı (f "--- Kontrol noktasından yükle ---") 140 kontrol noktası = torch.load ("pretrain_checkpoint") 141 albert_pretrain.load_state_dict (kontrol noktası) 142 optimizer.load_state_dict (kontrol noktası) 143 epoch = kontrol noktası 144 kayıp = kontrol noktası 145 kayıp = kontrol noktası 146147else: 148 dönem = -1149 kayıp = Aralık içinde 150 (epoch + 1, EPOCH): 151 yükleyicide parti için: 152 b_input_ids = batch.long () 153 b_token_type_ids = batch.long () 154 b_seq_relationship_labels = batch.long () 155156 # Veri formatını yüklenen kodu çözülmüş formattan formata dönüştürün 157 # yüklenen biçim, google'ın Albert create_pretrain.py betiği tarafından oluşturulur 158 # albert'in pytorch uygulaması için sarılma gerekli 159 mask_rows = np.nonzero (batch.numpy ()) 160 mask_cols = batch.numpy () 161 b_attention_mask = np.zeros ((BATCH_SIZE, 64), dtype = np.int64) 162 b_attention_mask = 1163 b_masked_lm_labels = np.zeros ((BATCH_SIZE, 64), dtype = np.int64) -100164 b_masked_lm_labels = batch.numpy () 165 b_attention_mask = torch.tensor (b_attention_mask) .long () 166 b_masked_lm_labels = torch.tensor (b_masked_lm_labels) .long () 167168169 kayıp = albert_pretrain (input_ids = b_input_ids 170, dikkat maskesi = b_attention_mask 171, token_type_ids = b_token_type_ids 172, masked_lm_labels = b_masked_lm_labels 173, seq_relationship_labels = b_seq_relationship_labels) 174175 # eski degradeleri temizler 176 optimizer.zero_grad () 177 # geri geçiş 178 kayıp geri () 179 # degrade kırpma 180 torch.nn.utils.clip_grad_norm_ (parametreler = albert_pretrain.parameters (), max_norm = MAX_GRAD_NORM) 181 # güncelleme parametreleri 182 optimizer.step () 183184 tmp_loss + = kayıp.detach (). Öğe () 185186 # metrikleri yazdırın ve her çağda kontrol noktasına kaydedin 187 baskı (f "Dönem: {e}") 188 baskı (f "Tren kaybı: {(tmp_loss / 20)}") 189 baskı (f "Tren Süresi: {(time.time () - başlangıç_süresi) / 60} dakika") 190 loss.append (tmp_loss / 20) 191192 tmp_loss = 0193 başlangıç_süresi = zaman.zaman () 194195 torch.save ({'model_state_dict': albert_pretrain.state_dict (), 'optimizer_state_dict': optimizer.state_dict (), 196'epoch ': e,' kayıp ': kayıp,' kayıplar ': kayıplar} 197, 'pretrain_checkpoint') 198'den matplotlib'den arsa olarak ithal pyplot 199plot.plot (kayıplar) 200201 # İnce ayar ALBERT 202203 # Yazma sırasında, Hugging face, sınıf nesnesini sağlamadı 204 # AlbertForTokenClassification, bu nedenle aşağıya kendi tanımınızı yazın 205from transformers.modeling_albert import AlbertModel, AlbertPreTrainedModel 206from transformers.configuration_albert import AlbertConfig 207from transformers.tokenization_bert import BertTokenizer 208import torch.nn nn olarak Torch.nn ithalatından CrossEntropyLoss 210sınıf AlbertForTokenClassification (AlbertPreTrainedModel): 211212 def __init __ (self, albert, config): 213 super () .__ init __ (yapılandırma) 214 self.num_labels = config.num_labels 215216 self.albert = albert 217 self.dropout = nn.Dropout (config.hidden_dropout_prob) 218 self.classifier = nn.Linear (config.hidden_size, config.num_labels) 219220 def ileri ( 221 öz, 222 input_ids = Yok, 223 dikkat_mask = Yok, 224 token_type_ids = Yok, 225 position_ids = Yok, 226 head_mask = Yok, 227 inputs_embeds = Yok, 228 etiket = Yok, 229): 230231 çıktı = self.albert ( 232 input_ids, 233 dikkat maskesi = dikkat maskesi, 234 token_type_ids = token_type_ids, 235 position_ids = position_ids, 236 head_mask = head_mask, 237 inputs_embeds = inputs_embeds, 238) 239240 sequence_output = çıktı 241242 sequence_output = self.dropout (sıra_çıktı) 243 günlük = self.classifier (sıra_çıktı) 244245 dönüş kaydı 246 Np olarak 247import numpy 248def label_sent (name_tokens, sent_tokens): 249 etiket = 250 i = 0251 eğer len (name_tokens) > len (sent_tokens): 252 etiket = np.zeros (len (sent_tokens)) 253 değilse: 254 ben < len (sent_tokens): 255 found_match = Yanlış Name_tokens == sent_tokens ise 256 : 257 found_match = Doğru Aralıktaki j için 258 (len (name_tokens) -1): 259 eğer ((i + j + 1) > = len (sent_tokens)): 260 iade etiketi 261 eğer name_tokens! = Sent_tokens: 262 found_match = Yanlış 263 eğer found_match: H.264 label.extend (list (np.ones (len (name_tokens)). Astype (int))) 265 i = i + len (isim_takaları) 266 değilse: 267 label.extend () 268 ben = i + 1269 değilse: 270 label.extend () 271 ben = i + 1272 iade etiketi 273 Pandaları pd olarak içe aktar 275 ithalat küresi 276import işletim sistemi 277278tokenizer = BertTokenizer (vocab_file = "vocab.txt") 279280df_data_train = pd.read_csv ("dish_name_train.csv") 281df_data_train = df_data_train.apply (tokenizer.tokenize) 282df_data_train = df_data_train.review.apply (tokenizer.tokenize) 283df_data_train = df_data_train.apply (lambda satır: label_sent (satır, satır), eksen = 1) 284285df_data_val = pd.read_csv ("dish_name_val.csv") 286df_data_val = df_data_val.dropna (). Reset_index () 287df_data_val = df_data_val.apply (tokenizer.tokenize) 288df_data_val = df_data_val.review.apply (tokenizer.tokenize) 289df_data_val = df_data_val.apply (lambda satır: label_sent (satır, satır), eksen = 1) 290291MAX_LEN = 64292BATCH_SIZE = 1 Keras.preprocessing.sequence öğesinden içe aktarma pad_sequences 294import meşale 295from torch.utils.data import TensorDataset, DataLoader, RandomSampler, SequentialSampler 296297tr_inputs = pad_sequences (, maxlen = MAX_LEN, dtype = "long", truncating = "post", padding = "post") 298tr_tags = pad_sequences (df_data_train, maxlen = MAX_LEN, padding = "post", dtype = "long", truncating = "post") 299 # dizilerdeki doldurulmuş öğeleri yok saymak için maskeyi yarat. 300tr_masks = 301tr_inputs = torch.tensor (tr_inputs) 302tr_tags = torch.tensor (tr_tags) 303tr_masks = torch.tensor (tr_masks) 304train_data = TensorDataset (tr_inputs, tr_masks, tr_tags) 305train_sampler = RandomSampler (train_data) 306train_dataloader = DataLoader (train_data, örnekleyici = train_sampler, batch_size = BATCH_SIZE) 307308309val_inputs = pad_sequences (, maxlen = MAX_LEN, dtype = "long", truncating = "post", padding = "post") 310val_tags = pad_sequences (df_data_val, maxlen = MAX_LEN, padding = "post", dtype = "long", truncating = "post") 311 # dizilerdeki doldurulmuş öğeleri yok saymak için maskeyi yaratın. 312val_masks = 313val_inputs = torch.tensor (val_inputs) 314val_tags = torch.tensor (val_tags) 315val_masks = torch.tensor (val_masks) 316val_data = TensorDataset (val_inputs, val_masks, val_tags) 317val_sampler = RandomSampler (val_data) 318val_dataloader = DataLoader (val_data, örnekleyici = val_sampler, batch_size = BATCH_SIZE) 319320model_tokenclassification = AlbertForTokenClassification (albert_pretrain.albert, config) 321from torch.optim import Adam 322LEARNING_RATE = 0,0000003323FULL_FINETUNING = Doğru 324if FULL_FINETUNING: 325 param_optimizer = list (model_tokenclassification.named_parameters ()) 326 no_decay = 327 optimizer_grouped_parameters = 333else: 334 param_optimizer = list (model_tokenclassification.classifier.named_parameters ()) 335 optimizer_grouped_parameters = 336optimizer = Adam (optimizer_grouped_parameters, lr = LEARNING_RATE)

4. Adım: Modeli özel külliyat için eğitin

1 # Modeli eğitmek 2 Torch.utils.tensorboard import SummaryWriter'dan 3 # 4import süresi 5import os.path 6import torch.nn nn olarak 7 ithalat meşale 8EPOCH = 8009MAX_GRAD_NORM = 1.01011start_time = time.time () 12tr_loss, tr_acc, nb_tr_steps = 0, 0, 013eval_loss, eval_acc, nb_eval_steps = 0, 0, 01415if os.path.isfile ('finetune_checkpoint'): 16 baskı (f "--- Kontrol noktasından yükle ---") 17 kontrol noktası = torch.load ("finetune_checkpoint") 18 model_tokenclassification.load_state_dict (kontrol noktası) 19 optimizer.load_state_dict (kontrol noktası) 20 epoch = kontrol noktası 21 train_losses = kontrol noktası 22 train_accs = kontrol noktası 23 eval_losses = kontrol noktası 24 eval_accs = kontrol noktası 2526else: 27 epoch = -128 train_losses, train_accs, eval_losses, eval_accs = ,,, 2930print (f "--- Devam / Eğitime başla ---") 31 aralık içi (epoch + 1, EPOCH): 3233 # TREN döngüsü 34 model_tokenclassification.train () 35 Train_dataloader'daki toplu işlem için 36: 37 # gpu'ya toplu ekleme 38 toplu = tuple (t için t toplu iş) 39 b_input_ids, b_input_mask, b_labels = batch 40 # ileri geçiş 41 b_outputs = model_tokenclassification (b_input_ids, token_type_ids = None, care_mask = b_input_mask, labels = b_labels) 4243 ce_loss_fct = CrossEntropyLoss () 44 # Kaybın sadece aktif kısımlarını koru 45 b_active_loss = b_input_mask.view (-1) == 146 b_active_logits = b_outputs.view (-1, config.num_labels) 47 b_active_labels = b_labels.view (-1) 4849 kayıp = ce_loss_fct (b_active_logits, b_active_labels) 50 acc = torch.mean ((torch.max (b_active_logits.detach (), 1) == b_active_labels.detach ()). Float ()) 5152 model_tokenclassification.zero_grad () 53 # geri geçiş 54 kayıp geri () 55 # tren kaybını izlemek 56 tr_loss + = kayıp.item () 57 tr_acc + = acc 58 nb_tr_steps + = 159 # degrade kırpma 60 torch.nn.utils.clip_grad_norm_ (parametreler = model_tokenclassification.parameters (), max_norm = MAX_GRAD_NORM) 61 # güncelleme parametreleri 62 optimizer.step () 636465 # Doğrulama setinde DOĞRULAMA 66 model_tokenclassification.eval () 67 val_dataloader'daki toplu işlem için: 68 toplu = tuple (t için toplu iş) 69 b_input_ids, b_input_mask, b_labels = batch 7071 torch.no_grad () ile: 7273 b_outputs = model_tokenclassification (b_input_ids, token_type_ids = None, 74 dikkat_maskesi = b_input_mask, etiketler = b_labels) 7576 loss_fct = CrossEntropyLoss () 77 # Kaybın sadece aktif kısımlarını tut 78 b_active_loss = b_input_mask.view (-1) == 179 b_active_logits = b_outputs.view (-1, config.num_labels) 80 b_active_labels = b_labels.view (-1) 81 kayıp = kayıp_fct (b_active_logits, b_active_labels) 82 acc = np.mean (np.argmax (b_active_logits.detach (). Cpu (). Numpy (), axis = 1) .flatten () == b_active_labels.detach (). Cpu (). Numpy (). Flatten ()) 8384 eval_loss + = kayıp.ortalama (). Öğe () 85 eval_acc + = acc 86 nb_eval_steps + = 18788 e% 10 == 0 ise: 8990 baskı (f "Dönem: {e}") 91 baskı (f "Tren kaybı: {(tr_loss / nb_tr_steps)}") 92 baskı (f "Tren acc: {(tr_acc / nb_tr_steps)}") 93 print (f "Tren Süresi: {(time.time () - başlangıç_süresi) / 60} dakika") 9495 baskı (f "Doğrulama kaybı: {eval_loss / nb_eval_steps}") 96 baskı (f "Doğrulama Doğruluğu: {(eval_acc / nb_eval_steps)}") 9798 train_losses.append (tr_loss / nb_tr_steps) 99 train_accs.append (tr_acc / nb_tr_steps) 100 eval_losses.append (eval_loss / nb_eval_steps) 101 eval_accs.append (eval_acc / nb_eval_steps) 102103104 tr_loss, tr_acc, nb_tr_steps = 0, 0, 0105 eval_loss, eval_acc, nb_eval_steps = 0, 0, 0106 başlangıç_süresi = zaman.zaman () 107108 torch.save ({'model_state_dict': model_tokenclassification.state_dict (), 'optimizer_state_dict': optimizer.state_dict (), 109'epoch ': e,' train_losses ': train_losses,' train_accs ': train_accs,' eval_losses ': eval_losses,' eval_accs ': eval_accs} 110, 'finetune_checkpoint') 111112plot.plot (tren_kaybı) 113plot.plot (tren_accs) 114plot.plot (eval_losses) 115plot.plot (eval_accs) 116plot.legend (etiketler =)

Adım 5: Tahmin

1 # Tahmin 23def tahmin (metinler): 4 tokenized_texts = 5 input_ids = pad_sequences (, 6 maxlen = MAX_LEN, dtype = "long", truncating = "post", padding = "post") 7 care_mask = 89 input_ids = torch.tensor (input_ids) 10 dikkat_maskesi = meşale. Algılayıcı (dikkat_maskesi) 1112 veri kümesi = TensorDataset (input_ids, dikkat_maskesi) 13 veri örnekleyici = Sıralı Örnekleyici (veri kümesi) 14 dataloader = DataLoader (veri kümesi, örnekleyici = veri örnekleyici, batch_size = BATCH_SIZE) 1516 tahmin edilen etiket = 17 Veri yükleyicide toplu iş için 18: 19 batch = tuple (t için t toplu iş) 20 b_input_ids, b_input_mask = batch yirmi bir Torch.no_grad () ile 22: 23 günlük = model_tok sınıflandırması (b_input_ids, token_type_ids = Yok, 24 dikkat_maskesi = b_input_mask) 2526 tahmin edilen_etiketler.append (np.multiply (np.argmax (logits.detach (). Cpu (). Numpy (), axis = 2), b_input_mask.detach (). Cpu (). Numpy ())) 27 # np.concatenate (tahmin edilen_etiketler), batch_size * max_len dizilerinin listesini max_len dizileri listesine düzleştirmek için 28 return np.concatenate (öngörülen_etiketler) .astype (int), tokenized_texts 2930def get_dish_candidate_names (tahmini_etiket, belirteçli_metin): 31 name_lists = 32 eğer len (np.where (tahmin edilen_etiket > 0)) > 0: 33 name_idx_combined = np.where (tahmini_etiket > 0) 34 name_idxs = np.split (name_idx_combined, np.where (np.diff (name_idx_combined)! = 1) +1) 35 name_lists.append () 36 # İsim_listesinde yinelenen isimler varsa 37 name_lists = np.unique (ad_listeleri) 38 isim_listesini döndür 39 başka: 40 dönüş Yok 4142texts = df_data_val.review.values 43predicted_labels, _ = tahmin (metinler) 44df_data_val = liste (tahmin edilen_etiketler) 45df_data_val = df_data_val.apply (lambda satırı: get_dish_candidate_names (row.predicted_review_label, row.review_tokens) 46, eksen = 1) 4748texts = df_data_train.review.values 49predicted_labels, _ = tahmin (metinler) 50df_data_train = liste (tahmin edilen_etiketler) 51df_data_train = df_data_train.apply (lambda satırı: get_dish_candidate_names (row.predicted_review_label, row.review_tokens) 52, eksen = 1) 5354 (df_data_val)

Deneysel sonuçlar

Modelin yemeğin adını yemek incelemelerinden başarılı bir şekilde çıkardığı görülebilir.

Model yarışması

Yukarıdaki gerçek savaş uygulamasından görülebileceği gibi, ALBERT çok hafif olmasına rağmen, sonucun oldukça iyi olduğu söylenebilir.

Yani, daha az parametre ve iyi sonuçlarla BERT'in yerini alabilir mi?

Hızlandırmanın eğitim süresi anlamına geldiği, ikisinin deneysel performansının karşılaştırmasına daha yakından bakabiliriz.

Daha az veri olduğu ve dağıtılmış eğitim sırasında iş hacmi arttığı için, ALBERT eğitimi daha hızlıdır. Ancak çıkarım süresi, BERT ile aynı trafo hesaplamasına ihtiyaç duyar.

Yani şu şekilde özetlenebilir:

  • Aynı eğitim süresi altında ALBERT, BERT'den daha iyidir.
  • Aynı akıl yürütme süresi altında, ALBERT bazının ve büyüklüğünün etkileri BERT kadar iyi değildir.

Ek olarak, Naman Bansal, ALBERT'in yapısı nedeniyle, ALBERT'i uygulamanın hesaplama maliyetinin BERT'den daha yüksek olduğuna inanıyor.

Öyleyse hala "İkisine birden sahip olamazsın" ALBERT, BERT'yi tamamen geçecek ve yerini alacaksa, daha fazla araştırma ve iyileştirmeye ihtiyaç vardır.

Portal

Blog Adresi: https://medium.com/@namanbansal9909/should-we-shift-from-bert-to-albert-e6fbb7779d3e

- Bitiş -

Qubit QbitAI · Toutiao İmzalı

Bize dikkat edin ve en son teknolojideki en son gelişmeleri alın

2020 Olimpiyat Oyunları milli antrenman takımı listesi açıklandı, bilişim yarışmacılarının% 40'ı Zhejiang ve Guangdong'dan.
önceki
Hangzhou Gönüllüleri "Anti-salgın Ön Cephe Tıbbi Personelin Çocuk Bakım Projesi" ne Yardımcı Oldu
Sonraki
Son "savaş alanı" nı elinde tutan "Xinhua Net Connect Hubei" "sıfır zaman" yakında geliyor
Ningxia Jingyuan: Yoksullukla mücadele atölyesi çalışma ve üretime devam ediyor
Ebeveyn-çocuk savaşı "salgını"! Uzun kış tatilinde nasıl endişeli bir ebeveyn olunur?
Bağlantı+İyi iş! Xi Jinping, yeni dönemde Çinli gençliği övdü
Shaoxing savaş "salgını"! En dokunaklı on anı gözden geçirin
Bir trilyonun üzerinde durduktan sonra devam edin! Ningbo'nun 2019'daki GSYİH'si planlanan şehirde ikinci sırada
Müşterilerin ihtiyaçlarını bilen 2020 DXN, 15 tepsi tutar ve bahara 7 yeni ürün getirir
Çevrimdışı olmaktan uzak mı? FAW-Volkswagen yeni golf lansmanı yapmak üzere
Q7 Bu sefer devrilmesi bekleniyor! Buna otoriterlik denir! Standart quattro dört tekerlekten çekiş / yedi koltuk, 700.000-870.000 ön satış fiyatı
Yeni RX5 daha fazla önizleme resmi veya iki tür lamba grubunun Haziran ayında piyasaya sürülmesi bekleniyor.
Gökyüzüne bakıyor, RAV4 gördükten sonra titriyor! Hala bölünmüş farlı Qijun'u tanıyor musunuz?
Yepyeni Peugeot 2008 harika görünüyor, 2020 Red Dot Tasarım Ödülü'nü kazandı
To Top