Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Алгоритмические основы обучения реккурентных не...

Алгоритмические основы обучения реккурентных нейронных сетей

Никита Учителев (Datacentric)

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

9 февраля 2016, Moscow Python Meetup №32

Avatar for Moscow Python Meetup

Moscow Python Meetup

February 09, 2016
Tweet

More Decks by Moscow Python Meetup

Other Decks in Technology

Transcript

  1. Что такое нейронные сети • Метод машинного обучения для распознавания

    образов • Многопараметрическая задача нелинейной оптимизации • Способ решения проблемы эффективного параллелизма • Воплощение философского течения коннекционизма Не нужно их бояться! 2 / 34
  2. Многослойный персепртрон • Множество упорядоченных и связанных между собой объектов

    - нейронов • На слайде - простейший многослойный персептрон Розенблатта • Deep Learning - когда есть Hidden Layer 3 / 34
  3. Активация нейрона • Нейрон является простой функцией от входящего сигнала

    • Результат функции передается далее на следующий слой 4 / 34
  4. Рекуррентные нейронные сети Вектор «памяти» участвует в активации нейрона В

    традиционных сетях входной сигнал и вектор памяти просто суммируются 6 / 34
  5. Рекуррентные нейронные сети Вектор «памяти» участвует в активации нейрона В

    традиционных сетях входной сигнал и вектор памяти просто суммируются Vanishing gradient problem 7 / 34
  6. Long Short-Term Memory Модификация для более гибкой работы с памятью

    Такой нейрон умеет не только запоминать, но и забывать 8 / 34
  7. Memory Cell • Вектор памяти каждый раз поступает на вход,

    преобразуется и затем передается на выход • X - взвешенная сумма входного сигнала и «запомненной» информации с прошлого шага • Веса - что насколько забыть и что нового насколько запомнить 9 / 34
  8. Forget Gate Layer • Сначала определяем, какую часть памяти нужно

    забыть • Выходной сигнал с предыдущего шага конкатенируется с входным сигналом • После чего вычисляется активация для полученного вектора • Результат - множитель для Memory Cell 10 / 34
  9. Input Gate Layer • Далее решаем, какую новую информацию нужно

    запомнить: 1. Сначала выбираем, какие компоненты вектора нужно обновить 2. Затем вычисляем степень того, насколько эти компоненты важны 11 / 34
  10. Memory Cell Recalculation • Пришло время обновить ячейку памяти. •

    На предыдущих шагах было решено что и как делать, осталось только произвести вычисления • Линейная комбинация предыдущей памяти и конкатенированных входных сигналов 12 / 34
  11. Output Gate • В конечном счете вычисляется выходной сигнал •

    Сначала определяем, какую часть входного сигнала будем подавать на выход • Затем пропускаем пропускаем ячейку памяти через tanh, чтобы зажать значения между -1 и 1 • Поэлементно перемножаем два вектора и подаем результат на выход 13 / 34
  12. Backpropagation Метод обратного распространения ошибки • Значения на выходе -

    функции от параметров нейронов • Что должно быть на входе и на выходе - известно (обучение) • Вычисляются частные производные функции ошибки от значений параметров • Составляется градиент • Итеративное перемещение в сторону уменьшения градиента 14 / 34
  13. Библиотеки для Python Python - native-среда для работы с нейронными

    сетями • Theano • Caffe • Deepnet • pylearn2 • PyBrain • keras • Torch (Lua) и еще множество менее известных библиотек 15 / 34
  14. theano • http://deeplearning.net/software/theano/ • Разрабатывается под руководством Yoshua Bengio (Montreal

    Institute for Learning Algorithms) • Генерация и компиляция кода на C • Поддержка CUDA (в том числе cuDNN v.3) • Интеграция с NumPy Библиотека для очень эффективных операций с многомерными массивами, в том числе для расчета производных. 16 / 34
  15. Hello world! >>> from theano import tensor as T >>>

    from theano import function >>> >>> x = T.scalar() >>> y = T.scalar() >>> >>> f = function([x, y], x + y) >>> >>> f(1., 2.) array(3.0) 17 / 34
  16. theano.function function( inputs, # data outputs, # other function of

    data (for ex. cost) mode=None, # compilation mode updates=None, # weights’ update routine givens=None, # specific substitutions no_default_updates=False, # accept_inplace=False, # name=None, # name of function for debug rebuild_strict=True, # some alchemy for "givens" allow_input_downcast=None, # precision properties profile=None, # profiler settings (self.profile) on_unused_input=‘raise’ # errors if unused vars appear ) 18 / 34
  17. Scalar Math >>> from theano import tensor as T >>>

    >>> x = T.scalar() >>> y = T.scalar() >>> z = x + y >>> w = z * x >>> a = T.sqrt(w) >>> b = T.exp(a) >>> c = a ** b >>> d = T.log(c) 19 / 34
  18. Vector Math >>> from theano import tensor as T >>>

    >>> x = T.vector() >>> y = T.vector() >>> # scalar math applied elementwise >>> a = x * y >>> # dot product >>> b = T.dot(x, y) 20 / 34
  19. Matrix Math >>> from theano import tensor as T >>>

    >>> x = T.matrix() >>> y = T.matrix() >>> a = T.vector() >>> # Matrix-matrix product >>> b = T.dot(x, y) >>> # Matrix-vector product >>> c = T.dot(x, a) 21 / 34
  20. Shared Variables >>> from theano import shared >>> x =

    shared(0.) >>> from theano.compat.python2x import OrderedDict >>> updates[x] = x + 1 >>> f = T.function([], updates=updates) >>> f() # updates >>> x.get_value() 1.0 >>> x.set_value(100.) >>> f() # updates >>> x.get_value() 101.0 22 / 34
  21. Multi-Layer Perceptron import numpy import theano import theano.tensor as T

    rng = numpy.random N = 400 # number of samples feats = 784 # dimensionality of features D = ( rng.randn(N, feats), # X rng.randint(size=N, low=0, high=2) # y ) training_steps = 10000 23 / 34
  22. Multi-Layer Perceptron # declare Theano symbolic variables x = T.matrix(“x”)

    y = T.vector(“y”) w_1 = theano.shared(rng.randn(784,300), name=“w1”) b_1 = theano.shared(numpy.zeros((300,)), name=“b1”) w_2 = theano.shared(rng.randn(300), name=“w2”) b_2 = theano.shared(0., name=“b2”) print “Initial model:” print w_1.get_value(), b_1.get_value() print w_2.get_value(), b_2.get_value() 25 / 34
  23. Multi-Layer Perceptron # constructing theano expression graph p_1 = T.sigmoid(

    -T.dot(T.sigmoid(-T.dot(x, w_1)-b_1), w_2)-b_2 ) # target probability = 1 prediction = p_1 > 0.5 # the prediction threshold # cross-entropy loss func xent = -y*T.log(p_1) – (1-y)*T.log(1–p_1) # the cost to minimize cost = xent.mean() + 0.01 * (w**2).sum() gw_1, gb_1, gw_2, gb_2 = T.grad(cost, [w_1, b_1, w_2, b_2]) 26 / 34
  24. Multi-Layer Perceptron # Compile train = theano.function( inputs = [x,

    y], outputs = [prediction, xent] updates = { w_1 : w_1-0.1*gw_1, b_1 : b_1-0.1*gb_1, w_2 : w_2-0.1*gw_2, b_2 : b_2-0.1*gb_2 } ) predict = theano.function(inputs = [x], outputs = prediction) 27 / 34
  25. Multi-Layer Perceptron # Train for i in range(training_steps): pred, err

    = train(D[0], D[1]) print “Final model:” print w_1.get_value(), b_1.get_value() print w_2.get_value(), b_2.get_value() print “target values for D: ”, D[1] print “predictions on D: ”, predict(D[0]) 28 / 34
  26. Особенности Theano + Отлично подходит для серьезных научных исследований +

    Можно построить нейронную сеть любой архитектуры + Прозрачная поддержка последних достижений CUDA + Полномасштабная инфраструктура тестирования - Слишком сложно для начинающих - Символьный код тяжело читается 29 / 34
  27. keras.io Keras is a minimalist, highly modular neural networks library,

    written in Python and capable of running on top of either TensorFlow or Theano. It was developed with a focus on enabling fast experimentation. Being able to go from idea to result with the least possible delay is key to doing good research. 30 / 34
  28. Пример MLP на keras from keras.models import Sequential from keras.layers

    import Dense, Dropout model = Sequential() model.add(Dense(64, input_dim=20, activation='sigmoid')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) model.compile( loss='categorical_crossentropy', optimizer=‘adadelta’ ) history = model.fit(X_train, Y_train, batch_size=32, nb_epoch=1) 31 / 34
  29. Преимущества + Активно разрабатывается и дополняется + Реализованы все основные

    слои и популярные функции потерь + Так же прозрачно работает с GPU + Может использовать как Theano так и Google TensorFlow + Максимально сжатый и легкочитаемый код + Нет необходимости в тестировании + «Из коробки» построение графов нейросетей + Пишет, сколько осталось до конца обучения + LSTM-сеть одной строчкой: model = Sequential().add(LSTM(64)).fit() 32 / 34
  30. Проблемы нейронных сетей • Мало размеченных данных • Нет математических

    обоснований выбора топологий • Высокая вычислительная сложность • Плохой параллелизм на GPU • Высокая стоимость • Малое число хороших специалистов 33 / 34
  31. In God we trust, all others bring data W. Edwards

    Deming Спасибо за внимание! доклад подготовил: Учителев Никита Data-Centric Alliance | www.datacentric.ru Email: [email protected] <— можно слать резюме ;) Skype: uchitelev.nikita LinkedIn: linkedin.com/in/uchitelev