深層学習 学習まとめ: 自然言語処理

# 自然言語処理
## Seq2seq
- 系列(Sequence)を入力として、系列を出力する
- Encoder-Decoderモデル
    - 入力系列がEncode(内部状態に変換)され、内部状態からDecode(系列に変換)する
        - 内部状態のことを隠れ状態とも表現する
    - 翻訳(言語A→言語B)、音声認識(波形→テキスト)、チャットボット(テキスト→テキスト)などに利用される
- RNNを利用し、系列情報をなめて内部状態に変換する
- 言語モデルは単語の並びに確率を与える
    - 単語の並びに対して尤度(それがどれだけ起こり得るか)、すなわち文章として自然かを確率で評価する
    - 数式的には同時確率を事後確率に分解して表せる
        - $ P(w_1, \cdots  , w_m) = \displaystyle \prod_{i=1}^m P(w_i \vert w_1, \cdots , w_{i-1}) $
        - 時刻t-1までの情報で、時刻tの事後確率を求める
            - それによって同時確率が計算できる
- Seq2seqでは、EncoderからDecoderに渡される内部状態ベクトルが鍵
    - EncoderもDecoderもそれぞれ独立したRNNだが、Decoderは内部状態(隠れ状態)の初期値として、Encoderで生成された内部状態を受け取る
    - Decoderのoutput側に正解を当てれば、教師あり学習がEnd2endで行える
- 実装上の工夫
    - Teacher Forcing(教師強制)
        - RNNでは、時刻tの出力を時刻t+1の入力とすることができるが、この方法でDecoderを学習させると連鎖的に誤差が大きくなっていき、学習が不安定になったり収束が遅くなったりする問題が発生する
        - この対策として、Teacher Forcingでは、訓練時にはDecoder側の入力に、教師データをそのまま使う
        - しかし、それだけでは評価時の動きが安定しない
        - このため、Teacher Forcingの拡張として、教師データを入力とするか生成された結果を入力とするかを確率的にサンプリングするScheduled Samplingという手法がある

## GNMT(Google's Neural Machine Translation)
- Google社が開発したニューラル機械翻訳のシステム
- エンコーダー、デコーダー、アテンションから構成される
    - 8層のエンコーダー層と8層のデコーダー層
    - アテンションは、エンコーダーの最終層の出力とデコーダーの最初の層の出力との間で計算される
        - デコーダー側の時間ステップ$ i $についてアテンションを計算し、その結果を時間ステップ$ i+1 $のデコーダーの全層に送る
- 様々な工夫が積み重ねられている
    - LSTMレイヤーの多層化
    - 双方向LSTM層
        - エンコーダーの一層目のみ
    - 残差接続(Residual connection)
    - 複数GPUでの分散学習
        - エンコーダーおよびデコーダーのそれぞれ1層ごとに、1個のGPUを割り当てる(合計16個)

    - モデルの並列化とともにデータの並列化を行う
        - n個のモデルのレプリカを同時に訓練する
        - n個のレプリカは全て同じ重みを共有しており、重みの更新は非同期型で行う
        - 量子化を利用した予測の高速化
- 転移学習にも活用される
    - ポルトガル語から英語、および、英語からスペイン語の機械翻訳の訓練を行なったGNMTのモデルを用いると、ポルトガル語とスペイン語の正解ラベルのペアを一つも与えなくても、ポルトガル語からスペイン語の機械翻訳を行うことができる(ゼロショット学習)

## Transfomer
- Encoder-Decoder × Attention
- ニューラル機械翻訳の問題点は長さに弱いということ
    - 翻訳元の文の内容を一つのベクトルで表現するため、文が長くなると表現力が足りなくなる
- これに対して、Attention(注意機構)は、翻訳先の各単語を選択する際に、翻訳元の文中の各単語の隠れ状態を利用する
    - 文章を一度にまとめて読み込み、各単語に重みをつける
        - 重みを全て足すと1
        - 重みはFFNN(Feed Forward NN)で求める
    - Attentionは辞書オブジェクト
        - query(検索クエリ)に一致するkeyを索引し、対応するvalueを取り出す操作であると見做すことができる
            - $ Attention(Q, K, V) = softmax(QK^T)V $
    - Attention機構には二種類ある
        - Self Attention
            - Query, Key, Valueが全てSource由来
            - 自分の入力だけでどこに注目すべきか(重み)を決める
            - ある意味Convolutionに近い処理
            - Transformerでは、Encoderが内部状態を生成する際、またDecoderが教師データを処理する際に使われる
        - Source Target Attention
            - Key, ValueはSource、QueryがTargetから
            - TransformerではDecoder(の下から2層目)がEncoderから内部状態を受け取る際に使われる

