Блог им. ch5oh

Блеск и нищета ИСКУСТВЕННЫХ нейронных сетей

    • 20 февраля 2020, 20:00
    • |
    • ch5oh
  • Еще

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

  • x==4 тогда  y==40
  • x==61 тогда  y==80
  • x==117 тогда  y==120

Сеть или дерево должна вычислить значение этой функции для аргумента   x==97853

 

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

 

Если технологии ML не могут дать адекватного ответа на этот вопрос, то могут ли они в принципе быть полезны в торговле?

 

UPDATE 1: За прошедшие несколько часов 2 человека однозначно продемонстрировали способность восстановить вид искомой функции. Что подтверждает простоту озвученной задачки.


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

 

Что же касается основного вопроса данной заметки, то уважаемый ves2010  предлагает считать сетки и ML в целом полезными, ЕСЛИ предварительно грамотно декомпозировать задачу и выделить им ровно тот участок работы, с которым они скорее всего смогут справиться.

 

UPDATE 2: функция следующая.

Посчитать количество цифр в десятичной записи числа и умножить на 40.

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

 

★3
76 комментариев
идея в том, 
счас граль спалю по пьяни… потом минут через 10 удолю нах

avatar
ves2010, Пральна.

Называется это так:
Декомпозиция -> Оптимизация частей -> Синтез

На выходе получается Грааль   

avatar
_sg_, что является целевой функцией всей системы примерно понятно. А что является целевой функцией для каждой отдельной части?
avatar
_sg_, идея в том, что изначально должна быть рабочая архитектура… вообще тема ботостроения — решенный и закрытый вопрос… есть овердокуя разделов математики на тему… кого то этому учили… а кому то приходится изобретать велосипед 
avatar
ves2010, что это за «разделы математики» такие полезные? АСУ?
avatar

ves2010, наверное, что-то не догоняю.

 

Вроде бы проще заставить нейронку строить весь дом (миллиард домов) и только вешать ярлыки «нравится/ерунда», чем объяснить ей почему один «порог внутри бота» хороший, а другой — «плохой».

 

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

avatar
ch5oh, все решает ахитектура… т.е бот это не творожок однородный… у него части есть

avatar
ну, конечно, тебя(меня), тупого, обыгрывает нейросеть, а не ты сам себя на кукан сажаешь.
avatar
ничего не понял, но было очень интересно 
avatar

kot_vezdehot, скажите, Вы не родственник случайно Kot_Begemot ? =)

avatar

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

 

Один человек уже написал ответ (мне в личку). Так что здесь нет ничего сверхъестественного. Даже стесняюсь приглашать к разговору местных математиков. Для них это не задача вообще.

 

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

 

ПС Вот тут, кстати, даже плач Ярославны об этом имеется. (Осторожно: много букв)

https://habr.com/ru/post/488568/

avatar
здесь нет ничего сверхъестественного

ch5oh, ничего сверхъестественного для человека, которого натаскивали на схожих «задачах» (даже не клетчатой бумажке), а  продвинуто обученный ухватит суть мгновенно. Для рынка же нужно сначала самостоятельно поставить задачу, как кто-то здесь уже однажды писал, и лишь потом искать подходы к решению.
Для второго этапа несколько подрихтованные нейросетки вполне даже годятся.
avatar

Eugene Logunov, > "и оно вам вытащит факторы, отвечающие за сдвиг/наклон/кривизну улыбок."

Если эти факторы действительно содержатся в цене. А если это экзогенные факторы? Типа твитов или новых санкций? Или цены на нефть?

 

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

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

А по вашим точкам можно построить бесконечное количество функций, с разными вариантами ответа.
avatar
Евгений, хм. Для «дебилов» очень неплохой алгоритм действий «продавать хай, покупать лоу».

Осталось определиться с тем, где нам взять информацию «сейчас хай, пора шортить» или «сейчас лоу, пора покупать». У Вас есть такой классификатор?
avatar
ch5oh, для этого нужно иметь 2 глаза и график
avatar
Евгений, очевидно, Вы относите себя к этой категории людей. Мои поздравления.
avatar

Eugene Logunov, есть нюанс. Иногда мы бегаем за нефтью, а иногда нефть бегает за нами. Полагаю, что в условиях переменной лаговости статистические модели поиска причинности загрустят.

 

