<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Рома Рыбальченко: заметки с тегом machine learning</title>
<link>https://keen.nerevar.com/tags/machine-learning/</link>
<description>Аналитик-разработчик в Алисе</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.2 (v4116)</generator>

<itunes:subtitle>Аналитик-разработчик в Алисе</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Tensorflow and deep learning from Pycon 2016</title>
<guid isPermaLink="false">22</guid>
<link>https://keen.nerevar.com/all/tensorflow-and-deep-learning-from-pycon-2016/</link>
<pubDate>Tue, 05 Jul 2016 11:02:51 +0300</pubDate>
<author></author>
<comments>https://keen.nerevar.com/all/tensorflow-and-deep-learning-from-pycon-2016/</comments>
<description>
&lt;p&gt;Самый интересный доклад + воркшоп про создание нейросети на TensorFlow от Martin Gorner из Google с конференции PyCon Russia 2016.&lt;/p&gt;
&lt;p&gt;В качестве предметной области был датасет &lt;a href="http://yann.lecun.com/exdb/mnist/"&gt;mnist&lt;/a&gt; с 50к чёрнобелых изображений цифр от 0 до 9 нарисованных от руки размером 28x28px. На вход нейросетке подаётся пачка картинок из flatten pixel mask размера 28x28=784 значения по каждой картинке, на выходе получаем вероятность класса от 0 до 9, которая сравнивается с реальным значением, функция ошибки — cross entropy.&lt;/p&gt;
&lt;p&gt;Для задач классификации в качестве функции активации хорошо подходит softmax — возвращает число от 0 до 1, которое можно интерпретировать как вероятность класса.&lt;/p&gt;
&lt;pre&gt;Y = softmax(X * W + b)&lt;/pre&gt;
&lt;p&gt;где X — массив картинок, каждая кодируется массивом из 784 значений 1 или 0 по пикселям, W — веса каждого пиксела и b — константа (bias)&lt;br /&gt;
Задача нейронной сети на каждом шаге, на каждой пачке данных, подбирать оптимальные веса для каждого пикселя путём минимизации функции ошибки&lt;/p&gt;
&lt;pre&gt;cross-entropy = -sum( Y_ans_i * log(Yi) )&lt;/pre&gt;
&lt;p&gt;где Yi — предсказанное значение, Y_ans_i — реальное значение.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://keen.nerevar.com/pictures/MNIST_2016-07-04_23-05-12.png" height="600"&gt;&lt;br /&gt;
При работе с нейросетями — формируешь структуру сети, подаёшь на вход много данных и снимаешь результат. А внутри происходит магия — нейросеть сама каким-то образом выделяет закономерности. Ещё добавить к этому сложную математическую модель оптимизации, получается работа с чёрным ящиком. Поэтому разработчикам очень важно наглядно видеть результат работы. Martin написал замечательную визуализацию процесса обучения сети, где показываются графики точности, ошибки, и самих изображений цифр, на которых тестируется модель.&lt;/p&gt;
&lt;p&gt;Базовый вариант одноуровневой нейросети с 10 нейронами выдаёт 92.6% точности. Это очень мало, если учесть, что максимальная точность предсказывания для этой задачи 99.7%. Поэтому нейронку можно и нужно улучшать и оптимизировать. Первое, что можно сделать — это создать глубокую нейросеть — добавить ещё слои. При добавлении слоёв с активацией &lt;a href="http://cs231n.github.io/neural-networks-1/"&gt;ReLU&lt;/a&gt; из 200, 100, 60, 30 нейронов к базовому уровню softmax из 10 нейронов, точность возрастает до 97.2%&lt;/p&gt;
&lt;p&gt;Следующий шаг — это регулирование 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.&lt;/p&gt;
&lt;p&gt;&lt;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"&gt;&lt;br /&gt;
Наконец, можно использовать свёрточную (convolutional) нейронную сеть для классификации картинок. В обычной нейросети каждый нейрон связан со всеми нейронами предыдущего слоя, и каждая связь имеет свой вес. В свёрточной нейросети в операции свёртки используется небольшая матрица, «окно», которое двигается по всему слою и формирует сигнал активации для нейрона на следующем уровне с соответствующей позицией. Эта матрица (окно, ядро свёртки) построена таким образом, что графически кодирует какой-либо один признак, например, наличие наклонной линии под определенным углом. Тогда следующий слой, получившийся в результате операции свёртки матрицы весов, показывает наличие данной наклонной линии в обрабатываемом слое и её координаты, формируя карту признаков (feature map)&lt;br /&gt;
Так, добавив 3 свёрточных слоя (6x6str1 5x5str2 4x4str2) к полносвязному слою relu из 200 нейронов и softmax 10, &lt;a href="https://github.com/nerevar/tensorflow-mnist-tutorial/blob/master/mnist_3.0_convolutional.py#L147"&gt;получим точность&lt;/a&gt; 99.2%&lt;/p&gt;
&lt;p&gt;Презентация — &lt;a href="http://goo.gl/pHeXe7,"&gt;http://goo.gl/pHeXe7,&lt;/a&gt; код демки — &lt;a href="https://github.com/martin-gorner/tensorflow-mnist-tutorial"&gt;https://github.com/martin-gorner/tensorflow-mnist-tutorial&lt;/a&gt;&lt;br /&gt;
Интервью на хабре с Мартином &lt;a href="https://habrahabr.ru/company/it_people/blog/303832/"&gt;https://habrahabr.ru/company/it_people/blog/303832/&lt;/a&gt; В нём он рассказывает про &lt;a href="http://tflearn.org/"&gt;TFlearn&lt;/a&gt; — высокоуровневая надстройка над TensorFlow с синтаксическим сахаром для создания моделей, которую планируется внедрить в ядро TF, а пока что можно пользоваться отдельным контрибом.&lt;/p&gt;
</description>
</item>


</channel>
</rss>