Аналитика Golos•Core. Предсказание поведения кураторов

Добрый вечер!

Те, кто интересуются работой Golos•Core, знают, что некоторое время назад командой было проведено исследование, касающееся связи кривых вознаграждения с поведением кураторов. В этом посте хотелось бы изложить вкратце метод и выводы. Но сначала несколько слов о цели исследования и о том, как оно проводилось.

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

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

Как следствие, решено было пойти другим путем: предположить, что кураторы являются рациональными экономическими агентами (они действуют, максимизируя свою прибыль) и предсказать действия таких агентов при определенных правилах игры. Даже если в реальности не все кураторы являются рациональными агентами, нас в первую очередь интересует поведение именно таких пользователей, поскольку они, по определению, действуют эффективнее остальных. Следовательно, со временем увеличивают свое влияние на экономику системы.

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

На самом верхнем уровне модели располагаются такие объекты, как статьи, кураторы, правила.

class Article final : public std::enable_shared_from_this Article>
{
public:
//...
class TextProperties : public std::array<std::unique_ptr RndVariable>
, PROPERTIES_COUNT>
{
public:
double dist(const TextProperties& rhs) const;
//...
};
private:
TextProperties _properties;
//...
};

class User final
{
double _charge;
std::unique_ptr RndVariable> _stack;
Article::TextProperties _taste;
std::shared_ptr Strat _strat;
//...
};

class Rules final
{
Func _curatorsImpact;
Func _acticleReward;
double _straightforwardProb;
//...
};

Кураторы действуют исходя из стратегий (речь о них пойдет ниже). Каждая стратегия является набором функций от "наблюдаемых" куратором значений. Интерпретация возвращаемых стратегией результатов меняется от эксперимента к эксперименту вместе с коррекцией взаимодействия объектов верхнего уровня.

Описание модели

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

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

По каждой статье, созданной некоторое количество итераций назад, производится расчет выплат – кураторам выплачивается награда в соответствии с описанными в настройках правилами; статья удаляется из пула. Информация о полученной куратором награде агрегируется на уровне стратегии. Некоторый процент кураторов (задаваемый в настройках) действует не по какой-то стратегии, а наивно, курируя в соответствии с расстоянием между предпочтениями и свойствами статей.

Набор стратегий интерпретируется как популяция, на которой запущен генетический алгоритм (т.е. стратегия является особью в моделируемой эволюции).

class Strat final {
//...
public:
//...
//стратегия является особью в генетическом алгоритме,
//в результате отбора она может быть переинициализирована
void born(const Strat& parentA, const Strat& parentB);
//для действий различного типа стратегия по вектору свойств возвращает некоторое число
double get(const std::vector Feature>& features, ActType actType) const;
};

Стратегии задаются параметрически и являются точками в n-мерном пространстве:

В качестве функции приспособленности берется скользящее среднее от количества токенов, заработанных кураторами с помощью определенной стратегии. Отметим, что задача имеет некоторые особенности, делающие невозможным использование стандартных, "библиотечных", алгоритмов: стратегии находятся в изменяющейся среде (они взаимозависимы и изменчивы), функция приспособленности довольно сильно зашумлена, т.к. количество токенов, получаемых куратором, не определяется однозначно его стратегией.

Для решения этих проблем были реализованы особые механизмы. Шум сглаживался методом, описанным в "Genetic Algorithms for Optimization of Noisy Fitnes Functions and Adaptation to Changing Environments" (раздел 3.3 - 3.4). Поддержка разнообразия популяции, необходимого для корректной работы генетического алгоритма в изменяющейся среде, осуществлялась путем разбиения популяции на относительно изолированные группы. Но, с принципиальной точки зрения, используемый подход довольно стандартен – в результате эволюции популяция становится все более приспособленной, в нашем случае через множество итераций мы получим хорошее приближение для стратегии рационального агента (куратора) при заданных условиях.

Итак, в модели можно выделить верхний уровень, в котором взаимодействуют кураторы, статьи и правила – он легко изменяем под конкретный эксперимент; и часть со стратегиями и их эволюцией – она сложнее и неизменна.

Наличие описанной модели позволило провести серию экспериментов вида:

  • описание взаимодействия объектов на верхнем уровне;
  • запуск эволюционного отбора кураторских стратегий;
  • оценка результата.

