投稿

profunctor

【 profuncor は行列とよく似ている 】 このセッションでは、線形代数の行列に相当するものが、カテゴリー論ではどのようなものになるかを考えます。  2つのカテゴリー𝖢と𝖣が与えられたとき、カテゴリー論での行列の類似物はprofunctorと呼ばれるもので、集合のカテゴリーSet に値を取るfunctor $f : C^{op} \times D \to Set$ になります。 前にも述べたように、肩について「op」はfunctorのvarianceを示すために使われています。正確を期すためには必要なのですが、最初に見るときには無視しても構いません。ここで説明する線形代数とのアナロジーでは、行と列の間の一種の転置を示すものと考えることができます。 もう少し、詳しく見ていきましょう。 もしprofunctor $f : C^{op} \times D \to Set$ の定義域の二つのカテゴリー $C^{op} とD$が離散カテゴリーで有限集合であるならば、profunctorは単に二つの要素のペアでindexされた集合の集まりです。それは数字の代わりに集合をエントリーとする行列です。 簡単なcurrying で、C, D上のオブジェクト c, d に対する 定義、$c \mapsto  f(c, ,-), d \mapsto  f(-,d)$ で、profunctor fは、ペアのfunctor $f(c,−) : C \to (Set^D)^{op}と f(−,d) : D \to Set^{C^{op}}$を定義することがわかります。 ( "op" をないものとしてみれば、このfunctor のペアは、 $f(c,−) : C \to Set^D$ と  $f(−,d) : D \to  Set^C$ のペアになります。確かにこう考えるとわかりやすいです。) functor $f(c,− )$ は行列fのc行目の集合として描くことができます。 このfunctorは functor $D \to Set$を定義し、このfunctorでDのj番目のオブジェクトは、行 $f(c,− )$ のj番目のオブジェクトの集合にマップされます。 同様に、functor $f(− ,d)$は行列fのd列目の集合を表します。 カテゴリーが、Yoneda

12月のマルレク「大規模言語モデルの数学的構造 I」の講演資料と講演ビデオ公開しました

イメージ
 【12月のセミナー「大規模言語モデルの数学的構造 I」の講演資料と講演ビデオ公開しました 】 #大規模言語モデルの数学的構造1 昨年末に開催したマルレク「大規模言語モデルの数学的構造 I」の講演資料と講演ビデオ公開しました。ご利用ください。 「生成AI」技術が、ITの世界だけでなく社会のいろいろな領域に、大きな影響を与えようとしているのは、みなさんご承知の通りです。 「大規模言語モデル」というのは、この「生成AI」技術を生み出している巨大なインフラ(例えば、OpenAIのChatGPTを支えるシステム)とその理論的モデルの両方を指す言葉です。  「生成AI」に対する関心の高まりとともに、その基礎を支える「大規模言語モデル」に対する理論的関心もまた高まっています。活発な議論と研究が行われています。 なぜなら、ChatGPT以降の、いわゆる「生成AI」の働きには、いろいろ不思議な謎があるからです。 【 大規模言語モデルの不思議な振る舞いには理由がある 】 ただ、今回のセミナーを開催した理由は、生成AIのの不思議さを数え上げることではありません。むしろ逆の、「不思議に見えることには理由があるはずだ」という考えからです。 僕は、技術の基礎には科学的な認識があり、さらに進んでその基礎は数学的に表現されうると考えています。大規模言語モデルの不思議な振る舞いにも数学的根拠があるはずです。 そうした研究が切り開くのは、基礎へ掘り進んでいくだけの一方向の認識の「深化」だけではありません。興味深いのは、そうした過程が、全く抽象的な無意味な形式と思われていた数学理論の「応用」の領域の発見として、認識の「豊富化」として現れることがあるということです。 今回紹介するのは、そうした議論の中で、注目されているTai−Danae Bradleyの議論です。 内容的には、コンピュータ上で言葉の意味をどう表現するのかという問題を扱っています。この点では、「言葉の意味は、その言葉を含むすべてのコンテキストで決まっていく」という考えがベースになっています。そのことを了解できれば、理解は進むと思います。 【 「巨人の肩に乗る」 】 カテゴリー論をベースとした数学的な議論がメインで、日頃あまり見慣れない用語や概念が出てくるので、最初はわかりにくいところが多いかもしれません。 ここでの議論のベースになっている

