Распознавание именованных объектов с использованием Vowpal Wabbit, по-видимому, запоминает данные обучения

Я использую API Python Vowpal Wabbit для обучения классификаторов распознавания именованных объектов для определения имен людей, организаций и местоположений из коротких предложений. Я составил блокнот IPython с подробными данными, как модели обучаются, и объекты, идентифицированные в оценочных предложениях. Данные обучения поступают из ATIS и CONLL 2003 наборы данных.

Настройка моего класса Vowpal Wabbit SearchTask (на основе этого учебник):

class SequenceLabeler(pyvw.SearchTask):
    def __init__(self, vw, sch, num_actions):
        pyvw.SearchTask.__init__(self, vw, sch, num_actions)

        sch.set_options( sch.AUTO_HAMMING_LOSS | sch.AUTO_CONDITION_FEATURES )

    def _run(self, sentence):
        output = []
        for n in range(len(sentence)):
            pos,word = sentence[n]
            with self.vw.example({'w': [word]}) as ex:
                pred = self.sch.predict(examples=ex, my_tag=n+1, oracle=pos, condition=[(n,'p'), (n-1, 'q')])
                output.append(pred)
        return output

Обучение модели:

vw = pyvw.vw(search=num_labels, search_task='hook', ring_size=1024)
#num_labels = 3 ('B'eginning entity, 'I'nside entity, 'O'ther)

sequenceLabeler = vw.init_search_task(SequenceLabeler)    
sequenceLabeler.learn(training_set)

Модель хорошо работает с именованными сущностями (точные совпадения строк), представленными в обучающих данных, но плохо обобщается на новые примеры, использующие ту же структуру. То есть классификаторы будут идентифицировать сущности, присутствующие в предложениях, из обучающих данных, но когда я ТОЛЬКО меняю имена, они работают плохо.

sample_sentences = ['new york to las vegas on sunday afternoon', 
                    'chennai to mumbai on sunday afternoon',
                    'lima to ascuncion on sunday afternoon']

Вывод этого при запуске классификатора:

new york to las vegas on sunday afternoon
locations - ['new york', 'las vegas']

chennai to mumbai on sunday afternoon
locations - []

lima to ascuncion on sunday afternoon
locations - []

Это указывает на то, что хотя предложение остается прежним: «с a по b в воскресенье днем», модель не может идентифицировать новые местоположения, возможно, потому, что она запомнила обучающие примеры?

Аналогичные результаты справедливы для классификаторов organisation и person. Их можно найти на моем Github.

Мои вопросы -

  1. Что я здесь делаю неправильно?
  2. Есть ли другие параметры модели, которые я могу изменить? Или мне лучше использовать существующие, такие как ring_size и search_task?
  3. Какие-либо предложения, которые вы могли бы предложить, чтобы улучшить обобщаемость моделей?

person Navaneethan Santhanam    schedule 19.04.2017    source источник


Ответы (1)


  1. Вы не используете ни географические справочники, ни орфографические элементы (например, --spelling или --affix), все ваши данные написаны строчными буквами, поэтому единственные функции, которые могут помочь, — это идентификаторы униграмм и биграмм. Неудивительно, что вы переоцениваете тренировочные данные. Теоретически вы можете улучшить свои обучающие данные с помощью искусственных именованных сущностей, которые следуют шаблонам (от x до y по воскресеньям), но если это поможет, будет проще создать классификатор на основе правил.

  2. Есть много параметров, например. -l (скорость обучения) и --passes. См. руководство и список параметров. Обратите внимание, что ring_size не влияет на качество предсказания, вам просто нужно установить его достаточно высоким, чтобы вы не получали никаких предупреждений (т.е. выше самой длинной последовательности).

  3. см. 1

person Martin Popel    schedule 19.04.2017