Обсуждение статьи "Нейросети - это просто" - страница 3

 
Maxim Dmitrievsky:


что такое "5 почему" и причем здесь 4 слоя? Посмотрел, на этот вопрос ответит простое дерево решений. Универсальным аппроксиматором является НС из 2-х слоев, которая ответит на любое кол-во "почему" :) Остальные слои используются, в основном, для предобработки данных в сложных конструкциях. Например, сжать изображение из большого кол-ва пикселей, а затем распознать его.


"5 почему" - техника для определения причинно-следственной связи Википедия. В статье приведена для примера так, как по существу нейронная сеть призвана найти причинно-следственную связь между прошлыми ценовыми движениями и будущим направлением движение цены.

 
Andrey Azatskiy:
только входной сигнал тоже в данном интервале должен быть. Имею ввиду под входным сигналом - именно входной сигнал в нейрон, а не в обсуждаемую функцию.

Теоретически, входной сигнал в нейрон может быть любой. Его влияние корректируется весовым коэффициентов. Если входной сигнал слишком мал, но оказывает значительное значение на общее решение, то его весовой коэффициент будет увеличен в процессе обучения. Если же сигнал имеет большое значение, но его влияние на результат ничтожно, то его весовой коэффициент будет уменьшен вплоть до "0" (разрыв связи между нейронами). 

 
Dmitriy Gizlyk:

"5 почему" - техника для определения причинно-следственной связи Википедия. В статье приведена для примера так, как по существу нейронная сеть призвана найти причинно-следственную связь между прошлыми ценовыми движениями и будущим направлением движение цены.

Просто не понял какая корреляция между кол-вом вопросов и слоев. На вход подается несколько признаков, на каждый из которых должны ответить (грубо говоря). На выходе суммарный результат. Может быть достаточно одного скрытого слоя, не обязательно 4. Считается, что НС с 2-мя скрытыми слоями может аппроксимировать любую ф-ю. Это так, для справки.

 

И в развитие темы вопрос про архитектуру НС. От чего она зависит?

 
Maxim Dmitrievsky:

Просто не понял какая корреляция между кол-вом вопросов и слоев. На вход подается несколько признаков, на каждый из которых должны ответить (грубо говоря). На выходе суммарный результат. Может быть достаточно одного скрытого слоя, не обязательно 4. Считается, что НС с 2-мя скрытыми слоями может аппроксимировать любую ф-ю. Это так, для справки.

Техника "5 почему" построена на последовательных вопросах, когда каждый вопрос отвечает на причину предыдущего. К примеру, мы смотрим на график и растущий график цены и и строим вопросы (вопросы ответы даны абстрактно для разъяснения техники):
1. Куда торговать?  - Покупать
2. Почему покупать? - Потому-что растущий тренд
3. Почему растущий тренд? - МА50 растет
4. Почему МА50 растет? - средня цена закрытия 50 свечей со сдвигом 1 ниже средней цены закрытия 50 последних свечей.

и т.д.
Т.к. вопросы последовательны и имеют причинно-следственную связь, то создаем слои для соблюдения этой связи. Если мы используем только 2 слоя, то теряется причинно- следственная связь, нейросеть анализирует ряд независимых вариантов и выбирает лучший. 

 
Denis Kirichenko:

И в развитие темы вопрос про архитектуру НС. От чего она зависит?

От понимания процесса архитектором. В статье приведен простейший вариант нейронной сети и не рассматривались сверточные и другие архитектуры.

 
Dmitriy Gizlyk:

Техника "5 почему" построена на последовательных вопросах, когда каждый вопрос отвечает на причину предыдущего. К примеру, мы смотрим на график и растущий график цены и и строим вопросы (вопросы ответы даны абстрактно для разъяснения техники):
1. Куда торговать?  - Покупать
2. Почему покупать? - Потому-что растущий тренд
3. Почему растущий тренд? - МА50 растет
4. Почему МА50 растет? - средня цена закрытия 50 свечей со сдвигом 1 ниже средней цены закрытия 50 последних свечей.

и т.д.
Т.к. вопросы последовательны и имеют причинно-следственную связь, то создаем слои для соблюдения этой связи. Если мы используем только 2 слоя, то теряется причинно- следственная связь, нейросеть анализирует ряд независимых вариантов и выбирает лучший. 

нет разницы в какой последовательности задать эти вопросы, результат на выходе будет одинаковым. Здесь не нужно разделение по слоям.

 
Dmitriy Gizlyk:

Добрый вечер, Петр.
Нейрон внутри состоит из 2-х функций:
1. Сначала вычисляем сумму всех входящих сигналов с учетом их весовых коэффициентов. Т.е. берем значение на каждом входе нейрона и умножаем на соответствующий весовой коэффициент. И складываем значения полученных произведений.


Таким образом получаем некое значение, которое подается на вход функции активации.

