NTCサーミスタを使ってみる

秋月のNTCサーミスタ使ってみる.

f:id:yusuke_ujitoko:20200308162534j:plain

使用方法のメモ

Michael Nielsen著のオンライン書籍「ニューラルネットワークと深層学習」の翻訳に参加しました

日本語訳に参加させていただいた書籍は下記のリンクから読めます!
オリジナル書籍:Neural Networks and Deep Learning
日本語版書籍:ニューラルネットワークと深層学習

量子コンピューティング分野の物理学者Michael Nielsenという方の執筆したオンライン書籍です。 この書籍の内容はニューラルネットの入門者向けとなっています。
「なぜ?」の部分について詳しく、そしてとても分かりやすく記述されていておすすめです。
本書を読むと、例えば以下の疑問について説明できるようになります。

  • なぜ2層ニューラルネットは任意の関数を近似できるのか
  • なぜ勾配消失や勾配爆発などの問題が起きるのか
  • なぜ正規化項にバイアスは含まれないのか

個人的には、深層学習を学び始めた人が、
ゼロから作るディープラーニングの次に読むべき書籍は本書だと思っています。

翻訳参加のきっかけ

2017年1月から、機械学習を入門し始めました。
その中でも特に流行りのニューラルネットにキャッチアップしようと、
ゼロから作るディープラーニングとかStanfordの教材CS231nとか一通りさらいました。
誤差逆伝播法や畳込みを理解して、どんどん楽しくなっていったのを覚えています。

その直後、そろそろ論文読める頃かなとmaxoutの論文を読み始めたら、
「universal approximator theorem」という言葉が出てきて、
調べてたどり着いたのがこのオンライン書籍。

ニューラルネットの本質を初心者でも分かるように、丁寧に説明してくれています。
「なぜ?」に答える内容により知的好奇心を刺激されて、勉強の楽しさを再確認でき、
単純に読んで良かったと思えた本でした。

しかし日本語版は1~4章までしか出ておらず、5,6章はまだ翻訳されていない模様。
というのもそもそもオリジナル(英語版)の6章が書かれたのが最近でした。
英語が大好きな(≠得意な)私としては、これは翻訳作業を楽しめてさらにOSS貢献までできるチャンス!と思い、
翻訳プロジェクト参加を申し出たのでした…

翻訳作業履歴

担当

私が翻訳を担当したのは、以下の2章です。

実施スケジュール

スケジュール 進捗
1/26 翻訳しようと決心
1/26-1/30 5章翻訳
1/31-2/2 5章翻訳の校正(1回目)
2/3-2/4 5章翻訳の校正(2回目)
2/4 5章をpush
2/5-2/13 6章翻訳
2/14-2/16 6章翻訳の校正(1回目)
2/17 6章翻訳の校正(2回目)
2/17 6章翻訳をpull request

技術翻訳の感想

迷ったら行動すべき

機械学習に対して、にわか知識しかない私なんかが翻訳なんてやっていいのかな」と思っていましたが、
参加表明してみると温かく迎えていただけて、
また何か質問すると、優しく教えて貰えました。

下に記述したように自身の勉強になりますし、
そもそも訳していく作業自体が本当に楽しかったので、
参加してよかったなと思っています。

勉強になる

正しく翻訳しようとすると、内容を深く理解する必要があります。
そのため、少しでも不明な点があると、調べて自分の中で解釈を確定させてから日本語化する、ということを行っていました。
おかげで、単に英語を読むだけのときの30倍くらい時間かかりました(体感)
普段ちゃんと理解していないのかな、と思いました。

私の訳した部分の中では特に、勾配爆発や勾配消失の起きる要因について、
完全に頭の中で整理できたことが一番の収穫でした。

原点のニュアンス vs 日本語としての読みやすさ

