ichou1のブログ

主に音声認識、時々、データ分析のことを書く

Kerasメモ(BERTその2)

前回の続き。

Position Embeddingレイヤを見てみる。

https://cdn-ak.f.st-hatena.com/images/fotolife/i/ichou1/20190609/20190609120200.png


model.summary
Layer (type)                             Output Shape              Param #   
==========================================================================
Embedding-Position (PositionEmbedding)   (None, 512, 768)          393216    
==========================================================================
BERT論文(Figure 2)

https://i.redd.it/opvkbyrf1rb21.png


論文「Attention Is All You Need」でのPosition Embeddingに関する説明

f:id:ichou1:20190612211045p:plain


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))

ソース全体