[UFLDL] *Train and Optimize
[Converge] Gradient Descent - Several solvers
[Converge] Weight Initialiser
[Converge] Backpropagation Algorithm 【BP实现细节】
[Converge] Feature Selection in training of Deep Learning 【特性相关性的影响】
[Converge] Training Neural Networks 【cs231n-lec5&6,推荐】
[Converge] Batch Normalisation
- SGD(随机梯度下降)
- LBFGS(受限的BFGS)--> Broyden–Fletcher–Goldfarb–Shanno (BFGS) algorithm
- CG(共轭梯度法)
- 而梯度下降法应用在深度网络中的一个缺点是权值的迭代变化值会很小,很容易收敛到的局部最优点;
- 另一个缺点是梯度下降法不能很好的处理有病态的曲率(比如Rosenbrock函数)的误差函数。
卷积神经网络结构变化——Maxout Networks,Network In Network,Global Average Pooling
顺便理解下相关的概念。
参考资料 [] Maxout Networks,
[] http://www.jianshu.com/p/96791a306ea5
[] Deep learning:四十五(maxout简单理解)
[] 论文笔记 《Maxout Networks》 && 《Network In Network》
[] Fully convolutional networks for semantic segmentation,
[] http://blog.csdn.net/u010402786/article/details/50499864
[] 深度学习(二十六)Network In Network学习笔记
[] Network in Nerwork,
[] Improving neural networks by preventing co-adaptation of feature detectors
Reference
1、Maxout Network
提出了一个概念——线性变化+Max操作可以拟合任意的的凸函数,包括激活函数 (such as Relu)。
(1)
如果激活函数采用sigmoid函数的话,在前向传播过程中,隐含层节点的输出表达式为:
W是2维,这里表示取出的是第i列(对应第i个输出节点),下标i前的省略号表示对应所有行中的第i列中的。
(2)
如果是maxout激活函数,则其隐含层节点的输出表达式为:
W是3维,尺寸为d*m*k,
- d表示输入层节点的个数,
- m表示隐含层节点的个数,
- k表示每个隐含层节点展开k个中间节点,这k个中间节点都是线性输出的,而maxout的每个节点就是取这k个中间节点输出最大的那个值。
参考一个日文的maxout ppt 中的一页ppt如下:
这张图的意识是说,紫圈中的隐藏节点展开成了5个黄色节点,取max。Maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。
从左往右,依次拟合出了ReLU,abs,二次曲线。
作者从数学的角度上也证明了这个结论,即只需2个maxout节点就可以拟合任意的凸函数了(相减),前提是中间节点的个数可以任意多,如下图所示,具体可以翻阅paper[1]。
maxout的一个强假设是输出是位于输入空间的凸集中的….这个假设是否一定成立呢?虽然ReLU是Maxout的一个特例——实际上是得不到ReLU正好的情况的,我们是在学习这个非线性变换,用多个线性变换的组合+Max操作。
Jeff: 是否具有一定的实战价值?还是叫好不叫座?感觉是无关同样的改进,稍微了解下。
2、Network In Network
本文的一些概念,包括1*1卷积,global average pooling都已经成为后来网络设计的标准结构,有独到的见解。
看第一个NIN,本来11*11*3*96(11*11的卷积kernel,输出map 96个)对于一个patch输出96个点,是输出feature map同一个像素的96个channel,但是现在多加了一层MLP,把这96个点做了一个全连接,又输出了96个点
很巧妙,这个新加的MLP层就等价于一个1 * 1 的卷积层,
这样在神经网络结构设计的时候就非常方便了,只要在原来的卷积层后面加一个1*1的卷积层,而不改变输出的size。
注意,每一个卷积层后面都会跟上ReLU。所以,相当于网络变深了,我理解其实这个变深是效果提升的主要因素。
意义在于:成了一个不同特征提取器的综合效果,节省NN空间,但保证效果,这对网络的简化很有意义。
【举例解释,见原文】
这里建立了一个概念,全连接网络可以等价转换到1*1的卷积,这个idea在以后很多网络中都有用到,比如FCN[5]。
3、Global Average Pooling
在Googlenet网络中,也用到了Global Average Pooling,其实是受启发于Network In Network。
Global Average Pooling一般用于放在网络的最后,用于替换全连接FC层,为什么要替换FC?因为在使用中,例如alexnet和vgg网络都在卷积和softmax之间串联了fc层,发现有一些缺点:
(1)参数量极大,有时候一个网络超过80~90%的参数量在最后的几层FC层中;
(2)容易过拟合,很多CNN网络的过拟合主要来自于最后的fc层,因为参数太多,却没有合适的regularizer;过拟合导致模型的泛化能力变弱;
(3)实际应用中非常重要的一点,paper中并没有提到:FC要求输入输出是fix的,也就是说图像必须按照给定大小,而实际中,图像有大有小,fc就很不方便;
作者提出了Global Average Pooling,做法很简单,是对每一个单独的feature map取全局average。要求输出的nodes和分类category数量一致,这样后面就可以直接接softmax了。
作者指出,Global Average Pooling的好处有:
- 因为强行要求最后的feature map数量等于category数量,因此feature map就会被解析为categories confidence maps.
- 没有参数,所以不会过拟合;
- 对一个平面的计算,使得利用了空间信息,对于图像在空间中变化更鲁棒;
举个例子:
假如,最后的一层的数据是10个6*6的特征图,global average pooling是将每一张特征图计算所有像素点的均值,输出一个数据值,
这样10 个特征图就会输出10个数据点,将这些数据点组成一个1*10的向量的话,就成为一个特征向量,就可以送入到softmax的分类中计算了
From: https://alexisbcook.github.io/2017/global-average-pooling-layers-for-object-localization/
In mid-2016, researchers at MIT demonstrated that CNNs with GAP layers (a.k.a. GAP-CNNs) that have been trained for a classification task can also be used for object localization.
That is, a GAP-CNN not only tells us what object is contained in the image - it also tells us where the object is in the image, and through no additional work on our part! The localization is expressed as a heat map (referred to as a class activation map), where the color-coding scheme identifies regions that are relatively important for the GAP-CNN to perform the object identification task.
- 与Dropout不同的是,它不是随机将隐含层节点的输出清0,
- 将节点中的每个与其相连的输入权值以1-p的概率清0。
[UFLDL] *Train and Optimize的更多相关文章
- 本人AI知识体系导航 - AI menu
Relevant Readable Links Name Interesting topic Comment Edwin Chen 非参贝叶斯 徐亦达老板 Dirichlet Process 学习 ...
- [AI] 深度数学 - Bayes
数学似宇宙,韭菜只关心其中实用的部分. scikit-learn (sklearn) 官方文档中文版 scikit-learn Machine Learning in Python 一个新颖的onli ...
- Deep Learning 19_深度学习UFLDL教程:Convolutional Neural Network_Exercise(斯坦福大学深度学习教程)
理论知识:Optimization: Stochastic Gradient Descent和Convolutional Neural Network CNN卷积神经网络推导和实现.Deep lear ...
- Deep Learning 1_深度学习UFLDL教程:Sparse Autoencoder练习(斯坦福大学深度学习教程)
1前言 本人写技术博客的目的,其实是感觉好多东西,很长一段时间不动就会忘记了,为了加深学习记忆以及方便以后可能忘记后能很快回忆起自己曾经学过的东西. 首先,在网上找了一些资料,看见介绍说UFLDL很不 ...
- UFLDL教程之(一)sparseae_exercise
下面,将UFLDL教程中的sparseae_exercise练习中的各函数及注释列举如下 首先,给出各函数的调用关系 主函数:train.m (1)调用sampleIMAGES函数从已知图像中扣取多个 ...
- 深度学习 Deep Learning UFLDL 最新 Tutorial 学习笔记 1:Linear Regression
1 前言 Andrew Ng的UFLDL在2014年9月底更新了. 对于開始研究Deep Learning的童鞋们来说这真的是极大的好消息! 新的Tutorial相比旧的Tutorial添加了Conv ...
- UFLDL教程笔记及练习答案五(自编码线性解码器与处理大型图像**卷积与池化)
自己主动编码线性解码器 自己主动编码线性解码器主要是考虑到稀疏自己主动编码器最后一层输出假设用sigmoid函数.因为稀疏自己主动编码器学习是的输出等于输入.simoid函数的值域在[0,1]之间,这 ...
- (转) How to Train a GAN? Tips and tricks to make GANs work
How to Train a GAN? Tips and tricks to make GANs work 转自:https://github.com/soumith/ganhacks While r ...
- Deep Learning 13_深度学习UFLDL教程:Independent Component Analysis_Exercise(斯坦福大学深度学习教程)
前言 理论知识:UFLDL教程.Deep learning:三十三(ICA模型).Deep learning:三十九(ICA模型练习) 实验环境:win7, matlab2015b,16G内存,2T机 ...
随机推荐
- API使用
至于什么是API我想不用累述了,百科上面有,其实就是别人写好了一大堆功能性的代码,然后你可以拿来用.一般的二次开发都是使用api来开发,包括现在的高级程序设计,很少自己写基本代码了,像.netFram ...
- 解决CSS图片底部3像素问题总结
解决三像素问题的总结: 1.img标签的父标签增加font-size:0; 如.body{ font-size: 0; } 2.img标签增加display:block; img{display:bl ...
- 数据结构C语言版--静态顺序表的基本功能实现(一)
/* * 功能:创建一个线性表,并输出 * 静态分配内存 */ #include<stdio.h> //stdio.h是C的标准I/O库 //#include<iostream> ...
- C# 8.0的新的using语法——Using declarations
我们在代码中经常使用using保障非托管资源的释放 static void Main(string[] args) { using (var options = Parse(args)) { if ( ...
- Android开源项目SlidingMenu学习(二)
前一篇SlidingMenu学习(一)文章中了解了导入SlidingMenu到我们项目经常出现的问题,下面我们正式学习. 先看一个效果: 看到两幅图片的差别了吗,左边的一栏时可以滑动的,可以隐藏掉,现 ...
- Linux系统管理员应该知道的journalctl知识
在Systemd出现之前,Linux系统及各应用的日志都是分别管理的,Systemd开始统一管理了所有Unit的启动日志,这样带来的好处就是可以只用一个 journalctl命令,查看所有内核和应用的 ...
- linux,日志查找技巧
1.查询日志中含有某个关键字的信息 cat app.log |grep 'error' 2.查询日志尾部最后10行的日志 tail -n 10 app.log 3.查询10行之后的所有日志 tail ...
- Visual Studio 统计代码行数
介绍一种简单的统计代码行数的小技巧, 使用正则表达式,用VS强大的查找功能 b[^:b#/]+.$ 最后结果:
- 【Java】java数据库连接中C3P、DBCP、Druid连接池的使用
使用JDBC的步骤:1.加载数据库驱动2.通过DriverManager获得数据库连接3.通过Connection获得Statement对象4.使用Statement执行SQL语句.5.操作结果集合6 ...
- js 学习
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta chars ...