見出し画像

RNN~トランスフォーマーまでの概要


RNN


RNN(Recurrent Neural Network)は、時系列データを扱うためのニューラルネットワークです。RNNの特徴は、過去の情報を記憶しながら、新しい入力に対して出力を生成することができる点にあります。ここでは、RNNの順伝播(forward propagation)と逆伝播(backpropagation)について、説明します。

RNNの順伝播

RNNの順伝播では、時系列データを一つずつ処理していきます。時系列データは、例えば文章の各単語や音声の各時点のデータなどが該当します。RNNでは、これらのデータを順番に処理することで、時系列の文脈を捉えます。

具体的には、時刻tにおける入力x_tと、一つ前の時刻t-1の隠れ状態h_(t-1)を用いて、新しい隠れ状態h_tを計算します。この計算には、重み行列W_h(隠れ状態の重み)、W_x(入力の重み)、およびバイアスbが使用されます。式は以下の通りです。

h_t = tanh(h_(t-1) * W_h + x_t * W_x + b)

ここで、tanh関数は非線形性を導入するために使用されます。

tanhが選ばれる理由は、2次微分の減衰がかなりゆっくりとゼロになり
勾配消失問題が起きにくいため。


RNNの逆伝播

逆伝播は、ネットワークの出力から誤差を逆方向に伝播させ、各重みの更新量を計算するプロセスです。RNNでは、時系列データを扱うため、逆伝播も時系列の逆順に行われます。

逆伝播では、出力層からの誤差を受け取り、それを時系列の逆順に伝播させながら、各時刻における重みの勾配を計算します。この勾配は、ネットワークの重みを更新するために使用されます。

RNNの逆伝播は、時系列データの依存関係を考慮しながら行われるため、通常のニューラルネットワークよりも複雑です。特に、長い時系列データを扱う場合には、勾配消失や勾配爆発といった問題が発生しやすくなります。

ある時刻の隠れ状態の勾配は、その次の時刻の隠れ状態の勾配と、その時刻での出力層からの勾配によって影響を受けます。逆伝播する誤差も過去にさかのぼって反映します 時間軸に沿って誤差を反映していく(BPTT)

具体的には、ある時刻tの隠れ状態h_tに対する勾配∂L/∂h_tLは損失関数)を考えます。この勾配は、次の時刻t+1の隠れ状態h_(t+1)に対する勾配と、時刻tでの出力層からの勾配の和によって計算されます。

tanh関数の逆伝播

RNNの隠れ層では、活性化関数としてtanh関数がよく使われます。tanh関数の逆伝播では、その微分を計算します。tanh関数の微分は、1 - tanh^2(x)で表されます。したがって、ある時刻ttanh関数の出力h_tに対する勾配は、1 - h_t^2を用いて計算されます。

例:1番目のRNNレイヤの逆伝播

1番目のRNNレイヤの逆伝播を考えると、まずは勾配dh1∂L/∂h1)を生成します。この勾配は、次の時刻の隠れ状態と出力層からの勾配の和です。次に、tanh関数の出力h1に対する勾配を計算します。これは、1 - h1^2を用いて求められます。


RNNの逆伝播では、時系列データの依存関係を考慮しながら、各時刻の隠れ状態に対する勾配を計算します。この勾配は、重みの更新に使用され、ネットワークの性能を向上させるために重要です。逆伝播の過程で、tanh関数などの活性化関数の微分が重要な役割を果たします。

RNNは、時系列データの文脈を捉える能力を持っています。順伝播では、時系列データを順番に処理して新しい隠れ状態を生成し、逆伝播では、出力層からの誤差を時系列の逆順に伝播させて重みの更新量を計算します。RNNは、自然言語処理や音声認識など、時系列データを扱う多くの分野で活用されています。

勾配消失問題

RNNは時系列データを扱う際、過去の情報を隠れ状態として保持します。しかし、長い系列データを扱う場合、過去の情報が徐々に薄れていくことがあります。これは、RNNが時系列データを逆伝播する際に、勾配(重みの更新量)がどんどん小さくなっていくためです。結果として、ネットワークは過去の重要な情報を「忘れてしまい」、学習がうまく進まなくなります。

勾配爆発問題

一方で、勾配が非常に大きくなることもあります。これを勾配爆発問題といいます。勾配が大きすぎると、重みの更新が過剰になり、ネットワークの学習が不安定になります。特に、長い時系列データを扱う場合にこの問題が顕著になります。

定常性の問題

時系列データの分析では、データの定常性が重要です。定常性とは、時系列データの統計的特性(平均や分散など)が時間に依存しない性質を指します。非定常なデータをそのまま分析すると、誤った結果を導く可能性があります。このため、ADF検定やKPSS検定などを用いて定常性を確認し、必要に応じてデータを変換することが重要です。

定常性とは、時系列データの統計的な特性(平均、分散、自己相関など)が時間に依存せず一定である性質を指します。これを理解するために、以下のポイントを簡単に説明します。

定常性の条件:平均と分散

  • 平均の一定性:時系列データの平均値が時間によって変わらないこと。

  • 分散の一定性:時系列データの分散(データのばらつきの度合い)が時間によって変わらないこと。

定常性の重要性

  • 予測の一貫性:過去のデータが定常性を持つ場合、将来のデータも同じ統計的特性を持つと仮定でき、予測が容易になります。

  • 非定常データの問題:過去のデータが非定常である場合、将来の予測が難しくなります。

定常性の検定

  • ADF(Augmented Dickey-Fuller)検定:時系列データが定常性を持つかどうかを検定する方法。

  • KPSS(Kwiatkowski-Phillips-Schmidt-Shin)検定:ADF検定とは異なるアプローチで定常性を検定する方法。

見せかけの回帰

  • 見せかけの回帰:関連性のない二つの非定常な時系列データを回帰分析すると、誤って有意な関係があると判断されることがあります。これは、データが単位根過程(時間の経過とともにその特性が変化する過程)に従う場合に発生する問題です。

定常性は時系列データ分析において非常に重要です。データが定常性を持つかどうかを確認し、必要に応じてデータを変換することで、より正確な分析や予測が可能になります。ADF検定やKPSS検定などの手法を用いて定常性を検定し、見せかけの回帰を避けることが重要です。

その為データの分析が必要です


ARIMAモデル、カルマンフィルタ、および時系列データ解析に関連するPythonライブラリについて説明します。

ARIMAモデル

  • 概要: ARIMA(AutoRegressive Integrated Moving Average)モデルは、時系列データの予測や分析に用いられる統計モデルです。

  • パラメータ:

    • p (自己回帰パラメータ): 過去の値が現在の値に与える影響の度合い。

    • d (差分の階数): 非定常データを定常データに変換するための差分の回数。

    • q (移動平均パラメータ): 過去の誤差が現在の値に与える影響の度合い。

  • 定常性: 時系列データが時間の経過とともに一定の統計的性質(平均、分散)を保つこと。


カルマンフィルタ

  • 概要: カルマンフィルタは、状態空間モデルに基づいて、内部の状態を効率的に推定するためのアルゴリズムです。

  • 用途: センサーデータなどの観測値から、システムの内部状態を推定し、制御に応用されます。

  • 特徴: 欠損値があっても使用可能で、リアルタイムでのデータ処理に適しています。


Pythonライブラリ: 時系列データ解析に特化した複数のライブラリがあり、それぞれ異なるアプローチで時系列データの分析や予測を行います。

