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}\)的仿射变换(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{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()
多层感知机
现在,可以给出多层感知机的矢量计算表达式了。
\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随机初始化将该层权重参数的每个元素随机采样于均匀分布
\]
它的设计主要考虑到,模型参数初始化后,每层输出的方差不该被该层输入个数所影响,且每层梯度的方差不该被该层输出个数所影响。这两点与我们之后将要介绍的正向传播和反向传播有关。
MXNET:多层神经网络的更多相关文章
- 多层神经网络BP算法 原理及推导
首先什么是人工神经网络?简单来说就是将单个感知器作为一个神经网络节点,然后用此类节点组成一个层次网络结构,我们称此网络即为人工神经网络(本人自己的理解).当网络的层次大于等于3层(输入层+隐藏层(大于 ...
- TensorFlow 训练MNIST数据集(2)—— 多层神经网络
在我的上一篇随笔中,采用了单层神经网络来对MNIST进行训练,在测试集中只有约90%的正确率.这次换一种神经网络(多层神经网络)来进行训练和测试. 1.获取MNIST数据 MNIST数据集只要一行代码 ...
- 用Tensorflow实现多层神经网络
用Tensorflow实现多层神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Tensorflow机器学习实战指南 源代码请点击下方链接欢迎加星 ReLU激活函数/L1范数 ...
- Spark2.0机器学习系列之7: MLPC(多层神经网络)
Spark2.0 MLPC(多层神经网络分类器)算法概述 MultilayerPerceptronClassifier(MLPC)这是一个基于前馈神经网络的分类器,它是一种在输入层与输出层之间含有一层 ...
- ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)
ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...
- MLP(多层神经网络)介绍
写在前面的 接触神经网络(ANN)的时间很长了,以前也只是学了学原理,做过一个BPN的练习,没有系统的总结过,最近看Torch的源码,对MLP有了更多的了解,写写自己学到的东西吧,算是做了一次总结! ...
- 学习笔记TF011:多层神经网络
线性回归.对数几率回归模型,本质上是单个神经元.计算输入特征加权和.偏置视为每个样本输入特征为1权重,计算特征线性组合.激活(传递)函数 计算输出.线性回归,恒等式(值不变).对数几率回归,sigmo ...
- mxnet卷积神经网络训练MNIST数据集测试
mxnet框架下超全手写字体识别—从数据预处理到网络的训练—模型及日志的保存 import numpy as np import mxnet as mx import logging logging. ...
- 简单多层神经网络实现异或XOR
最近在看<Neural Network Design_Hagan> 然后想自己实现一个XOR 的网络. 由于单层神经网络不能将异或的判定分为两类. 根据 a^b=(a&~b)|(~ ...
随机推荐
- 洛谷 P1571 眼红的Medusa【二分查找】 || 【map】
题目链接:https://www.luogu.org/problemnew/show/P1571 题目描述 虽然Miss Medusa到了北京,领了科技创新奖,但是他还是觉得不满意.原因是,他发现很多 ...
- POJ 2250 Compromise【LCS】+输出路径
题目链接:https://vjudge.net/problem/POJ-2250 题目大意:给出n组case,每组case由两部分组成,分别包含若干个单词,都以“#”当结束标志,要求输出最长子序列. ...
- 不一样的go语言-gopher
前言 gopher原意地鼠,在golang 的世界里解释为地道的go程序员.在其他语言的世界里也有PHPer,Pythonic的说法,反而Java是个例外.虽然也有Javaer之类的说法,但似乎并 ...
- File类基本用法
[例子1]创建一个新文件. import java.io.*; class hello{ public static void main(String[] args) { File f=new Fil ...
- UltraISO制作U盘启动盘安装Win7系统攻略
reference win 7 iso name: cn_windows_7_ultimate_x86_dvd_x15-65907.iso URL FOR download: http://jingy ...
- Xamarin.Android部署失败
Xamarin.Android部署失败 项目编译.生成没有错误信息,并且可以找到生成的APK包,但部署失败.提示信息如下: "apksigner.BAT"已退出,代码为1. ...
- POJ.3537.Crosses and Crosses(博弈论 Multi-SG)
题目链接 \(Description\) 有一个一行n列的棋盘,每个人每次往上放一个棋子,将三个棋子连在一起的人赢.问是否有必胜策略. \(Solution\) 首先一个人若在\(i\)处放棋子,那么 ...
- Java获取系统日期时间
方法一:利用Calendar类来获取当前日期和时间,代码如下: /** * 获取系统时间 * @return */ public String getDate(){ Calendar calendar ...
- VC在线程中操作界面
http://blog.csdn.net/tingsking18/article/details/4399199 多线程是我们在编程中经常遇到的问题,线程执行完后往往要把执行的结果传给主线程,但是MF ...
- 计算请假天数JavaScript方法
前言 最近,有这么个需求,给用户做个请假审批系统,要输入请假开始时间和结束时间,同时计算出请假天数,如果年假数量不够提示不能提交,如果年假数量够的话,就走审批工作流,审批通过以后,自动在年假上减去这个 ...