見出し画像

ゼロから作るDeep Learning 学習ノート

はじめに

曖昧だったDLの知識を補強、体系化するために読み進めることにしました。各章ごとに雑多な感想や記述と私が抜けている曖昧なキーワードの定義などを書いていきます。基本的にキーワードは本書中で用いられている定義を書いています。理解を深めるような問題も書いているので本書をお持ちのかたは取り組んでみてください。


一章

pythonやライブラリの解説。既知なので飛ばした。

二章

論理回路の授業を履修していたので、つまずくことはない。XORゲートをどうやってAND,NAND,ORを用いて表現しようか迷ったくらい。パーセプトロンはアルゴリズムである。低レイヤー層理解のために空いた時間でNANDゲートからコンピュータを作る本「コンピュータシステムの理論と実装」をこなしたい。

三章

本格的にニューラルネットワークのモデルの解説に入る章。ここら辺から用語の定義の記憶が曖昧なものが多い。単純パーセプトロンはパラメタを手動で決める。ニューラルネットワークはパラメタが機械的に決まる。辞書型変数を作る間数の作り方が曖昧かも。一般的にニューラルネットワークは回帰問題において活性化間数は恒等関数、分類問題での活性化間数はsoftmax間数を用いる。よく忘れがちなので注意したいが、例えば9.99e-01は9.99*10**(-1)の意味である。softmax間数は入力の値の大きさは関係ない、つまり各要素の大小関係のみが重要ということ。sigmoid関数やsoftmax間数は下記のアイシアさんの動画を参照すると理解しやすい。画像データに関する知識が抜けていたため、本書では立ち入っていないが、「<補足>画像データ」についてに軽くまとめた。


キーワード

活性化間数(activation fuction):入力信号の総和を出力関数に変換する関数
単純パーセプトロン:単層のネットワーク、活性化間数にステップ関数(閾値を境に出力が切り替わる)を使用したモデル
多層パーセプトロン:ニューラルネットワークを指す。
ニューラルネットワーク:多層で、シグモイド関数などの滑らかな活性化間数を使用するネットワーク
ReLU(Rectified Linear Unit):x>0はx、x<=0は0の関数。最近はニューラルネットワークの活性化間数はシグモイドからReLUに移行している。(rectifyは誤りを修正するという意味)
恒等関数:入力をそのまま出力する間数
forward:入力から出力方向への伝達処理
backward:出力から入力方向への伝達処理
正規化(normalization):データをある決まった範囲に変換する処理のこと。ex.0~255の数字を255で除算して0~1の範囲に収まるように変換
前処理(pre-processing):ニューラルネットワークの入力データに対して何らかの決まった変換を行うこと
白色化(whitening):データ全体の分布の形状を均一にすること
バッチ(batch):まとまりのある入力データのこと(バッチは束という意味)

問題

Q1.なぜニューラルネットワークの活性化間数には非線形関数でないといけないのか?線形関数を多層で用いる問題点に基づいて述べよ。(答p51)
Q2.オーバーフロー対策としてsoftmax間数を実装する上でどのような工夫が必要か?定数、最大値というキーワードを用いて述べよ。(答p69)
Q3.大きな配列を一度に計算することと、小さな配列を何度も計算すること、どちらが1枚あたりの処理時間を短縮できますか?(答p79)

<補足>画像データについて

画像データについて軽くまとめる。
画像のサイズ(Dimensions):画像のサイズは、縦(高さ)×横(幅)のピクセル数で表されます
チャンネル(Channels):チャンネルは、画像の各ピクセルに対応する色や情報の種類を表す。モノクロは1チャンネル、カラーは3チャンネル
グレースケール画像(1チャンネル(モノクロ)):各ピクセルは、0から255の範囲で輝度(明るさ)の値を持つ。値が0の場合は黒、255の場合は白、他の値はその間の灰色。
カラー画像(3チャンネル(RGB)):各ピクセルは3つの値を持ち、赤 (Red)、緑 (Green)、青 (Blue) の3色の強度を表す。これをRGB形式という。各チャンネルの値は0から255の範囲で動く。ex.(255,0,0)は赤色のピクセル

ex:640×480×3 が意味するのは、これは640ピクセルの幅、480ピクセルの高さ、そして3つのチャンネル(R, G, B)を持つことを意味する。
ex:640×480×1 は、1チャンネルのみを持つモノクロ画像

ピクセル(Pixel)(Picture Elementの略):デジタル画像を構成する最小の単位。ピクセルは、画像の中で特定の位置を持つ色や輝度の情報を表す小さな点。
ピクセル密度(解像度):解像度が高いというのは、ある領域内のピクセル密度が高いことを意味する

四章

この章はニューラルネットワークの学習に関する章。パーセプトロンは線形分離可能な問題であればデータから自動的に学習可能。これは「パーセプトロンの収束定理」として知られている。ただし、非線形分離問題は自動で学習できない。機械学習では特微量は人間が設計する必要があるが、ニューラルネットワークでは特微量も機械が自動で学習できる。訓練データを用いて学習するというのは、訓練データに対する損失関数を求めて最適なパラメタを見つけること。なので全ての訓練データを対象として損失関数を求める必要がある。数値微分は誤差が生じるので改善点を考えないといけないが、解析的に微分を求めた場合は誤差は含まれないと考える。勾配が指す方向は各地点において関数の値を最も減らす方向。途中でpythonのクラスについて理解が曖昧なことに気づいたので下記のサプーさんの動画を視聴した。ミニマムでわかりやすい。なぜ損失関数をわざわざ導入するかについては、4章を最後まで読んでからのほうが理解しやすいので4.2.5で詰まっても、無視して先に行ったほうがいい。一つ疑問なのはepochの説明で訓練データを全て使い切ったとき1epochとするとされていたが、np.random.choiceの引数でreplaceを指定していないためミニバッチは重複ありになっているが、使い切ったと言えるのか疑問。調べたので補足に書いておく。


キーワード

特微量:入力データから本質的なデータを的確に抽出できるように設計された変換器
損失関数(loss function):ニューラルネットワークにて最適なパラメタ探索のための性能の悪さを示す指標。任意の関数でいいが、2乗和誤差や交差エントロピーなどが一般的。
丸め誤差(rounding error):小数の小さな範囲が省略されることで、最終的な計算結果に誤差が生じること。つまり小さすぎる値はコンピュータが正しく表現できないということ
数値微分(numerical differentiation):微小な差分によって微分を求めること
解析的(analytic):数式の展開によって微分を求めること。ex解析的に解く
勾配(gradient):すべての変数の偏微分をベクトルとしてまとめたもの
勾配法(gradient method):繰り返し勾配方向に進み関数の値を徐々に減らす方法
鞍点(あんてん)(saddle point):ある方向で見れば極大値で別の方向で見れば極小値となる点です
プラトー:学習が進まない停滞期
η(イータ):学習率(learning rate)の記号
ガウス分布:正規分布のこと

問題

Q1.ニューラルネットワークの学習の流れを「損失関数」、「パラメタ」、「勾配法」というキーワードを用いて簡潔に答えよ。(答p83)
Q2.クロスエントロピー誤差を実装する時、logの中に微小な定数を入れるのは何故?(答p91)
Q3.勾配の指す向きはどういう意味を表していますか?(答p106)
Q4.なぜ認識精度を指標にしてパラメタを更新せずに、わざわざ損失関数を導入するの?「微分」というキーワードを用いて簡潔に答えよ。(答p95)

<補足>ミニバッチの重複とepoch

結論から言うとミニバッチは重複があっても、なくても大丈夫。
重複ありの時は、ランダム性があるのでモデルが多様なパターンを学べる。
重複なしの時は、効率的に全てのデータを使える。
データが多い時は重複あり、データが少ない時は重複なし程度に考えておくといい。
ちなみにnumpy.random.choice()でreplaceを指定しなければデフォルトで重複ありになっている。

五章

重みパラメタの勾配を求める計算は今まで数値微分を使った。ただし、これは計算処理に時間がかかるため、この章からより効率的な誤差逆伝播法を学ぶ。数式と計算グラフのうち、本書では後者を使って学んでいく。数式による動画はよびのりさんを参照する。__init__でpassと書くと何もしないという意味。乗算レイヤでは順伝播でのself.x、self.yを保存して、backwardで使うためinitで初期化している。加算レイヤはそういった保存も必要ないため初期化していない。pyhtonのクラスではinitが最初に読み込まれてメソッドを呼び出すため。適切な順番の順伝播のメソッドを呼び出し、それと逆の順番で逆伝播のメソッドを呼び出すと求めたい微分が得られる。ニューラルネットワークのレイヤでのforward()、backward()の引数にはNumPyの配列が入力されることを想定している。式5-13の導出が不明。ここらへんの詳しい導出は別途、数式から誤差逆伝播法を説明しているものを参照した方がいいかも。ニューラルネットワークの学習ではsoftmaxは必要だが、推論には不必要。スコアの最大値だけあればいいから。ここらへんから自分の手でコードを書いて説明可能なレベルに落とし込む必要性が出てきた。とりあえず本書を通読し終えたら手を動かしていく。5.7.2を写経してみると理解度が深まった。

キーワード

計算グラフ(computational graph):計算の過程をグラフによって表したもの
順伝播(forward propagation):計算グラフの出発点から終着点への伝播
逆伝播(backward propagation):順伝播の逆
アフィン変換:ニューラルネットワークの順伝播で行う行列の積のこと
勾配確認(gradient check):数値微分で求めた勾配と誤差逆伝播で求めた勾配の結果が一致するか確認する作業のこと

問題

Q1.softmax間数の損失間数は何にすると逆伝播の値はきれいな結果になりますか?(答p155)
Q2.回帰問題で出力層に恒等関数を用いたとき損失関数は何にすると逆伝播の値はきれいになりますか?(答p155)

六章

