技術
ニューラルネットワークの中身を可視化してみる
2021-10-12T16:59:47.792Z
モチベーション
学習したニューラルネットワークの中身ってどうなっているんだろう?と思ったのがきっかけで本記事を書いてみました。
そのため、ニューラルネットワークの内部状態を観察し、実際に何が起きてるのか理解するために重みを可視化してみました!
前提
MNISTの手書き文字を分類するよう学習したネットワークの重みを可視化することでニューラルネットワークの内部状態を観察してみようと思います。
以下の画像では6の画像を入力して、出力ニューロン0~9の6番目の出力ニューロンの値が一番高いので、入力画像は6であると判断できています。
そのように判断させるためには学習が必要となります。
上記のニューラルネットワークは以下の図で示したような誤差逆伝播法で学習させました。
誤差逆伝播法を簡単に説明すると
・ ニューロンの重みWを誤差が小さくなる方向へ推移させる取り組みのこと(誤差小さくする行いをいわゆる学習と呼びます。)
・ 誤差関数の傾きが正なら重みを小さく、傾きが負なら重みを大きくしながら誤差の値を小さくする(誤差が小さくなる方向は、勾配の情報で判断する)
の2点です。
重みの可視化
まずは0に対する確率値を出力するニューロンの重みを可視化してみよう思います。
0なので最初(0番目)の出力ニューロンへの繋がりだけに注目してみましょう。
左図の最初(0番目)の出力ニューロンへの繋がりと重みだけに注目すると右図のように表現できます。
ここでXは入力画像のピクセル値、Wは重みを表しています。
上右図のモデル図を式に近い形で表現すると以下のようになります。
そして、このW1~W784が重み行列です。(この重み行列のそれぞれの値には0~255の範囲の数値が入っています。)
この構成で訓練したネットワークを例に、最初の出力ニューロンに流れ込む重みを可視化してみます。
このニューロンの役割は数字の0を識別することです。重みが最も低いところが黒(0)、最も高いところが白(255)になるように色をつけます。
なにか0のようなもの可視化されましたね。
このように見える理由は、ニューロンが何をしているのかを考えるとより明確になります。このニューロンは0を識別する役割を担っているので、0に対して高い値を、それ以外に対して低い値を出力することをゴールとしています(計算としては以下の図のような行列演算を行っています)。0に対して高い値を出力するには、0の画像の中で明るくなることが多いピクセルに対して高い重みを割り当てます。また、0以外の数字に対して比較的低い値を出力するには、0以外の画像で明るいことが多く、0の画像で暗くなるピクセルに低い重みを割り当てます。重みの図の中心部分が暗くなっているのは、0の画像ではここが大抵ピクセル値0になることが多く、他の数字では大抵明るくなるからです。
10個の出力ニューロン全てに対する重みを可視化してみる
学習の枚数毎(10000, 100000, 1000000, 10000000枚)に重みを可視化してみました。
ニューラルネットワークは学習の過程で重みを上記のように変化させています。
学習が進むにつれて、可視化された重みは徐々に数値の平均をとっているような気がします。
まとめ
今回は学習されたニューラルネットワークの内部状態(重み)を可視化してみました。
この記事を通して、ニューラルネットワークに興味を持っていただけると幸いです。
趣味はWebサービス開発やお金の勉強にハマっています。最近「英単語通知」というアプリをリリースしました。
働き方、技術、金融のジャンルに興味があるので、時間があるときにそれらに関することを書いていこうと思います。