深度学习Bible学习笔记:第六章 深度前馈网络

第四章 数值计算(numerical calculation)和第五章 机器学习基础下去自己看。

一、深度前馈网络(Deep Feedfarward Network,DFN)概要:

DFN:深度前馈网络,或前馈神经网络(FFN)/多层感知机(MLP)

目标:近似模拟某函数f  y=f(x;θ)

  学习参数θ的值,得到最佳的函数近似。

  注:并非完美模拟大脑,只是实现统计泛化,函数近似机。源于大脑,但远远比不上大脑

结构:  f(x)=f(3)(f(2)(f(1)(x)))

  前馈(feedforward):信息一直往下流动,一路向前,不回头。例如:CNN

  反馈(feedbackward):前馈的扩展,增加反馈连接,走一段,回头看看。例如:RCNN

线性模型:

  优点:简单快速,线性回归和逻辑回归(广义线性回归)

  局限性:受限于线性函数,无法表示任意变量间的相互作用

非线性模型(扩展):

  套上一层皮:非线性变换

如何选择非线性变换?映射φ

  (1)找通用函数:高维,过拟合。

    只要函数维度足够高,总能拟合训练集,然而,测试集泛化不佳

    非通用函数基于局部光滑原则

  (2)人工设计函数:主流,极度依赖专家+领域,难以迁移

  (3)自动学习函数:两全其美

    同时学习函数参数+权重参数

    唯一放弃凸性的方法,利大于弊

    通用:只需要一个广泛的函数族,不用太精确

    可控:专家知识辅助泛化,只需要找函数族φ(x;θ)

训练一个前馈网络需要做什么?

设计决策同线性模型

  优化模型

  代价函数

  输出单元

网络结构该如何设计?

  多少层,连接如何设置,每层多少个单元

如何高效地计算梯度?

  反向传播

补充:线性变换
  什么是线性变换?

    仿射变换:线性变换+平移

    具体:缩放、旋转、错切、翻转等

    参考:《如何通俗讲解仿射变换》

  什么是非线性变换?

  参考第二章分享笔记或3Blue 1 Brown的《线性代数本质》

  书面定义:加法+数乘——抽象

  形象理解:

    只需满足两点要求:原点不变,直线还是直线(不能扭曲)

二、如何解决异或问题

XOR函数(“异或”逻辑):两个二进制的运算

  注:这道题绝不简单,曾引发AI的第一个寒冬

  异或门是神经网络的命门!

  解决:非线性变换+BP

人:

  简单规则:if。。。else。。。

  找规律:x+y=1,怎么自动学习

机器:

  确定性、自动化、泛化能力

其他。

线性方法:f(x,w,b)=xTw+b

  回归问题

  均方误差

  结果:任意点都输出0.5,失败。(w=0,以及b=0.5)

为什么会这样?

  线性模型中各变量的参数固定

  不能通过一个变量改变另外一个变量

结论:

  线性模型无法解决异或问题。

那么,怎么办?——空间变换

  低维线性不可分,高维线性可分(SVM)

  非线性变换实现空间变换

两层神经网络可以无限逼近任意连续函数

网络结构:

  两个输入,一个隐含层,一个输出

激活函数:

  ReLU(整流线性单元)

一个解:

补充:

  ReLUc长的是挺简单,可某个点有点膈应,可导吗?——不可导

  那为什么还用它?——计算友好,特殊点特殊处理(给0或1),仿生

可导,可微,连续?

  连续:有定义、光滑(极限存在)、无间断点。

  可微和可导近似等效(多元情形不适用)

  可积允许间断点

  可导必连续,必可积。反之不可行。

见证奇迹的时刻(睁大眼睛看):

步骤:

X--->XW--->XW+c--->ReLU--->*w

空间变换:正方形--->直线--->分段直线(线性可分)

--->--->--->--->--->

回想一下:

  线性模型无法解决异或问题

  低维线性不可分,高维线性可分

  多个低级分类器组合成复杂分类器

《A friendly intruduction to Deep Learning and Neural Networks》

形象感知:

线性边界到非线性边界。

补充:直观感受异或分类

  问题:人工求解--->自动训练?

  理论证明:两层神经网络可以无限逼近任意连续函数

    层数越深,表示能力越强

  Google playground(可以下去自己搜索体验一下):

    理想--->现实(近似最优解)

