機械学習のための特徴量エンジニアリング: ノート2

以下の本を読みます。キャラクターは架空のものです。解釈の誤りは筆者に帰属します。お気付きの点がありましたらコメント等でご指摘いただけますと幸いです。

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン)

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン)

正誤表リンク: https://www.oreilly.co.jp/books/9784873118680/
前回: ノート1 / 次回: まだ
f:id:cookie-box:20190101155733p:plain:w60

5章は「カテゴリ変数の取り扱い」というタイトルですね。以前参加した Kaggle のコンペティションでも「職業」というカテゴリ特徴があって「会社役員、会社員、…」といったカテゴリ値があった気がします。83ページの Effect コーディングというのは初めて聞きました。これ、サンフランシスコのデータの予測値が w_1 + b、ニューヨークのデータの予測値が - w_1 - w_2 + b、シアトルのデータの予測値が w_2 + b になるということですか。だから切片 b が全体平均になると。

f:id:cookie-box:20190101160814p:plain:w60

正確にいうと、「サンフランシスコのデータとニューヨークのデータとシアトルのデータを等しい重みで平均した値」だと思うな。元データ中にカテゴリ値の偏りがあったら b はそのデータ全体の平均ということにはならないはず。

f:id:cookie-box:20190101155733p:plain:w60

84ページの最下部の「参照カテゴリに対する各カテゴリの相対的な影響をエンコードすることは」という箇所を読んでイメージが湧きました。ダミーコーディングにおける (e_1, e_2) は、ニューヨークを原点にとったときの各カテゴリ値の特徴量なんですね。確かに、「なぜニューヨークが原点なのか」という感じはしますね。決定木のような原点の場所がどこかということは何も関係ないモデルでは関係なさそうですが。5.2.1節の特徴量ハッシングというのは、ランダムにカテゴリ値をまとめてしまうということですよね…例 5-3 のコードでは、おそらくレビュー文章か何かの単語列(word_list)を、m 次元の数値ベクトルに変換していますね。単語毎にベクトルのどの成分をインクリメントするかは、その単語の生のハッシュ値を m で割った余りで決めています。例 5-4 の方は似ていますが、インクリメントするかデクリメントするかもまたハッシュ値で決めています。こうすると大きなバイアスが発生しない?? どういうことでしょう。

f:id:cookie-box:20190101160814p:plain:w60

ちょっと例を考えてみようか。元々単語のユニーク数が9個だったとする。この時点でじゅうぶん少ないけどあくまで例だからね。いま手元の2つの文章を、どの単語IDが何回現れるかで9次元にエンコードしたとする。仮に以下のような感じになったとする。

  • 文章X:  (0, 1, 0, 1, 1, 0, 2, 3, 0)
  • 文章Y:  (1, 1, 0, 0, 1, 0, 2, 0, 1)
これらのベクトルの内積は 6 だね。ここで、9 次元だと多すぎるから 3 次元に削減したいとなったとする。例 5-3 に基づく方法なら圧縮後の特徴ベクトルは以下だ。ここで、ハッシュ値は元々の単語IDの番号そのものとするよ。だから、上のベクトルを 3 つずつぱたぱたと折りたたむだけだね。
  • 文章X:  (0, 1, 0) + (1, 1, 0) + (2, 3, 0) = (3, 5, 0)
  • 文章Y:  (1, 1, 0) + (0, 1, 0) + (2, 0, 1) = (3, 2, 1)
他方、例 5-4 に基づく方法で圧縮するなら以下。元のベクトルの奇数番目にマイナスをかける。
  • 文章X:  (-0, 1, -0) + (1, -1, 0) + (-2, 3, -0) = (-1, 3, 0)
  • 文章Y:  (-1, 1, -0) + (0, -1, 0) + (-2, 0, -1) = (-3, 0, -1)
例 5-3 に基づく方法でも例 5-4 に基づく方法でも 9 次元のベクトルを 3 次元に圧縮できるけど、圧縮後の文章Xと文章Yの内積が前者の方法では 19、後者の方法では 3 になっている。まあどっちの方法でも圧縮前の 6 を保つことはできていないけど、前者の方法では明らかにどんな文章間も内積がインフレしそうだ。単に元のベクトルを折りたたむだけだからね。でも、文章を示す特徴量ベクトルの間の内積というのは、文章どうしがどれだけ類似しているかを示す肝心な量だから、次元を圧縮した表現にしただけで文章間がどんどん類似してしまうというのは好ましくないはずだ。後者の方法ではハッシュ値によって符号を変えることで内積が一方的に増えてしまうという事態を抑えている。もちろん次元を削減しているから元の内積を完全に保つことはできないけど。「内積の期待値が変わらない」の意味は原論文を読まないとわからないけど、おそらく上の思考実験をもっとたくさんの文章でやってみたり、あらゆるハッシュ関数でやってみたりしたら内積の平均値が保たれるんじゃないかな。

f:id:cookie-box:20190101155733p:plain:w60

確かに bag-of-words ではコサイン類似度などで類似度が測られるのでしたっけ。次元を圧縮したいからといって内積が保たれない表現にしてしまっては台無しですね。元々の bag-of-words は「意味が近い文章どうしは距離が近くなっている」がゆえに文章を表現する特徴量たりえたのですから。意味が近くない文章どうしでなくても距離が近い表現など、適切な特徴量とはいえません。5.2.2 節は、カテゴリ毎の何かの最小値や最大値などでもよいのでしょうかね。94ページの最小カウントスケッチというのは? これはレアではないカテゴリも含めて d 種類の m 値へのマッピングを用意するということでしょうか。そして最小値を正式に採用する? うーん、やり方はわかるんですが、ハッシュ関数d 個にすると結局何がよかったのかとかなぜ最大値などではなく最小値をとるのかとかよくわかりません…。

f:id:cookie-box:20190101160814p:plain:w60

Count-Min Sketch の原論文の [Cormode & Muthukrishnan, 2005] というのはおそらく以下の記事にリンクがあるものだね。

上の文書の3ページに書いてある手続きは本の94ページと全く一緒だ(絵も似ているね)。d \times w のテーブルに合計 N のカウントを加えるなら、この手続きによるアイテム i のカウントの推定値は  1 - (1/2)^{d} 以上の確率で誤差  2N/w 以内になるらしい。理由は簡単だね。1つの行にのみ着目すると、アイテム i が入っているマスに他のアイテムのカウントがどれだけ混入するか(誤差)の期待値は N/w だ。となると、マルコフの不等式より、誤差が  2N /w 以上になる確率は  1/2 以下だ。これが d 行あるから、全ての行で誤差が  2N /w 以上になる確率は  (1/2)^d になる。

f:id:cookie-box:20190101155733p:plain:w60

そうか、「余計なアイテムのカウントが一番小さいマスを選びたいのだ」という気持ちであれば最小値を選ばなければなりませんね。統計量が何かのカウントであるとは限らないと思いますが。

