l8l技術メモ

機械学習・深層学習・組込みとかのメモ

「試して理解Linuxのしくみ: 実験と図解で学ぶOSとハードウェアの基礎知識」を読んだ

本業(?)ではあるので、買ってみた。立ち読みしたところ内容はほとんどは既知だが復習として買うことに。

基本をおさえつつ実験・図が豊富な本は貴重だなと思う。

スケジューリング・ページイン/アウト・スワップ仮想メモリ・ディスクアクセスなどなど、タイトルにあるとおり基本の内容。

参考文献に挙げられたもののうち、次に読むなら、"Linux Kernel Development" か、次点で "What Every Programmer Should Know About Memory" ( https://people.freebsd.org/~lstewart/articles/cpumemory.pdf )。

PRML 2章から4章を読んだ

仕事に直接役立つ見込みもなかったので、一部を読んだ。http://d.hatena.ne.jp/n_shuyo/20121004/prml を参考に、章は選んだ。 

 

内容は、2章は確率分布、3章は回帰モデル、4章は分類モデル。細かい数式はしばらくすれば忘れてしまうと思う。MLタスクでの意思決定の何かしらや、理解に役立つといいなとは思うが、活かせる自信はない。

学んだことは以下くらい。

2章

3章

  • ガウス基底関数を含む、基底関数
  • 基底関数を用いた、φに対して線形な回帰モデルについての数式
  • 最尤法と、ベイズ的方法の違い。パラメータwの事後分布を求めることや予測値の分布を求めること
  • 線形モデルにおける、design matrix

□理解が怪しい

4章

  • 線形モデルによる分類
  • ベイズ的取り扱い
  • Softmax 関数周りの数式
  • クロスエントロピー誤差関数は最尤関数の負の対数

□理解が怪しい

 

TensorFlowで最適化(最小化)

値域つきの変数 0 < x1 < x2 < 1 からなる loss(x1,x2) を最小化したい。

lossが線形の時は線形計画法でよい。pythonのライブラリにpulpライブラリがあるらしい。非線形のとき、tensorflowなどで最適化できる。

 

変数の制約をつけたいとき

  • 値域をつけたい -> sigmoid(x)等で値を制限する
  • tf.Variable(val, constraint=lambda x: tf.clip(x, 0, 1)) みたいにclipする
  • 厳密な条件でない時 -> lossで値域をゆるやかに制限する。relu(x-超えたくない値)などをlossに足す。expなどを使うと微分もexpであることからgradientが突然大きくなってパラメタが発散したりする(一敗)

 以下が簡易コード

import tensorflow as tf

D = tf.constant(0.3) # min distance

low = tf.constant(0.0)
x1 = tf.Variable(0.3, trainable=True, name="x1")
x2 = tf.Variable(0.5, trainable=True, name="x2")
high = tf.constant(1.0)

eps = tf.constant(1e-2)
bnd_loss =    tf.nn.relu((low-x1)/eps) \
            + tf.nn.relu((x1-x2)/eps) \
            + tf.nn.relu((x2-high)/eps)
keep_loss = tf.math.pow( x1 - 0.3, 2 ) + tf.math.pow( x2 - 0.5, 2 )
diff_loss = tf.math.pow( ( x1 - x2 ) / D , -2 )

loss = bnd_loss + keep_loss + diff_loss
# opt = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
opt = tf.train.AdamOptimizer().minimize(loss)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(4000):
        ret = sess.run([x1,x2,loss])
        if i % 100 == 0:
            print(i, ret)
        sess.run(opt)    

出力

0 [0.3, 0.5, 2.2500002]
100 [0.22975032, 0.5702493, 0.7861366]
200 [0.1915977, 0.6084021, 0.5415596]
300 [0.1637411, 0.63625854, 0.44022736]
(略)
3700 [0.04612662, 0.75386834, 0.308578]
3800 [0.046126585, 0.75386834, 0.30857804]
3900 [0.04612657, 0.75386834, 0.308578]

参考 https://m-alcu.github.io/blog/2018/01/16/tensorflow-minimize/

PRML2章メモ カーネル密度推定

PRML2章


密度推定においては、
ヒストグラム法よりカーネル密度推定や最近傍法が優れている。
ハンド幅BW(平滑化係数)について、推定密度 p(x|X,bw) のデータノイズへ過敏さと過剰な平滑化の間のトレードオフがある。

 

BWの選択としては、CV(クロスバリデーション)を用いるか、ヒューリスティックな方法としてsilvermanやscottの方法が使える。

 

 

■ 補足リンク:

 

〇 BWの選択について

"データ解析 第十回「ノンパラメトリック密度推定法」"

http://ibis.t.u-tokyo.ac.jp/suzuki/lecture/2015/dataanalysis/L9.pdf

 

〇 既存実装

"Pythonカーネル密度推定(KDE)について調べたまとめ"

https://vaaaaaanquish.hatenablog.com/entry/2017/10/29/181949

-> scipyにはガウス窓を用いたカーネル密度推定の実装がある。BW選定方法としては、silvermanの方法とscottの方法が選べる

Tensorflow(Keras)かPytorchか

KerasかPytorchか

 

簡単に調べた・知っている範囲だと

■ Keras

変なことしないなら少ない行数ですむ(?)

Tensorflowバックエンドがついてくる(というかTF2.0でKerasと融合しつつある)

TFバックエンドなら、モバイル(TFLite)への移行がスムーズ。EdgeTPUがついてくる。

■ Pytorch

細かいところもいじりたいなら最終的に楽(?)

Kerasより早い

 

[ 2019/11/01追記]

以下記事によると、2019年現在10月現在研究用途ではPytorchが圧倒しつつある。Production用途では、Tensorflowが依然優勢。現状experimentalではあるがpytorchのmobile対応が進んでいる。筆者的にはpytorch推し。

 https://thegradient.pub/state-of-ml-frameworks-2019-pytorch-dominates-research-tensorflow-dominates-industry/ 

 

 

メモ: 

Deep Learning for Image Denoising: A Survey

https://arxiv.org/abs/1810.05052

 

0.5割読んだだけのメモ書き
Awgn には有効だが、real image や複数種のノイズに一つのモデルで対応するのは依然課題っぽい

UDNet はマルチレベルノイズへの対応を目指している? 読まないとわからない

 

noiseed rael image のデータセットとして PolyUというものがあるらしい。

https://arxiv.org/abs/1804.02603

https://github.com/csjunxu/PolyU-Real-World-Noisy-Images-Dataset

メモ: Simple and Scalable Predictive Uncertainty Estimation using Deep Ensembles

Simple and Scalable Predictive Uncertainty Estimation using Deep Ensembles
Lakshminarayanan et. al 2017,

https://arxiv.org/abs/1612.01474

 

要約記事

https://tech.instacart.com/3-nips-papers-we-loved-befb39a75ec2

 

Uncertaintyの推定は重要。

未知入力に対しても、high-confidenceな推定を出してしまいがち。それを防ぎたい。

 

regressionの場合はμに加えて推定の分散σも推定する。

classificationの場合はcross entropyを使うとよい。

 

model を emsenbleすると、未知データに対してのconfidenceが下がる(entropyが大きくなる、と言い換えられる)。

adversarial train も試しているがあまり効果なし?

 

実験:

emsemble(+adversarial train )でMNISTで学習すると、未知データに対してconfidenceが小さくなる。

 

要約記事から引用

f:id:l8l:20190320223432p:plain

f:id:l8l:20190320223510p:plain

 

一言:

emsembleすると未知データへのconfidenceが下がるというのはわかりやすい。試しやすいので覚えておくとよさそう。

> "In practical applications, it is highly desirable for a system to avoid overconfident, incorrect predictions
and fail gracefully. To evaluate the usefulness of predictive uncertainty for decision making, we
consider a task where the model is evaluated only on cases where the model’s confidence is above an
user-specified threshold"

とても分かる

 

アンサンブルした結果、単にconfidenceのdistribution(Pconfとおく)が写像gでg(Pconf)のように変動しただけで、何の役にも立っていないのでは?と一瞬疑問に思った。しかし、in-distributionからのサンプル(z ~ Pin)へのconfidenceはアンサンブル量Mを増やしても高いまま(Figure5)だから杞憂だった。

 

以上。