時系列データ解析のPythonライブラリ

  • statsmodels: 統計的モデルを構築し、データ分析を行うためのライブラリ。ARIMAモデルなどの時系列分析機能を提供します。

  • Prophet: Facebookによって開発された時系列予測ライブラリ。季節性や休日の影響を考慮した予測が可能です。

  • PyFlux: 時系列データのための統計モデルを提供するライブラリ。ARIMAモデルや状態空間モデルなどが含まれます。

statsmodels


prophaet


pyFlux


定常性確認後にRNNの問題点について考えてみる

時系列データ解析のPythonライブラリを活用して
定量性のあるデータセットだと思っても

実際に、RNNで解析してみると配消失問題や勾配爆発問題が存在します

機械学習において学習(最適なパラメータを探すこと)をする際、パラメータ(重さやバイアス)をどちらの方向(減らすのか、増やすのか)に更新するのか決めるのに損失関数(学習で予測した答えと用意した答えの誤差を計算する)というものを参考にします。
これはパラメータを損失関数が少なくなる(正解との誤差が少なくなる)方向に更新していくことを意味します。
では、各パラメータの更新する方向を決めるのに具体的にはどうやっているのかということですが、偏微分を使ってそのパラメータが微小に変化したとき損失関数にどれだけ変化を与えるかを求めています。
勾配は、この各パラメータに対する偏微分をまとめたものです。


以下リンクのRNNの計算グラフが非常にわかりやすいです


勾配消失の理由

  • RNNの計算: RNNでは、過去の情報を現在に伝えるために、同じ重みを繰り返し使って計算を行います。

  • tanh関数の特性: RNNでは活性化関数としてよくtanh(ハイパボリックタンジェント)が使われます。tanh関数の微分は、出力が1より小さい値になります。

  • 勾配の減少: 逆伝播時にtanh関数を通るたびに、勾配は1より小さい値で乗算されます。これが繰り返されると、勾配は徐々に小さくなり、最終的にはほとんど0に近い値になってしまいます。これが勾配消失の原因です。

勾配爆発の原因

  • 行列の積の影響: RNNの逆伝播では、過去に遡って同じ重み行列を何度も乗算します。

  • 勾配の増加: 重み行列が特定の条件下で勾配を増加させる場合(例えば、重みが大きい場合)、逆伝播の過程で勾配が指数関数的に大きくなることがあります。

  • 爆発する勾配: このようにして、時間が経つにつれて勾配がどんどん大きくなり、非常に大きな値になってしまうことが勾配爆発の原因です。


  • 勾配消失: RNNでは、tanh関数の微分により勾配が時間とともに小さくなり、重要な情報が失われることがあります。

  • 勾配爆発: 同じ重み行列を繰り返し使うことで、勾配が非常に大きくなり、学習が不安定になることがあります。


配消失問題や勾配爆発問題に対処するために、LSTM(Long Short-Term Memory)やGRU(Gated Recurrent Unit)などの改良されたRNNが開発されました。これらのモデルは、情報を長期間保持するメカニズムを持ち、勾配消失問題を軽減します。また、ReLU(Rectified Linear Unit)のような活性化関数の使用や、重みの初期化方法の工夫も、これらの問題の解決に役立ちます。


LSTMの概要

LSTMは、時系列データの長期的な依存関係を学習するために開発されたニューラルネットワークです。従来のRNN(Recurrent Neural Network)では、時間が経つにつれて情報が失われる「勾配消失問題」がありましたが、LSTMはこの問題を解決するために設計されています。LSTMは、内部に複数のゲートを持ち、これらのゲートを通じて情報の流れを制御します。これにより、長期的な依存関係を効果的に捉えることができます。

LSTMの主要なゲート

LSTMには主に以下の3つのゲートがあります:

  1. 忘却ゲート(Forget Gate): このゲートは、セル状態(長期的な記憶)から不要な情報を削除する役割を持ちます。どの情報を忘れるかは、現在の入力と前の隠れ状態に基づいて決定されます。

  2. 入力ゲート(Input Gate): 入力ゲートは、新しい情報をセル状態に追加するかどうかを決定します。また、どの情報を追加するかもこのゲートが制御します。

  3. 出力ゲート(Output Gate): 出力ゲートは、セル状態の情報をもとにして、次の隠れ状態(短期的な記憶)を生成します。この隠れ状態は、次の時点での予測や他の処理に使用されます。

LSTMの動作プロセス

LSTMの各ステップでは、以下のプロセスが行われます:

  1. 忘却ゲート: まず、忘却ゲートがどの情報をセル状態から削除するかを決定します。これは、現在の入力と前の隠れ状態に基づいて計算されます。記憶セルに対して「何を忘れるのか」を明示的に指示します。

  2. 新しい記憶セル: forgetゲートだけでは忘れることしかできないため、あたらしく覚えるべき情報を記憶セルに追加します。

  3. 入力ゲート: (新しい記憶セル)の各要素が新たに追加する情報としてどれだけ価値があるのかを判断(追加する情報の取捨選択)します。

  4. 出力ゲート: 隠れ状態(ht)は記憶セル(Ct)に対してtanh関数を適用して算出されますが、これが次の時刻の隠れ状態としてどれだけ重要かを判断します。

以下のサイトが非常にわかりやすいです


LSTM(Long Short-Term Memory)モデルを理解するためには、ゲート(Gate)の機能を理解することが重要です。LSTMのゲートは、情報の流れを制御するために使用されます。ここでは、ニューラルネットワーク上のゲート回路について簡単に説明します。

ゲートの基本構造

  • 入力(In): データがゲートに入る部分です。

  • 出力(Out): データがゲートから出る部分です。

  • 制御信号(X): ゲートがどのように動作するかを制御する追加の情報です。

ゲートの内部構造

ゲートは主に2つの部分から構成されています。

  1. 制御信号生成回路: この部分では、制御信号(X)を受け取り、ゲートの動作を直接制御するための「コントロール」情報に変換します。この変換には、Sigmoid関数(σ)が使用されます。Sigmoid関数は、入力された値を0から1の間の値に変換します。

  2. 出力生成回路: この部分では、コントロール情報と入力データ(In)を受け取り、出力データ(Out)を生成します。このプロセスでは、Hadamard積(要素ごとの積)が使用されます。

ゲートの動作

  • 制御信号が0の場合: ゲートは閉じており、情報は流れません(Out = 0)。

  • 制御信号が1の場合: ゲートは開いており、情報はそのまま流れます(Out = In)。

LSTMのゲートは、ニューラルネットワーク内で情報の流れを制御するために使用されます。Sigmoid関数によって生成された制御信号に基づいて、情報がゲートを通過するかどうかが決定されます。この仕組みにより、LSTMは情報を長期間記憶する能力を持ち、時系列データの処理に適しています。


LSTMの実装


LSTMクラス

  • __init__メソッド:LSTMレイヤの初期化を行います。重み(Wx, Wh)とバイアス(b)をパラメータとして設定し、勾配を保存するための配列も初期化します。

順伝播(forwardメソッド)

  • 入力(x)、前の隠れ状態(h_prev)、前の記憶セル状態(c_prev)を受け取ります。

  • 重みとバイアスを使って、入力と前の隠れ状態から新しい隠れ状態と記憶セル状態を計算します。

  • LSTMには4つのゲート(forgetゲート、inputゲート、outputゲート、記憶セル)があり、それぞれのゲートで異なる計算を行います。

  • 最終的に、新しい隠れ状態(h_next)と新しい記憶セル状態(c_next)を出力します。

逆伝播(backwardメソッド)

  • 順伝播で計算した隠れ状態と記憶セル状態に対する勾配(dh_next, dc_next)を受け取ります。

  • これらの勾配を使って、各ゲートとパラメータに対する勾配を計算します。

  • 勾配を計算した後、それらを用いてパラメータ(重みとバイアス)の勾配を更新します。

  • 最後に、入力に対する勾配(dx)、前の隠れ状態に対する勾配(dh_prev)、前の記憶セル状態に対する勾配(dc_prev)を出力します。

このLSTMレイヤの実装は、ニューラルネットワークにおける時系列データの処理において重要な役割を果たします。特に、長期間にわたる依存関係を持つデータを扱う際に有効です。

# LSTMレイヤの実装
class LSTM:
    # 初期化メソッドの定義
    def __init__(self, Wx, Wh, b):
        self.params = [Wx, Wh, b] # パラメータ
        self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)] # 勾配
        self.cache = None
    
    # 順伝播メソッドの定義
    def forward(self, x, h_prev, c_prev):
        # パラメータと変数の形状に関する値を取得
       Wx, Wh, b = self.params
       # Wx: 入力xに対する重み行列
       # Wh: 前の隠れ状態 h_prev に対する重み行列
       # b: バイアス項

       N, H = h_prev.shape
       # N: バッチサイズ(データの数)
       # H: 隠れ状態のサイズ(隠れ層のニューロン数)

       # 結合したパラメータによる重み付き和の計算
       A = np.dot(x, Wx) + np.dot(h_prev, Wh) + b
       # x: 現在の入力データ
       # h_prev: 前の時刻の隠れ状態
       # np.dot(x, Wx): 入力データxとその重みWxの行列積
       # np.dot(h_prev, Wh): 前の隠れ状態h_prevとその重みWhの行列積
       # b: バイアス項の加算
       # A: 重み付き和の結果(LSTMレイヤの各ゲートとセル状態の候補に分割される)
        
     # 各ゲートの重み付き和を取得
     f = A[:, :H]      # forgetゲート
        # A[:, :H] は、Aの全ての行(:)と最初のH列(:H)を取り出す。
        # つまり、Aの最初のH列がforgetゲートの重み付き和になる。

        g = A[:, H:2*H]   # 記憶セル
        # A[:, H:2*H] は、Aの全ての行(:)とH列目から2*H列目までを取り出す。
        # これは、Aの次のH列が記憶セルの重み付き和になる。

        i = A[:, 2*H:3*H] # inputゲート
        # A[:, 2*H:3*H] は、Aの全ての行(:)と2*H列目から3*H列目までを取り出す。
        # これは、Aの次のH列がinputゲートの重み付き和になる。

        o = A[:, 3*H:]    # outputゲート
        # A[:, 3*H:] は、Aの全ての行(:)と3*H列目から最後までを取り出す。
        # これは、Aの残りの列がoutputゲートの重み付き和になる。
        
        # ゲート値に変換
        f = sigmoid(f)
        # forgetゲートは、前のセル状態の情報をどれだけ保持するかを決定します。
        # sigmoid関数は0から1の範囲の出力を生成し、この範囲は「保持しない」から「完全に保持する」までを表します。

        g = np.tanh(g)
        # gは新しい候補情報(セル状態に追加される情報)を生成します。
        # tanh関数は-1から1の範囲の出力を生成し、この範囲は新しい情報の強度と方向(正または負)を表します。

        i = sigmoid(i)
        # inputゲートは、新しい情報をどれだけセル状態に追加するかを決定します。
        # sigmoid関数はここでも0から1の範囲の出力を生成し、新しい情報の追加量を制御します。

        o = sigmoid(o)
        # outputゲートは、セル状態からどれだけの情報を次の隠れ状態に出力するかを決定します。
        # ここでもsigmoid関数が使用され、0から1の範囲で出力情報の量を制御します。

        # 出力を計算
        c_next = f * c_prev + g * i  # 記憶セル
        # 新しいセル状態は、forgetゲートによって決定された古い情報と、inputゲートによって決定された新しい情報の和です。
        # 最終的に、c_next は、忘れるべき古い情報 (f * c_prev) と追加すべき新しい情報 (g * i) の合計として計算され、新しい記憶セルの状態を形成します。

        h_next = o * np.tanh(c_next) # 出力データ
        # 新しい隠れ状態は、outputゲートによって制御されたセル状態の活性化された値です。
        # tanhはセル状態の値を-1から1の範囲に正規化し、出力ゲートがその情報の量を制御します。
        
        # 逆伝播の計算用に変数を保存
        self.cache = (x, h_prev, c_prev, i, f, g, o, c_next)
        return h_next, c_next

    
    # 逆伝播メソッドの定義
    def backward(self, dh_next, dc_next):
        # 変数を取得
        Wx, Wh, b = self.params
        x, h_prev, c_prev, i, f, g, o, c_next = self.cache
        
        # 計算用に活性化記憶セルを計算
        tanh_c_next = np.tanh(c_next)
        
        # 現レイヤの記憶セルの勾配を計算
        ds = dc_next + (dh_next * o) * (1 - tanh_c_next ** 2)
        
        # 前レイヤの記憶セルの勾配を計算
        dc_prev = ds * f
        
        # 活性化後のゲートの勾配を計算
        di = ds * g
        df = ds * c_prev
        do = dh_next * tanh_c_next
        dg = ds * i
        
        # 活性化前のゲートの勾配を計算
        di *= i * (1 - i)
        df *= f * (1 - f)
        do *= o * (1 - o)
        dg *= (1 - g ** 2)
        
        # ゲートの勾配を結合
        dA = np.hstack((df, dg, di, do))
        
        # パラメータの勾配を計算
        dWh = np.dot(h_prev.T, dA)
        dWx = np.dot(x.T, dA)
        db = dA.sum(axis=0)
        
        # パラメータの勾配を格納
        self.grads[0][...] = dWx
        self.grads[1][...] = dWh
        self.grads[2][...] = db
        
        # 入力の勾配を計算
        dx = np.dot(dA, Wx.T)
        dh_prev = np.dot(dA, Wh.T)
        
        return dx, dh_prev, dc_prev

上記のサイトの図と一緒に考えるとわかりやすいです

メモリーセル(LSTMにおける)

LSTMにおけるメモリーセルは、長期的な情報を保持するための構造です。メモリーセルは、忘却ゲート、入力ゲート、出力ゲートの三つのゲートを通じて、情報の流れを制御し、長期的な依存関係を学習します。

Basic LSTMの問題点

  • CECの無視: Basic LSTMでは、ゲートコントローラが入力と前の出力のみを使って計算を行います。これにより、記憶セル CEC(Constant Error Carousel、LSTMの中核部分)が保持する長期記憶情報がゲートの決定に影響を与えません。

  • 改善策: 記憶セル(CECセル)の情報をゲートコントローラの決定に取り入れるために、記憶セル(CECセル)からゲートコントローラへの直接的な接続(ピープホール結合)を追加します。

  • 接続方法: 入力ゲートと忘却ゲートには時刻t−1のCECの値を、出力ゲートには時刻tのCECの値を渡します。

CECセルとは

  • 記憶セル: CECセル(Constant Error Carousel)は、LSTM(Long Short-Term Memory)ネットワーク内の記憶セルで、長期間の情報を保持する役割を果たします。

  • 情報の維持: CECセルは、過去の重要な情報を保持し、必要に応じてネットワークに提供することで、長期的な依存関係を学習します。

ピープホール機構

  • ゲートの直接制御: ピープホール機構は、CECセル自身がゲート(入力ゲート、出力ゲート)を直接制御することを可能にします。これにより、ゲートの開閉効率が向上し、より精密な情報の管理が可能になります。忘却ゲートと 入力ゲートには 前の時刻から 受け取ったCECの値 出力ゲートには現時刻から次の時刻に渡すCECの値を用いて計算しています

  • 効率的な情報処理: ピープホール機構により、LSTMは過去の情報をより効率的に活用し、長期的な依存関係をより正確に学習することができます。

基本LSTMセルの表記

  • 時間軸で展開した表記: LSTMの各時刻における動作を詳細に表現します。各時刻での入力、隠れ状態、CECセルの状態、およびゲートの状態が示されます。

  • 時間軸で展開していない表記: LSTMの全体的な構造を一つの図で表現します。これにより、LSTMの全体的な動作原理を理解することができます。

LSTMというときに使用されるセルはこれから説明する覗き穴結合(ピープホール結合)という接続が内部的に存在します。




GRU(Gated Recurrent Unit)の概要

GRU(Gated Recurrent Unit)は、リカレントニューラルネットワーク(RNN)の一種で、LSTM(Long Short-Term Memory)に似た機能を持ちながら、より単純な構造で効率的な学習が可能です。

更新ゲート

更新ゲートは、過去の隠れ状態の保持率を決定する役割を持ちます。このゲートが閉じている場合、過去の情報が保持され、勾配消失問題が緩和されます。更新ゲートの働きにより、GRUは必要な情報を長期間にわたって保持することができます。

リセットゲート

リセットゲートは、過去の隠れ状態が新しい隠れ状態の計算にどの程度影響を与えるかを制御します。リセットゲートが開いている場合、無関係な過去の情報が破棄され、新しい情報の学習に焦点が当てられます。これにより、GRUは過去の情報を適切にフィルタリングし、新しい情報を効率的に学習することが可能です。

新しい隠れ状態の計算

新しい隠れ状態は、リセットゲートと過去の隠れ状態を組み合わせた情報を基に計算されます。その後、更新ゲートを通じて過去の隠れ状態と組み合わされ、最終的な隠れ状態が決定されます。このプロセスにより、GRUは過去の情報と新しい情報を適切に統合し、時系列データの特性を捉えることができます。

GRUのゲートの働き

GRUのゲートはシグモイド関数を使用して0から1の範囲の値を出力します。ゲートの値が0に近いほど情報の流れが遮断され、1に近いほど情報が保持されます。この機構により、GRUは過去の情報を効果的に利用しながら、新しい情報を学習することが可能です。


GRUとLSTMの比較

  • 構造の単純さ: GRUはLSTMよりも構造が単純で、学習が高速です。

  • 性能: 一部のタスクではGRUがLSTMと同等またはそれ以上の性能を示すことがありますが、タスクによってはLSTMの方が優れている場合もあります。

  • 選択: タスクの性質やデータセットのサイズ、計算資源などに応じて、GRUとLSTMのどちらを使用するかを選択します。

GRUは、LSTMと同様に複雑な時系列データのモデリングに有効ですが、より単純な構造で効率的な学習が可能なため、特に計算資源が限られている場合や、より高速な学習が求められる場合に適しています。


双方向RNN(Bi-directional RNN)


双方向RNN(Bi-directional RNN)は、従来のRNNが過去から未来への情報の流れのみを考慮するのに対し、未来から過去への情報の流れも同時に考慮することで、より高い精度の予測や分析を可能にするモデルです。以下に要点をまとめます。

  1. 双方向の情報処理: 双方向RNNは、過去から未来への情報(順方向)と、未来から過去への情報(逆方向)の両方を処理します。これにより、文脈の理解が深まり、より正確な予測や分析が可能になります。

  2. 二つのRNNの組み合わせ: このモデルは、順方向へのRNNと逆方向へのRNNの二つを組み合わせて使用します。それぞれのRNNは独立して入力データを処理し、その結果を統合(マージ)して最終的な出力を生成します。

  3. 実用例: 双方向RNNは、特に機械翻訳やテキスト分析、音声認識などの分野で有効です。これらの分野では、文脈の全体的な理解が重要であり、双方向RNNはそのための強力なツールとなります。

双方向RNNは、特に文脈が重要なタスクにおいて、従来の単方向RNNよりも優れた性能を発揮することが多いです。



Encoder-Decoderモデル

Encoder-Decoderモデルは、様々なタイプのデータを変換し、新しい形式のデータを生成するための深層学習のフレームワークです。このモデルは主に2つの部分、エンコーダーとデコーダーから構成されています。

エンコーダー (Encoder)

  • 機能: エンコーダーは入力データ(例えば画像、テキスト、音声など)を受け取り、それを固定長の特徴ベクトルに変換します。この特徴ベクトルは、入力データの重要な情報を圧縮して表現しています。

  • 目的: 入力データの本質的な特徴を捉え、それをより扱いやすい形式に変換することです。

デコーダー (Decoder)

  • 機能: デコーダーはエンコーダーからの特徴ベクトルを受け取り、それを新しい形式のデータ(画像、テキスト、音声など)に変換します。この過程で、エンコーダーによって圧縮された情報を元に、新しいデータを生成します。

  • 目的: エンコーダーによって抽出された情報を基に、新しい形式のデータを生成することです。

Encoder-Decoderモデルの応用例

  • 画像からテキストへの変換: 画像認識システムで、画像を入力としてテキストの説明(キャプション)を生成します。

  • 音声からテキストへの変換: 音声認識システムで、音声データを入力としてテキストの書き起こしを生成します。

  • 言語翻訳: ある言語のテキストを別の言語のテキストに翻訳します(例:英語から日本語への翻訳)。

Encoder-Decoderモデルは、入力データを特徴ベクトルに変換し(エンコーダー)、その特徴ベクトルを基に新しい形式のデータを生成する(デコーダー)プロセスを行います。このモデルは、様々なデータ変換タスクにおいて非常に有効であり、多くの応用が可能です。

まとめると

Inputデータ(画像やテキスト、音声等)を何かしらの特徴ベクトル(固定長)に変換する機能をEncoderといいます。また、Encoderで生成された特徴ベクトルをデコードして新しいデータ(Inputと同じである必要はなく画像やテキスト、音声等)を生成する機能をDecoderといいます。
Encoder-Decoderモデルは文字通りEncoderとDecoderを繋げたものであり、画像 -> テキスト、音声 -> テキスト、英語 -> 日本語等、様々な生成が行えます

Variational Autoencoder(VAE)は?

Variational Autoencoder(VAE)はエンコーダー・デコーダー構造を利用したモデルの一例と考えることができます。

VAEでは、エンコーダーが入力データ(例えば画像やテキスト)を潜在空間(latent space)にマッピングし、この潜在空間の表現を用いてデコーダーが元のデータを再構築します。このプロセスは、一般的なオートエンコーダの構造に似ていますが、VAEの特徴は潜在空間における表現が確率分布としてモデル化される点にあります。

