关于b1和b2反向梯度求和的简单说明

!关于昨晚那么b1和b2求导后,为什么要求和的简单说明。

关键思想:“后宫佳丽三千人,三千宠爱在一身”。每列的score对d2有N个梯度,但d2每列只有一个值,所以要求和。


疑问代码段图片:不能手动划线,大致下图中间区域哈

关于b1和b2反向梯度求和的简单说明_第1张图片

举个栗子说明:N为输入的维度即“每行是一个图片”,C为分类维度即“每列是一个类别”

score=N * C,也就是N=10行,C=7列,就像下面这个样子:

scores=[

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.1  0.2  0.3  0.5  0.6  0.9  0.1

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.1  0.2  0.3  0.5  0.6  0.9  0.1

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.1  0.2  0.3  0.5  0.6  0.9  0.1

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.1  0.2  0.3  0.5  0.6  0.9  0.1

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.1  0.2  0.3  0.5  0.6  0.9  0.1

]

b2在本代码中实际上是一个行向量,像下面这个样子

b2=[

0.2  0.3  0.4  0.5  0.7  0.1  0.9

]

又因为scores=W2 * h  +b

所以实际加的时候b要在列上“复制”展开,大概是这个样子:

b2=[

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.2  0.3  0.4  0.5  0.7  0.1  0.9

]

所以,对于每一个score里面的元素,比如第一列,每个里面都有0.2(b2的第一个元素)的加量成分

scores=[

0.2=wh+0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.1=wh+0.2  0.2  0.3  0.5  0.6  0.9  0.1

0.2=wh+0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.1=wh+0.2  0.2  0.3  0.5  0.6  0.9  0.1

0.2=wh+0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.1=wh+0.2  0.2  0.3  0.5  0.6  0.9  0.1

0.2=wb+0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.1=wh+0.2  0.2  0.3  0.5  0.6  0.9  0.1

0.2=wh+0.2  0.3  0.4  0.5  0.7  0.1  0.9

0.1=wh+0.2  0.2  0.3  0.5  0.6  0.9  0.1

]

所以,b2的第一列中每个元素的梯度计算如下:

db2[0,0]=1*dscore[0,0]

db2[0,1]=1*dscore[0,1]

db2[0,2]=1*dscore[0,2]

db2[0,3]=1*dscore[0,3]

db2[0,4]=1*dscore[0,4]

db2[0,5]=1*dscore[0,5]

db2[0,6]=1*dscore[0,6]

db2[0,7]=1*dscore[0,7]

db2[0,8]=1*dscore[0,8]

db2[0,9]=1*dscore[0,9]

所以,

每个的梯度如上所示,但最后这些梯度都要放在单个b[0]身上,所谓“三千宠爱在一身”,“所以梯度全归一人”,于是像这样相加:

db2[0] = db2[0,N] = 1 * {dscore[0,0]+1*dscore[0,1]+...+1*dscore[0,9]}

不直接相加的话也可以,但那样b就不能设定成一维向量了。

或者还可以加权求和,所谓“三千宠爱,程度各不相同”,加权求和:

db2[0] = db2[0,N] = 1 * {dscore[0,0]*d0+1*dscore[0,1]*d1+...+1*dscore[0,9]*d9}

Numpy矩阵计算确实很强大,和matlab的点积、矩阵相乘有点区别,使用的时候要注意这一点。

你可能感兴趣的:(关于b1和b2反向梯度求和的简单说明)