Потери продолжают расти в течение итерации - PullRequest
0 голосов
/ 21 января 2020

Я немного запутался в следующем: я тренирую нейронную сеть, и она распечатывает потери. Я тренирую его в течение 4 итераций, чтобы испытать его и использовать партии. Обычно я рассматриваю функции потерь как параболы, где потери будут уменьшаться до минимальной точки, а затем снова увеличиваться. Но мои потери продолжают расти по мере продвижения итерации.

Например, допустим, в каждой итерации 100 пакетов. На итерации 0 потери начинались с 26,3 (партия 0) и доходили до 1500,7 (партия 100). В итерации 1 он начинался с 2.4e-14 и доходил до 80,8.

Я следую примеру из spacy (https://spacy.io/usage/examples#training -ner ). Должен ли я вместо этого сравнивать потери по партиям (т. Е. Если я беру очки со всех партий 0, это должно напоминать параболу)?

1 Ответ

1 голос
/ 21 января 2020

Если вы используете точно такой же код, как и связанный, такое поведение следует ожидать.

for itn in range(n_iter):
        random.shuffle(TRAIN_DATA)
        losses = {}
        # batch up the examples using spaCy's minibatch
        batches = minibatch(TRAIN_DATA, size=compounding(4.0, 32.0, 1.001))
        for batch in batches:
            texts, annotations = zip(*batch)
            nlp.update(
                texts,  # batch of texts
                annotations,  # batch of annotations
                drop=0.5,  # dropout - make it harder to memorise data
                losses=losses,
            )
        print("Losses", losses)

"Итерация" - это внешняя l oop: for itn in range(n_iter). А из примера кода вы также можете сделать вывод, что losses сбрасывается при каждой итерации. Вызов nlp.update будет фактически увеличивать соответствующую потерю в каждом вызове, т. Е. С каждым batch, который он обрабатывает.

Так что да: потеря увеличивается в течение итерации для каждого обрабатываемого вами пакета. Чтобы проверить, действительно ли ваша модель что-то изучает, вам нужно проверить потери за итерации, подобно тому, как оператор print в исходном фрагменте печатает только после циклического выполнения пакетов, а не во время.

Надеюсь, что помогает!

...