Хотя не щупал их серьёзно. Пробельчик в исследованиях… =/

avatar
Дайте ответ уже!
avatar
Никак. Ни сети, ни ML не занимаются экстраполяцией.
avatar
Kot_Begemot, Ваше высказывание создаёт у меня когнитивный диссонанс. Ровно это нам обещано индустрией МЛ: способность восстановить ЛЮБУЮ функцию  y=f(x)  по достаточно большой обучающей выборке пар (x; y). Здесь под x понимается многомерный вектор любой большой размерности.
avatar
ch5oh, что вас удивляет, если я только подтвердил ваши слова, высказанные в основном тексте? 
avatar
Kot_Begemot, Вы написали, что «сети не занимаются экстраполяцией».

Но везде и всюду написано, что именно этим они и занимаются. Вся цель обучения нейронки состоит в том, чтобы она получила способность давать «правильные» ответы (то есть правильные y) в том числе в ситуации, когда в неё пихают незнакомый «невиданный ранее» вектор x.
avatar
ch5oh, везде написано что сеть восстанавливает регрессию f(x) на интервале данных, но нигде не написано, что она, при этом, ещё и занимается экстраполяцией.

Нейронщики, чтобы научить сеть экстраполировать, обычно делают предположение о некотором виде масштабируемости данных и перед отправкой вектора x в сеть приводят его к некоторому «нормированному» виду x', чтобы он приближённо напоминал те вектора, на которых сеть обучалась. Без этого — никуда.
avatar

Kot_Begemot, После обучения сети в неё можно подпихивать любые данные. Например, картинки незнакомых котиков или новые рукописные цифры, которые мы сами только что нарисовали. Это и есть «экстраполяция» в моём понимании. Вы же не можете объявить картинку сфинкса «аутлайером» и просто кинуть OutOfRangeException. Или сказать, что Сетке «не нравится» белый персидский кот на белом фоне.

avatar
ch5oh, если считать, что нейронка это некоторый «чёрный ящик», то её вход, конечно, можно засорять любым мусором — и так сойдёт!

(Будет настроение, после клиринга отпишу подробнее)
avatar
y=200? Вся проблема в начале., но это еще полбеды — есть еще и скрытые процессы  могут включиться, а могут и нет(история до и после не важно). тип твитов президента сША.
avatar
Тут вроде путаница имеется. Ml применяется не когда мало данных и явная зависимость, а когда много данных и неявная зависимость. Вопрос эффективности ml давно не стоит. Это все равно что сомневаться в эволюции или в округлости земли — можно понадувать щеки, но какой смысл.
avatar

ПBМ, в этой задаче можно дать дофига данных. Но машина всё равно так и будет лажать на out-of-sample.

ЕСЛИ хитропопый датасайнтист не разработает для неё процедуру предварительной подготовки данных.

 

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

 

Кстати, блестящая демонстрация этого тезиса буквально недавно попадалась. Сеть научили опознавать животных по фоткам. 95% точность или даже больше. Теперь берем фотографию белки. Сеть говорит: "Белка". Вносим на картинку исчезающие изменения, которые человеческий глаз даже еле замечает. Ну, там чуть размазалось, тут слегка зарябило. Ерунда. Сеть говорит: "Золотая рыбка". И где вся магия МЛ???

avatar
ch5oh, у людей тоже есть баги и много

avatar
ch5oh, именно так. Без хитрожопого оператора вся система превращается в груду мусора.
avatar
 Тут можно задачку попробовать решить случайными деревьями, примерно как человек это делает — генерация случайных формул и их отсеивание. Но это не машин лернинг как я его понимаю, хотя почему бы и нет назвать его так.
avatar

ПBМ, вроде, деревья решений традиционно считают частью МЛ? =) Ну, типа, что машина сама генерирует цепочку условий, которые надо проверить и по которым надо пройти, чтобы получить ответ.

 

А что касается «мало данных и неявная зависимость»… Ну, вроде, сетки и на мизерные выборки в 150 точек с бешеной и крайне яркой сезонностью ставят. Конечно, это скорее «фо фан» упражнения, но всё же...

