Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?
@arthur_maki

汎化性能を向上させる手法を調べてみた

ここでは汎化性能を向上させる手法に関して紹介していきます。

正規化

訓練データに偏りがある場合、正規化をして偏りを無くすことにより汎化性能を向上させ、かつ学習を早めることができます。

正規化の方法はいくつかあるのですが、基本的な方法としてデータの標準分布を標準正規分布にする標準化が挙げられます。

具体的には各データ($x_n$)にある各成分($x_{ni}$)を標準正規分布に基づく確率変数にします(平均が0、分散が1になるように線形変換する)。

つまり、上記各成分($x_{ni}$)をならすように線形変換します。
式としては各成分(x_{ni})を標準変化量に変換すれば良いので、$\frac{x_{ni}-\overline{x_i}}{{\sigma}_i}$

とし、これを訓練データとして扱います。$\sigma_i$は$\sqrt{\Sigma^N_{n=1}(x_{ni}-\overline{x_{i}})^2}$として表せます。また、$\overline{x_i}$は$x_{ni}$の平均です。

ただデータによっては正規化しないでそのままにした方が良い場合もあるのでそこはケースバイケースで判断する必要があります。

データ拡張

データを集めたくても集められない時にデータそのものが少ないと十分に学習ができず過学習が発生しやすくなります。

そこで、元のデータに手を加えてデータを水増しすることで学習データを確保します。

また、この手法は画像認識の分野にも用いられ、例えば「収集困難な画像から学習する場合、十分に学習できないため上下左右反転、輝度の変更、画素を荒くする」等の手を加えることで学習画像を増やすことができます。

複数ネットワークの平均

一般に言うアンサンブル学習で複数の異なるニューラルネットワークを組み合わせることで独立に訓練し、汎化性能を向上させる方法です。(異なると言うのはネットワークの形だけでなく、同じ形でも重みの初期値が異なる場合も含まれます)

具体的には全ての異なるニューラルネットの各層の各ユニットの出力を合成させることで新しいモデルを作成します。(これをモデル平均と呼びます)

また、この手法を使用した手法の一つとしてドロップアウトが挙げれれます。

学習係数の決定方法

学習係数を決定することは「どれだけ効率的に重みを最適な値に更新できるか」を決定することで学習フェーズでは極めて重要です。

学習係数を決める方法は手動と自動があります。

手動で決める場合では、「学習が進捗するに連れて(重みを更新するに連れて)値を小さくする」のと、「入力層では大きく、出力層では小さくなるように層ごとに小さくする」の2つがあります。

一方、自動で決める場合ですがAdaGradが有名です。

AdaGrad

AdaGradは「勾配0である点が多い軸において、稀に現れる勾配$\neq0$の点まで一気に更新する」手法です。

誤差関数の勾配ベクトルを$g_t\equiv\nabla{E_t}$とするとき、各成分を$g_{ti}$とします。(添字$t$はt回目の更新で訓練データを入れ替えると言う意味で、$g_{ti}$はt回目の更新時の勾配ベクトルと表しています。)

この時、上記の「稀に現れる勾配$\neq0$の点まで一気に更新する」を式で表すと、$-\frac{\epsilon}{\sqrt{\Sigma^t_{t^\prime=1}g^2_{t_{\prime,}i}}}g_{t,i}$ と表せます。(一気に更新するために$\epsilon$をtまでの勾配の二乗平方根で除算)

重み更新方法(モメンタム)

以下は重み更新方法(モメンタム)に関して紹介します。

モメンタム

モメンタムは「勢い、はずみ」と言う意味から、「慣性を利用して重み更新」します。

元々の勾配効果法でも同じようなやり方で重みを更新しているのに、何故このような方法が存在してるかと言うと、誤差関数によっては「更新しづらい(高低差がない)部分があり長く続いている箇所がある」からです。

このような場合は勾配降下法では非常に更新速度が遅いため、慣性の概念を加えたモメンタムが考えられました。

式で表すと、$w^{t+!}=w^{t}-{\epsilon\nabla}E_t-{\mu\Delta}w^{t-1}$となります。

($\mu<1$, ${\Delta}w^{t-1}=w^t-w^{t-1}$)

この式が意味するのは前回更新した方向(${\Delta}w^{t-1}$)に向けて${\mu}$をかけることで慣性の役割をするような更新をするのに加えて、新たに計算した勾配(${\nabla}E_t$)を学習率$\epsilon$をかけた値だけ更新することで、効率的な重み更新ができます。

分かりやすく言うと、「前回更新した方向に$\epsilon$*10%向けたまま、新たに計算した方向に向けて微調整した方向に向けて重み更新を慣性により加速することで少ない回数で効率的に重みを更新」できます。

これは、ニュートンの物理法則にある「山の上からボールを転がすと加速して一気に下る」ことを利用しています。

5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
5
Help us understand the problem. What is going on with this article?