MXNET:多层神经网络

多层感知机(multilayer perceptron,简称MLP)是最基础的深度学习模型。
多层感知机在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。隐藏层位于输入层和输出层之间。隐藏层中的神经元和输入层中各个输入完全连接,输出层中的神经元和隐藏层中的各个神经元也完全连接。因此,多层感知机中的隐藏层和输出层都是全连接层。

仿射变换

在描述隐藏层的计算之前,我们看看多层感知机输出层是怎么计算的。输出层的输入是隐藏层的输出,通常我们将隐藏层的输出称为隐藏层变量或隐藏变量。

给定一个小批量样本,其批量大小为n,输入个数为x,输出个数为y。假设多层感知机只有一个隐藏层,其中隐藏单元个数为h,隐藏变量\(\boldsymbol{H} \in \mathbb{R}^{n \times h}\)。假设输出层的权重和偏差参数分别为\(\boldsymbol{W}_o \in \mathbb{R}^{h \times y}, \boldsymbol{b}_o \in \mathbb{R}^{1 \times y}\),多层感知机输出
\[\boldsymbol{O} = \boldsymbol{H} \boldsymbol{W}_o + \boldsymbol{b}_o\]

实际上,多层感知机的输出\(\boldsymbol{O}\)是对上一层的输出\(\boldsymbol{H}\)的仿射变换(affine
transformation)。它包括一次通过乘以权重参数的线性变换和一次通过加上偏差参数的平移。

那么,如果隐藏层也只对输入做仿射变换会怎么样呢?设单个样本的特征为\(\boldsymbol{x} \in \mathbb{R}^{1 \times x}\),隐藏层的权重参数和偏差参数分别为\(\boldsymbol{W}_h \in \mathbb{R}^{x \times h}, \boldsymbol{b}_h \in \mathbb{R}^{1 \times h}\)。假设

\[\boldsymbol{h} = \boldsymbol{x} \boldsymbol{W}_h +\boldsymbol{b}_h\]\[\boldsymbol{o} = \boldsymbol{h} \boldsymbol{W}_o + \boldsymbol{b}_o\]

联立两式可得\(\boldsymbol{o} = \boldsymbol{x} \boldsymbol{W}_h \boldsymbol{W}_o + \boldsymbol{b}_h \boldsymbol{W}_o + \boldsymbol{b}_o\):它等价于单层神经网络的输出\(\boldsymbol{o} = \boldsymbol{x} \boldsymbol{W}^\prime + \boldsymbol{b}^\prime\),其中\(\boldsymbol{W}^\prime = \boldsymbol{W}_h \boldsymbol{W}_o, \boldsymbol{b}^\prime = \boldsymbol{b}_h \boldsymbol{W}_o + \boldsymbol{b}_o\)。因此,仅使用仿射变换的隐藏层使多层感知机与前面介绍的单层神经网络没什么区别。

激活函数

由上面的例子可以看出,我们必须在隐藏层中使用其他变换,例如添加非线性变换,这样才能使多层感知机变得有意义。我们将这些非线性变换称为激活函数(activation function)。激活函数能对任意形状的输入按元素操作且不改变输入的形状。

ReLU函数

ReLU(rectified linear unit)函数提供了一个很简单的非线性变换。给定元素x,该函数的输出是\(\text{relu}(x) = \max(x, 0)\),ReLU函数只保留正数元素,并将负数元素清零。

Sigmoid函数

Sigmoid函数可以将元素的值变换到0和1之间:\(\text{sigmoid}(x) = \frac{1}{1 + \exp(-x)}\),我们会在后面“循环神经网络”一章中介绍如何利用sigmoid函数值域在0到1之间这一特性来控制信息在神经网络中的流动。

Tanh函数

Tanh(双曲正切)函数可以将元素的值变换到-1和1之间:\(\text{tanh}(x) = \frac{1 - \exp(-2x)}{1 + \exp(-2x)}\)。当元素值接近0时,tanh函数接近线性变换。值得一提的是,它的形状和sigmoid函数很像,且当元素在实数域上均匀分布时,tanh函数值的均值为0。

from mxnet import ndarray as nd
X = nd.array([[[0,1], [-2,3], [4,-5]], [[6,-7], [8,-9], [10,-11]]])
print X.relu(), X.sigmoid(), X.tanh()

多层感知机

现在,可以给出多层感知机的矢量计算表达式了。

\[\begin{split}\boldsymbol{H} = \phi(\boldsymbol{X} \boldsymbol{W}_h + \boldsymbol{b}_h),\\boldsymbol{O} = \boldsymbol{H} \boldsymbol{W}_o + \boldsymbol{b}_o,\end{split}\]

在分类问题中,我们可以对输出O做Softmax运算,并使用Softmax回归中的交叉熵损失函数。 在回归问题中,我们将输出层的输出个数设为1,并将输出O直接提供给线性回归中使用的平方损失函数。

我们可以添加更多的隐藏层来构造更深的模型。需要指出的是,多层感知机的层数和各隐藏层中隐藏单元个数都是超参数。

随机初始化模型参数

在神经网络中,我们需要随机初始化模型参数。
MXNet的默认随机初始化,我们使用net.initialize(init.Normal(sigma=0.01))令模型net的权重参数采用正态分布的随机初始化方式。如果不指定初始化方法,例如net.initialize(),我们将使用MXNet的默认随机初始化方法。在默认条件下的初始化时,权重参数每个元素随机采样于-0.07到0.07之间的均匀分布,偏差参数全部元素清零。

Xavier随机初始化

