平方损失函数更适合输出为连续,且最后一层没有sigmoid或者softMax激活函数的网络
交叉熵损失函数更适合分类场景
假设网络最后一层输出为zlz^lzl,激活函数为f(x)=sigmoid(x)f(x)=sigmoid(x)f(x)=sigmoid(x),预测的label为a=f(zl)a = f(z^l)a=f(zl),真实标签为yyy。
平方损失函数L=12(y−a)2L = \frac{1}{2}(y-a)^2L=21(y−a)2相对于输出层zlz^lzl的导数为
∂L∂zl=−(y−a)f′(zl)\frac{\partial L}{\partial z^l} = -(y-a)f^{'}(z^l)∂zl∂L=−(y−a)f′(zl)
最后一项为激活函数的导数,当激活函数为sigmoidsigmoidsigmoid的时候,如果zlz^lzl足够大,函数的梯度会趋于饱和,也就是f′(zl)f^{'}(z^l)f′(zl)的绝对值非常小,造成学习变慢
当使用交叉熵损失函数L=−ylog(a)−(1−a)log(1−a)L = -ylog(a) - (1-a)log(1-a)L=−ylog(a)−(1−a)log(1−a)的时候,对于输出层zlz^lzl的导数为
∂L∂zl=(−ya+1−y1−a)f′(zl)\frac{\partial L}{\partial z^l} = (-\frac{y}{a} + \frac{1-y}{1-a})f^{'}(z^l)∂zl∂L=(−ay+1−a1−y)f′(zl)
当激活函数为sigmoid的时候,
∂L∂zl=(−ya+1−y1−a)a(1−a)=a−y\frac{\partial L}{\partial z^l} = (-\frac{y}{a} + \frac{1-y}{1-a})a(1-a) = a-y∂zl∂L=(−ay+1−a1−y)a(1−a)=a−y
导数是线性的,不会存在学习过慢的问题
欢迎关注微信公众号(算法工程师面试那些事儿),本公众号聚焦于算法工程师面试,期待和大家一起刷leecode,刷机器学习、深度学习面试题等,共勉~