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

!关于昨晚那么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的点积、矩阵相乘有点区别,使用的时候要注意这一点。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写下这个题目的时候心中豁然轻松,有种仪式感,有种释然,就是不痛不悲也不喜。 今天的故事可以说的长一点,因为...
    橦讷讷阅读 242评论 0 0
  • 之前翻看一个人的微博,看到刚毕业的他考什么银行都进了面试,面临多重选择的困难,这情况让我想到了当年刚毕业的自...
    勤奋的潴潴yeah阅读 221评论 0 0
  • 天气太热,新闻报道说有小车停在马路边自燃了。有同事感叹:大热天的“红红火火”,赔了辆车。我接话:“这可不一定,如果...
    赵莲贵阅读 366评论 0 2