深層強化学習のベイズ主義的な情報探索に駆動された自然言語処理の意味論

スポンサーリンク

派生問題:自然言語における情報の発見探索は如何にして可能になるのか

Webクローラ型の人工知能を前提とすれば、深層強化学習アルゴリズムによって発見探索した情報は、大抵の場合「自然言語(natural language)」となる。エージェント情報から学習するには、言語意味観察できなければならない。

自然言語処理においてこの問題は、言語意味を如何にして表現するのかという「意味表現(semantic representation)」の問題として参照されている。この意味表現問題ではとりわけ単語水準での表現から考察が始まる。それは、単語の意味を正しく表現できれば、その組み合わせによって、句や文、そして文書の意味表現を階層的に構成することができるようになると想定されているためだ。

長らく自然言語処理の領域で注目を集めていたのは、単語それ自体には意味は無く、その単語の使われ方にこそ意味があるとする「分布仮説(distributional hypothesis)」であった。分布仮説は、単語が出現する文脈から自動的にその意味を見出すことを可能にする。特に大規模なコーパスを統計的に処理する場合には、個々別々の単語に意味を与える必要の無いこの仮説は、妥当性以上に有用性の観点から支持されていた。

あるコーパス内の単語とその文脈で共起する各単語の共起性は、とりわけ相互情報量やカイ二乗値などによって計算される。ゼロ頻度問題の解決においては、特異値分解などのような次元圧縮方法が提案されている。このような分布仮説に基づいて構成される意味表現を「分布的意味表現(distributional semantic representation)」と呼ぶ。

とりわけ形式意味論(formal semantics)の中からは、このボトムアップ的な構成を支持する案も提出されている。それによれば、意味は、単語それ自体のみならず文法と文脈にも依存して規定される。意味は、複合的な諸要素の組み合わせによって成り立っているという「構成性の原理(Principle of Compositionarity)」は、この意味である種的を射ている。

構成性の原理:複合的な表現の意味は、その部分とそれらの構文的な組み合わせ方法の関数である。」
Kamp, H., & Partee, B. (1995). Prototype theory and compositionality.Cognition, 57(2), 129-191. 引用はp135より。

ある文を意味付けるということは、その文に真理条件を付与することを意味する。「構成性の原理」を前提とするなら、真理条件を決定する意味処理規則が統語処理規則と同期させることが一案として求められる。

構成性の原理」は単なる単語の分解のみならず、それらの単語によって構成された文に対する観点を提供している。それは語彙のみならず文それ自体においても意味が付与されているという観点にもなり得る。そしてこの流れは、形式意味論の枠組みにおいて、更にハンス・カンプの「談話表現理論(discourse representation theory)」によって推進されることになった。例えば「it」や「that」、「she」や「he」などのように、前方照応的(anaphoric)な代名詞や後方照応的(cataphoric)な代名詞、あるいは単に人称代名詞は、文と文の系列的な関連を表している。このように「談話」の観点では、分解された個々の単語というよりは、文そのものの関連や系列が重視されているのである。

一方、とりわけ「深層学習(deep learning)」で意味表現を実行する場合、ボトムアップ的にコーパスから意味表現構成するのではなく、まずそれぞれの単語を固定長ベクトルで表現される形式として捉え、何らかの目的関数最適化することによって、意味表現ベクトルを学習するというトップダウンの方針を採る。『数えるな。予測せよ!』から始まるマルコ・ヴァローニらの報告によれば、このトップダウンの方針に基づいた深層学習による意味表現は、従来のコーパスによるボトムアップ方法に基づく意味表現を有意に上回ることがわかっている。

これまでのトップダウン方法では、意味表現ベクトルの諸要素が語彙集合全体となるために高次元でスパースの伴う意味表現となっていた。これに対して深層学習を利用したトップダウン的な意味表現では、ベクトルの次数を事前に固定して学習するために、低次元で密な意味表現が可能になっている。こうしてトップダウン的な方法に基づいた意味表現は、「分散型意味表現(distributed semantic representation)」として注目を集めることになった。

問題解決策:単語の特徴ベクトル化

トップダウン型にせよ、ボトムアップ型にせよ、一つの根本的な共通点を挙げられる。いずれにせよ一連の自然言語処理は、皆まず文を単語に分解するところから始まっている。そして深層学習との関連で言えば、これらの単語は皆一種の特徴ベクトルとして観測されることになる。

英語やドイツ語であれば、単語間にはスペースが含まれているために、プログラム的に分割することは容易い。しかし日本語のように単語が連続する文の場合は、その分割が困難になる。と言うのも、連続する文字列の何処から何処までが一単語なのかは、文法や熟語に依存するからだ。

形態素解析

そこで要求されたのが、「MeCab」のようなソフトウェアが提供している「形態素解析(Morphological Analysis)」の機能だ。形態素解析は、テクストの性質を低コストで分析することを可能にする。テクストマイニングを実践するためには、「構造化データ(Structured Data)」と「非構造化データ(Unstructured Data)」の差異意識しておかなければならない。テクストマイニングの分析対象データとなるテクストは、専ら非構造化データとしての性質を有している。この性質を事前に認知しておかなければ、テクストマイニングを設計することは難しくなる。

構造化データとは、リレーショナル・データベースなどのように、事前にデータの関係を定義した上でデータを蓄積させるデータベースを前提に処理され得るデータのことである。これに対して非構造化データとは、テクスト、画像、動画など、定型的に処理されていないデータを意味する。非構造化データとしてのテクストを分析対象データとするには、各テクストを分析対象となるように意味付ける必要がある。

形態素解析は、このテクストの意味付与として機能する。形態素解析とは、言語学の分析方法で、それぞれの言語をそれ以上変化も活用もされない最小の部分に分割する方法である。この最小単位としての部分を「形態素(Morpheme)」と呼ぶ。

この形態素解析を用いれば、分析対象データとなるテクストの中で、どのようなキーワードやキーフレーズがどの程度の頻度で出現しているのかを分析することが可能になる。また、形態素間の関係を洗い出すことによって、共起関係にあるテクスト同士を抽出することもできる。

形態素解析機能は、例えばR言語のパッケージであるRMeCabを利用することで実施できる。RMeCabは、MeCabをRで使用するためのパッケージである。このパッケージでは、入力されたテクストを対象に、MeCabの機能による形態素解析を実行する。これにより、入力されたテクストを形態素、出現頻度情報、N-gramなどのデータに変換することが可能になる。

