はじめに
今回は、TensorFlowの使い方などは紹介しません。
知識的にどんな準備があれば、TensorFlowでどんなことができるか。
についてお話します。
始める前の準備
プログラミング
Pythonの知識が必要です。
TensorFlowでは、ChainerやKerasのように学習を一行で書くことはできませんし、後々複雑な処理を入れたいならば自分で書いたほうがいいでしょう。
ただし、学習のコードというのは単に
1.フィードフォワードで出力を獲得し
2.損失の値を計算し
3.バックプロパゲーションし
4.パラメータを更新する
というものをfor文で書くというだけでのことで、例えばバックプロパゲーション自体はTensorFlowがやってくれます。
ともかくPythonの基礎的な構文は書けるように準備しておきましょう。
ニューラルネットワーク
当然ニューラルネットワークのことはある程度知っておいたほうがいいです。
最初は単純な単層ニューラルネットから始めればいいでしょう。その後、多層化してみたり、畳込みなどをやっていけばいいです。
複雑なニューラルネットをやろうと思っており、自分は普通のニューラルネットを使わないよ、という場合でも、3層のニューラルネットくらいはしっかり理解してください。
逆にここが理解できれば、だいぶ楽になります。
具体的には、3層のニューラルネットにおいての
1.フィードフォワードで出力を獲得し
2.損失の値を計算し
3.バックプロパゲーションし
4.パラメータを更新する
に相当する処理を理解することです。できれば数式ベースでやったほうがいいでしょう。
数式を避けていたら、一見ニューラルネットを使いこなしているように見えて、ニューラルネットのお化けに操られているだけになってしまいます。やけに複雑な構造を試してみて、その学習に時間と資源を費やすだけです。
たしかに上記の処理はTensorFlowがやってくれます。しかしそれはなぜかというと、どんなニューラルネットでも共通の処理だからモジュール化してしまおうという発想があったからです。
逆に言えば、TensorFlowによってモジュール化されている処理の中身を理解したならば、その処理はニューラルネットの様々な場所で使われているわけで、かなりのことを理解したことになります。
数式的な鬼門はバックプロパゲーションを理解することかもしれません。
以下の記事はこの部分で参考になるものたちです。
そう言えばバックプロパゲーションについての記事を書いていないようです。
いずれ、書きます。
テンソルのこと
テンソルのなんていかにも難しそうな言葉ですが、TensorFlowでいうところのテンソルとは、データ型のことです。多次元配列データだと考えれば良くそれ以上に難しく考える必要などありません。
数学的なテンソルの知識など全く持って必要とされておらず、怖気づくことなど全くないのです。テンソルが単なるデータ型だと思えたならば、テンソルなんかよりもリストの方がよっぽど複雑だと思えるでしょう。
時折、○階テンソルの積になるだとか出てきますが、大抵○階のテンソル同士の要素を掛けているだけだったり、行列の積だったり、大したことはしていません。
数学でのテンソル積(あるいは分解)って、もっと複雑です。初学者が誤ってテンソルのことを数学に意味で調べた時には泡を吹くでしょう。全く関係ない別物くらいの気持ちで構いません。
ともかく単なる多次元配列だなと意識して取り組めばいいでしょう。間違えて数学の意味で調べたりしないようにしてください。
動かしながら検討
様々なタイプのニューラルネット
今は、畳み込みニューラルネットワークとLSTM(あるいはGRU)がそれぞれ活躍していますが、ニューラルネットの基礎をおさえたならば、全くの別物に見えるということはないでしょう。ニューラルネットの結合のさせ方を工夫してあるだけであって、やはりニューラルネットワークです。数式上は畳み込みニューラルネットワークが複雑に見えてしまうかもしれません。
これらは画像データを普通のニューラルネットと畳み込みニューラルネットで比較してみたり、時系列データを普通のニューラルネットとLSTMで比較してみたりすれば、効力を理解できるでしょう。
そして、違いが出たならば、その効果がニューラルネットのどのような構造に由来するのかを理解しながら進めてください。闇雲に複雑にするだけなのは、計算機丸投げで何も面白くないです。
畳み込みニューラルネットやLSTMの基礎となるRNNについては以下の記事が有用です。
以下の記事で説明される構造が、それぞれ画像データや時系列データに有効に働きます。
更に詳しくやるならば(畳込みニューラルネットのプーリング層の役割や、LSTMの各層の役割など)、基本的なプログラムを動かしてからということでいいでしょう。
そこまでの完全な理解を待ってからでは、始まるのがいつになるか分かりません。
更に理解を深める
インターネット上でいい記事がたくさんあります。
私の最もおすすめする理解の深め方は、「もしそれがなかったらどうなるのか」を考えることです。それは結局、「それがなかった時代での問題点」を把握すればいいわけで、結局は発展の歴史を見ることに集約されます。
伝統的、古典的技術を学ぶ必要性というのは、その技術の利用の有無に関わらず、新技術への理解を深めることにも繋がるのです。
例えば、LSTMの歴史については以下の記事がとても参考になります。
いきなり読むと厳しいですが、ある程度触れた後、更に理解を深める段階で読むと得るものが多いでしょう。