f:id:cookie-box:20190101160814p:plain:w60

d \times w のマスがあるならそれを一行に展開して1つのハッシュ関数のみつかうのでは駄目なのか、って気もするけど、それだとあるアイテムたちはとても誤差が大きく、あるアイテムたちは誤差がないという偏りが出そう。d 種類のハッシュ関数をつかうことで最悪のアイテムでも誤差が少ないというようにできる。

f:id:cookie-box:20190101155733p:plain:w60

95ページの一番下の段落はどういう意味でしょうか。「任意のデータ点の有無によって統計量の分布がほぼ変わらない」?

f:id:cookie-box:20190101160814p:plain:w60

音楽を推薦するモデルをつくるのに、アーティストを特徴量にしたいけど、アーティストはきっと多いからそのままカテゴリ値として扱いたくない。だから、「レディー・ガガ」というカテゴリ値の変わりに「レディー・ガガの曲の再生回数の全ユーザ合計」のような連続値にしたい。けど、1人だけ異様にレディー・ガガの曲を再生しているユーザがいたらよくない。任意のユーザを抜いたとしても、あらゆるアーティストの再生回数合計の分布が変わらない必要がある、ということかな…いや、任意のアーティストを抜いても分布が変わらない、かもしれないかな…もしレディー・ガガだけ再生回数が断トツで多かったら、どのユーザにもレディー・ガガばかり推薦されることになっちゃいそうだし…。

f:id:cookie-box:20190101155733p:plain:w60

そんなに再生回数が多かったらもう万人にレディー・ガガを推薦しておけばよくないですか?

f:id:cookie-box:20190101160814p:plain:w60

個々のユーザの嗜好を予測しようとして??

f:id:cookie-box:20190101155733p:plain:w60

6章に入りますね。 特異値分解ですか…以前に特異スペクトル変換法で扱いましたね。

式 6-6 から式 6-7 はこうですね。
 \displaystyle (x_1^\top w)^2 + \cdots + (x_N^\top w)^2 = \left( \begin{array}{c} x_1^\top w \\ \vdots \\ x_N^\top w \end{array} \right)^\top \left( \begin{array}{c} x_1^\top w \\ \vdots \\ x_N^\top w \end{array} \right) = \left( X w \right)^\top \left( X w \right) = w^\top X^\top X w
w^\top w = 1 の制約のもとで Xw の長さを最大にするには、wX の最大の特異値によって引き延ばされる向きを向いていなければなりませんね。…せっかく次元削減できたのに、110~111ページで計算コストが高いだの色々言われていますね…。111ページに、この手法の実用場面として「時系列の異常検出」と言及されていますね。112ページで、ZCA は「相関関係を取り除くことができ」「画像のより面白い構造を見つけ出すことに集中」ってどんな画像になるんでしょう?

f:id:cookie-box:20190101160814p:plain:w60

以下に ZCA をやっている記事があったよ。一番下の方に画像があるね。

つづきは後で

機械学習のための特徴量エンジニアリング: ノート1

以下の本を読みます。キャラクターは架空のものです。解釈の誤りは筆者に帰属します。お気付きの点がありましたらコメント等でご指摘いただけますと幸いです。

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン)

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン)

正誤表リンク: https://www.oreilly.co.jp/books/9784873118680/
次回: まだ
f:id:cookie-box:20190101160814p:plain:w60

面白そうなテーマの本だね。なんで読もうと思ったの?

f:id:cookie-box:20190101155733p:plain:w60

会社…じゃなかった、教室の本棚に補充されてたので。ほら、オライリーのコーナーに。

f:id:cookie-box:20190101160814p:plain:w60

教室の本棚のラインナップおかしいよね。

f:id:cookie-box:20190101155733p:plain:w60

以前 Kaggle の期間限定イベントを走ってみたことがあるんですが、そのとき気付いたことがあったんですよね。

f:id:cookie-box:20190101160814p:plain:w60

コンペティションに参加って言おうよ。

f:id:cookie-box:20190101155733p:plain:w60

機械学習においてデータの前処理というと、

  • 自然言語データのようなそもそも数値でないデータを、その性質が保持された何らかの数値にする。
  • 欠損がある特徴の欠損部分を何らかの方針で埋める/欠損がある特徴やレコードを削る。
というような「そもそも数値でないものを数値にする」イメージだったんです。しかし、Kaggle の Kernel ではそのようなケース以外にも、
  • 「勤続年数」を「年齢」で割る(座標変換)。
  • 「支払期限日」から「実際に支払いがあった日」を引く(座標変換)。
  • ある特徴量(あるいは被説明変数)を対数変換する(座標変換)。
  • 特徴量 V_1~V_N の最小値/平均値/最大値をとる(要約)。
  • 全ての特徴量の和がゼロかどうかを追加する(要約)。
  • 特徴量 V_1~V_N を PCA, t-SNE, SparseRandomProjection などでM次元に削減した特徴量 V'_1~V'_M に置き換える or 元の特徴量群に追加する(要約)。
  • まずランダムフォレスト回帰してみて重要度が上位 K 件の特徴量に絞る(削減)。
  • 学習データと評価データで分布が異なる特徴を削る(削減)。
というように「元々数値であってもmodifyする」ということもしていたんですよね(カッコ内は今適当にラベリングしてみただけです)。このような前処理は「機械学習の代表的な方法はディープラーニングである」「ディープラーニングは表現定理により任意の関数を表現できる」ということを紙の本で勉強してきた人にとってはなかなか違和感がないですか? こちらが座標変換やら要約やら削減やらしなくても、ディープラーニングがおのずから理想の変換をしてくれるはずなのですから。特徴をわざわざ絞り込むというのも不思議です。しかし、現実に計算機で学習するとなると計算資源は有限なので特徴量をほどよく削減する必要があり、効率的によい解にたどり着いてくれるように座標変換や要約する必要があり、そもそもディープラーニングでないモデルの方が有効な場合があり、人類はこのような特徴量エンジニアリングをせっせとしなければならないというフェーズにいたということなんですね…私はてっきり非数値データの数値データ化以外何もしなくていいと思っていたのに…ディープラーニングに完全に騙されました…。

f:id:cookie-box:20190101160814p:plain:w60

ディープラーニングにそんなに幻想抱いてたの!?

f:id:cookie-box:20190101155733p:plain:w60

しかし嘆いてばかりもいられません。特徴量エンジニアリングの方法を習得しなければ。1章の内容は大丈夫ですね。2章の5ページの下の方、「その他にも結果が入力特徴量のスケールに影響を受ける手法として、k-means クラスタリング、(後略)」とありますが、よくわかりません。これらの手法は入力データセットが変われば普通に結果が変わるものではないですか? スケール云々ではなく。

f:id:cookie-box:20190101160814p:plain:w60

…こういうことが言いたいんじゃないかな? 現実的ではない例だけど、まとまった「金額たち」を受け取って、個々の金額に「この金額は安い方です」「この金額は高い方です」という判定を返すモデルを k=2 の k-means クラスタリングで実現するとする。このモデルに「10円、1000円、10000円」という金額たちが入力されたとすると、1000-10=990 の方が 10000-1000=9000 より小さいから、真ん中の「1000円」は「安い方」という判定だ。でもこれが、実は運用システム上では金額の常用対数が取られていたとすると、入力は「log(10)=1、log(1000)=3、log(10000)=4」となって真ん中の「log(1000)」は「log(10000)」側に近い、「高い方」という判定になる。入力データに「円」という物差し(スケール)を当てるか、「円のlog10」という物差しを当てるかで結果が変わる。だから、5ページが言いたいのは、真ん中の段落と合わせて、数値データの「粒度は適切か?」「物差しは適切か?」を確認しましょうということだと思うよ。

f:id:cookie-box:20190101155733p:plain:w60

なるほど。であれば、6ページで言及されている、分布を確認して対数変換などするというのも「物差しは適切か?」に含まれる気がしますね。もちろん、決定木を用いるなら対数をとるという単調変換に意味はないので、「物差しは適切か?」も用いる手法によりますが…。8ページの「データ空間」というのは聞き慣れないです。図2-2 の左側と右側はそれぞれデータを以下のように捉えているだけではという気がするのですが。

歌1歌2歌3
ユーザ1好き好き嫌い
ユーザ2好き嫌い嫌い
ユーザ3嫌い好き嫌い
ユーザ4好き好き嫌い
ユーザ1ユーザ2ユーザ3ユーザ4
歌1好き好き嫌い好き
歌2好き嫌い好き好き
歌3嫌い嫌い嫌い嫌い
「歌1が好きなユーザは歌2も好きな可能性が高い」などというパターンを学習したいなら左側のようにデータを捉えるのではないかと思います。未知のユーザがどんな歌を好きか予測したいというイメージです。右側のデータだと「ユーザ1に好かれる歌はユーザ2にも好かれる可能性が高いがユーザ3には好かれない可能性が高い」というパターンを学習することになりそうなので、「未知の歌がどんな層に受けてどんな層に受けなさそうか」というイメージですかね。よくわからないですが置いておきます。
2.2.1節は、「何を予測することを目指すのか」といった話ですね。2.2.2節は…「あるレストランのレビュー件数だけはわかっているが評価点数はわからないので予測したい」って状況はない気がするんですが…。何にせよ、特徴量の離散化=粒度を粗くすることって、これも対数変換同様、決定木を用いるのであったら原理上は関係ないですよね。

f:id:cookie-box:20190101160814p:plain:w60

でも、それ以上細かくみることに意味がないと強く信じられる状況なら、粒度を粗くすることで、学習が軽くなって色々なハイパーパラメータを試せるとかあるかもしれないよ。

f:id:cookie-box:20190101155733p:plain:w60

まあ確かに。2.3.1 節の例、21ページに対数変換が上手くいった理由がかいてあるようですが、説明がなんかふわふわしているんですが…。

f:id:cookie-box:20190101160814p:plain:w60

結局図2-9の上図より下図の方がまだ直線でフィッティングしやすいってことじゃないのかな…どのみち決定係数がマイナスな例だしそこをあまり深く考えなくていいと思うけど…。

f:id:cookie-box:20190101155733p:plain:w60

2.3.2節は、より一般的な変換ですね。分散を安定化するとはどういうことで、何のためにすることなのかよくわかりません。確かに、色々な母平均のポアソン分布からサンプル群を取り出してみて「サンプル群そのもの」「サンプル群の平方根をとったもの」の平均と分散をプロットしてみると、平方根を取った場合に分散が平均に拠らなくなるようにはみえますが(下図のオレンジ色の方が平方根を取った場合ですね)。

import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
from pylab import rcParams
rcParams['figure.figsize'] = 5, 5
rcParams['font.family']='IPAGothic'
rcParams['font.size'] = 16

size = 10000
list_mean = []
list_var = []
list_mean2 = []
list_var2 = []

for lam in np.arange(1, 11, 1):
    x = np.random.poisson(lam=lam, size=size)
    list_mean.append(np.mean(x))
    list_var.append(np.var(x))
    list_mean2.append(np.mean(np.sqrt(x)))
    list_var2.append(np.var(np.sqrt(x)))

plt.scatter(list_mean, list_var)
plt.scatter(list_mean2, list_var2)
plt.xlabel('サンプルの平均')
plt.ylabel('サンプルの分散')
plt.show()

f:id:cookie-box:20190311160609p:plain:w270

f:id:cookie-box:20190101160814p:plain:w60

…もしその特徴がポアソン分布から生成されると信じているなら、f(x) = \sqrt{x} という変換をほどこすことで分散が期待値と(ほぼ)独立になるようにできるということだと思うけど…独立でなかったら直接的にどう悪いのかというのはよくわからないな…どちらかというと、期待値と分散が独立でないような分布は正規分布に近くなく裾が重かったりして線形回帰モデルなどを適用する上で具合が悪い、ということが問題視されているようにもみえる。モチベーションは分散安定化というより正規分布に近づけることと考えた方がいいんじゃないかな。24ページの訳注にもポアソン分布の場合には分散安定化変換になるっていう書き方がしてあるし…。

f:id:cookie-box:20190101155733p:plain:w60

なるほど…。2.4節は大丈夫そうですが…33ページの注意事項、「図2-17は、特徴空間ではなくデータ空間であることに注意してください」というのは、(8ページの例に即していうと)各点がユーザではなく歌ということですか? なぜユーザではないんでしょう? 3.1.1節を読んだ方がよさそうですが…2.5節の内容も大丈夫ですね。2.6節は…38ページの相互情報量というのは?

f:id:cookie-box:20190101160814p:plain:w60

ウィキペディアによると \displaystyle I(X; Y)=\sum_{y \in Y}\sum_{x \in X} p(x, y) \log \frac{p(x,y)}{p(x)p(y)} という量みたいだね。あらゆる (x,y) の組について、XY が独立だとした場合の同時分布のビット数から、XY の実際の同時分布のビット数を差し引いたものの平均だね。もし XY が独立なら I(X; Y) はゼロだ。 逆に XY が全く同じ確率分布にしたがうなら I(X; Y) はその確率分布のビット数の平均そのものになる。もし XY が独立なら、(x,y)x が珍しい出来事だったとき y まで珍しい出来事という確率は相当低い。だからそんな (x,y) の組に割り振るビット長はとても大きくなる。でも XY が独立でなかったら xy も珍しい出来事である確率がもっと高くなるかもしれない。だから同じ (x,y) の組に割り振るビット長がより小さくなる。ただし (x,y) が起きる確率は x が起きる確率より高くなることはないから、x に割り振るビット長よりは小さくならない。つまり I(X; Y)N 点の (x,y) を記録するときに N 点の xN 点の y を別々に記録するときよりどれだけディスク容量が節約できるか(1点あたり)という量だね。XY が相互に依存するほどディスク容量が節約でき、I(X; Y) は大きい。

f:id:cookie-box:20190101155733p:plain:w60

いまに始まったことではないですが、その説明は私的言語すぎて誰にも伝わりませんね…。ラッパー法というのは特徴の組み合わせの総当たりといった感じなのですかね。以下の記事によると、特徴を増やしていく方法と減らしていく方法とあるようですが。

2章をまとめると、「粒度は適切か?」「物差しは適切か?」「組み合わせるべきではないか?」「絞り込めないか?」といったところでしょうか。

f:id:cookie-box:20190101160814p:plain:w60

3章はテキストデータの取り扱いだね。

f:id:cookie-box:20190101155733p:plain:w60

raven ってカラスなんですか? crow とはまた違う種類のカラスなんですね…はっ、ハリーポッターのレイブンクローとはカラスカラスという意味だったんですね??

f:id:cookie-box:20190101160814p:plain:w60

いや、レイブンクローのクローは調べたらかぎつめ(claw)らしいけど…。

f:id:cookie-box:20190101155733p:plain:w60

文章を「どの単語が何回出現するか」のみに着目してベクトル化する、という方法が最初にありますね。ここでデータ空間が出てきますね…図3.5は、「各データの『猫』という特徴量はどうなっているか」というベクトルをあらゆる特徴量について求めてプロットしたもので、単語空間ではなく文章空間なんですよね。いや両者が転置の関係なのはわかりますが、結局何のためにデータ空間を考えるんです?

f:id:cookie-box:20190101160814p:plain:w60

4章でも出てくるみたいだね。4章で扱う TF-IDF では「『猫』という単語の出現回数が全単語の出現回数に占める割合」「『猫』を含む文書数」が要るから、各レコードが単語で各カラムが文章であるデータに、「元データの各行ベクトルの和を全データの和で割ったもの」「元データの各行ベクトルの非ゼロ要素の個数」という2つの新しい特徴量のカラムを加えるとかそんなイメージかな。目的は文章の特徴量を得ることだけど、そのために各単語の特徴量を得たくて、各単語の特徴を得るのに文章中への出現っぷりをみたくて、説明-被説明関係がくるくるするみたいな?

f:id:cookie-box:20190101155733p:plain:w60

54ページにコロケーションという概念が出てきますね。日本語のコロケーションの例ってどんなのがあるでしょう?

f:id:cookie-box:20190101160814p:plain:w60

2語以上組み合わせることで、各単語を単に組み合わせたのとは異なる意味が生じるってことだよね。そのまま慣用句になっちゃうけど、「顔が広い」「猫の額」とかかな? もっと日常語でもありそうだけど…。

f:id:cookie-box:20190101155733p:plain:w60

4章まできましたね。TF-IDF の話です。IDF は一部の文書にしか出現しない単語に重みを付けるのですね。IDF は対数を取った方が一部の文章にしか出現しない単語の影響が大きくなるということですが、どちらかというと多くの文章に出現する単語の影響が小さくなるということでしょうか…。67ページの、「TF-IDF に \ell^2 正規化を行った際の結果は、\ell^2 正規化を単体で使う場合と同じです」ってどういう意味でしょうか?

f:id:cookie-box:20190101160814p:plain:w60

これは文章区間で各単語を超球上に配置させるってことかな。だったら、TF-IDF を \ell^2 正規化したら Bag-of-Words の \ell^2 正規化と一緒ってことなのかも。一部の文書にしか出現しない単語に重みを付けたのが正規化でかき消されてしまうから。どの軸で正規化してるのかちゃんと再現実行して確かめてみないとわからないけど…。

f:id:cookie-box:20190101155733p:plain:w60

70ページに、「劣決定(underdetermined)とよばれ、そのままでは解くことができません」とありますが、解けないケースなんてあるんですか?

f:id:cookie-box:20190101160814p:plain:w60

学習データが10点で特徴が100個あったとして、線形モデルを考えたら、切片を無視すれば重みは100個あるけど、連立方程式は10個。足りないよね。

f:id:cookie-box:20190101155733p:plain:w60

確かに。

つづきは後で

ベイズ統計の理論と方法: ノート1

以下の本を読みます。キャラクターは架空のものです。解釈の誤りは筆者に帰属します。おかしい点がありましたらコメント等でご指摘いただけますと幸いです。

ベイズ統計の理論と方法

ベイズ統計の理論と方法

次回:まだ
f:id:cookie-box:20190101155733p:plain:w60

今気付いたんですが、私たちはベイズ統計部という部活動のメンバーであるという設定の割にベイズ統計の話をしていないというか、ベイズ統計とは何かよくわかっていないのではないでしょうか。

f:id:cookie-box:20190101160814p:plain:w60

今更!?

f:id:cookie-box:20190101155733p:plain:w60

そこでこの本を読みたいと思うんです。1.1 節ではまずベイズ推測を定義するとか。この本では n 個の点を集めたもの、つまり、サンプルを x^n と表記するようですね。xn 乗にみえるので注意しましょう。サンプルの各点は \mathbb{R}^N の元です。そして、サンプル x^n をそれぞれ確率分布 q(x) に独立にしたがう n 個の確率変数の実現値と考えます。この q(x)真の分布とよび、サンプル x^n から真の分布 q(x) を推測することを統計的推測とよぶということです。それで私たちは統計的推測をしたいのですけど、この本で学ぶ「ベイズ推測」という統計的推測の方法では、統計的推測をするのにつかうパーツとして確率モデル p(x|w)事前分布 \varphi(w) も用意しておく必要があります。この w \in W \subset \mathbb{R}^d はパラメータです。確率モデルや事前分布の選択にも議論はありますが、とりあえず三つ組  \bigl( \, q(x), \, p(x|w), \, \varphi(w) \, \bigr) は与えられていることにするということです。
…現実にベイズ推測をするときは真の分布 q(x) を知らないはずなので、「与えられている」といわれるとややこしいですね…。この本でまずやりたいことは、「こういう真の分布からのサンプルを得ていてこういう確率モデルを仮定しているというシチュエーションで、事前分布を事後分布にどう更新するべきなのか」という理論の確立でしょうから、真の分布を考えないと理論が構築できないということと思いますが…以下のイメージです。細かいですしどうでもいいですが…。

入力出力
ベイズ推測器をつくる器q(x), \, p(x|w), \, \varphi(w)p(w|X^n)  ※ X^n は確率変数
ベイズ推測器x^n, \, p(x|w), \, \varphi(w)p(w|x^n)  ※ x^n は定数

f:id:cookie-box:20190101160814p:plain:w60

確率モデル p(x|w) を用意しておくのはベイズではない伝統的な統計的推測でも同じだね。でも伝統的な統計的推測では事前分布 \varphi(w) というのは考えない。何らかの推定量  \hat{w}(x^n) (最小2乗推定量最尤推定量)によってパラメータの推定値をただ1つ得るよね。

