Как железяки типировали по текстам и что из этого вышло

Прошлое и будущее человечества, освоение внешнего и внутреннего космоса

Как железяки типировали по текстам и что из этого вышло

Сообщение kanonik » Пт июн 07, 2019 11:44 am

Парф
Суть дела в том, что за всё приходится дополнительно платить. И за желанную точность, учитывающую все возможные нюансы, и за изначальное незнание того, что при расчетах важно, а что – не важно. В случае обучающих процедур платить приходится стремительным ростом размера потребной обучающей выборки.

Когда мы для обучения опросника используем аналитический метод, то он опирается на вычисление на обучающей выборке минимального количества заранее определенных фичей с понятным смыслом. А именно, это расчет типных средних для каждого анкетного вопроса. Но даже в этом случае возникает эффект переобучения (проявляющийся в том, что достигнутая сходимость на обучающей выборке оказывается выше, чем впоследствии на контрольной). Чтобы этот эффект свести к минимуму, нам даже на этом минимальном наборе вполне понятных фичей приходится использовать обучающую выборку не менее 1000 человек. И даже в этом случае небольшое переобучение остается, и чтобы довести его хотя бы до уровня в 1-2%, потребуется уже обучающая выборка примерно в 5000 человек.

Нейросеть в отличие от аналитического метода вообще не знает, какие фичи естественны, а какие нет. Например, она вдобавок к рассмотрению типных средних бросится учитывать еще и попарные сочетания вопросов (то есть, дополнительно, многочисленные нелинейные связи, а иначе нафиг она вообще и нужна). Но всё это резко усиливает эффекты переобучения, и для сведения их до уровня в 1-2% потребуется выборка-учитель размером минимум на порядок больший, чем в случае аналитического метода, а именно ДЕСЯТКИ ТЫСЯЧ ЧЕЛОВЕК. Что не реально для практики.

А что будет, если не устранять переобучение? Тогда чем больше будет эффект переобучения на обучающей выборке, тем хуже и ничтожней получится результат на контрольной выборке (потому что размер переобучения – это тот шум, который мы дополнительно вносим).
Расскажу кое-что из личного опыта:
Не все знают, что и в EXCEL имеется встроенная нейросетевая опция. Это фирменный макрос, называемый «ПОИСК РЕШЕНИЯ». Вполне обычная нейросеть с задаваемыми параметрами своей работы (в частности, можно задавать как градиентный, так и не градиентный поиск), которая для любой экселевской формульной процедуры способна подбирать одновременно до 200 числовых параметров, чтобы свести в итоге решение (то есть задаваемый некоей формулой числовой критерий) либо к максимуму, либо к минимуму, либо к заданному числу.

Когда мы ищем диагностические коэффициенты анкетных вопросов, то вместо обычного аналитического метода можно, в принципе, в Экселе использовать и эту нейросетевую процедуру. В этом случае искомые 200 диагностических коэффициентов анкетных вопросов рассматриваются как варьируемые нейросетью параметры, а в качестве максимизируемого критерия выступает сходимость итогового диагноза с заявленными типами. Числовое ограничение 200-ми варьируемыми искомыми параметрами тоже преодолевается, если процедуру применять много раз, каждый раз рандомно меняя набор варьируемых коэффициентов. В итоге можно подобрать и не 200, а все 3200 нужных вопросных диагностических коэффициентов. Однажды было дело - я на это решился и за неделю циклических вычислений сподобился подобрать все 3200 «оптимальных» коэффициентов (200 анкетных вопросов по 16 типных коэффициентов для каждого).

И что тогда получилось? На обучающей выборке в итоге была достигнута сходимость с заявленными типами = 95%, но вот далее, на контрольной выборке, она обратилась уже … лишь в 35%.
Для сравнения: в случае использования аналитического метода при том же самом объеме выборки-учителя сходимость на обучающей выборке получается всего лишь 65%, но зато на контрольной она будет уже не ниже 56-58% (а не 35%, как в случае использования экселевской нейросети!).
=========
«Если тебя лишили обязанностей гражданина, исполняй обязанности человека». (Сенека)
kanonik
Старожил
Старожил
 