エンコーダーは入力データから潜在変数の確率分布のパラメータ(平均と分散)を推定し、デコーダーはこの分布からサンプリングされた潜在変数を用いて元のデータを再構築します。この確率的なアプローチにより、VAEはデータの生成過程を学習し、新しいデータを生成する能力を持ちます。

エンコーダー・デコーダー構造は、VAEだけでなく、機械翻訳や画像キャプショニングなど、多くの異なるタスクに応用されています。



GNMT (Google's Neural Machine Translation)


https://deeplearning.hatenablog.com/entry/gnmt


Google Neural Machine Translation(GNMT)は、Googleが開発した機械翻訳システムです。このシステムは、特に中国語から英語への翻訳において、従来の方法よりも高い精度を実現しました
ただし LSTMなどを利用するため とにかく力でごり押しのイメージがある

Neural Machine Translation(NMT)の基本

NMTは、ある言語の単語を系列データとして固定長のベクトルに置き換え、それを別の言語の系列データに変換するプロセスを行います。この変換は「エンコーダ・デコーダ」モデルを用いてニューラルネットワークで実施され、デコーダは元の言語のベクトル間の関連性に注意を払いながらデコードします。

GNMTの特徴

  • 技術基盤: GNMTはGoogleのオープンソース機械学習システム「TensorFlow」と機械学習向けハードウェア「Tensor Processing Unit(TPU)」を活用しています。

  • 翻訳精度: 従来のフレーズベース機械翻訳(PBMT)と比較して、GNMTはほとんどの言語で翻訳精度が向上しています。翻訳エラーは55~85%減少していると報告されています。

  • 構造: GNMTはエンコーダとデコーダにそれぞれ8層のLSTMを使用し、エンコーダの1層目は双方向LSTMです。注意機構と残差接続を取り入れており、Wordpieceなどの技術で計算効率を向上しています。

GNMTの影響

GNMTは、ニューラル機械翻訳の分野において重要な進歩をもたらしました。大規模な対訳コーパスと巨大なモデル、そして大量のGPUを用いることで、機械翻訳の精度と効率を大幅に向上させました。また、このシステムは、機械翻訳の研究開発において新たな標準を確立し、後続の研究に大きな影響を与えています。

Google Neural Machine Translation(GNMT)は、機械翻訳の精度と効率を向上させるために、多くの先進的な技術を取り入れており。
その一つが、ResNetで導入された残差接続(Residual Connection)またはレジデュアルブロックの概念です。

残差接続とは

残差接続は、深いニューラルネットワークの訓練を容易にするために設計されました。この技術は、入力をネットワークの複数の層を通過させる際に、その入力を出力に直接加算することで、勾配消失問題を緩和し、より深いネットワークの訓練を可能にします。

GNMTでの利用

GNMTでは、この残差接続の概念をエンコーダとデコーダの各層に適用しています。具体的には、エンコーダとデコーダの各LSTM層の間に残差接続を挿入することで、深いネットワーク構造であっても効率的に学習を進めることができます。これにより、モデルは長期的な依存関係をより効果的に捉えることが可能になり、翻訳の精度が向上します。

残差接続の効果

残差接続を取り入れることでGNMTは以下のような利点を享受しています:

  • 勾配消失問題の緩和:深いネットワークでの学習が容易になり、より複雑な翻訳モデルを効率的に訓練できます。

  • 学習の高速化:残差接続により、各層への勾配の流れが改善され、学習が加速されます。

  • 翻訳精度の向上:深いネットワークを用いることで、より豊富な文脈情報を捉えることが可能になり、翻訳の精度が向上します。

GNMTまとめ

GNMTは、ResNetで導入された残差接続の概念を取り入れることで、機械翻訳の精度と効率を大幅に向上させました。この技術により、深いニューラルネットワークを効率的に訓練し、高品質な翻訳を実現しています。


Seq2Seqモデル

Seq2Seqは「Encoder-Decoderモデル」を使って、系列データを別の系列データに変換するモデルである。適用例として、翻訳や対話モデル(チャット)の実装が可能になります。

Encoder側

LSTMで最後の隠れ層のベクトルを生成するのみです。なお、LSTMでなくRNNやGRU等のモデルが使われる場合があります。

Decoder側

Encoderで生成された隠れ層と文字生成開始を知らせる特殊文字を与え、以降は出力された文字を次のLSTM層へのインプットにして生成すべき文字の数だけ繰り返します。

seq2seq関係の論文

https://proceedings.neurips.cc/paper_files/paper/2014/file/a14ac55a4f27472c5d894ec1c3c743d2-Paper.pdf

LSTM(Long Short-Term Memory) という手法を使用し、最終的に英語からフランス語への翻訳を試みる。使用するデータセットはWMT-14で翻訳の精度はBLEUで34.8に達する。WMT-14とはmnistみたいなもので、BLEUとはどれだけ翻訳できているかを示すもので値域は1~100で高い方が精度が良い。定義では値域は0~1であるが百分率で用いられることが多い。

BLEUに関する論文概要

https://aclanthology.org/P02-1040.pdf

タイトル: BLEU: a Method for Automatic Evaluation of Machine Translation​​

著者: Kishore Papineni, Salim Roukos, Todd Ward, Wei-Jing Zhu (IBM T. J. Watson Research Center)

アブストラクト: 本論文では、機械翻訳の評価を人間ではなく自動で行う方法を提案しています。人間による評価は費用がかかり、時間も長くなるため、迅速かつ安価で言語に依存しない自動評価方法が求められています。この方法は人間の評価と高い相関を持ち、一度の実行にかかる追加コストがほとんどありません​​。

背景: 機械翻訳の人間による評価は多面的ですが、費用がかかり時間も長くなるという問題があります。機械翻訳システムの開発者は日々の変更がシステムに与える影響を監視する必要があり、そのため迅速な評価方法が必要です。この論文では、機械翻訳の進歩には評価が重要であるとし、自動評価方法「bilingual evaluation understudy」を提案しています​​。

方法:

  1. 修正されたn-gram精度: 機械翻訳システムが過剰に合理的な単語を生成することによる不自然だが精度が高い翻訳を防ぐために、修正されたn-gram精度を用います。これは、候補の翻訳単語の数を、参照翻訳内の最大単語数で制限します​​。

  2. 文の長さ: 翻訳の長さが適切でなければならず、評価指標はこれを強制します。修正されたn-gram精度だけでは適切な翻訳長を強制することができません​​。

  3. BLEUの詳細: テストコーパスの修正された精度スコアの幾何平均を計算し、それに簡潔さペナルティ係数を

乗じます。テキストの正規化として現在行われているのはケースフォールディングのみです​​。

結果: BLEUメトリックは0から1の範囲です。翻訳が参照翻訳と同一でない限り、スコア1を達成することはほとんどありません。参照翻訳の数が多いほどスコアは高くなります。テストコーパスで、人間の翻訳者は4つの参照翻訳に対して0.3468、2つの参照翻訳に対して0.2571のスコアを記録しました​​。

議論: BLEUスコアの信頼性、BLEUスコアの分散、ランダムに選ばれた500文のセットでS3がS2より優れていると判断されるかどうかについての疑問に対処しています。テストコーパスを25文の20ブロックに分割し、各システムについてBLEUメトリックを計算しました。得られたt統計値は、システム間のスコアの違いが統計的に非常に重要であることを示しています​​。

限界: BLEUは翻訳の品質を判断するための代理指標であり、人間の判断を完全に置き換えるものではありません。また、BLEUスコアと人間の評価との間には相関がありますが、これが因果関係を意味するわけではありません。さらに、異なる言語間の翻訳品質の比較には限界があります​​。

可能な応用: 本論文は、BLEUが機械翻訳の研究開発サイクルを加速させることを期待しています。特に、様々な言語から英語への翻訳におけるBLEUと人間の判断との相関の統計分析を行い、その有効性を補強しています​​。

上記のように

BLEU(Bilingual Evaluation Understudy)は、機械翻訳の品質を評価するための指標の一つです。一方、seq2seq(sequence-to-sequence)は、一連の入力(例えば、ある言語での文章)を別の一連の出力(別の言語での翻訳された文章)に変換するためのモデルです。以下に、BLEUとseq2seqの関係についてまとめます。

BLEUとは

  • 目的: BLEUは、機械翻訳されたテキストがどれだけ人間が翻訳したテキストに近いかを測定するために使用されます。

  • 方法: BLEUは、機械翻訳の結果と一つ以上の参照翻訳(人間が行った翻訳)との間の単語やフレーズの一致度を計算します。

  • 利点: BLEUは自動的に計算でき、機械翻訳の品質を迅速に評価するのに役立ちます。

BLEUとseq2seqの関係

  • 品質評価: BLEUは、seq2seqモデルによって生成された翻訳の品質を評価するために使用されます。これにより、翻訳モデルの改善点を特定し、より自然で正確な翻訳を目指すことができます。

  • 開発サイクルの加速: BLEUスコアを使用することで、seq2seqモデルの開発と改善のプロセスが加速されます。研究者や開発者は、BLEUスコアを基準にしてモデルの性能を追跡し、改善策を迅速に試すことができます。

総じて、BLEUはseq2seqモデルの性能を評価し、改善するための重要なツールとなっています。機械翻訳の分野では、このような自動評価指標が研究開発の効率化に大きく貢献しています。


seq2seq(sequence-to-sequence)モデルについて再度共有

seq2seqモデルは、エンコーダ・デコーダモデルの一種で、特に入力系列から出力系列を生成するタスクに適しています。このモデルは、翻訳や要約、質問応答システムなど、多くの自然言語処理タスクで使用されます。

seq2seqモデルの特徴は、入力系列の長さと出力系列の長さが異なっていても対応できる点です。これにより、例えば、長い文章を短い要約に変換するようなタスクにも適用できます。

エンコーダ・デコーダとseq2seqモデルは、入力系列から出力系列を生成するための強力なツールです。アテンション機構の導入により、これらのモデルはさらに精度の高い出力を生成することが可能になります。これらのモデルは、翻訳、要約、質問応答システムなど、多くの自然言語処理タスクで広く利用されています

Seq2Seqモデルの概要について再確認

  • エンコーダー: 入力系列(例えば、ある言語の文章)を固定長のベクトルに変換します。

  • デコーダー: エンコーダーからの固定長ベクトルを受け取り、目的の系列(例えば、別の言語への翻訳)を生成します。

Seq2Seqモデルにおいて、アテンション機構はデコーダーがエンコーダーの出力のどの部分に注目するかを決定するために使用されます。

実は Seq2Seqモデル は Attention アテンション機構を利用してます

Attention アテンション

ソフトアテンションとハードアテンション

Seq2Seqモデルにおいて、アテンション機構はデコーダーがエンコーダーの出力のどの部分に注目するかを決定するために使用されます。アテンションには主に「ソフトアテンション」と「ハードアテンション」の二種類があります。

  • ソフトアテンション: 入力系列の各要素に対して重みを割り当て、これらの重みを使ってコンテキストベクトルを生成します。この重みは、通常、ニューラルネットワークによって学習されます。ソフトアテンションは、すべての入力要素を考慮に入れるため、計算コストが高いですが、勾配計算が容易です。Seq2Seqモデルはソフトアテンションになります

  • ハードアテンション: 入力系列の特定の要素にのみ焦点を当てます。ハードアテンションは、どの要素に注目するかを確率的に決定します。計算コストはソフトアテンションより低いですが、勾配計算が不連続になるため、学習が難しくなることがあります。


アテンションに関する論文


アテンションとは何でしょうか?

実は系列変換モデルでは

系列情報をRNNで固定長のベクトルに変換するが
系列が長くなると、LSTMのようなしくみを使っても
うまく学習させるのは難しい

とても時間がかかってしまいます

そこでアテンションという仕組みが課題解決策として使われました

論文「Neural Machine Translation by Jointly Learning to Align and Translate」は、ニューラルネットワークを用いた機械翻訳に関する研究です。従来の統計的機械翻訳と異なり、ニューラル機械翻訳は単一のニューラルネットワークを構築し、翻訳性能を最大化するよう共同で調整することを目指しています。

この論文で提案されているモデルは、エンコーダー・デコーダーの枠組みに属しており、エンコーダーがソース文を固定長のベクトルにエンコードし、デコーダーがそのベクトルから翻訳を生成します。しかし、著者らは、固定長ベクトルの使用が基本的なエンコーダー・デコーダーアーキテクチャの性能向上のボトルネックになっていると推測しています。

そこで、著者らはこの問題を解決するために、モデルが自動的に(ソフトに)ソース文の中でターゲット単語の予測に関連する部分を探すことを可能にする新しいアプローチを提案しています。これにより、モデルはソース文の関連部分を明示的に固定セグメントとして形成する必要がなくなります。

この新しいアプローチを用いることで、著者らは英語からフランス語への翻訳タスクにおいて、既存の最先端のフレーズベースシステムと同等の翻訳性能を達成しています。さらに、質的分析により、モデルによって見つかった(ソフトな)アライメントが私たちの直感とよく一致していることが明らかになりました。

上記論文が アテンションになります

それでは アテンションについて以下で掘り下げていきます

アテンション機構

アテンション機構は、seq2seqモデルの性能を向上させるために導入された機構です。この機構は、デコーダが出力を生成する際に、エンコーダの出力した固定長のベクトル全体ではなく、入力系列の特定の部分に「注意」を向けることを可能にします。

アテンション機構により、モデルは入力系列のどの部分が出力系列の特定の部分と関連しているかを学習し、出力の精度を向上させることができます。これは特に、長い入力系列を扱う場合に有効です。

Attentionの概要と応用

Attentionは、入力データのどの部分に注目すべきかを動的に特定する仕組みです。この技術は自然言語処理を中心に発展し、機械翻訳や文章生成などの分野で最高水準の精度(SoTA)を達成しています。また、画像認識や時系列データ分析にも応用されています。

CNNにおける画像認識とAttention

画像領域のAttention

CNN(Convolutional Neural Network)による画像認識では、認識に関係ない背景などの情報が影響を与えることがあります。Attentionを用いることで、関連する領域に注目させることが可能です。

例えば、犬の画像を分類する場合、画像を前景と背景に分け、前景のみにフォーカスして学習を行うことができます。

画像の特徴に対するAttention: SENet

SENet(Squeeze-and-Excitation Networks)は、CNNのチャネルに対してAttentionを適用したアーキテクチャです。CNNでは、対象の輪郭やテクスチャなどの特徴をチャネル毎に抽出して学習します。

SENetでは、CNN(例えばResNet)で得られた特徴量マップに対し、SEブロックでGlobal Average Poolingを適用します。これにより、幅・高さ・チャネルを1×1×チャネル数に変換し、チャネル毎の代表値を算出します。その後、2層の全結合層と非線形処理を適用して、どのチャネルに注目すべきか
を決定します。

Attention機構の基本形と分類

Attention機構は、入力データに対して特定の部分に「注意」を向けることで、情報処理の精度を高める技術です。
この機構は、Query(Q)、Key(K)、Value(V)の3つのブロックを持つ形で一般化されています。
以下では、Attention機構の基本形とその分類について解説します。

基本形

Query(Q)Key(K)Value(V): Attention機構の入力として、これら3つのブロックが用いられます。これにより、どの情報に注目するか(QとKの関係)、注目した情報から何を取り出すか(V)が決定されます。

分類

  1. 入力形式による分類

    • Self-Attention: Q、K、Vに同じデータを入力します。この形式は、同一データ内の関連性や構造を把握するのに有効です。

    • Source-Target Attention: Qに入力されるデータとK、Vに入力されるデータが異なります。異なる2つのデータ間の関連性を把握する場合に用いられます。

  2. Attention出力の適用方法による分類

加算型 (Additive Attention)

  • 特徴: 加算型Attentionは、QueryとKeyの各要素を独立に加算し、その結果に基づいてAttentionの重みを計算します。この方法は直感的で理解しやすく、小規模なモデルやデータに適しています。

  • 計算方法: 加法注意(Additive Attention)と呼ばれることもあり、その場合はqueryとkeyをFFN(Feed Forward Network)に通してattention weightを求めます。

乗算型 (Multiplicative Attention)

  • 特徴: 乗算型Attentionは、QueryとKeyの内積(ドット積)を利用してAttentionの重みを計算します。この方法は計算効率が良く、特に大規模なデータセットやモデルに適しています。

  • 計算方法: 乗算型Attentionでは、QueryとKeyのドット積を計算し、その結果に基づいてAttentionの重みを決定します。この計算は、ベクトル間の類似度を直接的に測定することができます。

TransformerのDot-Product Attention

  • 特徴: TransformerモデルのDot-Product Attentionは、乗算型Attentionの一種です。Transformerでは、このDot-Product Attentionを効率的に計算するために、スケーリングファクターを導入しています。

  • 計算方法: Dot-Product Attentionでは、QueryとKeyのドット積を計算し、結果をKeyの次元数の平方根で割ることでスケーリングします。これにより、大規模なベクトルの内積が大きくなりすぎることを防ぎ、計算の安定性を保ちます。内積注意(Dot-Product Attention)とも呼ばれ、一般的に内積注意の方が加算型AttentionのFFN(Feed Forward Network)に比べてパラメーターを調整する必要がなく、処理も速いと言われています。

  • 違い: Dot-Product Attentionは乗算型Attentionの一形態でありながら、スケーリングによる安定化が特徴です。これにより、Transformerは大規模なデータセットやモデルにおいても高い計算効率と性能を実現しています。

Attention機構は、Q、K、Vのブロックを用いて一般化され、入力形式と出力の適用方法によって4つのパターンに分類されます。Self-AttentionとSource-Target Attentionは、データ間の関連性を把握するための入力形式の違いを示し、加算型と乗算型は、Attentionの計算方法の違いを示しています。この分類により、様々なタスクやデータに対して柔軟にAttention機構を適用することが可能になります。


Attentionまとめ

Attentionは、データの重要な部分に焦点を当てることで、モデルの性能を向上させる強力なツールです。自然言語処理だけでなく、画像認識などの分野でもその効果が認められており、多様な応用が可能です。SENetのようなアーキテクチャは、特に画像の特徴を効果的に捉えるために設計されており、精度の高い画像認識モデルを構築するために利用されています。

TransformerのDot-Product Attention
という言葉が 突然出てきてしまいましたが
Transformer は  attention と非常につながりがあります

ChatGPTの「GPT」はGenerative Pretrained Transformerの略であり、TransformerというのはGoogleが2017年に発表した『Attention is all you need』という論文で提案されたディープラーニングの画期的なアーキテクチャで、その論文のタイトル通り「Attention」という機構だけを使い倒している点が特徴的です

Attention is all you need という論文


Attentionの利用により精度が高まりましたが、LSTM/RNNで時系列データを逐次的に処理しているためデータの並列処理ができず高速化ができない課題は解決されていないままでした(Attention付きCNNを用いたモデルも考案されたが、長文の依存関係モデルを構築することが難しかった)


Transformer

  • Attentionのみで構成: 2017年にGoogleから発表された「Transformer」は、RNNやCNNを使わず、Attention機構のみを用いて構築されたモデルです。これにより、時系列データの逐次処理における並列処理の問題を解決し、高速化と精度向上を実現しました。

  • NLPモデルの基礎: Transformerは、BERTやGPTのような最新の自然言語処理(NLP)モデルの基礎となっています。また、画像認識分野においても、DETRのようなモデルで利用されています。

  • RNNやCNNを使わずAttention層のみで構築
    後述するSelf-Attention層とTarget-Source-Attention層のみで構築することで、並列処理が可能となりました。

  • PositionalEncoding
    RNN/LSTMを利用しないことで失われる文脈情報を、入力する単語データの文全体での位置情報を埋め込みます。

  • Attention層におけるQuery-Key-Valueモデルの採用
    より単語同士のアライメントをより正確に反映することができるようになりました。

Transformerは、再帰的な構造を持たない新しいタイプのモデルで、主に自然言語処理タスクに使用されます。その構造は、エンコーダーとデコーダーの2つの主要部分から成り立っています。

エンコーダーの構造

  1. Embedding層: 入力文章を512次元のベクトルに圧縮します。

  2. Positional Encoder層: 位置情報を付加します。

  3. Multi-Head Attention層: Self-Attentionを計算し、データ内のアライメントを付加します。

  4. Normalization: データの正規化を行います。

  5. Point-wise Feed-Forward Networks (PFFN): 位置単位での順伝搬ネットワークを通じて活性化関数を適用します。

  6. 再度のNormalization: 再度、データの正規化を行います。

  7. 繰り返し: 上記のステップをN回繰り返します。

デコーダーの構造

  1. Embedding層: 入力文章を512次元のベクトルに圧縮します。

  2. Positional Encoder層: 位置情報を付加します。

  3. Masked Multi-Head Attention層: Self-Attentionを計算し、データ内のアライメントを付加します。

  4. Normalization: データの正規化を行います。

  5. Multi-Head Attention: エンコーダーの出力をKeyとValueに、デコーダーの出力をQueryにしてAttentionを計算します。

  6. 再度のNormalization: 再度、データの正規化を行います。

  7. PFFNでの活性化関数の適用: PFFNを通じて活性化関数を適用します。

  8. 最終的なNormalization: 最終的なデータの正規化を行います。

  9. 繰り返し: 上記のステップをN回繰り返します。

特徴

  • 全ターゲット同時入力: 全てのターゲット単語を同時に入力し、全ターゲット単語を同時に予測します。

  • 並列処理の可能性: 再帰的な構造を持たないため、データの並列処理が可能です。

以下のサイトが非常に詳しく記載しております


BERT

BERT(Bidirectional Encoder Representations from Transformers)は、自然言語処理(NLP)の分野で革命をもたらしたモデルです。このモデルは、文章や単語の文脈を深く理解することができ、その結果、文章分類、質問応答、感情分析など、多くのNLPタスクで高い性能を発揮します。
transformerは、双方向理解ができる点から、より深く文脈を加味できるという点も注目ポイントです。

BERTの基本概念

  • 双方向性: BERTは文章を前から読むだけでなく、後ろからも読むことができます。これにより、単語の文脈をより正確に捉えることが可能になります。

  • Transformerモデルの利用: BERTはTransformerのエンコーダー部分を使用しています。Transformerは、文章内の単語間の関係を捉えるために「Attention機構」を用いることで知られています。

  • 事前学習と微調整: BERTは大量のテキストデータで事前学習され、特定のタスクに対しては追加の微調整を行うことで、そのタスクに特化したモデルを作成することができます。

BERTの仕組み

  1. 入力処理: 文章は単語に分割され、特別なトークン「[CLS]」と「[SEP]」が追加されます。「[CLS]」は文章の開始を、「[SEP]」は文章の終了または別の文章の開始を示します。

  2. 単語ベクトルの生成: 分割された単語は、それぞれに対応する単語ベクトルに変換されます。この単語ベクトルは、学習過程で最適化されます。

  3. 文脈の考慮: BERTは単語の文脈を考慮して単語ベクトルを生成します。同じ単語でも、文脈によって異なるベクトルが割り当てられることがあります。

  4. Transformer層: 文章の単語ベクトルはTransformer層を通過し、単語間の関係性を考慮した新たなベクトルに変換されます。

  5. 出力処理: Transformer層を通過したベクトルは、最終的に特定のNLPタスクに応じた形式で出力されます。

BERTの応用

BERTはその高い文脈理解能力により、様々なNLPタスクで優れた性能を発揮します。例えば、文章分類では文章全体の意味を捉え、質問応答では質問に対する答えを文章中から正確に抽出することができます。

BERTの事前学習手法

BERTの事前学習では、Masked Language Modeling(MLM)という手法を用いています。これは、文章からランダムに単語を選んで隠し(マスクし)、その隠された単語を予測することで、モデルが文脈を理解する能力を養うというものです。この事前学習を通じて、モデルは広範な言語知識を獲得し、後続のファインチューニングで特定のタスクに適用される際に、高い性能を発揮する基盤を築きます。

Transformer構造を用いた派生モデル

  • RoBERTa: BERTの事前学習手法を改良し、より大量のデータと長時間の学習を行うことで、BERTよりも性能を向上させたモデルです。

  • DeBERTa: BERTのアーキテクチャに加え、単語間の距離情報を考慮することで、より細かい文脈の理解を可能にしたモデルです。

  • GPT: デコーダー構造を用い、文章生成タスクに特化したモデルです。自然言語を生成する能力が高く、会話や文章作成などに利用されます。

  • T5BART: エンコーダー・デコーダー構造を用い、機械翻訳や文章要約などのタスクに適しています。これらのモデルは、入力テキストを理解し、新たなテキストを生成する能力を持ちます。

ドメイン特化型モデル

  • SciBERT: 科学論文の大量のテキストデータで事前学習を行い、科学関連のタスクで高い性能を発揮します。

  • CodeBERT: プログラミング言語のコードで事前学習を行い、コード生成やコード検索タスクに特化したモデルです。

これらのモデルは、BERTが提供する強力な言語理解の基盤の上に構築され、特定のニーズに応じてカスタマイズされています。Transformer構造の柔軟性と拡張性により、自然言語処理の分野では今後もさまざまな進化が期待されます。

Next Sentence Prediction (NSP)

Next Sentence Prediction(NSP)は、BERT(Bidirectional Encoder Representations from Transformers)モデルのトレーニング手法の一つで、文の関係性を理解するために設計されています。この手法では、モデルに2つの文が与えられ、2番目の文が1番目の文に論理的に続くものかどうかを予測させます。このプロセスを通じて、モデルは文間の関係性や文脈をより深く理解する能力を養います。

具体的には、トレーニングデータセットからランダムに選ばれた2つの文「文A」と「文B」をモデルに入力します。これらの文は、実際には連続している場合(ポジティブな例)と、ランダムに選ばれた関連性のない2つの文の場合(ネガティブな例)の2種類があります。モデルのタスクは、与えられた2つの文が連続している(つまり、文Bが文Aの直後に来る)かどうかを予測することです。

このタスクを通じて、BERTは文の流れや論理的なつながりを捉えることを学び、結果としてより洗練された文脈理解能力を獲得します。NSPは、BERTが質問応答(QA)、文章要約、文書分類などのさまざまな自然言語処理(NLP)タスクで優れた性能を発揮する基礎を築きます。


ベンチマーク


ベンチマークとは、コンピューターシステムやソフトウェア、アルゴリズムなどの性能を評価、比較するための基準やテストのことを指します。ベンチマークを使用することで、異なるシステムやソフトウェア間での性能を公平に比較することが可能になります。また、特定の基準に基づいて性能を測定することで、システムやソフトウェアの改善点を特定し、最適化するための指標としても活用されます。
ベンチマークには様々な種類があり、使用する目的や評価したい性能の種類に応じて選択されます。例えば、コンピューターのCPUやGPUの処理速度を測定するベンチマーク、データベースやサーバーの応答時間や処理能力を評価するベンチマーク、機械学習モデルの精度や効率を評価するベンチマークなどがあります。
特に、機械学習や自然言語処理の分野では、GLUEやSQuADなどのベンチマークが広く利用されており、これらのベンチマークを通じて、モデルの言語理解能力や推論能力などを評価し、研究開発の進捗を測定することが一般的です。ベンチマークを使用することで、技術の進歩を定量的に追跡し、新しいアプローチやアルゴリズムの有効性を検証することが可能になります。


GLUE(General Language Understanding Evaluation)は、自然言語理解(NLU)の技術を評価するために設計されたベンチマークです。このベンチマークは、様々なNLUタスクをカバーする一連のデータセットで構成されており、モデルが言語をどの程度理解しているかを広範囲にわたって評価することを目的としています。

  1. CoLA (Corpus of Linguistic Acceptability): 文が文法的に正しいかどうかを判断するタスクです。このデータセットは、文が英語の文法規則に従っているかどうかをモデルが識別する能力を試します。

  2. SST-2 (Stanford Sentiment Treebank): 文の感情(肯定的または否定的)を分類するタスクです。このデータセットは、モデルが文の感情的なトーンを理解し、正確に分類できるかを評価します。

  3. MRPC (Microsoft Research Paraphrase Corpus): 二つの文が同じ意味を持つかどうかを判断するタスクです。このデータセットは、モデルが異なる表現を通じて同じ情報を認識できるかをテストします。

  4. STS-B (Semantic Textual Similarity Benchmark): 二つの文の意味的な類似性をスコアリングするタスクです。このデータセットは、モデルが文間の意味的な関連性をどの程度正確に捉えられるかを評価します。

  5. QQP (Quora Question Pairs): 二つの質問が同じ意図を持つかどうかを判断するタスクです。このデータセットは、モデルが異なる形式で表現された同じ質問を識別できるかをテストします。

  6. MNLI (Multi-Genre Natural Language Inference): ある文(前提)が別の文(仮説)を含意するか、矛盾するか、または関連がないかを判断するタスクです。このデータセットは、モデルが複雑な推論を行う能力を評価します。

  7. QNLI (Question Natural Language Inference): 質問と文が与えられたときに、その文が質問に対する答えを含むかどうかを判断するタスクです。

  8. RTE (Recognizing Textual Entailment): 二つの文の関係を含意、矛盾、または中立のいずれかとして分類するタスクです。

この記事が気に入ったらサポートをしてみませんか?