这里是看吴恩达课程的一些记录和联想(因为以前听过,因此不会很细致,只做个人记录)
课程链接
首先提到training set, validation set (dev set),test set的分割问题。老师提到,最常用的划分方法传统方法是三七分(也就是training 70%,validation+test 30%,一般而言validation 20% test 10%),同时,这也是应对数据集不太大的时候的方法。也可以选择不要test set,只使用validation set做模型选择。
如果数据集很大的情况下,不采用三七分也完全可行,因为即使1%的数据量也很大,完全可以用更多的数据训练(比如98%)。
Bias-Variance trade-off
什么情况bias高?什么情况variance高?什么情况应该关注bias?什么情况应该关注variance?什么情况可以允许bias高,优先关注variance?什么情况可以允许variance高,优先关注bias?
简单来说,bias 和variance是用来表征是underfitting还是overfitting的。如上图,简单的判断方法就是,如果训练的效果不好,就是bias高,如果测试的效果不好,就是variance高,当然也有可能两者都低,或者两者都高。
简单来说,Bias可以描述模型的复杂情况(众所周知,模型不是越复杂越好,也不是越简单越好)。通常来说,线性算法比如y=kx+b的bias就会很高,这会导致其易于学习但不善变通。上文所举的例子中也能看出,线性的方法多导致high-bias,甚至已经加了非线性的LR也被归类到high-bias中。
variance就是使用不同的数据(这里不代表使用不同分布的数据,在课程中Ng也提到,在准备训练时,尽可能采用同分布的数据),结果也不一样,也就是我们常说的泛化能力差。一般而言,在bias上表现良好的非线性方法可能在variance上表现不佳。
我们最终的目标是期望找到一个low bias low variance的方法。但是从上面的介绍中可以看出,线性方法多具有high-bias-low-variance(underfitting)的特点,而非线性方法则恰恰相反(overfitting)。因此我们就需要提到bias-variance trade-off。(这里回答了第一个问题,什么情况bias高,什么情况variance高,当然我相信,数据的选取也很重要)
解决方案
简要来说,解决bias高的方法:换模型(换成非线性方法,非线性方法虽然可能导致variance高,但你就说这个bias是不是降下来了),添加特征(也是让模型变复杂),使用boosting方法(boosting属于集成学习方法,个体学习器间存在强依赖关系、必须串行生成的序列化方法)。
解决高variance的方法:降低模型复杂度(越复杂的模型,variance越高),增加数据,使用bagging方法(属于集成学习方法,个体学习器间不存在强依赖关系、可同时生成的并行化方法(如:Bagging和“随机森林”))
本节附录
为什么boosting可以解决high-bias?
大概意思就是通过平均的方法,减少bias。在其他论述中也提到这与boosting独特的串行方法有关,因为每一轮没有得到理想结果的数据都会在下一轮训练中被重点关注。
为什么bagging可以解决high-variance?
bagging取样的方法比较独特,每个模型都在原始数据集的不同部分进行训练,并聚合每个模型产生的预测。
Regularization
是减少variance的方法(之一,可能会增加bias)
什么是Regularization?
常见的方法就L1和L2,具体可以参考LASSO regression,Ridge regression。前者会将权重中的部分打压的很厉害,接近0。Ng提出,很多人认为采用L1 regularization可以减少权重矩阵中需要储存的数据,这样可以节约存储空间,但实际上并没有明显区别。
为什么可以减少variance?
前面提到过,线性方法容易造成high-bias-low-variance,high-bias这种就是underfitting,如果都能够造成underfitting了那肯定就不会overfitting了。无论使用哪种regularization方法,都容易把权重压到0或者近似压到0(L1或L2),就相当于数据走到这里就结束了,复杂的网络被在中途截断,那么也就不再复杂了。
同时当权重小的时候,也会带着每个node输出(下一层的输入)变小,z在较小的范围中近似于线性函数,如果每一层都是线性函数,最后组合出来的模型也就是个线性模型。因此采用这种方法本质上就是降低了非线性(复杂度),让模型变得简单,自然就不容易overfitting了。
Dropout regularization
随机失活
0.5 chance of keeping each node and 0.5 chance of removing each node.这里0.5就是keep-prop。
在课程中Ng给的例子是,先用np.random.rand创建一个随机矩阵,设定一个阈值比如np.random.rand<0.5,此时矩阵变成了一个Boolean矩阵,再将其与输入数据相乘(注意这里既然要相乘就是要大小相等了),相当于给输入的数据蒙上一层面具,值为1的地方能看到输入的数据,值为0的地方这个输入值就被失活了。
然后我们就得到了一个更简单的更小的网络。
inverted dropout
最常用的dropout方法。
其他Regularization方法
data augmentation
early stopping
Vanishing/Exploding Gradients
当训练深度网络时,有时导数会变得非常大/小(指数级别的大/小),这会为训练增加难度。
假设如上图,每个权重矩阵都是w^[l],那么到后面1.5^L就会非常大,类似的,假设权重里的数小,最后的结果就会非常小。
解决方案
使用别的激活函数,使用ResNet,批处理归一化(亦有提到在初始化时更谨慎)
解决方案
类似的提出的方法,使用LSTM,regularization,梯度剪切(不给膨胀空间)
Initialization
在课程中Ng也给出了可以在一定程度上解决这些问题的方法:carefully choose the initial weights(指random initialization)
Xavier Initialization
为什么需要initialization?
在前文中也提到了,initialization对于缓解梯度的消失/爆炸有着一定的作用,但是也不能随意初始化。
如果把weights初始化的太小,输入随着层数的深入,variance会减小。比如用sigmoid函数作为激活函数,此函数在0的附近近似线性,在之前的内容中提到过,如果每层都近似线性,那么整个网络的模型都近似线性,线性模型属于high-bias-low-variance,虽然variance减小了,但是这个时候使用深层网络就没什么意义了,反正最后还是线性模型。(失去非线性,失去更复杂的特征,失去深层网络的作用)
如果weight太大,那么非线性增加,模型更加复杂,variance增加。但是此时sigmoid函数开始趋于平坦,没有显著的变化,那么梯度也不会有显著的变化(趋近于0),此时再想gradient descend就不太能descend了。
可以参考这里的动态演示https://www.deeplearning.ai/ai-notes/initialization/index.html
这里举了一个例子,当我们初始化时将所有的weights都初始化为一个相同的值,那么每个输入对结果的贡献都是相同的,在后续更新参数的时候可能就不会区分具体的节点(反正都一样)。
什么是Xavier initialization
Xavier initialization是一种初始化方法。,采用高斯分布去分配weights。对于每一层,我们希望方差保持不变。这有助于我们防止explode/vanish。换句话说,我们需要初始化权重,使x和y的方差保持不变。高斯分布:均值为0,方差为一个有限值。
Xavier initialization怎么做
要求:
1. activations的平均值应该是零。
2. 在每一层中,activations的方差应该保持相同。
所有层的权值都是从正态分布中随机抽取的(特别说明,正态分布=高斯分布),并且要维持均值为0,方差为某特定值(该值与当前层所拥有的neuron个数相关),bias初始化为0
He Initialization
什么是He Initialization
首先pytorch支持这种初始化方法,具体可以参考https://pytorch.org/docs/stable/nn.init.html
这个函数的名字也很明确,这一方法来源于kaiming he
本节附录
如何判断是vanish还是explode?
消失:后面的parameter变,前面的几乎不变;前几层就已经是0了;训练的慢或者干脆不动了;模型效果差劲
爆炸:模型的权重、损失变成NaN
————————————————————————
暂停更新,跑路去听NLP了,听完会回来继续的
参考资料
https://www.pnas.org/doi/10.1073/pnas.1903070116#:~:text=The%20bias%E2%80%93variance%20trade%2Doff%20implies%20that%20a%20model%20should,to%20avoid%20fitting%20spurious%20patterns.
https://machinelearningmastery.com/gentle-introduction-to-the-bias-variance-trade-off-in-machine-learning/
https://www.javatpoint.com/bias-and-variance-in-machine-learning
https://towardsdatascience.com/understanding-the-bias-variance-tradeoff-165e6942b229
https://www.cs.cornell.edu/courses/cs4780/2018fa/lectures/lecturenote12.html
https://stats.stackexchange.com/questions/552356/boosting-reduces-bias-when-compared-to-what-algorithm
https://www.techopedia.com/7/33193/why-does-bagging-in-machine-learning-decrease-variance
https://www.quora.com/What-is-the-reason-that-Bagging-Bootstrap-Aggregation-reduces-variance-more-than-bias-for-regression-models
https://machinelearning.wtf/terms/inverted-dropout/
https://stats.stackexchange.com/questions/207481/dropout-backpropagation-implementation
https://stats.stackexchange.com/questions/205932/dropout-scaling-the-activation-versus-inverting-the-dropout
https://deepai.org/machine-learning-glossary-and-terms/vanishing-gradient-problem
https://www.educative.io/answers/what-is-the-vanishing-gradient-problem
https://towardsdatascience.com/the-vanishing-gradient-problem-69bf08b15484
https://deepai.org/machine-learning-glossary-and-terms/exploding-gradient-problem
https://machinelearningmastery.com/exploding-gradients-in-neural-networks/
https://neptune.ai/blog/vanishing-and-exploding-gradients-debugging-monitoring-fixing
https://prateekvjoshi.com/2016/03/29/understanding-xavier-initialization-in-deep-neural-networks/
https://365datascience.com/tutorials/machine-learning-tutorials/what-is-xavier-initialization/
https://paperswithcode.com/method/xavier-initialization#:~:text=Xavier%20Initialization%2C%20or%20Glorot%20Initialization,a%20n%20o%20u%20t%20%5D
https://www.deeplearning.ai/ai-notes/initialization/index.html
https://paperswithcode.com/method/he-initialization
Weight Initialization for Deep Learning Neural Networks - MachineLearningMastery.com