Сообщения: 4490
Зарегистрирован: Вс авг 07, 2011 7:10 pm
Медали: 4

Как железяки типировали по текстам и что из этого вышло

Сообщение Буран » Пт июн 07, 2019 1:33 pm

А, может быть, как раз попарные сочетания вопросов и важны? Скажем, некоторые вопросы могут дополнять друг друга. Классический метод этого не учитывает.

Есть куча способов устранить переобучение без роста обучающей выборки. Самое банальное - уменьшить число эпох при обучении. При этом точность на обучающей выборке упадёт, а на контрольной - вырастет.
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

Как железяки типировали по текстам и что из этого вышло

Сообщение kanonik » Пт июн 07, 2019 1:47 pm

Parf писал(а):А, может быть, как раз попарные сочетания вопросов и важны? Скажем, некоторые вопросы могут дополнять друг друга. Классический метод этого не учитывает.

Есть куча способов устранить переобучение без роста обучающей выборки. Самое банальное - уменьшить число эпох при обучении. При этом точность на обучающей выборке упадёт, а на контрольной - вырастет.

Не, это влажные мечты. :D
Чем длиннее список допускаемых к рассмотрению фичей, тем больше объем потребной выборки для достижения одной и той же точности. Это железное правило. При фиксированном объеме выборки расширение списка фичей за счет учета попарных сочетаний может приводить лишь к снижению точности (вот если увеличить объем обучающей выборки на порядок - только тогда дополнительные фичи и смогут, и то лишь потенциально, работать на рост точности). Во сколько раз увеличиваем количество рассматриваемых фичей, во столько раз должен увеличиваться и объем обучающей выборки. Иначе - никак. Иначе - только призрачные надежды на вытаскивание себя из болота за волосы по рецепту Мюнхгаузена.
=========
«Если тебя лишили обязанностей гражданина, исполняй обязанности человека». (Сенека)
kanonik
Старожил
Старожил
 
Сообщения: 4490
Зарегистрирован: Вс авг 07, 2011 7:10 pm
Медали: 4

Как железяки типировали по текстам и что из этого вышло

Сообщение Буран » Сб июн 15, 2019 4:24 pm

Из-за эксперимента с диафорами слегка отвлёкся от нейросетей. Успел только посмотреть видео, как устранять переобучение. Правда, из 9 минут этого видео мне была полезна только 1 минута.

Fouras писал(а):Методы устранения переобучения. Полезное


Основные методы устранения переобучения:
1. Уменьшить количество нейронов.
2. Увеличить обучающую выборку.
3. Уменьшить число эпох при обучении (почему-то про этот метод в видео не сказано)
4. Стимулировать нейроны, каждую эпоху умножая их веса на что-то вроде 0,9995.

Методы 1-3 я и сам знал, а вот метод 4 меня удивил. На первый взгляд, это какое-то жёсткое насилие над функцией - уменьшать все её коэффициенты. Так ведь не только веса в активную зону вернутся, но и функция будет искажаться на каждом шаге - разве из-за этого ошибка не будет расти? Но нет - вроде, получается, если веса уменьшать чуть-чуть, то рост ошибки каждую эпоху компенсируется её уменьшением благодаря обучению.

Видимо, в результате полезная информация о функции распределяется между весами более равномерно - а не так, что одни веса пашут, а другие стоят отдыхают. Хотя почему это помогает против переобучения? Вроде же, против переобучения делают наоборот - некоторые веса обнуляют, чтобы они не мешали?

Надо ещё посмотреть, что делает Dropout в keras. Это, вроде, какая-то магическая фича, которая помогает против переобучения. Она делает то же, что чувак на видео, или что-то другое?
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

Как железяки типировали по текстам и что из этого вышло

