OMSCS 2025 Summer (夏学期) では Natural Language (NL) を受講しており、中間試験に向けてここまで何を学んだか整理した。 詳細な数式などは省略しており、各モジュールでどのような内容が含まれているかと大まかな流れを抑えている。
Content
Module 1 Introduction to NLP
自然言語処理(NLP)とは
- 人間の言語をコンピュータに理解・分析・生成させる技術や手法の集合体
- 言語の意味や文脈を理解し、流暢で適切なテキストを生成できるようにすることが目的
自然言語とは
- 人間が無意識のうちに進化させた情報伝達の手段
- 音や記号を使って、意味を共有するための構造化されたプロトコル
- 英語、日本語、手話など、異なる構造とルールを持つ多様な言語が存在
自然言語の特徴
- 意味の曖昧性、略語や誤りを含んでも通じる「損失ありだが効率的」
- 多義語、比喩、新語(例:「yeet」「vibe shift」)が多く、コンピュータには難解
なぜコンピュータに言語を理解させたいのか
- 人とコンピュータのインタラクションを自然にするため
- 大量の情報が自然言語で記録されており、処理可能にすることで多くの応用が可能に(翻訳、検索、対話、文章補助など)
NLPが難しい理由
- 文法や構文の曖昧さ(例:「We saw the woman with the sandwich wrapped in paper」)
- ドメイン固有の意味、非文字通りの表現、ポートマントー語(例:brunch)
数理的アプローチとディープラーニング
- 確率・統計を用いたテキストの分類や生成
- 例:あるレビューがポジティブである確率を算出
- ディープラーニングによる関数近似
- 文章生成、感情分類などのタスクをデータから学習
Module 2 Foundations
確率論の基礎と応用
- 確率変数とは観測する対象であり、値とその確率分布を持つ
- 複雑な確率計算(周辺、和、条件付き確率)を駆使して、AI が「どのような世界にいるか」を推測
- Full Joint Distribution では、すべての変数の組み合わせの確率を示す
条件付き確率と隠れ変数
- 観測できない変数(例:原因)に対して、観測可能な変数(例:影響)を使って推論する場面で活用。
- 条件付き確率を使って「影があるとき、忍者がいる確率」などを推測します。
ベイズ則とナイーブベイズ
- ベイズの定理を活用して、原因から結果または結果から原因への確率を計算。
- ナイーブベイズ仮定では、「影響を与える複数の要素は独立している」として簡略化。
- 例:嗅覚喪失(Anosmia)があるときに COVID を推測する。
ニューラルネットワークと深層学習
- 教師あり学習の文脈で、入力と出力のペアから関数を学習。
- 活性化関数(シグモイドやReLU)と勾配降下法を使ってネットワークを最適化。
- PyTorch ライブラリを使ったモデル構築の例もあり。
PyTorch実装の簡易例
forward()
メソッドでレイヤー間の流れを定義。loss.backward()
による損失関数に基づいた重みの更新。- 並列化やGPU対応により効率的な学習が可能。
Module 3 Classification
自然言語処理において、感情分析やトピック抽出などは分類の問題となる。また、ドキュメント生成に関しても、次に生成されるテキストは候補の中から最も確率の高い単語を選択する意味で分類と言える。
単語の表現としては、ドキュメントの出現頻度を基にベクトル化する Bag of Words がある。ベクトルのサイズは出現頻度には依存しないが、常にボキャブラリーのサイズは必要とされる。一単語で表現する unigram と二つの単語で表現する bigram などがあり、複数単語で表現することも可能である。
分類手法に関しては、バイナリー分類だと Bayesian Classification、Binary Logistic Regression が中心であった。複数のラベルとなる場合について、Multinomial Logistic Regression に関して学んだ。計算を行うテクニックとしては、確率同士のかけ合わせにより値が小さくなることから Log の導入や 0 が含まれ確率が消滅してしまうことを防ぐため、分母と分子に 1 を加える Smoothing が存在する。
Module 4 Language Modeling
英語には 600,000 語あると言われているが、頻繁に使用される上位50,000 語に限定することが多いようである。 流暢さを表現するとなると、出現する単語の順番も重要になる。Bayesian Statistics で表現すると、単語の出現確率の連鎖律で表現される。一つの単語のみであると unigram approach となるが、前の単語によって出現する単語が変化するため適していない。bigram approach であれば、直前の単語を考慮した条件付き確率で表現される。ここれを展開して n-gram では、過去 n 語の単語を考慮したモデルになる。この条件部分がコンテキストと呼ばれる。
単語を数値で表現するため、one-hot ベクトルを導入する。 trigram などになると、one-hot ベクトルを 2 個連結した入力となるため、入力ベクトルのサイズが増加していき、スケールが難しい。 入力を圧縮した隠れ層を作成するエンコーダーと、隠れ層から情報を復元するデコーダーの利用が考えられる。しかし、コンテキストの問題は解決しないため、Recurrent Neural Network (RNN) が活用できる。 RNN の入力において、直前の単語に対するエンコーダーによる隠れ層を入力と結合することで、コンテキストサイズの問題を解決して、過去の履歴を考慮する。しかしながら、過去の隠れ層の情報が上書きされる可能性があるため、それに対して Long Short Term Memory (LSTM) が提唱された。LSTM では Memory Cell と呼ばれるコンポーネントにおいて、忘却ゲート、入力ゲート、出力ゲートで構成される。
忘却ゲート
- 目的:セルメモリにおいて何を記憶するか削除するか判断
- 活性化関数:sigmoid
- 出力値 : 1, 0
- 出力先:セルメモリへの乗算
入力ゲートg
- 目的:セルメモリをどう更新するかを判断
- 活性化関数:tanh
- 出力値 : 1, -1
- 出力先:i への乗算
入力ゲートi
- 目的:セルメモリをどう更新するかを判断
- 活性化関数:sigmoid
- 出力値 : 1, 0
- 出力先:g への乗算
入力ゲート
- 目的:セルメモリへの追加、削減、変更なし
- 出力値 : 1, -1, 0
- 入力:入力ゲートg, i 乗算による出力
- 出力先:忘却ゲートを経たセルメモリへの加算
出力ゲート
- 目的:次に渡すべき新しい隠れ層の生成
- 活性化関数:sigmoid
- 出力値 : 1, 0
- 出力先:入力ゲートを経たセルメモリの tanh への乗算
翻訳のようなタスクでは文法自体が異なるため都度入力と出力が対応しないような場合があり、LSTM が適さず Sequence-to-Sequence が開発された。一連の入力シーケンスをエンコーダーで先に適用させて、隠れ層を更新する方式である。エンコーダーとデコーダーが分離しており、デコーダーにおいては出力されたワードが次の出力の入力になる。そのため、デコーダーにおいてもエンコーダーが存在する。
学習において、デコーダーで出力されたワードを次の入力とするため、学習の初期では見当違いなワードが入力となる可能性があるが、正解データを入力とする Teacher enforce によって、効率を上げることが可能である。 エンコーダーにおいてシーケンスを通して学習する中で、シーケンス中の隠れ層は破棄されるが、デコーダーで出力トークンに関連する隠れ層に注力する機構を Attention という。 評価指標として perprexity があるが、ニューラルネットワークの指数関数的な負の対数尤度損失であるため低い方が良い。
Module 5 Semantics
one-hot ベクトルだと、単語の意味を考慮しておらず、複数単語に関して値を 1 として一つのベクトルで表現するマルチホットが考えられる。しかし、各単語では重要度が異なる。Term Frequency-Inverse Document Frequency (TF-IDF) で単語の重要度を計算し、ベクトルで表現する。TF 部分では、頻繁に出力する単語を重視し、IDF では他のドキュメントでも出現する単語に関しては重要度は低いと評価する。これにより頻繁に出現する冠詞などが重視されることを避ける。ベクトル同士の比較はコサイン類似度を利用する。この方法の問題点は、ベクトルがボキャブラリサイズ (50,000 語など) になることと、同義語の評価を適切にできないことである。
ボキャブラリサイズよりも小さい d 次元にベクトルを圧縮する埋め込みによって、上記の解決が図られる。RNN のエンコーダーで既に同じようなことを実施していたが、同じような単語が同じようなベクトルになることを保証しているものではない。そのため、Word2vec によってベクトルが生成されるが、周辺単語から特定の単語を予測する continuous bag-of-words (CBOW) と中心の単語から周囲を予測する Skip Gram がある。これらのタスクを学習することで、ニューラルネットワークの重み更新していき、ベクトル生成を実現する。ベクトル化することで、ベクトル同士の加算、減算によって意味を反映させることができる。
Module 6 Modern Neural Architectures
Module 3 の bigram のように、入力に wide token を利用することは、柔軟性や計算コストの観点から適さないとされていた。しかし、1024 token などの大きな one-hot ベクトルを利用することや計算リソースの向上によって、これらの問題は大きな問題とされなくなった。 その結果、3 つの概念を基に Transformer が登場した。
- トークンシーケンスを構成する大きな入力、出力ウィンドウが利用可能なエンコーダー/デコーダー
- Seq2seq のように、シーケンス全体を考慮可能
- Masking
- 任意の位置の単語を予測する Infilling と最後の単語を予測する Continuation を行う
- Self Attention
- 二つの系列から情報を受け取って対応付ける Attention とは異なり、1 つの系列で自らを対応付ける
ざっくり理解する分散表現, Attention, Self Attention, Transformer
Transformer の動作はこちらから確認できる。
A walkthrough of transformer architecture code
シーケンシャルな入力を表現するために、sin、cos 関数に基づく位置情報を付与する positional embeddings が利用されている。 single head self-attention だと、一つのトークンに対する attention だが、Multi Head によって複数のトークンに対して self-attention を有効化することができる。
Bidirectional Encoder Representation from Transformers (BERT) に関しては、同じ単語でも文脈によっては意味が異なることに対するコンテキスト埋め込みに対応している。 BERT は双方向であるため、マスクされたトークンから前方と後方を見ることで訓練されている。その結果、テキスト生成に弱みがあるが、こちらを解決したのが GPT である。
モデルを独自にカスタマイズする方法として、Fine tuning がある。Instruction Tuning とは、インストラクションと回答を組み合わせたデータセットを作成して学習させるものである。 Reinforcement Learning from Human Feedback (RHLF) に関しては、人の good や bad のフィードバックに応じて、期待するような回答を生成するよう調整を行う手法である。人間の反応をClassifier が学習することができれば、フィードバックの自動化が期待される。
Assignment
Assignment 1
Pytorch の利用方法に慣れることが目的の課題であり、ネットワークの作成と学習を実装した。
Assignment 2
NLP の分類を行った課題であり、感情分析を行うため Naive Bayes、Logistic Regression を実装した。 GLoVe によって生成した埋め込みを基に、Multinomial Regression によってトピック分析を行った。
Assignment 3a
RNN を実装し、テキスト生成を行った。Temprature の実装も行い、より期待する結果に近づくよう調整した。
Reference
こちらのブログで各モジュールの詳細内容が含まれている。
https://lowyx.com/posts/gt-nlp-notes/#module-1-introduction-to-nlp