cs231n(五)矩阵求导篇

来源:互联网 发布:银行笔试通过率 知乎 编辑:程序博客网 时间:2024/06/09 17:40

我们已经知道基本的标量除以矩阵(或向量),矩阵(或向量)除以标量,以及稍微复杂一点的向量除向量[1],行向量除以向量除以矩阵,矩阵除以向量的方法,那么矩阵除以矩阵呢?例如:

XN×DWD×C=fN×C

对W求导:
fW=XTfN×C

对X求导:
fX=fN×CWT

1.直观上,对X的导数dX的大小一定和X同维度。

2.以对W求导为例,求解方式是将fijW求出,然后再求f(i+1)jW,….,就会发现j相同时会将所有结果stack到一起。于是可得到上面结论。当然实际中往往只知道此形式,却不知转置、前后,但只要确定结果的维度,就自然能选出正确形式。
对于卷积求导,可以看成是dout的每个元素对w和x求导,然后将每个dout元素对w求导的情况重叠起来,如:

def conv_backward_naive(dout, cache):    x,w,b,conv_param = cache    F,C,HH,WW = w.shape    N,C,H,W = x.shape    Ho = dout.shape[2]    Wo = dout.shape[3]    S =  conv_param['stride']    P = conv_param['pad']    x_pad = np.pad(x,((0,0),(0,0),(P,P),(P,P)),'constant')    #dw is simple:x^T*dout    dw = np.zeros((F,C,HH,WW))    dx_pad = np.zeros((N,C,H+2*P,W+2*P))    for n in range(N):         for f in range(F):             for i in range(Ho):                  for j in range(Wo):                      dx_pad[n,:,i*S:i*S+HH,j*S:j*S+WW] += w[f,:,:,:]*dout[n,f,i,j] #C,HH,WW                      dw[f] += x_pad[n,:,i*S:i*S+HH,j*S:j*S+WW]*dout[n,f,i,j]    dx = dx_pad[:,:,P:H+P,P:W+P]    db = np.sum(dout,axis = (0,2,3))#np.zeros(F)    return dx,dw,db

[1]严格意义上还有行向量len(n)除以行向量(len(m),结果为1×(mn),以及列向量len(n)除以列向量(len(m),结果为(mn)×1,但为了方便方便看清两个向量表示的变量之间的关系,一般以一个(雅克比)矩阵来表示两个向量各个维度的相除。

[2]wiki:matrix calculus

原创粉丝点击