自然言語処理における文章の意味推測のための手法について紹介していきます。

ここでは単語だけではなく文章全体の意味を推測するための様々な手法を紹介します。
特にTransformerは最新の自然言語処理を学ぶ上でも必須の知識となるので、確実に理解しておきましょう。

機械学習ではプログラミング言語のPythonがよく利用されています。
こちらの無料講座でPythonの基礎を学び、未経験からでもプログラミングの基礎を身につけましょう!
過去にプログラミング学習に挫折した方でも続けやすい学習プログラムになっています。
ゼロから始めるPython入門講座(オンライン・無料)+【テックジム】

Seq2Seq

Seq2Seqは自然言語処理の最新モデルの基本ともなる大切なモデルです。
ニューラルネットワークをベースとしたモデルとなっているので、知識に不安がある方は以下の記事でニューラルネットワークの基礎知識を学んでおくことをおすすめします!

モデル概要

Seq2Seq(Sequence To Sequence)は、文章から文章を生成することで学習を行う自然言語処理モデルです。
教師データとなる文章を入力し、入力した文章と同様のものを出力側で復元することを目的とします。

Seq2Seqはエンコーダとデコーダという2つの部品から構成されています。

エンコーダ側で時系列データを用いて隠れ状態を次の層に渡していき、最終的な隠れ状態をデコーダに渡します
デコーダ側で受け取った隠れ状態をもとに入力文章の復元を行います。

そして入力文章と出力文章の差を損失として、誤差逆伝搬法により時系列とは逆順に重みパラメータを更新していきます。

Seq2Seqは文章を時系列データとして扱うため、RNNレイヤLSTMレイヤを取り入れた構造となっています。

このモデルが学習を通して目標としていることは、未知の単語や文章が入力されたときに、それを適切にベクトルに変換できるような変換器(エンコーダ)を得ることです。
このように文章をその意味を保ったままベクトルとして表したもののことを分散表現といいます。
単語や文章をベクトル化することにより、文章同士の類似性などをベクトル演算によって求めることができます。

また、学習したエンコーダデコーダをそのまま利用して機械翻訳などにも応用することができます。

エンコーダ

Seq2Seqのエンコーダでは、学習させたい文章を単語区切りで順番に入力します。
各単語をEmbeddingレイヤでベクトル化し、RNNやLSTMなどのレイヤで時系列データとして処理します。
エンコーダの中では次々と隠れ状態が更新されていき、最終的な隠れ状態$\boldsymbol{h_{n}}$がデコーダに受け渡されます。

学習を進めていくと、より単語が適切なベクトルに変換されるようになります。
適切なベクトルとはつまり、単語の意味を正しく表すことができる分散表現ということです。

デコーダ

デコーダでは、エンコーダの最終的な隠れ状態$\boldsymbol{h_{n}}$を受け取り、エンコーダに入力された文章を復元することを目指します。
まず最初に、文章の終わりを意味する<eos>というトークンを入力します。
これは、ある文章が終わったとき(<eos>トークンが入力されたとき)に次の文章の最初の単語は何になるかを予測させるためです。

こうして文章の最初としてふさわしいと予測された単語を再度デコーダに入力し次の単語を予測します。
エンコーダから受け取った隠れ状態を元に次々に単語を予測していくことで、文章を生成するのです。

Embeddingレイヤはエンコーダと同様、単語をベクトルに変換する役割をします。
またAffineレイヤは全結合層、Softmaxレイヤは活性化関数です。

Seq2Seqの欠点

Seq2Seqの問題点は、入力文章の長さ(単語数)に関わらずエンコーダからデコーダに渡される情報$h$が固定長ベクトルとなることです。
これがどういうことなのか確認するために、RNNにおける隠れ状態$\boldsymbol{h_{t}}$の更新式を見てみましょう。

\begin{equation}
\boldsymbol{h_{t}} = \boldsymbol{h_{t-1}} \cdot \boldsymbol{w_{h}} + \boldsymbol{x_{t}} \cdot \boldsymbol{w_{x}}
\end{equation}

この隠れ状態の更新式については以下のように求めることができます。

\begin{equation}
\begin{split}
& (N \times H)=(N \times H) \cdot (H \times H) + (N \times D) \cdot (D \times H) \\ \\
& N : バッチサイズ \\
& D : 入力次元数 \\
& H : 隠れ状態の次元数
\end{split}
\end{equation}

バッチサイズ$N$は、一度の学習で扱う文章の数です。
式の意味を理解しやすくするためには、$N=1$として考えるのがおすすめです(一度の学習に使う文章がひとつという意味)。

$D$は単語を分散表現した際の次元数で、$H$は隠れ状態の次元数です。
この2つのサイズはモデルによって決まります。

$n \times m$の行列と$k \times l$行列の内積は、$n \times l$となります。

隠れ状態のもつ情報(要素数)は、バッチサイズと隠れ状態の次元数によって決定されます
考えやすいようにバッチサイズを1とすると、隠れ状態はモデルによって決められた次元数にのみ依存しています。

これはつまり、一つの文章に含まれている単語数に関係なく固定長のベクトルがエンコーダからデコーダに渡されることを意味します。
このようにSeq2Seqではエンコーダからデコーダに渡される情報が固定長となるため、入力された文章が長くなればなるほど精度が低くなってしまいます