Сообщение Буран » Сб июн 15, 2019 7:19 pm

Методы борьбы с переобучением. Про стимуляцию нейронов путём уменьшения весов ничего не сказано.

А вот отдельно про Dropout.

Я всё это прочитал за 5 минут, и оно оказалось намного полезнее 9-минутного видео.
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

Как железяки типировали по текстам и что из этого вышло

Сообщение Буран » Чт июн 27, 2019 10:39 pm

Буду здесь записывать интересные идеи Фуры по нейросетям. Сейчас некогда этим заниматься, ибо конкурс по диафорам. В июле конкурс закончится, и я вернусь к сетям.

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

Остальные идеи мне пока кажутся или слишком сложными, или велосипедом.

Интересные ссылки:

Fouras писал(а):Очень часто встречались красивые фокусы, когда находились способы обучения без разметки. Такое упоминалось в лекциях по анализу аудиопотока, в лекции по предложке контента, в создании word2vec, и еще более интересный вариант смысл3vec, косвенное упоминание обучения Alpha Go и Alpha Zero.


Fouras писал(а):На днях столкнулся с алгоритмом "случайный лес" и думал посмотреть что это. А вот и он сам подкатил. Судя по беглому взгляду, это алгоритм акинатора. Пока его не замусорили неверными ответами, это выглядело как реальная магия. Но любит наш народ хорошее сломать.
https://vk.com/@tproger-python-random-forest-implementation

Если сделать соционический опросник на этом принципе, он будет просто рвать мозг. Другое дело, то что он призван угадывать под большим вопросом.

Акинатор
https://ru.akinator.com/
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

Как железяки типировали по текстам и что из этого вышло

Сообщение Буран » Пн июл 15, 2019 8:20 pm

Нравится мне эта картинка - люблю всё монструозное и величественное:


Это архитектура нейросети для обработки изображений.

И тут у меня возникает вопрос: почему Dropout нарисован как слой? Это же на самом деле не слой, а выключение нейронов всех слоёв с определённой вероятностью? Нет, конечно, можно его формально сделать слоем - но тогда, чтобы Dropout нормально работал, надо его вставлять в качестве прослойки после каждого слоя сети. А тут он только в конце воткнут, и всё.

Я просто знаю, что в keras этот самый Dropout реализован именно как слой. Может быть, понятие "слой" там просто намного шире, чем мне представляется?
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

Как железяки типировали по текстам и что из этого вышло

Сообщение Буран » Ср июл 17, 2019 10:35 am

Продолжаю пересказывать своими словами статью про обучение нейросетей. Про методы нулевого порядка я написал - теперь методы первого порядка.

Они основаны на простой идее: если у функции есть градиент, то в направлении, противоположном градиенту, функция локально убывает быстрее всего. Значит, если шагнуть чуть-чуть в этом направлении, значение функции уменьшится. Проблема в том, как выбирать это "чуть-чуть", то есть ширину шага.

1) Обычный градиентный спуск - в нейросетях это backpropagation без момента. На каждом шаге движемся на постоянную константу спуска l, которая умножается на градиент Gx:

x(t) = x(t-1) - d(t-1),

где

d(t-1) = lGx(t-1).

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

А вот с выбором константы l - проблема. Если она будет слишком большой, метод проскочит точку минимума. Будет слишком маленькой - метод будет двигаться к минимуму очень медленно. При этом метод может ещё и может мотаться туда-сюда по стенкам оврага вместо того, чтобы двигаться вниз вдоль его дна. Это ещё сильнее замедлит движение.

Обычно, бедут l в районе 0,01, но это не универсальное значение на все случаи жизни.


2) Метод Нестерова - в нейросетях это backpropagation с моментом. Тот же градиентный спуск, но с запоминанием истории шагов. Идея состоит в том, что следующий шаг не должен слишком сильно отличаться от совокупности предыдущих шагов - в частности, не должно быть мотания туда-сюда по стенкам оврага. Поэтому при вычислении следующего шага в него должна вносить вклад совокупность предыдущих.