原典のニュアンスを残しつつ、日本語として読みやすくするのは難しかったです。
どちらかを妥協する必要があります。

  • 原典を妥協すると、別のオリジナル文書になってしまいます
  • 日本語の読みやすさを妥協すると、読みにくくなるため、そもそも読まれず、翻訳自体の価値が減っていきます。

今回は、原典が入門者用の読み物であり平易にわかりやすく書かれていたため、
日本語訳もわかりやすさ重視で意訳気味に行いました。

最後に

温かく迎えてくださった翻訳プロジェクトの方に心から感謝しています。
(後から気づいたのですが、翻訳メンバが豪華でした…)
技術翻訳初めての経験でしたが翻訳作業自体を、大変楽しめました!
もし誤訳等ございましたらお知らせください(もしくは修正ください)

参考

オリジナル書籍:Neural Networks and Deep Learning
日本語版書籍:ニューラルネットワークと深層学習
プロジェクトを管理されている方によるプロジェクト概略

機械学習入門(ボルツマン機械学習から深層学習まで)を読んで、覚えておきたいと思ったこと

平易な言葉で本質を教えてくれる本書のような情報源は貴重。
この類の本をどんどん読んで吸収していきたい。
鏡に美しさを示す関数を教えよう、というところから始まるのだが、
鏡が博識&有能すぎて教えるどころではないというところ。

機械学習入門 ボルツマン機械学習から深層学習まで

順問題と逆問題

  • 順問題
    • 「関数が与えられているから、何か入力して出力される値を計算しろ」
    • y = f(x) の y を求める
  • 逆問題
    • 「入力と出力の関係があるから、それに矛盾しない関係を探してこい、みつけろ」
    • y = f(x) の f を考える

教師あり学習と教師なし学習

子供はおそらく最初は教師なし学習をしている。
周りの風景を見渡して、世の中の風景や聞こえる音、匂いなどを学習して雰囲気を学ぶ。
そのものが何なのかは知らないけど、こういうものだということを学んで、記憶の中で整理している。

だんだん成長するにつれ、周りの大人の言うことや本などを読むことにより、それが何だったのかという理解をすることで教師あり学習を行っている。

線形な計算だけだと、複雑にならない

Aという変数を2倍したものとBという変数を3倍したものを足す。
Aという変数を3倍したものとBという変数を2倍したものを足す。

これらをそのまま足し合わせると、
Aという変数を5倍したものとBという変数を5倍したものとなり、
結局1度の掛け算と足し算で表現できてしまい、複雑にならない。表現力が上がらない。

そこで非線形変換を施すことで、複雑さを作れる。
非線形変換を施す関数のことを活性化関数と呼ぶ。

バッチ学習とオンライン学習

  • バッチ学習
    • データを全部貰い受けて、それを訓練データにして学習する
  • オンライン学習
    • 次から次へとデータがきて、学習する
    • 毎回異なるデータがくるため、汎化性能がよくなる傾向がある

分離超平面とは?

特徴量に重みを掛けて足し上げて0になるところと、1になるところの境。

SVMサポートベクターマシン)?

識別面をデータの点からの距離、マージンが大きくなるように調整する。
そのマージンをできるだけ広げるように分離超平面を動かす方法をサポートベクターマシンと呼ぶ。
サポートベクターマシンはそれなりに汎化性能が良い。

ただ分けるだけを目的にすれば、そんなことは考える必要はない。
分けるために識別の誤差を最小にするわけだが、サポートベクターマシンは識別の誤差だけでなく、マージン最大化、データが示す点と分離超平面の間の距離を最大化するという両者の要素を考慮する。

非線形変換のイメージ

線形変換は伸縮させたり、回転させたり。
非線形変換はグシャッと変形するイメージ。

特徴量をそのまま使うのではなく、非線形変換でグシャッと変形して使うというのがカーネル法のアイデア

スパースモデリング

