Gin04ghデータ分析業務、予測モデル開発などを担当しています。勉強してきた技術などを適当に書いていければと思います。Python、R、SAS、JavaScript、PHP、Rubyらへんが得意です。深層学習RNNの実装の勉強もしました。今回は整理と備忘録も込めて、Chainerでニューラルネットワーク、リカレントニューラルネットワーク、畳み込みニューラルネットワークの実装について記します。NN)順伝播型のニューラルネットワークです。簡単な練習問題として、アイリスのデータを分類するモデルを書きました。ニューラルネットワークを使うまでもない問題ですが、実装の仕方の勉強のため、基本的な問題にしました。各コードでやっていることを理解すると、別の問題も書くことができますし、他のニューラルネットワークへの参入もグッと楽になりました。ChainerによるNNの実装1ニューラルネットワークの実装です。https://github.com/Gin04gh/samples_py/blob/master/NeuralNetwork_Chainer_ver1.ipynb移設しました。accuracy)ChainerによるNNの実装2(classifier、training使用)今はclassifierクラス、trainingクラスを使用も推奨されていますので、同じ問題で実装したコードも記します。https://github.com/Gin04gh/samples_py/blob/master/NeuralNetwork_Chainer_ver2.ipynb移設しました。RNN)系列データを扱うことに優れた構造のニューラルネットワークです。RNNは前の時刻の隠れ層ベクトルと現時刻の入力ベクトルを使って、現在の隠れ層ベクトルを更新することで、任意の長さの入力履歴を考慮した出力を得ることができます。詳しい説明は省略しますが、これは構造的に深い層のニューラルネットワークを学習することと同じことになり、層が深いネットワークほど、勾配爆発や勾配消失といった問題により誤差が伝播しづらくなっていくため、普通に構築しただけでは、せいぜい時系列3つ4つ前程度しか記憶しません。これを改善するために、遠い隠れ層を直接参照できるような仕組み(ゲート)を加えたRNNが提案されています。unit)というものがあります。現在では、RNNといえば通常LSTMやGRUなどのゲート付きのRNNを指すことが一般的なようです。下記は、LSTMで正弦波を予測するモデルの実装になります。https://github.com/Gin04gh/samples_py/blob/master/LSTM_Chainer_ver1.ipynb移設しました。left")plt.show()ChainerによるRNN-LSTMの実装2(L.LSTM)上記の実装はLSTMのゲートがどういう構成をされているのかを理解していなければ、少し直感的にわかりづらいところもありますが、Chainerではより簡単なLSTM関数が用意されていますので、場合によればこっちの方が簡潔で良いと思います。RNNで計算した隠れ層を別の層の入力に用いるなど、複雑なネットワーク構成にする場合は、上記のコードで理解した方が自由度が高くて扱いやすいかもしれません。同じ問題で、LSTM関数を使った実装が下記になります。https://github.com/Gin04gh/samples_py/blob/master/LSTM_Chainer_ver2.ipynb移設しました。left")plt.show()RNN-LSTMの実装における、classifierクラス、trainingクラスの使用についてRNNではバッチの形や、読み込ませ方が他のモデルと若干異なるため、IteratorクラスとUpdaterクラスを自分で改修しなければならないようです。https://github.com/chainer/chainer/blob/master/examples/ptb/train_ptb.py正直、RNNを扱う機会自体そんなに多くありませんので、ここまでやる気は起きませんでしたので、実装は省略します。やらなければならなくなった際に勉強して、コードを追記することにします。追記(2017-09-23)余談ではありますが、RNNで覚えさせたベクトルを最終的に分類タスクに用いたいなどであれば、ネットワークの作り方次第で、バッチの形を他のネットワークと同じように作れますので、そのままTrainerクラスを使うことができます。下記のLSTMの実装が参考です。).push({});深層学習において文脈情報を学習させる方法としては、再帰的ニューラルネットワーク(RNN)を用いる方法と畳み込みニューラルネットワーク(CNN)を用いる方法があります。CNN)順伝播型ニューラルネットワークのような全結合層だけでなく、畳み込み層とプーリング層から構成されるニューラルネットワークです。画像処理の分野において成功を収めている手法です。これも詳しくは省略しますが、画像に対して小さな窓(フィルタ)をスライドしていきながら値を取得し、集約(最大プーリングや平均プーリング)することで、画像の特徴的な部分を抽出して、それらの情報を使ってネットワークを計算します。https://github.com/Gin04gh/samples_py/blob/master/ConvolutionalNeuralNetwork_Chainer_ver1.ipynb移設しました。test_x[i])ChainerによるCNNの実装2(classifier、training使用)こちらもclassifierクラス、trainingクラスを使用した例を記します。https://github.com/Gin04gh/samples_py/blob/master/ConvolutionalNeuralNetwork_Chainer_ver2.ipynb移設しました。ミニバッチ学習-省略-としておりました。これに対し、先日コメントで、エポックごとにoptimizerの初期化するのはなぜか、とのご質問をいただきました。これは、私が参考にしたコードがこのようになっていたため、深く考えていませんでしたが、誤りです。SGDなどの場合は、これでも問題ない(と思う)のですが、上記のようにAdamの場合は、その時のエポックでの学習率が、前のエポックでの誤差に依存するため、上記のようにオプティマイザーをエポックごとに初期化してしまうと、学習率が初期値から変化しなくなるため、不適切だと思います。ネット上でも、コードが混合していますので、注意が必要です。コメントしていただいた方、ありがとうございました。追記(2017-08-31)PyTorchの実装もまとめてみました。firm追記(2017-10-24)TensorFlowも実装してみました。).push({});今回は、TensorFlowでニューラルネットワーク、畳み込みニューラルネットワークの実装について記します。コメントをキャンセルメールアドレスが公開されることはありません。・掲載されている広告について当サイトでは、第三者配信の広告サービス(Googleアドセンス)を利用しています。使用することがあります。Googleアドセンスに関する詳細やこのような情報が広告配信事業者に使用されないようにする方法については、こちらをご参照ください。・使用しているアクセス解析ツールについて当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。このGoogleアナリティクスはトラフィックデータの収集のために『Cookie』を使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。『Cookie』を無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。この規約に関して、詳しくはこちらをご覧ください。