1、监督自己把50多个小时的视频看下去,所以每看一部分内容做一下笔记,我认为这是比较有意义的一件事情。
2、路漫漫其修远兮,学习是不断重复和积累的过程。怕自己看完视频不及时做笔记,学习效果不好,因此想着做笔记,提高学习效果。
3、因为刚刚入门深度学习,听课的过程中,理解难免有偏差,也希望各位大佬指正。
李宏毅老师用比较有趣的方法给我们讲了如何进行模型的优化,仅仅围绕下图展开。
可能出现两个问题,第一个问题是模型很简单,或者是因为optimization的并不好。
解决模型简单的方法当然是把模型调复杂一点,如下图:
当损失较大时如何判断遇到了什么问题,是一个问题,方法如下:
训练数据和测试数据有不同的分布,遇到这种情况后面会将
如何判断是mismatch还是overfitting需要靠个人的经验。
当梯度为0时,可能找到了local minima或者在saddle point。所以如何判断是local minima还是saddle point那?可以用如下方法,这个方法很想泰勒公式,然后用极限的思想去判断正负号。
这里要计算H是什么,H是一个矩阵计算方法下图给出来了,就是算二阶导数。
当计算出H之后,如果是saddle point,那么可以用H来找到更新的方向,这里设计到了一些线性代数的知识点,截图如下:
但是在实际运用上一般不会把H给算出来,因为H的计算量比较大。
从图中可以看出,在低维空间,是local minima在高维空间可能是saddle point。现在的模型参数很多,所以一般saddle point更加常见。在实验的时候其实验证了这个观点。
什么是batch?如下图,每个batch更新一次参数。在batch的时候经常需要shuffle,shuffle的一种方法是每次epoch都重新划分batch。
为什么需要batch那?
大的batch更新的尺度大,方向更加正确,每步走的更加稳;小的batch,是在不断探索,有很多可能性,所以更有可能走到最优解。一般认为大的batch时间长,其实并不是,因为是并行运算,所以其实在一定范围内计算的时间是差不多的。
在实验里小的batch在train里表现得更好,同时当train效果一样时,小的batch在test里面效果更好,如下图。
为什么小的batch更好那?
首先平滑的minima比峡谷里的minima更好,因为当test上的分布有一些不同时,平滑的minima结果不会差很多,但是狭窄的minima结果就会比较差,而小的batch更容易走到平滑的minima。 之后我看了一篇博客?深度学习中的batch的大小对学习效果有何影响?可以总结为一下几点:
因此,batch_size是有一个阙值的,一旦超过这个阙值,模型性能就会退化。通俗解释一下,大的batch_size本质上是对训练数据更优的一种选择,但是同时也会限制模型的探索能力,模型训练的时候极易陷入这种很尖的极小值很难跳脱出来,但是相对小一些的batch_size就很容易能检索到一个非常好的极小值点。
如果有动量也就是update的方向也受上一次update的方向的影响。那么可能能跳出局部最优解。具体做法如下:
在训练的时候loss下降到一定数值后,可能就不在下降了,这个时候一般认为gradient比较小,但是实时并不是这样,可能此时gradient任然比较大,但是在峡谷两边震荡。
按照经验,在平缓的地方learn rate要大一点,而在狭窄的时候,learn rate要小,所以进行一个改进,如下图:
一种方法Adagrad,具体步骤如下,这样就实现了陡峭的地方learn rate 小,平坦的地方learn rate 大。因为当平缓时gradient比较小,所以 σ i t \sigma_i^t σit也比较小,所以最终比较大,反过来狭窄时,一样的理解。
这种自动更新learn rate的方法感觉挺不错的,但是还可以优化,该方法叫RMSProp,具体计算方法如下:
这种方法可以在从狭窄地方到平坦地方时让learn rate快速变大,从平坦的地方到狭窄的地方让learn rate 快速变小,通过调节参数 α \alpha α
现阶段,主要用的优化方法是Adam,pytorch里面已经预置了一定的参数。
用这种方法得到的结果是
因为,当gradient一直非常小的时候 σ i t \sigma_i^t σit就会非常小,然后整体就会非常大,然后就会发生偏差,但是会慢慢训练回去。克服这种方法,可以让learn rate 随时间变化 η t \eta^t ηt,原理和结果如下图:
另外一种策略就是 Warm up,就是 η t \eta^t ηt先从小变大,之后又从大变小,如下图:
这个warm up 在residual network和transformer里又有应用。
老师说的解释是,一开始因为什么信息都没有,所以需要先探索,探索不能走的很快,所以让learn rate从小开始,随着信息地不断收集让learn rate不断变大,之后快到最优解时,learn rate 在变小。一帮常用的优化方法是这样的
这一部分其实之前讲过,其实就是看这个图,也就是MSE在离最优解很远时,gradient非常小,更新不动。
这个是从数据的角度来说的为什么超参数越多越容易overfitting,放一个例子:
抽样数据和全局数据的分布并不一样,所以抽样数据并不好,所以什么样的抽样数据时好的抽样数据吗?这里给了一个定义,并且给出来什么情况下成立。
所以我们得到坏的训练集的概率是多少那?
也就是,因为h让 D t r a i n D_{train} Dtrain变坏的并集,之后进行一个放缩,直接得到结论(下面的第二张图)
对于上面的问题,可以训练资料越多,H的绝对值越小,都可以让simple到坏资料的概率变低。
我们算到的这个是上限,实际可能和上限差距很大,所以一般很少人用这个理论,只是用来解释为什么参数越多越容易过拟合。因为这个上界算出来的值,很多情况下大于1,就等于没有算。
那么如何估算H那?其实我也不会,老师也没有讲,那就截个图把
最后,一般训练数据是一定的,所以当H小的时候可能包含的模型里面没有很好的会让后面的Loss很大,而当H大时,Train data更大概率会取到坏的数据,所以就出现了,鱼和熊掌可以兼得的问题。这个要下节课要讲的
方法如下
首先是要记住什么是链式法则大概张这样。
计算的第一步从这里开始
考虑如何计算红框内的公式。
公式可以分为Forward pass和Backward pass
Forward pass 非常直观解释 x 1 x_1 x1,所以现在主要是算Backward pass。Backward pass的计算公式推导如下:
我们看输出层
输出层的梯度可以很快算出来,但是隐藏层是比较难算的。
所以,我们使用反向传播
先算输出层,然后往前算,这样就可以减少计算量了。所以整个计算梯度的过程是先前向传播,然后反向传播,两个相乘就出来了。
第一步确定模型,这里是线性回归模型。
第二部,定义损失函数
第三步,找到比较好的 W , b W,b W,b
这里涉及到如何找,就是用梯度下降去更新。梯度下降有可能找到局部最优解,但是因为线性回归是类似与等高线,并不存在局部最优解,如图:
改进方法是在第一步定义模型时,把模型弄得更加复杂就可以,但是模型太过于复杂有可能过拟合,如下图:
所以这里可以用到正则化技术,正则化技术就改变损失函数,改变后的损失函数会让模型变得更加平滑,那么为什么平滑的模型更好那?
因为平滑的输出并不非常依赖输入,可以提高扛噪音能力
这里涉及到一个问题,为什么这里正则化没有加上b,因为我们加入正则化是要让函数变平滑,但是这里加上b,只是上下移动,所以没有必要加上去。加入正则化之后的结果
从上图可以看出,我们喜欢平滑的Function,但是并不能太平滑,不然就成一条直线了。
Generative model 需要提前人为设定,数据服从什么分布,这里给的是服从高斯分布。图中四个框里面的先验概率是非常容易算出来的。主要计算的是后验概率。我们假设服从高斯分布:
用最大似然估计去计算高斯分布的概率。
计算公式是可以推导出来,然后计算出来的。但是如果出现了过拟合。
改进方法,这个方法也是一般方法:让两个分布的 ∑ \sum ∑一样,如下图:
改进之后变成了linear model
后面经过了一系列推导,把Generative Model与逻辑斯蒂回归联系起来了,推导过程如下图:
第一步简历Function
第二步定义损失函数,损失函数用的伯努利分布之间的交叉熵
逻辑斯蒂回归和线性归回对比
这里有一个问题,为什么逻辑斯蒂回归不用Square Error。
上面一段数学推导+举例子说明了,如果用Square Error那么离目标进的时候损失小这很OK,但是离目标远的时候损失也小。
在梯度下降的时候,当loss小的时候你并不知道是离目标远还是非常接近目标,很难去找到最优解。
两个模型都是算W和b,但是两个模型找到的W和b并不一样,一般而言判别式模型要比生成式模型好。但是也不一定。
这里老师总结了一下生成式模型的优点
之间上做法
Softmax强化大的值,让大值更大,小值更小。
但是逻辑斯蒂回归做不到异或的任务,因为只是一条直线。
这里可以用Feature Transformation,但是Feature Transformation的设计是人为设计的,并不好想。
这里可以用一层layer来作feature Transformation
最好就变成了神经网络,多堆叠几个layer就成了深度神经网络。
11点开始写,写了两个小时终于写完了,下班,睡觉!