回帰や識別に使った特徴量の中から本当に大事なものは何か?
ということを念頭に置いて、あまり重要でない特徴量にかかる重みをゼロにする工夫の仕方がある。
そうして残った特徴量、その組み合わせだけが重要であるという特徴量選択が実現する。

データの本質をつかむためにゼロを探す。
そうやってほとんどゼロになっている状況をスパースという。
そのように仕向ける方法論をスパースモデリングという。

ボルツマン機械(ボルツマンマシン)

場所ごとの関係性を設定したモデルをボルツマンマシンと呼ぶ。
ボルツマンマシンに、画像のデータを見せて、そのデータに合わせていくことで、実際の画像の特徴、どのピクセルには何色が出やすいか、隣同士の関係性がどういう傾向にあるのか、それを学ぶ学習をボルツマン機械学習という。

ボルツマン機械学習では双方向型のニューラルネットワークを利用する。

自然は何かしらの最適化問題を解いている

最適化問題を解いた後の世界の姿が私たちが目にする世界

隠れ変数

データとして得ることができない、見えない部分を隠れ変数という。
データとして取得可能な部分を可視変数という。

可視変数をピクセル
可視変数同士を結びつける関係、それが隠れ変数のスイッチとしての役割とする。
可視変数同士、つまりピクセル同士にも関係がないように制限して、
さらに隠れ変数同士、スイッチ同士にも関係がないように制限したものを制約ありボルツマン機械という。

制限ありボルツマン機械の場合はサンプリングが簡単。
可視変数のサンプリングをして、その後、隠れ変数のサンプリングをして、と交互に繰り返すだけで良い。

http://postd.cc/a-beginners-guide-to-restricted-boltzmann-machines/

自己符号化

中間層は入力を反映した何かになる。
もともと入力されたものをグシャッと変形させたものだが、もとに戻せる程度。

入力から重要な部分だけを抽出する。
こうやって特徴量の下図を減らすことを次元圧縮という
重要な特徴量をあぶり出すことを、自己符号化を利用した事前学習で行う。

教師データがたくさんある場合は、事前学習なしでよい。
事前学習は教師なし学習なので、答えが分かってないデータも利用できる。
こうすることで多層ニューラルネット潜在的な性能を引き上げられる。

Michael NielsenのNeural Networks and Deep Learningを読んで、覚えておきたいと思ったこと

Michael Nielsen著のオンライン書籍Neural Networks and Deep Learningを読んで、
覚えておきたいと思ったことのメモ。

ゼロから作るディープラーニングのネタ元は、 CS231nとばかり思っていたけど、
今となっては、真のネタ元はこのオンライン書籍だと確信している。
言い回しとか、コード例とかが瓜二つ。

こちらの書籍、なんと有志がプロジェクトを作って日本語訳を勧めているそう。
ぜひ翻訳参加してみたい。

追記:5章、6章の訳を担当させていただけました!

ch.1 ニューラルネットワークを用いた手書き文字認識

パーセプトロンが2層になるとはどういうこと?

一層目のパーセプトロンは入力に重みをつけて、単純な判断をしている。 二層目のパーセプトロンは第一層のパーセプトロンよりも複雑で、抽象的な判断を下しているといえそう。

バイアスの意味とは?

バイアスはパーセプトロンが1を出力する傾向の高さを表す量だとみなせる。 あるいは、生物学の例えを使えば、バイアスとは、パーセプトロンというニューロンが発火する傾向の高さを表すといえる。

なぜ誤差関数を使うのか?

なぜ誤差関数を導出するのか?
結局のところ、われわれが知りたいのはどれだけの画像がネットワークによって正しく分類されたかではないのか?
分類が成功した回数を最大化せずに、誤差間薄を最小化するのはなぜ?

その理由は分類の正解数が、ネットワークの重みとバイアスのなめらかな関数にならないことにある。 重みとバイアスに小さな変更を加えても、正解数が変化することがほとんどないため、コストを改善するのに重みとバイアスをどう変更したら良いかわからない。 代わりに誤差関数のような滑らかな関数を用いた場合、重みとバイアスに対してどう微小に変更を加えれば改善できるかが簡単にわかるようになる。 これが誤差関数の最小化を用いる理由であり、2次コストの最小化をした後で初めて分類の精度を調べることにする。

オンライン学習(逐次学習)とは?

オンライン学習とは、ニューラルネットワークの一回の学習を一つの訓練入力で行うこと。
人間とおなじ方法。

ch.2 逆伝播の仕組み

誤差逆伝播法を構成する美しい4つの式

以下の4つの式を覚えておくと、 ニューラルネットに施すテクニックの理由や、その影響を説明できるようになる。

出力層での誤差 {\delta^{L}} に関する式

{
\delta_{j}^{L} = \frac{\partial C}{\partial a_{j}^{L}} \sigma'( z_{j}^{L} )
}

誤差 {\delta^{l}} での誤差 {\delta^{l+1}} に関する式
(直観的には誤差をネットワークとは逆方向に伝播させている)

{
\delta^{l} = ((w^{l+1})^{T} \delta^{l+1}) \odot \sigma'(z^{l})
}

任意のバイアスに関するコストの変化率の式

{
\frac{\partial C}{\partial b_{j}^{l}} = \delta_{j}^{l}
}

任意の重みについてのコストの変化率の式

{
\frac{\partial C}{\partial w_{jk}^{l}} = a_{k}^{l-1} \delta_{j}^{l}
}

ch.3 ニューラルネットワークの学習の改善

どうやったら交差エントロピーを最初に思いつくのか?

二乗和誤差の勾配計算の際に、 {\sigma'(z)} の項が、学習の速度低下を引き起こしていた( {\sigma} があると、勾配消失しやすいため)。 {\sigma'(z)} の項が初めからないような、勾配の式から出発し積分することで交差エントロピー誤差の式を導出した。

交差エントロピーは何を意味するのか?

驚きの尺度。 出力が期待通りだとあまり驚かないし、期待していないものだと強く驚く。

正規化項はなぜバイアスを含まないのか?

{
C = - \frac{1}{n} \sum_{xj} y_{j}\ln aj^{1}+ (1-y_{j}) \ln (1 - a_{j}^{L}) + \frac{\lambda}{2 n} \sum_{w} w^{2}
}

この正規化項にバイアスを含まない。 その理由は、もし、バイアスが大きくなっても、重みが大きくなったときのように、入力に対するニューロンの感受性が高まるわけではないから。 だから、大きなバイアスのために、訓練データのノイズを学習してしまうのではないかと心配する必要はない。 同時に、大きなバイアスを許すことで、ニューラルネットワークはより柔軟に振る舞えるようになる。 特に大きなバイアスを許すことで、ニューロンの出力が容易に飽和できるようになる。 時に、この性質が望ましい場合がある。

重みが小さいことの意味

ニューラルネットワークの大部分で小さな重みをもつとする。 重みが小さいということは、ランダムな入力を変化させてもニューラルネットワークの振る舞いが大きくは変わらないことを意味する。 そのため、正規化されたニューラルネットワークでは、データに含まれる局所的なノイズの効果を学習しづらくなっている。 その代わり、正規化されたニューラルネットワークは訓練データの中で繰り返し観られるデータの特徴に反応する。

対照的に、大きな重みを持つニューラルネットワークは、入力の小さな変化に敏感に反応してその振る舞いを大きく変えてしまう。 そのため、正規化されていないニューラルネットワークは、大きな重みを使って、訓練データのノイズに関する情報を沢山含んだ複雑なモデルを学習してしまう。

要するに、正規化されたニューラルネットワークは訓練データに頻繁に現れるパターンに基づいた比較的シンプルなモデルを構築する。 そして、訓練データが持つノイズの特異性を学ぶことに対して耐性をもつ。

ch.4 ニューラルネットワークが任意の関数を表現できることの視覚的証明

ニューラルネットワーク(NN)のUniversal approximator theoremは, NNによる関数の近似性を示すもので,NNの強力さを物語る.

ただし,以下の2点の注意点がある.

1. ニューラルネットワークは任意の関数を完全に計算できるわけではない.

そうではなく,好きなだけ近い近似関数を得られるということ 隠れ層のニューロンを増やすことで近似の精度を上げられる.

計算したい関数f(x) とepsilon > 0が与えられたとして, 十分な数の隠れ層のニューロンを用いると,出力g(x)が|g(x)-f(x) < epsilon|を任意の入力xに対して満たすNNを常に見つけられることをuniversal approximator theoremは示している.

2. 近似できる関数は連続関数に限る

不連続な関数は,NNを用いた近似は一般的には不可能

重みやバイアスを増やすとはどういうことなのか.

活性化関数をsigmoidととると,

  • 重みの操作
    • wを増やすと,ステップ関数に近づく.
    • wを増やすと,勾配が0の関数に近づく

  • バイアスの操作
    • バイアスを増やすとグラフが左へ移動する
    • バイアスを減らすとグラフが右へ移動する

yusuke-ujitoko.hatenablog.com

【CS231n】Understanding and Visualizing Convolutional Neural Networks

Stanford大の教材CS231nを使ってNNやCNNを学んでいる.

Visualizing what ConvNets learn

  • NNで学習した特徴量が解釈できないという批判に対し、
    CNNを理解し、可視化するアプローチが提案されてきた。
    本記事ではこれらを紹介していく

Visualizing the activations and first-layer weights

Layer activations
  • 素直な方法として、順伝播の際のactivationを表示するというのがある
  • ReLUネットワークの場合
    • はじめのうちは、かたまりが見える
    • 学習が進行すると、バラバラになり、局所化していく

  • ほとんどの入力に対してzeroを示すactivation mapの場合はダメな兆候
    • dead filters を示し、高learning rateであることも示す。
f:id:yusuke_ujitoko:20170121230248p:plain (CS231nより引用)
Conv/FC Filters
  • 重みを表示するというのがある
    • よく学習しているネットワークでは、ノイズが少なく、スムーズな模様が見える
    • ノイズが見えるときというのは、学習が不十分であるか、正規化強さが弱くて過学習に至っている状態を示す。
f:id:yusuke_ujitoko:20170121230321p:plain (CS231nより引用)

Retrieving images that maximally activate a neuron

  • ニューロンを最も活性化するような画像を取り出してみてみる方法もある
    • receptive field(受容野)でニューロンがなにを探しているかも理解することができる。
    • その例が、Rich feature hierarchies for accurate object detection and semantic segmentation by Ross Girshick et al.にある。
f:id:yusuke_ujitoko:20170121230537p:plain (CS231nより引用)

  • このアプローチの欠点
    • ReLUニューロンがなにかを意味をしているわけではないこと

Embedding the codes with t-SNE

  • ConvNets は徐々に画像を変化させて、線形分類器によって分類可能なrepresentationとするとも解釈できる
    • We can get a rough idea about the topology of this space by embedding images into two dimensions so that their low-dimensional representation has approximately equal distances than their high-dimensional representation

  • 埋め込み方法は色々ある。
    • t-SNE はよく知られた手法
f:id:yusuke_ujitoko:20170121230621p:plain (CS231nより引用)

Occluding parts of the image

  • ConvNetが画像を「犬」と分類したときに、以下の区別はわからない
    • 本当に犬を見つけたのか、
    • それとも背景のcontextual cuesをもとに判断したのか
  • これを調べる方法
    • 画像の中の一部を隠して、その部分の位置を変数として、クラスの確率をプロットする
    • Matthew Zeiler's Visualizing and Understanding Convolutional Networks
f:id:yusuke_ujitoko:20170121230655p:plain (CS231nより引用)