前言
之前我们在讲线性回归的时候用的是单层神经网络模型,也就是没有隐藏层,输入层直接全连接到输出层,也没有激活函数,是一种比较简单的模型,当时我们用随机梯度下降来处理损失函数使得权重值趋向于最优,回忆一下那个公式吧:
这个模型只有一组权重值,用这个公式其实就可以优化出最优权重了。
但我们后面介绍了多层神经网络模型的深度学习算法,我们当时说权重值优化也是用这个公式实现解决的,但我们思考一个问题,比方说我们是一个带一个隐藏层的神经网络模型,那么就有2组权重值吧,W1是输入层到隐藏层用的权重,W2是隐藏层到输出层的权重。
W2直接用上述的公式其实没什么问题,损失函数是输出层的值与真实值的比较,然后对与输出层值有密切关系的权重值W2求导,合情合理。
那么W1呢,W1如果也用上述公式,这个损失函数那就应该用隐藏层的值(也就是输入层通过W1得到的结果)与隐藏层层的真实值的比较,隐藏层的真实值去哪里找,这明显做不了了,那我们之前咋跑出来的结果,实际上我们的算法在对W1优化的时候是这样处理的,这里用的损失函数还是输出层与最后真实值的比较,这个损失函数还是对W1求偏导,不过他们其实好像没什么关系,因此我们用一下链式求导法则,看下图:
这里的t就是指第t层,d是隐藏层的总层数
对于我们这个单隐藏层问题,损失函数对W1求偏导=(损失函数对隐藏层1求偏导)*(隐藏层1对W1求偏导),这就显得合情合理了,不管模型多么复杂,权重值都是通过这种方式实现优化的。
这里就是对之前所讲的一些补充,了解一下这些逻辑也是有帮助的。
我们回到第一个公式,就是优化函数那个式子,我们的权重到底能不能优化,能优化多少,也就是相比上一次的优化结果能起到多少变化主要看的就是后面的偏导结果,那么这个链式中的每一项都是很重要的,如果这个链式中的很多项都小于1,那么这个链式结果最后可能会趋近0,那么对于优化函数来说等于没有优化,因为wt趋近于wt-1了,那么这个链式大多数项大于1的话,这个链式结果又可能太大,导致我们的权重优化非常不稳定,这都是我们不想看到的优化,那么本章就来介绍一些方法避免上述情况发生。
模型优化方法
前言里面主要介绍了一下在较深的神经网络中,底层的权重是如何更新的,是通过链式求导法则求得梯度,更新权重的。
介绍了链式求导法则可能带来的数值不稳定问题,每一链的结果都会影响着权重值的更新。
因此说梯度的值尤为重要,我们希望他稳定,不要过大过小,接下来介绍两种方法控制梯度以达到权重最优。
本文介绍最后一行所提两种方法,其他的将在以后用到的时候介绍。
合理的权重初始化
这里的原理会比较复杂,简单看一下,记住结论尤为重要。
这样做还是为了让梯度能够稳定,使得每一层的输出的均值为0,方差为一个常数。
这里就是说权重值服从独立同分布,权重值的均值是0,方差是一个γt,那么此时输出层的均值就可以得到0了。
再看输出层方差的结果,这是概率论里面的一个公式,根据这个公式可得:
第t层输出层的方差=t-1层的维度t层权重值的方差 t-1层输出层的方差
我们希望得到每一层输出层方差一致,那么可得:
t-1层的维度t层权重值的方差=1 这是一个重要结论
这是反向所求的均值与误差
这里可以得到的结论是t层维度t层权重的方差=1
这里最重要的结论就是上图所示的
t层权重值的方差=(t-1层维度+t层维度)/2 这是最重要的结论
权重均值初始化可以设置0
激活函数的优化
可以得到的结论是,激活函数最好是一个y=x的样子,但是激活函数是为了让我们的模型没有线性化的东西,所以激活函数肯定是非线性的,因此为了又能使激活函数非线性,又能使得激活函数满足y=x的形状,我们这样对激活函数优化。
将激活函数泰勒展开,一个函数泰勒展开后,泰勒展开的前几项其实就可以表达这个函数的大部分意思了,这是高数的一些概念,因此像sigmond,1/2+x/4就可以基本表达这个函数了,其他几个函数类似,可以看到tanh和relu基本上就是一个y=x的样子了,sigmond差点,那么对他稍微做一下调整如上图最后一行所示,那么它就变成了一个类似y=x的形状了。
小结
本文介绍了两种方法,可以使得我们的模型更优。
权重初始化时一定要注意!我们之前的例子,权重都是用均值0方差1来初始化的,从本章开始,我们可以用:
均值0,方差(t-1层维度+t层维度)/2
激活函数的形状要类似y=x那样,relu和tanh基本上可以不改,sigmoid需要微改。
主要的主要还是权重值的初始化,比较重要,上面的原理不太理解没有关系,记住结论,不这样做的话会导致一种现象,上层的权重值更新的还不错,下层的权重值由于多层的链式求导会使得权重值波动大或者权重值无变化。