ソニックの部屋

主にプログラミングに関する記事を投稿します

「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装①」を読む

気になった用語等をまとめる

Numpyまとめ

  • Numpyの配列の作成①(N次元配列)
A = np.array([1, 2], [3, 4])
=> [[1 2], [3 4]]
  • Numpyの配列の作成②
x = np.arange(0, 6, 0.1)
=> [0, 1, ..., 5.9]
  • Numpyによる多次元配列の計算
B = np.array([[5, 6], [7, 8]])
np.dot(A, B)
=> array([[19, 22], [43, 50]])
# 2つの行列で対応する次元の要素数を一致させるのがポイント
  • 次元の数え方
# 一次元配列
# 1 x 2(縦(列)、横(行)の数え方)
[1, 2]
# 二次元配列
# 3 x 2
[[1, 2], 
 [3, 4], 
 [5, 6]]
  • 指数関数の作成
a = np.array([0.3, 2.9, 4.0])
exp_a = np.exp(a) # 指数関数
=> [1.34.., 18.17.., 54.59..]
  • サンプルアップ
np.random.choice(60000, 3)
=> [2, 326, 33927]

ニューラルネットワークの学習の全体図

  • ステップ1:ミニバッチ
    • 訓練データの中からランダムにサンプルアップ
  • ステップ2:勾配の算出(誤差逆伝播法の領域)
    • パラメータに関する損失関数の勾配を求める
  • ステップ3:パラメータの更新
    • パラメータを勾配方向に微少量だけ更新する
  • ステップ4:繰り返す
    • ステップ1、2、3を繰り返す

第1章_Python入門

学んだこと

  • 1次元配列はベクトル、2次元配列は行列と呼ぶ

第2章_パーセプトロン

学んだこと

第3章_ニューラルネットワーク

学んだこと

# xは配列も可
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
  • ステップ関数は0か1、シグモイド関数は0-1を出力する
  • ステップ関数、シグモイド関数は中間層の活性化関数
  • 恒等関数(回帰)、ソフトマックス関数(分類)は出力層の活性化関数
  • 分類問題と回帰問題の考え方
人の画像を用意
→男か女か予測して分類するのは分類問題
→体重kg(数値)を予測するのは回帰問題
  • ソフトマックス関数
a = np.array([0.3, 2.9, 4.0])
exp_a = np.exp(a) # 指数関数
=> [1.34.., 18.17.., 54.59..]
sum_exp_a = np.sum(exp_a) # 指数関数の和
=> 74.12..
y = exp_a / sum_exp_a
=> [0.01.., 0.24.., 0.73] # 総和は必ず1になる(確率と考える)
# オーバーフロー対策がポイント
  • 分類問題の出力層のニューロンの数は分類したいクラスの数にする

第4章_ニューラルネットワークの学習

学んだこと

  • 訓練データで学習、テストデータでモデルの汎化能力を評価
  • 損失関数には二乗和誤差と交差エントロピー誤差がある
# 二乗和誤差
E = 1/2Σ(y-t)**2
---------------------------------
def sum_squared_error(y, t)
    return 0.5 * np.sum((y-t) ** 2)

# 交差エントロピー誤差
E = -Σtlogy
---------------------------------
def cross_entropy_error(y, t)
    delta = 1e-7
    return -np.sum(t * np.log(y + delta))
# deltaはマイナス無限大を発生させないように微小な値を追加している
  • 訓練データからサンプルを選び学習することをミニバッチ学習という
  • 学習は損失関数の値が小さくなるようにパラメータを更新すること
  • パラメータの損失関数に対する微分(勾配)を手がかりにパラメータを更新していく
  • 微分とはある瞬間の変化量を表すのでパラメータを変化させた時の損失関数の変化量を見ていく
考え方
L:損失関数、W:パラメータ
微分ΔL/ΔWの値がマイナスであればパラメータは正の方向へ変化させることで損失関数を減少させることができる
微分ΔL/ΔWの値がプラスであればパラメータは負の方向へ変化させることで損失関数を減少させることができる
  • 勾配法の学習率は1回の学習でどれだけパラメータを更新するかの指標
  • 学習率は大きすぎても小さすぎてもNG
  • 学習率のような人間の手で設定されるパラメータをハイパーパラメータという(重みやバイアスとは異なる)
  • 数値微分より誤差逆伝播法の方が高速に勾配を求めることができる

第5章_誤差逆伝播