При этом, очевидно, "давнее прошлое" должно вносить меньший вклад в текущий шаг, чем недавнее. Первое, что приходит в голову - считать шаг с помощью геометрической прогрессии:

d(t-1) = lG(t-1) + clG(t-2) + c^2lG(t-3) + ... + c^nlG(t-n) + ...

где c < 1 - положительная константа, определяющая вклад прошлого. Чем она ближе к 1, тем более "инерционным" является метод. Если с = 0, получаем обычный метод градиентного спуска.

Но считать каждый раз сумму геометрической прогрессии неудобно. Удобнее считать по формуле

d(t-1) = lGx(t-1) + cd(t-2)

(если её развернуть, как раз и получится предыдущая формула). При этом получаем

x(t) = x(t-1) - cd(t-2) - lGx(t-1).

Но тут возникает вопрос: если мы в любом случае смещаемся на cd(t-2), зачем мы считаем градиент в той точке, где смещение ещё не произошло? Результат будет лучше, если считать градиент в уже смещённой точке:

x(t) = x(t-1) - cd(t-2) - lG(x(t-1) - cd(t-2))

Коэффициент c, обычно, берут равным примерно 0,9.

Дополнительным бонусом метода является то, что в нём менее значима проблема выбора константы l. Если она слишком маленькая, то в обычном градиентном методе происходит движение маленькими шагами в одну сторону - но в методе Нестерова в этом случае произойдёт ускорение движения в (1 + c + c^2 + c^3 + ....) = 1/(1-c) раз - то есть примерно в 10 раз. А вот, если l слишком большая, то, развернувшись в противоположном направлении после перескока через минимум, мы автоматически начнём тормозить движение - каждый следующий скачок через минимум с разворотом будет всё больше уменьшать шаг.



3) Методы адаптивных градиентов - адаптация для нейросетей тех идей, которые используются в методе сопряжённых направлений в математике.

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

Но для задач большой размерности вычисление перпендикулярных направлений увеличивает вычислительную сложность, притом что строгая перпендикулярность не обязательна. Поэтому делают проще: для каждой размерности запоминают, насколько сильно мы сдвигались по этой размерности. Чем сильнее мы сдвигались по ней в прошлые разы, тем слабее будем сдвигаться в этот раз.

В нейросетях направления связаны с весами, так что мы просто запоминаем для каждого веса его среднеквадратичное изменение E. Разумеется, мы, опять же, берём не среднее по всем квадратам, а сумму геометрической прогрессии с коэффициентом c. То есть фактически для изменения i-го веса используется формула

E(t-1) = sqrt(d(t-1)^2 + cE(t-2)^2)

В методе RMSProp текущее изменение веса обратно пропорционально прошлому среднеквадратичному изменению.



4) adam = Нестеров + RMSProp

А теперь берём идеи Нестерова и RMSProp и совмещаем их. То есть мы при подсчёте текущего изменения веса считаем накопленные шаги с коэффициентом c1, которые делятся на среднеквадратичные отклонения веса, считаемые с коэффициентом c2. Получаем алгоритм adam, который зависит от 3 параметров:

l - коэффициент при шаге (рекомендуется 0,01): большой l - может проскакивать минимумы, маленький - медленная сходимость;
c1 - показатель инерционности (рекомендуется 0,9): большой c1 - может долго обучаться в неправильном направлении, маленький - проблемы с коэффициентом l;
с2 - показатель переключаемости между весами (рекомендуется 0,999): большой c2 - обучение начинает зависеть, в основном, не от градиента, а от истории весов, маленький c2 - много болтанки по стенкам оврагов.

