{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Рома Рыбальченко: заметки с тегом machine learning",
    "_rss_description": "Аналитик-разработчик в Алисе",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/keen.nerevar.com\/tags\/machine-learning\/",
    "feed_url": "https:\/\/keen.nerevar.com\/tags\/machine-learning\/json\/",
    "icon": "https:\/\/keen.nerevar.com\/pictures\/userpic\/userpic@2x.jpg?1471192837",
    "authors": [
        {
            "name": "Неревар",
            "url": "https:\/\/keen.nerevar.com\/",
            "avatar": "https:\/\/keen.nerevar.com\/pictures\/userpic\/userpic@2x.jpg?1471192837"
        }
    ],
    "items": [
        {
            "id": "22",
            "url": "https:\/\/keen.nerevar.com\/all\/tensorflow-and-deep-learning-from-pycon-2016\/",
            "title": "Tensorflow and deep learning from Pycon 2016",
            "content_html": "<p>Самый интересный доклад + воркшоп про создание нейросети на TensorFlow от Martin Gorner из Google с конференции PyCon Russia 2016.<\/p>\n<p>В качестве предметной области был датасет <a href=\"http:\/\/yann.lecun.com\/exdb\/mnist\/\">mnist<\/a> с 50к чёрнобелых изображений цифр от 0 до 9 нарисованных от руки размером 28x28px. На вход нейросетке подаётся пачка картинок из flatten pixel mask размера 28x28=784 значения по каждой картинке, на выходе получаем вероятность класса от 0 до 9, которая сравнивается с реальным значением, функция ошибки — cross entropy.<\/p>\n<p>Для задач классификации в качестве функции активации хорошо подходит softmax — возвращает число от 0 до 1, которое можно интерпретировать как вероятность класса.<\/p>\n<pre>Y = softmax(X * W + b)<\/pre>\n<p>где X — массив картинок, каждая кодируется массивом из 784 значений 1 или 0 по пикселям, W — веса каждого пиксела и b — константа (bias)<br \/>\nЗадача нейронной сети на каждом шаге, на каждой пачке данных, подбирать оптимальные веса для каждого пикселя путём минимизации функции ошибки<\/p>\n<pre>cross-entropy = -sum( Y_ans_i * log(Yi) )<\/pre>\n<p>где Yi — предсказанное значение, Y_ans_i — реальное значение.<\/p>\n<p><img src=\"https:\/\/keen.nerevar.com\/pictures\/MNIST_2016-07-04_23-05-12.png\" height=\"600\"><br \/>\nПри работе с нейросетями — формируешь структуру сети, подаёшь на вход много данных и снимаешь результат. А внутри происходит магия — нейросеть сама каким-то образом выделяет закономерности. Ещё добавить к этому сложную математическую модель оптимизации, получается работа с чёрным ящиком. Поэтому разработчикам очень важно наглядно видеть результат работы. Martin написал замечательную визуализацию процесса обучения сети, где показываются графики точности, ошибки, и самих изображений цифр, на которых тестируется модель.<\/p>\n<p>Базовый вариант одноуровневой нейросети с 10 нейронами выдаёт 92.6% точности. Это очень мало, если учесть, что максимальная точность предсказывания для этой задачи 99.7%. Поэтому нейронку можно и нужно улучшать и оптимизировать. Первое, что можно сделать — это создать глубокую нейросеть — добавить ещё слои. При добавлении слоёв с активацией <a href=\"http:\/\/cs231n.github.io\/neural-networks-1\/\">ReLU<\/a> из 200, 100, 60, 30 нейронов к базовому уровню softmax из 10 нейронов, точность возрастает до 97.2%<\/p>\n<p>Следующий шаг — это регулирование learning rate decay — порога изменения весов W для нахождения минимума функции ошибки. Чем меньше значение порога — тем точнее будут подбираться веса и тем больше итераций и данных нужно, чтобы выровнялась точность предсказаний. With decaying learning rate from 0.003 to 0.0001 decay_speed 2000, 10K iterations, final test accuracy equals 0.9824.<\/p>\n<p><img src=\"https:\/\/keen.nerevar.com\/pictures\/scaled\/Tensorflow_and_deep_learning_-_without_a_PhD_-_Google_Slides_2016-07-04_23-20-05.scaled.png\" height=\"450\"><br \/>\nНаконец, можно использовать свёрточную (convolutional) нейронную сеть для классификации картинок. В обычной нейросети каждый нейрон связан со всеми нейронами предыдущего слоя, и каждая связь имеет свой вес. В свёрточной нейросети в операции свёртки используется небольшая матрица, «окно», которое двигается по всему слою и формирует сигнал активации для нейрона на следующем уровне с соответствующей позицией. Эта матрица (окно, ядро свёртки) построена таким образом, что графически кодирует какой-либо один признак, например, наличие наклонной линии под определенным углом. Тогда следующий слой, получившийся в результате операции свёртки матрицы весов, показывает наличие данной наклонной линии в обрабатываемом слое и её координаты, формируя карту признаков (feature map)<br \/>\nТак, добавив 3 свёрточных слоя (6x6str1 5x5str2 4x4str2) к полносвязному слою relu из 200 нейронов и softmax 10, <a href=\"https:\/\/github.com\/nerevar\/tensorflow-mnist-tutorial\/blob\/master\/mnist_3.0_convolutional.py#L147\">получим точность<\/a> 99.2%<\/p>\n<p>Презентация — <a href=\"http:\/\/goo.gl\/pHeXe7,\">http:\/\/goo.gl\/pHeXe7,<\/a> код демки — <a href=\"https:\/\/github.com\/martin-gorner\/tensorflow-mnist-tutorial\">https:\/\/github.com\/martin-gorner\/tensorflow-mnist-tutorial<\/a><br \/>\nИнтервью на хабре с Мартином <a href=\"https:\/\/habrahabr.ru\/company\/it_people\/blog\/303832\/\">https:\/\/habrahabr.ru\/company\/it_people\/blog\/303832\/<\/a> В нём он рассказывает про <a href=\"http:\/\/tflearn.org\/\">TFlearn<\/a> — высокоуровневая надстройка над TensorFlow с синтаксическим сахаром для создания моделей, которую планируется внедрить в ядро TF, а пока что можно пользоваться отдельным контрибом.<\/p>\n",
            "date_published": "2016-07-05T11:02:51+03:00",
            "date_modified": "2016-07-05T00:14:12+03:00",
            "tags": [
                "machine learning",
                "ml",
                "pycon",
                "python"
            ],
            "_date_published_rfc2822": "Tue, 05 Jul 2016 11:02:51 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "22",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4116,
    "_e2_ua_string": "Aegea 11.2 (v4116)"
}