Transformer中张量的形状变化。

输入

input_ids:[batch_size,seq_length]
input_mask:[batch_size,seq_length]
token_type_ids(segment_ids):[batch_size,seq_length]

词向量嵌入:

input_ids  ->  embedding_output:[batch_size,seq_length,embedding_size]

加入token_type_ids信息(主要存储tokens的类型数据,在分类过程中用啦区分text_a和text_b,text_a的token_id为0,toxt_b的id都为1)

token_type嵌入信息:

token_type_id  -> token_type_embeddings[batch_size,seq_length,embedding_size]

其中还可以加入位置信息

例如一个句子有seq_length长度,位置信息可以用[0,1,2,3…seq_length-1]表示,然后将位置信息也经过一个嵌入式的向量表示,利用tf.get_variable表示。生成:

positon_ids=[batch_size,seq_length]  ->   position_embeddings
										 =[batch_size,seq_length,embedding_size]

词嵌入总输出:

if(use_type_embeddings==TRUE and use_position==TRUE):
embedding_output=embedding_output+token_type_embeddings+position_embeddings
				->[batch_size,seq_length,embedding_size]

接下来进入编码层:(这里没有按照代码上的表示出来有多个attention,为了容易理解,加了之后功能相当于batch_size的功能,不过要各种形状的转换。)

input_mask -> attention_mask[batch_size,seq_length,seq_length](这里相当于将多个input_mask拼接成一个。)

经过全连接层。(这里可能有部分维度表示形式不准确,但是其真实就是这样形状。)

其中Q和(K,V)的第二个维度理论上可以不一样,但是在bert中一样,但是在代码注释和其表示上不一样,东西都是由embedding_output经过全连接成过来的。
代码中进到Attentio这里计算多个,但是我们这里为了简便没有写出来那个维度,可以理解成多个Attention拼接的过程并行处理,但是我们这里还表示还是串行
Q(embedding_output经过全连接层):[batch_size,seq_length,size_per_head]
K(embedding_output经过全连接层):[batch_size,seq_length,size_per_head] 
V(embedding_output经过全连接层):[batch_size,seq_length,size_per_head]

Q*(K的转置):->   attention_scores:[batch_size,seq_length,seq_length]

adder = (1.0 - tf.cast(attention_mask, tf.float32)) * -10000.0
attention_scores += adder      :->[batch_size,seq_length,seq_length]
attention_scores=softmax(attention_scores )  这里很巧妙的将上面计算过的负值转换成0

attention_output=attention_scores *V		:[batch_size,seq_length,size_per_head]

接下里就是拼接后正常的经过一个全连接成,经过一个激活函数(gelu)以后然后经过正则化之类得到一个输出,因为是多层,再把这个输出输入编码层(Encoder)中。其中将数据输入到到正则化层中的时候是将当前的输入和attention_output相加,可以找到论文“Attention is all you need”中的那个转移箭头。

这里比较有意思的就是他这里的mask在attention的时候起作用。通过input_mask将Q和K乘过的权值在mask的位置变为-10000,这样通过softmax函数去将这部分的Value在进行向量相乘的时候相对位置不会影响最后的结果。
还比较有意思的的就是在attention之前有多个attention进行拼接,代码中将部分直接过了一个比较比较大全连接层,相当于一次运行多个全连接成,不过需要之后清醒的变化形状。

写完最后突然发现bert的模型好像就是就是Transformer的multi-heads的那个模型,好像只是网络什么和宽度有调深,不知道自己理解的对不对,至少从代码来看和“Attention is all you need中的模型描述基本一致。”

你可能感兴趣的:(TensorFlow,bert,张量形状,bet,张量形状)