神经网络模型的效果及优化的目标是通过损失函数来定义的。
1.平方差损失函数
平方差函数是最常用的损失函数,也就是L2 loss再除以2。
E=12(a−y)2 E = 1 2 ( a − y ) 2
其中y是我们期望的输出,a为神经元的实际输出 (
a=σ(Wx+b) a = σ ( W x + b ) ,
σ σ 是激活函数) 。也就是说,当神经元的实际输出与我们的期望输出差距越大,代价就越高。
2.交叉熵损失函数
我们知道,熵的定义公式是:
H(y)=−∑iyilog(yi) H ( y ) = − ∑ i y i l o g ( y i )
交叉熵的定义公式:
H(y,a)=−∑iyilog(ai) H ( y , a ) = − ∑ i y i l o g ( a i )
表示y和a的交叉熵。
如有多个样本,则挣个样本的平均交叉熵为:
H(y,a)=−1n∑n∑iyi,nlog(ai,n) H ( y , a ) = − 1 n ∑ n ∑ i y i , n l o g ( a i , n )
其中n表示样本编号,i表示类别编号。
如果是二分类,则可以表示为:
J(θ)=−1m∑i=1my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))) J ( θ ) = − 1 m ∑ i = 1 m y ( i ) log ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) )
反向求导的过程如下: http://blog.csdn.net/jasonzzj/article/details/52017438
3.SVM Hinge Loss
定义如下:
Li=∑j≠yimax(0,fj−fyi+Δ) L i = ∑ j ≠ y i m a x ( 0 , f j − f y i + Δ )
Δ 代表间隔,一般取1.
直观理解:
多类SVM“想要”正确类别的分类分数比其他不正确分类类别的分数要高,而且至少高出Δ 的边界值。如果其他分类分数进入了红色的区域,甚至更高,那么就开始计算损失。如果没有这些情况,损失值为0。我们的目标是找到一些权重,它们既能够让训练集中的数据样例满足这些限制,也能让总的损失值尽可能地低。
举一个具体的例子:
例子来源于 斯坦福CS231n 课件。第一张图片是猫,神经网络计算得出其三个类别的分值分别为 3.2, 5.1 和 -1.7。很明显,理想情况下猫的分值应该高与其他两种类别,但根据计算结果,car的分值最高,因此在当前的权值设置下,该 network 会把这张图片分类为 car。此时我们可以根据公式计算损失
损失计算如下:(S代表Score,即分值)
Li=max(0,Scar−Scat+Δ)+max(0,Sfrog−Scat+Δ)=2.9+0 L i = m a x ( 0 , S c a r − S c a t + Δ ) + m a x ( 0 , S f r o g − S c a t + Δ ) = 2.9 + 0
梯度求导: http://blog.csdn.net/bcj296050240/article/details/53890704
4.Softmax 交叉熵Loss
Softmax 函数是 Logistic 函数的推广,用于多分类。
定义如下:
Li=−log(efyi∑jefj) L i = − l o g ( e f y i ∑ j e f j )
表示第i个样本的loss,其中
fj f j 表示各类别的score,
fyi f y i 表示该类的得分。
hinge loss和 softmax loss的示例: