买专利卖专利找龙图腾,真高效! 查专利查商标用IPTOP,全免费!专利年费监控用IP管家,真方便!
摘要:本发明提供一种提高GRU反向传播速度的方法,包括:S0,设置一个反向遍历的index,起始位置为seq_length‑1,终止索引值为0,步长为1;S1,得到gate_i和gate_h的梯度和old_h的梯度;S2,得到权重梯度;S3,得到bias梯度;S4,得到输入的梯度。现有GRU反向传播过程中会通过切片操作,每次训练遍历一个序列长度,而且每次都要进行一次推理计算,而且当双向GRU计算流程是串行的,本方法将在推理时保存反向传播计算要的数据,不再进行重复计算,同时不再使用切片存取数据,而是直接通过核函数索引坐标对数据进行操作,也修改双向GRU计算流程为并行,从而提高了GRU推理速度。
主权项:1.一种提高GRU反向传播速度的方法,其特征在于,所述方法包括:S0,设置一个反向遍历的index,起始位置为seq_length-1,终止索引值为0,步长为1;使用CUDA核函数完成具体实现,所述核函数是指在GPU端运行的代码,就是规定GPU的各个线程访问哪个数据并执行什么计算;CUDA从逻辑上将GPU线程分成了三个层次:线程格grid、线程块block和线程thread;S1.得到gate_i和gate_h的梯度和old_h的梯度;核函数实现:将线程块设置成batch_size,direction,direction值表示单向或双向GRU取值范围为[1,2];historys为默认保存的GRU正向推理时的历史数据,用于计算梯度使用;historys_gate_h保存的是GRU正向推理的gate_h的历史数据,用于梯度计算;设置grid_y如果是双向grid_y=2否则=1,设置BLOCK=512,循环index从seq_lenght-1到0:gru_backward_kernel核函数grid_y,BLOCK传入index和所需要的参数gru_backward_kernel核函数主要计算gate_i和gate_h的梯度具体流程如下:设置seq_step=batch_size*hidden_size*3设置his_step=batch_size*hidden_size*4设置offset=blockIdx.x*hidden_size*3设置history_offset=blockIdx.x*hidden_size*4设置i=threadIdx.xF_h为此时正向推理的历史状态值用于梯度计算如果blockIdx.y=0则执行如果ihidden_size则执行:history_s_offset=index*history_step,rg=historys[history_s_offset+history_offset+i],zg=historys[history_s_offset+history_offset+i+hidden_size],ng=historys[history_s_offset+history_offset+i+hidden_size*2],Grad_h_data=输出梯度[i*batch_size*hidden_size+blockIdx.x*hidden_size+]+状态值的梯度[blockIdx.x*hidden_size+i],D_n=Grad_h_data*1-zg*1-ng*ng,D_r=D_n*historys_gate_h[seq_offset_+i+hidden_size*2]*1-r_t*r_t,D_z=Grad_h_data*f_h[index*batch_size*hidden_size+blockIdx.x*hidden_size+i]-ng*1-zg*zg,D_h_old=Grad_h_data*zg,d_gate_i[blockIdx.x*hidden_size*3+i]=D_r,d_gate_i[blockIdx.x*hidden_size*3+i+hidden_size]=D_z,d_gate_i[blockIdx.x*hidden_size*3+i+2*hidden_size]=D_n,d_gate_h[blockIdx.x*hidden_size*3+i]=D_r,d_gate_h[blockIdx.x*hidden_size*3+i+hidden_size]=D_z,d_gate_h[blockIdx.x*hidden_size*3+i+2*hidden_size]=D_n*rg;如果blockIdx.y=1则为双向gru逆向梯度计算;同正向梯度计算流程一样;gate_i和gate_h的梯度分别记作d_gate_i,d_gate_h,维度为batch,hidden_size*3;old_h的梯度记作D_h_old;S2.得到权重梯度;权重W_ir,W_iz,W_in的维度都为input,hidden_size,所以是将W_ir,W_iz,W_in放在一起同时处理的,这里统称为W_i,W_i的维度为3×hidden_size,input_size;同样的W_hr,W_hz,W_hn也是放在一起的,这里统称为W_h,维度为3×hidden_size,hidden_size;核函数实现:将线程块设置成batch_size,directiondirection值表示单向或双向GRU取值范围为[1,2];thread线程设置成512;设置指针的偏移:w_ih_offset=blockIdx.x*input_size,w_hh_offset=blockIdx.x*hidden_size,Max_size=maxinput_size,hidden_size,设置i=threadIdx.x如果imax_size则:如果iinput_size,d_W_i[w_ih_offset+i]+=d_w_i_tmp[w_ih_offset+i],如果ihidden_size,d_W_h[w_hh_offset+i]+=d_w_h_tmp[w_hh_offset+i];S3.计算bias的梯度;bias所用的值b_ir,b_iz,b_in的维度都为hidden_size,实现中将b_ir,b_iz,b_in放在一起同时处理的,这里统称为b_i,b_i的维度为3×hidden_size;同样的b_hr,b_hz,d_hn也是放在一起的,这里统称为b_h,维度为3×hidden_size;bias的梯度,直接将所有batch的d_gate_i累加即可,公式为d_bias_i和d_bias_h导数即为d_gate_i和d_gate_h;线程块设置成direction,direction值表示单向或双向GRU取值范围为[1,2];thread线程设置成512,设i=threadIdx.xOc=3*hidden_size如果iOc执行d_i_sum=0.0执行d_h_sum=0.0进入循环体,设j=0,判断jbatch_size是否成立,如果成立执行循环体内容:d_i_sum+=d_gate_i[j*oc+i],d_h_sum+=d_gate_h[j*oc+i],并j++;表示为 跳出循环体后,执行d_bias_i+=d_i_sum执行d_bias_h+=d_h_sum;其中,d_bias_i为b_i的梯度,d_bias_h为b_h的梯度;S4.得到输入的梯度;输入梯度的计算公式为: 所述步骤S1中,计算得到了D_h_old,Addmm表示可实现矩阵乘运算;Bias_add表示可实现矩阵加运行;设D_input_x为x_t的梯度,D_h为h的梯度,则D_input_x=Addmmd_gate_i,w_iD_h=Addmmd_gate_i,hD_h=bias_addD_h,D_h_old求整个的输入input_fx维度为seq_length,batch_size,input_size;核函数实现:将线程块设置成batch_size,directiondirection值表示单向或双向GRU取值范围为[1,2];thread线程设置成512;设置指针的偏移Offset=blockIdx.x*input_sizei=threadIdx.x如果iinput_size,则Input_fx[index*batch_size*input_size+offset+i]=D_input_x[offset+i],Input_fx为整个输入的梯度。
全文数据:
权利要求:
百度查询: 北京君正集成电路股份有限公司 一种提升GRU反向传播速度的方法
免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。