機械学習エンジニアを目指したいなら、本格的にプログラミングを学べるスクールを利用してみてはいかがでしょうか?
データサイエンス・機械学習に特化したコースでプロのエンジニアにチャットで質問することもできます。
まずは、無料体験・無料カウンセリングから自分にあったコースを探してみましょう!
データサイエンスコース

Attention

モデル概要

Attentionは注意機構と呼ばれるモデルで、入力データのどの部分に注目するのか、ということを抽出することができます

通常のエンコーダ・デコーダモデルであれば、エンコーダの最後で更新された隠れ状態がデコーダに渡されます。
しかし、Attention機構を取り入れたモデルにおいては、エンコーダの隠れ状態を全てデコーダに与えます

これにより文章中に含まれる単語の数によって渡される情報の量が変化し、Seq2Seqの欠点であった長文に対する精度の低下が改善されます。

エンコーダ

まず、エンコーダ側では各時点での隠れ状態を並べた$\boldsymbol{h_{s}}$を作成します。
これは単に隠れ状態$\boldsymbol{h_{1}}, \boldsymbol{h_{2}}, … , \boldsymbol{h_{n}}$を並べた行列になっています。

デコーダ

デコーダ側ではエンコーダでの最終的な隠れ状態$\boldsymbol{h_{n}}$だけではなく、すべての隠れ状態をまとめた$h_{s}$も利用していきます。
$h_{s}$は各時系列ステップにおけるRNNレイヤの直後に挿入されます。

この時に活躍するのがAttentionレイヤで、その時系列ステップで必要となる情報に対して注意を向けさせています。
$h_{s}$はすべての隠れ状態をまとめたものですが、その中でもある時系列ステップ$t$における情報のみを抜き出す、というイメージです。

Attention機構

ではいよいよAttention機構の中身を見ていきましょう。
Attentionレイヤーは2つのパーツからAttntion SumAttention Weightのふたつのパーツからできています。

まずAttention Weight(図中のA-Weight)には、デコーダ側のRNNのある時点での隠れ状態$\boldsymbol{h_{t}}$と、エンコーダ側から受け取った$\boldsymbol{h_{s}}$が入力されます。
これらの内積をとることで、$\boldsymbol{h_{s}}$と$\boldsymbol{h_{t}}$の類似度を計算します。
Attention Weightの出力$\boldsymbol{a}$は$\boldsymbol{h_{s}}$の各要素の重要度を$Softmax$で確率として表現したものになります。

次にAttention Sum(図中のA-Sum)には、Attention Weightの出力$\boldsymbol{a}$と$\boldsymbol{h_{s}}$を与えます。
$\boldsymbol{h_{s}}$の各要素に対して重要度を掛け合わせてそれらを合計することで、その時系列ステップで重要な情報が強く現れます。
これがAttentionレイヤの出力、コンテキストベクトル$\boldsymbol{c_{t}}$となります。

Transformer

Seq2SeqではRNNなどの時系列を処理するレイヤを含む都合上、コンピュータでの並列処理ができず学習に時間がかかってしまいます

そこで、Seq2Seqを元にAttention機構をさらに活用したモデルがTransformerです。
Attention機構を導入したSeq2Seqは長文に対しても精度の高い処理が可能でしたが、Transformerではさらにコンピュータの計算時間を改善できます。

TransformerではRNNやCNNなどを一切用いずに、代わりにSelf AttentionというAttention機構を応用したものを導入しています。
計算時間を短縮するだけではなく、Self Attentionによって単語の周辺情報をキャッチし文法構造を割り出すこともできるなど、非常に優秀なモデルとなっています。

もともとは多言語翻訳のために開発されたモデルでしたが、その性能の高さから現代の自然言語処理におけるデファクトスタンダードとなっています。
最新のモデルの多くがTransformerを改良したものです。

Transformerにおいて最も特徴的なのが、Self Attentionです。
Self Attentionでは、入力文章や出力文章全体をまとめたベクトルとある時系列ステップの単語を入力します。
これによりその単語と直前の隠れ状態のみを利用していたRNNとは異なり、文章全体の情報を参考にしながら重要な情報も取り出すということが可能になります。

さらに詳しいTransfromerの中身については割愛しますが、興味のある方はぜひ調べてみてください!

まとめ

自然言語処理の最重要モデルであるTransformerを学ぶための必要知識をまとめました。

Seq2Seqは時系列データを扱うためのRNNレイヤやLSTMレイヤを組み込んだモデルで、エンコーダに入力した文章をデコーダ側で再現することを目的としています。
このモデルにより学習を行ったエンコーダは、文章を周辺単語の意味を保ったまま分散表現に変換することができます。

Attention機構はSeq2Seqに組み込むことで、長文データに対しても高い精度を保つことができます。

さらにこのAttention機構を応用したモデルであるTransformerは、得られる分散表現の精度を向上させるだけでなく、並列的処理を可能として高速な学習を実現しています。
Googleが開発したBERTやOpenAIが開発したGPT-3などの最先端モデルもこのTransformerを採り入れており、非常に重要なモデルとなっています。

理解には少し骨が折れますが、自然言語処理の分野に興味のある皆さんはぜひマスターできるように頑張ってみてください!

AIエンジニアやデータサイエンティストへのキャリアチェンジを目指すなら、3カ月間の集中プログラムで徹底的に学習しましょう!
業務課題をAIを用いて解決したい方、教養としてAIを学習したい方にもおすすめです。
オンラインでPythonの基礎知識からしっかり学べるコンテンツを利用できます。
AIを学ぶならアイデミープレミアムプラン

関連記事

この記事のタグ