Closed6

『機械学習エンジニアのためのTransformers』読み

ikdikd

まえがき

  • データサイエンティストや機械学習エンジニア向け
    • ❌ 機械学習の入門書
  • Hugging Face の NLP コースの内容を分かっていればよいらしい
  • 理論は必要なところだけ説明する
  • コードを自分で動かしてみることを推奨
  • 各章はほぼ自己完結している
  • 後半の章はタスクの難易度が高い

用語

Trainer API, Accelerate ライブラリ, Datasets ライブラリ

ikdikd

1章 入門 Transformers

  • GPT や BERT は Transformer モデルの一種らしい

1.1 エンコーダ・デコーダのフレームワーク

  • RNN は受け取った入力をネットワークに通して「隠れ状態」ベクトルを出力する
    • 「隠れ」感や「状態」感はどこなのだろう……?
  • ある言語の単語列 → 別の言語の単語列にするタスクはエンコーダ・デコーダ (Seq2seq) アーキテクチャが適している
    • エンコーダは入力を「最後の隠れ状態」という数値表現にエンコードする
    • デコーダが最後の隠れ状態から出力を生成する
  • 最後の隠れ状態は、デコーダが出力を生成するのに使うので、入力系列全体の意味を表す必要があるらしい (どういうこと?)
    • 長い系列の場合ははじめのほうの情報が失われがち
  • 「アテンション」という方法で、デコーダがエンコーダの隠れ状態にアクセスできるようにする
    • Transformer など現代のニューラルネットワークアーキテクチャの重要な構成要素

1.2 アテンション機構

  • アテンション
    • エンコーダは (単一の隠れ状態を生成するのではなく) デコーダがアクセスできる隠れ状態を各時刻で出力する
    • すべての状態を使うとデコーダの入力が膨大になってよくない
    • デコーダが、エンコーダの各状態に、デコードの時刻ごとに異なる重み (アテンション) を割りあてる
  • Transformer では「セルフアテンション」という特殊なアテンションを使う
    • 3章
    • RNN を使ったモデルより高速に学習できる

1.3 NLP における転移学習

  • 画像認識では「転移学習」を使うのが一般的
    • ImageNet(https://image-net.org)のような大規模データセットでモデルを「事前学習」させる
    • エッジや色などの画像の基本的な特徴をモデルに教える
    • 事前学習済みモデルは、花の種の分類などの下流タスクでファインチューニングできる
  • NLP で似たような事前学習プロセスを踏むには、大量のラベル付きデータが必要 & 性能も画像認識と比べて劣る
  • ULMFiT
    • 3つのステップ:事前学習・ドメイン適応・ファインチューニング
    • 事前学習
      • 出現済みの単語をもとに次の単語を予測するタスク「言語モデル」を学習する
      • ラベル付きデータを必要とせず Wikipedia などにある大量のテキストを使える
    • ドメイン適応
      • この段階では、言語モデルがターゲットコーパスの次の単語を予測する必要がある
    • ファインチューニング
      • この段階では、言語モデルはターゲットタスク (例:映画レビューの感情分類) 用の分類層とともにファインチューニングされる
  • GPT
    • Transformer のデコーダ部分、ULMFiT と同じ言語モデルアプローチ
    • BookCorpus で事前学習
  • BERT
    • Transformer のエンコーダ部分、「マスク言語モデル」を使用
      • マスク言語モデルの目的:テキスト中のランダムでマスクされた単語を予測する
    • BookCorpus, Wikipedia で事前学習

用語

(翻訳文の単語と原文の単語の間の) アライメント, LSTM モデル

ikdikd

2章 テキスト分類

2.1 データセット

  • Transformers モデルの最大入力系列長「最大コンテキストサイズ」を超える入力だと性能が落ちることがある

2.2 テキストからトークンへ

  • 文字トークン化
    • 1文字ずつトークンとして扱う
    • (複数の文字からなる) 単語などの言語構造を学習する必要があり、膨大な計算量やメモリが必要でほとんど使われない
  • 単語トークン化
    • 空白区切りなどでテキストを単語に分割してトークンとする
    • 単語の種類が多いとモデルの学習コストが高い
    • コーパス中の頻出単語のみを語彙としてそれ以外は「未知語」にしちゃう、妥協案がある
  • サブワードトークン化
    • 文字トークン化 & 単語トークン化のいいとこどり

2.3 テキスト分類器の学習

テキストから感情を推定するお話

  • DistilBERT などのモデルはマスクされた単語を予測するように事前学習されている
  • そのままテキスト分類に使うことはできない
  • 「特徴抽出」or「ファインチューニング」をする
  • (図2-4の説明がぜんぜん分からない……)

2.3.1 特徴抽出器としての Transformer

  • 分類器を学習する
    • 小さいモデルを素早く学習できる
    • 事前学習済みモデルは更新しない
  • モデルが出力した768次元の隠れ状態 (ベクトル) を UMAP アルゴリズムで2次元に射影して見てみる
  • sadness, anger, fear はあまり分離できてなさそう
    • このモデルは、マスクされた単語を予測することで暗黙的に感情を学習しただけなので、そういうもの
  • 単純にランダムな感情をえらぶヒューリスティックよりは良い正解率

2.3.2 Transformer のファインチューニング

  • モデル全体を学習する
    • 事前学習済みモデルのパラメータも更新する
  • 分類ヘッドが微分可能である必要がある (どういうこと?)
  • transformers AutoModelForSequenceClassification モデルは事前学習済みモデルの出力の上に分類ヘッドを持っている
    • えええ、便利すぎる
    • 図2-6の全部をやってくれそう
  • 損失の大きいデータを見ると、ラベル付けの誤りや新しいクラスが必要そうなことに気づける
  • ディープラーニングモデルは自信のある (損失の小さい) データをうまく使ってクラスを予測する

用語

F1スコア, (モデルの) 損失

ikdikd

3章 Transformerの詳細

Transformer アーキテクチャを PyTorch で実装する。

各パーツを PyTorch の nn.Module のサブクラスで定義して、つなぎあわせることで実装できるっぽい。

BertViz によるアテンションの可視化はすごくわかりやすそう (だけどよくわからない)

行列・ベクトルの次元がどう変換されるのかピンと来てない。ちゃんと追えるようになったほうがいいかも。

ikdikd

4章以降 Transformers を使って色々な問題を解いていく内容で面白そう。

先に別の入門書を読んでみよう。

このスクラップは2024/03/21にクローズされました