諸概念の迷宮(Things got frantic)

歴史とは何か。それは「専有(occupation)=自由(liberty)」と「消費(demand)=生産(Supply)」と「実証主義(positivism)=権威主義(Authoritarianism)」「敵友主義=適応主義(Snobbism)」を巡る虚々実々の駆け引きの積み重ねではなかったか。その部分だけ抽出して並べると、一体どんな歴史観が浮かび上がってくるのか。はてさて全体像はどうなるやら。

【ディープラーニング】「成功は失敗の父、失敗は成功の母」なる入れ子構造

f:id:ochimusha01:20190503224551p:plain

ディープラーニング分野で成功を収めるのに必要な技術とは?

機械学習ディープラーニングを理解できるようになったのは、担当する『ラズパイマガジン』で機械学習の連載を執筆してもらっている赤石雅典氏にポイントを教えてもらったからだ。赤石氏は、日本IBMでワトソン&クラウドプラットフォーム事業部に所属し、金沢工業大学虎ノ門大学院でAI技術の講師も務めている。

赤石氏によれば、ディープラーニングで使う数学の分野はかなり限られるという。必要な分野だけ勉強すれば、最短コースでディープラーニングを理解できるのだ。

必要な数学は「微分積分」「ベクトル・行列」「指数関数・対数関数」「多変数関数の微分偏微分)」「確率・統計」の5分野。広そうに見えるが、各分野の中で使う概念はごく一部だ。例えば、積分ディープラーニングではほとんど使わない。基礎的な考え方をざっくり理解していれば十分だ。ベクトルや指数、対数などは、高校で習った基本を部分的に復習すれば事足りる(筆者を含め、多くの人が忘れているだろう対数は特に重要だ)。

一方の微分は、ディープラーニングの理解に欠かせない中核となる概念である。大学で習う「偏微分」まで、もう当たり前のようにどんどん出てくる。特に重要な概念に「合成関数の微分」がある。これが分かると、ディープラーニングの世界にぐっと近づいてくる。

そんな端から深層ニューラルネットワーク積分表現について新しい展開が…特徴量エンジニアリングの難易度の高さが今日のディープラーニング・ブームの発端なのに、その学習内容を積分によって近似的に数式化する技術が登場とは!?

 そう「抜け道」なんて存在しないのです。現在では時代遅れと目されてる技術の中に次世代の最先端を走る鍵が隠されていたりする訳で…

ニューラルネットワーク」の理論は、AIへのアプローチのなかでも最初期のもののひとつで、1950年代後半に登場した。研究者たちが取り組んだのは、神経科学における脳細胞の機能の仕方を数理的モデルに応用することである。

こうして構築された数理モデルには、(表面的にはニューロンに似たシンプルなノードを通じてフィルタリングすることによって、データをカテゴリーに分類することを学ぶ能力がある。

初期の成功例はパーセプトロンで、このニューラルネットワークはスクリーンに映し出されたパターンを認識することができた。しかし、より複雑なことをやらせるためにニューロン階層を多層化した場合に、ネットワークをどう訓練すればいいのかがわからなかった。

このディープ(多層ニューラルネットワークの訓練という問題の解決策を見つけたのがヒントンだ。彼は1986年に発表した共同論文で、バックプロパゲーションと呼ばれる機械学習アルゴリズムを提示した。バックプロップとして知られるもので、いまでこそ深層学習で特に重要な考え方として広く知られているが、当時はそんなことはなかった。

ルカンは次のように振り返る。「90年代半ばから2000年代半ばまでの10年間は空白期間でした。わたしたちのようにごく少数の変わり者以外は、ニューラルネットワークに取り組む研究者などいなかったのです

ルカンの功績のひとつに「畳み込みニューラルネットワークConvNet)」と呼ばれる画像認識に適したネットワークの開発が挙げられる。80年代後半にベル研究所に在籍していたとき、手書きの郵便番号を認識できるソフトウェアを開発して、ConvNetの実用化が可能であることを証明したのだ。

一方、ベンジオは深層学習を会話やテキストといったシークエンスに適用するための理論を研究した。ただ、世界が深層学習に注目し始めたのはここ数年で、研究者たちがこのアルゴリズムGPUに応用する方法を開発して以降の話になる。

重要な契機となる出来事が起きたのは2012年だ。当時、トロント大学の教授だったヒントンの率いるチームが、画像認識ソフトウェアの大会で優勝したのだ。深層学習を使ったヒントンたちのプログラムはまさに圧倒的な強さを見せた。10万枚以上の画像を1,000のカテゴリーに分類するという課題で、正答率は約85パーセントと前年の優勝記録を10ポイントも上回った。

2013年には、ヒントンがチームのメンバーだったトロント大学の院生ふたりと立ち上げたDNNresearchというスタートアップをグーグルが買収した。ヒントンは以来、グーグルで働いている。同じ年にフェイスブックはルカンを迎え入れた。

ヒントンはこう話す。「過去を振り返って、科学が機能したのは実際にそうあるべきものだったからだと言うことはできます。ただ、それは現在の最先端より明らかに優れた結果を出したからです。当時の人々は、わたしたちのやっていることに対して懐疑的でしたよ

自分たちが時代遅れと思われていた理論にこだわり続けたのは、3人とも心の奥底では自らを異端児とみなしていたからだと、ヒントンは言う。それがいまでは、学術界やテック産業の中心にいる。

第二世代人工知能ブームの頃(1980年代〜1990年代前半)にはCPUパワーもメモリやストレージの容量も圧倒的に不足していて、そもそも(組合せ爆発への恐怖から)S層(感覚層、入力層)とR層(反応層、出力層)を結ぶA層(連合層、中間層)を多層化するという発想自体を持ち得なかったのでした。
*そもそも単純パーセプトロンから多層パーセプトロンへの飛躍の鍵となったシグモイド関数、実は既にロジスティック回帰と等価とされた1957年のオリジナル論文で採用済み。ただ当時のコンピューターでは重過ぎてそのままの形では動かせなかったのである。

パーセプトロン(Perceptron) - Wikipedia

人工ニューロンニューラルネットワークの一種である。心理学者・計算機科学者のフランク・ローゼンブラットが1957年に考案し、1958年に論文を発表した。モデルは同じく1958年に発表されたロジスティック回帰と等価である。

視覚と脳の機能をモデル化したものであり、パターン認識を行う。シンプルなネットワークでありながら学習能力を持つ。1960年代に爆発的なニューラルネットブームを巻き起こしたが、1969年に人工知能学者マービン・ミンスキーらによって線形分離可能なものしか学習できないことが指摘されたことによって下火となった。

他の研究者によってさまざまな変種が考案されており、ニューロン階層を多層化し入出力が二値から実数になったボルツマンマシン(1985年)やバックプロパゲーション(1986年)などによって再び注目を集めた。2009年現在でも広く使われている機械学習アルゴリズムの基礎となっている。

形式ニューロン(formal neuron)あるいはThreshold Logic Unit - Wikipedia

1943年に神経生理学者・外科医であるウォーレン・マカロックと論理学者・数学者であるウォルター・ピッツが発表した科学史上初の人工ニューロンartificial neuron)。伝達関数としてはヘヴィサイドの階段関数を使い、入出力の値は 0 または 1 の二値だけをとる。

パーセプトロンPerceptron

ローゼンブラットはこの形式ニューロンの考え方を基にしてパーセプトロンを開発した。S層(感覚層、入力層)、A層(連合層、中間層)、R層(反応層、出力層)の3つの部分からなる。S層とA層の間はランダムに接続されている。S層には外部から信号が与えられる。A層はS層からの情報を元に反応する。R層はA層の答えに重みづけをして、多数決を行い、答えを出す。
*ただし理論そのままの形で実装しようとすると組合せ爆発を引き起こしてしまう。

1970年頃、デビッド・マーとジェームズ・アルブスによって小脳はパーセプトロンであるという仮説が相次いで提唱された。後に神経生理学者伊藤正男らの前庭動眼反射に関する研究によって、平行繊維-プルキンエ細胞間のシナプスの長期抑圧(LTD, long-term depression)が見つかったことで、小脳パーセプトロン説は支持されている。

単純パーセプトロンSimple perceptron

入力層と出力層のみの2層からなり、線形非分離な問題を解けないことがマービン・ミンスキーシーモア・パパートによって指摘された。

多層パーセプトロンMultilayer perceptron、略称:MLP

デビッド・ラメルハートとジェームズ・マクレランドはパーセプトロンを多層にし、バックプロパゲーション誤差逆伝播学習法)で学習させることで、線型分離不可能な問題が解けるようにし単純パーセプトロンの限界を克服した。

ヘヴィサイドの階段関数(Heaviside step function) - Wikipedia

ステップ関数は入力値が負であれば0を、入力値が正であれば入力値を出力します。

#ステップ関数
Step<-function(x){ifelse(x > 0, 1, 0)}
plot(Step,xlim=c(-4,4),ylim=c(0,1),type="l",main="Step", xlab="x", ylab="if(x > 0) 1 else 0")

f:id:ochimusha01:20190506065200j:plain
注意点:RではStep<-function(x){if (x < 0) {return(0)} else {return(1)}}だと「条件が長さが 2 以上なので、最初の 1 つだけが使われます」エラーとなる。

*ただし、ステップ関数を使った単純パーセプトロンにはXOR問題が解けない。

*そこでシグモイド関数やReLU関数が登場。

シグモイド関数は入力値が大きければ大きいほど出力値が1に漸近し,入力値が小さければ小さいほど出力値が0に漸近します.

#シグモイド関数
sigmoid<-function(x){1/(1+exp(-x))}
plot(sigmoid,xlim=c(-4,4),ylim=c(0.0,1.0),type="l",main="Sigmoid", xlab="x", ylab="1/(1+exp(-x)")

f:id:ochimusha01:20190506045910j:plain

#微分値は最大でも0.25で, 層を増やしていくと勾配が消失する。
sigmoid01<-expression(1/(1+exp(-x)))
D(sigmoid01,"x")
exp(-x)/(1 + exp(-x))^2
sigmoid02<-function(x){exp(-x)/(1 + exp(-x))^2}
plot(sigmoid02,xlim=c(-4,4),ylim=c(0.0,1.0),type="l",main="Differential value of Sigmoid", xlab="x", ylab="exp(-x)/(1 + exp(-x))^2")

f:id:ochimusha01:20190506052445j:plain

ReLU関数は入力値が負であれば0を、入力値が正であれば入力値を出力します。

#ReLU関数
ReLU<-function(x){ifelse(x > 0, x, 0)}
plot(ReLU,xlim=c(-4,4),ylim=c(0,4),type="l",main="ReLU", xlab="x", ylab="max(0,x)") 

f:id:ochimusha01:20190506064913j:plain

*注意点:RではReLU<-function(x){if (x < 0) {return(0)} else {return(x)}}だと「条件が長さが 2 以上なので、最初の 1 つだけが使われます」エラーとなる。

*最近は活性化関数のトレンドがシグモイドからReLUに推移しているとの事。

そもそもこの界隈の最新話題は量子コンピューターとそれを利用したアルゴリズムの開発が思う様に進まない一方で(ポリゴンゲームのコモディティ化を追い風にGPUがそのベクトル処理能力を無尽蔵に伸ばしつつある辺り。何が次の時代の必須教養になるかなんて、そう簡単に予想出来る筈もない時代なんですね。