А вообще, у всех этих алгоритмов есть проблема с застреванием в локальных минимумах. Нестеров, когда разгонится, может проскакивать локальные минимумы - но, с другой стороны, если он возле локального минимума хоть чуть-чуть притормозит - всё, капец, он там застрял. RMSProp, оказавщись возле минимума, начинает плясать и качаться во все стороны, что повышает его шанс на покидание минимума. Adam хорошо проскакивает локальные минимумы и наименее склонен к застреванию в них - но застрять может и он.


Adam, вроде, считается довольно хорошим алгоритмом, и он есть в keras. Мне для типирования по текстам именно он и нужен (он используется в типировании по MBTI).
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

Как железяки типировали по текстам и что из этого вышло

Сообщение Буран » Ср июл 17, 2019 9:05 pm

Почитал, как керас устроен - вроде, в теории всё просто. Теперь надо проверить это на практике.

Нейросеть там почему-то называется "модель" (Model). Классы, производные от Model - разные архитектуры сети. Для моих целей вполне достаточно SequentalModel - это просто последовательность слоёв, по которым идут данные слева направо, и выход предыдущего слоя подаётся на вход следующего.

Работа с сетью выглядит так:
1. Создаётся SequentalModel.
2. В неё последовательно запихиваются слои.
3. Модель (то бишь сеть) компилируется с каким-нибудь алгоритмом обучения (например, "sgd" - это обычный градиентный спуск или с моментом, "rmsprop", "adam"). Говорят, после компиляции она обретает способность обучаться намного шустрее. Ходят даже слухи, что обучение у такой модели крутится на видеокарте.
4. Модель (то бишь сеть) обучается на выборке.
5. Теперь модель (то бишь сеть) можно применять для обработки данных.

Слой (Layer) - это просто абстракция, означающая, что мы подаём туда вектор на входе и получаем вектор на выходе. Это может быть и традиционный слой с весами - он называется Dense. Есть и более продвинутые слои с весами - например, слои для свёрточных или рекуррентных сетей, в частности, нужный мне LSTM.

А есть и "виртуальные" слои, у которых нет весов - они просто преобразуют входной вектор в выходной. Например:
- Activation - применяет к слою функцию активации (хотя с таким же успехом активацию можно запихнуть прямо в Dense);
- Dropout - это понятно по названию;
- Embedding - начальный слой, который из целого числа i в диапазоне от 0 до n-1 делает n-мерный вектор, в котором на i-м месте стоит 1 (полезная штука для нейросети, у который дискретные классы не только на выходе, но и на входе);
- Permute - транспонирует матрицу (или, в общем случае, переставляет размерности тензора);
- RepeatVector - делает из вектора матрицу, просто повторяя его;
- Lambda - просто применяет к вектору произвольную функцию (как получившуюся хрень обучать, я без понятия);

и ещё какие-то загадочные слои, которые делают непонятные мне вещи. А вот нормализация входа и выхода, вроде как, вшита в Dense (называется regularization) - её не надо присобачивать отдельным слоем.

Кстати, как я понял, векторы, которые на входе и на выходе слоя, могут быть и матрицами, и вообще тензорами любой размерности. Это, благодаря тому, что керас надстроен над библиотекой тензоров. Хотя мне-то и обычных векторов хватит.

Пример рекуррентной сети на керасе (стырено с Хабра):

Код: Выделить всё
from keras.preprocessing import sequence
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import LSTM

max_features = 100000
maxlen = 100
batch_size = 32

model = Sequential()
model.add(Embedding(max_features, 128, input_length=maxlen))
model.add(LSTM(64, return_sequences=True))
model.add(LSTM(64))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              class_mode="binary")

model.fit(
    X_train, y_train,
    batch_size=batch_size,
    nb_epoch=1,
    show_accuracy=True
)

result = model.predict_proba(X)
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

Как железяки типировали по текстам и что из этого вышло

Сообщение Буран » Ср июл 24, 2019 4:14 pm

Переписал свою сетку, моделирующую тест Таланова, на keras. Всё хорошо сработало, за исключением нескольких нюансов.

