※本記事は、スタンフォード大学のオンラインAI教育プログラムで公開されている講義「NLP with Deep Learning (CS224N) | Spring 2024 | Lecture 2 - Word Vectors and Language Models」の内容を基に作成されています。講義の詳細情報は https://www.youtube.com/watch?v=nBor4jfWetQ でご覧いただけます。本記事では、講義の内容を要約しております。なお、本記事の内容は原講義の内容を正確に反映するよう努めていますが、要約や解釈による誤りがある可能性もありますので、正確な情報や文脈については、オリジナルの講義をご視聴いただくことをお勧めいたします。
登壇者:Christopher Manning教授(トーマス・M・シーベル機械学習教授、言語学・コンピュータサイエンス教授、スタンフォード人工知能研究所(SAIL)所長)
スタンフォード・オンラインでは、スタンフォード大学全体の学部や部門が提供する学術的・専門的教育へのポータルとして、学位プログラム、単位取得教育、専門資格プログラム、無料公開コンテンツなど、スタンフォード教授陣が開発した充実したカタログを提供しています。詳細はhttps://online.stanford.edu をご覧ください。
1. コース内容と運営について
1.1. 課題提出期限とオフィスアワーの案内
コース運営に関する注意点をいくつか説明しておきます。まず、第1回の課題はすでに公開されており、次の火曜日の授業前が提出期限となっています。これを忘れないようにしてください。
また、Pythonの復習セッションが今週金曜日の15:30から16:20に開催されますが、この教室ではなくGates B01(地下)で行われるので注意してください。
オフィスアワーとヘルプセッションについては、すでに開始されています。ウェブサイトに詳細が記載されていますので確認してください。複数のTAが教室で対応するヘルプセッションを設けていますので、キャンパスにいる方はぜひ参加してください。スタンフォードオンラインの学生向けにZoomオプションも用意しています。
私自身のオフィスアワーについては、まだ予約枠を開放していませんが、今夜中に公開する予定です。月曜の午後に実施する予定で、Kendlyで15分単位の予約制となります。受講者数を考慮すると全員が参加できるわけではありませんが、喜んで対応します。ただ、一点注意事項として、「予約枠を独占しないでください」と書いておきます。毎週私のオフィスアワーに登録するのは良いアイデアだと考える人もいるかもしれませんが、それは少し非社会的な行為です。その点は考慮していただければと思います。
1.2. Python復習セッションの日程と場所
Pythonの復習セッションは、今週金曜日の15:30から16:20に開催されます。場所はこの教室ではなく、Gates B01(地下)で行われます。キャンパスにいる皆さんには、ぜひオフィスアワーとヘルプセッションに参加することをお勧めします。これらはすでに始まっており、ウェブサイトに詳細がリストアップされています。
私たちは教室内で複数のTAによるオフィスアワーのヘルプセッションを設けています。キャンパスにいる方は直接来ていただければ対応します。また、スタンフォードオンラインの学生向けにZoomオプションも用意しています。みなさんが学習を進める上で必要なサポートを受けられるよう、これらの機会を活用してください。
2. 最適化の基礎
2.1. 勾配降下法(Gradient Descent)の仕組み
前回の授業の最後に、Word2Vecの微分を計算するのにあまりうまくできませんでしたが、ウェブサイトに掲載されている資料ではより丁寧に説明されています。そこでは、目的関数とその導関数の計算方法を示しており、これによって下り坂の方向を特定することができます。
ここで最適化の基本的なループを完成させましょう。私たちは最小化したいコスト関数を持っており、その関数の勾配を計算して下り坂の方向を特定します。最も単純なアルゴリズムでは、下り坂の方向を計算し、その方向に少し歩み、そしてこれを繰り返します。現在地での勾配を計算し、少し下に進み、これを続けることで最小値に到達します。
一次元の関数では非常に単純で、ただ下り坂に歩いていくだけですが、多次元関数では異なる地点での勾配計算によって異なる方向に進むことになります。そのため、微積分と勾配の計算が必要になるのです。
勾配降下法のアルゴリズムでは、損失関数Jの勾配を計算し、その勾配にステップサイズあるいは学習率αを掛けます。αは通常10^-3や10^-4、あるいは10^-5といった非常に小さな値です。そして、パラメータからこの値を引いて新しいパラメータを得ます。こうすることで下り坂に進んでいきます。
小さな学習率を使いたい理由は、速すぎるペースで進みたくないからです。ここで勾配を計算して「この方向だ」と決めて大きく歩みすぎると、はるか向こうまで行ってしまったり、大きすぎるステップサイズだと元の地点より悪い場所に着いてしまう可能性があります。だから、下り坂に小さなステップで進みたいのです。これが基本的な勾配降下法アルゴリズムです。
2.2. 確率的勾配降下法(Stochastic Gradient Descent)の意義と利点
基本的な勾配降下法アルゴリズムは実際には使いません。私たちが実際に使用するのは、その次のレベルである確率的勾配降下法です。基本的な勾配降下法の問題点は、データセット全体に対して目的関数と評価地点での傾きを計算する必要があることです。一般に、モデルの学習に使用するデータ量は膨大であるため、モデルの全訓練データに対して目的関数を計算するのは非常に時間がかかります。
これは計算コストが非常に高く、勾配の更新ステップを一回行うだけでも非常に長い時間待つことになります。そこでニューラルネットでは常に確率的勾配降下法というバリエーションを使用します。
確率的勾配降下法では、データ全体ではなくごく小さなサブセット、たとえば16や32のデータ項目を選び、それがすべてのデータであるかのように関数Jを評価し、そのサブセットに基づいて勾配を計算します。これはノイズがあり不正確な勾配の推定値ですが、その方向に進みます。
これは一般的に「ミニバッチ」または「ミニバッチ勾配降下法」とも呼ばれます。理論的には、この小さなサブセットに基づいて勾配を計算することは近似ですが、ニューラルネットワークの世界での興味深い発展の一つは、実際にはシステムにノイズを入れることでニューラルネットワークが良く機能することがわかってきたことです。このノイズがシステムを揺さぶり、動かすことで、確率的勾配降下法は単に圧倒的に高速なだけでなく、実際にニューラルネットワークの最適化システムとしてより効果的に機能するのです。
3. Word2Vecの復習と単語ベクトルの可視化
3.1. 単語ベクトルの初期化(ランダムな小さな値が重要)
前回の講義を思い出すと、Word2Vecのアイデアは、各単語にランダムなベクトルを割り当てるところから始まります。具体的には、ランダムな小さな数値を生成して、それらのベクトルを埋めます。ここで重要なポイントは、ベクトルをランダムな小さな数値で初期化する必要があるということです。単にすべてのベクトルをゼロのままにしておくと、何も機能しません。
これは、すべてが同じ状態から始まると、誤った対称性が生じてしまい、学習ができなくなるためです。そのため、必ずベクトルをランダムな数値で初期化する必要があります。その後、コーパス内の各位置を通じて、推定値を使用し、前回説明したように文脈内の単語の確率を予測しようとします。
これによって目的関数が得られ、その後、誤差と勾配を確認し、周囲の単語をより良く予測できるようにベクトルを更新します。驚くべきことに、それ以上のことをせずとも、単語ベクトルを学習することで、単語間の意味や関係性の多くを実際に捉えることができるのです。
このアルゴリズムが最初に発見されたとき、本当に魔法のように感じました。シンプルな数学を大量のテキストに対して行うだけで、単語の意味について学ぶことができるというのは驚くべきことでした。このように単純なものが機能するとは意外でしたが、時間が経つにつれて、この同じレシピがあらゆる種類の言語の振る舞いをニューラルネットワークから学ぶために使われるようになりました。
3.2. Word2Vecの基本的な仕組みと学習プロセス
Word2Vecアルゴリズムのパラメータは、これらの単語ベクトルだけです。具体的には、外側単語ベクトルと中心単語ベクトルであり、前回説明したように、私たちはこれらを互いに素として扱います。計算を行う際には、様々な可能性のある外側単語と中心単語のドット積を考慮します。それらを使ってモデルが様々な外側単語がどれだけ出現しそうかの確率分布を得て、その後、実際の文脈内の外側単語と比較します。これが誤差の源となります。
このモデルはNLPで「バッグオブワーズモデル」と呼ばれています。文の構造や左右の要素を実際には認識していません。左右の位置それぞれで全く同じ確率を予測します。しかし、このモデルは中心単語の文脈内にどのような単語が出現するかを知りたいのです。
ここでちょっと止めて、これが実際にどのように機能するのかを感じてもらいましょう。私はここでGenSimというパッケージを使っていますが、このパッケージは単語ベクトルを読み込んで操作するためのものです。ここで使っている単語ベクトルはGloVeというスタンフォードで開発したモデルのもので、後ほど詳しく説明します。厳密に言えばこれはWord2Vecの単語ベクトルではありませんが、全く同じように振る舞います。
単語ベクトルは大きなデータファイルです。例えば「bread」(パン)という単語の表現は実数値のベクトルです。デモを速くするために100次元の単語ベクトルを使っています。これが「bread」です。次に「croissant」(クロワッサン)の表現を見てみましょう。視覚的に少なくとも少し似ていることがわかります。最初の成分はどちらも負、2番目の成分はどちらも正、3番目の成分はどちらも大きな負の値、4番目の成分はどちらも正です。かなり似たベクトルのようです。これは希望が持てます。つまり、パンとクロワッサンがある程度似ていることをモデルが理解しているということです。
このパッケージには、手動でそれを行う代わりに、すべての単語ベクトルに問い合わせて最も似ているものを見つける便利な関数があります。例えば、語彙の中で「USA」に最も似ている単語を聞くことができます。このモデルではすべて小文字化されています。実行すると「Canada」「America」「U.S.A」「United States」「Australia」などが表示されます。これはかなり合理的なリストですね。ただ、「USA」よりも「Canada」が上位になっているのは少し奇妙かもしれません。
同様に「banana」に最も似ている単語を聞くと、「coconut」「mango」「bananas」「potato」「pineapple」「fruit」などが出てきます。これも非常に理にかなっています。少し熱帯果物に偏っていますが。また「croissant」に最も似ている単語を聞くと、「bread」ではなく「brioche」「baguette」「foccacia」などが出てきます。これもある程度理にかなっています。
この「most_similar」関数では、あるポジティブな単語ベクトルを与えて、それと位置が最も似ている他の単語を探しています。もう一つできることは、そのベクトルのネガティブを取って、そのネガティブに最も似ているものを探すことです。これが同義語を見つけるのに役立つと思うかもしれませんが、実際にはそうではありません。「banana」ベクトルのネガティブに最も似ているものを尋ねると、ほとんどの他のベクトルと同様に、奇妙なものが出てきます。それらが本当に単語なのかもわからないものや、他の言語の単語、あるいは一部は名前かもしれません。例えば「shichi」は日本語の名前です。あまり有用ではなく、バナナの反対のようには感じられません。
3.3. 実際の単語ベクトルのデモンストレーション
しかし、ここから私たちはWord2Vecで観察された強力な能力を得ることができます。それは意味的な成分を分離し、それらを興味深い方法で組み合わせることができるというものです。この図を見ると、原点から「King」のポジティブベクトルから始め、「man」のベクトルを引き、そして「woman」のベクトルを足すことができます。そして、その空間内でその位置に最も近い単語は何かをモデルに尋ねることができます。
この次の例がそれを行っています。「King」のポジティブベクトル、「man」のネガティブベクトル、そして「woman」のポジティブベクトルを使うと、どこに到達するかというと、「Queen」になります。これは単語ベクトルで発見された最も有名な特性で、意味的類似性だけでなく、このような意味的成分を扱うことができるということです。これは「アナロジー」と呼ばれています。AはBに対してCはDに対するものと考えることができるからです。例えば「man」は「King」に対して「woman」は何に対するものかというアナロジーです。
ここで私は小さな関数を定義して、このアナロジーを自動的に計算します。そこで「man」は「King」に対して「woman」は「queen」という形式で尋ねることができます。これは標準的な例ですが、これで実際に楽しむことができます。
これはかなり古風なものです。ラジオを囲んでラジオドラマを聴いていた頃の話をしている老人のように感じるかもしれません。現在では誰もこれを使わず、ChatGPTのようなずっと優れたものがありますが、若かった頃は、このとても単純なモデルが非常に単純なデータで構築されただけで、かなり良い意味理解ができ、かなり良いアナロジーができるというのは本当に驚くべきことでした。
いくつか試してみましょう。「Australia」と「beer」に対して「France」は何でしょう? 答えは「Champagne」です。これはかなり良い答えですね。次に「Russia」を入れると? 「vodka」が返ってきます。これは興味深く機能します。
別の例として、「pencil」は「sketching」に対して「camera」は何に対するものでしょう? 「photographing」と正しく返ってきます。
このモデルは2014年に構築したので、政治に関しては少し古いかもしれません。過去10年の政治についてはできませんが、古い政治の質問を試すことはできます。例えば「Obama」は「Clinton」に対して「Reagan」は何に対するものでしょう? 米国の歴史を覚えていれば...答えは「Nixon」で、これはかなり公平だと思います。
また、言語の構文的事実を調べることもできます。「tall」は「tallest」に対して「long」は何に対するものでしょう? これは簡単ですね。「longest」です。
この単純な学習方法、単純なバッグオブワーズモデルで、単語の意味について多くを学ぶのに十分です。通常の意味論を超えた知識も含まれています。例えば「Australia」が「beer」に対して「Russia」は「vodka」に対するものというような文化的世界知識も含まれており、これは通常人々が単語の意味の意味論と考えるものを少し超えていますが、それも含まれているのです。
4. Word2Vecの詳細と変種
4.1. Skip-gramモデルとContinuous Bag of Words (CBOW)モデル
この講義のクラスでは、皆さんが間違いを犯して週末を無駄にしないように技術的な点を一つ指摘しておきます。CS224nの過去のほとんどの授業では、実際に課題2としてWord2Vecをゼロから実装してもらっていましたが、春学期は他の学期よりも若干短いということもあり、今期はWord2Vecの実装をスキップすることにしました。古い課題2を見てWord2Vecを実装しようとして時間を無駄にしないでください。新しい課題2が出るのを待ってください。
それでも、詳細についてもう少しお話ししておきます。まず、なぜ2つのベクトルを使うのかという質問がありました。2つのベクトルを使うのは、数学を少し簡単にするためです。中心語と外側語に同じベクトルを使うことを考えてみてください。例えば、中心語が「octopus」だとします。正規化のために可能なすべての文脈語を試す過程で、いずれ「octopus」にもう一度当たります。その時点で二次の項が発生します。つまり、「octopus」ベクトルの二乗になります。
これは数学を複雑にします。賢い皆さんなら数学を解くことはできるでしょうが、計算が厄介になります。他のすべての項は異なるベクトル同士の単純な掛け算ですが、一つの位置では同じベクトルの二乗になります。この複雑さを避けるために、単にベクトルを互いに素として扱うことで数学を単純に保っています。これは実際にモデルを改良するものではなく、正しく行えば実際には少し良くなるかもしれませんが、実用上は別々に推定して最後に平均することが一般的です。
オリジナル論文を見ると、実際には一連の手法が記述されています。二つの手法が説明されており、一つは内側の単語が周りの単語を予測するものであり、もう一つは文脈内のすべての単語から中心語を予測しようとするものでした。これは論文では「continuous bag of words」と呼ばれています。私が説明したのはより単純で、うまく機能する「Skip-gram」モデルです。
もう一つの側面は、学習に使用する損失関数に関するものです。これまで私が説明したのは、可能なすべての文脈語を考慮して数学を実行する「naive softmax」です。現代の超高速コンピュータでは完全に実行可能で、不合理でもありませんが、論文が書かれた当時はこれはやや高コストに思われ、階層的ソフトマックスなどの他の選択肢も検討されていました。今はそれを説明しませんが、ネガティブサンプリングについて説明したいと思います。
4.2. ナイーブソフトマックスと計算効率
前回、私たちはこの単純なソフトマックス方程式を使いました。分母では語彙内のすべての単語について合計しています。人間の言語には多くの単語があるため、語彙には40万語ほどあるかもしれず、これはかなり大きな合計です。特に、その合計の各要素に対して、100次元や300次元のベクトル間のドット積を計算し、それを指数化する必要があります。つまり、そこにはかなりの計算量が発生しています。
そこで、この計算を短縮できないかと考えます。ネガティブサンプリングのアイデアは、すべての可能な単語について評価するのではなく、いくつかの単純なロジスティック回帰を訓練し、文脈内の真の単語を「好む」べきで、ランダムに選んだ他の単語は「あまり好まない」べきだと言うというものです。これがスキップグラムネガティブサンプリングです。
方程式はこのようになります。中心語と実際の文脈語があり、実際の中心語の項を計算します。これを高確率にしたいので、最小化するために否定してその値を下げます。そして、他のいくつかの単語をサンプリングし、それらは逆にしたいと考えます。
ここで変更したもう一つの点は、ソフトマックスを使用しなくなり、代わりにシグマで表されるロジスティック関数を使用していることです。これはしばしばシグモイドとも呼ばれます(シグモイドはS字型を意味しますが、実際にはS字型の関数は無限にあり、私たちが実際に使用するのはロジスティック関数です)。
ロジスティック関数はこの形を持ち、任意の実数から0から1の間の確率へのマッピングを行います。ここで私たちが言いたいのは、実際の外側の単語に対しては、このドット積が大きく、その確率が1に近くなることを希望しているということです。これが最小化に役立ちます。他の単語については、その確率が小さくなることを望んでいます。つまり、それらがこちら側に表示されるようにしたいのです。
これが計算していることですが、書かれている通り、内部にマイナス記号を付けています。これはこの関数が対称であるため機能します。つまり、こちら側にあって欲しいと思っていますが、否定するとこちら側に来て、それが大きくなります。
最後の部分(*で示されている部分)は、ネガティブサンプルとして選ぶ単語についてです。ランダムに数語、おそらく5つか10個のネガティブサンプルを選びますが、その選び方として、語彙内の40万語から均一にランダムに選ぶのではなく、単語の出現頻度に注意を払いたいと考えています。
これをユニグラム分布と呼び、個々の単語がどれだけ一般的かを独立に考慮することを意味します。例えば「the」は非常に一般的な単語なので、約10%の確率で選ばれるでしょう。これがサンプリングに使いたいものですが、実際にはもう少し良い方法があることがわかっています。
Word2Vecで標準的に提示されているのは、単語のユニグラム確率を取り、それを3/4乗することです。これは何をするのでしょうか?これによって、あまり頻繁でない単語の確率をある程度引き上げています。つまり、テキスト内での相対的な頻度をそのまま使うことと、すべての単語を均一に扱うことの間の中間地点にいます。サンプリングをより均一な方向に幾分か移動させることで良い結果が得られますが、完全にそこまで行きたくはありません(これは3/4の代わりに0を入れることに相当するでしょう)。
4.3. ネガティブサンプリング手法の導入と利点
確率的勾配降下法と同様に、ネガティブサンプリングは計算効率を大幅に改善するための手法です。これは特に、語彙が大きい場合に重要になります。前述のように、ナイーブソフトマックスでは語彙内のすべての単語に対して計算を行う必要がありますが、ネガティブサンプリングではそれを回避します。
ネガティブサンプリングの基本的なアイデアは非常にシンプルです。目標は、文脈内の実際の単語(正例)に対して高い確率を割り当て、ランダムに選択した他の単語(負例)に対しては低い確率を割り当てるように訓練することです。これにより、本質的に二項分類問題としてモデル化できます。
具体的には、中心語と実際の文脈語のペアに対してはドット積が大きくなるようにし、中心語とランダムに選んだ他の単語(ネガティブサンプル)のペアに対してはドット積が小さくなるようにします。このアプローチでは、ソフトマックス関数の代わりにロジスティック関数(シグモイド関数)を使用します。
ロジスティック関数は次のような形をしています: σ(x) = 1/(1+e^(-x))
これは任意の実数を0から1の間の値に変換します。実際の文脈語では、中心語ベクトルと文脈語ベクトルのドット積が大きくなるようにして、σ(ドット積)が1に近くなるようにします。逆に、ネガティブサンプルでは、ドット積が小さくなるようにして、σ(ドット積)が0に近くなるようにします。
方程式では、実際の文脈語に対しては log(σ(u_o・v_c)) の項を最大化し、ネガティブサンプルに対してはΣlog(σ(-u_k・v_c)) の項を最大化します。マイナス記号に注意してください。ネガティブサンプルではドット積の値を否定して、σ関数の中に入れています。これはσ関数の対称性を利用しており、ネガティブサンプルのドット積を否定すると、それが関数の左側に来て、確率が低くなるようにするためです。
この手法により、語彙全体の計算ではなく、少数のサンプル(通常5〜10個のネガティブサンプル)だけで学習を行うことができるため、計算効率が大幅に向上します。また、この手法を用いることで、非常に大きな語彙に対しても効率的に学習できるようになります。
4.4. コーパス内の単語頻度と単語サンプリングの関係(3/4乗則)
ネガティブサンプリングの最後の重要な部分として、どの単語をネガティブサンプルとして選ぶかという問題があります。私たちはいくつかの単語、おそらく5つか10個だけをネガティブサンプルとして選びます。しかし、その選び方は非常に重要です。
単純に語彙内のすべての40万語から均一(ユニフォーム)にランダムに単語を選ぶのは効果的ではありません。基本的には、単語の出現頻度に注意を払いたいと考えています。これを「ユニグラム分布」と呼びます。つまり、個々の単語がコーパス内でどれだけ一般的に出現するかを独立に考慮します。例えば、「the」という非常に一般的な単語は、約10%の確率でサンプリングされることになります。
しかし、研究者たちはユニグラム確率をそのまま使うよりもさらに良い方法があることを発見しました。Word2Vecで標準的に提示されている方法は、単語のユニグラム確率を取り、それを3/4乗することです。具体的には:
P(wi) = f(wi)^(3/4) / Σj f(wj)^(3/4)
ここで、f(wi)は単語wiの頻度です。
この3/4乗は何をするのでしょうか?会場への質問ですが...そうですね、あまり頻繁でない単語の確率をある程度引き上げることになります。頻度の3/4乗を取ることで、出現頻度の低い単語のサンプリング確率を相対的に高くします。これにより、テキスト内での相対的な頻度をそのまま使う場合と、すべての単語を均一に扱う場合の中間のような分布が得られます。
つまり、サンプリングをやや均一な方向に移動させることで良い結果が得られますが、完全に均一にする(これは3/4の代わりに0を入れることに相当します)までは行きません。この微妙なバランスがモデルの学習に効果的であることが経験的に示されています。
この工夫により、高頻度語だけでなく中頻度・低頻度の単語も適切に学習に取り入れることができ、より豊かな単語表現を獲得できるようになります。3/4乗則はWord2Vecの性能向上に重要な役割を果たしている経験則の一つです。
5. カウントベースの単語表現手法
5.1. 共起行列(Co-occurrence Matrix)による単語表現
ここまでWord2Vecアルゴリズムについて説明してきましたが、これはやや奇妙な方法に思えるかもしれません。私たちの目的は、テキスト内の単語とその文脈における単語の関係を捉えることです。より直感的なアプローチは、単純に統計を数えることではないでしょうか。単語とその文脈で出現する単語の頻度を数えればいいのです。例えば、「swim」という単語が「octopus」の隣にどれだけ頻繁に出現するか、「fish」という単語が「octopus」の隣にどれだけ頻繁に出現するかを見て、単語が他の単語の文脈でどれだけ頻繁に出現するかの統計を取り、それを使って何らかの単語ベクトルを計算することができるはずです。
これは実際に以前から検討されてきたアプローチです。同じ種類の文脈窓のアイデアを使用して、単語が他の単語の文脈でどれだけ頻繁に出現するかの行列を作成することができます。
ここに小さな例を示します。私のコーパスは「I like deep learning I like NLP I enjoy flying」だとします。文脈窓は左右1単語だけとします。このような共起カウント行列を作成できます。異なる単語がそれぞれの文脈で出現する回数を行列に入力します。このコーパスが非常に小さいため、行列内のほとんどの値は0か1ですが、「I like」が2回出現するため、この位置には2が入ります。原理的には、すべての異なるカウントに対して行列ができあがります。
これにより単語ベクトルが得られます。例えば、「deep」という単語のベクトルはこの長いベクトルになります。これを単語ベクトルとして使うこともあります。しかし、この方法はやや扱いにくいです。なぜなら、語彙に40万語あるとすると、この行列のサイズは40万×40万になります。これはWord2Vecの単語ベクトルよりもはるかに大きいです。Word2Vecでは100次元の単語ベクトルを使うと40万×100になりますが、これはまだ大きな数字ですが、40万×40万よりはずっと小さいです。
そのため、この種の共起行列を使い始めた場合、一般的にはその行列の次元を削減して、より小さな行列で扱えるようにします。では、その行列の次元をどのように削減すればよいでしょうか。線形代数を思い出すと、PCA(主成分分析)のような手法が考えられます。特に、任意の形状の行列に対応できる特異値分解(SVD)があります。
5.2. 次元削減技術(SVD: Singular Value Decomposition)の適用
共起行列から得られた高次元の単語表現の次元を削減するために、特異値分解(SVD)を適用することができます。これは任意の行列に対して使える古典的な特異値分解です。任意の行列を3つの行列の積として書き直すことができます:UとVはどちらも直交正規行列(orthonormal)です。これは、互いに直交する独立したベクトルを持つことを意味します。そして真ん中には特異ベクトルがあり、サイズ順に並べられています。最も重要な特異ベクトルが最初に来て、これらは異なる次元の重み付け項のようなものです。
これが完全なSVD分解ですが、その一部は関連性がありません。この図を見ると、黄色で示されている部分では何も起こっていません。しかし、もし低次元のベクトルが欲しいなら、次のトリックを使います。最小の特異ベクトルがどこにあるかを知っているので、それらをゼロに設定できます。そうすると、より多くの部分が消えて、単語の2次元表現が得られます。
これは、低次元の単語表現を形成する別の方法を提供します。この方法は、現代のニューラル単語ベクトルの前にも、潜在的意味解析(LSA)などのアルゴリズムで探索されていました。ある程度は機能しましたが、非常にうまく機能したわけではありませんでした。しかし、特に心理学の分野では、一部の研究者がこの研究を続けていました。
2000年代初頭には、Doug Rohdeという大学院生がこの研究を続け、「Coals」と呼ぶアルゴリズムを開発しました。彼は、単純に生のカウントに対してSVDを実行しても、うまく機能する単語ベクトルが得られないことを知っていました。しかし、それをより良くするためのいくつかのアイデアを持っていました。
大きく役立つ一つのことは、頻度を対数化することです。つまり、セルに対数頻度を入れることができます。また、Word2Vecでも取り入れられた他のアイデアも使いました。一つは窓のランピング(距離に応じた重み付け)で、より近い単語をより遠い単語よりも多く数えるというものです。また、カウントの代わりにピアソン相関を使用するなど、他の手法も採用しました。
結果として、SVDに基づいた単語ベクトルの低次元バージョンを開発しました。興味深いことに、当時は誰もこれに注目しませんでしたが、Doug Rohdeは彼の博士論文で実質的に同じ線形意味成分の特性を発見していました。
これは彼の博士論文からの実際の図です。ここで彼は、イベントの「行為者(doer)」という意味成分が、彼の処理した単語ベクトルで線形的な意味成分であることを示しています。これを使って動詞とその動作の行為者の間を移動できることを示しています。これはとても素晴らしいことですが、彼が発見したことに誰も注目しなかったため、彼は有名になりませんでした。
5.3. Doug Rohdeの研究(Coals)と線形意味成分の発見
Word2Vecが人気を集める前から、実は単語の分散表現に関する先駆的な研究がありました。2000年代初頭、Doug Rohdeという大学院生が共起統計に基づく単語表現の研究を続けていました。彼は単純に生のカウントに対してSVDを適用するだけでは良い単語ベクトルが得られないことを認識し、これを改善するためのいくつかの重要な技術的工夫を導入しました。
彼が開発したアルゴリズム「Coals」では、以下のような工夫が含まれていました:
- 生の頻度ではなく、頻度の対数値を行列のセルに使用する
- 窓のランピング(距離に応じた重み付け)を採用し、中心語により近い単語をより遠い単語よりも重視する
- 単純なカウントの代わりにピアソン相関係数を使用する
- その他の統計的手法による改良
これらの工夫を通じて、彼はSVDに基づいた単語ベクトルの効果的な低次元表現を開発することに成功しました。そして何より注目すべきは、彼が実質的にWord2Vecで後に有名になる「線形意味成分」の特性を発見していたという事実です。
彼の博士論文には、この発見を示す図が含まれています。例えば、「イベントの行為者(doer of an event)」という意味成分が、彼の処理した単語ベクトル空間では線形的な意味成分として現れることを示しています。つまり、彼の単語ベクトルを使えば、動詞とその動作を行う人(行為者)の間を線形演算で移動できることを証明していたのです。
例えば、「teach」と「teacher」、「write」と「writer」のような関係が、ベクトル空間内で一貫した方向性を持つことを示していました。これは後にWord2Vecの最も注目される特性となった類推能力の基礎と同じものでした。
しかし残念ながら、当時はこの研究に注目する人がほとんどおらず、彼の画期的な発見は広く認識されませんでした。Word2Vecが登場してから何年も後になって初めて、Rohdeの先駆的な研究の重要性が再評価されるようになったのです。
5.4. GloVeアルゴリズムの開発背景と仕組み
Word2Vecが人気を集めた後、私はこの共起行列を使った単語表現の領域にとても興味を持ちました。ポスドクのJeffrey Penningtonと一緒に、共起行列のカウントを使用してWord2Vecのように効果的に機能する単語ベクトルを得るにはどうすればよいかという課題に取り組みました。これが「GloVe」(Global Vectors)アルゴリズムの開発につながりました。これが先ほどデモで実際にお見せしたものです。
私たちが求めていたのは、ベクトル空間内でベクトルを加算したり減算したりするような線形成分が意味の違いに対応するようなモデルでした。どうすればそれを実現できるでしょうか。Jeffreyは良く考え、数学的に検討した結果、共起確率の比率が意味成分をエンコードできるなら、その共起確率の比率をベクトル空間内で線形的なものにすれば、Word2VecやDoug Rohdeが得たような結果が得られるだろうと考えました。
これはどういう意味でしょうか。例えば、「ice」(氷)という単語の文脈で出現する単語を考えると、「solid」(固体)と「water」(水)は「ice」の近くに出現する可能性が高く、「gas」(気体)やランダムな単語「random」は「ice」の近くに出現する可能性が低いと考えられます。同様に「steam」(蒸気)については、「gas」と「water」が近くに出現する可能性が高く、「solid」や「random」はそうではないでしょう。
単純にこれらの個々の共起確率を見ただけでは意味成分は得られません。なぜなら、ここや別の場所で大きな値が得られるだけだからです。しかし、これら二つの共起確率の比率を見ると、「solid」については大きな値と小さな値になり、「gas」については小さな値と大きな値になります。こうして物理学の固体・液体・気体という次元に対応する空間の方向性が得られます。一方、他の単語については約1になります。
これは単なる手振りの概念でしたが、実際のデータで試すと本当に機能しました。実データを使うと、これが共起の実際の値であり、確かにこれら二つの方向に10倍程度の違いが見られ、他の値はほぼ1に近いことがわかりました。
Jeffreyのアイデアは、共起カウント行列から始めて、これを線形成分に変換することでした。どうすればそれを実現できるでしょうか。まず、対数を取ることは理にかなっています。なぜなら、対数を取ると、この比率は引き算に変換されるからです。したがって、二つの単語ベクトルのドット積がこの条件付き確率をモデル化する対数双線形モデルを持つだけで十分です。そうすれば、二つのベクトルの差はそれらの共起確率の対数の比率に対応することになります。
これが基本的にGloVeモデルです。このドット積がログ共起確率に近くなるようにモデル化したいのですが、バイアス項や頻度の閾値などの追加作業を少し行い、これらはあまり重要ではないので省略します。しかし、線形的な意味成分を得るための基本的な直感は知っておくべき重要なことです。
6. 単語ベクトルの評価方法
6.1. 内在的評価と外在的評価の違い
GloVeベクトルのデモをお見せしましたが、これらのベクトルは素晴らしく機能することがわかりました。しかし、一般的にNLPでは、物事を評価し、それらが本当に良いのか、何が良くて何が悪いのかを知りたいと考えています。コースを通して、常に物事を評価し、それらがどれだけ良いのか、何がより良くて何がより悪いのかを把握したいと思うでしょう。
評価に関する基本的な概念で、何度も出てくるのが「内在的評価」と「外在的評価」です。内在的評価とは、非常に特定の内部サブタスクを実行し、それが良いか悪いかをスコア化するものです。通常、内在的評価は計算が速く、構築しているコンポーネントを理解するのに役立ちますが、下流のタスクからは遠いものであり、内部的に数値を改善することが必ずしも役立つとは限りません。
これに対して外在的評価は、質問応答や文書要約、機械翻訳など、実際に行いたいタスクがあり、その内部モデリングの巧妙なビットが実際のタスクに役立つかどうかを知りたいというものです。その場合、システム全体を実行して下流の精度を算出し、それが最終的に役立つかどうかを確認する必要があります。しかし、これは間接的なため、タスク内で何が起こっているのかを正確に把握するのが難しくなります。
例えば単語ベクトルでは、単語の類似性をうまくモデル化しているかどうかを単純に測定するのは内在的評価です。しかし、最終的にはウェブ検索などの下流タスクで役立つかどうかを知りたいのです。例えば、「cell phone」と「mobile phone」を検索した場合に、ほぼ同じ結果が得られることを望みます。このような場合、ウェブ検索が外在的評価となります。
6.2. 内在的評価
単語ベクトルに関しては、すでに見てきた二つの内在的評価方法があります。まず、単語ベクトルのアナロジーテストがあります。GloVeのデモをお見せした際には、うまく機能する例だけを選んでお見せしましたが、自分で試せば機能しないものも見つかるでしょう。そこで私たちができるのは、一連の単語アナロジーを用意し、どれが機能するかを確認することです。
一般的に、GloVeはうまく機能します。ここに単語ベクトルのセットがあり、男性/女性の区別を示しています。これはかなり良好で線形的です。しかし、一般的に異なるアナロジーに対しては、機能するものとしないものがあり、うまく機能する割合をスコア化することができます。
もう一つの評価方法は単語類似性です。単語類似性の評価方法として、人間による類似性の判断を使用します。心理学者は大学生に「plane」と「car」という単語がどれだけ似ているかを0から10のスケールで尋ね、学生が「7」と回答します。そして別の人にも尋ね、学生の回答を平均します。
例えば、「tiger」と「tiger」は10、「book」と「paper」は7.46、「plane」と「car」は5.77、「stock」と「phone」は1.62、「stock」と「jaguar」は0.92といった数値が得られます。これはノイズのあるプロセスですが、大まかに人々が単語をどれだけ似ていると考えるかがわかります。
そこで、私たちのモデルにも単語がどれだけ似ていると思うかをスコア化させ、人間の判断とモデルの判断がどれだけ相関しているかをモデル化します。
ここに大きな数値の表がありますが、すべてを見る必要はありません。単純なSVDはひどく機能せず、対数カウントに対してSVDを行うだけでもかなり合理的に機能し始めることがわかります。そして、Word2Vecの二つのアルゴリズム(CBOWとSkip-gram)と私たちのGloVeベクトルからの数値があります。こうして異なるモデルがどれだけ良いかをスコア化する評価指標が得られます。
6.3. 外在的評価
単語ベクトルの内在的評価に加えて、何らかの下流タスクを選んでその有効性を評価することも重要です。NLPで広く使われてきた単純な下流タスクの一つが「固有表現認識(Named Entity Recognition)」です。これは物事の名前とその種類を認識するタスクです。
例えば「Chris Manning lives in Palo Alto」という文があれば、「Chris」と「Manning」は人の名前、「Palo」と「Alto」は場所の名前であると認識します。これがタスクであり、単語ベクトルがこのようなタスクに役立つと考えられます。
実際にその通りです。ここで「CRFDiscreet」とラベル付けされているのは、ベースラインの記号的な確率的固有表現認識モデルです。これに単語ベクトルを加えることで、数値が上昇しています。GloVeの数値は最初の行の数値よりも高く、システムに単語ベクトルを追加することで大幅な改善が見られます。
このように、単語ベクトルを実際のNLPタスクに組み込むことで、タスクのパフォーマンスが向上するかどうかを測定することができます。これは単語ベクトルが実際のアプリケーションにおいて有用であることを示す強力な証拠となります。
固有表現認識以外にも、品詞タグ付け、構文解析、感情分析、機械翻訳、質問応答など、様々なNLPタスクで単語ベクトルの有効性を評価することができます。一般的に、良質な単語ベクトルは多くの下流タスクでパフォーマンスを向上させることが示されています。
外在的評価の重要な点は、最終的にはユーザーが関心を持つ実際のタスクでの性能を測定していることです。これにより、理論的に優れているように見える単語表現が、実際の応用でも価値があるかどうかを確認することができます。
7. 単語の多義性と表現
7.1. 単語の複数の意味(例:bank, pike)と表現の課題
次のトピックに進みましょう。これは興味深い内容なので、少し時間をかけるべきだと思います。また、前回の講義でも質問として出てきました。単語には多くの意味があります。ほとんどの単語は多くの異なる意味を持っています。非常に専門的な科学用語以外は、ほとんどの単語が複数の意味を持っています。
多義性を持つ単語の例として、おそらくいつも最初に思いつくわけではないかもしれませんが、「pike」という単語を取り上げてみましょう。これは前回の講義で「bank」という例がすでに出てきたからです。「pike」という単語は、あまり頻繁に使わないかもしれませんが、それでも多くの意味を持っています。
「pike」という単語はどのような意味を持つでしょうか?まず、一つの意味は魚です。そうですね、これは一種の魚です。他には何がありますか?槍、そうですね、これは武器の一種です。ダンジョンズ&ドラゴンズのファンにとっては、長い武器ですね。他には?道路、そうです。「pike」は「turnpike」(有料道路)の省略形として使われます。なぜ「turnpike」と呼ばれるのかというと、元々その始点に槍のような物があり、人々を数えるためのものでした。
他に「pike」の意味はありますか?フラタニティ(大学の社交クラブ)の一種でしょうか?それも信じましょう、私はその意味は知りませんでした。他に「pike」は針のように鋭いものという意味でしょうか?それは実際には武器としての「pike」に関連していると思います。
皆さんの多くが見たことがあると思われる意味の一つに、潜水やスイミングでの「pike」(パイク姿勢)があります。オリンピックの飛び込み競技を見たことがあれば、それが「pike」です。信じてください。
これまでは名詞の用法を見てきましたが、「pike」は動詞としても使えます。中世の武器を手に入れたら、誰かを「pike」する(槍で刺す)こともできます。これも「pike」の使い方です。
他にも「coming down the pike」(将来やってくる)のような使い方もあります。これは道路としての意味からの比喩的な用法ですが、結果的に「将来」を意味するようになりました。オーストラリアでは「pike」を「尻込みする」「逃げ出す」という意味でも使いますが、この用法は米国ではあまり使われていないと思います。
とにかく、単語には多くの意味があります。それにどう対処するか?一つの方法は、単語にはいくつかの意味があり、テキストの中の単語の出現をその類似性に基づいてクラスター化し、どの単語を各単語の意味と見なすかを決定し、次にそのトークンクラスターの単語ベクトルを学習するというものです。
これは実際にできることで、私たちはWord2Vecが出る前の2012年にこれを行いました。ここでは「bank1」と「bank2」があり、どこかに「jaguar1」「jaguar2」「jaguar3」「jaguar4」があります。これは本当にうまくいきます。
「jaguar1」は車の種類の意味を捉え、「luxury」や「convertible」の近くにあります。「jaguar2」は「software」や「Microsoft」の近くにあります。これはやや歴史的なもので、皆さんが5歳くらいの頃、Appleが大型の猫をMac OSのバージョンのために使っていたことを覚えているかもしれません。Mac OS 10.3か何かはずいぶん前に「Jaguar」と呼ばれていました。だから「software」は「Microsoft」の近くにあります。
「jaguar3」は「string」「keyboard」「solo」「musical」「drum」「bass」の近くにあります。これは「Jaguar」という名前のキーボードがあるからです。そして最後に、私たちが基本的な意味と考えるものですが、テキストコーパスには意外と少ないのが、「Hunter」の隣にある動物としての「Jaguar」です。
このように、異なる意味を学習するのに良い仕事をしていますが、これは今日では通常行われていることではありません。代わりに通常行われるのは、「Jaguar」などの単語に対して一つのベクトルだけを持ち、それは意味のためにそれぞれ学習したはずのベクトルの加重平均になっています。
7.2. 意味クラスタリングによる多義語の表現
先ほど説明したように、単語の多義性に対処するための一つのアプローチは、文脈に基づいて単語の出現をクラスター化し、異なる意味を識別することです。私たちはこの手法を2012年、Word2Vecが登場する前に実施しました。この手法では、単語の各出現(トークン)を、その周囲の文脈の類似性に基づいてクラスターに分類します。
具体的には、「bank」という単語のすべての出現を文脈ごとに集め、似た文脈でのグループ化を行います。結果として「bank1」(金融機関)と「bank2」(川岸)のように異なる意味のクラスターが形成されます。同様に「jaguar」という単語は、その出現パターンに基づいて複数のクラスターに分けられました。
この手法で得られた結果を見ると、「jaguar1」のクラスターは車の種類の意味を捉え、「luxury」(高級)や「convertible」(オープンカー)といった単語と近い位置に配置されます。「jaguar2」は「software」(ソフトウェア)や「Microsoft」(マイクロソフト)の近くに位置します。これは少し歴史的な用法で、かつてApple社がMac OSのバージョン(例えばMac OS 10.3)に「Jaguar」という大型猫の名前を使用していたためです。
「jaguar3」のクラスターは「string」(弦)、「keyboard」(キーボード)、「solo」(ソロ)、「musical」(音楽的)、「drum」(ドラム)、「bass」(ベース)などの単語と近接しています。これは「Jaguar」という名前の楽器(キーボード)が存在するためです。そして最後に「jaguar4」は私たちが基本的な意味と考える動物としての「Jaguar」で、「hunter」(ハンター)という単語の近くに位置しています。興味深いことに、テキストコーパス内では動物としての用法は他の用法に比べて比較的少ないことがわかります。
このように、文脈に基づいたクラスタリングアプローチは、単語の異なる意味を識別し、それぞれに適切なベクトル表現を割り当てることに成功しています。これにより、曖昧さを持つ単語でも、それぞれの意味に応じた正確な表現が可能になります。この方法の強みは、単語の多義性を明示的に認識し、それぞれの意味を区別した表現を学習できる点にあります。
7.3. スーパーポジション(重み付き平均)としての単語ベクトル
前述の手法は興味深いものの、今日では一般的に行われていません。現在の一般的なアプローチは、「Jaguar」や「pike」などの単語に対して一つのベクトルだけを持つことです。その場合、学習されるベクトルは、それぞれの意味に対して学習したはずのベクトルの重み付き平均になります。
これはしばしば「スーパーポジション」と呼ばれます。数学に詳しい人が物理用語を好んで使うためにそう呼ばれていますが、実際には重み付き平均です。つまり、異なる意味の相対的な頻度を取り、意味ごとのベクトルを掛け合わせ、それが全体の表現として得られるものです。
なぜこのようなアプローチを採用するのか、言語学的な観点から説明します。「単語には意味がある」というモデルは非常に長い歴史があり、一般的です。基本的に辞書の構築方法がそうなっています。辞書で単語を調べると、意味1、意味2、意味3と並んでおり、「bank」や「jaguar」のような単語に対してそれらが得られます。
しかし、これは実際にはかなり不完全なモデルです。単語の意味には多くのニュアンスがあり、様々な文脈で使用され、「bank」(銀行と川岸)のような極端な例では意味がこれほど離れている場合もありますが、ほとんどの単語では意味が異なるとはいえ、実際にはそれほど離れていないことが多く、意味を区切ろうとすることは非常に人為的に思えます。
異なる辞書を見て、この単語にはいくつの意味があるかと尋ねると、ほとんど全員が異なる答えを出すでしょう。例えば「field」という単語の状況を考えてみましょう。「field」は作物を育てる場所として使われることもあれば、「rock field」(岩場)や「ice field」(氷原)のような自然物にも、スポーツフィールドにも使われます。さらに数学的な意味での「field」(体)もあります。
これらすべては互いに何らかの関連性を持っています。数学的な意味はより遠いですが、物理的なものはいずれも一種の平らな空間です。しかし、スポーツフィールドの意味は、氷原の意味とは明らかに異なります。氷原と岩場は異なる意味なのか、それとも単に修飾しているだけなのか?
実際には、単語の意味によって意味される可能性のあるものに対して、ある種の確率密度分布のようなものがあります。したがって、すべての文脈の平均であるベクトルを持つこのモデルを使用することは、より理にかなっているかもしれません。これについては、後ほど文脈的単語ベクトルについて取り上げる際にさらに詳しく見ていきます。
7.4. スパースコーディング理論による単語ベクトルからの意味分離
この問題についてもう一つ驚くべき結果があります。「pike」の全体的なベクトルが、これらの異なる意味ベクトルの合計であるとすると、標準的な数学では、単一のベクトルから個々の意味ベクトルを復元することはできないはずです。しかし、より高度な数学によれば、これらのベクトル空間は非常に高次元かつスパースであるため、スパースコーディング理論の概念を使用して全体のベクトルから意味ベクトルを再構築できることがわかっています。
この理論を本当に理解したい場合は、スタンフォードの統計学科のDavid Doholoなどの人々がスパースコーディング理論に関する講義を教えていますので、参考にしてください。ここでその理論を教える試みはしませんが、具体例を示しましょう。
この論文はTomer Ullmanからのもので、現在スタンフォードのコンピュータサイエンス学部の教員であるSanjeev Arora、Rong GeなどとTarがその著者の一人です。彼らはスパースコーディングを使用して、一つの単語ベクトルから意味ベクトルを分離しようとしました。その結果は非常に良好でした。
ここに「tie」という単語の例があります。一つ目の意味は衣服の一部としての「tie」(ネクタイ)、二つ目は試合での「tie」(引き分け)です。この三つ目の意味も少し似ていますが、四つ目の「tie」は電気ケーブルに付けるケーブルタイのような意味です。そして最後に音楽的な意味での「tie」(タイ、音符を結ぶ線)もあります。
5つのうち少なくとも4つについて、スパースコーディングは単一の単語ベクトルから意味を抽出するのに非常に良い仕事をしています。スパースコーディングは、もし興味があればさらに学んでみる価値のある面白い手法です。
これで単語ベクトルと単語の意味について話すことはすべて終わりました。ここまでついてこられましたか?質問はありますか?ではこれから最後の2つのセクションに急いで進みます。
8. 分類タスクと従来の機械学習
8.1. 固有表現認識タスクの例と応用
残りの15分で、ニューラル分類器の構築方法と一般的なニューラルネットワークの構築方法のアイデアを紹介したいと思います。ある意味では、すでに非常に単純なニューラル分類器を構築しています。Word2Vecモデルは、ある単語の文脈に他の単語が出現する可能性を予測しており、これを分類器とみなすことができます。
しかし、先ほど言及した固有表現認識のような単純な分類器を見てみましょう。固有表現認識では、単語をそのクラスでラベル付けしたいと考えています。これら二つの単語は人物(PERSON)を表していますが、同じ「Paris」と「Hilton」という単語が2番目の文では場所(LOCATION)を表しています。このように、単語はそのクラスについてあいまいであり得ます。もう一つの状態は、単語が固有表現ではなく、単なる他の単語である場合です。
これは多くの場所で使用される理解の一部です。企業名に株式ティッカーシンボルを付けたウェブページや、Wikipediaのページ上のリンクなどを見たことがあるかもしれません。一般的に固有表現を見つけた後、エンティティリンキングという2番目の段階があり、固有表現をWikipediaページのような正規形式にリンクします。しかし、今日はこの2番目の部分については話しません。
私たちの単語ベクトルを使って、この単純なタスクを構築できます。パリが時には人の名前であり、時には場所であるため、文脈内のこの単語を見て、「これはこの例では場所の名前だ」と言いたいと思います。
私たちの方法は、ウィンドウ分類器を形成することです。前後に数単語の文脈を持つ単語を取り、その文脈ウィンドウ内の単語に対して単語ベクトルを使用します(それらが何かに役立つことを示したいので)。次に、それを分類器に入力したいと思います。
ここでの分類器は非常に単純なロック分類器で、場所かそうでないかだけを判断します。このウィンドウに対しては「はい、これは場所です」と言いたいと思います。一方、「I love Paris Hilton greatly」という文だった場合、「いいえ」と答えることになります。なぜなら、文脈の中心にある「Paris」という単語はその場合、場所ではないからです。
これが分類器あるいは分類の一般的なアイデアです。ある一連のクラスを物事に割り当てています。一般的に分類器では、教師あり学習を行います。これは、ラベル付きの例、つまり訓練データセットがあることを意味します。入力項目xiがあり、それぞれにクラスyiが付いています。
例えば、私の訓練例として「I love Paris Hilton greatly」というのはネガティブな例で場所ではなく、「I visit Paris every spring」は肯定的な例で場所です。ここでは中央の単語を実際に分類しています。
入力とラベルがあり、一般的にラベルはクラスのセットです。ここでの私のセットは単純に「場所」か「場所でない」かですが、より多くのクラスを持つこともできます。例えば5つのクラス、場所、人名、会社名、薬品名など、または「名前でない」という多くの異なるクラスを割り当てることもできます。しかし、次の火曜日の講義でも同じ例を使いたいので、単純に保つために2つだけで行います。
8.2. 教師あり学習における入力、ラベル、クラスの関係
分類器を構築するための教師あり学習では、特定の構造化されたデータセットが必要です。このデータセットは入力とそれに対応するラベルから構成されています。具体的には、入力アイテムx_iとそれに対応するクラスy_iのペアです。
例えば、固有表現認識タスクの場合、入力は「I love Paris Hilton greatly」のような文で、文中心の単語「Paris」に対するラベルは「LOC(場所)ではない」となります。同様に、「I visit Paris every spring」という文では、中心単語「Paris」のラベルは「LOC(場所)である」となります。
このように、教師あり学習ではモデルに「正解」を教えることで学習させます。多くの例を見せることで、モデルは未知の例に対しても正しく分類できるようになります。分類問題における「クラス」とは、入力データが属し得るカテゴリのことです。
固有表現認識の文脈では、クラスには「人名(PERSON)」「場所(LOCATION)」「組織名(ORGANIZATION)」などがあり、場合によっては「固有表現ではない(O)」というクラスも含まれます。私たちの例では単純化のため、「場所である(LOC)」か「場所でない(NOT-LOC)」の二値分類問題としています。
教師あり学習の本質は、これらの入力-ラベルのペアから学習し、新しい未知の入力に対して正確な予測を行えるようにすることです。この過程では、モデルは入力の特徴を抽出し、それらの特徴とクラスラベルの関係性を学習します。そして最終的には、新しい入力に対してもっとも確率の高いクラスを予測できるようになります。
このクラスでは、単語の文脈に基づいて固有表現を分類するためにニューラル分類器を使用しますが、その前に基本的な分類の概念を理解することが重要です。
8.3. 線形分類器と分散表現の違い
このクラスでは、ニューラル分類器を使用していきますが、ここで少し立ち止まって考えてみましょう。一般的な統計的機械学習の分類器として、ロジスティック回帰やソフトマックス分類器、あるいはサポートベクターマシンやナイーブベイズなど、他にも見たことがあるかもしれないものがあります。これらの分類器の大多数は線形分類器です。つまり、線形の決定境界を持っています。
これらの分類器を学習する際、パラメータWを学習していますが、入力は固定されています。入力は記号やある種の量によって表現されています。つまり、固定された入力があり、その入力に掛け算するための重みとして使われるパラメータを学習し、そして線形の決定境界を使用します。
ニューラル分類器では、もう少し能力が増します。まず、分類器の重みWを学習するだけでなく、単語の分散表現も学習します。つまり、単語ベクトルが実際の単語の記号を再表現し、空間内で移動させることができるので、元の空間に関しては非線形分類器となり、はるかに複雑な関数を表現できます。
しかし、これから構築する深層ネットワークの最後では、再表現されたベクトルに関しては線形分類器を持つことになりますが、元の空間に関してはそうではありません。これを具体的に説明しましょう。
8.4. ニューラル分類器の非線形性と表現学習の利点
ここからは、次の火曜日の講義でも使用する小さなニューラルネットワークを例に説明します。まず「museums in Paris are amazing」という単語列から始めます。最初に単語埋め込み(ワードエンベディング)を使って単語ベクトルを取得します。これで高次元ベクトルが得られますが、これは5つの単語ベクトルの連結に過ぎません。100次元の単語ベクトルを使えば、これは500次元になります。
次に、これをニューラルネットワーク層に通します。これは単にそのベクトルに行列を掛け、バイアスベクトルを足すだけです。その後、何らかの非線形性を通します。例えば、すでに見たロジスティック関数かもしれません。これにより新しい表現が得られます。
特に、Wが8×500だとすると、それをずっと小さなベクトルに縮小することになります。その後、ニューラルネットワークの中間層である隠れ表現に別のベクトルを掛けることができ、それによりスコアが得られます。このスコアを先ほど見たロジスティック関数に入れて、これが場所である確率を得ます。
この時点で、分類器は内部表現に関しては線形分類器ですが、元の単語ベクトルに関しては非線形分類器になります。
これは次の課題に向けた重要な注意点です。ここまでは、モデル構築のためにログ尤度や負の対数尤度を使用してきましたが、次の課題2からはPyTorchを使い始めます。PyTorchで損失を計算するときに使いたいのはクロスエントロピー損失です。
クロスエントロピーは情報理論から来ています。真の確率分布Pと計算した確率分布Qがあるとき、クロスエントロピー損失はこのようになります。これはモデル確率の対数の、真の確率分布の下での期待値です。
特別なケースとして、データが1か0でラベル付けされている場合(例:この「I love Paris」の例で、1が場所、0が場所でないなど)、この合計の中で他のすべての項はゼロになり、残るのはモデルが正しいクラスに対して与えている確率の対数のみです。これが対数尤度となり、負の対数尤度として使用できます。
ここには少しの複雑さがありますが、PyTorchでモデルを構築する際にはクロスエントロピー損失を使うことを覚えておいてください。
9. ニューラルネットワークの導入
9.1. ニューロンの生物学的構造とAIへの影響
今日の最後に、人間のニューロンの画像を一枚だけ義務的に紹介します。これ以降は見せませんので、見逃さないでください。
これらが人間のニューロンです。人間のニューロンはニューラルネットワークのインスピレーションとなりました。人間のニューロンは軸索と呼ばれるこの部分を通って単一の出力を持ちます。これらの出力は他のニューロンに入力されます。ここに例は示していませんが、一般的に一つの出力は複数の異なるニューロンに入力されます。様々なものが入ってくるのが見えますが、これがシナプスと呼ばれる接続部分です。
一つのニューロンは通常、他のニューロンから信号を拾い上げる多くの入力を持ち、それらはすべて細胞の核に入ります。核はそれらの入力をすべて組み合わせ、これらの入力からの正の活性化が十分にあれば、その出力に沿って信号を送ります。厳密には、ニューロンがどのように機能するかというと、それらはスパイクを送信します。ニューロンの活性化レベルはそのスパイクのレートです。しかし、人工ニューラルネットワークではすぐに、その活性化レベルが単なる実数値として扱われるようになりました。
これが私たちのニューラルネットワークの真のインスピレーションです。二項ロジスティック回帰はニューロンに少し似ています。複数の入力があり、総合的な興奮レベルを計算します。特に、正の入力(興奮性入力)と負の入力(抑制性入力)の両方を持つことができます。それらをすべて組み合わせて、興奮のレベルを出力として得ます。そしてそれを何らかの非線形性を通じて変換します。
これは人間のニューロンの非常に単純なモデルとして提案されました。しかし、人間のニューロンはこれよりはるかに複雑です。神経科学者のような人々は、実際の人間のニューロンのより良いモデルを作るべきだと考えているかもしれませんが、現在のニューラルネットワーク革命においては、みんなそのことを忘れて、単純な線形代数に非常に便利に変換できるこの非常に単純なモデルにこだわっています。
これは単一のニューロンを表していますが、この単一のニューロンは、ロジスティック関数を使用する場合、ロジスティック回帰と同じです。これはおそらく統計学のクラスなどで見たことがあるでしょう。ニューラルネットワークとの違いは、一つのロジスティック回帰だけでなく、一度に複数のロジスティック回帰を持つことです。
各ロジスティック回帰が何を計算しているかを定義する必要があるとしたら難しいでしょうが、私たちが行うのは、それらを別のロジスティック回帰に入力することです。最終的な出力として何か、例えば「これは場所であるかどうか」を言いたいとします。そして、何が起こるかというと、機械学習によって、これらの中間のロジスティック回帰は自分たちで何か有用なことを行うことを理解するようになります。これが魔法です。
9.2. 単一ニューロンとロジスティック回帰の関係
先ほど説明したように、二項ロジスティック回帰はニューロンのモデルに非常に類似しています。単一のニューロンとロジスティック回帰は実際に同一のものと考えることができます。
ロジスティック回帰では、複数の入力があり、それぞれの入力に重みを掛けて合計し、総合的な興奮レベルを計算します。このプロセスでは特に、正の値を持つ入力(興奮性入力)と負の値を持つ入力(抑制性入力)の両方を持つことができます。ニューロンでも同様に、興奮性シナプスと抑制性シナプスを通じて信号を受け取ります。
ロジスティック回帰では、すべての入力と重みを線形結合し、そのスコアをロジスティック関数(シグモイド関数)に通して0から1の間の確率値に変換します。これは、ニューロンが様々な入力信号を組み合わせ、ある閾値を超えると発火する(活性化する)というプロセスをモデル化しています。
ロジスティック関数は次の形を持ちます: σ(z) = 1/(1+e^(-z))
この関数によって、任意の実数値の入力が0から1の間の値に変換されます。これはニューロンの活性化関数として使われ、入力の総和が大きければ出力が1に近づき(ニューロンが強く活性化)、入力の総和が小さければ出力が0に近づく(ニューロンがほとんど活性化しない)という振る舞いをします。
この単一ニューロンのモデルがロジスティック回帰であり、これが人工ニューラルネットワークの基本的な構成要素となっています。しかし、ニューラルネットワークの力は、これらの単一ユニットを多数組み合わせ、層を形成することで生まれます。
9.3. 多層ニューラルネットワークの構造と機能
単一のニューロンつまり単一のロジスティック回帰があるだけでなく、一度に複数のロジスティック回帰を持つことがニューラルネットワークの特徴です。各ロジスティック回帰が個別に何を計算しているのかを定義するのは困難ですが、私たちのアプローチではそれらを別のロジスティック回帰に入力することで解決します。
最終的な出力として例えば「これは場所である」か「場所でない」かを判定したいと考えます。機械学習によって起こるのは、これらの中間のロジスティック回帰が自ら有用な計算を行うようになることです。これがニューラルネットワークの魔法です。
モデルには多くのパラメータがあり、内部的に何か有用なことを行うよう自己学習するのです。一般的に、ニューラルネットワークにより多くの層を持たせることで、より多くの「魔法」を得ることができます。これにより関数を構築していきます。
実質的に、これらの中間層は入力データを再表現し、ニューラルネットワークの下流で分類したり解釈したり操作したりするのが容易になるような方法で学習します。
9.4. 中間層による入力データの再表現と分類の効率化
次の講義でも使用する小さなニューラルネットワークのモデルを具体的に説明しましょう。例えば「museums in Paris are amazing」という単語列があるとします。まず、単語埋め込み(ワードエンベディング)を用いて単語ベクトルを得ます。すると、5つの単語ベクトルを連結した高次元ベクトルが得られます。100次元の単語ベクトルを使用している場合、これは500次元のベクトルになります。
次に、このベクトルをニューラルネットワーク層に通します。これは単にそのベクトルに行列を掛け、バイアスベクトルを加えるという操作です。その後、ロジスティック関数などの非線形関数に通します。これにより新しい表現が得られます。
具体的に、もしWが8×500の行列であれば、元の500次元のベクトルがずっと小さな8次元のベクトルに縮小されます。これが中間層、つまりニューラルネットワークの「隠れ層」による表現です。その後、この隠れ層の表現に別のベクトルを掛けることでスコアが得られ、このスコアをロジスティック関数に入れることで、入力が「場所である」確率を得られます。
この方法では、最終的な分類器は隠れ層の表現に対しては線形分類器ですが、元の単語ベクトルに対しては非線形分類器となります。隠れ層が入力データを再表現することで、線形分離不可能だった問題が線形分離可能になるのです。
次回の課題ではPyTorchを使いますが、その際には損失関数としてクロスエントロピー損失を使用します。クロスエントロピーは情報理論に由来し、真の確率分布Pと予測確率分布Qがある場合のクロスエントロピー損失は、Pの下でのQの対数の期待値として定義されます。
特に、教師あり学習でラベルが0と1の場合(例:場所か場所でないかのバイナリ分類)、この損失関数は実質的に正解クラスに対するモデル確率の対数のみを考慮することになります。これが対数尤度、あるいは負の対数尤度として使用できる理由です。
このようにニューラルネットワークの中間層は、入力データを変換して分類しやすい形に再表現する役割を果たし、複雑な非線形問題を解決する力を生み出しているのです。