三、基于梯度的学习

虽然异或是AI命门,但还只是小儿科

实际情况,训练样本和参数都是数十亿级别

怎么办?——梯度下降

  目前为止,神经网络和线性模型都用梯度下降

  但最大的区别是:神经网络的非线性导致代价函数非凸,无法收敛到全局最优。

  注:凸优化从任何一个初始值触发均能收敛到全局最优

如何计算梯度?

  梯度下降升级版+BP算法

梯度下降:

  当前位置最陡峭的方向可能最快(局部)

  实际问题,高维空间如何收敛?(见第八章讲解)

设计要点:

  优化算法:梯度下降

  代价函数:交叉熵(负最大似然)

    代价函数的梯度必须足够大,并有足够的预测能力,所以不要用sigmoid

    代价函数是一个泛函(函数到实数的映射)

    如何对泛函求解?变分法

  

   

  输出单元:线性单元,sigmoid单元,softmax单元等,等多细节请认真看书。

梯度下降对比(好好看书)。

四、反向传播

怎么更新网络权重?传统方法:固定其他变量,只计算一个

反向传播(back propagation):代价函数信息向后流动,以便计算梯度,甚至任意函数的导数

反向传播仅用于计算梯度,并非多层网络的学习方法!

为什么要理解反向传播?TensorFlow工具不是现成的吗?

不要只会用工具,否则神经网络永远都是黑盒!不要在应用网络的时候,出了问题,都不知道怎么调试,学习任何技术,都要了解原理,不要只会使用工具,让自己也变成了单纯的工具。

计算图:

链式求导:

要点:

  链式求导:导数=倍率

  计算图

符号求导

损失函数

五、隐藏单元

如何选择隐藏单元的类型?

  ReLU必定是极好的!

隐藏单元的选择建议

  Relu及其扩展:绝对值整流,泄露整流,参数整流

  Logistic sigmoid及双曲正切:易饱和,不宜做隐含层单元

  径向基(RBF):radical basis function,大部分饱和到零,难以优化

  softplus:ReLU的平滑版,实际效果不如ReLU好

  硬双曲正切:hard tanh

其他

六、架构设计

有多少个单元,怎么连接?

神经网络大多是链式架构(俄罗斯套娃)

要素:深度+宽度

  网络越深,泛化能力越强,但越难优化

  深度和宽度折中

  理想的架构需要不断实验

能自动学习网络深度吗?——可以,见书中“通用近似定理”?辩证去看

分段线性网络(ReLU或maxout)可表示区域数量跟深度成指数关系

网络越深,泛化越好。

七、总结

自1980年以来,前馈网络核心思想并无多大变化,仍然是梯度下降和反向传播

1986-2015,网络性能出现重大提升,原因是:

  大量的数据降低网络泛化难度

  硬件和软件能力的提升

  部分算法上的进步:交叉熵替换均方差,ReLU的出现

80年代就有ReLU,但是被sigmoid替代,直到2009年才开始变天,原因:

  网络非常小,sigmoid表现较好

  迷信:必须避免不可导的激活函数

ReLU比隐含层权重还要重要,是系统性能提升的唯一因素

ReLU具备生物神经元的特性:阈值以下不活跃,阈值以上开始活跃,且活跃程度成正比

2006-2012,人们普遍不看好前馈网络,而今前馈网络表现非常好,进一步发展出变分自动编码器和生产对抗网络(GAN)

附:学习金字塔,给有心人

  

原文地址:https://www.cnblogs.com/ariel-dreamland/p/8676215.html

时间: 2024-10-10 01:30:32

深度学习Bible学习笔记:第六章 深度前馈网络的相关文章

【WPF学习】第三十六章 样式基础

原文:[WPF学习]第三十六章 样式基础 前面三章介绍了WPF资源系统,使用资源可在一个地方定义对象而在整个标记中重用他们.尽管可使用资源存储各种对象,但使用资源最常见的原因之一是通过他们的保存样式. 样式是可应用于元素的属性值集合.WPF样式系统与HTML标记中的层叠样式表(Cascading Style Sheet,CSS)标准担当类似的角色.与CSS类似,通过WPF样式可定义通用的格式化特性集合,并且为了保证一致性,在整个应用程序中应用他们.与CSS一样,WPF样式也能够自动工作,指定具体