- TransformerはAttention機構のみを使い、RNNは使わない
    - 計算量が圧倒的に少ない
- 特徴的なモジュール
    - [Encoder] Positional Encodingで単語ベクトルに単語の位置を追加
        - 単語の位置情報をエンコード
            - $ PE_{(pos, 2i)} = sin(pos/10000^{2i/d_{model}}) $
            - $ PE_{(pos, 2i+1)} = cos(pos/10000^{2i/d_{model}}) $
            - $ pos $は単語の位置、$ i $は埋め込み後の次元
            - Positional Encodingの埋め込み後の各次元は、波長が$ 2π $から$ 10000·2π $に伸びる正弦波に対応する
        - ある意味(ソフトな)2進数表現
    - [Encoder] Multi-Head Attentionは複数のヘッドで行うDot Product Attention
        - Scaled dot product attention: 全単語に関するAttentionをまとめて計算する
            - $ Attention(Q, K, V) = softmax(\dfrac{QK^T}{\sqrt{d_k}})V $
            - $ d_k $はQuery, Keyの次元であり、$ d_k $が大きくなると逆伝播時のソフトマックス関数の勾配が小さくなり、学習が円滑に進まなくなるため、$ \frac{1}{\sqrt{d_k}} $でスケールを調整している
        - Multi-Head Attentionでは重みパラメーターの異なる8個のヘッドを使用
            - それぞれ異なる種類の情報を収集8つのヘッドの出力をconcat
            - $ MultiHead(Q, K, V) = Concat(head_1, \cdots, head_h)W^O $
            - $ head_i = Attention(QW_i^Q, KW_i^K, VW_i^V) $
    - [Encoder] Feed Forwardで単語の位置ごとに独立処理する全結合
        - Point-Wise Feed-Forward Networks: 位置情報を保持したまま順伝播させる
    - [Decoder] Masked Multi-Head Attentionで未来の単語を見ないようにマスク
        - Decoderでは教師データを受け取るが、その際に最初から正解を見ないようにマスクした上でAttentionを得る
            - マスクがかけられた場所の値は、ソフトマックス関数に入力される前に$ -\infty $に置き換える
    - その他、各層にAdd(Residual Connection)、Norm(Layer Normalization)をかけている

## BERT
- Bidirectional(未来の情報も活用する)でDeepなTransformer
    - Unidirectional(過去の情報のみ活用する)なOpenAI GPTと異なり、Bidirectional(未来の情報も活用する)
    - 事前学習タスクとして、マスク単語予測タスク、隣接文判定タスクを与えた
    - 複数のタスクで性能を発揮できる(特定のタスクに特化していない)
- もともと自然言語処理タスクにおいては、事前学習が有効とされている
    - 文レベルのタスク: 文同士の関係性
    - トークンレベルでのタスク: トークンレベルで良い出力が求められる
    - 事前学習の種類
        - Feature-based(特徴量ベース): 何らかの方法で文章の特徴量を抽出する
            - 古くはN-gramやここ10年ではWord2Vecなど
            - 最近ではContext sensitiveなモデルもある(ElMoが有名)
        - Fine-tuning
            - 教師なし学習での事前学習の後に、使いたいタスクの元で教師あり学習での再学習を行う
                - つまり事前学習はパラメーターの初期値として利用され、Fine-tuningの中で更新される
            - OpenAIが代表例、BERTもこのアプローチ
    - BERTはFine-tuningアプローチの事前学習に工夫を加えた
        - 双方向Transformerだが、モデルの中に未来情報のリークを防ぐためのマスクが存在しない
        - 空欄語予測(Masked Language Prediction)と隣接文予測の2タスクを行う
            - これによって単語分散表現(局所的な特徴)と文章分散表現(大域的な特徴)を同時に獲得できる
    - 空欄語予測
        - 単語全体の15%をマスクして予測させる
        - 一般的には双方向にすると、間接的に自分自身を見てしまう(カンニングしてしまう)ため、発想を変え、次の単語ではなく、ランダムに抜かれた単語を予測するモデルにした(CBOWの発想)
        - ただし、全体の15%しか学習材料に使えないため学習に時間がかかる
    - 隣接文予測
        - ２つの連なる文章ペアに対して、隣接文を50%の確立でシャッフルする
        - これを入力として、隣接文であるかどうか(True/False)を出力する