avatar
ch5oh, ну вот набросал из того что было..
результат не совсем верный (что-то там не так считается), но у нас же тупая машина, ей простительно

( ( 4 + 4 ) / 2 + 4 / 5 ) + 35 = 40.0: 40

( ( 61 + 4 ) / 2 + 61 / 5 ) + 35 = 79.9: 80 

( ( 117 + 4 ) / 2 + 117 / 5 ) + 35 = 119.10000000000001: 120

просто поздно уже, да и силы уже не те в пятницу :)

считает криво… где-то ошибка у меня, но близко.

и да, я понимаю, что в задаче целочисленная арифметика

avatar

ПBМ, кстати, это же Вы подогнали дерево под предъявленные данные.

А сколько это дерево насчитает на x==97853 ?

( ( 97853 + 4 ) / 2 + 97853 / 5 ) + 35 =
= 48928,5 + 19570,6 + 35 =
68534,1

Правильно понял?
А люди говорят "200" должен быть ответ.

avatar
ch5oh, сдаюсь ;)
avatar
Философский подтекст состоит в том, что человек в состоянии определить вид этой функции совершенно достоверно и получить нулевую ошибку на валидационной выборке любого размера и сложности.

Ну для MLя просто мало данных. Если вы дадите ей много данных (хотя бы значения для x от 1 до 10^6, например) — ML тоже может научиться вычислять значения как надо. Опять же, нужен человек, который поможет со структурой задачи — т.е. подскажет, что y кратно 40 только. А совсем без человека-подсказчика на этапе обучения ML и не работает, это вам любой нормальный спец в этом области расскажет.
avatar

MadQuant, буквально двумя комментариями выше сокрушался на этот счет:

smart-lab.ru/blog/595697.php#comment10687822

 

Может, МЛ вообще не работает? Или работает совсем не так, как нам его преподносят с восторгом в голосе и пеной у рта? Нам же что говорят проповедники: "Готовишь данные на входе, показываешь данные на выходе. Дальше машина долго гоняет электрончики из угла в угол — и вуаля." Причем проповедники же не уточняют, насколько тщательно готовился набор картинок для MNIST и сколько там предварительных нормировок было сделано. И что если взять с потолка другую картинку как бы тоже рукописной цифры, то с большой вероятностью сетка облажается. Точнее, не будет там никаких «99% на тестовой выборке».

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

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

В ML магии нет, инжиниринг фич никто не отменял. Чтобы обучить полезную модель, надо очень внимательно подумать какие ей показывать фичи и ещё что немаловажно — какие таргеты.

Тогда всё начинает сходиться туда куда нужно, но это нифига не само собой происходит.
Пафос Респектыч, получается замкнутый круг. Чтобы решить задачу нужен человек, который её фактически решит (ака «правильно подготовит фичи»). Но нам-то наоборот обещают, что Сети будут сами строить граф вычислений в том числе в тех случаях, когда человек не может разобраться в проблеме и «подготовить фичи».
avatar
ch5oh, не знаю кто вам такое обещает, наверное он хочет вам что-то продать.

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

Пафос Респектыч, так никто ж не знает априорно есть зависимость или нет. Поэтому берут таблицу на 200 столбцов со всеми мыслимыми фичами — и вперед.

 

А «обещает» — индустрия МЛ. Проповедники сингулярного будущего.

avatar
ch5oh, всех мыслимых фич — это будет 200000 столбцов. Чтобы получилось 200 столбцов полезных фич уже нужен фичё инжиниринг.

Так где такое обещают-то, пруфы есть? Видосик там или статейка с фамилией? А то я сам как-то не встречал.

Пафос Респектыч, 

Общая постановка задачи обучения по прецедентам
Имеется множество объектов (ситуаций) и множество возможных ответов (откликов, реакций). Существует некоторая зависимость между ответами и объектами, но она неизвестна. Известна только конечная совокупность прецедентов — пар «объект, ответ», называемая обучающей выборкой. На основе этих данных требуется восстановить неявную зависимость, то есть построить алгоритм, способный для любого возможного входного объекта выдать достаточно точный классифицирующий ответ. Эта зависимость не обязательно выражается аналитически, и здесь нейросети реализуют принцип эмпирически формируемого решения. Важной особенностью при этом является способность обучаемой системы к обобщению, то есть к адекватному отклику на данные, выходящие за пределы имеющейся обучающей выборки.