1. При обучении сети ей надо подавать именно массивы numpy, а не списки. Списки она не переваривает.
2. При компиляции надо явно указать функцию потерь, иначе будут глюки:

Код: Выделить всё
model.compile(optimizer=adam, loss='mean_squared_error')


3. Чтобы задать параметры оптимизатору, надо его сперва создать:

Код: Выделить всё
adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False, clipnorm=1., clipvalue=0.5)
model.compile(optimizer=adam, loss='mean_squared_error')


4. Параметр nb_epoch устарел, вместо него указывается epoches:

Код: Выделить всё
model.fit(x_train, y_train, epochs=NUM_EPOCHES, verbose=2, batch_size=None, shuffle=True)


Эффективность сетки с использованием Адама - примерно такая же, но обучается она в 2 раза быстрее. :)
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

Как железяки типировали по текстам и что из этого вышло

Сообщение /ru/ » Ср июл 24, 2019 7:53 pm

Алексище писал(а):
Parf писал(а):Speranza, рекуррентная нейронная сеть различает не только отдельные слова, но и последовательности слов.

Можно ли научить нейросеть распознавать степень эмоциональности текста? Хотя бы на примитивном уровне вроде количества междометий, восклицательных знаков и смайликов (если анализировать тексты из интернета), а также степень экспрессивности используемых слов (скажем, "ужасно" более сильное слово, чем "плохо", "большой" слабее, чем "громадный" и т. д.)?
Правда, подозреваю, что все вышеперечисленное не силу [ЧЭ], а, скорее, номер Эмоции по ПЙ будет вычислять...


Нейросеть нужна для анализа большого количества взаимосвязей, а эта проблема упирается в то, чтобы словарик 30 - 70 млн строк нормально работал.
По моему сейчас это проще в оперативе делать, такой словарь займет 5 - 10 гиг.

Я в свое время много крутился вокруг этой проблемы всякими безумными способами. Пытался из постгреса мемкешь делать. Но потом проблема решилась нудным пакетом от извращенцев под названием udpipe.
Способ очень корявый и тягомотный, лучше такие вещи самому писать.
Аватара пользователя
/ru/
Старожил
Старожил
 
Сообщения: 6025
Зарегистрирован: Вт фев 04, 2014 12:07 am
Медали: 2
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)

Как железяки типировали по текстам и что из этого вышло

Сообщение Буран » Ср июл 24, 2019 11:45 pm

Ближайшие планы:

1. Сеть, различающая авторов - сперва обычная 3слойная, потом LSTM. Эффективность сравниваем с обычным частотным словарем.
а) есть 16 авторов, отличить их друг от друга (сеть с 16 выходами)
б) есть автор, отличить его тексты от чужих (сеть с 2 выходами).

2. Аналогично, 7 сетей, типирующих по 7 основным дихотомиям. Начну с логики-этики - думаю, по текстам она должна распознаваться лучше всего.
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

Как железяки типировали по текстам и что из этого вышло

Сообщение Буран » Чт июл 25, 2019 10:01 am

От чего зависит характерный индивидуальный язык текста?

1) От, собственно, языка
2) От эпохи - лексика и характерные обороты со временем меняются
3) От стиля речи
4) От темы текста
5) От личности автора.

Чтобы обучение сети было эффективным, обучающая и тестовая выборка должны быть близки к реальным задачам.

С языком всё понятно: я пишу нейросети для русского языка.

Если я хочу типировать современных людей, надо использовать для обучения современные тексты. Может быть, писатели XIX века тоже помогут в типировании. Это можно проверить потом - но начинать лучше с современников.

Стиль. Если я типирую по художественным текстам, обучать надо тоже на художественных текстах. Если по постам на форуме - обучать надо на постах. И т.д.

Тема. Учить отдельную нейросеть под каждую тему - слишком затратно. Придётся этот фактор в большинстве случаев не учитывать.

Ну, и личность автора мы учитываем, только если учим сеть распознавать этого автора. При типировании новых авторов придется этот фактор вынести за скобки.
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