- BERTはそこまで重くないので、Fine-tuningは比較的容易に行える
    - タスクにあわせてのFine-tuning学習が可能
        - タスクに合わせて、必要な蛇口をつけるイメージ
    - ハイパーパラメーターの探索も可能

## GPT
- 巨大な文章のデータセット（コーパス）を用いて 事前学習（pre-trained)を実施
    - 汎用的な特徴量を習得済みで、 転移学習（Transfer learning)に使用可能
    - 転用する際にはネットワーク（主に下流）のファインチューニングを行う
- GPTは2019年にOpenAIが開発
    - その後GPT-2、GPT-3、GPT-4が発表されている
    - パラメーター数は飛躍的に増加し、GPT-3ではパラメーター数が1,750億個となっている
        - 約45TBのコーパスで事前学習
    - GPT-4のパラメーター数は非公開だが、5,000億〜1兆個と言われている
- 基本構造はTransformer
    - 「ある単語の次に来る単語」を予測し、自動的に文章を完成できるように、教師なし学習を行う
        - 出力値は「その単語が次に来る確率」
- フェイクニュースなどの悪用リスク、学習や運用のコストの制約、機能の限界(文法は正しいが、内容に違和感や矛盾があることがある)などがある
- GPT-3の推論には、zero-shot(例示なし)、one-shot(例示一つ)、few-shots(例示複数)がある
- BERTとGPTの違い
    - BERTはTransformerのエンコーダー部分を使っている、これに対し、GPTはTransformerのデコーダー部分を使っている
    - BERTは双方向Transformer(未来の情報も活用する)で、GPTは単一方向のTransformer
    - BERTは新しいタスクに対してファインチューニングが必要だが、GPT-3はファインチューニングをしない

## トピック: BLEU (BiLingual Evaluation Understudy)
- BLEUはニューラルネットワークのモデルではなく、機械翻訳の精度を評価指数
    - 0~1で表される
        - 一般的にはBLEUスコアが0.4以上の場合に高品質であると評価され、0.6を超えると人手翻訳よりも品質が高いという評価になる
- $ BLEU = BP·exp( \displaystyle \sum_{n=1}^N \dfrac{1}{N} \log P_n) $
    - $ BP = \begin{cases} 1 &ensp; (if &ensp; c  \geq r) \\\ e^{1 - \frac{r}{c}} &ensp; (if &ensp; c \lt r ) \end{cases} $　
        - $ c $は機械翻訳の長さ、$ r $は参照翻訳の長さ
    - $ P_n $はn-gramにおけるmodified n-gram precision
        - $ P_n = \dfrac{翻訳文と参照訳で一致したn-gram数}{翻訳文の全n-gram数} $
- BP(Brevity Penalty)は機械翻訳が参照翻訳より短い場合にペナルティを与え、機械翻訳が参照翻訳より長い場合にはペナルティを与えない
    - 機械翻訳が参照翻訳より長い($ c  \gt r $)場合には、modified n-gram precisionは小さくなり、実質的にペナルティになっている(つまり、BPでもペナルティを与える必要はない)
- $ exp( \displaystyle \sum_{n=1}^N \dfrac{1}{N} \log P_n) $は、modified n-gram precisionの対数加重平均
    - modified n-gram precisionはnについて指数的に小さくなる傾向があるため、対数加重平均をとってスコアを平坦化している
    - 英文の場合、n=1~4におけるmodified n-gram precisionの値の対数加重平均を用いることが一般的
    - nが小さい時のスコアは妥当性、nが大きい時のスコアは流暢性を評価していると考えることができ、対数加重平均をとることによって、機械翻訳の妥当性と流暢性の双方を考慮した安定的な評価ができる