2626
2727
2828class GoldSents (object ):
29- def __init__ (self , tokenizer , sents , n = 5000 ):
29+ def __init__ (self , tokenizer , sents , n = 10000 ):
3030 self .tokenizer = tokenizer
3131 self .sents = sents
3232 self .n = n
@@ -62,22 +62,21 @@ def _parse_line(line):
6262 return id_ , word , pos
6363
6464
65- def beam_sgd (tagger , train_data , check_data ):
65+ def best_first_sgd (tagger , train_data , check_data ):
6666 print (tagger .model .widths )
6767 print ("Itn.\t Train\t Prev\t New" )
68- queue = [(score_model (check_data , tagger ), 0 , tagger )]
69- workers = [None ] * 100
68+ queue = [[score_model (check_data , tagger ), 0 , tagger ]]
7069 limit = 4
7170 while True :
72- for prev_score , i , tagger in list (queue ):
73- #prev_score, i, tagger = max(queue)
74- train_acc , new_model = get_new_model (train_data , tagger )
75- new_score = score_model (check_data , new_model )
76- queue .append ((new_score , i + 1 , new_model ))
77- print ('%d:\t %.3f\t %.3f\t %.3f\t %.4f' % (i , train_acc , prev_score , new_score ,
78- tagger .model .eta ))
7971 queue .sort (reverse = True )
8072 queue = queue [:limit ]
73+ prev_score , i , tagger = queue [0 ]
74+ queue [0 ][0 ] *= 0.999
75+ train_acc , new_model = get_new_model (train_data , tagger )
76+ new_score = score_model (check_data , new_model )
77+ queue .append ([new_score , i + 1 , new_model ])
78+ print ('%d:\t %.3f\t %.3f\t %.3f\t %.4f' % (i + 1 , train_acc , prev_score , new_score ,
79+ tagger .model .eta ))
8180 return max (queue )
8281
8382
@@ -93,7 +92,7 @@ def score_model(gold_sents, tagger):
9392
9493
9594def get_new_model (gold_sents , tagger ):
96- learn_rate = numpy .random .normal (loc = tagger .model .learn_rate , scale = 0.001 )
95+ learn_rate = numpy .random .normal (loc = tagger .model .eta , scale = 0.0001 )
9796 if learn_rate < 0.0001 :
9897 learn_rate = 0.0001
9998
@@ -137,46 +136,7 @@ def train(Language, train_sents, dev_sents, model_dir, n_iter=15, seed=0,
137136 heldout_sents = GoldSents (nlp .tokenizer , heldout_sents )
138137
139138 tagger = Tagger .blank (nlp .vocab , [], ** model_args )
140- return beam_sgd (tagger , train_sents , heldout_sents )
141-
142- #prev_score = 0.0
143- #variance = 0.001
144- #last_good_learn_rate = nlp.tagger.model.eta
145- #n = 0
146- #total = 0
147- #acc = 0
148- #last_model = (nlp.tagger.model.weights, nlp.tagger.model.embeddings)
149- #while True:
150- # words, gold_tags = random.choice(train_sents)
151- # tokens = nlp.tokenizer.tokens_from_list(words)
152- # acc += nlp.tagger.train(tokens, gold_tags)
153- # total += len(tokens)
154- # n += 1
155- # if n and n % 20000 == 0:
156- # dev_score = score_model(nlp, heldout_sents)
157- # eval_score = score_model(nlp, dev_sents)
158- # if dev_score >= prev_score:
159- # last_model = (nlp.tagger.model.weights, nlp.tagger.model.embeddings)
160- # prev_score = dev_score
161- # variance = 0.001
162- # last_good_learn_rate = nlp.tagger.model.eta
163- # nlp.tagger.model.eta *= 1.01
164- #
165- # else:
166- # nlp.tagger.model.weights = last_model[0]
167- # nlp.tagger.model.embeddings = last_model[1]
168- # new_eta = numpy.random.normal(loc=last_good_learn_rate, scale=variance)
169- # if new_eta >= 0.0001:
170- # nlp.tagger.model.eta = new_eta
171- # else:
172- # nlp.tagger.model.eta = 0.0001
173- # print('X:\t%.3f\t%.3f\t%.3f\t%.4f' % (acc/total, dev_score, eval_score, nlp.tagger.model.eta))
174- # variance *= 1.1
175- # prev_score *= 0.9999
176- # acc = 0.0
177- # total = 0.0
178- #nlp.end_training(data_dir=model_dir)
179- #return nlp
139+ return best_first_sgd (tagger , train_sents , heldout_sents )
180140
181141
182142@plac .annotations (
0 commit comments