MeCabはGoogleの日本語入力開発者の一人である工藤拓によって開発されたオープンソースの形態素解析エンジンだ。言語や辞書、コーパスに依存しない汎用的な設計を基本方針として開発されている。形態素に分割する際に問題となっていたのは、語の抽出単位の曖昧性である。例えば、「本部長」という単語は、「本部」と「長」という単語に分割することもできれば、「本」と「部長」に分割することもできる。これ以外にも、日本語には複合語で表現された多くの固有名詞が存在する。例えば「横浜市役所」という単語は、「横浜」と「市」と「役所」に分割することもできれば、「横浜市」と「役所」に分割することもできる。また「横浜」と「市役所」に分割することもできるだろう。

頻度付き集合

このような曖昧性は、個々の分析への応用において様々な問題を派生させる。その分析対象となるテクスト次第で、最適な解も変わってしまう。そこで工藤は、分析対象となる形態素の「頻度付き集合(bag-of-words: BOW)」を求める上で、可能な全ての解を用いる方法を提案した。その際の指標の一つとなったのが、連接コストだ。連接コストとは、品詞の接続が自然である度合いを意味する。より自然な接続であれば、それだけ連接コストは低くなる。逆に不自然な単語同士を接続させようとした場合、連接コストは高まる。

こうした指標を使えば、可能な全ての分割方法を取り上げる際に、それぞれの分割方法比較することが可能になる。工藤はこれにより、可能な全ての分割方法を連接コストをはじめとした指標を反映させた確率値と共に出力する仕様として形態素解析エンジンを設計した。連接コストの場合には、それが高い組み合わせには低い確率値が割り当てられるようにしている。連結コストが低い単語の組み合わせには高い確率値が割り当てられる。これによって、それぞれのBOWの期待値から有力な単語の組み合わせ候補を探索できるようにしたのである。

問題解決策:ニューラル・ネットワーク言語モデル

上述した手続きによって分解された言語は、確率分布としてモデル化されることで分析可能になる。こうしてモデル化されたデータ概念を「言語モデル(Language Model)」と呼ぶ。言語モデルは、単語がコーパス内で出現する傾向を確率過程として把握することによって、特定の単語が特定のコーパスの特定の位置に出現する確率計算することを可能にする。単語の出現確率は、自然言語処理や音声認識で参照される。

あるコーパスあるいは文書でj番目に出現する単語を$$x_j$$と表現した場合、i番目からn番目までに連続して出現する単語で構成された単語の組み合わせは、$$x_i^n = x_i, x_{i 1}, …, x_n$$と表現できる。尚、

$$x_1^{(j-1)}$$の次に$$x_j$$が出現する条件付き確率は$$p(x_j|x_i^{(j-1)})$$となる。よって長さTの単語の組み合わせから構成された文書が生成される確率は、$$p(x_{1}^{(T)}) = \prod_{j=2}^T p(x_j|x_1^{(j-1)})$$となる。

尤も、実際の文書では単語間の距離に比例してその関連性も低くなる。経験的に、連続する長さTは2から5程度までに留めることが多い。あまりにも長く設定し過ぎると、コーパス内に全く現われない単語の組み合わせが発生してしまう。これを特に「ゼロ頻度問題(zero-frequency problem)」と呼ぶ。

ニューラル・ネットワーク言語モデル(neural network language model; NNLM)は、言語モデルにおける特定の単語の組み合わせの出現確率を予測するニューラルネットワークとして設計されている。このニューラル・ネットワークが最初に学習するのは、$$x_{j-n + 1}^{(j-1)}$$が入力された際の単語$$x_j$$が出現する条件付き確率だ。NNLMでは、特定文書内で出現した文書の索引(index)を1として、それ以外を0とするN次元ベクトルとして各単語を表現する。ここでいうNは、語彙数に他ならない。こうしたベクトル表現を「1-of-N表現(1-of-N representation)」と呼ぶ。

NNLMではこのN次元ベクトルをP<N次元へと落とし込んだ射影行列CをN×P個の自由パラメタ(free parameters)として、コーパスから学習していく。このベクトルの射影は次元の呪い(curse of dimensionality)の回避も考慮した上で設計されている。この射影行列Cは各語彙における各単語に関連した「分布特徴ベクトル(distributed feature vectors)」を表現する。

訓練データセットは、$$w_1, w_2, …, w_T$$の語から成る。語彙の集合をVと表現するなら、$$w_t \in V$$となる。目的関数は$$f(w_t, …, w_{t-n + 1}) = p(w_t|w_1^{t-1})$$のモデルとなる。