f:id:cookie-box:20190101155733p:plain:w60

対してベイズ統計ではパラメータの事後分布を得ますよね。真の分布のパラメータの分布というのもややこしいですが。伝統的な統計とベイズ統計でそのような違いがあるというのは、結局両者でパラメータを推測することに対する姿勢がどう違うんでしょう。

f:id:cookie-box:20190101160814p:plain:w60

この本にも出てくるのかもしれないけど、イメージでいうと…伝統的な統計は頻度論的ともいわれるように、確率というものを「無数に試行したときそれが起きる頻度」だと考えているから、例えばサイコロの各目の出る確率を推測するとき、もしまだ1回も投げていないなら、その確率分布についてまだ何もわからない。100回投げたらその結果に基づいた確率分布がパラメータの何らかの推定量によって推測できるけど、「もしかしたらパラメータはもうちょっと大きいかも/小さいかも」というぶれが生じる要素はない。しいていうなら、「サンプルの出方が違ったとしても求まる確率分布はずれない?」という心配はあるけど、そういうときはパラメータの推定値に幅をもたせて、どんなサンプルの出方でも95%カバーできるというようにする(信頼区間)。これはサンプルがぶれると考えているのであって、確率分布がぶれると考えているわけじゃない。…他方、ベイズ統計では確率とは「それがどれだけ起こりそうだと考えているかの信念」だから、「まだ1回もサイコロを投げていないけど、1の目の出る確率は0.2だと思う」という信念が事前にあるということがありうるし、確率分布がどんな信念をどれだけもっているかによって分布していい。そしてそれを事後分布に更新する。伝統的な統計に比べてベイズ統計では事前分布を仮定できるというのができることとしては最大の違いだし、同時に、そんなの仮定していいのかっていう不安ポイントでもあるけど、事前分布の影響はすぐなくなっていくという反論もあるよね。あと事前の信念を入れ込めるという点の他に、ベイズ推定はパラメータを分布として扱うから区間推定や検定が素直とも聞くかな。伝統的な統計ではパラメータは分布しないから「そのパラメータは考えにくい」っていういい方はできなくて、「もしそのパラメータだとすると手元のサンプルが得られる確率がかなり低い」っていういい方をする必要があって、一々サンプルの出方の分布の話にしないといけないのが回りくどいっていわれるよね。もちろん、ベイズ統計が考えやすくても取り扱いを誤って事後分布がおかしなことになっていたら踏み外した推測になっちゃうけど…。

f:id:cookie-box:20190101155733p:plain:w60

なるほど。まあとにかく事後分布が知りたいわけです。それですが、正の実数である \beta を逆温度として? 逆温度とは? とにかく逆温度 \beta の事後分布を以下で定義するとのことです。

\displaystyle p(w|X^n) = \frac{1}{Z_n(\beta)} \varphi(w) \prod_{i=1}^{n} p(X_i | w)^\beta \quad \left( \, Z_n(\beta) = \int_W \varphi(w) \prod_{i=1}^{n} p(X_i | w)^\beta dw \, \right)
…これ、\beta=1 なら普通にベイズの定理ですね。\beta=0 とすると p(w|X^n) = \varphi(w) なので、事後分布が事前分布のままということですか。であれば、逆温度 \beta とはどれだけ観測結果を取り入れるかということなんでしょうか。その続きには、事後分布による平均を  \displaystyle \mathbb{E}_w[f(w)] \equiv \int f(w)p(w|X^n)dw と表記することの取り決めと、これがサンプルに依存する確率変数であることの確認がありますね。そして、確率モデルの事後分布による平均 p^\ast (x) \equiv \mathbb{E}_w[p(x|w)] を予測分布とよび、ベイズ推測とは真の分布をこの予測分布と推測することであるとあります。…まだ5ページにしてベイズ推測とは何かという話終わってしまったんですが。

f:id:cookie-box:20190101160814p:plain:w60

まだ p^\ast (x) は意味もわからず天から降ってきただけだからね? p^\ast (x) がどのような仮定の下でどのような性質をもつか議論しなきゃ、ベイズ推測をするってどういうことなのか全然わからないよ?

f:id:cookie-box:20190101155733p:plain:w60

確かに。6ページの注意5は興味深いですね。究極的には真の分布を知り得ないのに、よい予測などあるのかということに対する不安があります。しかし、三つ組  \bigl( \, q(x), \, p(x|w), \, \varphi(w) \, \bigr) に拠らない数学的な法則が存在するのだと続きますね。だから限界や誤差について議論できると。伝統的な統計でいうクラメール・ラオの下限のようなものがあるということなんでしょうか。

f:id:cookie-box:20190101160814p:plain:w60

まず1.2節で、どのような量が予測のよさを測る指標となるのかを扱うみたいだね。

f:id:cookie-box:20190101155733p:plain:w60

早速読みましょう。というか1.2節の冒頭から「自由エネルギーと汎化誤差が最も重要な量」とありますね…。事後分布の式の分母に出てきた Z_n(\beta)分配関数、特に \beta=1 のときの Z_n(1)周辺尤度というそうです。Z_n(\beta) は正規化定数ですよね。周辺尤度 Z_n(1) は(その確率モデルでその事前分布にしたがうあらゆるパラメータの下で)サンプル X^n が観測される確率ですね。Z_n(1)X^n について積分すると 1 になるということですが、あらゆるサンプルの出方について積分すると1になるのは当然ですね。なお、Z_n(1)X_n の確率分布であることを強調したいときは p(X^n) ともかくようです。そして、\displaystyle F_n(\beta) \equiv -\frac{1}{\beta} \log Z_n(\beta)自由エネルギーとよぶということです。自由エネルギー? これが重要な量だといっていましたね。どう重要なんでしょう? \beta=1 のときで考えれば、周辺尤度 Z_n(1) が大きいほど自由エネルギーは小さくということになりますが…。しかし逆温度、分配関数、自由エネルギーなど、聞き慣れない言葉が目立ちますね…。

f:id:cookie-box:20190101160814p:plain:w60

統計物理の言葉だね。ベイズ推測に関する考察ではパラメータ w の事後分布からその推測がどんな性質をもつのか知りたいけど、統計物理でも系の微視的状態 w の分布(正準分布)をもとに巨視的な性質を知りたいから、形式的に同じ位置付けになる概念が色々あるんじゃないかな。だから言葉を借りてるんだと思う。

f:id:cookie-box:20190101155733p:plain:w60

