閃 き

閃き- blog

きらびやかに、美しく、痛烈に.

EMアルゴリズム

https://www.mathworks.com/matlabcentral/mlc-downloads/downloads/submissions/65772/versions/3/screenshot.png

 EM アルゴリズムは,不完全データに基づく統計モデル一般に適用される,最尤推定量を導出するためのアルゴリズムです. もともと,「不完全データ・完全データ」という概念は欠損データの問題に対処するために立てられましたが,定義を拡張することで,切断データ・打ち切りデータ・混合分布モデル・ロバスト分布モデル・潜在変数モデル・ベイズモデルなどにも適用できます.

 クラスタリング教師なし学習に用いられる多くの手法(例:k-means,混合ガウス分布モデル)は,計算過程に着目するとEMアルゴリズムとして一般化できます.さらに,情報幾何の観点からEMアルゴリズムを解析した研究も盛んで,指数分布族をもつ確率モデルに対するEMアルゴリズムの適用は,e-射影/m-射影という形式でまとめられます.

1. 統計的推測

目的:ある変数 x \in X が従う確率分布 q(x) を求めたい.

このとき,パラメータ \theta \in \Thetaで決定される確率モデル p(x|\theta)を考え, nコのデータサンプル \mathcal{D} := {\{x_i\}}_{i=1}^{n} から最適なパラメータ \theta^{*} \in \Theta を選ぶことで

$$ x \sim q(x) \approx p(x|\theta) $$

という近似式を成り立たせたい.これを統計的推測(推定)という.

2. 最尤推定

統計的推測の最も基本的なアルゴリズム最尤推定である.対数尤度関数:

$$ \ell(\theta | x) := \log p(x | \theta) $$

を定義して, nコのデータサンプル \mathcal{D} := {\{x_i\}}_{i=1}^{n} から,

$$ J(\theta) := \frac{1}{n} \sum_{i=1}^{n} \ell(\theta | x_i), ~~~ \hat{\theta}_{MLE} = \underset{\theta \in \Theta}{\rm argmax} ~ J(\theta) $$

を解けば,パラメータ \theta最尤推定 \hat{\theta}_{MLE} を求めることができる.

3. EMアルゴリズム

  • 完全データ  x \in X :
    • 観測不可能だが,求めたい確率分布p(x)に完全に従うデータ.
  • 不完全データ  y \in Y :
    • 観測可能だが,求めたい確率分布p(x)に完全に従わないデータ.

を考える.完全データ x \in X と不完全データ y \in Yの関係は一般に「1( y) 対 多( x)」となるが,ここでは応用上都合の良い仮定として,潜在変数  x \in Z を用いてこれを表す.すなわち, x = (y, z) と仮定する.

このとき,完全データ x の確率モデル:

$$ p(x | \theta) = p(y, z | \theta) $$

を考える,ここで,変数 x のデータサンプル x_iは観測できないため尤度関数 p(x_i|\theta) は計算できないが,変数 y のデータサンプル y_iは観測できることを利用して,

$$ \begin{eqnarray} p(y | \theta) &=& \int_{Z} p(x | \theta) ~ dz \\ &=& \int_{Z} p(y, z | \theta) ~ dz \end{eqnarray} $$

という量を考える.このとき,


変数 x \in X が従う確率分布 q(x) を近似する確率モデル p(x|\theta) を定める

ための計算法としてEMアルゴリズムが登場する.具体的には以下の通り.

  1. 初期値 \theta^{0}を与える.
  2. For each step  t:
    • E step
      期待値(Expectation) Qを計算する. $$ Q(\theta | \theta^{(t)}) = \mathbb{E}_{x \sim p(x|\theta)} \left[ \log p(x|\theta) | y, \theta^{(t)} \right] $$

    • M step
      期待値 Q を最大化(Maximzation)するパラメータ \thetaを求める. $$ \theta^{(t+1)} = \underset{\theta \in \Theta}{\rm argmax} ~ Q(\theta | \theta^{(t)}) $$

  3. 収束した値 \theta^{(\infty)} を推定値 \hat{\theta}_{EM} とし,確率モデル p(x | \hat{\theta}_{EM}) を得る.

E step と M step で行う計算をまとめると,

  • EM step
    $$ \begin{eqnarray} \theta^{(t+1)} &=& \underset{\theta \in \Theta}{\rm argmax} ~ \mathbb{E}_{x \sim p(x|\theta)} \left[ \log p(x | \theta) | y, \theta^{(t)} \right] \\ &=& \underset{\theta \in \Theta}{\rm argmax} ~ \mathbb{E}_{(y,z) \sim p(y,z|\theta)} \left[ \log p(y, z | \theta) | y, \theta^{(t)} \right] \\ &=& \underset{\theta \in \Theta}{\rm argmax} ~ \mathbb{E}_{z | {\theta}^{(t)} \sim \int_{Y} p(y,z | {\theta}^{(t)}) dy} \left[ \log p(y, z | \theta) \right] \\ \end{eqnarray} $$

となる.

参考文献

続・わかりやすいパターン認識―教師なし学習入門―

続・わかりやすいパターン認識―教師なし学習入門―

EMアルゴリズムと不完全データの諸問題

EMアルゴリズムと不完全データの諸問題

計算統計学の方法―ブートストラップ・EMアルゴリズム・MCMC (シリーズ予測と発見の科学 5)

計算統計学の方法―ブートストラップ・EMアルゴリズム・MCMC (シリーズ予測と発見の科学 5)

計算統計 I―確率計算の新しい手法 (統計科学のフロンティア 11)

計算統計 I―確率計算の新しい手法 (統計科学のフロンティア 11)

計算統計II――マルコフ連鎖モンテカルロ法とその周辺【統計科学のフロンティア12】 (岩波オンデマンドブックス)

計算統計II――マルコフ連鎖モンテカルロ法とその周辺【統計科学のフロンティア12】 (岩波オンデマンドブックス)

2019上半期・買った本/読んだ本まとめ

2019年上半期に読んだ本。

新書・文庫本

問題解決の心理学―人間の時代への発想 (中公新書 (757))

問題解決の心理学―人間の時代への発想 (中公新書 (757))

自分を知るための哲学入門 (ちくま学芸文庫)

自分を知るための哲学入門 (ちくま学芸文庫)

社会学史 (講談社現代新書)

社会学史 (講談社現代新書)

話題・啓蒙

サピエンス全史(上)文明の構造と人類の幸福

サピエンス全史(上)文明の構造と人類の幸福

ホモ・デウス 上: テクノロジーとサピエンスの未来

ホモ・デウス 上: テクノロジーとサピエンスの未来

〈インターネット〉の次に来るもの 未来を決める12の法則

〈インターネット〉の次に来るもの 未来を決める12の法則

ゲンロン0 観光客の哲学

ゲンロン0 観光客の哲学

ミクロ経済学の力

ミクロ経済学の力

Google PageRankの数理 ―最強検索エンジンのランキング手法を求めて―

Google PageRankの数理 ―最強検索エンジンのランキング手法を求めて―

理工学

自己組織化と進化の論理―宇宙を貫く複雑系の法則 (ちくま学芸文庫)

自己組織化と進化の論理―宇宙を貫く複雑系の法則 (ちくま学芸文庫)

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)

カーネル多変量解析―非線形データ解析の新しい展開 (シリーズ確率と情報の科学)

カーネル多変量解析―非線形データ解析の新しい展開 (シリーズ確率と情報の科学)

一般システム理論――その基礎・発展・応用

一般システム理論――その基礎・発展・応用

工学のための関数解析 (工学のための数学)

工学のための関数解析 (工学のための数学)

ベイズ統計の理論と方法

ベイズ統計の理論と方法

入門 確率解析とルベーグ積分

入門 確率解析とルベーグ積分

統計力学〈1〉 (新物理学シリーズ)

統計力学〈1〉 (新物理学シリーズ)

数学ガール/フェルマーの最終定理 (数学ガールシリーズ 2)

数学ガール/フェルマーの最終定理 (数学ガールシリーズ 2)

オートポイエーシス―第三世代システム

