サブロウ丸

Sabrou-mal サブロウ丸

主にプログラミングと数学

Transformerによる翻訳システム自作; part6 word embedding

本稿ではword embeddingとしてFastTextを導入してみます。

Pretrained Word Embeddings

学習済のword embeddingによる変換を試してみましょう。 pytorchで公開されているfastTextを使ってみます。 これは単語の分散学習が行われており、"似たような"トークンは"似たような"ベクトルに変換されます。 (ここでいう"似たような"とは同意語であったり、文章中で同時に使われやすい単語だったりを指します。)

「fastText」とは2016年にFacebookが公開した自然言語処理ライブラリです" (引用元: https://service.plan-b.co.jp/blog/tech/14298/)

日本語と英語の両方に対応していたのでfastTextを選択しました。日本語も英語もどちらも300次元へ写像します。

class FastText(nn.models.Model):
    def __init__(self, language, vocab):
        super(FastText, self).__init__()
        self.vocab = vocab
        self.vectors = torchtext.vocab.FastText(language)

        self.params = []
        self.grads = []

    def get_dim(self):
        return self.vectors.dim

    def forward(self, indices):
        """convert token index to embedded vector
        Args:
            indices np.array: (batch_size, sentence_length)
        Returns:
            embedded_vec np.array: (batch_size, sentence_length, embed_dim)
        """
        batch_size, sentence_length = indices.shape

        embedded_vec = np.zeros(
            (batch_size, sentence_length, self.vectors.dim), dtype=np.float16
        )
        for i in range(batch_size):
            embedded_vec[i] = self.vectors.get_vecs_by_tokens(
                self.vocab.lookup_tokens(indices[i])
            )
        return embedded_vec

    def backward(self, dout):
        return dout

コード

まとめ

トークンのベクトル化のさいに word embeddingによりベクトルの次元を下げることで計算時間の短縮に成功しました。 また事前学習済のモデル(fastText)を用いたword embeddingによる学習を行えるようなコーディングを行なっています。

他の記事