您现在的位置是:首页 >技术杂谈 >交叉熵损失函数与参数更新计算实例(节点分类为例)网站首页技术杂谈

交叉熵损失函数与参数更新计算实例(节点分类为例)

today__present 2023-06-26 20:00:07
简介交叉熵损失函数与参数更新计算实例(节点分类为例)

交叉熵损失与参数更新

数据准备

对于下面这样一个图网络网络:
在这里插入图片描述

假如我们得到了节点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 ext{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 ext{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,..,Nlogq=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,..,Nlog(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} wtL=hiLpihiwipi

具体求导过程请参考此处

最终得出的结果为:

∂ 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\ wiL=n=1N(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) biL=n=1N(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 w0L=(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] w0L=[1.62,1.77,1.29,1.73]

梯度下降法更新参数:
W : = W − α ∂ L ∂ W W := W - alphafrac{partial L}{partial W} W:=WαWL

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:=w00.2WL=[0.49,0.75,0.12,0.86]
对其他参数 w 1 w_1 w1, w 2 w_2 w2也作类似操作。

这样就完成了一轮参数更新。
(此处更新参数的计算加入了自己的理解,如有疏漏敬请指正)

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。