オートポイエーシス―第三世代システム

情報系

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

詳解UNIXプログラミング 第3版

詳解UNIXプログラミング 第3版

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン)

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

Ubuntu 16.04.6 LTS (GNU/Linux, x86_64) のGPUマシンの設定・TF1.13.1 / CUDA10.0 / cuDNN7.4.2

f:id:yumaloop:20191105181908p:plain



- 最終更新:2019/11/07

クリーンブートしたUbuntu16.04LTS マシンに,NVIDIA GPUを導入し,CuDA・cuDNNをセットアップしました. おもにtensorflow-gpuを使うためです.導入過程で色々とつまづいたので,得た知識をこのポストにまとめておきます.

実行環境

最終的に完成したマシンの動作環境は下記の通りです. latest update : 2019/05/15

  • OS : Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-145-generic x86_64)
  • Memory : 16 GB
  • CPU(x8) : Intel Core i7-6700 CPU @ 3.40GHz
  • GPU(x1) : NVIDIA Geforce GTX 1080
    • NVIDIA CUDA : 10.0.130 (/usr/local/cuda-10.0/)
    • NVIDIA cuDNN : 7.4.2.24 (/usr/lib/x86_64-linux-gnu/libcudnn.so.7.4.2)
    • Python3 : 3.6.9 (/usr/bin/python3.6)
    • Python2 : 2.7.12 (/usr/bin/python)
      • tensorflow : 1.13.1 ($HOME/.local/lib/python3.6/site-packages)
      • tensorflow-gpu : 1.13.1 ($HOME/.local/lib/python3.6/site-packages)
      • keras : 2.2.4 ($HOME/.local/lib/python3.6/site-packages)

1. OS

  • 方法1: unameコマンドを使う

unameコマンドを使うと,「OS名,ホスト名,OSリリース,OSバージョン,マシンアーキテクチャ,CPUタイプ,プラットフォーム,OS名」が順に表示される.

$ uname -a

Linux XXXX 4.4.0-145-generic #171-Ubuntu SMP Tue Mar 26 12:43:40 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

  • 方法2: /etc/issueをみる

マシンの「Linuxディストリビューション」が表示される.今回はUbuntu16.04.

$ cat /etc/issue

Ubuntu 16.04.6 LTS \n \l

  • 方法3: /etc/lsb-releaseをみる
$ cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"

  • 方法4: /etc/os-releaseをみる
$ cat /etc/os-release

NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 16.04.6 LTS" VERSION_ID="16.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" VERSION_CODENAME=xenial UBUNTU_CODENAME=xenial

  • 方法5: /proc/versionをみる

/proc/versionをみると,Linuxカーネルの詳細が確認できる.

$ cat /proc/version

Linux version 4.4.0-159-generic (buildd@lgw01-amd64-042) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) ) #187-Ubuntu SMP Thu Aug 1 16:28:06 UTC 2019

2. HDD

2.1. HDDデバイスの確認

  • dfコマンド
$ df -h

Filesystem Size Used Avail Use% Mounted on
udev 7.8G 0 7.8G 0% /dev tmpfs 1.6G 34M 1.6G 3% /run /dev/sda1 214G 101G 103G 50% / tmpfs 7.9G 0 7.9G 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup tmpfs 1.6G 64K 1.6G 1% /run/user/1001 /dev/loop0 89M 89M 0 100% /snap/core/7270 /dev/loop1 384K 384K 0 100% /snap/patchelf/61 /dev/loop2 384K 384K 0 100% /snap/patchelf/69

3. メモリ

3.1. メモリデバイスの確認

  • /proc/meminfoをみる

/proc/meminfoをみると,メモリ容量の詳細を確認できる.

$ cat /proc/meminfo

MemTotal: 16377200 kB
MemFree: 3077848 kB
MemAvailable: 15767804 kB
Buffers: 363052 kB
Cached: 12274992 kB
SwapCached: 66936 kB
Active: 8048088 kB
Inactive: 4689560 kB
Active(anon): 25860 kB
Inactive(anon): 86584 kB
...
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 1907316 kB
DirectMap2M: 14815232 kB
DirectMap1G: 0 kB

3.2. 仮想メモリの状態確認

  • 方法1: freeコマンド

freeを使う.

$ free

total used free shared buff/cache available
Mem: 16377148 300020 6661176 9876 9415952 15688968 Swap: 16720892 0 16720892

  • 方法2: vmstatコマンド

vmstatを使う.

$ vmstat

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 90724 1771068 363852 9020168 322 295 335 492 1 1 2 0 97 1 0

  • 方法3: topコマンド

topを使う.

$ top

top - 20:17:14 up 56 days, 1:17, 5 users, load average: 2.02, 1.99, 1.66
Tasks: 180 total, 3 running, 177 sleeping, 0 stopped, 0 zombie %Cpu(s): 25.0 us, 0.0 sy, 0.0 ni, 75.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 16377200 total, 1078612 free, 5914516 used, 9384072 buff/cache KiB Swap: 16720892 total, 16630168 free, 90724 used. 10049856 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
14461 xxxxxxx 20 0 54.634g 1.768g 12740 R 100.0 11.3 18:30.96 python3
14499 xxxxxxx 20 0 54.634g 1.752g 12448 R 100.0 11.2 17:54.35 python3
1 root 20 0 119680 4616 3084 S 0.0 0.0 0:31.51 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.20 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:05.32 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root 20 0 0 0 0 S 0.0 0.0 18:07.52 rcu_sched
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root rt 0 0 0 0 S 0.0 0.0 0:00.25 migration/0
...

4. CPU

4.1. CPUデバイスの確認

  • 方法1: /proc/cpuinfoをみる
# CPUデバイスの確認
$ cat /proc/cpuinfo

processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 94
model name : Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
stepping : 3
microcode : 0xc6
cpu MHz : 800.062
cache size : 8192 KB
physical id : 0
siblings : 8
...
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 94
model name : Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
...

5. GPU

5.1. GPUバイスの確認

  • lshwコマンド
# GPUデバイスの確認
$ sudo lshw -C display 

*-display
詳細: VGA compatible controller
製品: GP104 [GeForce GTX 1080]
ベンダー: NVIDIA Corporation
物理ID: 0
バス情報: pci@0000:01:00.0
バージョン: a1
幅: 64 bits
クロック: 33MHz
性能: pm msi pciexpress vga_controller bus_master cap_list rom
設定: driver=nvidia latency=0
リソース: irq:16 メモリー:de000000-deffffff メモリー:c0000000-cfffffff メモリー:d0000000-d1ffffff IOポート:e000(サイズ=128) メモリー:df000000-df07ffff

  • lspciコマンド

lspciでハードウェアデバイス一覧が確認できる.

# GPUデバイスの確認
$ lspci  | grep -i nvidia 

01:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1080] (rev a1)
01:00.1 Audio device: NVIDIA Corporation GP104 High Definition Audio Controller (rev a1)

5.2. NVIDIA ドライバ

下記のリンクから,自分のGPUにあうドライバを検索して,ダウンロードする.

f:id:yumaloop:20191106131727p:plain

今回,NVIDIA GeForce 1080に対応したドライバ情報は以下のようになった.

f:id:yumaloop:20191106131109p:plain

新しくGPUドライバ(NVIDIAドライバ)をインストールする前に,すでにインストールされているGPUドライバを確認する.

# マシンにインストール済みのNVIDIAドライバを一覧表示
$ dpkg -l | grep nvidia

# apt-getでインストールできるNVIDIAドライバの一覧表示
$ apt-cache search "^nvidia-[0-9]{3}$"
# NVIDIA ドライバを提供している xorg-edgers レポジトリを追加する
$ sudo add-apt-repository ppa:xorg-edgers/ppa -y
$ sudo apt-get update
# ドライバ nvidia-396 をインストール
$ sudo apt-get install -y nvidia-396
$ reboot

5.3. CUDA 10.0をマシンにインストール

f:id:yumaloop:20191106123629p:plain

まず,CUDA・cuDNN・TensorFlow-GPUのバージョンを合わせる必要があります. 以下のリンクから,Tensorflow-gpuに対応するcuDNNとCUDAのバージョンを確認できます.

f:id:yumaloop:20191106125506p:plain

今回は,

  • Python 3.6.9
  • tensorflow-gpu 1.13.1
  • CUDA 10.0
  • cuDNN 7.4

で環境構築しようと思います.

以下のURLから,自分の環境にあったCUDA Toolkitパッケージをダウンロードし,マシンへインストールします.

注意:https://developer.nvidia.com/cuda-downloads は,最新バージョンのダウンロードリンクなので,ここから安易にダウンロードしてはいけない.特に,tensorflow-gpuは,最新のCUDA Toolkitに対応していないので注意する.CUDAとTensorflow-gpuのバージョンがあっていないと,たとえばImportError: libcublas.so.10.0が発生する. github.com

f:id:yumaloop:20191107152200p:plain

今回は,CUDA10.0で,マシンの環境として,

  • Operating System: Linux
  • Architecture: x86_64
  • Distribution: Ubuntu
  • Version: 16.04
  • Installer Type: deb [network]

を選択しました.

f:id:yumaloop:20191107160732p:plain

対応するCUDA Toolkit(CUDA 10.0)の.debファイル(network)は「cuda-repo-ubuntu1604_10.0.130-1_amd64.deb」です. この.debファイルをwgetコマンドを使って,マシンへダウンロードし,

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_10.0.130-1_amd64.deb

dpkgコマンドでパッケージとして保存します.さらに,aptコマンドでcudaパッケージをインストールします. 注意:公式に書かれているsudo apt-get install cudaを実行すると自動的に最新版のCUDAがインストールされる.

# CUDA Toolkit(CUDA 10.0)をマシンにインストールする
$ sudo dpkg -i cuda-repo-ubuntu1604_10.0.130-1_amd64.deb
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda-10-0

これでCUDA Toolkit(10.0)のインストールは完了です. あとは,環境変数を設定しましょう.

  • CUDAの確認

CUDA Toolkit(CUDA 10.0)が正常にインストールされているか確認します.

# CUDAがインストールされているか確認
$ ls -l /usr/local/ | grep cuda

lrwxrwxrwx 1 root root 9 11月 7 16:51 cuda -> cuda-10.0
drwxr-xr-x 16 root root 4096 11月 7 16:51 cuda-10.0

/usr/local/以下にcuda-10.0というディレクトリがあり,かつリンク cuda -> cuda-10.0が貼られています.

  • CUDA Toolkit(cuda-10.0)のパス - /usr/local/cuda-10.0/bin
  • NVIDIAドライバ(nvidia-418)のパス - /usr/lib/nvidia-418

次にnvccコマンドのPATHを通すために,~/.bashrcに以下を追加して,source ~/.bashrcで更新します.

# 環境変数$PATHにCUDA Toolkitのパスを追加
export PATH=/usr/local/cuda-10.0/bin:${PATH}

# 環境変数$LD_LIBRARY_PATHにCUDA Toolkitのパスを追加
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH}

# 環境変数$LD_LIBRARY_PATHにNVIDIAドライバのパスを追加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/nvidia-418

  • CUDAの詳細情報

CUDA Toolkitの詳細情報は,nvccコマンドで取得できます.

# CUDAの確認
$ nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130

nvccコマンドは,CUDA Toolkitに対応して「/usr/local/cuda-10.1/bin/nvcc」にあればOK

$ which nvcc

/usr/local/cuda-10.0/bin/nvcc

  • CUDAのバージョン確認

CUDAのバージョンを確認したい場合,/usr/local/cuda/version.txtをみればよい.

# CUDAのバージョン確認
$ cat /usr/local/cuda/version.txt

CUDA Version 10.0.130

5.4. cuDNN 7.4.2をマシンにインストール