Классические задачи, решаемые с помощью машинного обучения


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


Источник:

Машинное обучение

 

Видосики, ага. «Решение всех проблем человечества — квантовый МЛ». Как ещё новых адептов привлечь? Только наобещать золотые горы.

 

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

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

А дальше надо в зависимости от реальной прикладной задачи выбирать подходящий метод, и дальше длинный список. По идее это всё надо знать хотя бы поверхностно что для чего. Универсальной методы нет (((
Пафос Респектыч, да я не против «оговорок». Меня просто удивляет, что инет переполнен материалами на тему «распознаем чиселку» или «отличим сволочь от мерзавца по фото», но при этом провал в области time-series forecasting. Если, конечно, не принимать во внимание наивняк, начинающийся со слов «скачаем днёвки гугла с яхуфинанс и засунем их в сетку из трёх полносвязных слоёв».
avatar
ch5oh, ну не всякий тайм сериес легко зафорекастить. Рынки трудно, потому что шума много а данных мало, нестационарность опять же.

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

Вообще рынки предсказывать это такая довольно нишевая задача для кучки упоротых, ей не так много народа занимается как может показаться, а грамотного так и того меньше.
ch5oh, для простых задач (типа распознавания цифр или лиц) 99% там, безусловно, есть. Это реально несложно. Вот с прогнозированием временных рядов — в особенности цен — проблемы, именно потому что данные остационарить сложно.
avatar
MadQuant, это «реально несложно», если сначла разработать методику стандартизации картинок, правильно? Чтобы лицо было определенного относительного размера, в определенном положении при определенном освещении. В принципе, можно ещё сразу вычислить стандартные характеристики типа «расстояния между зрачками» и ключевые метрики лицевой геометрии. Тогда сетке вообще думать не нужно будет насколько понимаю.
avatar
С точки зрения компьютера, надо по нескольким точкам угадать функцию
f(x) = 40*ceil(log10(x))

Таких чудес не бывает )))
Пафос Респектыч, а люди угадывают.
Может, действительно кто-то и теханализ умеет делать?.. =)
avatar
ch5oh, ещё раз, люди угадают если задачу понятно записать. Если же например переписать числа в восьмеричной системе счисления и не сказать об этом — то не угадает никто.

То есть фича о количестве цифр может и неявно, но присутствует в формулировке задачи, а компьютеру её взять будет неоткуда.

Как вариант — нужно много точек данных, тогда он может сможет догадаться, но засада в том что на том же рынке много данных взять неоткуда. Поэтому возвращаемся к важности фиче инжиниринга.

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

UPDATE 2: функция следующая.

Посчитать количество цифр в десятичной записи числа и умножить на 40.


А откуда следует, что функция именно такая? Их бесконечное количество.
Чем эта лучше других?
Вот машинное обучение по заданным критериям и отвечает на последний вопрос.
avatar
MS, из неявных ограничений на сложность функции в мозгу автора задачи, конечно же это следует. Так-то и параболу можно провести и любую другую степенную функцию, но они отметаются каким-то хитрым критерием оптимизации ))

MS, будем считать, что был установлен телепатический контакт между мной и (минимум) двумя абонентами. Я задумал эту функцию и привел 3 точки для примера. А люди мои мысли прочитали.

 

На рынке тоже самое. «Рынок» задумывает функцию, а мы её угадываем явно или неявно. Кто хорошо угадывает — тот молодец живет припеваючи.

avatar
ch5oh, у вас фора перед ИИ. вы и те двое других решали много (несколько) похожих задач и решили и эту тоже.
а ИИ для теста вы берёте нулёвую, которая такую ещё никогда не видела.

люди ведь тоже много косячат. 
avatar

ПBМ, не спорю, что «люди много косячат».

Зато машина имеет передо мной колоссальное преимущество: объём памяти, скорость и безошибочность вычислений.

