俵言スマートフォン用の表示で見る俵言しがない社会人が書く、勉強とかのこと。第5回:4章(その1)損失関数はじめに次の記事を書こう書こうと思いつつ、気付いたら2週間経ってました。何てこったい..書く気を取り戻したので再開します。Learning」の勉強内容をひたすら書いていく記事も、遂に本題である学習の話に入っていきます。3章まではニューラルネットワークの構造など導入的な意味合いが強かったと思うのですが、ここからはいかに自動で最適な重みを学習するのか、というニューラルネットワークの核となる部分です。ニューラルネットワークの学習4章の導入では、SVMやKNNといった機械学習の手法は人が特徴量(データの注目すべき点)を作りこむ必要がある(すなわち人が介在しなければならない)けれど、ニューラルネットワーク(ディープラーニング)は生データをそのまま学習させることができると書かれています。個人的には「そうなの?」って思ったんですけど、よくよく考えるとこの本は画像認識を念頭に置いて書かれているので間違っていない気がします。「この画像に写ってるのは何か?」って話だと確かにそうなのかなって。(画像認識やったことないのでわかんないですが。)ただ、言語処理をやるだとか、多種多様なデータを複合して何かやろうだとかなると、人の手がかなり介在する気がします。これからの進展でなんでも出来るようになるかもしれませんけども。4章も3章と同様に3つに分けて勉強していこうと思います。その1である損失関数のお話です。function)と呼ばれるものを用いています。性能がどれくらい悪いかを示していて、こいつの値が小さいほど性能が良いと考えられるとのこと。それで、本の中では損失関数を二つ挙げています。今回はこれらを紹介しつつ、何故損失関数を使うのかというところを見ていきます。Error:SSE)以下の式で表されます。対する正解を表します。)読んで字の如く、(出力と正解の各成分の差の)二乗和による誤差(そういう日本語だと僕は解釈してます。残差平方和の方がしっくりきますが。出力の各成分の正解との誤差を足し合わせる形なので、かなり分かりやすい誤差ですよね。因みに絶対値ではなく二乗を使うのは統計的な根拠があるらしいです。error」ってなってました。Error)以下の式で表されます。二乗和誤差よりパッと見わかりにくいかもしれません。なるベクトルとなっています。1が立っている場所は正解クラスを示します。すれば、となるので、実質はとなります。以下のようなグラフです。小さいほど交差エントロピー誤差は大きくなります。正解であるクラスとなる確率が小さいほど誤差が大きくなるので直感的に自然ですね。ところでプロフェッショナルシリーズの深層学習だと、この交差エントロピー誤差を訓練データに対する尤度から算出してました。天下りよりもすっきりするかもしれません。実装まあ式をそのまま書くだけなので工夫も何もって感じですが。一次元配列ですが、numpyの力でシンプルな書き方が出来ます。logの中身が0になると-infになって怒られるので、微小量を加えてうまく誤魔化すのは大事なテクニックですね。回帰問題、交差エントロピー誤差は分類問題に用いることが一般的だそうです。上で実装した損失関数は一個の訓練データに対するものでしたが、実際は沢山の訓練データに対して損失関数を適用し、その和(あるいは平均)を学習の指標とします。式で書くとこんな感じです。データがめちゃくちゃたくさんあると、全部の訓練データについて損失関数を計算するのは結構コストがかかっちゃいます。そこで、訓練データの一部を取り出して損失関数を計算し、それによって学習を行うことを考えます。これをミニバッチ学習と呼ぶそうです。本の中だとミニバッチを取り出す操作を実際にやってみるのですが、前回使ったMnistの訓練データからランダムにデータを選択するだけなのでここで書くほどのコードではありません。ミニバッチ学習をする上で、numpyのデータから一部を選択する処理について本の中で高度な機能をさらっと使っていたので少し詳しく触れます。※ここで書くのはかなり細かい話です。「そこは遠慮したい」って方はこちら。pythonの通常のリストとは異なる要素へのアクセス方法を持っています。ページを参照ですが、ここでさらっと紹介。その前に、共通の機能を見てみます。15]]がんばれば二次元のリストでも表現できます。15]以下のようなアクセスは普通のリストと同じなので特に違和感ありません。11]]最後の一個飛ばしスライシングは少し特殊ですが、使えると便利です。(スライシングは他にも色々使い方がありますが割愛。まあリストと共通の使い方ですしね。Indexingができます。indexingを紹介します。15]]Trueである1行目と3行目だけ残っていることが分かります。この機能はかなり便利で、各行のデータに対してある条件を満たすものだけ残すといったことができます。