Invoker
Invoker личный блог
26 июня 2019, 17:30

Про Нейронную Сеть, создаем и развиваемся.

Приветствую вас, любители трейдинга!

Видел на смартлабе посты про Пайтон (Python), читать их было очень интересно, в том числе и про то, как НС торгует на бирже. В настоящее время Пайтон (https://www.python.org/) занимает 3 строчку в рейтинге по языкам программирования (https://www.tiobe.com/tiobe-index//). Сам изучал в детстве бейсик (Basic), потом паскаль (Pascal) и далее посмотрел множество языков программирования, вплоть до ассемблера. Самый тяжелый С++)), а все потому, что у него код пишется сокращенными символами, например «начало» и «конец» программы обозначались фигурными скобками «{ …здесь код… }», а у паскаля «begin» и «end». Согласитесь, проще запомнить слова, чем множество лишних для нас символов, которые хранятся у нас в головном мозге, нейронных клетках. Программировал из любопытства.

Я хочу поделиться с вами, про Нейронную сеть (НС), что меня заставляет двигаться в этом направлении вперед. Простую НС теперь может создать любой желающий, даже ребенок с 6 лет сможет понять суть работы НС и попробовать написать программу. Программировать можно через веб-сайт, например Гугол (Google) сделал потрясающую колабораторию (так он ее называет) для программирования на Пайтон (https://colab.research.google.com/).

Простой код на Пайтон, который обучает НС состоящую из 2 входов и 1 выхода.

import numpy as np

import scipy.special

 

f_activation = lambda x: scipy.special.expit( x )

 

def f_derivative( x ):

  return x * ( 1 — x )

 

ls = 0.1

 

input_layer = np.array( [[0, 0, 1, 1],

                         [0, 1, 0, 1],

                         [1, 1, 1, 1]], dtype='float64' )

 

np.random.seed(1358)

synaptic_weight = 2 * np.random.random( (1, 3) ) — 1

 

output_layer = np.array( [[0, 0, 0, 1]], dtype='float64' )

 

print( f'input_layer\n{ input_layer }\nsynaptic_weight\n{ synaptic_weight }\noutput_layer\n{ output_layer }' )

print( f'--------------------------------------------------------------------' )

 

for i in range( 100000 ):

 

  O_input = np.dot( synaptic_weight, input_layer )

  O_output = f_activation( O_input )

 

  O_error = output_layer — O_output

 

  synaptic_weight += ls * np.dot( O_error * f_derivative( O_output ), np.transpose( input_layer ) )

 

print( f'O_output\n{ O_output }' )

 

Все что сверху, это обучение НС и чтобы проверить, что все работает запускаем эту строчку:

print( f'Output\n{ f_activation(np.dot(np.array([[0, 1, 1]]), synaptic_weight.T)) }' )

НС на основе обучения выводит результат.

Создание такого кода у меня заняло где-то больше 2х недель, множество прочитанных блогов с различных источников по программированию НС. Каждый пишет по своему, код выглядит по-разному. И я написал входной слой (input_layer) с нейроном смещения (bias), все единицы на нижней строчке. Этот массив подается на вход столбцами, например 0, 0, 1 – на входе два ноля и единица это нейрон смещения. 1, 0, 1. Далее на входе подается второй столбец  1 и 0 + нейрон смещения  1.

Статей про НС очень много и они написаны по-разному.

И для развлечения: http://playground.tensorflow.org

Ресурс, для хранения собственного кода и совместная работа над проектами: https://github.com/

Спасибо за внимание!

18 Комментариев
  • Turbo Pascal
    27 июня 2019, 12:12
    Тут основной момент, что сеть должна не только обучаться, но и при недостатке обучения расширяться в ширину и глубину слоев и переобучаться заново. А также, если в процессе обучения часть нейронов не задействуется совсем, они должны исключаться («отмирать»), обратно упрощая сеть.
    Там алгоритм еще тот, аццкий.
    Сеть из трех синапсов отличит только черное от белого, и то не факт.
  • я не знаю докуда там щас дорос C++ но раньше самая жопа начиналась при попытке разобраться в чужих темплейтах… ну и перезагрузка операторов тоже веселая штука...
    Проявляется это всё когда молодые, смышленные, полные энтузиазма прогеры начитавшись умных книжек начинают пробовать писать любую херню понапихав туда по максимуму всякой архитектуры, паттернов и возможностей языка... 
    PS: а потом смотришь на это всё и думаешь — вот и не лень же мне было так заморачиваться!?
    • flextrader
      27 июня 2019, 18:14
      Бабёр-Енот, 
      и перезагрузка операторов
      вабсче-то, это терминологический беспредел зае*… есть перегрузка. и это одна из самых отличных фишек. тем более уж на это сетовать не в век нормальных кодерских мультиязыковых редакторов и уж тем более при наличии давным-давно массы c-ориентированных IDE облегчающих работу с чужим кодом.
      • flextrader, а, ну может быть… я русской терминологией, признаюсь, слабо  владею 
        • flextrader
          27 июня 2019, 20:02
          Бабёр-Енот, overload никогда не нес значения «перезагрузка », угу. поэтому я х.з. причем тут отсылки к
          русской
  • flextrader
    27 июня 2019, 18:21
     всегда ненавидел begin-end (и любил сишные оп.скобки )) ).

    также как и все аналогичные артефакты в vb раздражают. хотя  VBAшка ща очень активно в ходу 
    • flextrader, скобки эти мелкие, незаметные и бесят… а когда видишь begin end, сразу понятно что перед тобой язык с человеческим лицом... 

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн