Kerasメモ(BERTその2)
前回の続き。
Position Embeddingレイヤを見てみる。
model.summary
Layer (type) Output Shape Param # ========================================================================== Embedding-Position (PositionEmbedding) (None, 512, 768) 393216 ==========================================================================
論文「Attention Is All You Need」でのPosition Embeddingに関する説明
2つの論文の内容が結びつかないので、ソースを追ってみると、RandomUniform(一様分布に従う乱数)で初期化されるTrainableなWeight Matrixだった。
keras_bert/layers/embedding.py
embed_layer = PositionEmbedding( input_dim=pos_num, output_dim=embed_dim, mode=PositionEmbedding.MODE_ADD, trainable=trainable, # True(Default) name='Embedding-Position', )(embed_layer)
keras_pos_embd/pos_embd.py
class PositionEmbedding(keras.layers.Layer): def __init__(self, input_dim, output_dim, mode=MODE_EXPAND, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, **kwargs): # <snip> def build(self, input_shape): if self.mode == self.MODE_EXPAND: # <snip> else: self.embeddings = self.add_weight( shape=(self.input_dim, self.output_dim), initializer=self.embeddings_initializer, name='embeddings', regularizer=self.embeddings_regularizer, constraint=self.embeddings_constraint, )
本家を当たってみると、Issuesが上がってる。
Trouble to understand position embedding. · Issue #58 · google-research/bert · GitHub
モデルはsentenceの順序を学習する、ということだろうか。
model learn the actual sequential ordering of the input sentence
googleの実装
# max_position_embeddings : Maximum sequence length # width : input_shape[2] --> embedding dim if use_position_embeddings: assert_op = tf.assert_less_equal(seq_length, max_position_embeddings) with tf.control_dependencies([assert_op]): full_position_embeddings = tf.get_variable( name=position_embedding_name, shape=[max_position_embeddings, width], initializer=create_initializer(initializer_range))