菜单

入门神经网络:前馈

2018年11月18日 - 生物学

下同样首传送门

英文原文,虽然也是自身写的
Chinglish,但是以事先在加拿大之一有些村校上学导致中文术语或者会见表达不准。

章与代码都以这,用来骗 欢迎Star GitHub
repo

准备工作

读懂就首文章,需要您发出以下地方的文化

使来下列知识就再度好了

发生其他没有看懂的有些,欢迎留言,信不信教我一半时内秒回。

一个巨简单的神经网络(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)

代码在这儿

参考资料

Thanks for reading. If you find any mistake/typo in this blog, please
don’t hesitate to let me know, you can reach me by email:
jyang7[at]ualberta.ca

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图