ロバスト回帰(フーバー回帰,テューキー回帰)を勉強してみた - 5月 08, 2019 こんにちは、ぐぐりら(@guglilac)です。 今回は、ロバスト回帰についてまとめてみます。 勉強したので整理もかねて。 今回勉強したのはロバスト回帰のフーバー回帰,テューキー回帰についてです。 ## ロバスト回帰とは?? 回帰問題は大丈夫かと思います。 年収とか、明日の気温とか、ある値を予測する機械学習のタスクです。 ロバスト回帰とは、モデルの訓練に用いるデータに外れ値があった場合に、その外れ値の影響を小さくするような学習方法のことを指します。 実際の応用上ではデータセットの中には観測の際に手違いなどから外れ値が入り込む可能性があるので、そういうデータが入っても影響を小さくして最終的に得られるモデルがあまり変わらないと嬉しいよね、というモチベーションです。 単純な二乗誤差($l2$損失)を使う回帰、いわゆる最小二乗回帰では、外れ値の影響が二乗のオーダーで効いてきてしまいます。 $$\sum_{i=1}^n (f_{\theta}(x_i)-y_i)^2$$ ロバスト回帰では、用いる損失の形をうまく設計することで外れ値の影響を小さくしていきます。 ## $l1$損失 一番簡単なロバストになる損失は$l1$損失です。 $$ \sum_{i=1}^n |f_{\theta}(x_i)-y_i| $$ 予測値と正解の値との絶対値誤差を損失に用いるものです。 これにより、外れ値の影響は線形にしか効いてこなくなるため、二乗誤差より外れ値の影響が小さくなります。 $l2$損失よりも$l1$損失の方が外れ値の影響が小さくなるのは、平均と中央値の性質の関係に似ています。 よく年収の例などが挙げられますが、平均年収を計算すると、一部のとても高収入な層の影響を受けて実態よりも高めの値が出ます。 マジョリティをうまく表現できるのは中央値だったりします。 実は、 $l2$損失を最小化することで得られる解は期待値であり、$l1$損失を最小化する解は中央値なので、当然といえば当然ですね。 $l1$損失は外れ値に対してロバストではありますが、逆に外れ値でないどのような点に対してもあまりデータ点を見ないで出力しているとも言えます。 理想的には、 * 外れ値でないデータに対しては二乗誤差ぐらいの重みで学習 * 外れ値のデータは$l1$損失のように重要度を下げたい という損失が欲しいです。それを叶えるのがフーバー損失です。 ## フーバー損失 フーバー損失は$l1$損失と$l2$損失のいいとこ取りをしたような損失関数になっています。 小さい誤差に対しては二乗誤差になり、大きい誤差に対しては絶対誤差を計算するように設計します。 $$ \sum_{i=1}^n \rho(f_{\theta}(x_i)-y_i) $$ ただし $$ \rho(r)=\begin{cases} r^2/2 & (|r| \le \eta) \cr \eta|r|-\eta^2/2 & (|r| > \eta) \end{cases} $$ $\eta$は外れ値の閾値で、あらかじめユーザーが設定しておくハイパーパラメータです。 フーバー損失は連続で微分可能なので勾配法が使えるのですが、ここでは繰り返し最小二乗アルゴリズムというものを用いてみます。 ## 繰り返し最小二乗アルゴリズム 更新式の説明だけすれば大丈夫かと思います。 現在の解$\tilde \theta$が与えられたときに、次の解$\hat \theta$を求める部分を説明します。 現在の解$\tilde \theta$で計算した誤差を$\tilde r = f_{\tilde \theta}(x)-y$とします。 最小化したい損失関数に対して、$\tilde r$で上から接するような二次関数(これを2次上界と呼びます。)を求めて、その2次上界を最小にする点を次の解$\hat \theta$とします。 二次関数の最小化は最小二乗なので解析的に解くことができます。繰り返し最小二乗を解くのでこのような名前が付いています。 フーバー損失について適用してみると、、 フーバー損失に$\tilde r$で接する2次上界($\tilde \rho(r)$)を計算すると(これは二次関数が接する条件なので高校数学の知識で求められるので省略します。。) $$ \tilde \rho(r)=\frac{\tilde w}{2}r^2 + \mathrm{const} $$ $$ \tilde w=\begin{cases} 1 & (|\tilde r| \le \eta) \cr \eta/|\tilde r| & (|\tilde r| > \eta) \end{cases} $$ となるので、 各ステップで最小化したい2次上界は,各データ点について重み$\tilde w_i$を計算して $$ \frac{1}{2}\sum_{i=1}^n\tilde w_i (f_\theta(x_i)-y_i)^2 $$ $\tilde w_i$がなければ通常の最小二乗ですが、この重みによって「どの程度$i$番目のサンプルを重要視して学習をするか」という調整がなされているわけです。 ちなみにこの最小化は単純に微分してあげることで解析的に解くことができます。 線形回帰だった場合($f(x) = \sum_i^d \theta_i \phi(x_i)$)は,損失を行列表示すると $$ J(\theta)=(\bm{\Phi\theta} - \bm y)^T \bm{\tilde W} (\bm{\Phi\theta} - \bm y) $$ とかくことができます。ただし $$ \tilde \bm{W} = \mathrm{diag}(\tilde w_1,\cdots,\tilde w_n) $$ この損失を微分して0をとることで よって、これは$\theta$で微分すると $$ \frac{\partial J}{\partial \bm\theta}=\bm{\Phi^T \tilde W \Phi \theta} - \bm{\Phi \tilde W y} $$ となります。 $\frac{\partial J}{\partial \bm\theta}=0$として$\hat\theta$を求めると $$ \hat\theta= (\bm{\Phi^T \tilde W \Phi \theta})^{-1}\bm{\Phi \tilde W y} $$ ## テューキー損失 フーバー損失もロバストではありましたが、それでも外れ値の影響はゼロではなく線形程度には効いてきてしまうのが欠点でした。 そのため、外れ値がとても外れていたら影響は無視できません。 テューキー損失は、ある程度外れていたらそのデータを完全に無視するように設計された損失です。 テューキー損失は次のように定義されます。 $$ \sum_{i=1}^n \rho(f_{\theta}(x_i)-y_i) $$ ただし $$ \rho(r)=\begin{cases} {1-(1-r^2/\eta^2)}^3/6 & (|r| \le \eta) \cr 1/6 & (|r| > \eta) \end{cases} $$ これもフーバー損失と同様に繰り返し最小二乗アルゴリズムで解くことができます。 先ほどフーバー損失の2次上界を計算できると書きましたが、より一般に、損失$\rho(r)$に$\tilde r$で接する2次上界は存在するならば $$ \tilde\rho(r)=\frac{\rho'(\tilde r)}{2\tilde r} r^2+\mathrm{const} $$ とかけることが知られています。(これも接する条件からすぐわかります) なので、重みも一般に $$ \tilde w=\rho'(\tilde r_i)/\tilde r_i $$ とかくことができます。 テューキー損失の場合の重みは $$ \tilde w=\begin{cases} (1-r^2/\eta^2)^2 & (|r| \le \eta) \cr 0 & (|r| > \eta) \end{cases} $$ と具体的に計算することができます。外れ値に対してフーバー損失の重みはある程度の値が与えられていた一方、今回は完全に0になっています。 大きすぎる誤差を与えるサンプルには重み0で無視するようになっていることがわかります。 重みがわかればあとはフーバー回帰と同じです。 ## おわりに ロバスト回帰について、$l1$損失から始まり、フーバー損失、テューキー損失を紹介して繰り返し最小二乗アルゴリズムで解くところまでやってみました。 実装もしてみたのですが、長くなってしまったので今回はなしで。。。 機会があればまた別の記事で実装編を書きたいと思います。 ありがとうございました。 この記事をシェアする Twitter Facebook Google+ B!はてブ Pocket Feedly コメント
コメント
コメントを投稿