2. Функция активации преобразовывает полученную сумму в нормализованный выходной сигнал. Здесь может быть как простая логическая функция, так  и различные сигмовидные функции. Последние получили большее распространение, т.к. имеют более плавный переход изменения состояния.

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

Благодарю. Статья и ссылки помогли мне понять суть предназначения нейросетей - нахождение и обработка инварианта внутри вариативного пространства массива данных, и простейший метод технической реализации, который мне еще предстоит понять окончательно. Но, обьяснения очень доходчивы. 
 
Maxim Dmitrievsky:

нет разницы в какой последовательности задать эти вопросы, результат на выходе будет одинаковым. Здесь не нужно разделение по слоям.

Вопросы приведены условно. Техника применяется для поиска коренных причин события. При этом не всегда сразу видна связь между первым и последним вопросами.
Впрочем, данный пример в статье дан для демонстрации связи подхода к анализу причин и построения архитектуры сети.
 
Реter Konow:
Благодарю. Статья и ссылки помогли мне понять суть предназначения нейросетей - определение и обработка инварианта заложенного в массиве данных, и простейший метод технической реализации, который мне еще предстоит понять окончательно. Но, обьяснения очень доходчивы. 

Если охота разобраться в структуре MLP то ИМХО лучше посмотрите на этот код:

#danila_zaytcev mlp 2018


import random

import math



class mlp:


    class activefunc:

        def __init__(self, func, derive):

            self.func = func

            self.derive = derive


    def __init__(self, structure,  af,  learnRate,  moment,  epohs):

        self.leanRate = learnRate

        self.af = af

        self.moment = moment

        self.epohs = epohs


        self.layerCount = len(structure) - 1

        self.weightCount = [None] * self.layerCount

        self.neuronsCount = [None] * self.layerCount

        self.Out = [None] * self.layerCount

        self.Err = [None] * self.layerCount

        self.Drv = [None] * self.layerCount

        self.Inputs = [None] * self.layerCount

        self.Weigthts = [None] * self.layerCount


        for l in range(self.layerCount):

            nLen = structure[l + 1]

            wLen = structure[l] + 1

            self.weightCount[l] = wLen

            self.neuronsCount[l] = nLen


            self.Out[l] = [0.0] * nLen

            self.Err[l] = [0.0] * nLen

            self.Drv[l] = [0.0] * nLen

            self.Weigthts[l] = [None] * nLen


            for n in range(nLen):

                self.Weigthts[l][n] = [None] * wLen

                for w in range(wLen):

                    self.Weigthts[l][n][w] = (random.random() * 2 - 1) / wLen



    def forward(self,  input):

        for l in range(self.layerCount):

            self.Inputs[l] = input

            for n in range(self.neuronsCount[l]):

                wcount = self.weightCount[l] - 1

                out = 0.0

                for w in range(wcount):

                    out += self.Weigthts[l][n][w] * input[w]


                out += self.Weigthts[l][n][wcount]

                out = self.af.func(out)

                self.Out[l][n] = out

                self.Drv[l][n] = self.af.derive(out)


            input = self.Out[l];



    def backward(self, output):

        last = self.layerCount - 1

        for n in range( self.neuronsCount[last]):

            self.Err[last][n] *= self.moment

            self.Err[last][n] += (output[n] - self.Out[last][n])*self.Drv[last][n] * (1.0 - self.moment)


        for l in range(last - 1, -1,-1):

            for n in range( self.neuronsCount[l]):

                backProp = 0

                for w in range(self.neuronsCount[l + 1]):

                    backProp += self.Weigthts[l + 1][w][n] * self.Err[l + 1][w]


                self.Err[l][n] = backProp * self.Drv[l][n]



    def update(self):

        for l in range(self.layerCount):

            for n in  range(self.neuronsCount[l]):

                G = self.Err[l][n] * self.leanRate

                for w in  range(self.weightCount[l] - 1):

                    self.Weigthts[l][n][w] += self.Inputs[l][w] * G

                self.Weigthts[l][n][self.weightCount[l] - 1] += G



    def learn(self, inputs, outputs):

        for e in  range(self.epohs):

            for i in range(len(inputs)):

                index = random.randint(0, len(inputs) - 1)

                self.forward(inputs[index])

                self.backward(outputs[index])

                self.update()



    def compute(self, vector):

        self.forward(vector)

        return self.Out[self.layerCount - 1]



def test_mlp():


    inputs = [[1.0,1.0],[-1.0,-1.0],[1.0,-1.0],[-1.0,1.0]]

    outputs = [[1.0],[1.0],[-1.0],[-1.0]]


    af = mlp.activefunc(math.tanh, lambda y: 1.0 - y ** 2)

    ml = mlp([2,2,1],af,0.01,0.1,10000)

    ml.learn(inputs,outputs)


    for i in inputs:

        print(str(i) + " = " + str(ml.compute(i)))

Он в пятеро меньше, гарантировано делает то что нужно и на питоне, который намного проще воспринимать.

Но автор статьи молодец конечно, MLP самому написать это круто :)