深度学习中为何要损失函数

在做深度学习模型训练的时候,我们想要的结果不就是模型的识别率越高越好吗,换句话说我能调参调出识别精度高的参数不就行了吗?搞不懂为啥来定义一个损失函数浪费我内存资源,我们不应该把精力放在如何提高我们模型的识别率做为识别精度指标吗,拿损失函数干啥。

感觉挺有道理的,难道不是吗?

哲学上有一句话说:“任何事物的存在都是有它的道理的”,那损失函数的存在也是有它道理的。对于这个疑(tai)问(gang),可以从“导数”的角度来思考上面的问题。在深度学习的神经网络训练过程中,要去寻找模型中的最优参数时(隐藏层的权重和偏置), 就是去寻找使损失函数的值尽可能小的参数。为了能找到使损失函数的值尽可能尽可能小的地方,就去需要计算参数的导数(梯度),然后以这个导数为指引去逐步更新参数的值。

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

<源于百度百科>

深度学习中为何要损失函数_第1张图片

假设我们正训练一个神经网络模型,此时我们需要关注这个神经网络中的某一个权重参数。这时我开始对该权重参数的损失函数进行求导,它表示的是“如果稍微改变这个权重参数的值,损失函数的值会如何变化”。

如果导数值为负,通过使该权重参数向正方向改变,可以减小损失函数的值;反过来导数值为正, 我们就让该权重参数向负方向改变,来减小损失函数的值。如果导数值为0的话就gg了,因为不管权重参数向哪个方向变化,损失函数的值都不会改变,也就意味着该权重参数的更新的脚步停留在此处。

之所以不能用识别精度作为指标,是因为这样一来绝大多数地方的导数都会变为0,导致参数无法更新。说了这么多术(fei)语(hua),就是想说在进行神经网络的学习时,不能将识别精度作为指标。因为如果以识别精度为指标,则参数的导数在绝大多数地方都会变为0。

那为啥用识别精度作为指标时,参数的导数在绝大多数地方都会变成0。你确定?

深度学习中为何要损失函数_第2张图片

我们来动动手想一下,假设现在有个语音识别的神经网络模型,能够在100个音符的训练集中正确识别出中的66个,此时可以认为识别精度为66%。如果以识别精度为指标来提高精度,那我就开始发动调参大法啦

我东改改、西改改的微调部分权重参数的值,然后精度还是保持在66%,深度学习中为何要损失函数_第3张图片深度学习中为何要损失函数_第4张图片深度学习中为何要损失函数_第5张图片害羞害羞。不要慌,至少我们知道仅仅微调参数,基本上是无法改善识别精度的。就算一脚踩到狗翔,识别精度有所改善,值也不会像66.10%、66.12%、66.15%这样连续变化,而是一会67.2%、一会66.3%或者降下去这种不连续的、离散的变化。就像薛定谔的猫一样,最终结果不跑出来谁也不知道其结果会是什么。

而如果把损失函数作为指标,当前损失函数的值可以表示为0.92543 ... 这样的值。并且,如果稍微改变一下参数的值,对应的损失函数也会像0.93432 ... 这样发生连续性的变化。

识别精度对我的调参大法(参数的微调)基本上没啥反应,即便有它的值也是那种不连续地、突然地变化。作为激活函数的阶跃函数也有同样的情况。出于相同的原因,如果使用阶跃函数作为激活函数,神经网络的学习将无法进行。

深度学习中为何要损失函数_第6张图片

如图所示,阶跃函数的导数在绝大多数地方(除了0以外的地方)均为0。也就是说如果使用了阶跃函数,那么即便将损失函数作为指标,参数的微小变化也会被阶跃函数扼杀在摇篮里,导致损失函数的值不会产生任何变化。

阶跃函数非0即1,变化只在一瞬间。而sigmoid函数不仅函数的输出(竖轴的值)是连续变化的,曲线的斜率(导数)也是连续变化的。也就是说,sigmoid函数的导数在任何地方都不为0。这对神经网络的训练非常重要,得益于这个斜率不会为0的性质,神经网络的训练得以正确进行。

深度学习中为何要损失函数_第7张图片

黑叶猴

        黑叶猴????:黑叶猴的体长约50-60厘米,头小,尾巴较身体长,细长的四肢;头顶有直立的毛冠,体背毛比腹面的毛长而密,臀疣较大;全身黑色有光泽,耳基至两颊有白毛,手足均为黑色。以果实、种子、嫩芽和叶柄为主要食物,也吃鲜枝嫩叶、花苞、竹笋、小鸟及昆虫,食物可达80余种。

        黑叶猴是比较典型的东南亚热带和南亚热带的树栖叶猴。主要栖息于江河两岸和低山沟谷地带的热带雨林、季雨林和南亚热带季风常绿阔叶林。栖息环境的海拔高度不及1200米。分布于缅甸、泰国、老挝,越南。

保护级别:

    EN——濒危物种。

你可能感兴趣的:(算法,神经网络,深度学习,人工智能,机器学习,计算机视觉)