入门神经网络:前馈

生一样首传送门

英文原稿,虽然为是本身形容的
Chinglish,但是以前面以加拿大某个有些村校上学导致中文术语或者会见发表不准。

文章和代码都以此时,用来骗 欢迎Star GitHub
repo

未雨绸缪干活

读懂就篇稿子,需要而生出以下方面的文化

  • 何以求导数
  • 主干的矩阵乘法

假若有下列知识就再次好了

  • 明一些机上之文化,比如线性回归
  • 亮什么是 感知机(perceptron)

产生其它没有看懂的一对,欢迎留言,信不信仰我一半小时外秒回。

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

代码在此刻

参考资料

  • All formulas are generated by
    HostMath
  • Some figures are taken from the Udacity deep learning course
  • 【模式识别】多重叠感知器
    MLP
  • CS224d:
    TensorFlow
    Tutorial
  • CS231n Winter 2016 Lecture 4 Backpropagation, Neural
    Networks

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

相关文章