!关于昨晚那么b1和b2求导后,为什么要求和的简单说明。
关键思想:“后宫佳丽三千人,三千宠爱在一身”。每列的score对d2有N个梯度,但d2每列只有一个值,所以要求和。
疑问代码段图片:不能手动划线,大致下图中间区域哈
举个栗子说明: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的点积、矩阵相乘有点区别,使用的时候要注意这一点。