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

Английская версия этой записи — на GitHub.

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

Чтобы пронаблюдать поведение самообучающихся решений, мы протестировали их на 1 000 000 блоков. Тестировать на таком количестве блоков все решения было бы нереально, но эти девять оказались достаточно быстрыми.

На графике ниже показана зависимость процента правильных ответов от числа обработанных блоков. Обратите внимание, что горизонтальная шкала — логарифмическая.

image


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

На следующем графике показан не накопительный процент правильных ответов (средний за всё время работы), а только за последние 10 000 блоков в каждой точке. Здесь лучше видно, как решение ведёт себя после определённого объёма обучения.

image

Ниже — графики частоты ложноотрицательных и ложноположительных результатов, соответственно. Здесь тоже учитывается поведение на последних 10 000 блоках, а не накопительное от начала работы.

image

image

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

На специальной странице на GitHub можно найти подробные результаты исследования на 1 000 000 блоков.

На основании проведённого исследования мы решили наградить специальными призами по 400 USD участников под псевдонимами rd.nvkz и AndSDev. Их решения достигли высочайших показателей — 93.99% и 93.65% соответственно. Кроме того, их поведение не ухудшается при продолжительном обучении, а у первого из них — даже продолжает улучшаться. Наши поздравления!

Следите за блогом компании Hola! Будут новые конкурсы.
Поделиться с друзьями
-->

Комментарии (13)


  1. datacompboy
    20.10.2016 16:02
    +2

    Всё это время они тестировались? :))


    1. feldgendler
      20.10.2016 16:30

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


      1. jhonyxakep
        20.10.2016 20:09

        как насчет призов за самый медленный алгоритм? :)


    1. feldgendler
      20.10.2016 16:31
      +1

      Хотя там в основном зачёте, кстати, было одно очень медленное решение, которое чисто для интереса оставили работать, хотя было ясно, что результат там будет даже не в сотне лучших. Но через месяц работы (на тот момент было обработано около трети тестовой последовательности) сервер пришлось перезагрузить, так что не судьба.


  1. vintage
    20.10.2016 18:55

    Было бы интересней увидеть анализ решений без этого чита.


    1. feldgendler
      21.10.2016 09:36

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


      1. vintage
        21.10.2016 10:04

        Да, если бы тестирование проводилось правильно, с равными размерами словарей слов и не слов. А что ж не перевели?


        1. feldgendler
          21.10.2016 23:37

          Решений, результат которых зависит от возможности обучаться, всего 9. Здесь на GitHub приведена таблица, в которой показано, какие места они заняли бы без обучения.
          https://github.com/hola/challenge_word_classifier/blob/master/blog/06-learning-solutions.md#baseline-correctness


          1. vintage
            22.10.2016 00:51

            А почему только они? Остальных дисквалифицировали за то, что не пользовались читом, действие которого вы в этом тесте нивелировали? :-)


            1. feldgendler
              22.10.2016 01:10

              Я неправильно выразился. От обучения зависят результаты только девяти решений. Если исключить возможность обучения, у девяти решений процент правильных ответов ухудшится, у остальных не изменится. Таким образом, девять строк из таблицы покинут свои места и переместятся пониже. В табличке как раз и приведено, на какие позиции они тогда попадут.


              1. vintage
                22.10.2016 01:43

                Так интересно-то не куда попадут эти решения, а какие оказались впереди и почему.


                1. feldgendler
                  22.10.2016 09:32

                  Первые пять мест в основном зачёте не зависят от обучения. Тот, кто был на 6 месте, съезжает на 14, тот, кто был на 15, съезжает на 30, и так далее.


  1. knstqq
    21.10.2016 13:04

    Ох, вот ведь незадача, вылетело-таки моё решение по потребляемой памяти. Я чистил время от времени кэш с запросами, но этого не хватило для миллиона блоков.