embedding algorithm

 【 embeddingは行列の因数分解として解釈できる 】 mikalovらの「Word2Vec」の論文はいくつかのバージョンがあるのですが、その計算アルゴリズムは、2013年に、Skip−gramとnegative sampling の手法としてまとめられます。 ただ、2014年には、語の埋め込みのアルゴリズムの背後には、もっと深い構造があることが発見されます。それは、語の埋め込みは、ある行列の因数分解として解釈できるという発見です。 対象の言語の語彙Dを辞書式にアルファベット順に並べます。この並びでi番目の語をw_i とします。以前見たように、このi番目の語に、i番目のエントリーだけが1で残りのエントリーはすべて0の1−hotベクトルに対応付けることができます。 これは、Dから実数Rへの関数ですからR^Dのベクトル空間を考えたことになります。これもある意味、DからR^Dへの埋め込みですが、こうしたベクトル表示では、二つの語のベクトルの内積は0になり、言語の意味をうまく表現できないことは、前回見てきた通りです。 そこで、次のような|D|行 ×|D|列の行列Mを考えます(|D|は、Dの大きさです)。 Mの i行 j列の要素は、語w_iと語w_j に対応して、この二つの語がコーパス上で近くに出現する確率を表すものとします。Dが、例えば、3万語からなるとすれば、この行列Mは、3万行×3万列からなる巨大な行列です。 この行列Mが、|D|と比べるとはるかにちいさなdについて、|𝐷|×𝑑のサイズの行列𝜎′ と、𝑑×|𝐷| のサイズの行列𝜎の積の形で M=𝜎′𝜎 と因数分解できたとします。( 行列𝜎′𝜎のサイズが、|D|行 ×|D|列となることを確認ください。) この時、行列𝜎のi列は、語w_i のd次元のembedding を与えると考えることができます。(行列𝜎のサイズは、𝑑×|𝐷| ですので、どんな語w_i についても、i列目は存在します。また、i列目の列ベクトルの次元はdです。) Deep Learning の最適化の手順に則して語れば、Mが与えられた時、‖𝑀 − 𝜎′𝜎‖が最小となるような𝜎′と𝜎を見つける問題として、embedding のアルゴリズムを定式化できます。 -----------------------------

DNN と word embedding

【 embeddingの不思議 】 このセッションから Tai-Danaeらの論文の "Embeddings in Natural Language Processing" 「自然言語処理でのembedding」セクションの紹介に入ります。 ここ10年、計算言語学と自然言語処理(NLP)の研究者たちは、当初はアルファベット順に並べられた集合の構造しか持たなかった単語を、ベクトルに置き換えるというステップを踏んできました。 語をベクトルで置き換えるというステップは、人工知能分野における現在の進歩の主な原動力のひとつです。 もちろん、こうした変化を引き起こした最大の転換点は「Word2Vec」論文の発表なのですが、Tai−Danaeの論文が興味深いのは、この変化を引き起こした背景を分析していることです。  画像認識や音声認識で大きな成功を収めてきたDeep Learning 技術が、次のターゲットとして向かったのは自然言語処理の世界でした。 【 DNNの働きの定式化 】 当時、Deep Learning 技術の発祥の地とも言える、Deep Neural Network の理論的な定式化が進みます。( DNN = Deep Neural Network は、"feed forward network" とか "full connect network" とか、いろんな名前を持っているのですが、それらはみな同じものです。) それは、DNNは、ベクトル空間からベクトル空間への関数の連続した合成、しかもある同一の特徴で記述できる関数の連続した合成として記述できるという認識です。 この認識は、Deep Learning のシステムを構築を支援する様々なフレームワーク(TensorFlow, Keras 等々)登場の基礎として、実践的には非常に大きな意味を持ちました。 【 ある発見 】 そうしたなか、経験的なものですが、ある驚くべき発見がありました。Tai−Danaeの表現を引用します。 「ある言語タスク用に学習を済ましたモデルの第1層(先の図の𝑓_1)を、別の言語タスクを対象とした別のDNNの第1層として使用すると、この二つ目のタスクの性能が大幅に向上するのである。」 Word2Vecは、おそらく、こうした背景の中で生

enriched category

【 単純な例で enriched category を振り返る 】 このセッションでは、2つのオブジェクト間の射の集合𝐶(𝑦,𝑥)がもはや単なる集合でない場合の、カテゴリー論であるenriched category theoryについて考えます。 そこでは、射の集合𝐶(𝑦,𝑥)自身が、部分順序集合であったり、アーベル群であったり、位相空間であったり、他の何かであったりします。つまり、enrich化されたカテゴリーでは、先のCからSetへのfunctorであるpresheafの構成で、𝑆𝑒𝑡を別のカテゴリーに置き換えることになります。これはベクトル空間𝑘^𝑋との類比では、ベースの体𝑘を変えることに似ています。 新しいベースのカテゴリーが十分に良い構造を持っていれば、CをC上のpresheafで置き換えることについて述べたことは、ほとんど一語一語すべて通用します。 前回のセミナーは、言語のカテゴリーL上の copresheaf Set^L から、単位区間 [0,1] でenrich化された copresheaf [0,1]^L を構成したものです。これは結構複雑でした。 【 単純な例 -- 2-enriched presheaf 】 ここでは、もっと簡単な enriched category の例を考えます。 例えば、 𝖲𝑒𝗍 を、0と1という二つのオブジェクトを持ち、同一射以外の射は、0→1 一つだけである 2 というカテゴリーに置き換えると、それは、 2 -valued presheaves というカテゴリーになります。 この場合、𝐶が 𝑋 = 𝑋^𝑜𝑝なる離散カテゴリー𝑋だとすると、 2 ^𝑋のpresheaf は、{0,1}^X と表せて、正確に X上の {0,1}に値を取る関数(characteristic functionです)に等しくなり、それは、Xの部分集合に等しくなります。 2^𝑋の、それが2-enriched presheafであることによって与えられる構造は、以前に述べた部分集合上のBool 代数だということになります。( 0をfalse, 1をtrue と考えます) 前回のセミナーで見た、[0,1]^X は、単位区間[0,1]に値を取るpresheaf ですが、{ 0, 1 }^X は、0か1 かの値

