とらりもんHOME  Index  Search  Changes  Login

機械学習入門: ニューラルネットワークの体験

機械学習入門に戻る!)

機械学習には, 既に体験したサポートベクターマシンやニューラルネットワーク, さらにはランダムフォレストなど, 様々な数学的手法がある。その中でも, 近年急速に普及しているのは「ディープラーニング」という手法である。これはニューラルネットワークを発展させた手法である。そこで, 今後しばらくは, ディープラーニングを学ぶための基礎として, ニューラルネットワークについて学ぶ。テキストは, 「Raspberry Piではじめる機械学習 第5章, 第6章」である。

ではまず, 前回同様に, カレントディレクトリが, ウォームアップで用意したwork_Raspiであることを確認し, pythonシェル (ipython3)に入ること。

以下, pythonシェルのプロンプトを"In [ ]: "で表す(従って, それらを打つ必要はない)。また, [ ]の中の値は参照のためのものであり, 君が実際打つ時に表示される値と異なっていても問題ない。

1. scikit-learnでニューラルネットワークを実装する

ニューラルネットワークは多くの数学的なアイデア(アルゴリズム)で構成されている。それを実際の計算機にやらせるには, それを計算機プログラムとして書き表すこと(実装)が必要である。ニューラルネットワークをゼロから実装するのは大変であり(それをやろうというのが例の赤い本(笑)), そこで頭の良い人が, 世の中のみんなにかわって実装し, 無料で提供してくれている。そのひとつが, scikit-learnの中にある, MLPClassifierというクラスである。我々は, MLPClassifierを使うだけで, たった1行でニューラルネットワークを実装できる(ありがたい!!)。しかし, ニューラルネットワークをどのような構造で作るかは, 我々自身が決定し, 「パラメータ」としてMLPClassifierに与えねばならない。

ml-05-01-2feat3class-nn.pyにおいて, 分類器の設定部分:

clf = MLPClassifier(hidden_layer_sizes=(100, ), max_iter=10000, tol=0.00001, random_state=1)

を, 以下の4とおりのケースにそれぞれに変えて試してみよう:

a) clf = MLPClassifier(hidden_layer_sizes=(100, ), max_iter=10000, tol=-1,      random_state=1)
b) clf = MLPClassifier(hidden_layer_sizes=(100, ), max_iter=50000, tol=0.00001, random_state=1)
c) clf = MLPClassifier(hidden_layer_sizes=(5, ),  max_iter=10000, tol=0.00001, random_state=1)
d) clf = MLPClassifier(hidden_layer_sizes=(5, 20),  max_iter=10000, tol=0.00001, random_state=1)

課題1-1: ここで変更したパラメータはそれぞれ何を意味しており, それぞれの変更はニューラルネットをどう変えたか述べよ。

課題1-2: それぞれのケースで実行時間を互いに比較せよ。長いもの・短いものについて, なぜそうなったか考察せよ。

課題1-3: それぞれのケースの実行結果を比較し, その違いが生じた理由を考察せよ。

scikit-learnでは, ニューラルネットワークはMLPClassifierというクラスを使えばこのように簡単・柔軟に定義・構築できる。その詳細を見てみよう。

In [ ]: help(MLPClassifier)

課題1-4: その結果から, 活性化関数に相当するパラメータに関する記述を抜き出せ。ヒント: 「活性化」は英語で何という? 化学でよく出てくるよね!

課題1-5: これまではどの活性化関数を使っていたことになるか? ヒント

2. ニューラルネットワークの構造を変えてみる

次に, 別のプログラムml-05-02-4feat3class-nn.pyにおいて,

e) 中間層を5ニューロン1層
f) 中間層を3ニューロン1層
g) 中間層を3ニューロン2層

のそれぞれについて変えてみよう。どこをどう変えればよいか, 考えよう!

課題2-1: eからgまでのそれぞれのケースについて, 結果はどう違うか?

課題2-2: 活性化関数をシグモイド関数に変えて, 上記のe, f, gを試してみよ。どうなるか? ヒント: helpをしっかり読もう。シグモイドとは違う名前で呼ばれているかもしれないので, よく考えよう。「ライブ講義...」の「シグモイド関数」の説明も役に立つかも。

3. 演習

課題3-1: ml-06-07-nn-traintest.pyについて, ニューラルネットワークの構造(活性化関数も含む)を様々に変えて, 結果を比較してみよ。

課題3-2: P153~154で, ニューラルネットワークの学習において, 「ランダムな要素を固定した場合(毎回同じ結果)」と「毎回ランダムな場合」があった。機械学習の開発において, それぞれの長所は何だろうか?

Last modified:2020/05/18 15:40:26
Keyword(s):
References:[機械学習入門] [機械学習入門: レポート課題4]