cuDNNのインストールには,NVIDIA accountを登録(無料)してログインする必要があります. (注:https://developer.nvidia.com/rdp/cudnn-download は,最新バージョンのダウンロードリンクなので,ここから安易にダウンロードしてはいけない.

f:id:yumaloop:20191107171227p:plain

今回はCUDA10.0を使うので,「Download cuDNN v7.4.2 (Dec 14, 2018), for CUDA 10.0」を選択します.

f:id:yumaloop:20191107171352p:plain

インストールするマシンのOS(Ubuntu16.04)に合わせて,3つの.debファイルをダウンロードします.

  • cuDNN Code Samples and User Guide for Ubuntu16.04 (Deb) - libcudnn7_7.4.2.24-1+cuda10.0_amd64.deb
  • cuDNN Runtime Library for Ubuntu16.04 (Deb) - libcudnn7-dev_7.4.2.24-1+cuda10.0_amd64.deb
  • cuDNN Developer Library for Ubuntu16.04 (Deb) - libcudnn7-doc_7.4.2.24-1+cuda10.0_amd64.deb

パッケージをダウンロードしたディレクトリで,パッケージをインストールします.

# cuDNN7.4.2 (for CUDA10.0)をインストール
$ sudo dpkg -i libcudnn7_7.4.2.24-1+cuda10.0_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.4.2.24-1+cuda10.0_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.4.2.24-1+cuda10.0_amd64.deb

注意:3つの.devファイルには依存関係があるので,「libcudnn7 > libcudnn7-dev > libcudnn7-doc」の順番でインストールする.

github.com

5.5. cuDNNの動作確認

CUDA Toolkit(CUDA10.0)に付属しているサンプルコードを実行して,cuDNNの動作確認をします.

$ cd /usr/local/cuda-10.0/bin
# ホームディレクトリにサンプルコードのあるディレクトリをコピー
$ cuda-install-samples-10.0.sh ~
Copying samples to /home/uchiumi/NVIDIA_CUDA-10.0_Samples now...
Finished copying samples.
$ cd ~/NVIDIA_CUDA-10.0_Samples
$ make
$ cd 2_Graphics/volumeRender
$ ./volumeRender # exeファイルを実行する
$ cd
$ rm -rfv ~/NVIDIA_CUDA-10.0_Samples/ # サンプルコードを消す。

5.6. cuDNNの確認

dpkg -lコマンドでインストール済みのパッケージを一覧表示する.

# マシンにインストール済みのcuDNNパッケージを一覧表示
$ dpkg -l | grep cudnn

ii libcudnn7 7.4.2.24-1+cuda10.0 amd64 cuDNN runtime libraries
ii libcudnn7-dev 7.4.2.24-1+cuda10.0 amd64 cuDNN development libraries and headers
ii libcudnn7-doc 7.4.2.24-1+cuda10.0 amd64 cuDNN documents and samples

5.7. cuDNNの保存場所

# debパッケージが保存されているディレクトリを確認(-Lオプション)
$ dpkg -L libcudnn7

/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libcudnn.so.7.4.2
/usr/share
/usr/share/doc
/usr/share/doc/libcudnn7
/usr/share/doc/libcudnn7/changelog.Debian.gz
/usr/share/doc/libcudnn7/copyright
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/libcudnn7
/usr/lib/x86_64-linux-gnu/libcudnn.so.7

5.9. CUDA(/usr/local/cuda-***/bin)のPATHチェック

# 出力に"/usr/local/cuda-10.0/bin"が含まれているか?
$ echo $PATH

5.10. CUDAとNVIDIAドライバ(/usr/lib/nvidia-***)のPATHチェック

# 出力に"/usr/local/cuda-10.0/lib64"と"/usr/lib/nvidia-418"が含まれているか?
$ echo $LD_LIBRARY_PATH  

5.11. CUDAとnvccコマンドのPATHチェック

# 出力が"/usr/local/cuda-10.0/bin/nvcc"になっているか?
$ which nvcc             
/usr/local/cuda-10.0/bin/nvcc

5.12. nvidia-smiコマンドのPATHチェック

# 出力が"/usr/bin/nvidia-smi"になっているか?
 $ which nvidia-smi
/usr/bin/nvidia-smi

# GPUの状態が表示されているか?
$ nvidia-smi             
Thu May 16 13:26:12 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.14       Driver Version: 430.14       CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 1080    Off  | 00000000:01:00.0 Off |                  N/A |
| 32%   42C    P5    27W / 200W |      0MiB /  8118MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

6. Tensorflow-GPU

6.1. tensorflow インストール (1.10.0以上だとCUDAに対応していないかも)

以下のリンクから,Tensorflow-gpuに対応するcuDNNとCUDAのバージョンを確認する. - https://www.tensorflow.org/install/source#linux

f:id:yumaloop:20191106125506p:plain

なお,Version 1.16.4より最新のNumpyを使っている場合,import tensorflowとしたときに不具合が発生します. pip3 numpy install==1.16.4とすればOK.(下記参照) github.com

Ubuntuの場合,

  • sudo pip3でインストールしたもの
    /usr/local/lib/python3.?/site-packages/へ保存
  • pip3でインストールしたもの
    /home/<username>/.local/lib/python3.?/site-packages/へ保存
# tensorflow インストール
$ pip3 uninstall tensorflow-gpu
$ pip3 install tensorflow-gpu==1.13.1
$ pip3 show tensorflow-gpu # version check

pyteyon.hatenablog.com

$ python3
Python 3.6.9 (default, Jul  3 2019, 15:36:16) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tensorflow.python.client import device_lib
>>> device_lib.list_local_devices()
...

[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 12399580590058509262
, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"
memory_limit: 17179869184
locality {
}
incarnation: 8346102148670114463
physical_device_desc: "device: XLA_GPU device"
, name: "/device:XLA_CPU:0"
device_type: "XLA_CPU"
memory_limit: 17179869184
locality {
}
incarnation: 16269880268349154236
physical_device_desc: "device: XLA_CPU device"
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 7938857370
locality {
bus_id: 1
links {
}
}
incarnation: 9065886904258284582
physical_device_desc: "device: 0, name: GeForce GTX 1080, pci bus id: 0000:01:00.0, compute capability: 6.1"
]

7.ディスプレイ

7.1 ディスプレイマネージャ(DM)を確認

$ cat /etc/X11/default-display-manager
/usr/sbin/lightdm

ja.clccomputers.com

7.2 GUI/CUIの切り替え

systemctlコマンドを使って,GUI/CUIの切り替えを行う.

#GUIログインが有効かどうか確認
$ sudo systemctl get-default
graphical.target #GUIログインが有効
# CUIログインに変更
$ sudo systemctl set-default multi-user.target 

# GUIログインに変更
$ sudo systemctl set-default graphical.target

bellsmarket.hatenablog.com

8.ディスクとファイルシステム

8.1. 現在のディレクトリ直下のファイル数を確認

lsコマンドの出力結果の行数をwcコマンドで数える.

# ファイル数を確認
$ ls -1 | wc -l

8.2. 現在のディレクトリ直下のファイルサイズを確認

ncduコマンドを使って,ファイルサイズを確認.

# ncduコマンドをインストール
$ sudo apt-get install ncdu -y (Debian/Ubuntu)
$ sudo yum install ncdu -y (RHEL系)

# ルート直下でncduコマンドを起動
$ cd /
$ ncdu

orebibou.com

duコマンドを使って,ファイルサイズを確認.duは,ディスク使用量をディレクトリごとに集計して表示するLinuxコマンド.

# カレントディレクトリ直下のファイルおよびディレクトリのディスク使用量とその合計を表示する
$ du -s -c *
84698948    Kaggle
1292748 NVIDIA_CUDA-10.1_Samples
705000  Research
107836  dataset
12  envinfo.txt
12  examples.desktop
9484    gym
7830428 workspace
1412    yt8m
686388  ダウンロード
4   テンプレート
4   デスクトップ
4   ドキュメント
4   ビデオ
4   ピクチャ
4   ミュージック
4   公開
95332296    合計

8.3. ディスクの空き領域を確認

dfコマンドを使って,ディスクの空き領域を確認./dev/sda1が物理的な(ハードウェアレベルでの)データ容量.

# dfでディスクの空き領域を表示
# -hオプション: 読みやすいサイズ表記で表示する
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            7.8G     0  7.8G   0% /dev
tmpfs           1.6G  9.2M  1.6G   1% /run
/dev/sda1       214G  111G   92G  55% /
tmpfs           7.9G  184K  7.9G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup
/dev/loop0      384K  384K     0 100% /snap/patchelf/79
/dev/loop3       90M   90M     0 100% /snap/core/7713
/dev/loop2       89M   89M     0 100% /snap/core/7396
tmpfs           1.6G   36K  1.6G   1% /run/user/108
tmpfs           1.6G     0  1.6G   0% /run/user/1001
/dev/loop4      384K  384K     0 100% /snap/patchelf/87

9. Docker

9.1. Dockerをインストール

hirosanote.hatenablog.jp

9.2. Dockerチュートリアル

docs.docker.com


参考文献

ARMA Process(自己回帰移動平均過程)

https://s3.amazonaws.com/quantstartmedia/images/qs-tsa-armapq-amzn-cl.png

このポストでは,時系列データに対する基本的なモデル,ARMA過程についてまとめます.画像はAmazon.comの株価推移です.

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)

MA(q)過程: Moving average process

  • モデル式:MA(q)

y_t = \mu + \epsilon_t + (\theta_1, \cdots \theta_q)
\left( \begin{array}{c} \epsilon_{t-1}  \\ \vdots \\ \epsilon_{t-q} \end{array}\right),
 ~~~  \epsilon_{t} \sim W.N.(\sigma^2)
  • 統計量

