【导读】我们现在有了很多非常厉害的深度学习框架,比如Tensorflow,CNTK,PaddlePaddle,Caffe2等等。然而,这些为理解决实际的运用问题而生的,而不是用来学习“深度学习”知识和思想的。以是微软Xiaowuhu根据自己亲自经历的学习轨迹,归纳出了以下教程,可以帮助小白做到真正的从入门到精通。通过以下循规蹈矩地学习与动手实践,一方面可以帮助读者深刻理解“深度学习”的根本知识,更好地理解并利用现有框架,另一方面可以助力读者快速学习最新涌现的各种神经网络的扩展或者变型,跟上快速发展的AI浪潮。
地址:
https://github.com/microsoft/ai-edu/tree/master/
写在前面,为什么要出这个系列的教程呢?
总的说来,我们现在有了很多非常厉害的深度学习框架,比如Tensorflow,CNTK,PaddlePaddle,Caffe2等等。然而,我们用这些框架在搭建我们自己的深度学习模型的时候,到底做了一些什么样的操作呢?我们试图去阅读框架的源码来理解框架到底帮助我们做了些什么,但是……很难!
很难!
很难!
由于深度学习是须要加速啦,分布式打算啦,框架做了很多很多的优化,也让像我们这样的小白难以理解这些框架的源码。
这取决于你是想真正地节制“深度学习”的思想,还是只想成为一个调参师?在我们看来,如TensorFlow,CNTK这些伟大的深度学习工具,是为理解决实际的运用问题而生的,而不是用来学习“深度学习”知识和思想的。以是我们根据自己亲自经历的学习轨迹,归纳出了以下教程,可以帮助小白做到真正的从入门到精通。
通过以下循规蹈矩地学习与动手实践,一方面可以帮助读者深刻理解“深度学习”的根本知识,更好地理解并利用现有框架,另一方面可以助力读者快速学习最新涌现的各种神经网络的扩展或者变型,跟上快速发展的AI浪潮。
对付这份教程的内容,如果没有额外的解释,我们常日利用如下表格的命名约定:
符号含义X输入样本Y输入样本的标签Z线性运算的结果A激活函数/结果W权重矩阵B偏移矩阵J丢失函数大写字母矩阵或矢量,如A,W,B小写字母变量,标量,如a,w,bx1,2第1个样本的第2个特色值wL2,3第L层第2个神经元对第L-1层第3个神经元的权重值矩阵的行一批样本的某一个特色值的凑集矩阵的列一批样本的某一个样本的所有特色值
适用范围
没有各种根本想学习却无从下手哀声叹气的玩家,请按时跟踪最新博客,推导数学公式,跑通代码,并及时提出问题,以求最高疗效;
深度学习小白,有直不雅观的人工智能的认识,强烈的学习希望和需求,请在博客的根本上合营代码食用,效果更佳;
调参师,演习过模型,调过参数,想理解框架内各层运算过程,给玄学的调参之路添加一点生理保障;
超级高手,提出您宝贵的见地,给广大初学者指出一条明路!
前期准备
环境:
Windows 10 version 1809Visual Studio 2017 Community or abovePython 3.6.6Jupyter Notebook (可选)自己:
复苏的头脑(困了的同学请自觉泡茶),纸和笔(如果想随着推公式的话),闹钟(防止久坐按时起来转转),厚厚的衣服(有暖气的同学请忽略)
网络构造概览
网络构造名称网络构造图运用领域单入单出一层
一元线性回归多入单出一层
多元线性回归多入单出一层
线性二分类多入多出一层
线性多分类单入单出两层
一元非线性回归/拟合可以拟合任意繁芜函数多入单出两层
非线性二分类多入多出两层
非线性多分类多入多出三层
非线性多分类
目录
1. 基本观点
首先会讲解一下神经网络基本的演习和事情事理,由于基本上各种教程里都没有提到这一点,以至于笔者在刚开始学习神经网络时一头雾水,不得要领,不知从何处开始下手。
后面接的是导数公式和反向传播公式,包括矩阵求导,这一部分可以大概浏览一下,紧张的目的是备查,在自己推导反向公式时可以参考。
然后是反向传播和梯度低落,我们先从大略的线性办法提及(只有加法和乘法),而且用代入数值的办法来肃清对公式的恐怖生理。然后会说到分层的繁芜(非线性)函数的反向传播,同样用数值代入办法手推反向过程。
梯度低落是神经网络的基本学习方法,我们会用单变量和双变量两种办法解释,配以可视化的图解。再多的变量就无法用可视化办法来阐明了,以是我们力求用大略的办法理解繁芜的事物。
本部分末了是丢失函数的讲解,着重解释了神经网络中目前最常用的均方差丢失函数(用于回归)和交叉熵丢失函数(用于分类)。
2. 线性回归
用线性回归作为学习神经网络的出发点,是一个非常好的选择,由于线性回归问题本身比较随意马虎理解,在它的根本上,逐步的增加一些新的知识点,会形成一条比较平缓的学习曲线,或者说是迈向神经网络的第一个小台阶。
单层的神经网络,实在便是一个神经元,可以完成一些线性的事情,比如拟合一条直线,这用一个神经元就可以实现。当这个神经元只吸收一个输入时,便是单变量线性回归,可以在二维平面上用可视化方法理解。当吸收多个变量输入时,叫做多变量线性回归,此时可视化方法理解就比较困难了,常日我们会用变量两两组对的办法来表现。
当变量多于一个时,两个变量的量纲和数值有可能差别很大,这种情形下,我们常日须要对样本特色数据做归一化,然后把数据喂给神经网络进行演习,否则会涌现“消化不良”的情形。
3. 线性分类
分类问题在很多资料中都称之为逻辑回归,Logistic Regression,其缘故原由是利用了线性回归中的线性模型,加上一个Logistic二分类函数,共同布局了一个分类器。我们在本书中统称之为分类。
神经网络的一个主要功能便是分类,现实天下中的分类任务繁芜多样,但万变不离其宗,我们都可以用同一种模式的神经网络来处理。
本部分中,我们从最大略的线性二分类开始学习,包括其事理,实现,演习过程,推理过程等等,并且以可视化的办法来帮助大家更好地理解这些过程。
在第二步中,我们学习了实现逻辑非门,在本部分中,我们将利用学到的二分类知识,实现逻辑与门、与非门,或门,或非门。
做二分类时,我们一样平常用Sigmoid函数做分类函数,那么和Sigmoid函数长得特殊像的双曲正切函数能不能做分类函数呢?我们将会探索这件事情,从而对分类函数、丢失函数、样本标签有更深的理解。
然后我们将进入线性多分类的学习。多分类时,可以一对一、一对多、多对多,那么神经网络利用的是哪种办法呢?
Softmax函数是多分类问题的分类函数,通过对它的剖析,我们学习多分类的事理、实现、以及可视化结果,从而理解神经网络的事情办法。
4. 非线性回归
从这一步开始,我们进入了两层神经网络的学习,从而办理非线性问题。
在两层神经网络之间,必须有激活函数连接,从而加入非线性成分,提高神经网络的能力。以是,我们先从激活函数学起,一类是挤压型的激活函数,常用于大略网络的学习;另一类是半线性的激活函数,常用于深度网络的学习。
接下来我们将验证著名的万能近似定理,建立一个双层的神经网络,来拟合一个比较繁芜的函数。
在上面的双层神经网络中,已经涌现了很多的超参,都会影响到神经网络的演习结果。以是在完成了基本的拟合任务之后,我们将会考试测验着调试这些参数,得到更好的演习效果(又快又好),从而得到超参调试的第一手履历。
。
5. 非线性分类
我们在第三步中学习了线性分类,在本部分中,我们将学习更繁芜的分类问题,比如,在很多年前,两位著名的学者证明了感知机无法办理逻辑中的异或问题,从而使感知机这个研究领域陷入了长期的结束。我们将会在利用双层网络办理异或问题。
异或问题是个大略的二分类问题,由于毕竟只有4个样本数据,我们会用更繁芜的数据样本来学习非线性多分类问题,并理解其事情事理。
然后我们将会用一个轻微繁芜些的二分类例子,来解释在二维平面上,神经网络是通过若何的神奇的线性变换加激活函数预算,把线性不可分的问题转化为线性可分问题的。
办理完二分类问题,我们将学习如何办理更繁芜的三分类问题,由于样本的繁芜性,必须在隐层利用多个神经元才能完身分类任务。
末了我们将搭建一个三层神经网络,来办理MNIST手写数字识别问题,并学习利用梯度检讨来帮助我们测试反向传播代码的精确性。
数据集的利用,是深度学习的一个基本技能,开拓集、验证集、测试集,合理地利用才能得到空想的泛化能力强的模型。
6. 模型推理与支配
我们已经用神经网络演习出来了一套权重矩阵,但是这个模型如何利用呢?我们总不能在实际生产环境中利用python代码来做推理吧?更何况在手机中也是不能运行Python代码的。
这就引出了模型的观点。一个模型会记录神经网络的打算图,并加载权重矩阵,而这些模型会用C++等代码来实现,以担保支配的便利。
我们将会学习到在Windows上利用ONNX模型的方法,然后是在Android上的模型支配方法。而在iOS设备上的模型,与Android的事理相同,有须要的话可以自己找资料学习。我们大概会考虑往后增加这部分内容。
7. 深度神经网络
在前面的几步中,我们用大略的案例,逐步学习了浩瀚的知识,使得我们可以更轻松地打仗深度学习。
从这一部分开始,磋商深度学习的一些细节,如权重矩阵初始化、梯度低落优化算法、批量归一化等高等知识。
由于深度网络的学习能力强的特点,会造成网络对样本数据过分拟合,从而造成泛化能力不敷,由于我们须要一些手段来改进网络的泛化能力。
8. 卷积神经网络
卷积神经网络是深度学习中的一个里程碑式的技能,有了这个技能,才会让打算机有能力理解图片和视频信息,才会有打算机视觉的浩瀚运用。
在本部分的学习中,我们将会逐步先容卷积的前向打算、卷积的反向传播、池化的前向打算与反向传播,然后用代码实现一个卷积网络并演习一些实际数据。
在后面我们还会先容一些经典的卷积模型,向大师们学习一些办理问题的方法论问题。