К примеру, всего «хороших» запросов у нас было 100 (в том числе Надым). Четверь из них (25 запросов, в том числе Надым) мы отобрали случайным образом и сформировали из них тестовое множество. Оставшиеся три четверти (75 запросов) — это наше обучающее множество.
В данной постановке задачи у нас вообще нет понятия «плохие» запросы. Когда начинается DDoS, мы блокируем все, что не узнается.
Нейросетевые технологии могут быть применены не только к задаче классификации (то, что вы описали в обсуждаемой статье), но и к задаче кластеризации (то, о чем я безуспешно пытаюсь вам сказать). Для решения первой нам нужно не менее двух классов, для решения последней — просто набор данных.
Давайте вернемся к вышеупомянутому примеру, где все «хорошие» запросы шли с территории России, а про «плохие» мы и слыхом не слыхивали.
Сеть будем обучать только на «хороших» запросах. На вход будем подавать вектор [lat, lng]. На выходе будем получать значения из интервала (0, 1). Ошибкой для нас будет разность между единицей и фактическим выходом из сети (не стандартное отклонение — для наглядности). Разделим все наши «запросы» на два множества — обучающее и тестовое. Начнем обучение сети.
Средняя ошибка на первом прогоне будет в районе 0.5 — для обоих множеств. С каждым прогоном эти ошибки будут падать, так как мы заставляем сеть выдавать результат все более близкий к единице. Но на определенном этапе ошибка обучающего множества упадет, а ошибка тестового множества — вырастет. Почему?
К примеру, потому, что в обучающем множестве не было ни одного запроса из Надыма, а в тестовом множестве он был.
Обучение только на «хороших» данных — это нетипичное решение типичной задачи кластеризации.
Во-первых, по поводу «0% ошибок на Training set и Test set». По ссылкам вы найдете два графика — в теории и на практике (ссылка на статью). На графиках видно, что ошибка на тестовом множестве с определенного момента начинает расти.
Во-вторых, не имея «плохих» примеров, их можно сконструировать из «хороших», инвертируя булевы значения и интервалы. Очевидно, что это будут не «плохие» значения в вашем понимании, а просто «все остальные возможные».
В-третьих, «запомнить» для нейронной сети, если это само не является целью, — это самое плохое, что с ней может случиться. Ее цель — «обобщать».
P.S. Позвольте проиллюстрировать разницу на этом графике (ссылка на статью). Когда сеть не переучена (нижний рисунок), новое наблюдение классифицируется как принадлежащее «зеленой области». Когда сеть переучена (верхний правый рисунок), новое наблюдение не попадает в зеленую область. Тестовое множество помогает нам эмулировать поступление новых данных и не давать сети переучиваться.
Просто чтобы Вы не считали меня «человеком с улицы» скажу, что в 2001 году я защитил магистерскую диссертацию в ГУ-ВШЭ по теме «Нейросетевые технологии в финансовом анализе».
Мои утверждения:
1) Нейронная сеть, обученная на «хороших» запросах без тестирующего множества («переученная»), будет на любой запрос (кроме тех, что ей были представлены на обучение) отвечать, что он «плохой». Все потому, что она «запомнила» исходные данные.
2) Нейронная сеть, обученная на «хороших» запросах с тестирующим множеством, будет на «хороший» запрос отвечать, что он «хороший», а на «все остальные», что они «не хорошие». При этом если «плохой» запрос неотличим от «хорошего», то сеть его также будет считать «хорошим». В примере, приведенном выше, если «плохой» запрос будет идти из России, а не из Китая, то сеть его пропустит.
Непонимание возникло потому, что Вы фокусируетесь на «плохих» запросах. А я говорю о «хороших». Есть аналогия из мира электронной почты и борьбы со спамом — «черный» и «белый» списки. Приведенный Вами метод аналогичен «черному», упомянутый мною — «белому».
По поводу «наименьших ошибок на training и test set'ах». Вы совершенно правы, что на обучающем множестве с каждым пробегом ошибка будет падать. Но на тестовом множестве с определенного момента она начнет расти. В этот момент сеть обучилась, и обучение необходимо остановить, поскольку дальше пойдет переобучение.
Давайте для примера упростим задачу. Будем считать, что у нас есть только данные GeoIP (широта и долгота). Аудитория нашего сайта — территория России. После обучения на «хороших» запросах наша сеть с определенной погрешностью определяет запросы с территории России. Начинается DDoS. Большинство запросов с территории России сеть пропускает, а все остальные запросы — блокирует.
При таком обучении тоже идет классификация, но неявная. «Хорошие» запросы противопоставляются «всем остальным возможным».
Согласен. Кроме того, изучая чужой опыт, нужно постоянно ставить себя на место другого человека. Чем выше у человека способность к эмпатии, тем более чужой опыт становится его собственным.
Наверное, вы имели ввиду обратное, что любой запрос, кроме тех, что у нее были в обучающем множестве, сеть будет определять как плохой. Но ведь для того и существует тестирующее множество, чтобы сеть не переобучилась.
Можно заранее обучить сеть определять хороших посетителей (то есть тех, кто уже посещал сайт). Пока дела идут хорошо, мы ее не используем, но при этом постоянно переучиваем. При начале DDoS'а мы ее задействуем. Очевидно, что она не избавит от всех атакующих, но может серьезно урезать их число.
Я так и предполагал. Поскольку Вы не ограничили количество простаивающих инстансов и не указали таймаут ожидания, то GAE сам решает сколько инстансов нужно запустить, чтобы в кратчайшие сроки обработать все ваши запросы. Он может запустить их очень много. После этого они все будут стоять без работы 15 минут, прежде чем он их прибьет. Если в «Max Idle Instances» поставить 1, а в «Min Pending Latency» — 1.0s, то Вы, скорее всего, получите бесплатную платформу.
Меня смущает то, что оранжевая кривая на графике «Типы инстансов» — активные инстансы — лежит на оси «x». Сколько у Вас выставлено в Application Settings -> Performance -> Max Idle Instances?
Обратите внимание на регулярность образования следующих форм: косить→косилка, курить→курилка, считать→считалка, сушить→сушилка, мешать→мешалка, греть→грелка, соображать→соображалка, копить→копилка. Они все образуются от прошедшего времени глагола. Уже на нашей памяти по аналогии были образованы слова читать→читалка, флудить→флудилка, хотеть→хотелка. Как видите, этот метод словообразования успешно действует.
Что касается суффикса "-ник", то отглагольные существительные для него также более привычно образовывать от прошедшего времени глагола. То есть более правильным было бы «чатильник».
У всех на слуху похожее слово «мобильник», но оно произошло не от глагола, а от словосочетания «мобильный телефон».
Однако — отвертка, батарейка, тачанка, шарманка, защелка, кофемолка, лампочка, кошелка, колонка, ручка, котомка, электроплитка. Это все инструменты и близкие к ним вещи.
Мне так кажется, что носители языка сами со временем выработают нечто энергетически эффективное и семантически четкое.
В данной постановке задачи у нас вообще нет понятия «плохие» запросы. Когда начинается DDoS, мы блокируем все, что не узнается.
Давайте вернемся к вышеупомянутому примеру, где все «хорошие» запросы шли с территории России, а про «плохие» мы и слыхом не слыхивали.
Сеть будем обучать только на «хороших» запросах. На вход будем подавать вектор [lat, lng]. На выходе будем получать значения из интервала (0, 1). Ошибкой для нас будет разность между единицей и фактическим выходом из сети (не стандартное отклонение — для наглядности). Разделим все наши «запросы» на два множества — обучающее и тестовое. Начнем обучение сети.
Средняя ошибка на первом прогоне будет в районе 0.5 — для обоих множеств. С каждым прогоном эти ошибки будут падать, так как мы заставляем сеть выдавать результат все более близкий к единице. Но на определенном этапе ошибка обучающего множества упадет, а ошибка тестового множества — вырастет. Почему?
К примеру, потому, что в обучающем множестве не было ни одного запроса из Надыма, а в тестовом множестве он был.
Обучение только на «хороших» данных — это нетипичное решение типичной задачи кластеризации.
Во-вторых, не имея «плохих» примеров, их можно сконструировать из «хороших», инвертируя булевы значения и интервалы. Очевидно, что это будут не «плохие» значения в вашем понимании, а просто «все остальные возможные».
В-третьих, «запомнить» для нейронной сети, если это само не является целью, — это самое плохое, что с ней может случиться. Ее цель — «обобщать».
P.S. Позвольте проиллюстрировать разницу на этом графике (ссылка на статью). Когда сеть не переучена (нижний рисунок), новое наблюдение классифицируется как принадлежащее «зеленой области». Когда сеть переучена (верхний правый рисунок), новое наблюдение не попадает в зеленую область. Тестовое множество помогает нам эмулировать поступление новых данных и не давать сети переучиваться.
Мои утверждения:
1) Нейронная сеть, обученная на «хороших» запросах без тестирующего множества («переученная»), будет на любой запрос (кроме тех, что ей были представлены на обучение) отвечать, что он «плохой». Все потому, что она «запомнила» исходные данные.
2) Нейронная сеть, обученная на «хороших» запросах с тестирующим множеством, будет на «хороший» запрос отвечать, что он «хороший», а на «все остальные», что они «не хорошие». При этом если «плохой» запрос неотличим от «хорошего», то сеть его также будет считать «хорошим». В примере, приведенном выше, если «плохой» запрос будет идти из России, а не из Китая, то сеть его пропустит.
Непонимание возникло потому, что Вы фокусируетесь на «плохих» запросах. А я говорю о «хороших». Есть аналогия из мира электронной почты и борьбы со спамом — «черный» и «белый» списки. Приведенный Вами метод аналогичен «черному», упомянутый мною — «белому».
Давайте для примера упростим задачу. Будем считать, что у нас есть только данные GeoIP (широта и долгота). Аудитория нашего сайта — территория России. После обучения на «хороших» запросах наша сеть с определенной погрешностью определяет запросы с территории России. Начинается DDoS. Большинство запросов с территории России сеть пропускает, а все остальные запросы — блокирует.
При таком обучении тоже идет классификация, но неявная. «Хорошие» запросы противопоставляются «всем остальным возможным».
Что касается суффикса "-ник", то отглагольные существительные для него также более привычно образовывать от прошедшего времени глагола. То есть более правильным было бы «чатильник».
У всех на слуху похожее слово «мобильник», но оно произошло не от глагола, а от словосочетания «мобильный телефон».
Мне так кажется, что носители языка сами со временем выработают нечто энергетически эффективное и семантически четкое.