lvncerpedia

ニューラルネットワークの仕組み | Chapter 1, 深層学習(ディープラーニング) - YouTube https://www.youtube.com/watch?v=tc8RTtwvd5U

これは数字の3です。 28×28 ピクセルの 超低画質に雑に書かれていますが、それでも皆さんの脳はこれを問題なく 3 として認識できます。 脳がこれを何気なくできるのってよく考えたらすごいと思いませんか。 だってこれとこれとこれも 3 ですよね。 それぞれのピクセルの具体的な値は画像 ごとに大きく異なります 皆さんの目で光を 感じて発火している細胞はこの差を見る ときとこの3を見るときで大きく異なり ますが皆さんの賢い脳はどうにかしてこれ らが同じものを表していると認識し同時に 他の画像をそれぞれ個別のものとして認識 することができます

でもちょっとここに座ってプログラムを 書いてそのプログラムに28×28 ピクセルのマス目に書かれた 0から9の数1つを当てさせてくださいと 言ったとしましょう 笑うほど簡単だった 問題が恐ろしく難しいものになりましたね

まあ皆さんが井の中の蛙でない限り機械 学習やニューラルネットワークは重要です とここで言う必要はないでしょう ここで 本当にやりたいことは ニューラルネットワークが実際どんなもの かお見せすることです 背景知識を要求せずにそしてよくわから ないものではなく数学の一つとして視覚化 したいと思います ぜひ皆さんがこの構造 自体が合理的だと感じられて今後 ニューラルネットワークのいわゆる学習に ついて見聞きした時に何を言っているのか わかるようになれば幸いです この動画では まず構造を理解しましょう シリーズの続き では学習について解説します

今回私たちは 手書きの数字を認識できるニューラル ネットワークを作っていきます これはこのトピックの導入ではまあ古典的 な例なんですが今回はこうすると嬉しい ことがあるんですね 概要欄にいくつか良いリソースを貼って おきます コードをダウンロードしてご自分 で動かせるものもあります

ニューラルネットワークにはいろんな種類 があってこうした編集の研究というのも 進んでいます

しかしこのシリーズでは一番単純な形を見 ていくことにしましょう これはより強力な現在のどの編集を理解 するのにも必要ですしまたそれ自体ある 程度複雑ですからね

でもこの一番単純な形でも手書きの数字を 認識することはできます コンピューターが できることとしては結構すごいことですよね そして同時に 我々の期待にどう応えてくれないかも わかると思います

名前の通り ニューラルネットワークは脳から発送を得 ているわけですが ニューロンとは何かどうそれらはつながっ ているかのお話をしましょう ここではニューロンと言ったらある数を 持ったものだと思ってください 具体的には0から1の値です

例えばネットワークは入力の画像の28× 28ピクセルそれぞれに対応した ニューロンから始まります 合計784のニューロンですねそれぞれが 対応するピクセルの明るさを0黒1を白と して表す明度の値を持っています このニューロンの数をアクティベーション と言います イメージとしてはアクティベーションが 高い値の時に ニューロンが点灯しているような感じです これが784のニューロンで私たちの ネットワークの最初の層が作られています さて最後の層に飛ぶとここには10個の ニューロンがあってそれぞれが数字を表し ています これらのニューロンの アクティベーションつまり0から1の間の ある数はこのシステムがどのくらい入力 画像をいずれかの数字だと思っているかを 表しています また間にいくつかの層があってこれらは 中間層とか 隠れ層と呼ばれます この数字を認識する 過程がどうなっているかはこの クエスチョンマークに隠れています このネットワークの例では中間層は2つ それぞれ16個のニューロンですがこれは単に画面に収めるためや説明しやすいため こういった数にしてあります 実際には今回のような構造でも実験の余地 はあります ネットワークはあるそうの アクティベーションが次の層の アクティベーションを決めるという仕組み になっています もちろん情報処理の メカニズムとして大事なところはこの アクティベーションの電波がどのように 起こるかですよね これはなんとなく生物の 神経細胞のネットワークに似せて作られて います いくつかのニューロンの発火が特定 の他のニューロンを発火させるようですね さて今お見せしているネットワークは すでに数字を認識できるようトレーニング されています どういうことかお見せし ましょう 画像を入力してそれぞれのピクセルの明る さに応じて入力層の784個のニューロン を点灯させます それとこの アクティベーションのパターンが次の層で 何かしら特定のパターンを作り出します さらにこれがもう一度起こって最後に出力 層に何かしらのパターンを作り出します 出力層で最も明るいニューロンが ネットワークの考えるこの画像が表す数字に対応しています

さて一つの層が次の層にどう影響するかや どのようにトレーニングするかの話の前に そもそもなぜこのような多層の構造が 賢く振る舞うと考えられるかお話しし ましょう 我々は何を期待しているんでしょうか この 中間層には何をして欲しいんでしょうか 私たちは数字を認識するとき様々な要素を 結びつけています 例えば 9 は上の方に輪っかと右の方に線がありますね 8も上の 方に輪がありますが下の輪とペアになって います 4はある3種類の線に分解すること ができるといった感じです さて理想としては出力相の一つ前の層のニューロンそれぞれがこれらの要素に対応していると良いかもしれません つまり上の 方にはがある画像8や9を入力すると アクティベーションが1に近くなるような 特定のニューロンがあってほしいです このピクセルのパターンの時じゃなくて 一般に上の方に輪がある時にこの ニューロンが反応して欲しいですね すると3番目の層から出力層に行くには 要素の組み合わせと数字の対応を学習すれ ば良いことになります もちろんこれは問題を先送りにしただけ ですね というのもこの要素をどう認識する かそもそも正しい要素が何かの問題があり ますしある層が次にどう影響するかの話を まだしていませんがもう少しお付き合い ください 和を認識することも小さな問題に 分解できます 1つ考えられる方法は和を 構成する短い線をまず認識することです 同様に1、4、7といった数字の長い線に ついてはどうでしょう これらは本当にただ 長い線かあるいはより短い線の特定の 組み合わせと考えられるかもしれません なのでネットワークの2層目のニューロン はこうした小さな線に対応していると良い かもしれません もしかしたらこうした画像が入力された時 8から10個くらいの特定の短い線に対応 した全てのニューロンが点灯してそして次 に上の方のワットを縦長の線に対応した ニューロンを点灯させて最後に 9 に対応したニューロンを点灯させるのかもしれません 実際このネットワークが今言ったように 動くのかは別としてこれはトレーニングに ついて話すときに戻ってきますがこれは 私たちが期待しているようなものです。 こう した多層構造のある種のゴールですね また このように 境界線やパターンを認識できると他の画像 認識にとても役に立つと想像できますよね さらに画像認識を超えて知的なタスクで 抽象化のレイヤーに分解して行いたいもの はいろいろあります 例えば音声の解析では まず生の音声をとって特定の音を拾って それを組み合わせて音節を作りさらに 組み合わせて単語を作ってさらにこれを 組み合わせて文節やより抽象的なことを 作ります

さてこれがどのように働くかに 戻って 具体的にどのようにある層の アクティベーションが次の層の アクティベーションを決めるかデザイン するところを考えてみてください。 コールはおそらくピクセルを短い線に、短い線をパターンに、パターンを数字に組み合わせられるようなメカニズムを作ることです。 具体例として第二層のある特定の ニューロンが 画像のこの辺りに短い線を持つか検知でき てほしいとしましょう。 問題はネットワーク にどんなパラメータを持たせるかつまり どんな動かせるつまみを持たせて様々な パターンを掴む見込みがあるような 十分表現に富んだものにできるかです。 何をするかというと第1層と第2層の ニューロンのつながりに重みをつけるん ですね この重みというのはただの数です そして第 1層のアクティベーションを全部持ってき てこの重みをつけた関の和を計算するん ですね これらの重みをそれ自身のグリッドで表す とわかりやすいと思います 緑は正の重みを青は負の重みを表していて ピクセルの明るさはおおよその重みの値を 示しています さてほとんどのピクセルの重みを0にして 問題のこの部分にだけ性能重みをつけると 重み付きの和を取った時に今考えている領域だけについて値を足していくのと同じ ことになります そして短い線がここにあるか検知したい 場合周りのピクセルに負の重みをつけたら どうでしょうか こうすると真ん中の ピクセルが明るく周りが暗い時に輪が最大 になりますね このように重み付きの輪を計算すると結果 はどんな数にもなりそうですよね しかし このネットワークではアクティベーション は0から1の間になってほしいのでこの和 を数直線を0から1の間に押しつぶすよう なある関数に通します 例えばシグモイド関数はこのような関数の 例ですね 基本的には非常に小さい入力では 0に近く 非常に大きい入力では1に近くなり 0付近では徐々に増加していくような関数 です なのでニューロンのアクティベーションは 対応する重み付きの和がどれだけ正になっ ているかを測っているんですね しかし重み付きの輪が0より大きい時に ニューロンが点灯して欲しいわけではない場合もあるかもしれません 例えば10より 大きい時にアクティブになってそれまでは 不活性になるようなバイアスが欲しいかも しれません なので重みに加えてマイナス 10のような他の数を用いてそれから シグモイド関数に代入することにします この数はバイアスと呼ばれます

重みは台2層のこのニューロンがどんな ピクセルのパターンを拾うかに対応してい てバイアスはその重み付きの和が ニューロンを活性化させるためにどれだけ 大きくないといけないかに対応しています そしてここまでの話はたった一つの ニューロンについてですよね この層の他の すべてのニューロンも第1層の784個の ピクセルのニューロンにつながっていて 784本のつながり一つ一つが重みを持っ ています またそれぞれにシグモイド関数で 潰す前に重み付きのワニ加えるバイアスと いう他の数があります これは考えることが たくさんですよね 全部で784×16+16個の数があり ます そしてこれらすべても第1層から第2層へのネットワークというだけで他の レイヤーの間のネットワークにもたくさん の重みやバイアスが割り当てられています これら全てを含めるとこのネットワークに はおよそ13000円の重みとバイアスが あります 13000円のノブやダイヤルがついてい てこのネットワークに異なる振る舞いをさ せることができるんです というわけで学習 というのはこれらのたくさんの数の上手い 設定をコンピューターに探させて問題を 解けるようにすることなんですね

