?

Log in

No account? Create an account

Компьютерная лингвистика

Новостная лента www.solarix.ru

Сравнение оптимизаторов "Follow The Moving Leader" и "Nesterov moment + Adam"
kelijah
Для задачи посимвольной генерации теста ответа в чатботе сравниваю два алгоритма оптимизации:

1) штатный keras.optimizers.nadam, описанный тут http://cs229.stanford.edu/proj2015/054_report.pdf
2) FTML из https://github.com/keras-team/keras-contrib/blob/master/keras_contrib/optimizers/ftml.py, описанный тут.

Сравнивается значение per instance accuracy, достигаемое при обучении нейросетки, то есть успехом считается генерация всей цепочки символов ответа без единой ошибки.
Read more...Collapse )

Когда ты джун-разработчик, а сеньор на проекте вдвое младше тебя /// шутка
kelijah
И даже ложку тебе еще не доверяют:
Read more...Collapse )

Как выглядит мина-ловушка в .NET Framework уровня "enterprise"?
kelijah
Мина образуется при сочетании двух вещей.

1. БД MS SQL, в которой сделана хранимая процедура на T-SQL, в которой сделан цикл, внутри которого заботливо оставлен PRINT. Ну чтобы в SSMS ручками запускать и удобненько диагностику читать. Надо, чтобы в тестах этот цикл выполнялся не очень много и не вызвал подозрений.

2. Прога, использующая SqlConnection + SqlCommand и вызывающая эту самую хранимку.

В прекрасный июльский день деплоймент-инженер на удаленной площадке, разворачивая и тестируя софт в очередном боевом окружении, сообщает вам радостную весть - веб-сервис валится по OutOfMemory. Вы смотрите в лог, а там дружище log4net говорит, что падает при выполнении SqlCommand, которая делает просто вызов хранимки. Ну не может такого же быть, думаете вы. Хранимка выполняется на сервере? На сервере. Память выжирается на клиенте? На клиенте. Ваш коллега совершенно четко вам сообщает, что MSSQLSERVER кушает свои положенные 8 Гб и ни капли больше, в SSMS эта хранимка вызывается и отрабатывает без проблем. А жрет клиентский 32-битный процесс.

А через денек вы натыкаетесь на описание, из которого следует, что в общем-то это - фича: "SqlCommand ExecuteNonQuery throws OutOfMemoryException". Клиент СУБД под .NET молча вытягивает все то, чем PRINT гадит в БД. И чтобы не делать так, надо немного настроить коннекшн. Хотя при этом ломается ограничение на таймаут...

Machine learning местами азартен /// офтопик
kelijah
Например, когда досыпал фич в обучающий набор, и видишь, как тренер на машине с 62.7 Гб оперативки засасывает датасет, доходит до 62.3 Гб и начинает колебаться по 100 Мб туда-сюда... Только бы не шальной запрос к сервису, который там же висит.. Просто невозможно оторваться от htop'а:
Read more...Collapse )
Но вот видишь, как CRFSuite выплевывает в консоль информацию по первой итерации - фффух, пролез, родимый, справился, ай молодца!

"Детский" режим генерации ответа в чатботе
kelijah
Есть у детей такая особенность - на вопрос, на который они не знают правильного ответа, часто отвечают не "не знаю", а выдумывают ответ, примерно похожий на правильный, чтобы не уронить самооценку. Например, спросите его про время на стрелочных часах, а он не умеет еще читать их, и будет лепить произвольные часы и минуты, главное, чтобы подходило под "общую концепцию времени".

Именно это приходит на ум, когда вижу в логе валидации нейросетевой модели генерации ответа такие записи ("True answer" это ожидаемый эталонный ответ, "Model answer" это выдача модели.):
Read more...Collapse )

Нелюбовь чатбота к букве 'п' (и еще про sklearn.metrics.classification_report)
kelijah
Модель посимвольной генерации ответа чатбота была кратко описана здесь, а ее исходный текст лежит тут.

Кроме финальной оценки качества модели через per instance accuracy (доля полностью правильно сгенерированных ответов, когда один неверный символ относит ответ к невалидным), я добавил туда расширенную диагностику с помощью sklearn.metrics.classification_report, см. строки 693 и 694. Вот что она показывает:
Read more...Collapse )

Генерация ответа чатбота: классификационная модель
kelijah
Исходный код (Python, XGBoost) лежит в репозитории. Файлы обученной на полном наборе вопросов и ответов модели лежат в папке https://github.com/Koziev/chatbot/tree/master/tmp и имеют имена xgb_answer_generator.*

Что делает модель

Модель посимвольно строит текст ответа, располагая текстом факта-предпосылки и заданного вопроса. Генерируемый текст должен быть орфографически и лексически валидным, по крайней мере хотелось бы этого достичь. В частности, модель должна уметь склонять существительные в случае, если в предпосылке и в ответе слово стоит в разной грамматической форме - см. пример далее.
Примеры работы и краткое описание алгоритмаCollapse )

Удобная сортировка текстовых датасетов с помощью LSA и t-SNE
kelijah
По-моему, самый простой, полностью unsupervised, и удобный для визуального анализа способ сортировки датасетов типа этого получается вот так:

1) у нас есть текстовый файл, в каждой строке которого находится одно предложение.

2) выполняем LSA по символьным шинглам:

vectorizer = TfidfVectorizer(max_features=None, ngram_range=(3, 5), min_df=1, analyzer='char')
svd_model = TruncatedSVD(n_components=LSA_DIMS, algorithm='randomized', n_iter=20, random_state=42)
svd_transformer = Pipeline([('tfidf', vectorizer), ('svd', svd_model)])
svd_transformer.fit(tfidf_corpus)
phrase_ls = svd_transformer.transform(tfidf_corpus)


3) выполняем встраивание получающегося списка векторов phrase_ls в одномерное пространство с помощью t-SNE, так что близкие вектора предложений, полученные в п.2, будут примерно так же близки друг к другу, как в исходном LSA-пространстве (я задавал LSA_DIMS=60, но это влияет больше на общее время выполнения, чем на качество итоговых результатов):

tsne = TSNE(n_components=1)
phrases_1d = tsne.fit_transform(phrase_ls)


4) остается только отсортировать предложения по получившемуся ключу 1d встраивания и сохранить результат в файл.

В результатах такой сортировки можно увидеть разные группы, например:
Read more...Collapse )

Модуль поддержания разговора (smalltalk режим) для чатбота
kelijah
В кодовую базу чат-бота добавлен небольшой модуль, которые позволяет в ответ на реплики пользователя, не являющиеся вопросами, отвечать для поддержания разговора (с условным названием smalltalk режим - см. также описание светской беседы в вики). В комплекте с общим retrieval-based алгоритмом чатбота и динамическим обновлением базы знаний из диалога получается более плавное общение (Q - мои реплики, A - ответы чат-бота):

Q:> привет
A:> Здравствуй

Q:> как тебя зовут?
A:> кеша

Q:> меня зовут Илья
A:> Привет!

Q:> я сегодня ел арбуз
A:> Арбуз очень вкусный был?

Q:> что я сегодня ел?
A:> арбуз




Read more...Collapse )

Корпус русскоязычных диалогов и обменов репликами (неочищенный)
kelijah
Для экспериментов с различными моделями для русскоязычного чат-бота.
Пара сотен тысяч фраз, диалоги разной степени осмысленности и законченности, не субтитры.
Текстовый файл