Open14

読書メモ: 最短コースでわかるディープラーニングの数学

matsuchiyomatsuchiyo
  1. 機械学習入門
  • 人工知能
    • 機械学習

      原則1: 機械学習モデルとは入力データに対して出力データを返す関数のような働きを持ったモデルである。
      原則2: 機械学習モデルの振る舞いは、学習により規定される。

      • 教師あり学習
        • 回帰モデル

          例えば店の1日の売り上げ予測のような数値を出力するモデル
          ...
          「線形回帰」と呼ばれるモデルは、「分類」ではなく「回帰」モデルではあるのですが、今紹介した分類モデルのグループに非常ににています。先ほど説明した共通の特徴のうち(B)-(3)の活性化関数こそないものの、それ以外は(A)から(D)の条件を全て満たしています。

          • 単回帰 ⭐️本書で取り上げる

            入力変数の数が1つのモデル
            7.2 例題の問題設定

          • 重回帰 ⭐️本書で取り上げる

            入力変数の数が...2つ以上のモデル

        • 分類モデル

          写真に写っている動物の種類のような離散値を出力するモデル

          • ロジスティック回帰モデル

            上の(B)の構造を1階層持っているモデルです。

            • 2値分類 ⭐️本書で取り上げる
            • 多値分類 ⭐️本書で取り上げる
          • ニューラルネットワークモデル ⭐️本書で取り上げる

            「隠れ層」と呼ばれる中間ノードが増えてこの構造が2階層になります。

          • ディープラーニングモデル ⭐️本書で取り上げる

            同じ構造を3階層以上(隠れ層としては2階層以上)持つモデルが一般的にはディープラーニングモデルと呼ばれています。

      • 教師なし学習
      • 強化学習
赤石 雅典赤石 雅典

「ディープラーニングの数学」の著者です。
拙著をとても細かいところまでお読みいただいているようで、大変感動しました。
差し支えなければ、サポートページからリンクを張らせていただきたいんのですが、よろしいでしょうか。

matsuchiyomatsuchiyo

コメントをくださり、ありがとうございます。
サポートページからリンクしていただいて大丈夫です。

線形回帰〜ディープラーニングまで段階を踏んで説明してくださりとてもわかりやすく、7章からの実践編は特に繰り返し読みました。この本がベースとなり他の本も読むことができています。ありがとうございました!

matsuchiyomatsuchiyo

まさか筆者の方とコンタクトを取ることになるとは思っていなかったので、このメモをサポートページで取り上げていただき大変恐縮です。ありがとうございます。

matsuchiyomatsuchiyo
  1. 確率・統計
  • 6.3 尤度関数と最尤推定
    • ?: 以下について、なぜ「微分値がゼロになるときのパラメータ」が「最も確からしいパラメータの値」になるんだろう。

      そして最尤推定とは、尤度関数のパラメータで微分して、ちょうど微分値がゼロになるときのパラメータを求め、この値を「最も確からしいパラメータの値」として推定するアルゴリズムのことを言います。

      • ?: この場合、尤度関数はどんな形なのか?→ この例だと試行回数5回だから、5次関数になるはず。
      • → 対数尤度 log(p^2(1-p)^3) = 2logp + 3log(1-p)は、2logpが右肩上がりで、3log(1-p)が右肩下がりになって、2logp + 3log(1-p)は山形になるのかな(グラフを書いてみたい)?そうであれば、「微分値がゼロになるときのパラメータ」が「最も確からしいパラメータの値」になることに納得できる。
        • → その通りだった。その先にグラフが載ってた。
    • (6.3.2)の式のうち、3log(1-p)の微分の部分では、合成関数の微分を使っている。その旨を書いて欲しかった。理解するのに時間がかかってしまった。
      • 8章の同じような計算の箇所(交差エントロピー関数の微分)では、合成関数の微分を使っている旨書いてくれていた。