断りなく借りてこられると面食らうんですが…。8ページの続きには自由エネルギーがどう重要なのかがありますね。先に文字を定義すると、真の分布のエントロピー  \displaystyle S=-\int q(x) \log q(x) dx、サンプル X_i に対する経験エントロピー \displaystyle S_n = -\frac{1}{n} \sum_{i=1}^n \log q(X_i) とします。これらは統計学でもよく聞くエントロピーですね。真の分布に対するものか経験分布に対するものかが違います。これらをつかうと F_n(1) が次のように変形できます。経験エントロピーが出てくるんですね。

 \displaystyle \begin{split} F_n(1) &= -\log Z_n(1) = -\log p(X^n) \\ &= -\log q(X^n) +\log q(X^n) -\log p(X^n) \\ &=-\log \prod_{i=1}^{n} q(X_i) +\log q(X^n) -\log p(X^n) \\ &= - \sum_{i=1}^{n} \log q(X_i) +\log \frac{q(X^n)}{p(X^n)} \\ &= n S_n +\log \frac{q(X^n)}{p(X^n)} \end{split}
そして、これをサンプル X_n のあらゆる現れ方に対して平均します。経験エントロピーの平均値は真の分布のエントロピーになります。
 \displaystyle \begin{split} \mathbb{E} \bigl[ F_n(1) \bigr] &= \int \left( n S_n +\log \frac{q(x^n)}{p(x^n)} \right) q(x^n) dx^n \\ &=  n S  + \int q(x^n) \log \frac{q(x^n)}{p(x^n)} dx^n \end{split}
この右辺第2項が q(x^n)p(x^n) のカルバック・ライブラ距離?…確かに、カルバック・ライブラー情報量です! というか、第1項がエントロピーで第2項がカルバック・ライブラー情報量って、まるで交差エントロピーでは。

f:id:cookie-box:20190101160814p:plain:w60

交差エントロピーだよ。F_n(1) = \log Z_n(1) = \log p(X_n) は確率モデル p(x|w) の下で事前分布 \varphi(w) にしたがうあらゆる w の下で X_n が観測される対数尤度だよね。これを真の分布 q(x) の下での X_n の現れ方に対する平均を取るという操作は、q(x)p(x) の交差エントロピーを取ることに他ならないよ。交差エントロピーはある分布の対数尤度を別の分布で平均した形式をしているからね。情報理論の言葉でいうなら、真の分布 q(x) においてめずらしい x には大きなビット長 \log \bigl(1 /p(x) \bigr) を、めずらしくない x には小さなビット長 \log \bigl( 1 / p(x) \bigr) をわりふるように p(x) を決めたい。もちろん p(x)=q(x) が最適だけど。おそらく最適からは少しずれている p(x) というエンコーディングの下での平均ビット長が \mathbb{E} \bigl[ F_n(1) \bigr] で、最適でないことによって生じたビット長のはみ出しの平均が (1.19) 式第2項のカルバック・ライブラー情報量だね。ついでにいえば、分配関数とはいま何とかしたい確率分布で、自由エネルギーとはその確率分布の選択情報量だったわけだ。

f:id:cookie-box:20190101155733p:plain:w60

…いやでも、p(x) は「確率モデルと事前分布から推測された X^n の確率分布(9ページ)」ですよね? q(x) に近づけたいのは p^\ast(x) なのではないのですか? それに、実問題では F_n(1) しか手に入らず \mathbb{E} \bigl[ F_n(1) \bigr] は手に入らないとありますね。それはそうですね。真の分布にしたがうあらゆる X^n について平均を取れるなら、それはもう無数にサンプルを得られているのと同じですから。推測しようとしている分布から無限にサンプルが得られたらそれはもうおかしいというか推測する必要ないですね。

f:id:cookie-box:20190101160814p:plain:w60

\mathbb{E} \bigl[ F_n(1) \bigr] ベイズ推測の結果 p^\ast(x) そのもののよさではなくて、 確率モデルと事前分布がどれだけ適切かという量のような気がするね。

f:id:cookie-box:20190101155733p:plain:w60

続く 1.2.2 節では、推測のよさの指標にまた別の量を導入していますね。汎化損失 \displaystyle G_n = - \int q(x) \log p^\ast (x) dx経験損失  \displaystyle T_n = -\frac{1}{n} \sum_{i=1}^n \log p^\ast(X_i) とのことです。汎化損失 G_nq(x)p^\ast(x) との交差エントロピーですね。これが小さいほどよい推測というのは納得できます。しかし、q(x) は知り得ないので現実に G_n を求めることはできませんね…。経験損失 T_n というのは…これは、情報理論の言葉でいうなら、p^\ast(X_i) という予測経験分布によるエンコーディングが個々のデータに割り振るビット長(情報量)のデータ毎の単純な平均ですね。情報量の平均といってもエントロピー(平均情報量)ではないです。エントロピーであったら  \displaystyle - \sum_{i=1}^n p^\ast(X_i) \log p^\ast(X_i) のように単純平均ではなく p^\ast(X_i) 自体で平均しなければなりませんから。しかしこの T_n にどんな意味があるというのでしょうか。予測分布 p^\ast(x) が、サンプル内の各点での確率密度が平均的に小さいものになっていたら T_n は大きく、逆にサンプル内の各点での確率密度が平均的に大きいものになっていたら T_n は小さくなりますが。T_n が小さいほどよいというのであればサンプル点の場所にだけ確率密度が存在するような櫛形の予測分布がよいということになってしまいますよね…。

f:id:cookie-box:20190101160814p:plain:w60

T_n が小さいほどよいというのではなくて、T_nG_n の推測につかえるとかいてあるよ。78~79ページあたりの話かな。

f:id:cookie-box:20190101155733p:plain:w60

そういうことですか。しかし、「何のため」というのがなくて先に定義がどんどん導入されるので雲をつかむようですね…。10ページの続きには、自由エネルギーと汎化損失の関係とは?とありますね。10ページの中ほどにある式は、これは予測分布の下での未知の点 X_{n+1} の確率密度ですね。順を追うと、

 \displaystyle \begin{split} p^\ast(X_{n+1}) \equiv \int p(X_{n+1}|w) p(w|X^n)dw = \frac{1}{Z_n(1)} \int p(X_{n+1}|w) \varphi(w) \prod_{i=1}^n p(X_i|w) dw = \frac{Z_{n+1}(1)}{Z_n(1)}\end{split}
…確かに予測分布の下での未知の点 X_{n+1} の確率密度が分配関数の比になるんですね。でもサンプル X^{n+1} が観測される確率をサンプル X^{n} が観測される確率で割れば X_{n+1} が観測される確率が残りそうな気もします。…その下の式は以下のように解釈できると思います。
  • 予測分布 p^\ast(x) の下で X_{n+1} という出来事に割り振られるビット長は、
    確率モデル  p(x|w) と事前分布 \varphi(w) の下で X^{n+1} という出来事群に割り振られるビット長から、
    確率モデル  p(x|w) と事前分布 \varphi(w) の下で X^{n} という出来事群に割り振られるビット長を差し引いたものに等しい。

つづきは後で

論文読みメモ: GBrank(その2)

以下の論文を読みます。

