跟我学神经网络1-前向传播
![公众号](https://s1.ax1x.com/2018/12/27/F240DU.jpg)
欢迎关注《汽车软件技术》公众号,回复关键字获取资料。
1. 关键词
神经网络
,激活函数
,多层感知器
,前向传播
2. 导读
本文是《跟我学神经网络》系列文章的第1篇,介绍神经网络的结构和前向传播过程。
《跟我学神经网络》不在大而全,而是给读者一个更感性的认识,特别是一些很难理解的专有名词。当你有兴趣,想要进一步学习,可以参考文末的扩展阅读部分。
3. 神经网络
3.1 来源
神经网络灵感来自于生物大脑,由大量的神经元和突触组成。引入神经网络,旨在解决非线性问题。
![Neuron](https://upload.wikimedia.org/wikipedia/commons/1/10/Blausen_0657_MultipolarNeuron.png)
3.2 组成
![neuron-network](https://s2.ax1x.com/2019/01/06/FHnkSs.png)
上图是一个典型的3层结构神经网络:输入层、隐含层和输出层。每层都有1个或多个神经元构成,神经元之间由边连接。边对应于权重。
- 输入层:4个神经元,其中x0是偏置单元;
- 隐含层:4个神经元,其中a0是偏置单元;
- 输出层:1个神经元。
3.2.1 神经元
![Artificial Neuron](https://insights.sei.cmu.edu/sei_blog/sestilli_deeplearning_artificialneuron3.png)
上图是一个典型的神经元,包含:输入、权重、求和、激活函数、输出。公式如下:
其中:
-
,输出;
-
,激活函数;
-
,输入加权求和;
-
,输入;
-
,权重;
-
,第
个输入;
-
,输入总数。
并非每个神经元都包含全部,见下表。
神经元 | 构成 |
---|---|
偏置单元 | 输出 |
输入层非偏置单元 | 输入、输出 |
隐含层非偏置单元 | 全部 |
输出层 | 全部 |
其中,偏置单元相当于引入的一个常数项,类似于方程的截距( 中的
)。
3.2.2 激活函数
激活函数可以理解为输入加权求和后,到输出的一个阈值。这也是模仿了生物神经系统,神经脉冲传导需要达到一定的电平。比如常用的 sigmoid 激活函数,公式如下:
曲线如下:
![sigmoid](https://s2.ax1x.com/2019/01/06/FHuva8.png)
从图中可以看出,只有当 超过一定值时,输出才会是1。
4. 多层感知器
实际问题中通常需要多层、很多神经元构成的神经网络,比如下图中的4层神经网络。
![MLP](https://s2.ax1x.com/2019/01/06/FHKgJg.png)
常用的图像识别,输入层神经元的数量和图像的像素数等同。
5. 前向传播
在第2个部分介绍了单个神经元的数据传播,那么对于整个网络呢?数据从输入层传递到输出层,这个过程叫做前向传播。以上面的4层网络为例,写成向量形式,前向传播步骤如下:
其中:
-
,输入;
-
,第
层到下一层的权重;
-
,第
层的偏置单元;
-
,第
层输出;
-
,第
层输入加权和;
-
,输入对应的预测值,也就是最终的输出。
神经网络的目的是在已知输入和正确输出数据的情况下,用数据训练模型,得到一组权重参数,使得模型输出和正确输出一致。之后,再利用这个模型,对新的数据进行预测。在前向传播时,很难去求解这组参数,因此引入了反向传播。
下面通过一个例子,进一步熟悉计算过程,所有参数已列在图上。
![example](https://s2.ax1x.com/2019/01/09/FLrYwt.png)
输入:
隐含层偏置0.35,输出层偏置0.60。
输入层到隐含层权重:
隐含层到输出层权重:
可以手动计算,或者运行如下的 Python 代码:
import numpy as np
# 激活函数 sigmoid
def sigmoid(input):
return 1 / (1 + np.exp(-input))
# 层计算
def layer(input, weight, isInputLayer, bias):
output = input
if weight is not None:
output = np.dot(weight, input)
if bias is not None:
output = output + bias
if not isInputLayer:
output = sigmoid(output)
return output
# 输入
x = np.array([0.05, 0.10])
# 输入层偏置单元
x0 = 0.35
# 输入层到隐含层权重
thelta_1 = np.array([[0.15, 0.20],
[0.25, 0.30]])
# 隐含层偏置单元
a_0_2 = 0.6
# 隐含层到输出层权重
thelta_2 = np.array([[0.40, 0.45],
[0.50, 0.55]])
# 输入层
a_1 = layer(x, None, True, None)
print(a_1)
# 隐含层
a_2 = layer(a_1, thelta_1, False, x0)
print(a_2)
# 输出层
a_3 = layer(a_2, thelta_2, False, a_0_2)
print(a_3)
输出结果:
[0.05 0.1 ]
[0.59326999 0.59688438]
[0.75136507 0.77292847]
6. 附录
6.1 中英文对照表
英文 | 中文 | 缩写 | 数学符号 |
---|---|---|---|
Activation Function | 激活函数(激励函数) | - | |
Artificial Neural Network | 人工神经网络 | ANN | |
Bias Unit | 偏置单元(截距单元) | - | |
Edge | 边 | - | |
Forward Propagation | 前向传播 | - | |
Hidden Layer | 隐含层 | - | |
Image Recognition | 图像识别 | - | |
Input Layer | 输入层 | - | |
Multilayer Perceptron | 多层感知器 | MLP | |
Neural Network | 神经网络 | NN | |
Neuron | 神经元 | - | |
Output Layer | 输出层 | - | |
Weight | 权重 | - | 单个值: |
6.2 扩展阅读
- 吴恩达机器学习课程 视频 | 笔记
- 3Blue1Brown-神经网络