比を最適化する

二つの負でない実数pqを考える。比\frac{p}{p + q}をある値rに近づけたいといった条件が複数あり、それらを最適化したいとき、どうするのがよいだろうか。

序: 近道の階段

簡単な方法の一つとして考えられるのは、単純に比の差をとり、それらの平方の和を最適化の対象とするというものだ。

\displaystyle \sum_{i}{(\frac{p_i}{p_i + q_i} - r_i)^2}

しかし、これは最適化の結果、しばしばp_iq_iのどちらかが0にぶつかってしまう。これは目的関数として非常にいびつであり、直感的とも言いがたい。

破: バリアフリー

0や1に近い比率は極端であり、望まれていない。境界に近づくほど目的関数が無限大に発散するようにできないだろうか。

そんなときに使えるのがロジットだ。ロジットは0より大きい1未満の実数を任意の実数に写像する関数である。

\displaystyle logit(x) = log(\frac{x}{1-x})

この関数を比に適用することで、極端な比にはそれなりに大きなペナルティが、なめらかでありながらも力強く課されるようになる。

\displaystyle \sum_{i}{\{logit(\frac{p_i}{p_i + q_i}) - logit(r_i)\}^2}

r_i = \frac{s_i}{s_i + t_i}とおくと以下のようにも表せる。

\displaystyle \sum_{i}{\{log(\frac{p_i}{q_i}) - log(\frac{s_i}{t_i})\}^2}

こうすれば、境界を気にすることなく最適化することができる。最適化される変数にとってもこれは心地の良いことだろう。

急: ノーマライゼーション

めでたしめでたし…と言いたいところだが、まだ気になる点はある。目的の比 rがもともと0や1に近ければ、 logit(r)は大きな絶対値を取る。そのため、その比にやたらと敏感になってしまう。差をロジットの導関数 logit'(x) = \frac{1}{x - x^2}で割ってやることで、各比の感度を目的の値にかかわらず一定にできる。

\displaystyle \sum_{i}{\{(r_i - r_i^2)(logit(\frac{p_i}{p_i + q_i}) - logit(r_i))\}^2}

まとめ

本記事では比を最適化するための方法について議論した。この考え方は多かれ少なかれ直感に基づいており、直感にうまく当てはまる表現を見つけることは有用だと感じた。