美文网首页嵌牛IT观察
入门神经网络:前馈

入门神经网络:前馈

作者: 错错对 | 来源:发表于2017-12-13 11:25 被阅读0次

    姓名:王怀帅  学号:16040410035

    转载自:http://www.jianshu.com/p/35ac2f062fa1=有修改

    【嵌牛导读】:A Deadly Simple NN

    【嵌牛鼻子】:神经网络入门、求导数、矩阵乘法、线性回归、感知机

    【嵌牛提问】:如何快速构建一个单隐层神经网络的前馈(即预测)过程?

    【嵌牛正文】:

    如果你对神经网络(neural network)感兴趣或者关注过相关的文章,那下图中的这个模型想必你不会感觉很陌生。

    一个人工神经网络模型

    不过这个可能对于初学者有点不太友好?那看看下面这个简化版的

    一个无隐层的神经网络

    图里的这些东西,咱们一个一个的捋一遍。每个蓝色的圆代表一个神经元(neuron)。每个方块代表一个运算,比如+代表求和。上图中最左边的三个神经元组成了输入层(input layer),包含一个h的神经元组成了输出层(output layer),并且这一层只有这一个神经元。

    输出层神经元的输入值

    对于生物学意义上的神经元来说,通常存在一个阈值(threshold)来使其达到兴奋的状态,也就是被激活。在我们所讨论的神经网络中,我们的神经元将会通过输入值和激活函数(activation function)计算一个输出值。激活函数最值得称赞的一点就是它可以是任何类型的函数,包括但不限于跃阶函数,多项式函数或者 sigmoid 函数。h是输出神经元的输入值,结合激活函数,输出神经元会输出f(h)计算的结果y,也就是整个神经网络的输出值。

    如果你选择f(h) = h作为你的激活函数,那么你的神经网络输出结果将会是下图中的这个公式,这里y = f(h)

    神经网络的输出

    如果你觉得这看起来是一个线性回归的模型,那就对了。如果你的激活函数是连续可导的,那么(通常情况下)你就可以使用一个叫做梯度下降(gradient descent)的方法来训练你的网络。不过这理解起来要稍微麻烦一点,在我们深入到训练的步骤之前,我们先来编写一个很简单的程序来了解神经网络作出预测的过程。我们将使用 sigmoid 函数作为激活函数, Python 作为编程语言。预测的这个过程是一种前馈(feedforward)的计算,仅仅有这一部分的神经网络是不能学习的(例如,通过反向传播(backpropagation)),但我们稍后再关注训练学习的部分。

    Sigmoid 函数

    import numpy as np

    def sigmoid(x):

    # sigmoid function

    return 1/(1 + np.exp(-x))

    inputs = np.array([0.7, -0.3])

    weights = np.array([0.1, 0.8])

    bias = -0.1

    # calculate the output

    output = sigmoid(np.dot(weights, inputs) + bias)

    print('Output:')

    print(output)

    第一个单隐层神经网络(Your First 2-Layer NN)

    注:单隐层,即为包括一个隐层,一个输出层的神经网络,输入层和输出层因为是必须的,所以不计数。

    现在你已经基本知道了一个神经网络是怎么计算预测结果的。在现实生活中,我们面临的预测问题往往十分复杂,这样简单的网络结构可能远远不够。这里我们要引入一个新的概念,隐层(hidden layer)

    一个拥有三个输入层神经元,两个隐层神经元和一个输出层神经元的神经网络

    在第一部分那个简单的网络模型中,我们的权重(weight)是一个向量。但是对于多数神经网络来说,其实权重将会是一个如下图一样的矩阵。

    三个输入层神经元和两个隐层神经元的权重矩阵

    结合第一部分的理解和上面单隐层神经网的模型,你也许已经知道怎么通过这个模型计算h1的具体数值了。我们给出一个简单的公式定义

    计算隐层神经元输入值的公式

    对于我们所关注的这个单隐层模型来说,它是下面这样的

    计算隐层输入值的矩阵乘法

    注意!!:上图中的权重下角标已经更改为矩阵的表达方式,并不是和单隐层神经网络图中的下角标所对应的。因为在矩阵的表达方法中,是用行/列的顺序来标注的。所以如果用示意图中的方法标注的话,会造成一些误会。

    用先前神经网络模型图中的下角标所标注的矩阵

    记住,上图中的这个计算过程使用的并非是矩阵使用的角标,但这个和我们上面单隐层神经网络的示意图中的标注是一致的。

    结合上面所学的知识,我们可以快速构建一个单隐层神经网络的前馈(即预测)过程了。我们仍然使用 sigmoid 函数作为我们的激活函数(并且在之后很长时间都会用这个函数)。

    待办事项:

    计算隐层的输入值

    计算隐层的输出值

    计算输出层的输出值

    计算输出层的输出值

    import numpy as np

    def sigmoid(x):

    # sigmoid function

    return 1/(1+np.exp(-x))

    # 神经网络各层神经元数量

    N_input = 3

    N_hidden = 2

    N_output = 1

    np.random.seed(42)

    # Make some fake data

    X = np.random.randn(4)

    # 生成输入层到隐层/隐层到输出层权重

    weights_in_hidden = np.random.normal(0, scale=0.1, size=(N_input, N_hidden))

    weights_hidden_out = np.random.normal(0, scale=0.1, size=(N_hidden, N_output))

    # 计算隐层的输入值/输出值

    hidden_layer_in = np.dot(X, weights_in_hidden)

    hidden_layer_out = sigmoid(hidden_layer_in)

    print('Hidden-layer Output:')

    print(hidden_layer_out)

    # 计算输出层的输入值/输出值

    output_layer_in = np.dot(hidden_layer_out, weights_hidden_out)

    output_layer_out = sigmoid(output_layer_in)

    print('Output-layer Output:')

    print(output_layer_out)

    相关文章

      网友评论

        本文标题:入门神经网络:前馈

        本文链接:https://www.haomeiwen.com/subject/qvraixtx.html