| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 从零实现深度学习框架——神经网络入门 -> 正文阅读 |
|
[人工智能]从零实现深度学习框架——神经网络入门 |
引言
我们上篇文章了解了神经元的概念,本文来学习一下神经网络(Neural Network)的基本知识。 异或问题我们先来看下著名的异或问题,该问题曾导致了神经网络研究的十年低谷。
异或问题(XOR problem):输入两个布尔数值(0或1),当两个数值不同时输出为1,否则输出为0。 如上图,假设输入是x1、x2,输出是y。 在介绍神经网络之前,我们先来了解一下感知机(perceptron),感知机可以类比成一个神经元,但是它没有一个非线性激活函数。 感知机是一种二元分类器(具有权重
w
w
w和偏置
b
b
b),把输入
x
x
x(实数值向量)映射到二元的输出上。输出可以记为0或1,或者说是-1和+1。感知机的计算方法如下: 上图是实现与(a)和或(b)运算的感知机。输入分别是 x 1 , x 2 x_1,x_2 x1?,x2??。上图连线上的数值代表权重或偏置。 比如(a)为 x 1 + x 2 ? 1 x_1 + x_2 -1 x1?+x2??1,输入为 1 , 1 1,1 1,1时,结果为 1 > 0 1 > 0 1>0,所以输出 y = 1 y=1 y=1。 除了与运算(AND) 和 或运算(OR),异或运算也很重要。 但是我们不可能通过一个感知机来实现异或运算。因为感知机是一个线性分类器,对于二维输入 x 1 x_1 x1?和 x 2 x_2 x2?,感知机方程 w 1 x 1 + w 2 x 2 + b = 0 w_1x_1 + w_2x_2 + b =0 w1?x1?+w2?x2?+b=0是一个直线的方程,该直线作为二维空间中的决策边界,其中一侧代表输出为 0 0 0,另一侧代表输出为 1 1 1。 下图显示了可能的逻辑输入(00、01、10和11),以及由AND和OR分类器的一组可能的参数绘制的线。但我们没有办法画出一条之线将XOR的正例(01和10)与负例(00和11)区分开来。我们说XOR不是一个线性可分的函数。 解决方案:神经网络尽管异或函数无法被单个感知机表示,但可以被基于感知机单元的分层网络表示。我们看如何使用两层ReLU单元计算异或问题。 该两层网络中有三个ReLU单元,分别是 h 1 , h 2 h_1,h_2 h1?,h2?和 y 1 y_1 y1?。有向边上的数字代表每个单元的权重 w w w,灰色有向边代表偏置。 假设输入 x = [ 0 , 0 ] x=[0,0] x=[0,0],我们计算 这里用到了ReLU激活函数,所以 h 2 h_2 h2?的输出是 0 0 0,对于其他的输入可以自己验证一下。 本例中我们固定的权重值,但实际上神经网络的权重是通过反向传播算法自动学习的。 下面我就来了解下最常见的神经网络。 前馈神经网络前馈神经网络( Feedforward Neural Networks,FNN)是一个逐层传播的没有循环的多层网络。由于历史原因,多层前馈网络,也被称为多层感知机(multi-layer perceptron,MLP)。但这是一个技术误称,因为现代多层网络中的神经元不是感知机(感知机是纯线性的,但现代网络中的神经元带有非线性激活函数)。 简单(两层)前馈网络有三种节点:输入单元、隐藏单元和输出单元,如下图所示。 输入层 x x x通常代表由多个标量组成的一个向量;神经网络的核心是隐藏层 h h h,由隐藏单元 h i h_i hi?组成,每个隐藏单元都是我们前面了解的神经元,隐藏层对其输入计算加权和并应用一个非线性函数。在标准架构中,每层都是全连接的(每个神经元都连接了每个输入)。 为什么说这是一个两层神经网络,因为我们在描述层数的时候,通常忽略掉输入层。 注意每个隐藏单元都有一个权重参数和一个偏置。我们通过将每个单元 i i i的权重向量和偏差组合成整个层的权重矩阵 W W W和偏置向量 B B B来表示整个隐藏层的参数。权重矩阵 W W W中的每个元素 W j i W_{ji} Wji?表示从第 i i i个输入单元 x i x_i xi?到第 j j j个隐藏单元 h j h_j hj?的连接的权重。 使用一个矩阵 W W W表示整个层的权重的优点是,现在通过简单的矩阵操作,可以非常有效地完成前馈网络的隐层计算。实际上,计算只有三个步骤:将权值矩阵乘以输入向量 x x x,加上偏置向量 b b b,再应用激活函数 g g g(比如Sigmoid、tanh或ReLU等)。 隐藏层的输出,向量
h
h
h,因此可以如下计算(这里假设使用Sigmoid作为激活函数):
W x + b Wx+b Wx+b的结果是一个向量,因此 σ \sigma σ应用到该向量上。 下面我们介绍一些常用的记号,以更好的描述后面的内容。 在本例中,我们称输入层为网络的第 0 0 0层(layer 0), n 0 n_0 n0?表示输入层的输入个数,所以 x x x是维度为 n 0 n_0 n0?的实数向量,或正式一点说 x ∈ R n 0 x \in \Bbb R^{n_0} x∈Rn0?的列向量 [ n 0 × 1 ] [n_0 \times 1] [n0?×1];我们称隐藏层为第 1 1 1层(layer 1),输出层为第 2 2 2层(layer 2);隐藏层的维度(隐藏层中单元个数)是 n 1 n_1 n1?,所以 h ∈ R n 1 h \in \Bbb R^{n_1} h∈Rn1?,同时 b ∈ R n 1 b \in \Bbb R^{n_1} b∈Rn1?(因为每个隐藏单元都有一个偏置);然后权重矩阵 W W W的维度是 W ∈ R n 1 × n 0 W \in \Bbb R^{n_1\times n_0} W∈Rn1?×n0?(结合公式 ( 2 ) (2) (2))。 因此公式 ( 2 ) (2) (2)中的某个输出 h j h_j hj?,可以表示为 h j = σ ( ∑ i = 0 n 0 W j i x i + b j ) h_j = \sigma(\sum_{i=0}^{n_0} W_{ji}x_i + b_j) hj?=σ(∑i=0n0??Wji?xi?+bj?)。 经过隐藏层,我们将维度为 n 0 n_0 n0?的输入向量表示成了维度为 n 1 n_1 n1?的隐藏向量,然后传递给输出层计算最终的输出。输出的维度取决于实际的问题,比如回归问题则为一个实数值(只有一个输出)。但常见的是分类问题。若是二分类,那么输出层的维度就是 2 2 2,即输出单元(输出节点)只有两个;若是多分类,那么输出单元则有多个。 我们来看下输出层发生了什么,输出层也有一个权重矩阵(
U
U
U),(除了输入层没有权重,这也是为什么输入层没有计算层数的原因之一),但有些模型输出层是没有偏置
b
b
b的,所以权重矩阵
U
U
U直接与其输入向量
h
h
h相乘得到中间输出
z
z
z: 注意,这里的 z z z是一个实数向量,通常不是最终的输出,对于分类模型中,我们需要将其转换为一个概率分布。 有一个很方便的函数可以将实数向量归一化(normalizing)为概率分布,该函数就是Softmax。假设给定维度为
d
d
d的向量
z
z
z,Softmax定义为: 我们就可以得到本例中的两层前馈网络,又称为单隐藏层前馈网络,的最终表示: 更常见的记号表示下面我们介绍一些更常见的记号,Andrew Ng也用的这套表示方法。具体来说,使用方括号中的上标来表示层数,从输入层的0开始。 因此, W [ 1 ] W^{[1]} W[1]表示(第一个)隐藏层的权重矩阵, b [ 1 ] b^{[1]} b[1]表示(第一个)隐藏层的偏置向量; n j n_j nj?将表示第 j j j层的单元数; g ( ? ) g(\cdot) g(?)来代表激活函数,中间层往往用ReLU或tanh激活函数,输出层往往是softmax; a [ i ] a^{[i]} a[i]来表示第 i i i层的输出, z [ i ] z^{[i]} z[i]表示 W [ i ] a [ i ? 1 ] + b [ i ] W^{[i]}a^{[i-1]}+b^{[i]} W[i]a[i?1]+b[i];第0层是输入层,所以我们将更一般地将输入 x x x称为 a [ 0 ] a^{[0]} a[0]。 这样我们重新表示上面的单隐藏层前馈网络为: 替换偏置单元记号为了简化网络的描述,我们可以省略显示地描述偏置
b
b
b。为此,我们向每个层添加一个虚拟节点
a
0
a_0
a0?,其值将始终为
1
1
1。因此,输入层
0
0
0层将具有虚拟节点
a
0
[
0
]
=
1
a^{[0]}_0=1
a0[0]?=1,层
1
1
1将具有
a
0
[
1
]
=
1
a^{[1]}_0=1
a0[1]?=1,以此类推。这个虚拟节点仍然具有一个关联的权重,该权重表示偏差值
b
b
b,比如将下面的等式: 从上图左边 ( a ) (a) (a)简化为右边的 ( b ) (b) (b)。 References
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 20:24:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |