2022-04-10

"ゼロから作る Deep Learning - Python で学ぶディープラーニングの理論と実装" 斎藤康毅 著

近年、ディープラーニングに関するライブラリやフレームワークに、よく出くわす。今更、ゼロからやらんでも。いや、ディープに知りたければそれも悪くない。
ライブラリやフレームワークは、あくまでも道具。道具ってやつは、どうなに便利なヤツでも、仕組みや背景を理解した上で使わなければ振り回されるのがオチ。自分が作っているという意識は薄れ、誰かに作らされているという意識が膨れ上がる。自由意志の獲得に平坦な道のりはない。でも、その試行錯誤のプロセスは楽しい...

人工知能ってヤツは、人間の行為を卒なくやってのけるだけでなく、人間までも凌駕しようとする。人間社会を機能させるのに、なにも人間自身が主役である必要はない。皆が皆、機械の奴隷と化せば、夢にまで見た真の平等社会が実現されるではないか。人間が合理的に生きるなんて、らしくない。実に、らしくない。滑稽に生きるからこそ人間味あふれる。それを、人工知能が教えてくれる...

さて、本書は、データサイエンスの分野で幅広く用いられる Python を題材に、実装の観点からディープラーニングを紹介してくれる。数値演算ライブラリ NumPy や SciPy、あるいは、描画ライブラリ Matplotlib の導入など Python 入門に始まるが、そこまでやらんでも。なるほど、ゼロから...
逆に、Caffe,TensorFlow, Chainer,Theano といったフレームワークは意図的に避けている。なるほど、ゼロから...

ここでは、パーセプトロンという根源的なアルゴリズムや、ノードに用いられる単純な活性化関数などの紹介に始まり、これらの要素が層を深めながら学習モデルを構築していく様子を物語ってくれる。
ちなみに、活性化関数は、個人的には伝達関数と呼ぶ方がしっくりくる。シナプスがイメージできるから...
活性化関数では、ステップ関数、シグモイド関数、ReLU 関数、ソフトマックス関数といったものが紹介され、いずれも、ある閾値で状態が変化するような非線形関数を基本としている。非線形というからにはデジタル的であり、シャノンが提示した情報理論にも通ずるものがある。それは、2 を底とする対数に看取られた世界... 2 の冪乗に看取られた世界...
そして、これら単純な要素が複雑に関係を持ちながらネットワークを形成していくわけだが、局所的には非線形でも、層を深くして各々が関係を持ち始めると、全体としては線形的な振る舞いを始める。偏微分方程式の振る舞いを繋ぎ合わせてモデリングするようなイメージとでも言おうか。線形的な振る舞いとは、意志のようなものであろうか...

「パーセプトロンは、線形分離可能な問題であれば、データから自動で学習することは可能です。有限回の学習によって、線形分離可能な問題が解けることは『パーセプトロンの収束定理』として知られています。しかし、非線形分離問題は自動で学習することができません。」

そもそも、ディープラーニングとは何であろう。それは、層を深くしたディープなニューラルネットワークを言うらしい。
では、ニューラルネットワークとは何であろう。脳内で神経系を形成するニューロンと対比して論じられるのをよく見かけるが、その特徴はデータから学習するところにある。データから学習するとは、パラメータの重みをデータから自動で決定できるということ。
では、学習とは何であろう。それは、獲得した知識をフィードバックして次の行動に活かすこと、とでもしておこうか。
そこで、合理性の観点から重要となるのが、知識に対する重みの付け方と初期値の与え方である。まず、すべての知識を同列に扱うわけにはいかない。場面によっては意味をなさない知識もあれば、却って邪魔をする知識もある。ましてや、情報の溢れる現代社会では。
したがって、数多くの入力データに重みをつけながら、不要なものはあっさりと排除していく。そうでなければ、合理的にインテリジェンスな出力を得ることはできまい。
しかしながら、人間ってやつは苦労して獲得した知識ほど重宝しがち。見返りを求めてやまない性癖は、なかなか手ごわい。
また、初めて何かを学ぼうとする時、最初に出会う手本となるものが、後の学び方に大きな影響を与える。例えば、入門書や教師と崇める人物の影響力は絶大だ。
人間の場合、運にも恵まれなければならないが、ニューラルネットワークの場合、初期値を数学的に与えることができる。統計学的な標準偏差を与えたり、ガウス分布で初期化したり... と。
初期値は、なにも個人の経験から与えられるだけではない。あらゆる方面から蓄積されたデータが活用できる。記憶とは恐ろしいものだ。記憶領域に知識を大量にダウンロードするだけで賢くなれる。人格を変えることも。処理能力さえ付いていければ、だけど...

機械学習の主役は、やはりデータか!
こいつをいかに合理的に扱うか。シンプルな最適化をディープにやってのける戦略がいる。
注目したいのは、「損失関数」という考え方である。ニューラルネットワークでは、重要度よりも損失の方を注視するという。それは、自己主張を強める人間の思考とは真逆の視点である。重さを評価するのも、軽さを評価するのも、相対的には同じはず。
しかし、人間ってヤツには、重要な情報、少なくともそう思った情報に飛びつく性癖がある。昆虫の光に集まる習性のように。
実は、物事の重要度を評価することは意外と難しい。重要なのは分かるんだけど、どれほど重要なのかとなると、なかなか手ごわい。重要な要素間で優先順位をつけることも。初期値を人間が与えることで弊害になることもある。想定外の結果が得られる場合は、ランダム値を与えた方がずっと合理的なことも多い。
そして、エラーの方を活用する方が合理的という考え方も浮かんでこよう...

本書は、損失関数の勾配を与える数値微分を効率的に計算する「誤差逆伝播法」を紹介してくれる。結果に評価を与えて、それを後方に伝播しながら各部の重みを調整するという考え方は、まさに人間がやっている学習法だ。
また、機械学習でよく問題となる「過学習」にも触れ、これを抑制するために、損失関数の重みとして L2 ノルムを加算する "Weight decay" という方法や、ノードをランダムに消去しながら学習する "Dropout" という方法を紹介してくれる。
さらに、初期値にあまり依存せず、過学習の抑制もあまり必要としない "Batch Normalization" という方法も...
うん~... 関数の損失勾配を人間の行為として眺めると、失敗の度合いと解釈できそうな気がしてくる。なるほど、失敗から学ぶ戦略かぁ。
人間どもには、成功事例から学ぼうとハウツー本に群がる習性があるが、失敗事例から学ぶ方がよほど合理的に映る、今日このごろであった...

0 コメント:

コメントを投稿