optimizerのいくつかを紹介。私が前にコンペなどで実装したときは大抵Adamを使うと精度が良くなった。本書でもSGDとAdamを使うらしい。私はここらへんはざっと特徴だけ見た。sigmoidの代わりにtanh間数を活性化間数にするとアクティベーションの分布がきれいに釣鐘型になる。活性化関数に用いる関数は原点対象であることが望ましいとされている。過学習は重みの値が大きくなりすぎることで発生することが多い。*は全てという意味。np.random.rand(*x.shape)の引数はx.shapeの全ての要素を引数にするという意味。つまりxと同じ形(同じ行と同じ列)で要素が0~1の一様なランダムな配列を作成するということ。アンサンブル学習を行うと精度がわずかに上がることが実験的に知られている。droputは擬似的なアンサンブル学習。訓練データは重みやバイアスのパラメタの学習に、検証用データ(validation data)はハイパーパラメタの性能を評価するために、テストデータは汎化性能をチェックするために利用する。ハイパーパラメタは範囲を区切って、徐々に絞り込み、最終的にその範囲内で一つハイパーパラメタを決めるのが定石。ハイパーパラメタの範囲はざっくりと10のべき乗スケールで範囲を指定するのが有効

キーワード

Optimization:最適化
学習係数の減衰(learning rate decay):学習係数を最初は大きく設定し、次第に小さくしていく手法。ニューラルネットワークの学習で実際によく使われている。
アクティベーション:活性化間数の後の出力データ(文献によってはレイヤを流れるデータをアクティベーションと呼ぶこともある)
Xavierの初期値:アクティベーションの分布を多様にできるとして知られる重みの初期値。活性化間数が線形であることが前提。(sigmoidやtanhは中央付近では線形としてみなせる)
Weight decay(荷重減衰):大きな重みをもつことに対しペナルティを課し過学習を抑えようとすること。例えばL2ノルムを損失関数に加えること。

問題

Q1.重みパラメタを0にしてはいけない理由は何?また、その対処法として何を行う?(答p179)
Q2.各層のアクティベーションの分布が偏った場合のデメリットを二つあげよ。(答p182)
Q3.活性化間数にReLU関数を用いたときは何の初期値が適しているか?また活性化関数にsigmoid、tanhのようなS字カーブのときは何の初期値が適しているか?(答p184)
Q4.順伝播で小さな値(0に近い値)が流れると、逆伝播での勾配はどうなりますか?簡潔に答えよ。(答p185)
Q5.ニューラルネットワークのハイパーパラメタの最適化では規則的な探索とランダムにサンプリングして探索するほう、どちらがいいですか?(答p200)

七章

CNNは入力データの次元を保持したまま次の層に吐き出すため、画像など形状を有したデータを正しく理解できる可能性がある。畳み込みをすると入力よりサイズが小さくなっていくのでパディングをしてサイズを保っている。ストライドをすると、よりサイズを小さくできる。フィルタのチャンネル数は入力データのチャンネル数と揃えなければいけない。画像認識では主にMaxプーリングが行われる。畳み込み演算とプーリングが似ていると感じた。7.4.3のconvolutionクラスの実装は手を動かした方が良さそう。CNNの層が深くなればなるほど、物体認識の抽象度が上がることが面白い。

キーワード

特徴マップ(feature map):畳み込み層の入出力データ
入力特徴マップ(input feature map):畳み込み層の入力データ
出力特徴マップ(output feature map):畳み込み層の出力データ
im2col(image to column):日本語だと「画像から行列へ」という意味。4次元のデータを2次元に変換する関数。


八章

チャネルの数はハイパーパラメタなので表現力をあげるために徐々に増やしている。なぜチャネルを最初から64で固定しないのか?ー最初から64チャネルにすると、計算コストが高くなるだけでなく、ネットワークが単純な特徴を過剰に表現しようとし、過学習を引き起こしやすくなる。また、低レベルの特徴に対して過度なリソースを割くことで、全体のパラメータ数が増え、学習の安定性が低下する可能性もある。したがって、徐々にチャネルを増やすことで、計算効率とモデルの性能をバランスよく保つことができる。層を深くする重要性を説明できる理論はまだ不完全。受容野がよく分からない。「見る」って表現が慣れない。Xを見ていたら、この受容野を直感的に理解できる神サイトを発見したのでシェアします。転移学習面白そう。ディープラーニングでは数値精度のビット数をそこまで必要としない。ディープラーニングの応用例は興味のあるところ以外は流し読み。とりあえずCNNは応用性が高い重要な技術だと認識できた。


キーワード

受容野(receptive field):ニューロンに変化を生じさせる局所的な空間領域のこと

まとめ・感想

本書でディープラーニングの基礎技術を詳しく体系的にざっと理解していくことができた。何度か画像認識などのためにディープラーニングを軽く実装した経験はあったが、実際にその中身について知ることはなかったためちょうど良かった。この本は、私のように軽くディープラーニングを動かしたことがある人が体系的にその技術を理解したい時に必ず役立つ。今後も何度か復習することになるであろう名著。2016年のものだが2024年現在でも買った方が良い。

この記事が気に入ったらサポートをしてみませんか?