matsuchiyomatsuchiyo
  1. 線形回帰モデル
  • 7.1 損失関数の偏微分と勾配降下法
    • モデルのパラメーターを求めるには、以下の方法がある
      • 平方完成。入力変数が1次元の単回帰のときに使える。

        1章で紹介したモデルは「単回帰」と呼ばれる簡単なモデル(入力変数が1次元)だったので、最適なパラメータ値を平方完成...で求められました。

      • 損失関数をw0, w1, ... wnのそれぞれで偏微分した値 = 0 (この式はn個できる) の連立方程式を解く。各式は1次の式になる。損失関数が2次であるため。

        「損失関数をすべてのパラメータ(w0, w1, ... wn)」で偏微分したときの値が同時に0になる点を求める」という考え方になります。

      • 勾配降下法

        ...本章では分類問題への準備として、線形回帰問題をあえて勾配降下法による繰り返し計算で求める方法を用いて解くことにします。

  • 7.5 予測モデルの作成
    • 式を簡単にするため、pythonで実装しやすくするため、ダミーデータ1を入力データの0番目(x0)として追加する。

      このように書き直すと、式がシンプルになる...。...ロジックをpythonで実装するにあたっても、簡潔なコードで実装できるという効果につながります。

      • モデル(直線 or n次元の平面)の切片についても、他の入力パラメーターの係数(w1, w2, ... wn)と一緒にまとめて最適化できる。
  • 7.6 損失関数の作成、7.7 損失関数の微分計算、7.8 勾配降下法
    Texは得意でないので、ノートに書いた。
  • コラム 学習率・繰り返し回数の調整方法

    ...「一般的に学習率をどう決めたらいいか」というのが、次の疑問として出てくると思います。残念ながらこの問いに対する明確な答えというものはありません。「入力データの性質により都度変わってくるので実際に試行錯誤を重ねて見つけていくしかない」というのが回答になります。
    より実践に近い機械学習では、入力データの前処理として正規化...をすることが多いです。この場合、経験的に学習率は0.01から0.001程度にするとうまくいくことが多いと言えます。

matsuchiyomatsuchiyo
  1. ロジスティック回帰モデル(2値分類)