avatar
MS, Это довольное просто если знаешь такие понятия как характеристика и мантисса числа. Да и что такое линеаризация.
avatar
Jkrsss, а если знаешь что-то другое, то и решение станет другим? Забавно.
avatar
MS, Нет. истина есть  истина. Если истина не истина то это противоречие. Между истиной и противоречией ничего нет. Забавно что это понимает только элита.
avatar
Jkrsss, у Вас мышление своеобразное. Выше написано, что нет одной истины.
avatar
блин, почитал что за формула...
ну конечно мой прототип не мог этого сделать.
потому что __Я__ предусмотрел в нём только операции 

final Operator[] allOps = {add, sub, mul, div, pow};

если туда добавить функцию numberCount и определить её как количество цифр, то дерево построится с полпинка

говорит ли это что-то плохое о самом подходе или «нереальности обучить»?
ни в малейшей степени.

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

avatar
ПBМ, это ещё раз говорит о том, что так называемый «машин лёрнинг» и «искуственный интеллект» пока что не более чем модный хайп. По сути, Вы просто ещё раз сказали старый тезис, известный про нейронки уже лет 10: "Чтобы нейронка начала решать задачу, сначала задачу должен решить человек".


Но если человек уже решил задачу прогнозирования рынка (путем придумывания «правильных фич»), то дальше ему уже и нейронка особо не нужна. Можно использовать классические методы.
avatar
ch5oh, про не особо нужна — см выше пример про стиралку и посудомойку.
если мало — возьмите автобус или авто.
человек умеет ходить. за кой чёрт ему авто? он итак дойдёт.
avatar

ПBМ, давайте ближе к нашей теме.


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

 

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

avatar
ch5oh, 
Если человек стопудово знает, какие фичи вляют на клоуз следующего бара 
это мягко говоря слишком сильное предположение
avatar

ПBМ, в этом топике Вы не первый, кто упирает на то, что «без правильных фич ML — хлам». Но что есть «правильная фича»? По определению, это некий ряд данных, который действительно оказывает влияние на прогнозируемую величину (на клоуз следующего бара).

 

Получается, мы ходим по кругу: без «правильных фич» МЛ — хлам, а с «правильными фичами» он нам как бы и не нужен уже.

avatar

ch5oh, я про фичи не говорил. 
это скорее — список разрешенных операций.
грубо говоря вот есть программа которая должна научиться играть в шахматы, но вы при программировании «забываете» ей сказать что ферзь может ходить по диагоналям.
а потом хохочете что она косячит в элементарных вещах.

нужен, не нужен, это так себе спор, вкусовщина же.

вашу позицию можно переформулировать (что вы уже сами сделали чуть выше) — если можно обойтись без ML — без него надо/можно/стоит обойтись. понятно, что с этим утверждением спорить сложно и не нужно.

как я понимаю, человеческое знание работает таким образом, что не всегда всё кристально ясно и понятно. даже людям не всегда «хватает фич».
и такое в последние годы уже не только в новых науках типа экономики, но и в физике и даже в математике (см Синъити Мотидзуки)

может и придёт тот день, когда всё станет 42. но пока до него далеко вроде бы.

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

X=3; Y=3;
X=13; Y=65;
X=511; Y=487;
X=12345; Y=??? 

avatar

ПBМ, Ваша программа прекрасна, но это не та функция, которая была изначально задумана. Хотите верьте, хотите нет. «Правильную» функцию написал в конце топика в UPDATE2.

 

С уважением,

avatar
ch5oh, я может быть не понятно написал, виноват.
вашу функцию я прочёл. и даже комментировал по ней, начиная в 13:03 (вы мне отвечали).

я поясню ещё две детали:
1. я сделал _другую_ функцию, другую задачу. на основе «фич» из вашей. т.е. все фичи известны: +, -, *, /, pow, число_цифр. 
осталось мелочь — показать что программный поиск не нужен.

2. ну если честно, тут большая путаница, что есть машин лёрнинг, а что нет. если считать что всё что накапливает состояние в процессе работы методом проб и ошибок = машин лёрнинг, то моя программа — именно лёрнинг. и она одинаково легко решает и вашу оригинальную задачу. и задачу которую я придумал.

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

Eugene Logunov, больше всего смущает переход от 11 к 13. Без него это просто кусочно-линейная функция.

 

ПС Впечатляет, что Вы в 4 часа ночи размышляете над такими вопросами. =)

avatar

теги блога ch5oh

....все тэги



UPDONW
Новый дизайн