こんにちは!
データサイエンティストのウマたん(@statistics1012)です!
最近巷で話題のディープラーニング。
そんなディープラーニングの基となっている手法は50年以上前から存在していたのをご存知でしょうか?
それが「ニューラルネットワーク」。
簡単に言ってしまうと、ニューラルネットワークを複雑にしたのがディープラーニングであり、ディープラーニングは実際のところ、さして新しい手法ではないのです。
今回は、そんなニューラルネットワークについて理解を深めていきましょう!
ちなみにディープラーニングについては、以下の記事でまとめています!
ディープラーニング系、その他のAI用語を一挙にまとめた以下の記事も合わせて要チェックです!
目次
ニューラルネットワークとは
ニューラルネットワークとは、人間の脳の仕組みを模倣して作られたアルゴリズムです。
以下の図を見てください
このようにいくつかの層に分かれていて情報が伝播していくイメージ。
一番左を入力層、一番右を出力層と言います。
入力層と出力層の間にある層のことを隠れ層とか中間層とか言います。
層の中の青い〇をニューロンと言います。
ニューロンからニューロンに情報が渡る時、ある重みがかけられて、その重みによって出力の値が変わってくるんです。
そして、最終的な出力と教師データの誤差をなるべく小さくするように重みをチューニングしていくことでモデルの精度を高めていくのです。
ニューラルネットワークは入力層・隠れ層1つ・出力層の3層からなっていました。
一方、ディープラーニングは隠れ層が2つ以上のモデルを指します。
層を増やすと、その分組み合わせが爆発的に増加し計算負荷が大きくなります。
そのため従来のマシーンパワーでは計算できませんでした。
しかし昨今マシーンパワーが上がったことにより隠れ層を増やしても計算が行えるようになったんです。
そのような背景があり、台頭してきたのが「ディープラーニング」。
そのため基本的なアルゴリズムの考え方は50年以上前からあるんです。
このニューラルネットワークの仕組みはまさに人間の神経が信号を送り合い情報を伝達する姿に似ていますよね!
ニューラルネットワークの種類
続いて、そんなニューラルネットワークの種類について簡単に見ていきましょう!
ディープラーニング(ディープニューラルネットワーク)
最も有名なディープラーニング。
ディープラーニングの定義は、隠れ層が複数あるモデルですが、これ以降に紹介するモデルも場合によってはディープラーニングと紹介されていたりするので注意が必要です。
CNN(畳み込みニューラルネットワーク)
畳み込みニューラルネットワークは、画像認識などの分野でよく使われています。
基本的にニューラルネットワークは隣接する層の全てのニューロンは結合しています。
しかし畳み込みニューラルネットワークは一部のニューロンしか結合していません。
画像認識では、画像をピクセル単位に分解し隣接するピクセルを見ることで判別するので畳み込みニューラルネットワークが向いています。
以下の記事でCNNについて詳しく解説していますのでチェックしてみてください!
RNN(再帰型ニューラルネットワーク)
再帰型ニューラルネットワークは、時系列要素が組み込まれたニューラルネットワークになります。
前後の関係をかんがみることができるので自然言語処理にも向いています。
自然言語処理の発展に非常に寄与しておりGoogle翻訳などにも用いられています。
RNNをさらに進化させたLSTMも注目を集めています。
RNNについては以下の記事でPythonでの実装も合わせてまとめています!
LSTMについては以下の記事でPythonでの実装も合わせてまとめています!
GAN(敵対的生成ネットワーク)
最近注目を集めているモデル。
偽物を生成する生成器と偽物と見破る識別器をお互い争わせ、識別器が見破りにくい偽物を作ることが出来たらそれがもはや本物であるという考え方です。
GANによって実際に存在しないホテルの部屋の画像を生成したのが以下になります。
(引用元: Google-“UNSUPERVISED REPRESENTATION LEARNING WITH DEEP CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORKS” )
GANでは2つのニューラルネットワークを使います。片方がGenerator、もう片方がDiscriminator。
Generatorが生成した偽物のデータと実際に存在する本物のデータをDiscriminatorに判別させ、 Discriminatorが上手く判別できないようなデータを Generator が生成していきます。
Discriminatorはどんどん判別の難しくなるデータを上手く判別できるようにしていきます。
この学習が進むと最終的にGeneratorが生成される画像は本物にきわめて近くなっているという手法です。
ニューラルネットワークをRで実装してみよう!
それでは、最後にニューラルネットワークをRで実装してみます。
ニューラルネットワーク自体はパッケージが用意されているので非常に簡単に実装することが可能です。
有名なタイタニックのデータを用います。Kaggleの公式サイトからデータをダウンロードできます。
まず、データのクレンジングを行い、欠損値は削除、不要と考えられる項目は削除しました。
項目8つ
Survived:生死 pclass:客室のクラス sex:性別 age:年齢 sibsp:兄弟・配偶者の数 parch:親・子供の数 fare:乗船料金 embarked:乗船した港
サンプル数714
この時、生死を目的変数としそれ以外を説明変数とします。
サンプル数714のうちランダムに400個のデータを取り出し学習データとし、残りの314を予測データとします。
学習データで予測モデルを作り、予測データにあてはめ真値と予測値の判別率を精度として比較します。
シミュレーション回数は10回とし、上記の手順を10回繰り返し、結果を平均したものを最終アウトプットとします。シミュレーション回数をもっと増やせば精度の信頼性は上がります。
ニューラルネットワークをランダムフォレスト、サポートベクターマシン、ナイーブベイズ、ニューラルネットワーク、XGboost、k近傍法の5手法と比較します!
基本的に引数は全部デフォルトで!果たして結果はどうなるでしょうか!
nnetというパッケージに入っているnnetという関数を用いて解析を行っていきます。
##ニューラルネット##
nn<-nnet(Survived~.,train.data,size=5)
test.data.nn<-cbind(test.data,”predict”=round(predict(nn,test.data),0))
result[i,4]<-sum(test.data.nn$predict==test.data.nn$Survived)/nrow(test.data.nn)
データ加工は描画でいくつかコードを書いていますが、実際にランダムフォレストを行っているのはこの数行!
Survived~.はSurvivedを目的変数としてそれ以外を説明変数にするよーということです。
結果は以下のようになりました!
それぞれBayes(ナイーブベイズ)、knn(k近傍法)、NN(ニューラルネットワーク)、RF(ランダムフォレスト)、SVM(サポートベクターマシン)、xgb(XGboost)と表示しています。
やはりランダムフォレスト・SVM・XGboostあたりが強いですね!
他の手法についても是非見てみてください!
今回はパラメータをいじらずデフォルト設定で行ったためグリッドサーチなどでチューニングを行えば、もっと良い精度が出るでしょう。
ニューラルネットワーク まとめ
ニューラルネットワークはこれからも応用が期待される手法であり、形を変えて様々な分野で活用されています。
これからもニューラルネットワークの発展をウォッチしていきたいですね!
最後にニューラルネットワークについてまとめておきましょう!
・人間の神経回路を模倣したモデル
・実は50年ほど前からある古いモデル
・CNN・RNNなど派生手法が複数ある
ニューラルネットワークという言葉は出てきませんが、パーセプトロンによる識別という文脈で以下の書籍でまとめられていますので、より深く勉強したいという方はオススメです!
他の機械学習手法についてもっと詳しく知りたい方は以下の記事でまとめていますのでチェックしてみてください!
ニューラルネットワークを深めてディープラーニングに進みたい方は以下の記事をチェックしてみてください!
今回はRでの実装でしたがPythonを学びたいという方は以下の記事でまとめているのでチェックしてみてください!
もしこれらを包括的により深く学びたい方は、当メディアが運営している「スタアカ(スタビジアカデミー)」を是非チェックしてみてください!
格安でデータサイエンスが一通り学べます!ご受講お待ちしております!