菜单

入门神经网络

2018年12月31日 - 生物学

下一篇传送门

英文原文,固然也是自我写的
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地图