#pic_center
R 1 R_1 R1
R 2 R^2 R2
目录
- 知识框架
- No.1 多层感知机
- 一、感知机
- 1、感知机
- 2、训练感知机
- 3、图形解释
- 4、收敛定理
- 5、XOR问题
- 6、总结
- 二、多层感知机
- 1、XOR
- 2、单隐藏层
- 3、单隐藏层-单分类
- 4、为什么需要非线性激活函数
- 5、Sigmoid函数
- 6、Tanh函数
- 7、ReLU函数
- 8、多类分类
- 9、多隐藏层
- 10、总结
- 三、D2L代码注意点
- 四、QA
- No.2 模型选择+过拟合和欠拟合
- 一、模型选择
- 二、过拟合和欠拟合
- 三、D2L注意点代码
- 四、QA
- No.3 权重衰退
- 一、权重衰退
- 二、D2L代码注意点
- 三、QA
- No.4 丢弃法
- 一、丢弃法
- 二、D2L代码注意点
- 三、QA
- No.5 数值稳定性+模型初始化和激活函数
- 一、数值稳定性
- 二、模型初始化和激活函数
- 三、QA
- No.6 实战:kaggle房价预测+加州2020年房价预测
- 一、kaggle房价预测
- 二、加州2020年房价预测
- 三、AQ
知识框架
No.1 多层感知机
一、感知机
1、感知机
我们来讲感知机;这个是1960年的时候感知机的一个原型图;还可以看到这双每根线;它真的就是一根线连过去;所以它是一个特别巨大的一个模型;
然后呢我们来讲讲一下感知机;这个是人工智能最早的一个模型了;是 70年前嘛;感知机其实是一个很简单的模型;我们说给定输入x;x是一个向量;权重是一个w;也是一个向量;然后偏移呢;是一个标量;那么感知机的输出是;w和x做内积;就是你的权重和你的输入;两个向量做内积;加上你的b;然后呢再在上面做一个Sigma函数;
Sigma这里有很多种选择;第一个选择是说;你可以把它改成一个是;如果你的输入是大于0的话;我就是输出1;小于等于0的话;那我就输出0;就是说;感知机其实就是一个二分类的问题;如果你输入大于0就是一;正类;如果小于0;可以是 0;当然你可以改成0和一;当然你随便怎么改了;
我们当然可以改成说;比如说我们可以改成;-1也行;比如说;改成-1;比如说你输出正1和负1;所以感知机从;图形上来看;就是说你的输入是X1到Xd;假设你有第一个输入的话;你的输出就是你一个一;单一个元素;我们之前看过;就是单一个;元素的输出;你可以做成一个二分类的问题;所以跟我们之前的回归;线性回归的输出不一样;是说虽然它都是一个输出;但是线性回归是一个实数;这里我们输出的;是一个离散的类;
另外一个是说跟我们的Softmax的区别;是说Softmax如果有n个类的话;它就会输出n个元素;所以是可以是一个多分类的问题;而这里我们就输出一个元素;所以它只能最多做一个二分类的问题;
2、训练感知机
看一下;当年是怎么训练这个感知机的;这个算法也是非常简单;大家可以看一下;
首先呢w是0和B也是0;所以跟我们之前会不一样;我们之前w是一个随机的一个权重;这里就直接给0了;然后呢我们对一个样本i从0开始;一直到最后;假设当前是第i个样本;那就是如果你的yi就是你的标号;再假设是正1和负1两个标号;然后呢乘以w;和x做内积;加上B;如果它小于等于0;那是什么意思呢;意味着是说你分类;感知机把这个样本预测错了;
因为如果你是;首先看yi;假设这个项如果是大于0的话;那么就意味着你要分类成一个正类;那么呢假设你的YI是正1的话;那么它就是一个大于0的一个数;假设你小于等于0;那意味着YI那就是一个-1;所以就表示你分类分错了;反过来讲;如果你是小于等于0的话;但是呢你的;这样子你就预测应该是一个-1;如果呢;你的y你的真实的又是一个正1的话;那就是你分类又分错了;那就是满足这个情况的话;一定是说当前的权重;对我们的样本的分类是一个错误的;那么呢如果是分类错了;那我怎么做呢;
就是对w我们做一次更新;w等于w加上yi乘以Xi;就是说你的标号乘以你的样本;然后把它做权重更新;那么你的标量呢;就是你的偏差就是b等于b加上yi;然后就这一步就结束了;然后你一直做;一直做一直做;直到你所有的类都分类正确了;这也是个很有意思的一个停止条件;
那么它的等价于呢;就是说这个算法其实就是一个;梯度下降了;它等价于使用一个批量;大小为1的梯度下降;我们理解一下;PDR大小唯一;就是说每一次你拿一个样本去做;算梯度然后进行更新;然后我们没有说它是随机;梯度下降是因为;感知机最原始的模型;就是你不断一遍一遍的扫扫数据;没有说要随机去弄;如果你是使用梯度下降的话;那么感知机;那个就等在于使用下面这个梯度函数;下面这个损失函数;它的损失函数是说;首先你算一下标号y乘以w和x的累积;然后有个负号在这里;然后取了一个MAX;MAX是干嘛的呢;就是说MAX这个东西;这个东西就是说;我又换一个颜色;MAX其实是对应的这个if的语句;就如果你的分类正确的话;分类正确的话;那么说这一个项是要大于0的;那么你的负的话;那么就是一个负数;那么你的Max就输出是为0;那么你的梯度是一个常数;我就不会去做更新;就是对应的这个if;上面这个if语句不成立;那如果是说你分类错了的话;那么这时候你就有梯度了;就进入到上面那个if的语句里面;进行更新;所以说为什么你要加一个Max在里面;所以这个就是说;感知机等在于我们用这个损失函数;然后呢;使用批量大小为1做梯度下降;这就是当年60年代;我们发明的一个算法;怎么样对应到现在的;技术而且它之所以叫感知机;确实是因为跟神经网络;跟人的神经网络是相关的
3、图形解释
好接下来我们看一个例子;首先我们假设两个;我们要分狗和猫;然后呢我们要两个轴;一个轴和第二个轴;就是一个二元的输入;假设我们有一个狗;和一个猫;那么呢我们权重;现在的分类就是我们的一个;这根黑色的线;下一次假设来了一只新的狗;那么刚刚那个线;如果我们还画在这里的话;刚刚这个线大概是在;这个地方指的样子;那么就是说;你会发现他他对狗分类分错了;那么就是说我会对样本做一次更新;就把这个线往下移一点点;就说因为狗在下面嘛;然后你这个压;你这个分割面加上这个狗的拳头;它就会把这个分解面往下拉;然后你再来一只狗;它就再往下拉;你下面一只猫也会往回推一点点;然后你再不断的做几次;基本上就是;你可以一直做做做;做到最后;发现所有的样本看完;所有的分类都没问题;那么我们就可以停止了;所以这一个奇怪的停止条件是说;你得对所有的类都分类正确;
4、收敛定理
他的收敛定理是什么样子;所谓的收敛定理是说;我什么时候能够停;我是不是真的能够停;感知机是一个很简单的模型;所以它呢有一个很好的收敛定理;我们做这么几个假设;假设我们的数据;在一个半径为r的一个区域里面;就是说;假设这个区域是它是为r的;然后呢我假设有个余量ρ;使得我存在一个分解面;存在一个一个这样子的分解面;它的权重的l;two long加起来是小于等于一的;使得我这个;分界面能够对所有的分类都是正确的;记得吗;这个东西要大于等于0;才是分类正确的;就是说对它所有东西都分类正确;而且它是有一定余量的;就是说你看到是;这有个ρ;ρ是一个大于0的东西;就是说你可以对应的话;就是就是这一个头像换一换一点点;就说这个地方是有个ρ在这里的;就存在一个;margin;使得我刚好能够把所有的类都分开;那么如果是;这样的情况下;感知机确信能够找到我们的最优解;而且它保证我只会在;r平方加上e除以r平方之后;收敛就是会停止;这个地方可以大家理解一下;这个就说r的话;就是说你的数据的大小;当你是一个很大很大的区域的时候;当然你的收敛就会变慢对吧;假设你要在一个很大区域;一开始我们的w是0;所以就说;假设你的数据在一个很大区域的话;那我肯定要走很多步;第二个是说你的ρ;就说看你的这个;数据是不是很好;很好的话;就是说我能够真的两个点分的特别开;如果分的很开的话;当然我这就很简单的数据;我很快就收敛了;如果你不行的话;那么就是说;如果你的分割面特别小;那么要找到这个地方;就会花更多的时间;这就是感知机的收敛;我们这里就是解释一下感知机在;收敛定定理长什么样子;我们不讲证明了;大家有兴趣的话可以作为一个练习题去看一下这个怎么证明;它的证明其实也是挺简单的;大概可能10行代码不行;10行公式能够搞定;好;所以我们刚刚讲到的是;感知机的一个收敛定理
[感知机的收敛定理的证明](感知机模型(Perceptron)的收敛性解读 | 统计学习方法 - 知乎 (zhihu.com))
5、XOR问题
感知机它不能拟合XOR这个函数;XOR这个是什么意思呢就是说;假设我们我们来画一下;假设我这里画一个两个轴的话;就是x和y的话;那么这个点是一;这个点是一;这个点是-1-1 X 2;是说当我的输入x和y都是一的时候;那么它的它就是一个-1类;就是不一样;我就是出;出0就出一个0;我就认为是一个-1类或者0类都没关系;如果是相;不相同的话;那就是正一类;就说这也就是是说;红色两个点是同样一个类;绿色两个点呢;是同样一个类;感知机大家知道;如果是二维的输入的话;
那么它的分割面;因为它是一个线性模型;一定是一道线;
可以看到是说你不管怎么切它;你都无法在一条线;把整个数据给分对;比如说你切在这个地方;这个地方的话;那么你的;红色在一边;但是绿色就分开了;如果你切在下面的话;如果是绿色分对了;但是红色有一个是错误的;所以就是说;感知机不能拟合XOR的函数;因为它只能产生线性分割面这;个是Miski和在1969年提出的;一个说你们感知机什么时候不work好;这个事情直接导入了;导致了AI的第一个寒冬;他觉得哎;你这个模型搞那么复杂;我建一个那么大的机器;结果发现;我连个最简单XOR函数都不能做的话;那么我用;你们这一套干什么;因为接下来;大家就会去转到一个别的一个方向去;这个方向我们不会在这里介绍了;就是说在;神经网络这一块;甚是甚至是机器学习这一块;在1969年;因为大家发现感知机不能拟合XOR函数;导致大家哈哈哈;都去转行了;OK;所以呢;到10年还是15年之后;大家才发现;我其实有办法来做这个事情了;做这个事情的办法叫做;多成干自己
6、总结
我们先总结一下;感知机是一个off类的模型;就是它输出;一或者0或者一或者-1;它是最早的AI模型之一;它的求解算法当时候就是感知;其有自己的算法;现在来看就是等价于一个;批量大小;1的一个梯度下降;但是因为感知器过于简单;它不能拟合XOR函数;导致了我们第一次AI的寒冬;这就是一个总结;;
二、多层感知机
1、XOR
多层感知机;这个是我们现在深度学习;也是经常使用的一个模型;我们先把多层感知器过了之后;我们统一来回答问题;所以我们还是回到我们的XOR这个问题;我们来看一下;我们怎么样来解决这个问题;这样我们有;这个4个点;然后呢我们想要把它完全分类的话;那么你肯定是走;单线性模型是不行的;那么我们现在可以通过几个几步;来完成它;我们先看第一步;第一步我们学习一条蓝色的线;就是这个蓝色的线;蓝色的线呢;就是说;当你x是1的时候;那么全部放在这一边;你x小于0的时候;全部走这一边;所以是蓝色的分隔面干的事情;所以它对应的是说;这一行你可以看到是;蓝色这个线对1和4;2和3;1和3我们就给的是一个正号;就2和3给的是一个负号;在这个地方看见没有;
然后呢我们再学习一根黄色的线;黄色的线就是说你根据y的值来看;y的值你可以看到是说;当你1和2;就1和2;我们给一个正的;然后3和4;3和4我们是给一个负的值;那么有了;蓝色的分类器和黄色的分类器;结果的话;我们再对两个结果做乘法;可以看到是说;相同的值;我们就是做;看你是不是一样;就说你是一样的话;那么就是说正正我们是得正;如果你负负的话也得正;如果你不一样的话;那我们就是得成;做成一个负一;
所以这样子的话;那么我们就可以对它做一个分类了;可以看到这个图;我们假设我们要把这个图画出来的话;那就是;我们这里是x;这里是y;那我们先进入我们的蓝色的一个蓝色;分再进入我们的黄色分;最后它的结果进入我们的灰色分;灰色感知机;我们就可以得到我们正确的结果;所以说;这什么意思呢;就是说假设你一次做不了;那我先学一个简单一点的函数;再学一个简单函数;然后再用另外一个简单函数;组合两个函数;那么就是说我们就从一层变成了多层;这就是多层感知机所来干的事情;
2、单隐藏层
简单来讲它就是一个这样子一个图;首先呢我们的输入是;有X1 X2 X3 X4四个;然后呢我们加入了一个隐藏层;就是说它是一个;假设我们有五个隐藏层的话;那么就是说;所有的第一个X1到X4的话;先进入算第一个H1;然后算到H1直到H5;然后它的输出再作为输入;放到一个下一个层;所以隐藏层的大小是一个超参数;
为什么呢;是因为输入的大小你是不能改的;因为你数据有纬度;有多大那就有多大;然后呢但是你的输出的话;你就是看你有多少类了;你的输出的大小等于多少类;所以都是你的数据决定了;所以你唯一能干的事情就是说;我能够设置我的隐藏层是有多大;
3、单隐藏层-单分类
记得结合上面那张图 进行;;
看一下它是具体来讲是怎么做的;首先我们还是看到那个感知机的模型;我们考虑一个单分类的问题;输入我们跟之前一样的;是一个n维度的一个向量;隐藏层呢;就说;假设我们的隐藏层的大小是m的话;那我们的隐藏层它有一个W那就是一个m乘以一个n的一个矩阵;我的偏移;我有多少个隐藏层;那我就有多少个标量的偏移;所以它也是一个长为m的一个向量;输出层;这个是我们新的一个东西;输出层因为我们是做单分类;我们只输出一个的话;那么输出层就是一个很简单的;一个长m的一个向量;
因为我们的输入隐藏层的a;隐藏层是有m的话;那么隐藏层的输出就是m;长为m的一个向量;那么到对于输入层来讲;它的输入的维度就是m;但它是单分类嘛;所以它的输出就是一;这就是一个向量;那么它的偏移那也是一个B2;也是一个标量;那么具体怎么计算的话;
就是说;这个跟之前是一样的;跟我们的Softmax回归是一样的;就是说;输入乘以我们的权重;加上我们的偏移量;但是这里有一个东西;就是一个Sigma东西Sigma;我们可以之后再看是什么;这是一个激活函数;它是一个按元素做运算的一个函数;然后呢h是一个长为m的一个向量;它作为输入进入到输出层;那么就说输出层的权重是W2;那么它的转置乘以它向量做累积;加上我们的偏移;那么的输出就是一个标量;
4、为什么需要非线性激活函数
为什么我们要一个激活函数;而且;这个激活函数一定是要一个非线性的;你不能Sigma x就等于x是不行的;或者等于n倍x也是不行的;我们来看一下为什么;假设我们的激活函数是本身的话;那就是;等于x的话;那么你会变成什么样子呢;就是说我的h它就是等于你的输入了;你叫等于i了就是等于本身了;那么呢我如果把h带入到这个地方;那你可以看到是说我把这一项带进来;那就是;这第一项会变成了一个W2的转置;乘以W1乘以x;然后后面一项我就不管了;后面一项就是反正没有;反正是一个向量;跟一个另外一个项量做累积;再加上一个标量还是一个标量;就是说;假设Sigma是;我写一下;假设我Sigma x等于x的话;那么你这个地方呢它;的输出就是一个还是一个线性函数;因为你这个项你就等在于一个;比如说等在一个WPA的转制;它还是一个向量;说明还是一个线性模型;你可以换成一;比如说我再加一个a进来;加一个a进来也不会有什么变化;那就是再多一个a;就是说你的Sigma;就一定不能是一个线性函数;如果你是线性函数的话;你会发现它等价于一个;单层的;感知机;所以这个也是我们实现的时候;常犯的一个错误;就是说你不小心没有加激活函数;那么就说你把n个全体阶层剁在一起;最后发现;结果其实还是一个最简单的线性模型;
5、Sigmoid函数
最最简单也是最经典的;叫做sigmoid的函数;它就是说;对于x来讲;我不管你是什么值;我把你投影到一个0和1;的一个区间里面;而且是一个开区间;你可认为它就是一个sigmoid;就是说如果;记得我们之前的感知机讲的是什么;它就是;如果你的x大于0的话;那我就变成一;如果你不然的话就变成0;但是呢你如果你是这个函数的话;它很硬这个函数的话;它其实你要画出来就是一个;画出来就是一个;这样子的东西;它这么一个;大家我们之前有讲过;这个这个地方不好求导;这个地这个这一块;地方不好求导;所以呢就是sigmoid;其实它就是一个soft版本;就是说你可以看到是;我这也就是帮你这么给你;接过来了;就是比较平和的一个版本呐;这就是sigmoid;它的具体的定义就是你的x;我先做负x进去;然后这一个项把它变成一个正数;然后一加上一个正数;分级就是;一定是在一个0和一之间的区间里面;
6、Tanh函数
另外一个常用的激活函数叫做Tanh;区别是说;它是将输入;投影到一个-1和1的一个区间里面;;它的定义当然是1减去你的EXP;除以一加上EXP的;都是有个范围在里面;我们可能之后可以给大家解释一下;为什么要有个far;far就是说嗯;当然是说;你可以看到他人呢;他是一个;他是一个这个函数的;一个一个soft版本;如果我们就是把这个函数很硬的;拉到一个正1到负1的话;那其实是;不是那么的好;就是训练起来比较麻烦;
7、ReLU函数
是一个叫Relu的一个激活函数;它的真实的名字叫做rectified linear units;其实它就是一个Max (x和0);就是说整个深度学习;就是把一些东西给你重命名一下;就说back provation对吧;那其实就是一个自动求导领域的;一个很经典的模型就是说基本上;深度学习就是把很多旧的东西;我们重新;至少深度学习在我觉得在;2014年前;基本上都是一些经典的东西;把它从命名;但之后我们确实有新的东西出来;我大概就是;当然;你现在吐槽也就能吐到2014年的样子;OK所以;Relu函数;本身就是一个很简单的东西;它就是一个x和0;求Max;或一些;我们之前那个感知机是怎么回事;所以它的函数画起来;就是个这样子的东西;所以他的函数大家会记到求导是说;他这个项是这个项的导数是正1对吧;后面导数是0;就说如果他就;他就是一个很简很简单的;本来是你;你激活 x等于x肯定是不行的对吧;这个就那线性函数是不行;你怎么把它给线性去掉呢;就是把它弹一下对吧;就把那个小于0的话就放掉了;叫Relue其实呢
但是它的主要的好处是;什么呢它算起来很快;不要做指数运算;看一下回忆一下;之前之前我们要做两个指数运算;这里我们要做一个指数运算;指数运算是一件很贵的事情;在CPU上;一次指数运算;你可能要等价于算100次乘法运算的;成本GPU稍微好一点点;它有自己的单元来做指数;但还是很贵;但现在好了;我就一个Max搞定了;所以就是;这个就是为什么大家都用Relu;主要是它简单;
8、多类分类
好我们再做到多类的问题;就是刚刚我们讲的是softmax;是一个单类问题;我们可以做到多类;多类的话会怎么样呢;就是说;那么跟我们之前一样;跟多类;Softmax回归没本质区别;就是我假设我要做k类分类的话;那么呢我就是要输出;k个元素;然后我们呢;因为我们想要得到置信度的话;那我们就放到一个Softmax的一个操作;呃值里面拿到的是Y;一直到YK;Softmax大家还记得吧;就是他也不干什么事情;就是把所有的输入;拉到一个0和1之间的区域;然后使得他加起来;Y1一直加到YK;加起来等于一;就变成一个;概率这就是Softmax干的事情;所以你看到多类分类;跟Softmax没本质区别;是说我唯一加的就是这一块了;我来划一下;我唯一加的就是中间那一层;假使没有的话;那就是我们最简单Softmax回归;假设我加了一层隐;藏层;那么它就会就会变成多层感知机;OK这就是一个名字上的变化;那就是说你看到它就是在;Softmax回归里面加入了一层;
那么我们来看一下它的;定义定义跟之前没本质区别;就是唯一的区别就是;这里我们变成了k;就说因为我们的输出要有k个单元;所以我们的输出层的W2;就是一个m乘一个k的一个矩阵;那么偏移;那就B;也是一个常为k的一个向量;所以;另外一个跟之前的区别是说;所以这里面其实没区别;这就是说你从嗯;我们从一个;因为我们是这个这个写法;我们为了跟之前统一;所以我们把k放在后面;所以这里有个转置在这个地方;所以你这里就是从向量变成了矩阵;这里从标量变成了向量;另外一个区别是说对于你的output来讲;我们要做一次;Softmax这就是做多类分类的多层;多层感知机是长什么样子;
9、多隐藏层
那我可以做多隐藏层;比如说;你有一层还不够;我可以做很多层;这里就是一个很简单的一个图;说我可以做很多层;输入层在这个地方;第一个隐藏层;第二个隐藏层;第三个隐藏层;这是我们的输出;那么呢;数学上来说就是每一个隐藏层;它都有一个自己的w;和一个偏移b;
就是说第一层;我们假设这技术W1和B1的话;那么它的输出记得一下;这里有一个激活函数进入到一个;h e就是第一个隐藏层的输出;那么它呢就会嗯看到;它呢就会作为第二个隐藏层的输入;然后同样的话会跟权重做乘法;加上我们的偏移再做一次;激活函数;记得这个激活函数不能少;如果你少了一个;那么就层数就减一了;那同样的话它的输出是HR的话;它会进入下一个层;那么最后的话他会进入我们的输出;输出是不要激活函数的;因为激活函数;主要是用来避免我们的层数的塌陷;最后一层我们不需要激活函数;那么呢;跟之前的区别是说;我们的超参数有多大;
一个是说我们要选择要多少个隐藏层;第二个是说每个隐藏层它有多大;对吧;这里主要是说我们有三个隐藏层的话;那我们就是说一;我们要选个3这个数字;三个隐藏层;然后每个隐藏层比如说是M1;就是这是M3 M2 M1的话;就是说我们要配置好它;到底每一个层长什么样子;一般来说是有一些;技术的一些经验上的东西;就是说;一般来说是说;你把M1设的稍微大一点点;取决于我们可能会去会讲一下;就说我这里可以给大家简单的讲一下;当你说我越大;我的模型就越复杂对吧;我的模型就越大;所以呢根据你会感觉一下;你的输入的复杂度是;有多少;假设你觉得这个数据比较难的话;
那么呢你就有两个选择;一个选择是说我要把我;还是我用单隐藏层;一个选择;我先行我先不考虑的情况下;假设我要用多层感知机的话;那么呢;我一个选择是说我选单隐藏层;把这个m设的稍微大一点点;假设我输入维度是128;那我说隐藏层我可以做;64也行 128也行;甚至256也行;第二个选择呢;是说我可以把这个模型做的深一点点;就说比如说我就不用单隐藏层;我用三个隐藏层;那就说这有三个;M1 M2 M3;那么就是说我如果觉得之前的模型;单隐藏层模型;我的隐藏层的大小是128的话;那么如果你用三层的话;那当然你你最好不要用都是128;这个就太大了;所以你一般来说是说;相对于单隐藏层模型来讲;我的多隐藏层的M1可能会要小一点点;然后M2呢;又比下面小一点点;M3又比人家小一点点;你可以认为;
为什么会有这样子的一个操作;是说假设你的模型;假设你的数据比较复杂;那么通常来说你的纬度是比较高的;比如说128或者256;那么你的输出相对来说是比较少的;10类或者一类或者五类;就是说你要把一个128维的模输入;然后压缩;压缩压缩到一个;5维或者10维的一个空间的话;就本质上你机器学习就是做压缩对吧;你把一个很复杂图片也好;什么东西也好;压缩到一个一个很简单的一;个输出上面你要做压缩的话那你;你最好是慢慢的把它压缩回去;就说这个是最简单的一个做法;就说128的输入先压到64;再压到32;最后再压到16;然后8 然后最后到你的输出5;这是第一个做法对吧;
这也是一个;就说你不断的把你那个数据;进行提炼;那你还可以说;我可以在最下一层;稍微把那个数据给你expand一下;就你把128;我可以先把你做到256;然后再慢慢把你缩回去;但反过来讲;一般来说;你最下一层你可以稍微胖一点点;没关系就说这个例子;这个例子;我们其实是胖了一点点对吧;对本来是4个输入;我们是拿了5个隐藏层;但是大家不会反过来;你不会把它倒过来;你不会把它先压到2;然后再扩充;因为你压到2的时候;你很有可能损失很多信息;就你压缩太狠;损失的东西的话;你后面再还原是比较难的;但之后我们的cnn的话;大家会看到这种;先压缩再扩张的模型;就是说;你如果做的比较好的话;你这种压缩这种先把它压小一点;再把它扩张;就会避免我们模型态overfill;我们会讲overfill是什么意思;OK这就是;多隐藏层的一些简单的设计思路;
10、总结
总结一下;多层感知机;它其实就是使用一个隐藏层;和激活函数;来得到一个非线性模型;它解决了感知机它是一个线性模型;不能和XOR的一个一个局限性;它通过一个加入隐藏层;再加入一个非线性的激活函数;得到一个非线性性;然后呢它常用的激活函数是sigmoid;Tanh和reLu;一般来说因为reLu很简单;所以大家用reLu是用的比较多一点;所以大家假设没有别的想法的话;就用reLu就行了;如果你要做多分类的问题的话;那你就使用Softmax;那就是跟我们之前Softmax回归;其实是没本质区别;就是在中间加入了隐藏层;我们的超参数就是有隐藏层的层数;就是你要放几个;然后和隐各个隐藏层到底要多大;就是你那个要多宽要多窄;OK这就是多;多层感知机;我们讲了一下;从感知系到多层感知机的概念;;
三、D2L代码注意点
无
四、QA
这里的σ函数并不是激活函数;仅仅是设置的 类似 softmax类型的函数;;是作用到输出层的;
输出层并不需要激活函数的;
问题一是说;x大于0 为什么输出是1;通过设计w和b吗;还是通过训练:?
x大于0的时候;就是说我;我不是说x大于0;是说那个σ;那个函数;然后我可以回到我们的;回到我们的那个;对于说哦不;这个x;和我们的输入x不是一个东西;就老师说;这个x是说这个函数的数x;和这个x本质上不是一个东西;它这个x;其实是说你这个整个这个的计算;所以大家可能;这里有一点点误会;所以是说;但是通过学习WB;使得你进入我们的σ;如果是大于0输出为一;我们分类正确;
第二个问题是说;请问神经网络中的一层网络;到底是指什么;是指一层神经元经过线性变化后;成为一层网络;还是说一层神经元通过线性变化;加非线性;成为一层?
一般来讲;我们是一层;是包括了那个激活函数的;我们回到我们的在这个;换一个比如说一层;通常的一层呢;我们是讲;带权重的一层;所以这里是有两层;所以我们写呢是写三层呢;但实际上呢;说你怎么看呢;看你怎么看都行;一个看法是说;我假设隐藏层;我把一层画在这个地方;就是这是一个layer;这个这个呢;又是一个layer;就是说输入层我就不算成了;因为它就是一个输入;就是没没什么东西;然后它里面包含什么呢;包含你会发;现每一个箭头;这里每一个箭头它就是一个w;一个;其实它每个箭头包括了就是一个;一个可以学习的一个权重;理解吗就是说我们这个隐藏层;因为你的输入是4;输出是5的话;那么它的权重它就是一个4乘以5;或者5乘4;反正正着写反着写都没关系;然后呢就是说;所以你每一个元素它;对呢是这里面的一根箭头;然后呢当然你这里还有一个SEG嘛;对吧你的SEG;你的h是在计划函数之后的;所以我所谓的一层;通常是说;你这个权重;加上你的激活函数;和它的计算是怎么做的;所以这个里面我们说我们要两层;就是意思是说;我们需要两层可以学习的;层里面带了权重了;但以后我们讲卷积成就网络;也是差不多是一个概念;就是一个层;输入层在这个定义里面;输入层我们就不算层了;反过来讲;你也可以说我可以把这个;这我可以把;那我可以把这个东西归入;输入层对吧;那我就是输输出;那我就是不算层;也可以;反正就是你这因为只要两个w在这里;所以你只要两层;OK;
另外一个问题;是说你的数据的区r是怎么测量;或者统计;ρ怎么定;实际中我们确实要找到数据分布的区;可以找到吗;所以呢;所以呢;这个这个就是统计和机器学习的区别;统计我们是不管的;从从统计的角度来讲;我的ρ是定义出;来东西你像数学;我数学我会记;关注你怎么计算吗;我不关注的;我都是假设数据怎么样;假设这个怎么样;所以我的收敛定理;从来都是一个统计上的一个东西;;收敛那一块东西整个是统计上的;统计机器;可以说统计学习吧;嗯但是机器学习呢;或者说深度学习;它可以认为是统计的一个计算面;如果统计;你可以认为是数学的一块的话;那么就是机器学习;对应的是统计的计算机的那一个分支;所以机器学习里面;我们当然就如果是计算;你如果是;学CS的话;你当然不知道ρ怎么算;ρ算起来很难;你当你会去想ρ怎么算;这个怎么算;实际上你算不出来;但我们可以做一点假设;我们可以做人工生成的数据;我是能生成的;但实际上是做不了的;这个只是一个收敛定理;这是一个统计上的一个数学;不能太指导你的实际生产;
问题四是说;请问;是说正是因为感知机只能产生XOR函数;所以人们才会使用SVM吗;嗯;其实感知机这个问题还不是SVM;是是上个世纪90年代出来的感知机;其实那一块;当年 60年代;70年代;基本上被冬天来说;SVM还中间还;其实还有几十年;大家其实后面是慢慢多层感知机应该是在SVM之前的;所以是说;但是呢;我们没有;我们这个课不讲SVM;你可认为是说SVM替代了感知机;不能说是SVM;是因为x叫感知机;多层感知机解决了感知机XOR的问题;但是呢之后没有流行;是因为两个问题;第一你得选;超参数你得选那个;嗯你得选那个;要多个隐藏层;每个隐藏层长多大;那个是老中医了;怎么怎么调这个东西;而且收敛也不好收敛;就是说;我们也知道要调各种学习率;才能收敛;然后呢SVM的好处就是说;它没有那么多超参数可以选;它对超成数不敏感;比如说基于科隆和的SVM;它对它你呢;调宽一点;调窄一点都没关系;第二个是说SVN它优化会;接起来比较容易一点点;相对来说不要;不需要用;SGD或者怎么样;第三个可能更重要的是说;对学术界来讲;假设你两个模型的效果差不多;SVM和多层感知机其实就是在现在;其实也是差不多的;就说我没有说多层感知机会比SVM好;没有了;就是说;如果两个模型在实际效果上都差不多;精度都差不多;可能神经网络还好一点点;就仔细调仔细调能调出来;但是呢SVM用起来更简单;就说不用调那么参数;第二个最重要的是说;SVM它的数学很好;现在之所以说我不建议大家用SVM;也没有说SVM不好;就是说你用MLP的话;你试一下;反正如果你想改成一个别的神经网络;你就是你就改一下模型就过去了;优化算法什么东西都不用变;什么东西都不用变;就是改几行就过去了;但是用SVM的话;整个优化都得换;什么东西都得重新学;所以就是说相对来说没那么容易;所以就是说我们这里只讲了MLP;没有;就是多层感知机没有讲SVM的原因;
另外一个是说;XOR函数有什么应用吗?
没有什么应用;就是我给你;就是我给你;举个反例;就是说是什么意思呢就是;就当年做感知机的一帮人说;我这个东西多多厉害对吧;我硬件给你搭出来了;就是你可以看到说;当年感知机我给你做了个硬件;和现在深度学习用GPU也好;做AI芯片也好;没本质区别;就是你的计算跟不上;我给你搭个硬件;所以呢就是说我们催催催;就跟现在深度学习一样的;就是说我可以给你催催催催催催;说我这个东西多好;但是突然有个人跑过来说;其实你这东西有局限性;我给你举个反例;XOR函数简单吧;你不能不能拟合对吧;就是会给你举个反例;让大家一下;就没人没兴没兴趣了;搞半天简单还是多;不能拟合;所以;但是之后你多层感知机你可以证明;是说只要是只要有一个隐藏层;你是可以拟合一个任意函数的;就理论上;你可以拟合任意函数;就是你和你可以一层感知机;能拟合整个世界;就是理论上;实际上做不到;因为优化算法解不了这实际的问题;
第六个问题;是说假设你的x;x轴是特征一;y轴是特征2;那么红蓝是它的label?
对的是这;样子的就是说这是一个x actor函数;就是你有个你可认为是有两个输入嘛;两个特征;所以它的红和蓝是它的label;就是XOR它的输出;所以它的每一个对应的是一条数据;对吧因为四个点;XOR就四个点就定义好了;对吧所以四个点每个点是一个数据;所以说;就是说;我的Excel函数会通过4个样本来一个;4个样本;每个样本是二维;输出是一个正义负义来给定;所以呢就是说;我对一个很简单的4个样本;两维特征的数;你都不能;拟合就说;所以就说;感知机的局限性;就是你理解是没错的;
第七个问题挺好的;就是说你;为什么神经网络要增加隐藏层的层数;而不是神经元的个数;是不是有些神经元万有近似性质吗?
就说这里是一个很好玩的一个东西;就是说;我回到让我来回到我们的slides;好我们回到这个地方;就是说你;我们刚刚讲过;是说你要两种可能;一个是说你变得很胖;就你变得很;就是说我换两个图;就说一个选择输入你的输入进来;我会用一个很胖的一个东西来学;然后输出;ou和in的话;再就是我做一个窄一点的;带胖一点的东西;我还有个选择;是说我同样的模型;我要达到同样差不多的;就是模型复杂度;我们没有讲模型复杂度;你可以认为简单;认为就是我的模型的能力;就是说我可以;可以说我可以做的;这样子做深一;点对吧;每一层搞小一点;就说这个是out;这个心;就说你有两种做法;一种是但是这两个的模型复杂度;其实可认为是可以几乎是等价的;就是说它的capacity;它几乎几乎认为是相等的;从理论上来讲;我们可以证明;它也可以通过合适的理论上相等;但是问题是这个模型不好训练;就是这哪个模型不好训;这个模型;不好训练;这个模型好训练一些;这就这个模型叫深度学习;这个东西叫深度学习;这个东西叫浅度学习;哈哈就那么点东西;就是说;为什么他好训练一些呢;是因为说这个东西;这个东西特别容易overfitting(过拟合);就特别容易过拟合;因为它就是说;就是说你可以认为;就是说我要一次性吃个胖子;在这个地方;因为他每个神经元是一个并行的东西;就说你说;我所有的并行学东西;每个神经元要协调好;一起大家一起合作;学个东西很难;就说理论上可以;但是我们做不了理论解;对吧实际操作特别难;所以他学习起来不好学;但这个东西呢;就好一点点;就怎么意思呢;就是说你要学一个东西;你要学一个很复杂的东西;你怎么学;你不能一开始就把哐哐哐就跳进去;对吧所以你先从简单开始学;比如说;这举一个十贯上例子;这个东西没有理论依;太多依据;我要学一个;比如说我把一只猫的图片;和一只狗的图片;猫猫猫;比如说这是猫狗;我要学一个猫和狗的一个图片;我最后学学;这是个猫;一个cat一个dog;我要把这个东西把一个;就是我要学一个函数;把它从转过去;我怎么转呢;我我不能一次性转;我先说;我先学一点点;学一点把耳朵学出来;学个嘴巴;耳朵可能学耳朵太难了;就学一点简单东西;然后再学个头;对吧学个头;那就是说每一次每一层;你可以把它;做一个简单点的任务;学一点点东西;然后慢慢慢慢的学的;学的学的;学的越来越好;最后学到我的东西去;就是说这是我们的一个;我们的一个;怎么说呢;就是我们觉得神经网络你应该怎么做;但实际上来说;确实深一点的话;他训练起来方便一点;容易更容易找到一个比较好的解;这就是;为什么叫深度学习;所以整个深度学习;你可认为在2004年之前;跟之前没区别;我们之后会讲到;他跟60年代70年代没本质区别;就是说只是做的更深了;那是因为他更深;所以导致他训练起来更容易;所以就是;效果更好;
来看一下;神经元和卷积核有什么关系;?
神经元和卷积核;我们下次讲;卷积我们;我们会讲卷积是怎么从我们现在的;这个多层感知机器;一直过去的;它其实很容易过去的;一个东西就没什么特别Fancy的;
就Relu为什么管用;它在大于0的部分也是一个线性变化;为什么能促进学习呢?;激活的本质是;什么不是引入非线性性吗?
Relu是一个非线性模型;非线性函数;不是一个线性函数;理解吗;比如说所谓的线性函数是一根线;relu它虽然是个直的;但它不是一根线;它是一个折线;折线不是线性函数;线性函数是;线性函数一定是FX等于ax加上b;这是线性函数;线性函数不管怎么样;它就是一根线;Relu虽然它是一根;它是一根直的;但它不是一根线;它是一个;它是一个这样子的东西;所以它不是一个线性函数;它它是很;它是一个peacewise Linear;它是一个分段线性函数;但它不是线性;所以加入Relu之后;对吧所以确实;激活函数的本质是引入非线性性;他不要干别的事情;就是我们之后会稍微解释一下;激活函数;你可以认为它本质就是把非线性打乱;你可以加一个别的模型;都没关系;就说你可以随便加一个;我可以设计任何东西都行;我可以写一点;可以对吧;哦这个斜线描画好;我可以这么写一点点对吧;我我我往上翘也可以;其实没本质区别;我可以我可以这么来这么去;都没关系都;其实都没关系;不要觉得它很玄乎;它唯一的有关系的是;在我们之后会讲;我们预告太多了;就在这个点的之后;梯度会有一点点影响;但是没本质关系;你可以随便选;
不同任务下的激活函数;是不是都不一样哎;是通过实验来确定的吗?
其实都差不多;哈哈你不要激活函数;我觉得就是说;激活函数;它远远没有选择隐藏层大小;那些超参数来的重量;所以大家就;就用Rule吧;就尽量不要用别的吧;就说就说;你可以选;但本质上没有太多区别;;
模型的深度和宽度哪一个更影响性呢;有理论指导吗;是不是加深哪个更有效;怎么根据输入空间;选择最右的深度和宽度?
确实是说理论上来讲没有区别;但实际上来说;深一点的会好一点点;最优这是个最优;最优就比较难了;没有最优;哈哈哈这个东西哪有最优;你可以我们;我们可能会;你可以我们会;我们会有;比赛大家来试一下;是真的要实际来我的;嗯个人的经验;那假设我有一个数据;嗯假设我有一个数据;我想要去做一个;多层感知机;就也叫MLP吧;multilayer perception;我做一个MLP的话;那我一开始肯定不会做很深;我也不会做很宽;假设我还是举个例子;我的数我的输入假设是128;我的输入假设是128;去简单一点;那么我第一步要干的事情是说;我先我先试一下线性的行不行;你就跑一下嘛;线性就没有隐藏层;接下来呢;我来做一个有隐藏层的;就是把一个隐藏加一个隐藏层;那么加个隐藏层;一开始我不会做很大;我做一个16;因为他是128-2嘛;那么16也不错;我换一下吧;我假设我要把128变到一个2; 128-2;我第一个;第一步我会就直接不要隐藏层;直接128-2直接过去;第二次呢我如果觉得我先试一下;第二次我会加一个隐藏的18;比如说老二我加一个16;然后呢 165会再试32;再试比如说再试64;再试128 都可以;那么这个是第二步;就单隐藏色;我会再去看一下;第三步第三步那么就128;假设我这假设;我是说;128效果不行;16也效果不行;这个太简单;这个太复杂;32-24还可以的话;那么第三次我会加一个两个隐藏层;比如说我还是我是用一个32再加一个8;就新加了一个8在这个地方对吧;比这个32稍微复杂一点;那我当然可以;这个也可以改成16对吧;我这个也可以改成64;我这个改成;我还是用回8176;就是说你可以去多试几次;比如说你没有;就是说你从简单开始;慢慢的把它变复杂;你可以通过加宽;加深都可以;就是说你最后去试一下;最后你就是写一个for loop来变一下;所有东西都训练一遍;就是就完事了;但是这个是你最早;你当然你没有什么想法;怎么做时候你就怎么做;如果你接下来;慢慢的有了一些直观上的理解;这个理解我我当然有一些我的理解;但是我不好直接说出来;因为一不好说出来就不好怎么总结;第二个是说过去获得直觉不一;定是对的;所以大家就是老中医;大家试一遍就有感觉了;OK我们还有挺多问题;
为什么多层感知机后面的W2;W3没有转置?
这个东西看你怎么定义啦;就看你定义是m乘n还是n乘m啦;就有我还没仔细看;也可能我数学是错的;写错了就是说转质没转质都没关系;就是说最后看你是W2是定义是从;顺则来还是竖则来;
第15怎么让感知机理和所有函数;又保持动态性能;就像泛化性能;要打造动态神经网络吗;;要不训练完参数是死永远是死的?
是的训练完之后参数是要固定的;就你不要做动态;为什么不要做动;所谓动态;我理解就是说我给一个新我;我给一个同样的样本;我每次做预测的结果会不一样;那就是动态吧;但是这个不行;那个这个东西会有问题;比如说;Google出过一个很大的事情;在很在很早以前;他的图片的分类;把一个黑人分成一个星星;这是一个非常大的问题;在美国所以说你叫种族歧视嘛;等于是你把你把我;我上传一个股图片的Google;你把我分类成一个新星;我把分类成金丝猴;对不对;那我就不高兴;你千万不能让神经网络在分类的时候;有Ren的;心脏里面有会出问题的;就是说你我;比如说我假设有动态性;那我实际测下来;我自己在自己测没问题;感觉每次都分类正确;但实际上deploy的时候;部署的时候发现有一定随机量;因为我可能长得跟金丝猴就是有点像;它本来两个指很像;但是有一定一定的抖动性;使得我变成金丝猴了怎么办;对吧所以;所以你最好是不要有动态性在里面;
但是反过来讲;你所谓的泛化性就是另外一个东西;就是说所谓的鲁棒性;是说我的假设;我我我我在这里我给我分类;分类正确是人;假设我换一下头或者抬一下头;就变成了金丝猴;那是不行的;这数据有变有干扰;有东西变化时候;我的输入应该是要保持比较稳定的;这个是;我觉得;这个就是要比较重要的一个事情;但这个东西;我们我们这个课不会讲稳定性;讲太多这是一个robustness;是一个比较重要的一个话题;我们会讲一些;就是我们整个神经网络设计都是有;要使得它更稳定;但是实际上稳稳定性是有专门的;现在有一个领域在研究;就还是挺新的一个领域;如果你是想做相关研究的话;我觉得是OK的;而且相对很多来医;医疗无人车稳定性都非常重要;就是说医疗你稳定性没搞好;出人命了;无人车你没搞好;出人命了;
在网络训练中;前几次迭代的训练准确率高于验证机;有什么可以解释的办法吗?
有的;我们会;明天会讲;
在设置隐藏层的时候;会人为固定评估特征的数量;然后再设置层数和单元数吗?
其实这个这个是这个;你会用一个验证数据集来做这个事情;你就说你你;你可以猜;猜完之后你得去试;你真的拿数据去遛一遛对吧;所以这个我们也会讲一下;大概你会怎么样做;调参这个就是调参呐;那调参就是整个是整个神经网络的;机器学习的;整个的一个;就是你数据科学家;80%实验在搞数据;80%实验在调参;