代价函数

二次代价函数(quadratic cost)

image-20200528120907105

其中,C代表代价函数,x代表样本,y表示实际值,a表示输出值,n表示样本的总数。

相当于把误差的平方加起来再除以一个总数。

以一个样本为例:

image-20200528121549753

image-20200528121411995

image-20200528121947827

z表示神经元的输入,σ表示激活函数。w和b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,w和b的大小调整得越快,训练收敛得就越快。假设我们的激活函数是sigmoid函数:

image-20200528143620424

假设我们目标是收敛到1.0。1点为0.82离目标比较远,梯度比较大,权值调整比较大。2点为0.98离目标比较近,梯度比较小,权值调整比较小。调整方案合理。
假如我们目标是收敛到0。1点为0.82目标比较近,梯度比较大,权值调整比较大。2点为0.98离目标比较远,梯度比较小,权值调整比较小。调整方案不合理。

交叉熵代价函数(cross-entropy)

换一个思路,我们不改变激活函数,而是改变代价函数,改用交叉熵代价函数:

image-20200528123023183

其中,C代表代价函数,x代表样本,y表示实际值,a表示输出值,n表示样本的总数。

image-20200528123222414image-20200528123254307

image-20200528123309837

对于交叉熵代价函数:(输出值即为预测值)

image-20200528123622492

(S型函数,如sigmoid函数、双曲正弦等等)

对数似然代价函数(log-likelihood cost)

对数似然函数常用来作为softmax回归的代价函数,如果输出层神经元是sigmoid函数,可以采用交叉熵代价函数。而深度学习中更普遍的做法是将softmax作为最后一层,此时常用的代价函数是对数似然代价函数。

对数似然代价函数与softmax的组合和交叉熵与sigmoid函数的组合非常相似。对数似然代价函数在二分类时可以简化为交叉熵代价函数的形式。

在Tensorflow中,用:

1
2
tf.nn.sigmoid_cross_entropy_with_logits()来表示跟sigmoid搭配使用的交叉熵
tf.nn.softmax_cross_entropy_with_logits()来表示跟softmax搭配使用的交叉熵

关于softmax函数和sigmoid函数,可参考:

https://cloud.tencent.com/developer/article/1092667

1.Sigmoid函数

Sigmoid函数是一个在生物学中常见的S型的函数,也称为S型生长曲线。Sigmoid函数常被用作神经网络的阈值函数,将变量映射到0,1之间。

1.1公式

image-20200528142355314

其对x的导数可以用自身表示:

image-20200528142519308

1.2python实现

1
2
3
4
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1.0/(1+np.exp(-x))

1.3函数图像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1.0/(1+np.exp(-x))

sigmoid_inputs = np.arange(-10,10)
sigmoid_outputs=sigmoid(sigmoid(sigmoid_inputs))
print("Sigmoid Function Input :: {}".format(sigmoid_inputs))
print("Sigmoid Function Output :: {}".format(sigmoid_outputs))

plt.plot(sigmoid_inputs,sigmoid_outputs)
plt.xlabel("Sigmoid Inputs")
plt.ylabel("Sigmoid Outputs")
plt.show()

image-20200528142712145

2.softmax函数

在数学,尤其是概率论和相关领域中,softmax函数,或称归一化指数函数
,是逻辑函数的一种推广。它能将一个含任意实数的K维的向量z的“压缩”到另一个K维实向量σ(z) 中,使得每一个元素的范围都在(0,1)之间,并且所有元素的和为1。

2.1公式

image-20200528143027539

在多项逻辑回归和线性判别分析中,函数的输入是从K个不同的线性函数得到的结果,而样本向量 x 属于第 j 个分类的概率为:

image-20200528143059592

这可以被视作K个线性函数x→xTw1,…,→xTwK softmax函数的复合(xTwxw)

2.2python实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np

def softmax(x):
orig_shape=x.shape
if len(x.shape)>1:
#Matrix
#shift max whithin each row
constant_shift=np.max(x,axis=1).reshape(1,-1)
x-=constant_shift
x=np.exp(x)
normlize=np.sum(x,axis=1).reshape(1,-1)
x/=normlize
else:
#vector
constant_shift=np.max(x)
x-=constant_shift
x=np.exp(x)
normlize=np.sum(x)
x/=normlize
assert x.shape==orig_shape
return x

2.3函数图像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def softmax(x):
orig_shape=x.shape
if len(x.shape)>1:
#Matrix
#shift max whithin each row
constant_shift=np.max(x,axis=1).reshape(1,-1)
x-=constant_shift
x=np.exp(x)
normlize=np.sum(x,axis=1).reshape(1,-1)
x/=normlize
else:
#vector
constant_shift=np.max(x)
x-=constant_shift
x=np.exp(x)
normlize=np.sum(x)
x/=normlize
assert x.shape==orig_shape
return x

softmax_inputs = np.arange(-10,10)
softmax_outputs=softmax(softmax_inputs)
print("Sigmoid Function Input :: {}".format(softmax_inputs))
print("Sigmoid Function Output :: {}".format(softmax_outputs))
# 画图像
plt.plot(softmax_inputs,softmax_outputs)
plt.xlabel("Softmax Inputs")
plt.ylabel("Softmax Outputs")
plt.show()

image-20200528143302951