Bengio, Y., Schwenk, H., Senecal, J. S., Morin, F., Gauvain, J. L. (2006). Neural probabilistic language models. In Innovations in Machine Learning (pp. 137-186). Springer Berlin Heidelberg., p.1142 より[引用](https://accel-brain.com/erinnerung-von-anthropologischen-materialismus-in-medienasthetik/3/#link2keyword=引用)。

射影されたベクトルは次の隠れ層に対する入力値となる。(n-1)個の単語の組み合わせとなる単語列$$x_{j-n + 1}, …, x_{j-1}$$のそれぞれに対する射影ベクトル$$Cx_{j-n + 1}, …, Cx_{j-1}$$を計算した(n-1)P次元ベクトルが隠れ層に入力される。この隠れ層への入力ベクトルをcとし、隠れ層に対する重み付け行列をW、バイアスをbと表現するなら、隠れ層のj番目の出力ノードの出力値は、次のように計算される。

$$d_j = tanh (\sum_{l=1}^{(n-1)P} W_{jl}^{(h)}c_l + b_j^{(h)})∀j = 1, …, H$$

ここで、上記の値をj番目の要素とするベクトルをdと定義すると、隠れ層と出力層の重み付け(hidden-to-output weights)の行列Uを参照して、隠れ層から出力層への入力ベクトル成分をUdとして計算することが可能になる。

一方NNLMでは射影層から直接的に出力層に入力されるベクトルの成分にも気を配らなければならない。NNLMは入力された単語列$$x_{j-n + 1}^{(j-1)}$$の直後に特定の単語$$x_j = i$$が出現する条件付き確率$$p(x_j = i|x_{j-n + 1}^{(j-1)})$$を言語モデル化している。そのため、隠れ層が集約している文脈以外にも、予測対象となる単語候補の射影も確率モデルで計算されなければならない。ニューラルネットワークにおける射影層と出力層の重み付け行列をW、バイアスベクトルをbとすると、射影層から直接的に出力層へと入力されるベクトル成分は、以下のようになる。

$$W^{(o)}c + b^{(o)}$$

出力層のi番目の出力ノードへの入力は、以上の二つの入力から計算できる。

$$o_i = p(x_j = i|d, c)$$

$$o_i = \sum_{j=1}^HU_{ij}d_j + \sum_{l=1}^{(n-1)P}W_{il}^{(o)}c_l + b_i^{(o)}$$

$$p(x_j = i|x_{j-n + 1}^{(j-1)}) = \frac{exp(o_i)}{\sum_{r=1}^Nexp(o_r)}$$

ここにおいて、C、W、b、Uは全て学習すべきパラメタとなる。これらのパラメタを纏め上げてθと表すなら、$$θ = (b,d,W,U,H,C)$$となる。NNLMでは、コーパス内で観測された単語に対する出現確率が最大化するように、バックプロパゲーション(backpropagation)によるパラメタ学習を実行する。目的関数として参照されるのは、このパラメタθに関する正規化項(regularization term)となるR(θ)を加算した式となる。

$$E = \sum_{i=1}^{N}t_ilog p(x_j = i|d, c) + βR(θ)$$

$$if (x_{j-n + 1}^{(j-1)}, x_j = i) \ then \ t_i = 1 \ else \ t_i = 0$$

尚、パラメタβは正規化係数で、パラメタθの正規化の強度を調整する。

問題解決策:深層学習による自然言語処理

深層学習を用いた単語の意味表現方法として、幾つかのアルゴリズムが提案されている。それらのアルゴリズムは、まず全ての単語を一定次元の実空間上の固定長ベクトルとして表現すると共に、所与のコーパス内の単語の出現を推定する場合の精度が最大化する単語の表現ベクトルを調整していく手筈を取る点で共通している。一定次元の実空間として、表現する空間そのものが事前に付与されるパラメタとなる。全ての単語はこの空間上に射影される。そして、次元数を調節することで、表現の粒度を変えることもできる。

しかし、何を以って単語が出現したと考えるのか、出現を推定した場合の精度を如何にして評価するのか、精度を評価する関数を如何にして最適化するのかなど、問題は山積みであった。

CBOWモデル

CBOWモデル(continuous bag-of-words model; CBOW model)は、「ある単語xが出現する文脈」で出現している「他の単語z」を利用してxを推定できるようにすることを目的としている。単なる言語モデルであれば、ある単語が出現するか否かを推定する場合に、現在の単語よりも以前に出現した単語を訓練データとして参照するだろう。だがCBOWモデルの場合は、これに加えて、その後に出現するであろう単語も学習時に参照できるようにする。

予測対象となる単語をxとして、その文脈に出現する単語をzとして表現するなら、単語xの表現学習する場合は、その直前に出現しているn個の単語$$z_{i-n}, …, z_{i-1}$$とその直後に出現している$$z_{i 1}, …, z_{i n}$$を、xを推定するための特徴量として参照することになる。言い換えれば、CBOWモデルは文脈$$z_{i-n}, …, z_{i-1}, z_{i 1}, …, z_{i n}$$の中に単語xがi番目に出現する確率$$p(x|z_{i-n}, …, z_{i-1}, z_{i 1}, …, z_{i n})$$を学習する。この場合、文脈は2n個の単語から構成される。xの文脈の表現形式は、$$\vec{x} = \frac{1}{2n}(z_{i-n} … z_{i-1} z_{i 1} … z_{i n})$$などのように、文脈における単語の平均ベクトルとしても記述できる。この場合、文脈における単語の出現順序は捨象される。故にこのモデルは一種のbag-of-wordsモデルとして記述できる。

このモデルで計算される「ある単語xが出現する文脈」で出現している「他の単語z」を利用してxを推定できるようにすることは、端的に言えば次のような条件付き確率意味している。

$$p(x|z_{i-n} … z_{i-1} z_{i 1} … z_{i n})$$

ここで、$$\nu$$を語彙集合とし、x´を語彙集合内に含まれている単語を表し、X´をその意味表現とした場合、上記の条件付き確率は次のように計算できる。

$$\frac{exp(\vec{X}^{\tau}X)}{\sum_{x’ \in \nu}^{}exp(\vec{X}^{\tau}X’)}$$

Continuous Skip-Gramモデル

CBOWモデル(continuous bag-of-words model; CBOW model)が「ある単語xが出現する文脈」で出現している「他の単語z」を利用してxを推定できるようにすることを目的として居るのに対して、Continuous Skip-Gramモデルは、「ある単語xが出現する文脈」で「他の単語z」を推定することを目的としている。このモデルで求められるのは、ある単語xが文脈中に出現している場合の別の単語zが出現する条件付き確率であるため、$$p(z|x)$$として表現される。

コーパス内でxが出現している文脈中に出現する単語の集合を$$\nu(x)$$とした場合、この条件付き確率はCBOWのモデルで表現させれていた条件付き確率を反転したような関連となる。

$$p(z|x) = \frac{exp(X^{\tau}z)}{\sum_{z’ \in \nu(x)}^{}exp(X^{\tau}z’)}$$

学習すべきパラメタとなるのは、全ての単語x, zに関する表現ベクトルの諸要素となる。r次元の表現ベクトルを学習する場合のパラメタ数は、$$(|\nu(x)| |\nu|) × r$$となる。

CBOWモデルにせよ、Continuous Skip-Gramモデルにせよ、表現ベクトルが2種類に区別されている。一つは入力値としての表現ベクトルで、もう一つが出力値としての表現ベクトルだ。こうして区別を導入しておくと、文脈として出現する単語の集合と、入力することでその表現学習対象とする単語集合とを無関係に選択することができるようになる。例えば文脈として出現する単語の集合を高い頻度で出現する単語の集合に限定することも可能になる。

$$\frac{exp(X^{\tau}z)}{\sum_{z’ \in \nu(x)}^{}exp(X^{\tau}z’)}$$は、対数双線形の形式となる。xとz双方に対して同時に凸関数にはなることはあり得ない。この関連から目的関数には局所解が存在する。故に最適解を発見することが困難となる。しかしxの要素に着目すると、xとzの内積はその要素に対して線形だ。逆にzの要素に着目した場合にも同様のことが言える。双方は個々にその変数に対応した別々の線形性を有している。

そこで、両辺の対数を取り、それぞれxとzで偏微分すると、$$\frac{∂log(p(z|x))}{∂x} = z – \sum_{z’ \in \nu(x)}^{}z’p(z’|x)$$と、$$\frac{∂log(p(z|x))}{∂z} = X(1-p(z|x))$$という更新式が得られる。単調増加関数である対数関数は、対数を取った当該関数と対数を取る前の元となる関数が同一極点を有する。そのため、対数尤度を最大化することを以って、確率そのものを最大化に伴う指数関数的な確率分布の計算を負担軽減できる。

この最適化計算には交互最適化(alternating optimization)が用いられる。つまり、xとzのいずれか一方を固定して、他方に関する凸関数最適化問題を解き、その最適解を代入して固定することで、もう片方の凸関数最適化問題を解いていく、という反復を実行する。だがこれだけではxとzの双方で大域最適解を発見できるという保証は無い。そのため、word2vecのような実務的な処理を担うアルゴリズムでは、確率勾配法を採用して最適化を実行している。

Continuous Skip-Gramモデルの階層型ソフトマックス

ここで取り上げたContinuous Skip-Gramモデルの$$p(z|x) = \frac{exp(X^{\tau}z)}{\sum_{z’ \in \nu(x)}^{}exp(X^{\tau}z’)}$$は、全ての文脈における語彙集合を前提とした規格化を要するが故に、大規模コーパスを対象とした場合に計算量が追い付かなくなる。そこで計算量を削減する方法が求められる。

一つの問題解決策として挙げられるのは、事前に単語間の階層構造を生成して、それに準じて規格化していくという方法だ。これを特に「階層型ソフトマックス(hierarchical softmax)」と呼ぶ。

例えば階層的クラスタリングによって全ての単語を含む階層構造を事前に生成しておけば、単語xがある一つのクラスタにのみ含まれるという状況を造り上げることができる。全ての語彙集合ではなく、その当該クラスタのみでxの出現確率計算すれば良いということになる。これは言わば単語それ自体の出現頻度を個々別々に計算していくのではなく、ある程度纏め上げた単語の集合の出現頻度を計算していく方法だ。ここで代入する集合は、例えば辞書をはじめとする言語資源のように、人間経験を反映させた作為的な集合であっても構わない。ある単語xがある一つのクラスタにのみ属させることにより、全ての集合ではなく、当該集合でのみxの確率規格化しておけば良いのである。

二分木によるソフトマックス戦略

階層型ソフトマックスは、二分木(binary tree)を利用することで各単語の出現確率を割り当てていく。それは、「葉(leaves)」としての単語Wとそれらの「ノード(node)」の組み合わせに基づいて出力層を表現する。各ノードは明示的に子ノードの相対的な確率を表している。

より正確に言えば、どの単語wも、木のルート(root)から適切な道則でつながることができている。このルートから単語wへの道則におけるj番目のノードをn(w, j)としよう。そして、この道則の長さをL(w)と置く。この場合、$$n(w, 1) = root$$で、$$n(w, L(w)) = w$$となる。加えて、いずれの内的なノードnにおいても、nの子はch(n)となる。[[x]]が1ならばtrueで、そうでなければ-1とする。するとこの階層型ソフトマックスは単語の出現確率を次のように表現する。

$$P(w|w_I) = \prod_{j=1}^{L(w)-1} \sigma([[n(w, j+1) = ch(n(w, j))]] \cdot v_{n(w, j)}^{´} \tau v_{wI})$$

ここで、$$\sigma(x) = \frac{1}{1+exp(-x)}$$となり、$$\sum_{w=1}^{W}p(w|w_I) = 1$$となる。

この表現指し示しているのは、$$\log_{}p(w_o|w_L)$$と$$∇\log_{}p(w_o|w_I)$$の計算コストが、$$L(w_o)$$に比例するということだ。この計算はlog Wを超えるものではない。

ネガティブ・サンプリング

ネガティブ・サンプリング(negative sampling)は、上述した階層型ソフトマックスの代替案として取り上げられている。Continuous Skip-Gramモデルで単語xとzの表現ベクトルを学習するためには、「xの文脈で出現している単語」のみならず、「xの文脈で出現していない単語」も必要となるというのが、このネガティブ・サンプリングの発想だ。しかし「xの文脈で出現していない単語」を挙げようとすれば際限無く挙げられてしまう。これでは計算効率上影響を及ぼす。故にネガティブ・サンプリングでは、「xの文脈で出現していない単語」をコーパスからアトランダムに抽出する。これにより、「xの文脈で出現している単語」との差異に基づいて、単語の意味表現学習していくことになる。

単語(word)と文脈(context)の組み合わせである(w, c)に関して考えてみよう。$$p(D=1|w, c)$$は、コーパスから(w, c)の組み合わせが入手できる確率を表す。$$p(D=0|w, c) = 1- p(D=1|w, c)$$は、逆にコーパスからこの組み合わせが得られない確率となる。まずはパラメタθを仮定して、次のように分布を制御できるようにしておく。$$p(D=1|w, c; θ)$$この時目的となるのは、データに由来する観測の全体として、上記の確率を最大化するパラメタを発見することである。$$\DeclareMathOperator*{\argmax}{argmax}\argmax_{\theta} \prod_{(w, c) \in D}^{}p(D=1|w, c;θ)$$

$$=\argmax_{\theta} log\prod_{(w, c) \in D}^{}p(D=1|w, c;θ)$$
$$=\argmax_{\theta} \sum_{(w, c) \in D}^{}p(D=1|w, c; \theta)$$

p(D=1|c, w:θ)の数量は、ソフトマックスを利用することで設定できる。$$p(D=1|c, w:θ) = \frac{1}{1+e^{-v_c ・ v_w}}$$

したがって目的関数は次のようになる。

$$\argmax_{\theta}\sum_{(w, c) \in D}^{} log \frac{1}{1 + e^{-v_c ・ v_w}}$$

いずれの(w, c)の組み合わせでも$$p(D=1|w, c;\theta) = 1$$となるようなパラメタθを設定するなら、上記の目的関数は単純な解を持つことになる。これは$$v_c = v_w$$と置き、$$v_c・v_w = K$$と置いてパラメタθを設定するなら、簡単に達成できる。ただしKは十分大きな数となる。

肝心のベクトル化において、同一の(w, c)の組み合わせを制限することで値の重複を未然に防止する機構が必要になる。そのための一つの方法は、$$p(D=1|w, c;\theta)$$が必ず低くなるように、同一の(w, c)の組み合わせのモデルを表現することである。つまり、一度出現した(w, c)の組み合わせが以後出現し難くなるようなモデルだ。このモデルは、アトランダムに抽出された(w, c)の組み合わせの集合D´を生成することで可能になる。ネガティブ・サンプリングという名称は、この不正な組み合わせを言い表す集合D´に由来していると考えられる。これを前提に目的関数最適化するなら、以下のようになる。

$$\argmax_{\theta} \prod_{(w, c) \in D}^{}p(D=1|w, c;θ)\argmax_{\theta} \prod_{(w, c) \in D´}^{}p(D=0|w, c;θ)$$

$$=\argmax_{\theta} \prod_{(w, c) \in D}^{}p(D=1|w, c;θ) \prod_{(w, c) \in D´}^{}(1-p(D=1|w, c;θ))$$
$$=\argmax_{\theta} \sum_{(w, c) \in D}^{}log p(D=1|w, c; \theta) + \sum_{(w, c) \in D´}^{}log(1-p(D=1|w, c; \theta))$$
$$=\argmax_{\theta} \sum_{(w, c) \in D}^{} log(\frac{1}{1+e^{-v_c ・ v_w}}) + \sum_{(w, c) \in D´}^{} log (1- \frac{1}{1+e^{-v_c ・ v_w}})$$
$$=\argmax_{\theta} \sum_{(w, c) \in D}^{} log(\frac{1}{1+e^{-v_c ・ v_w}}) + \sum_{(w, c) \in D´}^{} log (\frac{1}{1+e^{v_c ・ v_w}})$$

この数式は、$$σ(x) = \frac{1}{1+e^{-x}}$$を導入することで、次のように変換できる。
$$\argmax_{\theta} \sum_{(w, c) \in D}^{} log(\frac{1}{1+e^{-v_c ・ v_w}}) + \sum_{(w, c) \in D´}^{} log (\frac{1}{1+e^{v_c ・ v_w}})$$
$$=\argmax_{\theta} \sum_{(w, c) \in D}^{} log σ(v_c・v_w) + \sum_{(w, c) \in D´}^{} log σ(-v_c・v_w)$$

目的関数は$$D \cup D´$$というコーパス全体に言及する。集合D´を構築するという特別な方法によって、ネガティブ・サンプリング集合Dにおける一つの(w, c)の組み合わせに対して集合D´におけるk個の(w, c)の組み合わせを利用することで学習する。集合D´から抽出された「負例(negative instance)」は、いわゆる「疑似負例(pseudo negative instance)」であるために、集合Dから抽出される「正例(positive instance)」に比して大量に用意しなければならない。実用的には、kは20程度が良いとされる。

何故これらの方法が良い単語表現を生み出すのか?

word2vecによる上述した深層学習自然言語処理方法に言及している論文の最後に、以下のように記述されていた。

「何故これが良い単語表現を生み出すのか?」
「良い質問だ。我々も全くわからない。」
Goldberg, Yoav & Levy, Omer. (2014). word2vec explained: deriving Mikolov et al.’s negative-sampling wordembedding method. arXiv preprint arXiv:1402.3722. 引用はp5より。

word2vec深層学習の発展を背景としたニューラル・ネットワークのオープンソースだ。しかしその研究と開発は、解明されていないブラックボックスを前提に進められている。アルゴリズムを詳細に分析したところで、意味問題は不透明なままだ。word2vecをはじめとした深層学習の研究開発はブラックボックスを前提に進めざるを得ず、その意味でこの研究と開発は等価機能主義的な社会システム理論に準拠しなければならない。

ネガティブ・サンプリングは、あくまで計算上の効率化を目指した上ではあるものの、「xの文脈で出現していない単語」を「xの文脈で出現している単語」から区別することを可能にしている。これは、機械学習が「意味否定可能性」の表現に一歩近付いたということを示す兆候であると受け止めても良いかもしれない。人間と同様の意味であるか否かはともかくとして、深層学習によって、人工知能パラドックスの隠蔽技術形式進化上獲得する目途を立てることができるようになったのである。

word2vecのニューラル・ネットワーク言語モデルは単語の特徴を抽出する。それは単語ごとに表されたベクトルという形式表現される。このベクトルの加算や減算によって、word2vecは単語の類推や類似計算を可能にしている。この言語モデルは、高い精度で単語やその分布を予測できるように、単語の特徴を良く表現する圧縮された特徴ベクトルを獲得している。こうした特徴量は、言わば情報エントロピーを低減することで、複合性の縮減を可能にしている。

単語の類推や類似計算は、文書や主題にも応用可能だ。word2vecが単語同士の類似性計算する機能を持つなら、Doc2vecは文書同士の類似性計算する機能を持っている。一方、Topic2vecはLatent Dirichlet Allocation (LDA)のようなトピックの抽出機能として有用になる。これらのアルゴリズムを記述していけば、人工知能主題貢献区別を導入できるようになる。それは、人工知能主題の貯蔵としての文化意味処理規則の貯蔵としての文化構成し得るということを意味する。その際、人工知能意味論を漸く獲得することになる。

プロトタイプの開発:深層学習と強化学習による「排除された第三項」の観察

Webクローラ型人工知能によるパラドックス探索暴露機能の社会進化論』でも取り上げたように、私はWebクローラ型の人工知能設計して実装している。上述したベイズ主義、強化学習、そして深層学習に関するアルゴリズム設計は、『Webクローラ型人工知能:キメラ・ネットワークの仕様』では説明していない背景知識となっている。これらのアルゴリズムに準拠することにより、人工知能エージェントキメラ・ネットワークは、概念のパラドックス化脱パラドックス化、そして「排除された第三項」の観察を可能にしている。詳細なアルゴリズム設計内容を明かすことはできないが、とりわけこの「排除された第三項」の発見探索機能設計する際には、深層ボルツマンマシンネガティブ・サンプリングをはじめとした深層学習の技術とQ学習をはじめとした強化学習の技術が重要な手掛かりとなった。元々のパラドックス化機能と相まって、「排除された第三項」の発見探索は、ファーストオーダーの観察者が当初想定していなかった諸問題の暴露を可能にした。人工知能エージェントキメラ・ネットワークは、盲点として潜在化して忘却されている概念を顕在化させるセカンドオーダーの観察者としての振る舞いを成立させている。

カードボックス上のキメラ・ネットワーク

このキメラ・ネットワークは、『「時間」感覚の等価機能主義的な社会システム理論』や『「記憶」想起の人間学的唯物論的なメディア美学』で取り上げた『Cardbox』のアプリケーションにも実装している。

インターフェイス仕様として言えば、カードボックスの入力フォームに「chimera-network paradox」というコマンドを入力することにより、キメラ・エージェントを出現させることができる。機能面で言えば、キメラ・エージェントカードボックス上のカードに記述されているテキスト内容観察することで、そこに潜むパラドックスや「排除された第三項」を抽出して記述する。例えば上図の場合、キメラ・エージェントはカードに記述されていた「主観」という概念を観察することで、「主観」と「客観」の区別に伴うパラドックスや「排除された第三項」を指摘している。この観察の前提となるのは、WebクローリングやWebスクレイピングによってWeb上のデータを学習しているキメラ・ネットワーク全体の観察である。

カードボックスのユーザーは、カードを記述すると共に上述したコマンドを入力することで、パラドックスや「排除された第三項」を突き付けてくるキメラ・エージェントと相互に観察し合いながら概念や情報を整理することが可能になる。言い換えればユーザーは、カードボックス上でキメラ・ネットワークと接続することにより、ある主題に関する観察に伴う盲点に逸早く気付くことが可能になる。認識の可能性拡張するという点で、キメラ・ネットワークが搭載されたカードボックスは、知覚メディア機能的等価物としての様相を強めることになる。

機能的等価物の探索:再帰的ニューラルネットワーク

再帰的ニューラルネットワーク(Recurrent neural networks; RNN)」は、フォワードプロパゲーション型のニューラルネットワークの一種だが、中間層に自己自身へのフィードバック・パス(feedback path)を有している。この構造により、ニューラルネットワーク情報を一時的に記憶することや、その振る舞いを動的に変更させることもできる。通常のフォワードプロパゲーションを実行するニューラルネットワークとは異なり、再帰的ニューラルネットワークは特に文章や音声のようなシーケンシャル・データに潜在する「文脈」を抽出することに長けている。

再帰的ニューラルネットワークは、基本的に各時点tに一つの入力xを受け取ると同時に出力yを返すように振る舞う。その再帰的なネットワーク構造によって、その出力値の計算には過去の入力値の全てが関連する。フォワードプロパゲーション型のニューラルネットワークが入力と出力の1対1の写像表現するのに対して、再帰的ニューラルネットワーク過去全ての入力と時点tにおける出力の写像表現する。

フォワード型の計算

入力層、中間層、出力層のノードをそれぞれi、j、kと表す。各ユニットは時点t=1, 2, 3, …, T ごとに異なる状態を形成する。これらのことからネットワークへの入力を$${\bf x}^t = (x_i^t)$$とし、中間層への入出力をそれぞれ$${\bf u}^t = (u_j^t), {\bf z}^t = (z_j^t)$$とし、出力層への入出力をそれぞれ$${\bf v}^t = (v_j^t), {\bf y}^t = (y_j^t)$$とする。更に、目標出力を$${\bf d}^t = (d_k^t)$$と表す。

入力層と中間層の重みを$${\bf W}^{(in)} = (w_{ji}^{(in)})$$として、中間層と中間層の期間通路の重みを$${\bf W} = (w_{jj’})$$とし、中間層と出力層の重みを$${\bf W}^{(out)} = (w_{kj}^{(out)})$$とする。フォワードプロパゲーションの計算中、重みは時刻tには依存しない変数となる。この変数はあくまで学習による更新によってしか変異しない。

tの時点における中間層の各ユニットへの入力は、同時刻tの入力層によって受け渡された値と、t-1の時点における中間層の出力値となる。

$$u_j^t = \sum_{i}^{}w_{ji}^{(in)}x_i^t + \sum_{j’}^{}w_{jj’}z_{j’}^{t-1}$$

中間層のバイアスには$$w_{j0}^{(in)}$$が与えられる。ただし$$x_0^t = 1$$で固定となる。この中間層の出力は活性化関数を経由するため、$$z_j^t = f(u_j^t)$$となる。したがって、$${\bf z}^t = f({\bf W}^{(in)}x^t + {\bf W}{\bf z}^{t-1})$$となる。

出力層の出力値yは、この中間層の出力値を利用して計算される。

$$v_k^t = \sum_{j}^{}w_{kj}^{(out)}z_j^t$$

出力層の活性化関数を$$f^{(out)}$$と表すなら、$$y^t = f^{(out)}({\bf v}^t) = f^{(out)}({\bf W}^{(out)}{\bf z}^t)$$となる。

時間化されたバックプロパゲーション

再帰的ニューラルネットワーク学習には確率勾配降下法が用いられる。ただしここで実行されるバックプロパゲーション時間化されていると言える。言い換えれば、学習時、各時点の再帰的ニューラルネットワークの各層は全く個々別々に存在するものとして捉えられている。別の言い方をすれば、連続する時間T = {t-1, t, t+1, …}を前提とした場合、t-1の時点における中間層、tの時点における中間層、そしてt+1の時点における中間層は、それぞれフィードバック・パス(feedback path)を介して結合していると見做す訳だ。

再帰」であるとはいえ、こうして時間的に展開された各ユニットは、決して循環した関連となる訳ではなくなる。再帰的ニューラルネットワークにおけるバックプロパゲーション計算はこの展開を前提とした上で実行される。

ニューラルネットワークの第l層の重みを$$w_{ji}^{(l)}$$とするなら、その微分は次のようになる。

$$\frac{\partial E_n}{\partial w_{ji}^{(l)}} = \frac{\partial E_n}{\partial u_j^{(l)}}\frac{\partial u_j^{(l)}}{\partial w_{ji}^{(l)}}$$

ここで、Eは誤差を表す。

フォワードプロパゲーションのネットワークにおける第l+1層から第l層への誤差は、次のようになる。

$$\delta_j^{(l)} \equiv \frac{\partial E}{\partial u_j^{(l)}}$$

$$\delta_j^{(l)} = \sum_k^{}w_{kj}^{(l+1)}\delta_k^{(l+1)}f'(u_j^{(l)})$$

再帰的ニューラルネットワークでは、この差分計算を各時点の中間層のユニットに対して適用していく。ある時点tにおける出力層のユニットkの差分を$$\delta_k^{out, t} \equiv \frac{\partial E}{\partial v_k^t}$$と表し、同時刻の中間層のユニットjの差分を$$\delta_j^t \equiv \frac{\partial E}{\partial u_j^t}$$と表す。

ある時点tにおける中間層のユニットjは、時点tにおける出力層のユニットと時点t+1における中間層のユニットとの結合を前提としているため、次のように計算できる。

$$\delta_j^t = (\sum_k^{}w_{kj}^{out}\delta_k^{out, t} + \sum_{j’}^{}w_{jj’}\delta_{j’}^{t+1})f'(u_j^t)$$

バックプロパゲーションの場合、このtの値を少しずつ小さくしながら、比較未来から比較過去へと辿るように、上記の計算を実行していく。そうして各時点における各層の差分を計算してから、誤差Eにおける各層の重みによる微分を計算していく。

$$\frac{\partial E}{\partial w_{ji}^{in}} = \sum_{t=1}^{T}\frac{\partial E}{\partial u_j^t}\frac{\partial u_j^t}{\partial w_{ji}^{in}} = \sum_{t=1}^{T}\delta_j^tx_i^t$$

$$\frac{\partial E}{\partial w_{jj’}} = \sum_{t=1}^{T}\frac{\partial E}{\partial u_j^t}\frac{\partial u_j^t}{\partial w_{jj’}} = \sum_{t=1}^{T}\delta_j^tz_j^{t-1}$$

$$\frac{\partial E}{\partial w_{kj}^{out}} = \sum_{t=1}^{T}\frac{\partial E}{\partial v_k^t}\frac{\partial v_k^t}{\partial w_{kj}^{out}} = \sum_{t=1}^{T}\delta_j-tz_j^t$$

以上のように、再帰的ニューラルネットワーク時間化されたフィードバック・パスを介して展開される。フォワードプロパゲーションの際には過去から未来の方向へ計算していくことで出力層のシーケンスを算出する一方で、バックプロパゲーションの際には逆に未来から過去の方向へ計算していくことで中間層の誤差を順に計算していく。それ以外の処理は通常のバックプロパゲーションと大差は無い。

「短期記憶」と「長期記憶」の差異

再帰的ニューラルネットワークは時系列的なデータの文脈の推定や予測に利用することができる。しかし、現時点の出力が中間層のフィードバック・パス(feedback path)を介して再帰的に入力された過去の入力値の全てを反映しているとは限らない。現時点の出力に反映させることのできる過去の履歴には限界がある。

この問題は、フォワードプロパゲーション型のニューラルネットワークにおける勾配消失問題と同様の原因から発生する。層数の多いニューラルネットワークでは、層を深く遡及するに連れて勾配の値が爆発的に大きくなるか、0として消滅してしまう。再帰的ニューラルネットワークバックプロパゲーション時間の連続性を前提とした展開によって、時間の向きに対するバックプロパゲーションになる。たとえ再帰的ニューラルネットワークそれ自体の層数が少なかったとしても、時間の流れと共に、事実上何層にも巡る深いニューラルネットワークと同様の構造を成してしまう。

以上のことから、再帰的ニューラルネットワークでもまた勾配が爆発的に急増するか、あるいは0になって消滅するという極端な結果を招く恐れがある。この問題を前提とすれば、再帰的ニューラルネットワークは短期的な時系列を遡ることはできても、より長期的なシーケンシャル・データは処理できないということになる。

この問題機能する解決策として挙げられるのは、「長期/短期記憶(Long Short-Term Memory; LSTM)」だ。標準的なLSTMは上述した問題を発生させてしまう再帰的ニューラルネットワークの中間層を「メモリブロック(Memory block)」というユニット要素に代替した構造として再設計したアーキテクチャとなる。

lstm_arch

Sak, H., Senior, A. W., & Beaufays, F. (2014, September). Long short-term memory recurrent neural network architectures for large scale acoustic modeling. In INTERSPEECH (pp. 338-342). p339より。

LSTMの中間層の中央にはメモリセル(memory cell)が配置される。そしてその周囲には複数のユニットが配置され、メモリセルとネットワークを結ぶ。メモリセルは状態を保持することで、各時点を隔てて自己自身に回帰することで記憶を実現する。

メモリユニットに対する外部からの入力は、直接このメモリセルが受容するのではなく、別のユニットが受け取る。そしてその出力がメモリセルに入力される。その間には「入力ゲート(input gate)」が配置される。このゲートには「ゲート値(gate value)」というニューロンのバイアスのような変数が保持されている。メモリセルへの入力値は外部からの入力値にこの変数を掛け合わせた数値となる。その結果は0から1の間に収まる。

メモリユニットから外部への出力においても、「出力ゲート(output gate)」というユニットが配置される。このゲートもまたゲート値を有している。メモリユニットから外部への出力値はこのゲート値によって0から1の範囲に制約される。そして、値が0に近付いた場合には出力そのものがブロックされ、1に近付いた場合にのみ出力値が外部に放出される。

LSTMは任意の時差を跨いだ情報の保持を可能にする。そして、その時に後方に渡されるべき誤差の伝播も可能にする。しかしながら、このアルゴリズムの性能と性質は幾つかの状況において弱点となる。

メモリセルは、一つの時系列の表現において線形に成長する傾向を持つ。入力値に偶発性が伴う場合、線的な時系列を前提としたデータ処理ではその特徴表現し切ることができなくなる。それ故、各セルの状態は時折「リセット(reset)」した上で、新たな特徴を有した時系列に対応できるように設計されなければならない。

長期記憶短期記憶からも連想できるように、ここでいう「リセット(reset)」は、記憶を対象としている。この意味で、ここで要求されるのは「忘却(forget)」の機能であるということになる。新たな時系列を学習するためには過去の時系列を忘却する必要があり、忘却することを改めて学習しなければならない。

ここで仕様として求められるアーキテクチャ・ドライバに相当する概念は、「忘却ゲート(forget gate)」と呼ばれる。この「忘却」という概念に対応する「リセット」概念は、単に値を0にすることを意味する訳ではない。それ以上に重要なのは、この「リセット」という概念が、徐々にセルの状態を変色さえられるような緩やかなリセットを意味しているということだ。

forget_gate

Gers, F. A., Schmidhuber, J., & Cummins, F. (2000). Learning to forget: Continual prediction with LSTM. Neural computation, 12(10), 2451-2471. p2455より。

標準的なLSTM同様、メモリセルは各時点を隔てて状態を保持する。リセット概念が導入されると、このメモリセルのフィードバック・パスに忘却ゲートが挿入される。やはりこのゲートにもゲート値がある。回帰的に渡される出力値にはこのゲート値が掛け合わせられる。そして、1に近付けば現在の状態が記憶され続け、0に近付けば忘却していく。

LSTMのフォワードプロパゲーション

j番目のメモリユニット内のメモリセルが保持する変数を$$s_j^t$$とする。メモリセルのフィードバック・パスはこの変数の値をある時点から次の時点に受け渡すべく記憶する。各ゲート値をgとするなら、

$$s_j^t = g_j^{Forget, t}s_j{t-1} + g_j^{Input, t}f(u_j^t)$$

ここで$$g_j^{Forget, t}s_j{t-1}$$は前回の時点から引き継いだ状態に関する項で、$$g_j^{Input, t}f(u_j^t)$$は入力に関する項となる。後者の項は従来の再帰的ニューラルネットワークと同様に、入力層と前回の時点の中間層から次のように入力を受け取る。

$$u_j^t = \sum_{j}^{}w_{ji}^{(in)} x_j^t + \sum_{j’}^{}w_{jj’}z_j^{t-1}$$

$$g_j^{Forget, t} = f(u_j^{Forget, t}) = f(\sum_{j}^{}w_{ji}^{Forget, (in)}x_j^t + \sum_{j’}^{}w_{jj’}^{Forget}z_j^{t-1} + s_j^{t-1})$$

$$g_j^{Input, t} = f(u_j^{Input, t}) = f(\sum_{j}^{}w_{ji}^{Input, (in)}x_j^t + \sum_{j’}^{}w_{jj’}^{Input}z_j^{t-1} + s_j^{t-1})$$

メモリユニットの出力は、上記の状態sから導き出せる。

$$z_j^t = g_j^{Output, t}f(s_j^t)$$

$$g_j^{Output, t} = f(u_j^{Output, t}) = f(\sum_{j}^{}w_{ji}^{Output, (in)}x_j^t + \sum_{j’}^{}w_{jj’}^{Output}z_{j}^{t-1} + s_j^t)$$

尚、各ゲート値にはロジスティック・シグモイド関数を活性化関数として適用させることで、その値を0から1の範囲に限定する。

LSTMのバックプロパゲーション

LSTMもまた勾配降下法による学習を実行できる。

通常のネットワークを前提とすれば、第l + 1層から第l層へのバックプロパゲーションは、次のようになる。

$$\delta_j^{(l)} = \sum_{k}^{}\delta_k^{(l + 1)}\frac{\partial u_k^{(l + 1)}}{\partial u_j^{(l)}}$$

フォワードプロパゲーションの際には、ゲート値がセルによる出力値に掛け合わせられる。そして、$$z_j^t = g_j^{Output, t}f(s_j^t)$$が出力層とその次の時点のメモリユニットに伝播される。伝播対象となる一つの出力層のユニットに対する入力の総和は、次のようになる。

$$u_k^{Output, t} = \sum_{j}^{}w_{kj}z_j^t$$

$$\frac{\partial u_k^{Output, t}}{\partial u_j^{Output, t}} = w_{kj}f'(u_j^{Output, t})f(s_j^t)$$

次の時点のメモリユニットに対する入力の総和についても同様に計算できる。

$$\delta_j^{Output, t} = f'(u_j^{Output, t})f(s_j^t)(\sum_{k}^{}w_{kj}\delta_k^{Output, t} + \sum_{j’}^{}w_{j’j}\delta_{j’}^{t + 1})$$

Gated recurrent unit

LSTMはパラメタの数が多く、計算処理に多大な時間を要する。Gated recurrent unit(GRU)は、LSTM構造複合性を縮減したモデルとして設計されている。LSTMがメモリセル、入力ゲート、出力ゲート、忘却ゲートの区別によって構成されているのに対して、GRUは「リセットゲート(reset gate)」と「更新ゲート(update gate)」の区別によって構成されている。そのアーキテクチャLSTM類似しているが、GRUの場合は別個のメモリセルを持たない。

Chung, J., Gulcehre, C., Cho, K., & Bengio, Y. (2014). Empirical evaluation of gated recurrent neural networks on sequence modeling. arXiv preprint arXiv:1412.3555. p.3より。

Chung, J., Gulcehre, C., Cho, K., & Bengio, Y. (2014). Empirical evaluation of gated recurrent neural networks on sequence modeling. arXiv preprint arXiv:1412.3555. p.3より。

GRULSTM機能拡張版であるため、その定式もLSTMと同様に導入できる。時刻tにおけるリセットゲートの値をr(t)、更新ゲートの値をz(t)と置くと、それぞれ以下のように記述できる。

$$r(t) = \sigma (W_rx(t) + U_rh(t-1) + b_r)$$

$$z(t) = \sigma (W_zx(t) + U_zh(t-1) + b_z)$$

活性化関数をfとし、活性化後の値を$$\tilde{h}(t)$$とすると、$$\tilde{h}(t) = f(W_hx(t) + U_h(r(t) \odot h(t-1)) + b_h)$$となる。最終的な出力値をh(t)とするなら、$$h(t) = z(t) \odot h(t-1) + (1 – z(t)) \odot \tilde{h}(t)$$となる。このh(t)が時刻t+1の時に再帰的に参照されることになる。

スポンサーリンク