还有一种比较常用的随机初始化方法叫做Xavier随机初始化,假设某全连接层的输入个数为:math:a,输出个数为b,Xavier随机初始化将该层权重参数的每个元素随机采样于均匀分布
\[\left(-\sqrt{\frac{6}{a+b}}, \sqrt{\frac{6}{a+b}}\right).\]

它的设计主要考虑到,模型参数初始化后,每层输出的方差不该被该层输入个数所影响,且每层梯度的方差不该被该层输出个数所影响。这两点与我们之后将要介绍的正向传播和反向传播有关。

原文地址:https://www.cnblogs.com/houkai/p/9520916.html

时间: 2024-08-28 13:15:09

MXNET:多层神经网络的相关文章

模式分类 学习笔记 第6章 多层神经网络

6.1引言 线性分类在解决很多问题是取得的最小误差率还显得不够! 一个精确选择的非线性函数,可以得到任意判决边界.但主要的困难是如何选择非线性函数.一个完备的基函数可能得到较好的效果,但可能会有太多的参数需要估计,而训练样本总是有限的! 再或者我们可能有先验知识引导我们选择非线性函数,但如果缺少这些信息,就无法自动选择非线性函数. 多层神经网络是一种在训练线性判别函数的同时学习其非线性程度的方法???决定非线性映射的参数的学习与控制线性判别函数的参数的学习同时进行的??? 多层神经网络基本上的执

ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)

ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节学习地址:http://ufldl.stanfor

2017/7/20 朱兴全教授学术讲座观点与总结第三讲:多层神经网络

一.多层神经网络(为什么可以解决多种问题) 多层神经网络:在输入和输出层上有隐含层,可以克服单层神经网络的限制处理非线性分离问题 多层有更大的区分度,多条线去拟合 第三个图中,每一个方块对应第二个图中神经网络,即有两个隐含层. 二.Feedforward Neural Networks 1.FF NN模型 选择sigmoid函数作为激活函数的原因是其处处可导. 多层神经网络的误差,输出误差(期望输出与真实输出的差).单个样本网络误差(单个样本对应所有输出与期望输出的误差).所有样本的网络误差.

多层神经网络BP算法 原理及推导

首先什么是人工神经网络?简单来说就是将单个感知器作为一个神经网络节点,然后用此类节点组成一个层次网络结构,我们称此网络即为人工神经网络(本人自己的理解).当网络的层次大于等于3层(输入层+隐藏层(大于等于1)+输出层)时,我们称之为多层人工神经网络. 1.神经单元的选择 那么我们应该使用什么样的感知器来作为神经网络节点呢?在上一篇文章我们介绍过感知器算法,但是直接使用的话会存在以下问题: 1)感知器训练法则中的输出 由于sign函数时非连续函数,这使得它不可微,因而不能使用上面的梯度下降算法来最

多层神经网络的总结和理解

前言:今天从早上开始写吴恩达多层神经网络的题目.反复运算,出现一个天坑,一个存储矩阵的字典parameters的W1和b1在传入函数updata_parameters前维数还是(7, 12288), 传进去后变成了(3, 4)导致不能和grads["dW1"]的维数(7, 12288)进行广播出错.调了半天也不知道到底哪里出错了.最后重新写了一遍没有出错. 神经网络训练过程: 1.初始化参数 2.进行前向传播(其中分两部分,一部分是前向传播的计算部分,另一部分是前向传播的激活部分) 3

第5章 实现多层神经网络BP算法

前言 神经网络是一种很特别的解决问题的方法.本书将用最简单易懂的方式与读者一起从最简单开始,一步一步深入了解神经网络的基础算法.本书将尽量避开让人望而生畏的名词和数学概念,通过构造可以运行的Java程序来实践相关算法. 关注微信号"javaresearcher"来获取本书的更多信息. 上一章我们讨论了神经网络的表达能力的数学原理,这一章我们就来实现一个神经网络以及训练算法. 我们今天讨论类似下面的全连接多层单向神经网络: 我们把输入也看作一层,上图中一共有三层.输入和输出层是由问题的输

学习笔记TF011:多层神经网络

线性回归.对数几率回归模型,本质上是单个神经元.计算输入特征加权和.偏置视为每个样本输入特征为1权重,计算特征线性组合.激活(传递)函数 计算输出.线性回归,恒等式(值不变).对数几率回归,sigmoid.输入->权重->求和->传递->输出.softmax分类含C个神经元,每个神经元对应一个输出类别. XOR异或运算,无法通过线性模型解决.sigmoido类型神经元要求数据线性可分.2D数据存在直线,高维数据存在超平面,把不同类别样本分隔. 在神经网络输入和输出之间插入更多神经元

keras做多层神经网络

一. 背景与目的 背景:配置好了theano,弄了gpu, 要学dnn方法. 目的:本篇学习keras基本用法, 学习怎么用keras写mlp,学keras搞文本的基本要点. 二. 准备 工具包: theano.numpy.keras等工具包 数据集: 如果下不来, 可以用迅雷下,弄到~/.keras/datasets/下面即可 代码位置:examples/reuters_mlp.py 三. 代码赏析 '''Trains and evaluate a simple MLP on the Reut

【UFLDL】多层神经网络

原英文教程地址见:http://ufldl.stanford.edu/tutorial/supervised/MultiLayerNeuralNetworks 本文是在学习该教程时记得笔记,供参考.周末的时候利用空闲时间用python实现了一下,但是训练结果总是不对,原因尚未查清楚,如果公式推导有误请指出,谢谢!