交叉熵损失与参数更新
数据准备
对于下面这样一个图网络网络:
假如我们得到了节点i的嵌入表示
z
i
z_i
zi数据如下:
i
d
,
x
0
,
x
1
,
x
2
,
x
3
1
,
0.5
,
0.6
,
0.7
,
0.8
2
,
0.3
,
0.8
,
0.3
,
0.4
3
,
0.7
,
0.9
,
0.6
,
0.9
4
,
0.2
,
0.1
,
0.2
,
0.3
5
,
0.8
,
0.4
,
0.3
,
0.2
id,x_0,x_1,x_2,x_3\\ 1,0.5,0.6,0.7,0.8\\ 2,0.3,0.8,0.3,0.4\\ 3,0.7,0.9,0.6,0.9\\ 4,0.2,0.1,0.2,0.3\\ 5,0.8,0.4,0.3,0.2\\
id,x0,x1,x2,x31,0.5,0.6,0.7,0.82,0.3,0.8,0.3,0.43,0.7,0.9,0.6,0.94,0.2,0.1,0.2,0.35,0.8,0.4,0.3,0.2
为了方便说明,我们来处理一个对节点进行有监督分类的问题。
假设我们要对节点的嵌入表示进行分类
真实的类别如下:
1,3,属于第0类
2,4,属于第1类
5,属于第2类
分类层
我们对每个节点经过一个全连接层,我们随机初始化w0,w1,w2三个4维(嵌入向量维数)的权重向量(结果保留两位有效数字,下同)。
w
0
=
[
0.17
,
0.4
,
−
0.14
,
0.51
]
w_0 = [0.17,0.4,-0.14,0.51]
w0=[0.17,0.4,−0.14,0.51]
w
1
=
[
0.75
,
−
0.04
,
0.67
,
−
0.18
]
w_1 = [0.75,-0.04,0.67,-0.18]
w1=[0.75,−0.04,0.67,−0.18]
w
2
=
[
0.53
,
−
0.04
,
0.4
,
0.77
]
w_2 = [0.53,-0.04,0.4,0.77]
w2=[0.53,−0.04,0.4,0.77]
b
0
,
b
1
,
b
2
=
0.05
,
−
0.11
,
−
0.32
b_0,b_1,b_2 = 0.05,-0.11,-0.32
b0,b1,b2=0.05,−0.11,−0.32
w
i
,
b
i
w_i,b_i
wi,bi对应将节点向量转化为节点属于i类的过程的一些权重;
于是对节点 z 1 z_1 z1,我们得到:
h 1 = [ z 1 w 0 + b 0 , z 1 w 1 + b 1 , z 1 w 2 + b 2 ] = [ 0.68 , 0.57 , 0.82 ] h_1 = [z_1w_0+b_0,z_1w_1+b_1,z_1w_2+b_2]\\ = [0.68, 0.57, 0.82] h1=[z1w0+b0,z1w1+b1,z1w2+b2]=[0.68,0.57,0.82]
类似地,我们得到
h
2
=
[
0.58
,
0.21
,
0.23
]
h
3
=
[
0.9
,
0.62
,
0.95
]
h
4
=
[
0.25
,
0.12
,
0.09
]
h
5
=
[
0.47
,
0.55
,
0.4
]
h_2 = [0.58, 0.21, 0.23] \\ h_3 = [0.9, 0.62, 0.95] \\ h_4 = [0.25, 0.12, 0.09]\\ h_5 = [0.47, 0.55, 0.4]\\
h2=[0.58,0.21,0.23]h3=[0.9,0.62,0.95]h4=[0.25,0.12,0.09]h5=[0.47,0.55,0.4]
softmax矩阵
softmax函数作为一种归一化函数,可以将一组任意实数转换为一个概率分布,常用于多分类问题,其表达式为:
softmax
(
z
i
)
=
e
x
p
(
z
i
)
∑
j
=
1
K
e
x
p
(
z
j
)
,
i
=
1
,
…
,
K
\text{softmax}(z_i) = \frac{exp(z_i)}{\sum_{j=1}^K exp(z_j)}, \quad i=1,\ldots,K
softmax(zi)=∑j=1Kexp(zj)exp(zi),i=1,…,K
K为分类的类别个数,z_i为实际上是向量z的第i个分量,分类问题中,对于向量
z
z
z而言,softmax的函数值也就是
z
z
z属于第
i
i
i类的概率。
在这里,以 h 1 h_1 h1为例,softmax的表达式可以写成:
softmax
(
h
1
[
i
]
)
=
e
x
p
(
h
1
[
i
]
)
∑
j
=
1
K
e
x
p
(
h
1
[
j
]
)
,
i
=
1
,
2
,
3
\text{softmax}(h_{1}[i]) = \frac{exp(h_1[i])}{\sum_{j=1}^K exp(h_1[j])}, \quad i=1,2,3
softmax(h1[i])=∑j=1Kexp(h1[j])exp(h1[i]),i=1,2,3
h
1
[
i
]
h_1[i]
h1[i]表示
h
1
h_1
h1中第i个分量。
于是我们将 h 1 , h 2 , . . . , h 5 h_1,h_2,...,h_5 h1,h2,...,h5每个向量传入softmax函数,得到节点属于各类别的概率分布:
p
1
=
[
0.33
,
0.29
,
0.38
]
p
2
=
[
0.42
,
0.29
,
0.29
]
p
3
=
[
0.36
,
0.27
,
0.37
]
p
4
=
[
0.37
,
0.32
,
0.31
]
p
5
=
[
0.33
,
0.36
,
0.31
]
p_1 = [0.33, 0.29, 0.38]\\ p_2 = [0.42, 0.29, 0.29] \\ p_3 = [0.36, 0.27, 0.37] \\ p_4 = [0.37, 0.32, 0.31] \\ p_5 = [0.33, 0.36, 0.31]\\
p1=[0.33,0.29,0.38]p2=[0.42,0.29,0.29]p3=[0.36,0.27,0.37]p4=[0.37,0.32,0.31]p5=[0.33,0.36,0.31]
于是根据我们上面所提到的,
p
1
p_1
p1中最大的是第3列,也就是说,根据我们的结果,节点1属于第2类的概率最大。
交叉熵损失
如是我们可以得出,节点2,4属于第0类,节点5属于第1类,节点1,3属于第2类,这个结果和实际分类相差比较大,所以参数w和b需要重新训练。
为此我们引入交叉熵损失函数:
L = − 1 N ∑ i = 1 , 2 , . . , N l o g e x p ( h i [ s ] ) ∑ q = 0 , 1 , 2 e x p ( h i [ q ] ) L = - \frac{1}{N} \sum_{i = 1,2,..,N} log \frac{exp(h_i[s])}{ \sum_{q = 0,1,2} exp(h_i[q])} L=−N1i=1,2,..,N∑log∑q=0,1,2exp(hi[q])exp(hi[s])
其中N是节点数量5,s表示节点i所属的真实类别。
我们可以看到后面这个分式实质上就是节点i在真实类别s上对应的softmax函数值;所以实际上损失函数的目标,也就是让节点i被分到真实类别的概率最大化。
L = − 1 N ∑ i = 1 , 2 , . . , N l o g ( p i [ s ] ) L = - \frac{1}{N} \sum_{i = 1,2,..,N}log(p_i[s]) L=−N1i=1,2,..,N∑log(pi[s])
之前提到的节点的真实的类别如下:
1,3,属于第0类
2,4,属于第1类
5,属于第2类
前面已经计算出了节点对应的softmax函数值
z
1
z_1
z1到
z
5
z_5
z5
所以,在这里
L
=
−
1
5
(
l
n
(
p
1
[
0
]
p
2
[
1
]
p
3
[
0
]
p
4
[
1
]
p
5
[
2
]
)
)
=
−
1
/
5
(
l
n
(
0.33
×
0.29
×
0.36
×
0.32
×
0.31
)
)
L = -\frac{1}{5}(ln(p_1[0]p_2[1]p_3[0]p_4[1]p_5[2]))\\ = -1/5(ln(0.33×0.29×0.36×0.32×0.31))
L=−51(ln(p1[0]p2[1]p3[0]p4[1]p5[2]))=−1/5(ln(0.33×0.29×0.36×0.32×0.31))
我们最终求出此次的损失函数值为-1.1358
反向传播更新参数
此时,我们已经求出了损失函数,下面要做的就是将损失函数对参数求梯度然后反向传播了
∂ L ∂ w t = ∂ L ∂ h i ∂ h i ∂ p i ∂ p i ∂ w i \frac{\partial L}{\partial w_t} = \frac{\partial L}{\partial h_i}\frac{\partial h_i}{\partial p_i}\frac{\partial p_i}{\partial w_i} ∂wt∂L=∂hi∂L∂pi∂hi∂wi∂pi
具体求导过程请参考此处
最终得出的结果为:
∂
L
∂
w
i
=
∑
n
=
1
N
(
p
n
(
i
)
−
1
)
x
n
\frac{\partial L}{\partial w_i} = \sum_{n = 1}^N(p_n(i)-1)x_n\\
∂wi∂L=n=1∑N(pn(i)−1)xn
特别地,对于
b
i
b_i
bi,我们的梯度应当为
∂ L ∂ b i = ∑ n = 1 N ( p n ( i ) − 1 ) \frac{\partial L}{\partial b_i} = \sum_{n = 1}^{N}(p_n(i)-1) ∂bi∂L=n=1∑N(pn(i)−1)
其中p(i)指的是向量 x n x_n xn属于第i类的概率(softmax函数值);N为节点数5.
所以
∂
L
∂
w
0
=
(
p
1
[
0
]
−
1
)
z
1
+
(
p
2
[
0
]
−
1
)
z
2
+
.
.
.
+
(
p
5
[
0
]
−
1
)
z
5
\frac{\partial L}{\partial w_0} = (p_1[0]-1)z_1 +(p_2[0]-1)z_2 +...+(p_5[0]-1)z_5
∂w0∂L=(p1[0]−1)z1+(p2[0]−1)z2+...+(p5[0]−1)z5
这样的话,最终得到的梯度结果是一个4维的向量
∂
L
∂
w
0
=
[
−
1.62
,
−
1.77
,
−
1.29
,
−
1.73
]
\frac{\partial L}{\partial w_0} = [-1.62,-1.77,-1.29,-1.73]
∂w0∂L=[−1.62,−1.77,−1.29,−1.73]
梯度下降法更新参数:
W
:
=
W
−
α
∂
L
∂
W
W := W - \alpha\frac{\partial L}{\partial W}
W:=W−α∂W∂L
w 0 = [ 0.17 , 0.4 , − 0.14 , 0.51 ] w_0 = [0.17,0.4,-0.14,0.51] w0=[0.17,0.4,−0.14,0.51],假如我们设定学习率 α = 0.2 \alpha = 0.2 α=0.2
w
0
:
=
w
0
−
0.2
∂
L
∂
W
=
[
0.49
,
0.75
,
0.12
,
0.86
]
w_0 := w_0 - 0.2 \frac{\partial L}{\partial W}\\ = [0.49,0.75,0.12,0.86]
w0:=w0−0.2∂W∂L=[0.49,0.75,0.12,0.86]
对其他参数
w
1
w_1
w1,
w
2
w_2
w2也作类似操作。
这样就完成了一轮参数更新。
(此处更新参数的计算加入了自己的理解,如有疏漏敬请指正)