本章では分類をする代表的な機械学習モデルである、ロジスティック回帰モデルを取り上げます。

  • 8.2 回帰モデルと分類モデルの違い
    • 以下の部分は、線形回帰モデルと、2値分類のロジスティック回帰モデルを横に並べると少しわかりにくいように感じた。前者は横軸がx1(入力データ)で縦軸がy(予測結果)であるのに対し、後者は横軸がx1(入力データ)で縦軸もx2(入力データ)となっていて両方入力データであるため。

      図8-3は前章の回帰問題(左)と本性の分類問題(右)の学習データの散布図です。

    • 2値分類のロジスティック回帰モデルの図の直線は、y=w0+w1x1+w2xの平面とy=0の平面が交わるところの直線。
  • 8.3 予測モデルの検討
    • 「真っ先に考えられる」方法

      u=w0+w1x1+w2x
      この場合、真っ先に考えられるのは
      uの値が正→class=0
      uの値が負→class=1
      という基準で判断をして、なんらかの方法でwの値を調整して行って、...

    • この方法はパーセプトロンとほぼ同じ。

      実は、この方式はニューラルネットワークの一番初期に考えられた「パーセプトロン」と呼ばれるモデルの考え方とほぼ同じです。

    • しかし、パーセプトロンには限界がある。

      しかし、パーセプトロンによる分類には限界があることがわかっているので、勾配降下法を使ったより性能のよい分類方式を検討することにします。

    • 勾配降下法を使ってパラメータを最適化していくためには、損失関数(とそのもとになっている予測関数)は微分可能な関数である必要がある。

      勾配降下法...にのせたい場合、損失関数はパラメータで微分可能な関数、言い換えるとパラメータwの変化に伴い連続的に変換する関数である必要があります。損失関数は予測値と正解値から計算されるものなので、結論として「予測値を計算する関数はパラメータwに関して連続的に変化する必要がある」...

    • パーセプトロンの予測値(0 or 1)はwを変化させても連続的に変化しない。勾配降下法は使えない。
    • 微分可能であることが必要であることに加え、出力を確率値として使いたい。そこで、sigmoid関数をuに適用する。

      そして、確率値に変換するために使われるのが5.5節で紹介した(8.3.2)の式で表されるシグモイド関数なのです。

  • 8.4 損失関数(交差エントロピー関数)
    • 以下の「正解値の可能性を示す確率値」というのがよくわからない。

      本章の問題設定では、ytの値は1か0かのどちらかなので、もしyt=1の確率がypならyt=0の確率は1-ypとなります。つまり、正解値をyt、その時のモデルが正解値の可能性を示す確率値をP(yt, yp)で表すと以下のようになります。
      P(yt, yp) = {
      yp (yt=1の場合)
      1-yp (yt=0の場合)
      これから、この確率値を用い6.3節で説明した最尤推定により損失関数を定義していきます。

      • 「正解値の可能性」というのがよくわからない。
        • yt=1なら、1の可能性。
        • yt=0なら、0の可能性。
        • → 「予測値が正解である可能性」ということなのかな。
      • → yt=1なら1に近い予測値を、yt=0なら0に近い予測値を出力する確率、ということかな。
    • あと、ここで言っている最尤推定と、6章の最尤推定がつながらない。
      • 6章の最尤推定では、二項分布に従う母集団からサンプルをいくつか取り出して、その結果から、もっともありそうなPを求める。
  • 8.5 損失関数の微分計算、8.6 勾配降下法の適用

    (勾配降下法の漢字が間違っていました。)
matsuchiyomatsuchiyo
  1. ロジスティック回帰モデル(多値分類)

多値分類の場合、1つの分類器に複数の値を予測させるのではなく、「0から1までの確率値を出力する複数の分類器を並列に作って、そして確率値の最も高い分類器に対応するクラスをモデル全体としての予測値とする」というアプローチを取ります。そのため、2値分類と比較して次の点が違います。
 重みベクトル→重み行列
 シグモイド間数→softmax関数
 逆にいうと、2値分類モデルで、上の2点を取り替えてしまえば、そのまま多値分類モデルになるということです。...

  • 9.2 モデルの基礎概念
    • 正解値のOne Hot ベクトル化

      具体的には、0、1、2という正解値をそれぞれ(1, 0, 0)、(0, 1, 0)、(0, 0, 1)という0と1の値を持つ3次元ベクトルに変換し、これらの3次元ベクトルを出力とするモデルを作る問題に置き換えて考えることにします。

      • 予測値の方は、具体的にどんな値になるのか?→ softmax関数を使うので、(0.6, 0.3, 0.1)のような感じになるはず。
  • 9.3 重み行列

    多値分類モデルでは内部的にはN個のモデルが並列に稼働しています。つまり、前章の2値分類モデルで「重みベクトル」に相当する部分がNセット必要になります。このような複数セットの重みベクトルに適した数学表現が行列であることは3.7節で説明しました。この場合、行列とベクトルの積(結果はベクトルになる)により、分類器分の複数セットの内積を同時に表現することが可能です。

  • 9.4 softmax関数

    softmax関数...は...、「個々の要素がそれぞれの確率値を表す」モデルの出力関数としてぴったりである...

  • 9.5 損失関数、9.6 損失関数の微分計算、9.7 勾配降下法の適用
  • 9.6 プログラム実装
    • ?: 以下、softmax関数の入力のベクトル全体から入力の最大値を引くのは、なぜOKなのか?

      図9-11にsoftmax関数を実装しました。...短いコードですが、次の2点の工夫がしてあります。
      オーバーフロー対策
       入力値にあまりに大きな値があった場合、exp(xi)の途中の計算か知恵でオーバーフローが起きる可能性があります。そこで入力値の最大値を調べて、指数関数を呼ぶ前に、ベクトル全体から最大値を引く処理をしています。

      • → 分母と分子それぞれを同じ数で割ることになるからOK。
        • 例:
          • 2^3 / (2^1 + 2^2 + 2^3) = 8 / (2 + 4 + 8) = 4 / 7
          • ここから最大値3を引くと
          • 2^0 / (2^(-2) + 2^(-1) + 2^0) = 1 / (1/4 + 1/2 + 1) = 1 / (7/4) = 4 / 7
          • 同じ。
matsuchiyomatsuchiyo
  1. ディープラーニングモデル
  • ディープラーニングモデルの定義は2通りある。

    本章では最初は3層ニューラルネットワークと呼ばれる隠れ層1層のみのネットワークを扱いますが、最後に隠れ層2層のパターンも扱います。ディープラーニングモデルの定義には、「隠れ層のあるニューラルネットワーク」と「隠れ層が最低2層あるニューラルネットワーク」の2通りがありますが、最後の例題はどちらの定義でも「ディープラーニング」に該当することになります。

  • 10.1 例題の問題設定
    • ?: 以下について、画像認識って、多値分類だとなぜ解けないのか?あと、画像認識以外にディープラーニングをどう適用するか知りたい。

      本章では学習対象のデータに「mnist手書き数字」を使用します。

    • CNNでは、画像データを2次元データのまま渡せる。

      本章では28x28のイメージデータを要素数784(=28x28)の1次元データとして扱い、...
      ...画像データを2次元データの状態のまま処理を進めるCNNと呼ばれる方法もあります。

  • 10.2 モデルの構成と予測関数
    • ?: 以下について、隠れ層のノード数の決め方も調べる。

      隠れ層のノードbの次元数は128個としています。
      ...
      隠れ層の次元数を幾つにするかは特に決まりはないです。この値を変えると結果がどうかわわるかに関心のある読者は、実習プログラムの隠れ層ノードの次元数(H)の値を変更して試してみてください。

  • 10.3 損失関数、10.4損失関数の微分計算
    • ?: これで、最後の重みWを勾配降下法で求めていくことができるのはわかる。このWはどんどん変化していくのに、その変化していくWを使っている途中の重みVはどうやって求めていくのか。
      • → ソースを見るとわかるけど、そのイテレーションのWを使って、Wを定数としてVでの偏微分した結果を使って、Vについても勾配降下法を使う。
  • 10.5 誤差逆伝播法
    • 以下、ピンとこない。呼び方を決めただけというような感じなのかな。

      ...すると、隠れ層ノードbに対して「bの誤差bd」をbd_i = ... という式で定義すれば...
      ...
      ディープラーニングでは、ここで定義されたbdを「隠れ層における誤差」と解釈します。

    • 隠れ層2層の学習
  • 10.6 勾配降下法の適用
    • ここまで求めてきた、Lを各箇所の重みで偏微分した結果を使って、各箇所の重みを更新していく。
  • 10.7 プログラム実装(その1)
    while epoch < nb_epoch:
      index, next_flag = indexes.next_index()
      x, yt = x_train[index], y_train_one[index] 
      # xのshape: (512, 785)。512はミニバッチに含まれるデータ系列数。 (このコメントはこのスクラップの作成者によるメモ)
      # ytのshape: (512, 10)。 (このコメントはこのスクラップの作成者によるメモ)
    
      a = x @ V # Vのshape: (785, 128) (このコメントはこのスクラップの作成者によるメモ)
      b = sigmoid(a)
      b1 = np.insert(b, 0, 1, axis=1) # ダミー変数の追加 
      # ↑ bの0番目に1をinsertするということ。(このコメントはこのスクラップの作成者によるメモ)
      u = b1 @ W # Wのshape: (129, 10) (このコメントはこのスクラップの作成者によるメモ)
      yp = softmax(u)
    
      yd = yp - yt # ydのshape: (512, 10) (このコメントはこのスクラップの作成者によるメモ)
      bd = b * (1-b) * (yd @ W[1:].T)
    
      W = W - alpha * (b1.T @ yd) / B # Bはミニバッチに含まれるデータ系列数。 (このコメントはこのスクラップの作成者によるメモ)
      V = V - alpha * (x.T @ bd) / B
      # 省略
    
  • 10.8 プログラム実装(その2)
    • 入力データの次元数が大きくなると、前章までのように重みの初期値を1にするのでは、ダメらしい。損失関数に勾配ができないとかが原因なのかな。

      前節のプログラムがうまくいかなかった種明かしをしましょう。実は重み行列の初期値に問題があったのです。前章までの実習でやったように入力変数の次元数が小さい場合、重みベクトル・重み行列の初期値が問題になることはほぼありません。ところが本章の実習のように入力データの次元数が1000に近いような大きい場合、重み行列の初期値を慎重に決めないとうまく収束してくれないのです。

    • そこで、以下のようにする

      ・重み行列の各要素の値は平均0、分散1の正規分布乱数を一定値で割った値とする
      ・一定値としては、入力データ次元数をNとした場合、√(N/2)とする

  • 10.9 プログラム実装(その3)
    • ReLU関数の導入
      • 以下の記載について、p208の記載に照らして、ReLUを使っていいのかな?

        ReLU関数の場合、その微分は次のような階段状の関数...になります。

        • p208

          8.3 予測モデルの検討
          ...
          「予測値を計算する関数はパラメータwに関して連続的に変化する必要がある」
          ...
          先ほど説明したパーセプトロン的な方法の場合、予測値は0か1の2値で変化は連続的ではなく離散的なので、この条件に合致しません。

        • → ReLU関数の微分ではなく、ReLUの関数そのものは、0以上の範囲では連続的に変化するからOKと思われる。
      • ?: 以下について、なぜReLUだと精度が上がるのか?

        先ほどと同じ繰り返し回数100回で、90%強の精度が95%弱まであがりました。

  • 10.10 プログラム実装(その4)
    • 隠れ層の2層化
      • ?: 以下、よくわからない。

        層の数を増やしたことにより、パラメータの自由度が増え問題への適合度が高くなったことにより、認識精度も上がったと考えられます。