プログラミングを学ぶ人「ニューラルネットワークって何だろう?」
こんな方に向けた記事です。
今回はPython機械学習のニューラルネットワークについて一緒に勉強していきましょう。
ニューラルネットワークの基本的な考え方であるパーセプトロンついてはこちらの記事で解説しているのでまだご覧になっていない方は是非御覧ください。
ニューラルネットワークは人間の神経回路を真似て作られたアルゴリズムです。
ニューラルネットワークは主にディープラーニングで利用される概念です。
ディープラーニングでは10層以上あるようなニューラルネットワークが用いられます。しかし、テーブルデータに対しては中間層が2〜4層程度のニューラルネットワーク、いわゆる多層パーセプトロンが用いられます。
パーセプトロンの記事でも申し上げたようにニューラルネットワークは医学論文でも使われる非常にメジャーなモデルの一つであり、Python機械学習を学ぶ上では避けて通ることのできないものでしょう。
それでは一緒に勉強していきましょう。
本記事の学習目標
- ニューラルネットワークとは何か理解する。
- ニューラルネットワークの特徴を理解する。
- ニューラルネットワークの代表的なライブラリを理解する。
- ニューラルネットワークの代表的なパラメーターを理解する。
目次
機械学習のニューラルネットワーク
ニューラルネットワークはパーセプトロンの組み合わせです。
単純パーセプトロンとニューラルネットワークの大きな違いは2つあります。
ポイント
- 中間層が存在する。
- 活性化関数に必ず非線形関数を使用する。
中間層が存在する
ニューラルネットワークには単純パーセプトロンには存在しない中間層(s)が存在します。
中間層が入力のx1、x2に介在することでより多様な出力が可能となります。
パーセプトロンの記事でパーセプトロンの限界としてご紹介したXORゲートを例に見てみましょう。
単純パーセプトロンではこのXORゲートを実現することができませんでした。
中間層を用いたニューラルネットワークではXORゲートをANDゲート、ORゲート、NANDゲートを中間層として利用して組み合わせることで実現できます。
今回は中間層が1層を想定していますが、中間層を増やしていくことで無数の組み合わせを表現することができるようになります。
活性化関数に必ず非線形関数を使用する
単純パーセプトロンでは活性化関数が線形関数のステップ関数であるのに対し、ニューラルネットワークでは非線形関数であるシグマ関数やReLU関数を用います。
ステップ関数、シグマ関数、ReLU関数を図示すると直感的にわかりやすくなります。
Pythonで図示してみます。
<ステップ関数>
import numpy as np import matplotlib.pyplot as plt def step_function(x): return np.array(x>0) x=np.arange(-5.0, 5.0, 0.1) #-5から5までを0.1刻みで表す y=step_function(x) plt.plot(x,y) plt.ylim(-0.5,1.5)#y軸の表示範囲を指定する plt.show()
<シグマ関数>
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1/(1+np.exp(-x))
x=np.arange(-5.0, 5.0, 0.1)#-5から5までを0.1刻みで表す
y=sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.2) #y軸の表示範囲を指定する
plt.show()
<ReLU関数>
import numpy as np
import matplotlib.pyplot as plt
def relu(x):
return np.maximum(0,x)
x=np.arange(-5.0, 5.0, 0.1)#-5から5までを0.1刻みで表す
y=relu(x)
plt.plot(x,y)
plt.ylim(-0.1, 5.0) #y軸の表示範囲を指定する
plt.show()
ReLU関数はRectified Linear Unitの略で入力が0を超えていればその入力をそのまま出力し、0以下ならば0を出力する関数です。
ニューラルネットワークでは活性化関数を線形ではなく非線形にすることで多様な出力が可能になります。
ニューラルネットワークの代表的なライブラリ
ポイント
- keras
- pytorch
- chainer
- tensorflow
わかりやすく記述できることからkerasが好んで使用されることが多いです。
ニューラルネットワークの特徴
ポイント
- 欠損値を扱うことができない。
- 非線形性や変数間の相互作用が反映される。
- 特徴量を標準化などでスケーリングする必要がある。
- ハイパーパラメータ次第で精度が出ないことがある。
ニューラルネットワークにはこのような特徴があります。GBDTやランダムフォレストと比較してチューニングが大変になります。
ニューラルネットワークの代表的なパラメータ
ネットワークの構成として中間層の層数、ドロップアウトの率、活性化関数などを指定します。
オプティマイザはニューラルネットワークのウェイトをどのように学習するかのアルゴリズムです。確率的勾配降下法のSGDと適応的に学習率を変えるAdamなどが挙げられます。
ご覧のようにニューラルネットワークはパラメータチューニングが難しく、実際に使用するのにはハードルが少し高いかもしれません。
参考文献
さいごに
みなさんいかがでしたでしょうか。今回はPython機械学習の基本的なモデルの一つであるニューラルネットワークについて一緒に勉強しました。
ニューラルネットワークはパーセプトロンの組み合わせである。
ニューラルネットワークと単純パーセプトロンの大きな違い
- 中間層が存在する。
- 活性化関数に必ず非線形関数を使用する。
ニューラルネットワークの代表的なライブラリ
- keras
- pytorch
- chainer
- tensorflow
ニューラルネットワークの代表的なパラメータ
- input_dropout
- hidden_layers
- hidden_unit
- hidden_activation
- hidden_dropout
- optimizer
- batch_size
それぞれ概念自体の理解はとっつきにくいと思います。
具体例で実際にイメージしながらじっくりと理解していくのが良いと思います。
機械学習はプログラミング言語のPythonを用いれば、今持っている自分のパソコンですぐに実践することができます。
英語論文になっている手法もしっかりと勉強すれば、自分のパソコンで出来ます。
このサイトでは、プログラミングに興味のある医学生、医師のための情報を発信しております。
プログラミングの学習方法には大きく分けて、「独学」と「プログラミングスクール」の2つがあります。
当サイトでは一貫してプログラミングスクールを利用することをおすすめしています。
なぜなら、独学で勉強した私が非常に苦労したからです。
また私はプログラミングを学習するにあたり、師匠・メンターのような存在がいました。
わからないところは教えてもらっていました。
そのような環境でなければ0から独学で勉強するのはとても効率が悪いと思います。
詳しくは、プログラミングの独学は難しいです【私の失敗談】で紹介しています。
この記事が一人でも多くのプログラミングに興味のある方のお役に立てば幸いです。