Вопрос или проблема
Я пытаюсь создать генератор хайку на уровне слов с использованием нейронной сети LSTM. Я собираю хайку с Reddit в r/haiku и хотел начать с “простой” модели: мои тренировочные данные – это набор всех хайку, выровненный и разбитый на триграммы, так что первые два слова триграммы являются признаками, а последнее слово – меткой. Я выбрал “размер контекста” равный двум просто потому, что хотел начать с малого размера, учитывая, насколько малы сами хайку. Так что, по сути, это задача предсказания текста с небольшим контекстным окном.
Например, первые пары (X,y) (сначала ~ 90,000 таких пар) выглядят так:
[('delicate savage', "https://datascience.stackexchange.com/"),
('savage /', "you'll"),
(" / you'll", 'never'),
("you'll never", 'hold')... ]
(Я использую символ “https://datascience.stackexchange.com/” для обозначения новой строфы, а также добавил ‘$’ для указания конца хайку, чтобы увидеть, сможет ли моя модель выучить такие различия, присутствующие в формате хайку)
Затем я кодирую свои последовательности, используя индексное сопоставление, и передаю это в слой встраивания, когда обучаю свою модель.
Модель:
Sequential([
Embedding(input_dim=vocab_size, output_dim=60, input_length=seq_length), # длина последовательности 2
LSTM(100,return_sequences=True),
LSTM(100),
Dense(100,kernel_regularizer=l2(0.01),activation = 'relu'),
Dense(vocab_size, activation = 'softmax')
])
Моя производительность довольно плоха: около 45% точности на обучающем наборе и 15% на валидационном. Когда я генерирую последовательности хайку с использованием обученной модели, модель часто не знает, что делать, и возвращает None.
Я понимаю, что есть несколько мест, где моя модель может ошибаться, но я действительно не уверен, где. Я пробовал различные методы регуляризации (dropout, L2) и модифицировал архитектуру своей нейронной сети (количество слоев и узлов), но безуспешно. Прежде чем попробовать использовать предварительно обученное встраивание, что я могу сделать, чтобы улучшить свои возможности предсказания текста с моими данными?
Если это поможет, вот моя ноутбук, использующий языковую модель, основанную на этой реализации.
Я не думаю, что вам действительно нужна регуляризация, так как методы регуляризации нужны в переобученной модели, но ваша модель плохо работает как на обучающем, так и на валидационном наборе, что свидетельствует о недообучении.
Если вы хотите улучшить свою сеть, вы можете рассмотреть возможность добавления большего количества слоев в вашу сеть (например, сложенные LSTM). Я не знаю, что именно представляет собой хайку, но если хайку требует специфического правила для ритма или рифмы, вы можете рассмотреть возможность ввода на уровне символов, как в ELMo.
Ответ или решение
Ваш вопрос о низкой производительности нейронной языковой модели, которая генерирует хокку, поднимает несколько ключевых моментов, требующих детального анализа. Неудача модели может быть связана с различными аспектами, включая архитектуру, подготовку данных и гиперпараметры. Рассмотрим их более подробно:
1. Подготовка данных
Ваше решение использовать триграммы как входные данные и метки для задачи предсказания текста может быть недостаточно эффективным для генерации хокку. Хокку — это поэтическая форма с особыми ритмическими и рифмовыми требованиями. Возможные причины низкой производительности:
-
Контекст: Вы используете контекст с ограничением в два слова. Это может быть слишком мало, чтобы модель могла уловить ритм и структуру хокку. Рассмотрите возможность увеличения размера контекста до трех или четырех слов.
-
Формат данных: Обозначение нового строфы и конца хокку с помощью специальных символов может привести к путанице в модели. Убедитесь, что модель четко понимает эти маркеры. Возможно, стоит также рассмотреть другие варианты разметки.
-
Диверсификация данных: Хотя у вас есть 90,000 триграмм, может, стоит проверить разнообразие и уникальность вашей выборки. Узкий диапазон слов может ограничить способность вашей модели к обобщению.
2. Архитектура модели
Анализируя вашу архитектуру с LSTM, стоит отметить несколько вещей:
-
Сложность модели: Ваше текущее построение сети может быть слишком простым для задачи генерации текста, особенно с учетом сложных особенностей хокку. Возможно, имеет смысл добавить дополнительные слои LSTM и увеличить их количество ячеек, чтобы улучшить способность модели к запоминанию и обучению на длинных последовательностях.
-
Активация и регуляризация: Вы используете
relu
в Dense-слое. Хотя это часто работает хорошо, в контексте работы с последовательными данными может оказаться, что функция активации с гладкостью (например,tanh
) будет более подходящей выбором для LSTM-слоев. Регуляризация, как вы заметили, может не понадобиться, если ваша модель не переобучается, но стоит следить за процессом обучения.
3. Гиперпараметры
Параметры обучения, такие как скорость обучения, количество эпох и размер батча, могут существенно повлиять на процесс. Экспериментируйте с различными значениями скорости обучения (например, используйте Adam или RMSprop, которые могут лучше адаптироваться к вашим данным), а также увеличьте количество эпох.
4. Использование предобученных различных векторов представления
Важно отметить, что использование предобученных векторов слов, таких как Word2Vec или GloVe, может значительно улучшить вашу модель. Они обеспечивают более глубокое семантическое представление слов, чем то, что может быть обучено из вашей выборки.
Заключение
Несмотря на то, что у вас уже есть неплохое начало, важно провести полномасштабный анализ и пересмотр каждого элемента вашей модели. Применение изменений, таких как увеличение размера контекста, улучшение архитектуры, правильная обработка данных и использование предобученных векторов представления, могут помочь в повышении точности модели и, соответственно, в улучшении генерации хокку. Постоянный эксперимент и анализ результатов позволит вам достичь наилучших результатов.