文章 "神经网络轻松制作" - 页 3

 
Maxim Dmitrievsky:


什么是 "5 个为什么",4 层又有什么关系?我查了一下,一棵简单的决策树就能回答这个问题。通用近似值是 2 层的 NS,它可以回答任何数量的 "为什么":)其他层主要用于复杂设计中的数据预处理。例如,从大量像素中压缩图像,然后进行识别。


"5个为什么 "是维基百科中 一种确定因果关系的技术。文章举例说明了神经网络的设计本质是如何找到过去价格走势与未来价格走势方向之间的因果关系。

 
Andrey Azatskiy:
只有输入信号也必须在这个区间内。我所说的输入信号指的正是神经元的输入信号,而不是我们正在讨论的函数的输入信号。

理论上,神经元的输入信号可以是任何信号。它的影响通过一个加权系数来校正。如果输入信号太小,但对整体解法有重大影响,则在学习过程中会增加其权重系数。如果信号非常重要,但对结果的影响可以忽略不计,则其权重系数会降至 "0"(神经元之间的通信中断)。

 
Dmitriy Gizlyk:

"5个为什么 "是维基百科 确定因果关系的一种技术。这篇文章举例说明,其本质是一个神经网络,旨在找出过去价格走势与未来价格走势方向之间的因果关系。

我只是不明白问题数量和层数之间的关联。输入是一些属性,每个属性都必须回答(粗略地说)。输出是一个汇总结果。一个隐藏层可能就够了,不一定是 4 个。一般认为,有 2 个隐藏层的 NS 可以近似任何函数。这仅供参考。

 

为了展开话题,我想问一个关于 NS 架构的问题。它取决于什么?

 
Maxim Dmitrievsky:

我只是不明白问题数量和层数之间的关系。输入是一些属性,每个属性都必须回答(大致如此)。输出是一个汇总结果。一个隐藏层可能就够了,不一定是 4 层。一般认为,有 2 个隐藏层的 NS 可以近似任何函数。这仅供参考。

5 个为什么 "技术基于顺序问题,每个问题都回答了前一个问题的原因。例如,我们观察一张图表和一张价格上涨图,然后构建问题(问题的回答抽象地解释了该技术):
1.在哪里交易 - 买入
2.为什么买入?- 因为它是上升趋势
3.为什么是上升趋势?- MA50 正在上升
4.为什么 MA50 上升?- 移位为 1 的 50 根蜡烛 平均收盘价 低于最后 50 根蜡烛的平均收盘价。

等等。
由于问题是有顺序的,并且有因果关系,因此我们创建层来观察这种关系。如果我们只使用 2 层,就会失去因果关系,神经网络会分析多个独立选项,并选择最佳选项。

 
Denis Kirichenko:

为了展开话题,我想问一个关于 NS 架构的问题。它取决于什么?

取决于架构师对流程的理解。本文给出的是最简单的神经网络,并没有考虑卷积和其他架构。

 
Dmitriy Gizlyk:

5 个为什么 "技术建立在连续问题的基础上,每个问题都回答了前一个问题的原因。例如,我们看一张图表和一张价格上涨图表,然后构建问题(抽象地回答问题,以解释该技巧):
1.在哪里交易 - 买入
2.为什么买入?- 因为它是上升趋势
3.为什么是上升趋势?- MA50 正在上升
4.为什么 MA50 上升?- 移位为 1 的 50 根蜡烛 平均收盘价 低于最后 50 根蜡烛的平均收盘价。

等等。
因为问题是有顺序的,而且有因果关系,所以我们按照这种关系创建层。如果我们只使用 2 层,就会失去因果关系,神经网络会分析多个独立选项并选择最佳选项。

我们提出这些问题的顺序并无区别,结果都是一样的。没有必要分层。

 
Dmitriy Gizlyk:

晚上好,彼得。
里面的神经元由两个功能组成:
1.首先,我们计算所有输入信号的总和,并将其加权系数考虑在内。也就是说,我们将神经元每个输入端的值乘以相应的加权系数。然后将得到的乘积值相加。


这样,我们就得到了一个特定的值,并将其输入激活函数的输入端。

2.2. 激活函数将接收到的总和转换为归一化输出信号。这可以是一个简单的逻辑函数,也可以是各种 sigmoid 函数。后者更为常见,因为其状态变化过渡更为平滑。

神经元之间的通信是将一个神经元的输出值直接传输到下一个神经元的输入端。在这种情况下,参照第 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)))

它比你的小五倍,保证能实现你的需求,而且是用 Python 写的,更容易理解。

当然,这篇文章的作者很棒,自己编写 MLP 也很酷:)