Ошибки (см.
предыдущий заход в тему тут) устранены, гиперпараметры модели подкручены, чудесных результатов почти не осталось, за исключением одного магического числа 13%.
Кратко опишу задачу еще разочек.
1. Имеем
векторные репрезентации слов, полученные заранее по большому корпусу (~22 Гб русского текста в utf-8, с включенной туда русской википедией, региональными/международными новостями, худлитом и так далее).
2. Берем список предложений. Для простоты анализа я взял предложения длиной 6 токенов, то есть это обычно 5 слов и финализатор. Модель обсчитывается не очень быстро, ибо premature optimization, C# и бла-бла-бла, поэтому беру только 100,000 предложений. В принципе, модель успевает достичь равновесия, как будет видно далее на графике. Потом мы, наверное, загоним это куда-нибудь в
caffe, чтобы посмотреть на жизнь с векторами длиной 500...3000.
3. В каждом предложении идем по словам, и для очередного слова пытаемся предсказать следующее слово. Модель видит не сами слова, а их векторы (см. п.1.), поэтому задача в сводится к
экстраполяции многомерной функции N действительных переменных, при N=50...1000.
4. Евклидова мера разницы между экстраполированным вектором (предсказанным словом) и фактическим вектором дает текущую ошибку предсказания, которую мы будем рисовать далее.
5. Экстраполяцией будет заниматься
нейросеть с одним скрытым слоем.
График сходимости при обучении (oy - ошибка в %, ox - число предложений):
Интересный момент, которому я пока не придумал однозначного объяснения - существование какого-то магического значения в 12-13% для разных параметров и разных обрабатываемых корпусов. Модели тяготеют в конечном итоге именно к такой ошибаемости, хотя скорость выхода на это значение разная. Из общих соображений тут должна играть свою роль избыточность текста. Банальную ошибку тоже не исключаю,
errare humanum est, тем более что график сходимости на плато демонстрирует странную синхронность. Хорошим способом проверки будет обсчет паттернов на caffe или аналогичном фреймворке.
Второй интересный момент: более простая модель с векторами длиной 50 сходится гораздо быстрее, чем более сложные модели. Предполагаю, что причиной может быть работа градиентного спуска в нейросети с полносвязанными слоями.
Хороший вопрос - какие слова предсказывать труднее всего? Для поиска ответа делаем так. После окончания обучения прогоняем через обученную модель предложения в режиме чистого распознавания и отрисовываем ошибочные слова с визуальным выделением желтым фоном. Чем желтее фон под словом, тем хуже у сети получилось предсказать его. Вот верхушка самых трудных случаев:
слушала все наши разговоры .
вот теперь прогноз сбылся .
всем редакторам крепко руку .
к слову старый анекдот .
различные текущие финансовые индексы .
размещаются самые разнообразные сервисы .
понарошку может окончиться травмами .
постараемся обойтись без потерь .
историю этой азартной игры .
ориентироваться на узкие рынки .
исходная структура неоднородностей разрушается .
иногда читаю ваш журнал .
жизнь расставляет свои акценты .
Вот серединка, желтизны гораздо меньше:
меня никто не переубедит !
правило , достаточно перекомпиляции .
побуждает пользователей так шифроваться ?
никогда такого не было !
отламывание шасси выглядит неубедительно .
как-то вспоминается лесковский Левша …
просто никто не знает !
же я его покупал ?
, или почти все .
ли вы , что …
хотя бы его четко сформулировать .
же пишет что-то вроде …
управляются при помощи мысленных команд .
, мы пошли дальше …
правда ли , впечатляет ?
это означает на практике ?
есть и другой путь …