Zhaohui Zheng, Keke Chen, Gordon Sun, Hongyuan Zha. A Regression Framework for Learning Ranking Functions Using Relative Relevance Judgments. In SIGIR, pages 287-294, 2007. https://www.cc.gatech.edu/~zha/papers/fp086-zheng.pdf
※ キャラクターは架空のものです。解釈誤りは筆者に帰属します。何もわかっていないのでおかしな点はご指摘ください。
前回:その1 / 次回:まだ
f:id:cookie-box:20190101155733p:plain:w60

検索エンジンさんはユーザが検索したフレーズを受け取ってウェブサイトを関連の強そうなものから順に並べて提示するということをしなければなりません。そのためのモデル(ランキング関数)は、検索フレーズ-ウェブサイト対を受け取って、その対の関連度を返します。しかし、そのような関連度の教師データなどというものは存在しません(人手で優先度をラベリングした場合はありますが)。では何を目標に学習するかですが、過去のデータから、「同じ検索フレーズで表示されたウェブサイトの中でもクリックされた確率に有意差があったペア」をなるべくかき集めてくることはできるでしょう。これらのペアたちの相対的優先度にしたがうような関連度スコアを出すことを目指します。「チーズタルト」というフレーズで検索したデータから「専門店Xのサイト(クリック率相対的に大)、専門店Xのサイト(クリック率相対的に小)」というペアが抽出されたならば、モデルは「チーズタルト-専門店Xのサイト」に20.0、「チーズタルト-専門店Yのサイト」に15.0などというようなスコアを付けていれば正解です。これを実現するには、勾配ブースティング回帰木で、相対的優先度を誤ったペアについて判定を取り換えっこすることを目指す…?

f:id:cookie-box:20190101160814p:plain:w60

前提の確認も兼ねて 2.1 節の一般的な回帰モデルに対する勾配降下法からみていこう。 いま学習データ  \{ (x_i, g_i) \}_{i=1}^N があって、g_i \approx h(x_i) になるような関数 h を手に入れたい。2乗誤差を採用するならば以下の最適化問題を解きたいと。 \mathcal{H} は予め定めた関数クラスだね。

 \displaystyle \underset{h \in \mathcal{H}}{\rm min} \; L(h) \equiv \frac{1}{2} \sum_{i=1}^N \bigl( g_i - h(x_i) \bigr)^2
これを勾配降下法で解くというのは、h を以下のように更新していくということだね。
 h_{k+1}(x) = h_k(x) - \alpha_k \nabla L\bigl( h_k(x) \bigr)
ここで  \nabla L\bigl( h_k(x) \bigr) というのは h という関数をどの方向に更新するべきかってことだけど、以下のように各学習サンプル点でのみ値が得られる。現在の出力と正解との誤差として。
 \nabla L\bigl( h_k(x) \bigr) = - \bigl(g_i - h_k(x_i) \bigr) \qquad i = 1, \cdots, N
これらの学習サンプル点での値をもとに  \nabla L\bigl( h_k(x) \bigr) の近似値を得て更新するんだね。

f:id:cookie-box:20190101155733p:plain:w60

「関数を更新」というのはニューラルネットなどであったら、各重み係数について、損失関数の重み係数に関する偏微分の値を計算して(誤差を伝播させて)、全ての重み係数を更新するべき方向を求めて、その方向に少し更新するということですよね。でも回帰木のブースティングの場合は、そもそもその誤差を目的変数にした新しい回帰木を重ねることができるのですよね。

f:id:cookie-box:20190101160814p:plain:w60

そうだね。その勾配ブースティング回帰木の具体的な手続きは以下だ。

  • h_0(x) = \sum_{i=1}^N g_i / N とする(全ての学習サンプル点の値の平均値で初期化する)。
  • k ステップ目( k=1, \cdots, M )の更新では、更新前の誤差 r_{i, k}=g_i = h_{k-1}(x_i) \; (i = 1, \cdots, N) を求めて、これを目的変数に回帰木を学習し、木の終端ノードの値 R_{j,k} \; (j = 1, \cdots, J_k) を得る。そして、各ノードの平均残差 \gamma_{j,k}=\sum_{x_i \in R_{j,k}} \bigl(g_i - h_{k-1}(x_i) \bigr) / |i : x_i \in R_{j,k}| を算出し、各ノードに対応する長方形の領域をこの平均残差だけ更新する。
     \displaystyle h_k(x) = h_{k-1}(x) + \eta \left( \sum_{j=1}^{J_k} \gamma_{j,k} I(x \in R_{j,k}) \right)
この \eta は shrinkage factor といって過学習抑制のために  0 < \eta \leqq 1 に設定するみたいだね。木の数 M と shrinkage factor \eta がハイパーパラメータで、通常は交差検証で決めるとある。

f:id:cookie-box:20190101155733p:plain:w60

一般的な勾配ブースティング回帰木の話はわかります。別件でかじりましたから。でも、今回やりたい学習は回帰とは少し違います。与えられているのは「学習データ内の各ペアの優劣」で、その優劣を正しく表現するようなスコア付けを学ばなければなりません。そのように学ぼうとすることが、なぜ相対的優先度を誤ったペアについて「判定を交換」していくことになるのでしょうか?

f:id:cookie-box:20190101160814p:plain:w60

まず、検索フレーズ-ウェブサイト対 x と別の検索フレーズ-ウェブサイト対 y について、x の方が関連が強い対であるとラベリングされていることを x \succ y と表記するよ。そして、全ての「相対的優先度が与えられているペア」を以下のようにかく。

 \mathcal{S} = \{ \langle x_i, y_i\rangle \, | \, x_i \succ y_i, \, i = 1, 2, \cdots, N \}
いまほしいモデル h(x) は、なるべく多くの i について h(x_i) > h(y_i) となるものだ。学習の目的関数は、その目的関数を小さくする方向にモデルを更新していくことでほしいモデルに近づいていくようなものであってほしいよね。この論文で提案されている目的関数は以下だ。
 \displaystyle \mathcal{R}(h) = \frac{1}{2} \sum_{i=1}^N \left( \max \{0, \, h(y_i) - h(x_i) \} \right) ^2
 \displaystyle \mathcal{R}(h, \tau) = \frac{1}{2} \sum_{i=1}^N \left( \max \{0, \, h(y_i) - h(x_i) + \tau \} \right) ^2 - \lambda \tau ^2

つづきは後で

雑記

おかしい点がありましたらご指摘いただけますと幸いです。
参考文献

※ キャラクターは架空のものです。

f:id:cookie-box:20190101155733p:plain:w60

大変です! このフレーズを見てください。

The smallest positive integer not definable in under sixty letters.

f:id:cookie-box:20190101160814p:plain:w60

日本語に訳すなら「60字以下で定義できない最小の正整数」だね。

f:id:cookie-box:20190101155733p:plain:w60

ええ、まさしく。しかし、このフレーズがアルファベット何字からなるか数えてみてください。

f:id:cookie-box:20190101160814p:plain:w60

スペースとピリオドを含めないなら57字かな。