\left\{
\begin{array}{c}
\begin{align}
E[y_t] &= \mu \\
V[y_t] &= \gamma_0 = (1 + {\theta_1}^{2} + \cdots + {\theta_q}^{2}) \cdot {\sigma}^{2} 
\end{align}
\end{array}
\right.



\begin{align}
Cov[y_t,y_{t-k}] &= \gamma_k \\
&= \left\{ \begin{array}{c}(\theta_k + \theta_1\theta_{k+1} + \cdots + \theta_{q-k}\theta_{k}) \cdot {\sigma}^{2} ~~~  (1 \leq k \leq q) \\ 0 \hspace{12em} (k \geq q+1)  \end{array} \right. 
\\ \\
\rho_k &= \frac{\gamma_k}{\gamma_0} \\
&= \left\{ \begin{array}{c} {\large \frac{\theta_k + \theta_1\theta_{k+1} + \cdots + \theta_{q-k}\theta_{k}}{1 + {\theta_1}^2 + \cdots + {\theta_q}^2} } ~~~  &(1 \leq k \leq q) \\ 0 \hspace{7em} &(k \geq q+1)  \end{array} \right. 
\end{align}
  • 定常性

    MA(q)モデルでは統計量( E, V, Cov)は,パラメータ \theta_1, \cdots, \theta_qの値に依らず,常に定常となる.


AR(p)過程: Autoregressive process

  • モデル:AR(p)

y_t = c + \epsilon_t + \left( \phi_1, \cdots, \phi_p \right)
\left( \begin{array}{c} y_{t-1}  \\ \vdots \\ y_{t-p} \end{array} \right) , ~~~ \epsilon_{t} \sim W.N.(\sigma^2)
  • 統計量

\\
\begin{array}{c}
\begin{align}
E[y_t] &= \mu \\
&= c + \phi_1 E[y_{t-1}] + \cdots + \phi_p E[y_{t-p}] \\
&= \frac{c}{1 - \phi_1 - \cdots - \phi_p}
\\ \\
V[y_t] &= \gamma_0 \\
&= {\sigma}^{2} + \phi_1^2 V[y_{t-1}] + \cdots + \phi_p^2 V[y_{t-p}] \\
&= \frac{\sigma^2}{(1 - \phi_1^2\rho_1 - \cdots - \phi_p^2 \rho_p)}
\end{align}
\end{array}


 
\begin{align}
\\
Cov[y_t,y_{t-k}] &= \gamma_k = \phi_1 \gamma_{k-1} + \cdots + \phi_p \gamma_{k-p} \hspace{2em}  (1 \leq k)
\\ \\
\rho_k &= \frac{\gamma_k}{\gamma_0} = \phi_1 \rho_{k-1} + \cdots + \phi_p \rho_{k-p} \hspace{2em} (1 \leq k) 
\\ \\ 
\rho_1 &= \frac{\gamma_1}{\gamma_0} = \phi_1
\end{align}
  • 定常性

    AR(p)モデルでは統計量( E,V,Cov)は,パラメータ \phi_1, \cdots, \phi_qの値に対して,特性方程式: $$ 1 - \phi_1 {z}^1 - \cdots - \phi_p {z}^{p} = 0 $$ の複素数 zの絶対値が1よりも大きい時,定常となる.


ARMA(p,q)過程: Autoregressive moving average process

  • モデル:ARMA(p,q)
 
y_t = c + \left( \phi_1, \cdots, \phi_p \right) \left( \begin{array}{c} y_{t-1}  \\ \vdots \\ y_{t-p} \end{array} \right)
+ (\theta_1, \cdots \theta_q) \left( \begin{array}{c} \epsilon_{t-1}  \\ \vdots \\ \epsilon_{t-q} \end{array}\right),
~~~ \epsilon_t \sim W.N.(\sigma^2)
  • 統計量

\begin{array}{c}
\begin{align}
E[y_t] &= \mu \\
&= c + \phi_1 E[y_{t-1}] + \cdots + \phi_p E[y_{t-p}] \\
&= \frac{c}{1 - \phi_1 - \cdots - \phi_p}
\\ \\
V[y_t] &= \gamma_0 \\
&= {\sigma}^{2} + \phi_1^2 V[y_{t-1}] + \cdots + \phi_p^2 V[y_{t-p}] \\
&= \frac{{\sigma}^2}{(1 - \phi_1^2 \rho_1 - \cdots - \phi_p^2 \rho_p)}
\end{align}
\end{array}

\begin{align}
\\
Cov[y_t,y_{t-k}] &= \gamma_k = \phi_1 \gamma_{k-1} + \cdots + \phi_p \gamma_{k-p} \hspace{2em}  (q+1 \leq k)
\\ \\
\rho_k &= \frac{\gamma_k}{\gamma_0} = \phi_1 \rho_{k-1} + \cdots + \phi_p \rho_{k-p} \hspace{2em} (q+1 \leq k) 
\end{align}


参考文献

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)

Johnson and Lindenstrauss Lemmaとその構成論的証明

f:id:yumaloop:20190620010600p:plain:w500

ランダム行列理論(Random projection)の基本定理であるJohnson and Lindenstrauss Lemmaについて解説します. JL-補題は「変換前後でサンプル点どうしのユークリッド距離を変えない」ような関数  f の存在を主張しており,これは具体的にランダム行列  A を用いた線形写像として構成できます.

JL-補題

 d次元空間 Q \subset {\mathbb{R}}^{d}上にある  n 個のサンプル点を考える.任意の  \epsilon \in (0,1) について,

$$ k \geq \frac{4 \log n}{ {\epsilon}^{2}/2 - {\epsilon}^{3}/{3}} $$

をみたす整数  k に対して,以下をみたす  f: \mathbb{R}^{d} \to \mathbb{R}^{k} が存在する.

$$ \newcommand{\norm}[1]{\left\lVert#1\right\rVert} \forall u,v \in Q \subset {\mathbb{R}}^{d}, \\ (1 - \epsilon)\norm{u - v}^{2} \leq \norm{ f(u) - f(v) }^{2} \leq (1 + \epsilon) \norm{ u - v }^{2} $$

構成論的証明

写像  f: \mathbb{R}^{d} \to \mathbb{R}^{k} として, k \times d のランダム行列  A で定義される線形写像  f_Aを考える.

$$ {f}_{A}(x) = \frac{1}{\sqrt{k}} Ax \\ where~A_{ij} ~ {\scriptsize i.i.d.} \sim \mathcal{N}(0,1) $$

まず,正規分布の線形性・再生性*1より,

$$ \newcommand{\norm}[1]{\left\lVert#1\right\rVert} \begin{eqnarray} A_{ij}(x_{j}) &\sim& \mathcal{N}\left( 0, {x_{j}}^{2} \right) \\ {\{Ax\}}_{j} &\sim& \mathcal{N}\left( 0, \norm{ x }^{2} \right) \end{eqnarray} $$

が成り立つ.正規化して変数 Z_jを定義すれば,これは標準正規分布に従う.

$$ Z_j = \frac{{\{Ax\}}_{j}}{\norm{x}} \sim \mathcal{N}\left( 0, 1 \right) $$

さらに,

$$ \norm{Ax}^{2} = \sum_{j=1}^{k} {\{Ax\}}_{j}^{2} $$

が成り立つことに注意すると,

$$ \frac{\norm{Ax}^{2}}{\norm{x}^{2}} = \sum_{j=1}^{k} \frac{{\{Ax\}}_{j}^{2}}{\norm{x}^{2}} = \sum_{j=1}^{k} {Z_j}^{2} \sim \chi_{k}^{2} $$

となる.すなわち,行列  A による線形変換の前後で,ノルムを考えるとき,これはカイ二乗分布によって評価できる.

$$ \begin{eqnarray} Pr\left( \norm{f_{A}(x)}^{2} \lt (1 + \varepsilon) \norm{x}^{2} \right) &=&Pr\left( \norm{ \frac{1}{\sqrt{k}} Ax }^{2} \lt (1 + \varepsilon) \norm{x}^{2} \right) \\ &=& Pr\left( \norm{ Ax }^{2} \gt (1 + \varepsilon) k \norm{x}^{2} \right) \\ &=& Pr\left( \frac{\norm{ Ax }^{2}}{\norm{x}^{2}} \gt (1 + \varepsilon) k \right) \\ &=& Pr\left( \sum_{j=1}^{k} {Z_j}^{2} \gt (1 + \varepsilon)k \right) \\ &=& Pr\left( \chi_{k}^{2} \geq (1 + \varepsilon)k \right) \end{eqnarray} $$

次に自由度  kカイ二乗分布  \chi_{k}^{2} を表す確率密度関数を考え,上式の右辺を上から抑えたい.

$$ p(\cdot | k) = \frac{1}{{2}^{\frac{k}{2}} \Gamma \left( \frac{k}{2} \right) } {x}^{\frac{k}{2} - 1} {e}^{- \frac{x}{2}} $$

https://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Chi-square_pdf.svg/1200px-Chi-square_pdf.svg.png

ややテクニカルだが,確率密度分布から不等式を整理していく.途中で定数  \lambda \in (0, \frac{1}{2}) を導入している.

$$ \begin{eqnarray} Pr \left( \chi_{k}^{2} \geq (1 + \varepsilon)k \right) & = & Pr \left( \sum_{i=1}^{k} Z_{i}^{2} \gt (1 + \varepsilon)k \right) \\ & = & Pr \left( e^{\sum_{i=1}^{k} Z_{i}^{2}} \gt e^{(1 + \varepsilon)k} \right) \\ & = & Pr \left( e^{\lambda \sum_{i=1}^{k} Z_{i}^{2}} \gt e^{ \lambda (1 + \varepsilon)k} \right) ~~~ (0 \lt \lambda \lt \frac{1}{2}) \\ & \leq & \frac{\mathbb{E}[e^{\lambda \sum_{i=1}^{k} Z_{i}^{2}}] }{e^{(1 + \varepsilon)k \lambda}} \\ & = & \frac{{ \left( \mathbb{E}[ e^{\lambda {Z_{1}^{2}}} ] \right) }^{k}}{e^{(1 + \varepsilon)k \lambda}} \\ & = & e^{-(1 + \varepsilon) k \lambda } {\left( \frac{1}{1 - 2 \lambda} \right)}^{\frac{k}{2}} \end{eqnarray} $$

ここで, \lambda = \frac{\varepsilon}{2(1 + \varepsilon)} を代入すれば,

$$ \begin{eqnarray} Pr \left( \chi_{k}^{2} \geq (1 + \varepsilon)k \right) & = & {\left( (1 + \varepsilon)e^{- \varepsilon} \right) }^{\frac{k}{2}} \\ & \leq & \exp \left( - \frac{k}{4} ( {\varepsilon}^{2} - {\varepsilon}^{3} ) \right) \end{eqnarray} $$

が求められる.ただし.

$$ 1 + \varepsilon \leq \exp \left( \varepsilon - \frac{{\varepsilon}^{2} - {\varepsilon}^{3}}{2} \right) $$

を使った.以上をまとめると,ランダム行列  A を用いて構成される写像

$$ {f}_{A}(x) = \frac{1}{\sqrt{k}} Ax \\ where~A_{ij} ~ {\scriptsize i.i.d.} \sim \mathcal{N}(0,1) $$

に対して,

$$ \begin{eqnarray} Pr\left( \norm{f_{A}(x)}^{2} \geq (1 + \varepsilon) \norm{x}^{2} \right) & \leq & \exp \left( - \frac{k}{4} ( {\varepsilon}^{2} - {\varepsilon}^{3} ) \right) \\ Pr\left( \norm{f_{A}(x)}^{2} \leq (1 + \varepsilon) \norm{x}^{2} \right) & \geq & \exp \left( - \frac{k}{4} ( {\varepsilon}^{2} - {\varepsilon}^{3} ) \right) \end{eqnarray} $$

が成り立つ.よって,JL-補題をみたす写像  f が構成された.


参考文献

機械学習でよく使う評価指標まとめ

f:id:yumaloop:20190528210419p:plain:w600


 このポストでは,機械学習でよく使われる評価指標を,回帰・分類に分けて整理します.また,各評価指標の定義だけではなく,その性質や使用上の注意点などにも言及しました.なお,"網羅性"を過度に追求して,世にある評価指標を片っ端からリストアップすると,ポストとしての目的が分からず,何より煩雑で見づらくなってしまうと思ったので,紹介する評価指標については,重要で汎用度の高いものに絞りました.

なお,このポストの内容は,CourseraにあるKaggle講座「How to Win a Data Science Competition: Learn from Top Kagglers」をまとめたものです. ja.coursera.org

 ※ 評価指標については随時,追加・更新していく予定です.このポストの内容には多分に不足/不備が含まれていると思われますが,些細な点でも,コメントなどにてご指摘いただけるととても嬉しいです.

1. 回帰

  • Notation
    •  N - number of data samples
    •  y \in \mathbb{R}^{N} - target vector (data set)
    •  \hat{y} \in \mathbb{R}^{N} - predicted vector (data set)
    •  y_i \in \mathbb{R} - target value (data)
    •  \hat{y}_{i} \in \mathbb{R} - predicted value (data)

1.1. MSE, RMSE, R2

  • MSE (Mean Square Error, 平均二乗誤差)

$$ MSE(\hat{y}) := \frac{1}{N}\sum_{i=1}^{N} { ( y_i - \hat{y}_{i} ) }^{2} $$

  • RMSE (Root Mean Square Error, 二乗平均平方根誤差)

$$ RMSE(\hat{y}) := \sqrt{ \frac{1}{N}\sum_{i=1}^{N} { ( y_i - \hat{y}_{i} ) }^{2} } $$

  • R2 (R-squared, 決定係数)

$$ {R^{2}}( \hat{y} ) := 1 - \frac{ \frac{1}{N} \sum_{i=1}^{N} { ( {y}_i - \hat{y}_{i} ) }^{2} }{ \frac{1}{N} \sum_{i=1}^{N} { ( {y}_i - \bar{y}) }^{2} } = 1 - \frac{M S E(\hat{y})}{Var(y)} $$

  • MSEについて
    • MSEは,回帰における最も基本的な評価指標
    • 予測値 \hat{y}の各要素を定数 \alphaで固定した場合( \hat{y}_i = \alpha),最適な定数  \alpha^{*}_{MSE} は観測データ y の平均値 \bar{y}になる. $$ \alpha^{*}_{MSE} := \bar{y} = \frac{1}{N}\sum_{i=1}^{N} y_i $$
  • MSE, RMSE, R2の相違点
    • 損失関数としての性質
      • モデルの予測値 \hat{y}に対するモデルパラメータ \thetaの最適化を考える.MSE・RMSE・R2はいずれも同じ. $$ \begin{eqnarray} MSE(\hat{y}_{\theta_1}) & > & MSE(\hat{y}_{\theta_2}) \\ \Leftrightarrow RMSE(\hat{y}_{\theta_1}) & > & RMSE(\hat{y}_{\theta_2}) \\ \Leftrightarrow \hspace{1.37em} {R^{2}}(\hat{y}_{\theta_1}) & > & {R^{2}}(\hat{y}_{\theta_2}) \end{eqnarray} $$
      • パラメータの更新に,勾配法を使う場合は注意.
        • RMSEを損失関数にした場合,MSEよりも更新幅が小さくなる. $$ \frac{\partial RMSE}{\partial \hat{y}_{i}} = \frac{1}{2 \sqrt{MSE}} \frac{\partial MSE}{\partial \hat{y}_{i}} $$
    • モデルの絶対評価を行う際は,MSEではなくR2(決定係数)がよく使われる.


1.2. MAE

  • MAE (Mean Absolute Error, 平均絶対誤差)

$$ MAE(\hat{y}) := \frac{1}{N}\sum_{i=1}^{N} \left| y_i - \hat{y}_{i} \right| $$

  • MAEについて

    • 予測値 \hat{y}の各要素を定数  \alpha で固定した場合( \hat{y}_i = \alpha),最適な定数  \alpha^{*}_{MAE}は観測データ yの中央値median(y)になる. $$ \alpha^{*}_{MAE} := median(y) $$
    • 損失関数としての性質
      • MAEを損失関数とする場合,勾配法はあまり使われない
      • 予測値  \hat{y}の各要素を定数 \alphaで固定した場合( \hat{y}_i = \alpha),
        •  \frac{\partial MAE}{\partial \hat{y}_{i}} ~ : ステップ関数 (原点では微分不可能)
        •  \frac{{\partial}^{2} MAE}{\partial {\hat{y}_{i}}^{2}} : 常に0 (原点では微分不可能)
    • MSEよりも,データに対するロバスト性が高い.
      • データに外れ値があった場合,MSEが評価する誤差は,MAEの2倍.
      • データの平均値は外れ値に影響されるが,中央値は外れ値に対して頑健.
    • MSEよりも,指標としての解釈性が高い.
  • Huber損失

    • :MSEとMAEをミックスさせた評価指標として,Huber損失*2がある.ロバスト推定やSVMの損失関数に用いられる. $$ Huber~loss := \frac{1}{N} \sum_{i=1}^{N} {L}_{\delta}(y_i, \hat{y}_{i}) \\ {L}_{\delta}(y_i, \hat{y}_{i}) = \left\{ \begin{array}{c} \frac{1}{2} {( y_{i} - \hat{y}_{i} )}^{2} \hspace{4em} ( |y_{i} - \hat{y}_{i}| \leq \delta ) \\
      \delta \cdot ( |y_{i} - \hat{y}_{i}| - \frac{1}{2}\delta) \hspace{1em} ( |y_{i} - \hat{y}_{i}| \gt \delta )
      \end{array} \right. $$
  • Quantile Regression (分位点回帰)


1.3. (R)MSPEとMAPE

  • MSPE (Mean Square Percentage Error, 平均平方二乗誤差率)

$$ MSPE(\hat{y}) := \frac{100}{N} \sum_{i=1}^{N} { \left( \frac{y_i - \hat{y}_{i} }{y_i} \right) }^{2} $$

  • MSAE (Mean Absolute Percentage Error, 平均絶対誤差率)

$$ MSAE(\hat{y}) := \frac{100}{N} \sum_{i=1}^{N} \left| \frac{y_i - \hat{y}_{i} }{y_i} \right| ~~~~~~~~ $$

  • 相対誤差と絶対誤差*4
    • 絶対誤差 =  y_i - \hat{y}_{i}
    • 相対誤差 =  (y_i - \hat{y}_{i}) ~/~ y_{i}
  • MSPEについて
    • MSEを相対誤差で評価したもの.
    • %表示(百分率)にすることが多い.
    • 例:観測値 y_iと予測値 \hat{y}_{i} N=1)が以下のような場合
      • If  ({y}_{1} = 90, ~~~ \hat{y}_{1} = 100)~~ then,  MSE=100,~~~~~MSPE=1
      • If  ({y}_{2} = 900, ~ \hat{y}_{2} = 1000) then,  MSE=10000,~MSPE=1
    • 損失関数としての性質
      • 予測値 \hat{y}の各要素を定数  \alphaで固定した場合( \hat{y}_{i} = \alpha),最適な定数  \alpha^{*}_{MSPE} は観測データ  y の重み付き平均値  w(\bar{y}) になる.
      • 値が小さいデータに対して過剰にfitしようとする.(バイアス)
  • MAPEについて
    • MAEを相対誤差で評価したもの.
    • %表示(百分率)にすることが多い.
    • 例:観測値 y_iと予測値 \hat{y}_{i} N=1)が以下のような場合
      • If  ( y_1 = 90, ~~~ \hat{y}_1 = 100)~~ then,  MAE=10,~~~MAPE=1
      • If  ( y_2 = 900, ~ \hat{y}_2 = 1000) then,  MAE=100,~MAPE=1
    • 損失関数としての性質
      • 予測値 \hat{y}の各要素を定数 \alphaで固定した場合( \hat{y}_{i} = \alpha),最適な定数  \alpha^{*}_{MAPE} は観測データ yの重み付き中央値  w(med(y))になる.
      • 値が小さいデータに対して過剰にfitしようとする.(バイアス)


1.4. RMSLE

  • RMSLE (Root Mean Square Logarithmic Error, 平均平方二乗対数誤差)

$$ \begin{eqnarray} RMSLE(\hat{y}) &:=& \sqrt{ \frac{1}{N}\sum_{i=1}^{N} { \left\{ \log(y_i + 1) - \log(\hat{y}_{i} + 1) \right\} }^{2} } \\ &=& \sqrt{ MSE(\log(y_i + 1), \log(\hat{y}_{i} + 1) ) } \end{eqnarray} $$

  • RMSLEについて
    • MSEをlogスケールで表現したもの
    • 絶対誤差を,相対誤差(MSPE, MAPE)ではなくlogスケールで表現.
       y_i の大小を考慮して誤差評価
    • 損失関数として用いる場合, \hat{y} に対して凸かつ非対称
      •  \hat{y} > 極小値 → 傾きが小さい
      •  \hat{y} < 極小値 → 傾きが大きい



2. 分類

  • Notation
    •  N - number of data samples
    •  L - number of classes
    •  y_i - ground truth (data)
    •  \hat{y}_{i} - predictions (data)
    •  y_{il} - probability that  i-th sample belongs  l-th label
    •  \hat{y}_{il} - confidence that  i-th sample belongs  l-th label
    •  [ a = b] - indicator factor
  • 混同行列 (Confusion matrix)*5
    • 二値分類(Binary classification)タスクのみに使う.
      • True Positive (TP)
        • Positiveサンプルのうち,正しくPositiveと分類されたもの
      • False Positive (FP)
        • Negativeサンプルのうち,間違ってPositiveと分類されたもの
      • False Negative (FN)
        • Positiveサンプルのうち,間違ってNegativeと分類されたもの
      • True Negative (TN)
        • Negativeサンプルのうち,正しくNegativeと分類されたもの

          f:id:yumaloop:20190601010758p:plain:w500

    • 代表的な評価指標*6
      • 正答率 (Accuracy) = (TP+TN) / (TP+FP+TN+FN)
      • 精度 (Precision) = TP / (TP+FP)
      • 検出率 (Recall) = TP / (TP+FN)
      • F値 (F-Measures) =  \frac{2}{\frac{1}{Recall}+\frac{1}{Precision}}
    • ROC曲線 (Receiver Operating Curve, 受信者操作曲線)
      • しきい値 bを変化させたときの真陽性率 (TP Rate)と偽陽性率 (FP Rate)の関係を曲線でプロットしたもの
        • 真陽性率 (TP Rate) = TP / (TP+FN) = 感度 (Sensitivity) = 検出率 (Recall)
        • 偽陽性率 (FP Rate) = FP / (FP+TN)
        • 偽陰性率 (FN Rate) = FN / (TP+FN)
        • 真陰性率 (TN Rate) = TN / (FP+TN) = 特異度 (Specificity)

参考:Pang-Ning Tan, Introduction to Data Mining (2ndEdition), Chapter 3 "Classification: Basic Concepts and Techniques"


2.1. Accuracy

  • Accuracy (正答率)

$$ Accuracy := \frac{1}{N}\sum_{i=1}^{N} [ y_i = \hat{y}_{i} ] $$

  • Error (誤り率)

$$ Error := \frac{1}{N}\sum_{i=1}^{N} [ y_i \neq \hat{y}_{i} ] $$

  • Soft prediction と Hard prediction
    • soft labels (soft predictions)
      •  f(x) \in \mathbb{R}^{L} - 分類モデル fの出力スコア
    • hard labels (hard predictions)
      •  \underset{i}{\rm argmax} ~ f_{i} (x) - 分類モデル fが最大スコアを出力したラベル
      •  \left[ b \lt f(x) \in \mathbb{R}^{L} \right],b - しきい値
  • Accuracyについて
    • Hard predictionなので,解釈が難しい.
      • 分類モデル fの出力値そのものではなくて, argmaxで評価する.
    • 損失関数として用いると,最適化が難しい.
    • best conts.  \alpha^{*}(x):最も頻度の高いクラスに固定する.
    • 例( N = 100
      • Dataset
        • 10 cats
        • 90 dogs
      •  \alpha^{*}(x) = "dogs"


2.2. LogLoss

  • Binary LogLoss

$$ Losloss := - \frac{1}{N}\sum_{i=1}^{N} \left\{ y_i \log \hat{y}_{i} + (1 - y_i) \log (1 - \hat{y}_i) \right\}, ~~ y_i, \hat{y}_{i} \in \mathbb{R} $$

  • Multiclass LogLoss

$$ Logloss := - \frac{1}{N} \sum_{i=1}^{N} \sum_{l=1}^{L} y_{il} \log \hat{y}_{il}, ~~ y_i, \hat{y}_{i} \in \mathbb{R}^{L} $$

  • LogLoss (Logarithmic loss)について
    • Soft prediction.
    • 損失関数として用いると,最適化が簡単.
    • best conts.  \alpha^{*}_{i}(x):i-th クラスの頻度(経験分布)
    • 例( N = 100
      • Dataset
        • 10 cats
        • 90 dogs
      •  \alpha^{*}(x) = [0.1, 0.9 ]

2.3. AUC (ROC)

  • AUC (Area Under Roc)

 AUC := Area under the ROC Curve

  • AUC (ROC) について
    • AUC*7は,二値分類(Binary classification)タスクのみに使う
    • サンプルに対する識別結果の"順序"にのみ依存,分類モデルの"出力値"には非依存.
    • best consts.  \alpha^{*}_{i}(x):任意の定数に固定してもAUCの値は同じ.
    • AUCの説明
      • ROC(Receiver Operating Curve)曲線の下側面積
        • Wilcoxon-Mann-Whitney検定 (WMW検定)
        • Brunner-Munzel検定
      • サンプルペアの順序
        • 正しい順序に分類されたサンプルペアの割合
        •  AUC := \frac{correctly~orderd~pairs}{total~number~of~pairs}
    • pythonの場合,sklearn.metrics.roc_curve()sklearn.metrics.auc()を使って計算できる.

2.4. Cohen’s Kappa

  • Cohen’s Kappa ( \kappa係数,  \kappa統計量)

$$ Kappa := 1 - \frac{1 - accuracy}{1 - p_{e}} = 1 - \frac{error}{baseline~error} $$ $$ p_{e} := \frac{1}{N^{2}} \sum_{k} n_{k1} n_{k2} $$

     ・  i - 評価者

     ・  k - 識別するクラス

     ・  n_{ki} - 評価者 iがクラス kであると識別したサンプルの数

     ・  N - サンプルの数

     ・  p_{e} - 各サンプルをランダムに識別した場合の平均正答率


  • Weighted Kappa (重み付けカッパ係数)

$$ Weighted~Kappa := 1 - \frac{weighted~error}{weighted~baseline~error} $$ $$ weighted~error := \frac{1}{Z} \sum_{i,j} c_{ij} w_{ij} $$

     ・  c_{ij} - 混同行列 C (i, j)成分

     ・  w_{ij} - 重み行列 W (i, j)成分

     ・  Z - 規格化定数

  • Cohen's Kappa について
    • Jacob Cohenが1960年に発表.
    • 基準となるスコア(baseline)を0に正規化して,任意のモデルの性能を表現.
      • 「Kappa - Accuracy の関係性」は,「R2 - MSE の関係性」に似ている.
  • Weighted Kappaについて
    • Accuracy(Error)に重みづけを行ってKappaを計算.
      •  weighted~error := \frac{1}{Z} \sum_{i,j} c_{ij} w_{ij}
      •  c_{ij}:混同行列 C \in \mathbb{R}^{L \times L} (i, j)成分 ※ L - 識別するクラス数
      •  w_{ij}:重み行列 W \in \mathbb{R}^{L \times L} (i, j)成分 ※ L - 識別するクラス数
    • 混同行列 C
      • TP, FP, FN, FP
    • 重み行列 W
      • "順序つき"クラスラベルの分類に使う.
      • 例:病気のレベルに応じたクラス分類
    • 重み行列 Wの構成法
      • Linear weights: w_{ij} = |i - j|
      • Quadratic weights: w_{ij} = {(i - j)}^{2}
    • Quadratic Weighted Kappaを損失関数に使う場合,典型的には,MSEで近似する*8
    • 例( N = 100
      • Dataset
        • 10 cats
        • 90 dogs
        • 20 tigers

*1:線形回帰モデルにのみ適用可能

*2:Huber, Peter J. (1964). “Robust Estimation of a Location Parameter”. Annals of Statistics 53 (1): 73–101. doi:10.1214/aoms/1177703732. JSTOR 2238020.

*3:"QUANTILE REGRESSION", Roger Koenker, http://www.econ.uiuc.edu/~roger/research/rq/rq.pdf

*4:参考:相対誤差の計算方法と意義

*5:参考:Understanding Confusion Matrix - Towards Data Science

*6:参考:Accuracy, Precision, Recall or F1? - Towards Data Science

*7:奥村先生によるAUC (ROC)の解説ページ:https://oku.edu.mie-u.ac.jp/~okumura/stat/ROC.html

*8:解析的に解く方法もある."On The Direct Maximization of Quadratic Weighted Kappa"

Markdownエディタ "Typora" の紹介とショートカット [macOS Mojave 10.14.4]

Typoraの紹介

Typoraは,高機能&シンプルなMarkdownエディタです.最大の特徴は,Markdownコードを書くと,エディタ上で即座にレンダリングされ,インタラクティブにプレビューが表示されることです.Markdownで表や数式をよく書く場合,この機能は思った以上に有用で,簡単なメモをサクッと書くときに便利です.また,PDFへのエクスポート機能も優秀で,Pandocで煩雑な設定をする必要なくドキュメントを印刷できます.

f:id:yumaloop:20190528120527p:plain:w600



ダウンロード

Typoraのインストーラ(.dmg)は,以下のURLからダウンロードできます.Macにダウンロードする場合は,画面下にある「Download Beta (OS X)」ボタンをクリックすればOKです.

https://typora.io/

f:id:yumaloop:20190528121014p:plain:w600


Typoraの詳しい紹介/解説としては,

qiita.com

qiita.com

などがありますが,Mac OS向けのショートカットがなかったので,このポストに載せておきます.


ショートカット (Mac OS)

macOSで動作するショートカットです.※ Typora OS X版 (β 0.9.9.24.6)

  • カーソル操作
    ショートカット 処理
    Command + / 編集モードを切替
    Command + D 単語を選択
    Command + F 単語を検索
    Command + shift + D 単語を削除
    Command + L 行を選択
    Command + enter 行を追加
    Command + E スコープ/セルを選択
    Command + J 次章にジャンプ
    Command + {↑, ↓} ファイルの最上行/最下行にジャンプ
    Command + {=, -} 見出しレベル(<p>から<h1>まで)を上下
    Command + ^ + {↑, ↓, ←, →} 表のセル内を移動
  • フォーマットの挿入
    ショートカット 処理
    Command + {1~5} 見出しh1~h5を挿入
    Command + {=, -} 見出しレベルをする
    Command + I 斜体**を挿入
    Command + B 太字****を挿入
    Command + U 下線<u></u>を挿入
    Command + K ハイパーリンク[](url)を挿入
    Command + option + L リンク[]: urlを挿入
    Command + option + Q 引用符>を挿入
    Command + option + B 数式ブロックを挿入
    Command + option + C コードブロックを挿入
    Command + option + T 表を挿入
    Command + control + I 画像![]を挿入
    [toc] 目次を挿入
    $$ 数式を挿入
  • ファイル操作
    ショートカット 処理
    Command + N 新しいファイルを開く
    Command + T 新しいタブを開く
    Command + shift + N 新しいウィンドウを開く
    Command + O 既存のファイルを選択して開く
    Command + W 現在のウィンドウを閉じる
    Command + S 現在のファイルを保存する
    Command + shit + L ファイル内のアウトラインを表示
    Command + shift + O ファイル名で検索


ショートカットの表をMarkdownファイルにコピペしたい方のために,生のmarkdownスクリプトを載せておきます!どうぞ.

# Short cut (MacOS)

- カーソル操作

  | ショートカット             | 処理                                      |
  | -------------------------- | ----------------------------------------- |
  | Command + /                | 編集モードを切替                          |
  | Command + D                | 単語を選択                                |
  | Command + F                | 単語を検索                                |
  | Command + shift + D        | 単語を削除                                |
  | Command + L                | 行を選択                                  |
  | Command + enter            | 行を追加                                  |
  | Command + E                | スコープ/セルを選択                       |
  | Command + J                | 次章にジャンプ                            |
  | Command + {↑, ↓}           | ファイルの最上行/最下行にジャンプ         |
  | Command + {=, -}           | 見出しレベル(`<p>`から`<h1>`まで)を上下 |
  | Command + ^ + {↑, ↓, ←, →} | 表のセル内を移動                          |

- フォーマットの挿入

  | ショートカット        | 処理                          |
  | --------------------- | ----------------------------- |
  | Command + {1~5}       | 見出し`h1~h5`を挿入           |
  | Command + {=, -}      | 見出しレベルをする            |
  | Command + I           | 斜体`**`を挿入                |
  | Command + B           | 太字`****`を挿入              |
  | Command + U           | 下線`<u></u>`を挿入           |
  | Command + K           | ハイパーリンク`[](url)`を挿入 |
  | Command + option + L  | リンク`[]: url`を挿入         |
  | Command + option + Q  | 引用符`>`を挿入               |
  | Command + option + B  | 数式ブロックを挿入            |
  | Command + option + C  | コードブロックを挿入          |
  | Command + option + T  | 表を挿入                      |
  | Command + control + I | 画像`![]`を挿入               |
  | [toc]                 | 目次を挿入                    |
  | $$                    | 数式を挿入                    |

- ファイル操作

  | ショートカット      | 処理                           |
  | ------------------- | ------------------------------ |
  | Command + N         | 新しいファイルを開く           |
  | Command + T         | 新しいタブを開く               |
  | Command + shift + N | 新しいウィンドウを開く         |
  | Command + O         | 既存のファイルを選択して開く   |
  | Command + W         | 現在のウィンドウを閉じる       |
  | Command + S         | 現在のファイルを保存する       |
  | Command + shit + L  | ファイル内のアウトラインを表示 |
  | Command + shift + O | ファイル名で検索               |