《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(1)

<Microsoft Sql server 2008 Internals>索引目录: <Microsoft Sql server 2008 Internals>读书笔记--目录索引 在第五章主要学习了table的内部存储结构,第七章<Special storage>中将继续深入学习存储机制,那将是本书最难理解的一章.第六章主要介绍index的基础知识,第八章是<query Optimizer>,下面我们先来看看第六章:Indexes:Internals an

深入理解 C 指针阅读笔记 -- 第六章

Chapter6.h #ifndef __CHAPTER_6_ #define __CHAPTER_6_ /*<深入理解C指针>学习笔记 -- 第六章*/ typedef struct __person { char* name; char* title; unsigned int age; }person; /*结构体内存的释放问题*/ void __struct_memory_test(); #endif Chapter6.cpp #include "Chapter6.h&quo

MySQL cookbook读书笔记第六章

1,修改MySQL中的日期的格式 在显示一个日期值时,如果没有特别指定,MySQL按照ISO格式显示日期即(CCYY-MM0DD).如果不希望按照MySQL的默认格式输出时间和日期值,可以使用date_format()或者time_format()函数按照用户期望的格式重写日期或者时间值 date_format(),time_format()和str_to_date()三个函数都接受格式化串作为参数: 2,设置客户端时区 如果客户端和服务器处在不同的时区,那么客户端在服务器上保存timestam

《Linux Shell脚本攻略》 笔记 第六章:打包压缩

<Linux Shell脚本攻略> 笔记 第六章:打包压缩 //1.打包.解包 [[email protected] program_test]# tar -cf output.tar 11.txt 22.txt 33.txt [[email protected] program_test]# tar -xf output.tar -C ./tar-file/  //-C指定要提取到哪个路径? //列举出归档文件中的内容 [[email protected] program_test]# ta

构建之法阅读笔记05-第六章

阅读笔记 第六章:敏捷流程 第六章敏捷流程主要介绍了什么是敏捷流程及其原则,还有什么时候可以选择敏捷的开发方法,什么时候选择其他方法. 敏捷的流程是指一系列价值观和方法论的集合.介绍了一些敏捷开发原则,比如,经常发布可用的软件,业务人员和开发人员在项目开发过程中应该每天共同工作,面对面的交流始终是最有效的沟通方式,不断关注技术和设计,保持简明,团队要学会自我管理,时时总结如何提高团队效率,并付诸行动. 敏捷流程的方法论---Scrum方法论.首先第一步需要找出完成产品需要做的事情,然后决定当前的

Android学习笔记—第六章 Asynctask异步加载

第六章 Asynctask 异步加载 1.好处:不需要创建线程就可管理线程 缺点:步骤多 2.步骤: (1)创建一个类继承Asynctask<xxx,xxx,xxx>; 三个泛型参数: 第一个:决定了execute()方法的传入值类型,决定了doInBackground()方法的传入值类型 第二个:决定了publishProgress()方法的传入值类型,决定了onProgressUpdate()方法的传入值类型 第三个:决定了doInBackground()方法的返回值类型,决定了onPos

Java学习笔记—第六章 流程控制语句

第六章  熟悉Java的流程控制语句 Java的程序流程控制分为顺序结构.选择结构.循环结构和跳转语句. 顺序结构:按照程序代码自上而下执行,直到程序结束,中间没有任何判断和跳转. 选择结构(分支结构):判断给定的条件,根据判断结果控制程序的流程.包括if语句和switch语句. 2.1 if语句:通过判断给定表达式的值来决定程序的流程.常见if语句的形式有三种: (1)if(expression){ statement: } (2)if(expression){ statement; }els

韩松毕业论文笔记-第六章-EFFICIENT METHODS AND HARDWARE FOR DEEP LEARNING

难得跟了一次热点,从看到论文到现在已经过了快三周了,又安排了其他方向,觉得再不写又像之前读过的N多篇一样被遗忘在角落,还是先写吧,虽然有些地方还没琢磨透,但是paper总是这样吧,毕竟没有亲手实现一下,光是看永远无法理解透彻,然后又去忙别的工作,看过的都打了水漂. 第六章 EIE-用于稀疏神经网络的高效推理引擎 目测和发在ISCA2016的论文EIE: Efficient Inference Engine on Compressed Deep Neural Network 内容一致,补了一些图.