株式会社SOARIGでエンジニアをしている、Elleryです。 今回は、Attention Is All You Needの論文を読んでTransformerの実装をしたので、Transformerのアーキテクチャに関してまとめてみました。
前のTansformerに関する記事はこちら
Attention Is All You Needとは
「Attention Is All You Need」は、人工知能を勉強する上では避けては「Transformer」という仕組みを提案した論文です。
それまで、自然言語処理分野で確固たる地位を築いていた、再帰構造(RNN)や畳み込み構造(CNN)を完全に排除し、Attention機構のみに基づいたアーキテクチャで従来のモデルの精度を大幅に更新し、大きく注目を集めました。
今回は、そんなTransformerの実装を行ったので、モデルのアーキテクチャというところに絞って解説を行っていきます。
実装のgithubはこちら。
実装はpytorchのTransformerの実装を参考にしています。 https://pytorch.org/docs/stable/generated/torch.nn.Transformer.html https://pytorch.org/tutorials/beginner/translation_transformer.html
Transformerの全体像
TransformerはSeq2Seqと言われる構造で、EncoderとDecoderの2つに分かれているモデルです。Encoder, Decoderはともに同一のレイヤーをもっており、それを複数個重ねて、モデルが作成されます。
また、各インプットの直後にあるTokenEmbeddingは単語をベクトルに変換するレイヤー、Positional Encodingは各単語の位置情報を単語ベクトルに付与するためのレイヤーになります。TransformerはRNNとは違い、逐次処理ではないので単語の位置情報を付与しなければ、Bag of Wordsのような、単語の出現回数のみで処理するモデルになってしまうので、このようなレイヤーが準備されています。
EncoderLayer & DecoderLayer
次に、EncoderLayerとDecoderLayerについて解説していきます。
EncoderLayer
EncoderLayerは「SelfAttention Block」と「FeedForward Block」という2つのサブレイヤーから構築されます。各サブレイヤーには残差接続が導入されていて、そのあとの出力には正規化レイヤーが準備されています。
DecoderLayer
DecoderLayerはEncoderLayerの「SelfAttention Block」と「FeedForward Block」に加えて、その間に「Source-Target Attention Block」というサブレイヤーが導入されており、3つのサブレイヤーから構築されるようになっています。こちらも、各サブレイヤーごとに残差接続と正規化レイヤーが準備されているのはEncoderLayerと同じです。
MultiHeadAttention & FeedForward Block
最後に、EncoderLayer, DecoderLayerを構成するMultiHeadAttention, FeedForward Networkについて解説します。
MultiHeadAttention
MultiHeadAttentionは3つのinputを受け取るレイヤーで、それぞれquery, key, valueと言われています。queryとkeyはどこに注目をさせるかというAttentionの重みを計算するのに必要な値で、valueはAttentionの重みと掛け算を行うことで、次のレイヤーに流す値を決定する値です。
FeedForward
FeedFowardはTransformerの中では最もシンプルなサブレイヤーで2回の線形変換から構築されるレイヤーです。このレイヤーは論文内で。カーネルサイズが1の畳み込み処理を2回行っていると表現できると説明されています。
まとめ
今回は「Attention Is All You Need」の論文から、モデルのアーキテクチャというところに絞って解説しました。論文内では、各レイヤーの数式や、パラメータの値によってどれだけ計算量が変化するかなどのより詳細な解説が書かれているので、興味のある方はぜひ元の論文のほうに目を通していただければと思います。
Comments