Для наглядности рассмотрим несколько тепловых карт, полученных с помощью описанного подхода:

Данная стратегия рационального агента была получена при моделировании варианта, в котором 30% кураторов действуют заведомо наивно: s = 30%, кривая вознаграждения за пост: r(x) = x^2, кураторская кривая: w(x) = sqrt(x).

Это графическое представление данных интерпретируется следующим образом:

  • Первая тепловая карта отображает вес, с которым пост будет выбран к рассмотрению куратором. По горизонтали – логарифм количества итераций (рост слева направо), прошедших с создания поста, по вертикали – логарифм рейтинга (взвешенная сумма голосов за пост);
  • Вторая карта – вес, с которым куратор голосует за выбранный пост. По горизонтали – расстояние от вектора свойств поста до предпочтений куратора, другими словами, некоторая величина, пропорциональная тому, насколько куратору не понравился выбранный пост (рост слева направо). По вертикали, как и на предыдущей карте – логарифм рейтинга.
    Как видим, в данном случае, рациональный агент при курировании учитывает качество контента.

Однако уже для s = 20% та же модель дает следующую стратегию:

Здесь выбранный пост, вне зависимости от его характеристик, апвоутится с максимальным весом.

По-видимому, для r(x) = x требования к значению s еще выше.

В данном эксперименте, при s = 50%, зависимость веса апвоута от субъективно оцененного качества – минимальна.

Напоследок рассмотрим вариант, в котором ищутся стратегии для кураторов с различной силой голоса.

В этом графическом представлении три пары тепловых карт соответствуют стратегиям рациональных агентов с различной силой (стратегии расположены по возрастанию силы голоса); r(x) = x^2, s = 40%. Здесь рациональные агенты выбирают для курирования посты с небольшим рейтингом, отдавая предпочтение более свежим постам (см. карты: 1, 3, 5). Далее, кураторы первых двух типов апвоутят выбранный пост с весом, зависящим от качества поста (см. карты: 2, 4). Однако несмотря на большое количество наивно действующих кураторов, качество контента не учитывается в стратегии крупных игроков.

В той же модели, при замене r(x) = x^2 на r(x) = x (линейная функция вознаграждения за пост), стратегия всех типов рациональных агентов не зависит от качества контента:

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

Выводы

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

Для понимания этого факта может быть полезным следующее наблюдение:

  • Кураторское вознаграждение зависит только от того, как соотносятся апвоуты статьи с апвоутами остальных статей в пуле;
  • Вся информация о действиях других пользователей доступна кураторам в момент принятия решения.

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

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

Каналы коммуникации с Golos•Core

  • https://t.me/goloscoretc (решение технических вопросов, связанных с работой блокчейн, нод, api и др.)
  • https://t.me/joinchat/BLwf_A118xQ57nsM1Q4MPA (канал для вноса предложений от комьюнити, обсуждение перехода на кодовую базу EOS)
  • https://t.me/golos_tools (решение вопросов по различным интерфейсам и дополнительным инструментам, создаваемым Golos•Core)
  • https://t.me/goloscore_analytics (решение вопросов по работе экономики блокчейн, статистическим экономическим данным, аналитике данных)
  • https://t.me/goloscoretech (новостной канал, с актуальной информацией от Golos•Core)
  • Мы будем очень рады, если вы поддержите делегата @goloscore. Заходите на страничку https://golos.io/~witnesses и проголосуйте за делегата Golos•Core
  • Спасибо за внимание и хорошего дня!

С уважением,
Команда Golos•Core: @korpusenko, @andreypf, @maslenitsa, @muhazokotuha, @zxcat, @mariadia, @annaeq, @anazarov79, @kaynarov, @s-medvedev

блокчейнголосаналитика
25%
1
106
36.031 GOLOS
0
В избранное
goloscore
На Golos с 2017 M08
106
0

Зарегистрируйтесь, чтобы проголосовать за пост или написать комментарий

Авторы получают вознаграждение, когда пользователи голосуют за их посты. Голосующие читатели также получают вознаграждение за свои голоса.

Зарегистрироваться
Комментарии (16)
Сортировать по:
Сначала старые