当我们遇到loss的参数无法更新到更小的时候,往往不是遇到了critical point的情况。这里的可能是我们的n(learning rate)太大了,导致在山谷(中间是loss更低的地方,两边是loss很高的地方)两边来回晃荡。当我们调整n为10^(-7)的时候,这时候n已经很小了,虽然到了低点,但是想要向minimal 靠近也很难(步伐很小)。这里,我们就需要进行gradient descend模型的改进。我们要给不同的参数设置不同的n,在坡度(gradient)很小的地方,得到小的o,步伐就会大;在坡度很大的时候,得到的o大,步伐就会小。
在同一个参数,同一个方向,希望n可以动态调整。这里有一个方法RMSProp。
通过a可以决定g的权重 。
这里有一个optimization的方法:
用上述的方法之后,虽然解决了参数不能到准确位置的问题,但是又出现了另外的问题。当我们向左走的时候,纵轴的θ一直很小,但是会积累,导致o在某些时刻会变大,但是又能限制回来。
在我们的式子里面,n原来是一个常数,但是如果加上时间的限制之后,我们能够解决上面的问题。让n跟时间有关,当时间增长,n会变小。这个方法是Learning rate delay
除了这个方法之后,我们还有一个方法warm up
这里还有个改进方法
classification分类
在这里我们希望在分类的时候输出一个向量(one-hot vector 只有0和1的值),这就要我们在模型输出三个y。
一般来说,我们在做regression的时候输出的y会有任何值的情况(可能大于1也可能小于0)。这时候我们用上面这个模型,产生了三个输出,但是这三个输出和regression没有什么区别,还是可能为任何值,那么我们怎么区别他们是哪一个类呢?这里我们就需要在输出y的时候进行normal化(让值限制在0-1之间)。这个时候,我们就可以判断这个值是更趋向0还是1,但是不用担心,所有的输出y相加总是1,不存在全0的情况。那么我们就可以根据向量的值判断这个预测是更偏向哪一个类型了!
如果我们有两个类别的时候,我们也可以使用sigmoid
在这里,分类问题往往更常用的方法是cross-entropy(pytorch会默认使用softmax)
MSE所在地方比较平坦,会卡住不动。而在cross-entropy的地方会有一个梯度,就能很快减小loss。
再探宝可梦
参数越多,越有可能会overfit。
hall是最好的,这里htrain1比较好的原因是数据集比较小,没有覆盖完整的数据。
我们想要小的H和精确度都高的情况,需要用到深度学习。