Как железяки типировали по текстам и что из этого вышло

Сообщение Буран » Чт июл 25, 2019 2:21 pm

Каков должен быть размер обучающей выборки?

Будем считать, что средний размер слова - 5 символов, а средний размер фразы - 10 слов. Получаем по 50 символов на фразу.

Размер обучающей выборки в первой работе MBTI-типировщиков - 250 тысяч фраз, сбалансированных по 16 типам, то есть порядка 2,5 миллионов слов или 12,5 миллионов символов. На один тип приходится порядка 800 тысяч символов. Если типировать по дихотомиям, вероятно, хватит по 1 миллиону символов на каждый полюс дихотомии.

Во второй работе MBTI-типировщиков - 8600 человек, у каждого из которых - 50 постов в социальных сетях. Итого - 430 тысяч постов. К сожалению, не сказано, что за социальные сети. Если это Твиттер, то размер каждого поста, вероятно - 1-2 фразы, если Facebook - то больше. Ориентируясь на 2 фразы, получаем порядка 1 миллиона фраз, то есть порядка 50 миллионов символов. Тут уже получается по 25 миллионов символов на каждый полюс дихотомии.

В общем, разброс получается довольно большой. Интересно, что в первом случае средняя точность типирования равна 37%, а во втором - всего 20%, хотя первая выборка в 25 раз меньше. При этом в первом случае брались тексты известных писателей, а во втором - посты в социальных сетях. Причина большей точности в первом случае - то ли в том, что по художественным текстам типировать лучше, чем по постам, то ли в том, что известные писатели протипированы более достоверно, чем люди, прошедшие тесты, то ли в том, что в первом случае параметры нейросети были настроены лучше.

В общем, буду поначалу ориентироваться на объём 1 миллион символов на каждый полюс дихотомии. Если этого окажется мало - буду увеличивать.
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

Как железяки типировали по текстам и что из этого вышло

Сообщение Буран » Чт июл 25, 2019 4:22 pm

Где можно брать обучающие выборки?

Для типирования и различения по художественным текстам:

1) Тексты современных русских писателей из эталонного списка (ну ладно, советских тоже можно взять):

Гребенщиков Борис - ИЛЭ
Латынина Юлия - ИЛЭ
Ефремов Иван - СЛЭ
Лукьяненко Сергей - СЛЭ
Грин Александр - ИЭИ
Ерофеев Венедикт - ИЭИ
Лимонов Эдуард - ЭИЭ
Проханов Александр - ЭИЭ
Шукшин Василий - ЛСИ
Стругацкий Борис - ИЛИ
Паустовский Константин - ЭИИ
Солженицын Александр - ЭИИ


Добавлю нескольких писателей, в которых уверен, хотя их нет в эталонном списке:

Пелевин Виктор - ИЛИ
Иванов Алексей - ИЭИ/ЭИЭ
Макс Фрай - ИЭЭ
Носов Николай - ИЛЭ/ЛИИ
Емец Дмитрий - ИЭЭ/ЭИИ
Чигиринская Ольга - ЭСИ


2) Тексты писателей с форума фантастов. В основном, их можно использовать для различения, но некоторых - и для типирования по дихотомиям:

Полудиккенс - этик, интуит
Роман Арилин (Ябадзин) - ИЛИ/ЛСИ
zubr - Бета
Виктор Не - ИЛЭ
Литера - ИЭИ
Алексей2014 - логик, рассудительный
3) Тексты с Социофорума:
- конкурсы типирования по текстам;
- Литературная арена.

Для типирования по интернет-диалогам:

4) Посты на Социофоруме

Для типирования по блогам:

5) Стены вКонтакте участников соционических групп.
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

Пред.След.

Вернуться в Неокосмизм

Кто сейчас на конференции

Зарегистрированные пользователи: GoGo [Bot], Google [Bot], vadimr, Yandex 3.0 [Bot], Yandex [Bot], Феликс