ある面白いそして 恐ろしい思考実験があってこれらすべての 重みとバイアスを手作業で設定するところ を想像するというものです。 第2層が短い線 を検出し第3層がパターンを検出しという 風に目的を持って数をいじっていくといっ た感じです。 ネットワークを完全なブラックボックスと して読むよりいい考え方ではないでしょう か ネットワークが予想したように動かなかっ た時こうした重みやバイアスに慣れていれ ば構造をどのように変えて 改善していくかの取っ掛かりをつかめます からね それかネットワークが思っていたの と違う理由でうまく動いた時重みやバイアスが何をしているのか探るのは自分 の予想に疑問を投げかける良い方法です

ところでこの関数は少し書くには煩わしい と思いませんか ちょっと長いですよね そこ でこれらのつながりを表すもっと コンパクトな書き方をご紹介しましょう ニューラルネットワークについてもっと 読み進めていきたい方はこのような表記を 見ることになります 一つの層からの アクティベーション全てを一つの列に ベクトルとして並べるんですね そして全て の重みを行列にまとめますそれぞれの行は 一つの層から次の層の特定のニューロン1 つへのつながりに対応しています つまり第2層のあるニューロンについて第 1層のアクティベーションの重み付きの場 を計算することはこの行列とベクトルの積 の成分一つに対応しています。

ところで機械学習は非常に線形代数の理解と関係が深いので、ぜひ行列や行列とベクトルの積について 視覚的に理解したい方は線形代数シリーズをご覧ください。 特にチャプター3ですね。

さて話を戻してこれらの値それぞれに バイアスをいちいち加えるというのでは なくバイアスを一つのベクトルで表して このベクトルを丸ごと行列とベクトルの積 に加えるように書きます そして最後にシグモイド関数に突っ込むんですね。 これはどういう意味かというとシグモイド 関数を中身のベクトルの成分に適用する ことを表しています。 最後にこの重みの行列とこれらのベクトル をそれぞれ記号で書いてあげると1つの層 から次の層へのアクティベーションの伝播 を非常にコンパクトで綺麗な表現で書く ことができました こうすると対応する行動 がずっと単純でまた速くなります。 多くの ライブラリーが行列計算をめちゃくちゃ 最適化していますからね。

さて最初に ニューロンはただの数を持ったものといったのを思い出してください。 もちろん ニューロンが持つ数は入力する画像によって変わりますよね。 ですからそれぞれのニューロンを関数として考えた方がより正確でしょう。 前の レイヤーのニューロンの出力全てを 受け取って 0から1の数を吐き出すようなものです。 実際ネットワーク自体がただの関数で 784個の数を入力として受け取って10 個の数を返しています。 ただの関数とは言っても非常に複雑で、特定のパターンを拾う重みとバイアスの形で 13000のパラメータを持っていて行列 とベクトルの積とシグモイド関数を何度も 繰り返し計算するようなものですけどね。 でもただの関数です。 そして複雑に見えることにも納得できますよね。

というのもこれより 単純だったらどうやって手書きの数字を 認識するというんでしょうか。 ではこの ネットワークはデータを見るだけでどう 正しい重みとバイアスを学習したん でしょうか。 これは次回の動画でお話しして今見ている このネットワークが何をしているかさらに 見ていくことにしましょう。

今こそチャンネル登録してくださいという べきところなんですが現実的には多くの方はYouTubeの通知を受け取っていないですよね。 より率直に言えば YouTubeのおすすめのアルゴリズムの元となるニューラルネットワークが皆さんがこのチャンネルのコンテンツを見たがっていると思っておすすめするようにチャンネル登録をお願いします。 いずれにせよ次の動画までお待ちください。 最後に深層学習の理論面についてphdの 研究をしアンプリファイパートナーズと いうベンチャーキャピタルで働くリシャ リートのインタビューがありました。 日本語版では同様の内容を要約してお伝え します。

さて最後に手短に触れるべき点がシグモイド関数でしょう。 初期の ネットワークはこれを使って重み付きの輪 を0から1の区間に押し込んでいました。 生物のニューロンの活性化の様子から作ら れたものでしたよね。 でもシグモイド関数を 使うネットワークは現在は比較的少ないんですよね。 少し古いというかというよりも ReLU の方が 訓練しやすいようです。 レベルは正規化線形関数の略ですね これは0とAの最大値を 取るような関数でAは動画の中で説明した 形で与えられます おそらくこれは部分的には生物の アナロジーとして ニューロンは活性化されるか不活性で、ある閾値を超えたら高等関数そうでなければ ずっと0というようにいくらか単純になっていますね。 シグモイド関数は訓練の役に立たなかった というより非常に訓練しづらかったので、ある点で ReLU を試したところを非常に多 そうなニューラルネットワークについては うまくいったんですね。