深度学习(22)神经网络与全连接层五: 误差计算
Outline
- MSE
- Cross Entropy Loss
- Hinge Loss
∑ i m a x ( 0 , 1 − y i ∗ h θ ( x i ) ) ∑_imax(0,1-y_i*h_θ (x_i)) i∑max(0,1−yi∗hθ(xi))
1. MSE
- l o s s = 1 N ∑ ( y − o u t ) 2 loss=\frac{1}{N} ∑(y-out)^2 loss=N1∑(y−out)2
-
L
2
−
n
o
r
m
=
∑
(
y
−
o
u
t
)
2
L_{2-norm}=\sqrt{∑(y-out)^2 }
L2−norm=∑(y−out)2
(a)y = tf.constant([1, 2, 3, 0, 2])
: 创建Label(标签)值集y;
(b)y = tf.one_hot(y, depth=4)
: 将y进行one-hot编码; depth=4代表一共有5位编码;
(c)y = cast(y, dtype=tf.float32)
: 将y的数据类型转换为float32,以便能和out进行数学运算;
(d)out = tf.random.normal([5, 4])
: 创建输出值(即预测值)集out;
(e)loss1 = tf.reduce_mean(tf.square(y-out))
: 利用
l
o
s
s
=
1
N
∑
(
y
−
o
u
t
)
2
loss=\frac{1}{N} ∑(y-out)^2
loss=N1∑(y−out)2计算损失值loss;
(f)loss2 = yf.square(tf.norm(y-out))/(5*4)
: 利用
L
2
−
n
o
r
m
=
∑
(
y
−
o
u
t
)
2
L_{2-norm}=\sqrt{∑(y-out)^2 }
L2−norm=∑(y−out)2,即二范数计算损失值
l
o
s
s
loss
loss;
(g)loss3 = tf.reduce_mean(tf.losses.MSE(y, out))
: 利用MSE函数计算损失值
l
o
s
s
loss
loss;
注: 这里返回的值并不是一个标量,而是一个shape=[b]的Tensor。
2. Entropy(熵)
- Uncertainty
不确定性 - measure of surprise
“惊喜度”的数值。熵值越低,“惊喜度”越高; 熵值越高,“惊喜度越低”; - lower entropy
→
\to
→ more info
更低的熵值 → \to → 更多的信息;
E n t r o p y = − ∑ i P ( i ) log P ( i ) Entropy=-∑_iP(i)\log{P(i)} Entropy=−i∑P(i)logP(i)
C l a u d e S h a n n o n Claude\ Shannon Claude Shannon
Lottery
(a)a = tf.fill([4], 0.25)
: 创建一个shape=[4],元素值都为0.25的Tensor;
(b)a*tf.math.log(a)/tf.math.log(2.)
: 因为TensorFlow2中没有
log
2
n
\log_2n
log2n的API,只有
log
e
n
\log_en
logen,而entropy使用的是
log
2
n
\log_2{n}
log2n,所以根据:
log
e
a
log
e
b
=
log
b
a
\frac{\log_ea}{\log_eb}=\log_ba
logeblogea=logba
可得:
log
e
a
log
e
2
=
log
2
a
\frac{\log_ea}{\log_e2}=\log_2a
loge2logea=log2a
那么a*tf.math.log(a)/tf.math.log(2.)
就为
a
∗
log
2
a
a*\log_2a
a∗log2a;
(c)-tf.reduce_sum(a*tf.math.log(a)/tf.math.log(2.))
: 求其entropy值,即:
E
n
t
r
o
p
y
=
−
∑
i
P
(
i
)
log
P
(
i
)
Entropy=-∑_iP(i)\log{P(i)}
Entropy=−i∑P(i)logP(i)
可以看到其熵值为2,较大,那么其“惊喜度”较小,我们能从中获得的信息也较少;
(d)a = tf.([0.1, 0.1, 0.1, 0.7])
: 如果输入值为[0.1, 0.1, 0.1, 0.7],计算其熵值为1.3567796,那么其“惊喜度”较熵为2时8大,我们能从中获得的信息也较熵为2时多;
(e)a = tf.([0.01, 0.01, 0.01, 0.97])
: 如果输入值为[0.01, 0.01, 0.01, 0.97],计算其熵值为0.24194098,那么其“惊喜度”较熵为1.3567796时大,我们能从中获得的信息也较熵为1.3567796时多;
3. Cross Entropy
H
(
p
,
q
)
=
−
∑
p
(
x
)
log
q
(
x
)
H(p,q)=-∑p(x)\log{q(x)}
H(p,q)=−∑p(x)logq(x)
H
(
p
,
q
)
=
H
(
p
)
+
D
K
L
(
p
∣
q
)
H(p,q)=H(p)+D_{KL}(p|q)
H(p,q)=H(p)+DKL(p∣q)
其中,
D
K
L
(
p
∣
q
)
D_{KL}(p|q)
DKL(p∣q)为散度,是衡量
p
p
p和
q
q
q之间的距离的标准; 当
p
=
q
p=q
p=q时,
D
K
L
(
p
│
q
)
=
0
D_{KL}(p│q)=0
DKL(p│q)=0;
- for
p
=
q
p=q
p=q
- Minima: H ( p , q ) = H ( p ) H(p,q)=H(p) H(p,q)=H(p)
- for
p
p
p: one-hot encoding
- h ( p : [ 0 , 1 , 0 ] ) = − 1 log 1 = 0 h(p:[0,1,0])=-1\log1=0 h(p:[0,1,0])=−1log1=0
- H ( [ 0 , 1 , 0 ] , [ p 0 , p 1 , p 2 ] ) = 0 + D K L ( p │ q ) = − 1 log q 1 H([0,1,0],[p_0,p_1,p_2 ])=0+D_{KL}(p│q)=-1\log{q_1} H([0,1,0],[p0,p1,p2])=0+DKL(p│q)=−1logq1
- 注: 这里“1”是指
p
p
p的one-hot编码中只有1个1,其余都是0;
q
1
q_1
q1是指如果当前节点label值为i的话,那么在
i
i
i号节点输出的概率就为
q
1
q_1
q1,即
p
(
y
=
i
│
x
)
p(y=i│x)
p(y=i│x),也就是说,当
p
(
y
=
i
│
x
)
=
1
p(y=i│x)=1
p(y=i│x)=1时,预测值就等于标签值;
这里也能看出如果预测值 [ p 0 , p 1 , p 2 ] [p_0,p_1,p_2] [p0,p1,p2]与真实值(标签值) [ 0 , 1 , 0 ] [0,1,0] [0,1,0]相等的话,那么其交叉熵值为0,否则就会退化为 D K L ( p │ q ) D_{KL}(p│q) DKL(p│q); 所以我们将交叉熵作为 l o s s loss loss的优化目标是完全合理的。
4. Binary Classification
Two cases
(a) 多个输出(判断目标属于哪类)
-
o
u
t
out
out:
- p ( y = 0 ∣ x ) p(y=0|x) p(y=0∣x)
- p ( y = 1 ∣ x ) p(y=1|x) p(y=1∣x)
(b) 单一输出(判断目标是否属于一类)
-
o
u
t
out
out:
- p ( y = 1 │ x ) p(y=1│x) p(y=1│x)
5. Single output(单一输出)
这里模型的输出(即
o
u
t
out
out)为目标是猫的概率(即
p
(
c
a
t
)
p(cat)
p(cat));
H
(
P
,
Q
)
=
−
P
(
c
a
t
)
log
Q
(
c
a
t
)
−
(
1
−
P
(
c
a
t
)
)
log
(
1
−
Q
(
c
a
t
)
)
H(P,Q)=-P(cat)\log{Q(cat)}-(1-P(cat))\log{(1-Q(cat))}
H(P,Q)=−P(cat)logQ(cat)−(1−P(cat))log(1−Q(cat))
P
(
d
o
g
)
=
(
1
−
P
(
c
a
t
)
)
P(dog)=(1-P(cat))
P(dog)=(1−P(cat))
H
(
P
,
Q
)
=
−
∑
i
=
(
c
a
t
,
d
o
g
)
P
(
i
)
log
Q
(
i
)
=
−
P
(
c
a
t
)
log
Q
(
c
a
t
)
−
P
(
d
o
g
)
log
Q
(
d
o
g
)
=
−
(
y
log
(
p
)
+
(
1
−
y
)
log
(
1
−
p
)
)
H(P,Q)=-∑_{i=(cat,dog)}P(i)\log{Q(i)} \\ =-P(cat)\log{Q(cat)}-P(dog)\log{Q(dog)} \\ =-(y\log{(p)}+(1-y)\log{(1-p)})
H(P,Q)=−i=(cat,dog)∑P(i)logQ(i)=−P(cat)logQ(cat)−P(dog)logQ(dog)=−(ylog(p)+(1−y)log(1−p))
如果
y
(
c
a
t
)
=
1
y(cat)=1
y(cat)=1,
H
(
P
,
Q
)
=
−
log
(
p
)
H(P,Q)=-\log{(p)}
H(P,Q)=−log(p);
如果
y
(
c
a
t
)
=
0
y(cat)=0
y(cat)=0,
H
(
P
,
Q
)
=
−
log
(
1
−
p
)
H(P,Q)=- \log{(1-p)}
H(P,Q)=−log(1−p);
6. Classification(多分类问题)
-
H
(
[
0
,
1
,
0
]
,
[
p
0
,
p
1
,
p
2
]
)
=
0
+
D
K
L
(
p
│
q
)
=
−
1
log
q
1
H([0,1,0],[p_0,p_1,p_2 ])=0+D_{KL} (p│q)=-1\log{q_1}
H([0,1,0],[p0,p1,p2])=0+DKL(p│q)=−1logq1
也就是说,如果输入值的标签为
x
=
1
x=1
x=1的话,那么输出值为1的节点(
o
u
t
p
u
t
[
1
]
output[1]
output[1])的
q
1
=
−
log
(
y
=
1
∣
x
)
q_1=-\log{(y=1|x)}
q1=−log(y=1∣x);
q
1
q_1
q1越大,越接近1,那么交叉熵
H
(
[
0
,
1
,
0
]
,
[
p
0
,
p
1
,
p
2
]
)
H([0,1,0],[p_0,p_1,p_2 ])
H([0,1,0],[p0,p1,p2])就越接近0;
例子:
P 1 = [ 1 0 0 0 0 ] P_1=[1 \quad 0\quad 0 \quad0 \quad 0] P1=[10000]
-
Q
1
=
[
0.4
0.3
0.05
0.05
0.2
]
Q_1=[0.4 \quad0.3 \quad 0.05\quad 0.05 \quad 0.2]
Q1=[0.40.30.050.050.2]
当 Q 1 Q_1 Q1的置信度并不是很高时(0.4与0.3相差不明显),其交叉熵:
H ( P 1 , Q 1 ) = − ∑ i P 1 ( i ) log Q 1 ( i ) = − ( 1 log 0.4 + 0 log 0.3 + 0 log 0.05 + 0 log 0.05 + 0 log 0.2 ) = − log 0.4 ≈ 0.916 H(P_1,Q_1 )=-∑_iP_1 (i)\log{Q_1 (i)} \\=-(1\log0.4+0\log0.3+0\log0.05+0\log0.05+0\log0.2) \\=-\log0.4 \\≈0.916 H(P1,Q1)=−i∑P1(i)logQ1(i)=−(1log0.4+0log0.3+0log0.05+0log0.05+0log0.2)=−log0.4≈0.916 -
Q
1
=
[
0.98
0.01
0
0
0.01
]
Q_1=[0.98 \quad 0.01\quad 0 \quad 0 \quad0.01]
Q1=[0.980.01000.01]
当 Q 1 Q_1 Q1的置信度很高时(0.98明显远大于其它概率),其交叉熵:
H ( P 1 , Q 1 ) = − ∑ i P 1 ( i ) log Q 1 ( i ) = − ( 1 log 0.98 + 0 log 0.01 + 0 log 0 + 0 log 0 + 0 log 0.01 ) = − log 0.98 ≈ 0.02 H(P_1,Q_1 )=-∑_iP_1 (i)\log{Q_1 (i)} \\=-(1\log0.98+0\log0.01+0\log0+0\log0+0\log0.01) \\=-\log0.98 \\≈0.02 H(P1,Q1)=−i∑P1(i)logQ1(i)=−(1log0.98+0log0.01+0log0+0log0+0log0.01)=−log0.98≈0.02
可以看到,经过优化后的 l o s s loss loss明显更接近于0,分类更加明显;
7. Categorical Cross Entropy(交叉熵计算)
(1) tf.losses.categorical_crossentropy([0, 1, 0, 0], [0.25, 0.25, 0.25, 0.25])
: 交叉熵计算,预测正确,但其置信度不高,所以交叉熵较高,为1.3862944;
(2) tf.losses.categorical_crossentropy([0, 1, 0, 0], [0.1, 0.1, 0.7, 0.1])
: 交叉熵计算,预测错误,所以交叉熵非常高,为2.3978953;
(3) tf.losses.categorical_crossentropy([0, 1, 0, 0], [0.1, 0.7, 0.1, 0.1])
: 交叉熵计算,预测正确,其置信度较高,所以交叉熵较低,为0.35667497;
(4) tf.losses.categorical_crossentropy([0, 1, 0, 0], [0.01, 0.97, 0.01, 0.01])
: 交叉熵计算,其置信度非常高,所以交叉熵非常低,为0.030459179;
不同的调用方法:
(5) criteno([0, 1, 0, 0], [0.1, 0.7, 0.1, 0.1])
: criteno为BinaryCrossentropy类的实例,作用也是计算交叉熵;
(6) tf.losses.BinaryCrossentropy()([1], [0.1])
: 表示计算交叉熵,其中第2个元素为1的概率为0.1,这个预测是错误的,所以其交叉熵很高;
(7) tf.losses.binary_crossentropy()([1], [0.1])
: 作用与tf.losses.BinaryCrossentropy()([1], [0.1])
一样;
8. Why not MSE?
(1) sigmoid + MSE
- gradient vanish
如果使用sigmoid + MSE的更新方法,很容易出现梯度消失问题,即当值很大或者很小时,梯度为0,这样的话更新会非常慢;
(2) converge slower
收敛速度更慢;
(3) However
- e.g. meta-learning
有些前沿学科,例如meta-learning,使用MSE更加科学。所以使用哪种损失函数计算方法取决于我们的应用,以及我们的经验。
9. Number Stability
logits
→
\to
→ CrossEntropy
为了数值稳定,需要设置参数: from_logits=True
;
(1) tf.losses.categorical_crossentropy([0, 1], logits, from_logits=True)
: 这里要注意两点,一是必须要将输入进行one-hot编码操作,即[0, 1],二是传入的数据必须是logits,而不能是softmax处理过的数据,而且要设置参数from_logits=True
,这样做是为了防止出现数据不稳定的情况;
(2) tf.losses.categorical_crossentropy([0, 1], prob)
: 当然也可以经过softmax处理过的数据,即将prob传入,也就是设置from_logits=False
,但是不推荐这样做,因为会出现数值不稳定的问题。
附录: 关于信息熵的思考
作者:钱彦波
链接:link.
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这个问题我觉得大家理解混淆了。。。
首先大家不要把信息熵理解成信息本身了,其实对信息熵来讲(当然大家不要把这个直接当成热力学的熵),其表示的是某一事件的不确定性,而信息的作用就是用于降低这种不确定性,其中输入的信息量就等于该事件不确定性减少的大小,也就是熵减少的大小,所以熵本身不是对信息量的一个度量,而是对事件不确定性的一个度量,而熵减才是对信息量的度量。当然如果某个输入的信息并没有减少熵,那么说明输入的可能是噪音。
下面我举一个例子给大家来直观的理解一下什么是信息熵和信息量。
首先我们需要想一下的我们应该怎么样去度量一个属性,比如质量我们用的是kG,长度我们用的是m,但是如果我们问你什么是1kg的时候,其实你会很迷茫,因为确实不知道什么样才是1kg。其实不是说这个世界上原本就存在1kg,而是我们为了方便,比如规定了某一块石头的质量是1kg,而我们在度量其他物理质量的时候,就以这块石头为标准,比如一张桌子的质量等于30块这样石头的质量,所以我们就说这张桌子的质量我30kg。
同样的对于不确定性的度量也一样,我们必须定义一个标准,从而对不确定性进行度量。那么这个不确定性怎么去定义呢?最简单的,我们抛一枚硬币,其可能产生两种情况(一种正面,一面反面),如果我们把抛一枚硬币产生等概率的两种情况确定为不确定性的一个基本度量单位,那么我们就可以对其他的不确定性加以度量。比如小明在做选择题的时候面临A,B,C,D四种情况,那么这相当于抛了两次硬币,相同的如果我们面临8种不确定性,那么我们就相当于抛了3次硬币。这个时候我们会发现,如果在一次事件中可能出现n种情况,那么就相当于抛了以2为底n的对数次硬币,即 次。现在我们把抛一枚硬币产生两种等概率的情况的不确定性定义为1bit,那么做选择题目时候的不确定性就是2bit,以此类推。
但是现在又会产生一个问题,那就是对于有的情况下,比如有人告诉小明A,B,C,D中选择A的概率为1/2,那这个时候概率发生了变化怎么办呢?这种非等概率的情况下不确定性又该怎么度量呢?我们可以这么想,对于概率为1/2的等概率事件而言,其可能产生的是2种等概率情况,相当于抛一枚硬币;对于概率为1/6的等概率事件而言,其可能产生的情况是6种等概率情况,相当于抛了 次硬币。所以把每个可能概率取倒数就得到了可能产生几种等概率情况,就可以用等概率的情况来计算了,最后再对得到的结果求期望,就可以得到最终的对不确定性的度量,即信息熵。在例子中当有人告诉小明选A的概率为1/2后,小明做这个选择题面临的不确定性就等于 =1.792bit,所以在这个例子中,有人告诉了小明A的概率为1/2的信息量就是2-1.792 = 0.208bit.
当然这里还有其他的信息量的单位,比如以自然对数e为底或者是以10为底,得到的单位也不同,分别是nat和Hart,但是理解都是一样的。
所以信息熵本身不是衡量信息量的,而是对某一事件的不确定性的衡量,信息量的输入导致熵减少,才是对信息量的衡量。大家谨记呀。
参考文献:
[1] 龙良曲:《深度学习与TensorFlow2入门实战》
[2] https://towardsdatascience.com/demystifying-cross-entropy-e80e3ad54a8
[3] https://www.zhihu.com/question/274997106
[4] https://ml-cheatsheet.readthedocs.io/en/latest/loss_functions.html