学んだこと

  • ノード間を結ぶ直線をエッジという
  • 計算グラフの利点は逆伝播によって微分を効率よく求めることができること
  • 連鎖率とは合成関数の微分であり合成関数の微分は合成関数を構成する各々の関数の微分の積となる
  • 逆伝播が行なっていることは連鎖率、つまり計算グラフの逆伝播が連鎖率により成り立っている
  • 加算ノードの逆伝播は入力信号を次のノードへ出力するだけ
  • 乗算ノードの逆伝播は順伝播の時の入力信号をひっくり返した値を乗じる
  • Sigmoidレイヤの逆伝播は順伝播の出力のみから算定可能
  • ニューラルネットワークの順伝播で行う行列の積をアフィン変換という
  • ソフトマックス関数は入力された値を正規化して出力する(=出力の和が1になるように変形する)
  • ニューラルネットワークの逆伝播ではソフトマックス関数の出力と正解データの差分が前レイヤへ伝わっていく
  • ニューラルネットワークの学習の目的は出力を正解データに近づけるようにパラメータを調整すること
  • よって出力と正解データの誤差を効率良く前レイヤに伝える必要がある
  • 数値微分誤差逆伝播法の検算用に使う
  • レイヤごとにforwardとbackwardを実装し勾配を効率的に求める

第6章_学習に関するテクニック

学んだこと

  • SGD確率的勾配降下法)は伸びた形の関数だと勾配によるパラメータの探索が非効率となる
  • よって他にMomentum, AdaGrad, Adamなどがある
  • 重みの初期値が重要
  • Batch Normalizationによりデータ分布の正規化を行い学習を早く進めることができ初期値に対してロバスト(依存しない)になる
  • 過学習を抑えるためにWeight decay, Dropoutがある
  • ハイパーパラメータの探索は良い値が存在する範囲を徐々に絞り込みながら進める

第7章_CNN(畳み込みニューラルネットワーク→画像を扱う分野で必須)

学んだこと

  • Affineレイヤ(全結合層)は隣接する全てのニューロン間で結合がある
  • 全結合のNNは「Affine-ReLU」の組み合わせが何層も続き、最後に「Affine-Softmax」で最終的な結果を出力する
  • CNNはConvolutionレイヤ(畳み込み層)とPoolingレイヤ(プーリング層)が加わる
  • 「Convolution-ReLU-(Pooling)」の組み合わせが何層も続き、最後に「Affine-ReLU」を通して「Affine-Softmax」で最終的な結果を出力する
  • Affineレイヤの問題点は形状を無視して全ての入力データを1次元(平ら)にする
  • CNNは形状を維持して全ての入力データを同じ次元で次の層に送る(だから画像データ等に適用される)
  • 畳み込み層ではフィルター演算を行う
    • フィルターのパラメータが「重み」に対応する
    • チャンネルが複数ある場合はチャンネルごとに入力データとフィルターの畳み込み演算を行いそれらの結果を加算して一つの出力を得る
    • 入力データとフィルターのチャンネル数は必ず同じにする
    • 出力を複数持たせるにはフィルターを複数にする
  • プーリング層は入力データの縦横方向の空間を小さくする
    • 縦横の最大値を取るMaxプーリングが主流
    • 学習するパラメータなし
    • チャンネル数に変化なし
  • CNNでは各層を流れるデータは4次元(ex. (10, 1, 28, 28)は1チャンネル、高さ28、幅28のデータが10個)
  • im2col関数で入力データを4次元から2次元にして(展開して)フィルターを乗じて最終的に4次元データに直して計算していく
  • CNNは学習によって規則性のあるフィルターに更新される
  • 規則性のあるフィルターによりエッジ(色が変化する境目)やブロブ(局所的に塊のある領域) が抽出される
  • 代表的なCNNにLeNet, AlexNet
CNN用語集 説明
特徴マップ 畳み込み層の入出力データ
フィルター 入力データに乗じるもの。カーネルともいう
パディング 入力データ周囲に固定のデータを入れる。出力サイズを調整するため。大きいと出力サイズが大きくなる
ストライド フィルターを適用する位置の間隔。出力サイズを調整するため。大きいと出力サイズが小さくなる
チャンネル 奥行き

第8章_ディープラーニング

学んだこと

  • ディープラーニングとは層を深くしたニューラルネットワーク
  • 層を深くすることでパラメータを減らせる
  • 層を深くすることで学習データを減らせる
  • 有名なネットワークとしてはVGG, GoogLeNet, ResNet
  • GPU, 分散学習等で高速化
  • 物体検出, 画像生成等で幅広い分野で応用可能

参考文献
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
斎藤 康毅 (著)/オライリージャパン/2022