presheaf

【 この部分は、この間のセミナーのまとめになっています 】 今回のセッションで紹介する部分は、この間のセミナーで扱ってきた問題の短かなまとめになっています。この間のセミナーで紹介してきた大規模言語モデルを舞台にして、Tai-Danae が利用した数学的手法を振り返るには、ちょうどいい素材かもしれません。ぜひ、以前の資料を参照ください。 短いセクションなのですが、ストーリーは二つの視点を軸に展開します。 一つは、前回のセッションで紹介した「オブジェクトからオブジェクト上の関数へ」という視点です。このセクションのタイトルは、「Objects Versus Functions on Objects」でした。 もう一つは、そうした展開を、最初のサンプルとして導入した「ベクトル空間」= 線形代数 との対比で位置付けることです。この論文のサブタイトルは、「Parallel Narratives in Linear Algebra and Category Theory 」でした。 この二つを意識してもらうと、いろいろな気づきがあると思います。 一つ注意してもらいたいことがあります。 以前のセミナー「大規模言語モデルの数学的構造」での主要な数学的ツールは、copresheaf でした。ただ、このセクションは、copresheaf のカテゴリー論的「双対」概念である presheaf について論じているということです。 どちらも、あるカテゴリーCから集合のカテゴリーSet へのfunctor です。「オブジェクトからオブジェクト上の関数へ」という視点で見ると、両者は同じようなものです。 ただ、両者の違いを少しまとめてみました。 C上のpresheaf は、𝐶^𝑜𝑝 → 𝑆𝑒𝑡 のcontravariant functorで、 C上のcopresheafは、𝐶 → 𝑆𝑒𝑡 のcovariant functorです。 二つのfunctorのvarianceの違いから、そのrepresentable functorは、次のようになります。 presheafのrepresentableは、ℎ^𝑥 ≔ 𝐶( −, 𝑥 ) で、 copresheafのrepresentableは、ℎ_𝑥 ≔ 𝐶( 𝑥 ,− ) です。 後者の𝐶( 𝑥 ,− )の形が、以前の

ベクトル空間

【 オブジェクトからオブジェクト上の関数へ 】 あまり情報が与えられない、あるいは不完全な構造を持つ数学的対象𝑋が与えられたとしましょう。 Xを直接調べようとしても、それはXの要素・オブジェクトをいろいろ調べることに帰着するのですが、Xについてよくわからないことが起こります。 そう言う時、構造がよくわかっている対象Yをとって、XからYへの関数 Fun(X)を考えます。Fun(X)はYに値をとりますので、XよりはFun(X)の方が構造がわかりやすいということを期待できると言うことです。 「オブジェクトからオブジェクト上の関数へ」と言うのは、 Xだけに注目するのではなくFun(X)にもっと注目しようと言う視点の転換を促すスローガンだと思っていいと思います。 論文の"Objects Versus Functions on Objects"というセクションでは、こうしたオブジェクト上の関数への注目によって構成された数学的対象の例を三つほど挙げています。  ⚫️ ベクトル空間  ⚫️ (co)presheaf  ⚫️ enriched category 【 ベクトル空間 】 このセッションでは、ベクトル空間の例を取り上げます。 ベクトル空間というのは、ある集合X上で定義された体k(例えば、実数 R とか複素数 C とか)に値を取る関数の集合として、k^X という形で定義されます。 ベクトルは、関数なんです。 古典bit {0,1} から 量子bit { |0>, |1> } への移行も、{0,1}を考えるのではなく{0,1}上で定義関数を考えることへの飛躍として理解できます。次のように。  f(0)=1, f(1)=0 ; g(0)=0, g(1)=1である関数 f, g を考えて、 f = |0>, g = |1> と考える。 一般に、関数であるケット|i>は (それはケット|i>はベクトルであるというのと同じ意味です)引数j に対して、|i> (j) = 1 ( i = jの時) あるいは |i> (j) = 0 (i =jでない場合) という値を返します。 この量子ビットの例は定義域が{0,1}の例でしたが、任意の集合Xについて値域が{0,1}となる関数の集合も興味深い性質を持っています。Xの要素の上