[ 機械学習 ] 学習の必要性について

[ 機械学習 ] 学習の必要性について

本記事では、機械学習における「学習」の必要性についてまとめていきたいと思います。

学習とは

定義

今回のテーマは「機械学習における学習」ですが、まずは「学習」の定義から確認しましょう。

機械学習において「学習」とは、「訓練データから最適な重みパラメータとバイアスを自動で獲得すること」を指します。
言葉だけではちょっと分かりづらいので、前の記事などで使用した図などを利用してこの「学習」の意味を考えてみましょう。

重みとバイアスを固定値で設定するということ

前回は、学習過程を含まないニューラルネットワークを構築しました。その構成図は次の様になっていました。

この図ではバイアスは緑のノードで表されています。重み(W)は図示していないのですが、緑の入力値から青のニューロン、青のニューロンから次のニューロンへと伸びる線の意味するところは、それぞれの入力とそれに対応した重みを乗算することでした。

この時プログラム内部では、重みとバイアスは固定で設定しています。
つまりこのネットワークでは、「重みとバイアスが指定値の時の出力yを求める」という処理が為されています。

 

なんとなくそれでも問題ない様な気もしますが、そこには問題があります。

それは、「重みとバイアスの値に何を設定すれば良いのか」という問題です。
もう少し分かりやすい例として、AND問題を引用しましょう。

 

手動でパラメータを設定する難しさ

AND問題について、以前次の様な実装を行いました。

ここで注目したいのは、wとbの値です。

ここでは重みwには、numpy配列で [0.5 , 0.5] を、バイアスbには スカラーで 0.1 を設定していました。
このパラメータの元でAND処理は適切に行えるわけです(他にも処理可能な設定は多くあります)。

ではこのパラメータはどの様に求めたかというと、実は手計算で試行錯誤しながら求めています。
この処理の場合は計算数も多くありませんし、出力分岐も2つだけなので、少し時間はかかっても手でパラメータを設定することが十分可能です。

ANDゲートの様に簡単な処理の様な場合には、 これで問題ありません。
しかし、これがもっと複雑な問題であれば、どうでしょう。先ほどの図に戻ってみましょう。

 

これも比較的単純なネットワークではありますが、ここでは次の様なパラメータが使用されています。

  1. W1 : 入力に掛け合わせる重み。入力が2列で次の層のニューロン数が3なので、2行3列の値が必要。
  2. b1  : 1層のニューロンへと渡す入力に加算するバイアス。1行3列の値が必要。
  3. W2 : 1層のニューロンからの出力に掛け合わせる重み。前層のニューロン数が3で次層のニューロン数が2なので、3行2列の値が必要。
  4. b2  : 2層のニューロンへと渡す入力に加算するバイアス。1行3列の値が必要。

 

以上の様に、ここでは4つのパラメータが用いられています。それぞれが単一の数値であればまだやりようもありますが。重みは行列になっているので、ここでの単純なパラメータ数を求めると 12 です(2*3 + 3 + 3*2 + 3)。この12もの数を手動で調整し、適切な出力に適応させていくということが難しいということは、考えるまでもなく分かりますよね。

 

手動パラメータ設定を行っていた時代 ~第2次AIブームにおけるエキスパート・システム~

ここでちょっと余談です。興味がなければ読み飛ばしてください。

手動で重みとパラメータを設定することの難しさは先の図で掴めたかと思いますが、それでもそれに挑戦しようとした時代はありました。
それは、いわゆる第2次AIブームと呼ばれた時代、1980年代におけるエキスパート・システムです。

 

ai2

その時代では、現実世界のあらゆる問題をAIに解決させようという目的のもと、各専門的職能に適応させたプログラム、エキスパート・システムを作り出して問題解決を図りました。

けれどもパラメータ(特徴量とも言います)を自動で設定する様な技術が当時は発見されていなかったので、各エキスパート・システムにおけるパラメータは全て手動で設定され、調整されました。先の簡単なネットワークでもパラメータは10を越したのですから、おそらくそのシステムにおけるパラメータ数は、ゆうに100や1000を超えたことでしょう。

 

結局、第2次AIブームは終焉しました。その原因の一端は、パラメータを手動で設定しなければいけないということにあったと言われています。一つのシステムを作るたびに大量のパラメータを計算して設定しなければいけないとなると、それを量産できないのはなんとなく分かりますよね。

現在のAIブームは第3次であると言われます。
なぜ今の時代がブームであるかと言えば、その一つの理由は「自動でパラメータを設定する」という技術が発見されたことです。
それがつまり、「学習」です。学習を行うことで、煩雑だったパラメータの手動設定から人間が解放され、機械学習のハードルが劇的に下がったのです。

 

話が長くなりましたが、パラメータ設定に関する時代についての簡単な紹介でした。

 

どのように学習を行うのか

では、どのようにして学習 – 自動パラメータ設定 – を行うのでしょうか。

学習過程のざっくりとしたイメージは、次のようなものになります。

 

  1. 重みとバイアスを適当な値で初期化する
  2. 設定した重みとバイアス値をニューラル・ネットワークに設定、入力値を渡して出力を得る。
  3. 出力結果と正解データを比較する。
    a. 損失関数を用いて、出力結果と正解データのずれを算出する(=損失)。
    b. 入力xに関する損失関数に対しての微分を計算する (=勾配)。
    c. 損失が小さくなるように、重みとバイアスを勾配値を元に再設定する。
  4. 2-3を指定回数繰り返す。
  5. 自動パラメータ設定が完了する。

 

ざっくりしすぎて分かりませんね。
分かりづらいことに加え、「損失関数」という新たなワードも出てきました。

損失関数とは、ネットワークの出力結果とそれに対応する正解データを受けとり、その2値における差分(損失)を算出する関数です。

学習においてはこの損失関数がとても大事な要素となるのですが、これはちょっと長くなりますので、次の記事でテーマにしたいと思います。

今回のところは、学習の必要性と、その処理のふんわりしたイメージをつかめれば目的達成です。

 

まとめ

  1. ニューラル・ネットワークには重みとバイアス(パラメータ)が必要である。
  2. ネットワークを最適なものにするためには、パラメータを適切なものに設定しなければいけない。
  3. パラメータを自動で獲得する処理が、「学習」である。
  4. 「学習」においては、「損失関数」という概念を用いて処理を行う。

 

 

以上。

MachineLearningカテゴリの最新記事