Блог им. Invoker

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

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

Видел на смартлабе посты про Пайтон (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/

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

★14
18 комментариев
chizhan,  нейросеть ничто, без алгоритма,  созданного человеком
avatar
chizhan, да, знаю, будет битва между роботами, под руководством человека.
avatar
chizhan,  ваш этот коммент противоречит первому))

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

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

теги блога Invoker

....все тэги



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