f:id:cookie-box:20190101155733p:plain:w60

はい、それが問題なんです。順を追って説明しますね。

  • アルファベットは26字しかないですね。
  • よって、アルファベット60字以下のフレーズは有限個しかないです。
  • したがって、アルファベット60字以下のフレーズで定義できる正整数は有限個しかないです。
  • 正整数は無限個あるので、アルファベット60字以下のフレーズで定義できない正整数が存在します。
  • よって、アルファベット60字以下のフレーズで定義できない正整数のうち最小のものが存在します。
ここでフレーズというのはアルファベットを指定の字数以下で重複を許して並べて、適当にスペースで区切ったものとでもしてください。以上を踏まえて、再度このフレーズについて考えてみてください。

The smallest positive integer not definable in under sixty letters.

上のフレーズが定義する正整数を k とでもすると、読んで字の如く k は「60字以下で定義できない最小の正整数」です。しかし、上のフレーズは57字です。つまり、k は60字以下で定義できます。なので k はやっぱり「60字以下で定義できない最小の正整数」ではないんです。となると、k などという正整数はなかったことになってしまいます。でも、「60字以下で定義できない最小の正整数」というもの自体はあるはずです。そしてそれは上のフレーズで表現できます。しかし上のフレーズはアルファベット57字で…矛盾が生じています。どうしてこんなことになってしまったんでしょう。

f:id:cookie-box:20190101160814p:plain:w60

「矛盾」ね…確かにアルファベットは26字しかないし、アルファベットからなる有限の長さのフレーズは有限個しかない。じゃあ「アルファベット60字以下のフレーズで定義できる正整数」って何だろう? いや、「定義できる」って何?

f:id:cookie-box:20190101155733p:plain:w60

「定義できる」とは何か、ですか。そうですね…ここでは正整数を何か定義しようとしているので、どの正整数を指すかを定めているフレーズであれば、そのフレーズは正整数を定義できているというのではないでしょうか。英語だと考えにくいので日本語のひらがなと漢字で考えてみますね。「二十字以下で定義できない最小の正整数」という文字列でも考えれば上のフレーズと同じ状況です。二十字以下のひらがなと漢字からなるフレーズを全て書き出せば、正整数を指していたり指していなかったりするでしょう。正整数を指していれば、そのフレーズは正整数を定義しているといえると思います。以下のようなイメージです。

フレーズIDフレーズ指す正整数 正整数を定義しているかどうか
1100True
2百と同じ数100True
3百に一を足した数101True
4マイナス百正整数ではないFalse
5どら焼き正整数ではないFalse
6あああああああああああああああ正整数ではないFalse
\cdots\cdots\cdots\cdots
この対応表を完成させればいいのではないでしょうか。私だけでは手が足りなさそうなので、アノテーションに協力していただけるアルバイトの方をたくさん雇いましょう。

f:id:cookie-box:20190101160814p:plain:w60

確かに対応表をつくれば各フレーズが正整数を定義しているかどうかをはっきりさせられるけど、それだとあるフレーズが正整数を指しているかと指す正整数が何かはそのフレーズを担当したアルバイトの気分次第ってことにならない? それに、結局以下の ? を埋める段階になったときにどうするの?

フレーズIDフレーズ指す正整数 正整数を定義しているかどうか
X二十字以下で定義できない最小の正整数??

f:id:cookie-box:20190101155733p:plain:w60

いえ、決してアルバイトの方の気分次第ということでは…私は「百に一を足した数」というフレーズで「3」を定義することなどは想定していません。なるほど、副部長がいいたいのは、各フレーズに正整数を割り当てるのをアルバイトの方の裁量に任せるのではなく、もっときちんとマニュアル化しろということですね。確かにマニュアルの整備は大切ですものね。以下のようなマニュアルをつくりましょう。

  • 正整数として有効な漢数字の列のみからなるフレーズにはそれの指す正整数を割り当てること。
  • 正整数として有効な漢数字の列の後ろに「と同じ数」を足した形になっているフレーズには正整数として有効な漢数字の列の指す正整数を割り当てること。
  • \cdots
  • 上記のどれにも該当しないフレーズには正整数を割り当てないこと。
「有効な漢数字の列とは」「漢数字の指す正整数とは」というマニュアルも必要ならば別途つくりましょう。意味のある日本語の単語は有限でしょうし、細かな表記ゆれなどは正整数を指さないとはじくことにしてしまえば、マニュアルを書き下し切ることはできるのではないでしょうか?

f:id:cookie-box:20190101160814p:plain:w60

じゃあその書き下し切ったマニュアルの下で「二十字以下で定義できない最小の正整数」が「正整数を定義しているかどうか」はどう決定される?

f:id:cookie-box:20190101155733p:plain:w60

そのようなフレーズが指す正整数を定めるのは少しややこしくなるでしょうね。マニュアルは「先にまず二十字以下のフレーズに対する対応表を完成させて、その表に現れる正整数の最大値に一を足した数を取ること」などとする必要があります。

f:id:cookie-box:20190101160814p:plain:w60

「先にまず二十字以下のフレーズに対する対応表を完成させる」ことができるのかな?

f:id:cookie-box:20190101155733p:plain:w60

あ…できませんね。「二十字以下で定義できない最小の正整数」は十八字なので、このフレーズが正整数を定義しているかどうかの判定のためには先に二十字以下のフレーズに対する対応表を完成させたいです。が、それを完成させる過程で「二十字以下で定義できない最小の正整数」というフレーズが正整数を定義しているかどうかを判定する作業が発生してしまいます。…無限ループです。

f:id:cookie-box:20190101160814p:plain:w60

それじゃ永遠に作業が終わらないね。

f:id:cookie-box:20190101155733p:plain:w60

困りましたね…永遠に作業が終わらないとなると、このフレーズのアノテーションを担当したアルバイトの方に支払う時給が無限大に発散してしまいます。

f:id:cookie-box:20190101160814p:plain:w60

困るところそこ!?

f:id:cookie-box:20190101155733p:plain:w60

しかし「二十字以下で定義できない最小の正整数」というフレーズが「正整数を定義しているかどうか」の判定の作業が終わらないということはわかりましたが、どうもすっきりしません。結局何が悪かったのでしょう?

f:id:cookie-box:20190101160814p:plain:w60

何が悪かったっていうか…「二十字以下で定義できない最小の正整数」というフレーズは日本語の文法として間違っていないし、いかにも特定の正整数を定めているようにみえる。でもこの正整数が定まるには「二十字以下で定義できる正整数」を先に全て定まってないといけなくて、その中に「二十字以下で定義できない最小の正整数」が含まれるから、定義が自己言及しているんだよね。定義が自己言及してしまうと、いつまでも定義が終わらない。自然言語によって定義すると、こういう事態になることを防ぐことができないってことかな。

f:id:cookie-box:20190101155733p:plain:w60

なんと…自然言語にそのような不具合が…。

(次回があれば)つづく