Site cover image

Site icon imageSen(Qian)’s Memo

This website is Donglin Qian (Torin Sen)’s memo, especially about machine learning papers and competitive programming.

NNDL 第9章 教師なし学習

中国の有名な機械学習の本の勉強ノート。自分がわからなかったところだけなので飛び飛びだろう。

https://nndl.github.io/

ラベルやフィードバックが一切ない状況下で学習をなんとかする手法。以下の数種類に分類できる。

  1. Unsupervised Feature Learning ラベルがないデータから有効な特徴や表示を得たい。次元低下、データ可視化、データの前処理などで使われる。
  2. Probabilistic Density Estimation 与えられたサンプルから、サンプル空間の確率密度を推定する。(ParametricとNon-parametricがある)
  3. Clustering 与えられたサンプルを、一定のルールに従って複数のClusterにカテゴリ分けしていく。

Unsupervised Learning

PCAについてはこちらの通り。

📄Arrow icon of a page linkNNDL 第7章 Networkの最適化と正則化

Sparse Coding(稀疏编码)

参考: https://www.slideshare.net/slideshow/sparse-codingpcaica/231946611

生物学的には、網膜でとらえられた画像はそのまま上位の認識機構に入るのではなく、なにかしらの基底と係数ベクトルの積(にノイズが少し加わって)となって、その係数=Codingが伝達されるらしい。これによって、各ニューロンはエッジ、特定の模様だけに反応するようになっている。

数式で表すと、MM個の正規直交基底が存在し、それを列ベクトルとして並べたものがAAとなり、これをDictionary(辞典)という。ここで、係数ベクトルz\mathbf{z}を得ることができ、これをEncoding=编码という。

主成分分析によって、Encodingをしているといえる。しかし、それは各正規直交基底と掛け合わせた係数ベクトルz\mathbf{z}は疎ではない(各次元に値ががっつり入っている)疎となるようなEncodingを得たい

正規直交基底では、既定の数と同じだけのちょうどの次元のヒルベルト空間を作っていた。ここで、過完備(線形従属を含む基底の集合)なものをあえて使うことによって、うまく基底から疎なEncodingを作れれば、人間には理解しやすくなる(既定の疎の成分は寄与を考慮しなくていいので)。そのうえ、過完備である以上複数のEncodingが存在するが、そこにさらなる制限を加えることで、過完備で無限の表現ができたEncodingから唯一となるEncodingを得ることもできる。

実際にはノイズ除去などで使われたり。PCAだけでは、複数の分布の合成にもバカ正直に最適化するので結果として全く実像を表してない基底になってしまうことがある。これに対してSparse Codingするなら、過完備なので複数本の基底で結果的に複数の分布の特徴もうまくとらえるポテンシャルがある(余分な基底を使っていいので、複数の分布それぞれに適した基底を用意したりすることも理論上可能)

入力x1,,xN\mathbf{x}_1, \cdots, \mathbf{x}_Nが与えられたとする。次のように目標関数を定義する。

Image in a image block

ρ\rhoは評価関数であり、ハイパラによってsparse性の強さを制御する。EncodingZZを得たい中、過完備なのでこのままでは複数のLLが0をとるEncodingが存在する。それを次元面からも(実質AAと線形独立となるベクトルを入れていくとか)?、パラメタの大小からも制御するのが評価関数の役割

評価関数はm=1M1[zm>0]\sum_{m=1}^M \mathbf{1}[|z_m| > 0]つまりL0ノルムを使うのが一番簡単であるが、最適化ができないので、

  • i=mM zm\sum_{i=m}^M ~|z_m|のL1ノルム
  • i=mMlog(1+zm2)\sum_{i=m}^M \log (1 + z_m ^ 2)の対数関数
  • i=mMexp(zm2)\sum_{i=m}^M -\exp (-z_m^2)の指数関数

が使われてたりする。

学習方法

交互にAAz\mathbf{z}を最適化することで、過完備な基底とEncodingを同時に得ることができる。

  1. AAを固定して、z\mathbf{z}を最適化。
Image in a image block
  1. z\mathbf{z}を固定して、AAを最適化。
Image in a image block

Auto-Encoder(自编码器)

N>MN>Mとして、NN次元の特徴量をうまくMM次元に圧縮したい。この時、

  • Encoderとしてf:RNRMf: \mathbb{R}^N \to \mathbb{R}^M
  • Decoderとしてg:RMRNg: \mathbb{R}^M \to \mathbb{R}^N

学習の目標は、合成写像をかませて低次元に表現力を限定させたときに落ちる情報量を減らしたい。以下の損失関数を使う。

Image in a image block

これを実現するとき、1層の隠れ層を持つNNということになるが、ffの持つ重みをWfW_fとすると、ggの重みをWg=WfTW_g = W_f ^ Tとすることで、Tied Weightということとなり、表現力を意図的に落とすことで、学習しやすくさせて、正則化にもつながる

Tips: この本では最初にEncoder-Decoderモデルを紹介したとき、RNNを使ったものを紹介していた。だがEncoder-Decoderモデルは入力から何かしらの別の出力が得られればそれでよく、RNN、Transformer、CNNなど実現するためのアーキテクチャはなんでもOKである

Sparse Auto-Encoder

先ほどのAuto-Encoderは低次元の表現を学習させていた。もし高次元のを学習させても無限の解があるので特に意味がないが、ここでSparse Encodingのあの損失関数の式をそのままNNに学習させることで、Encodingがsparseになるという意味を持った高次元での表現を得ることができる

Image in a image block

この損失関数をNNによって最小化させていく。NNの重みはTiedであり、WWはEncoderのアフィン変換行列の重み。

ここで、ρ\rhoは先ほど定義したものを使ってもよいし、NN特有の「隠れ層の各ニューロンのActiveとなる確率」と扱ってもよい。ρ^j=(1/N)n=1Nzj(n)\hat{\rho}_j = (1/N) \sum_{n=1}^{N} z_j^{(n)}をその確率というものと扱える。そして、事前にρ\rho^*を指定する(どれほどActivateになるかを指定する感じ)ことで、KLダイバージェンスを評価関数に出k理宇。

ρ(Z)=i=1pKL[ρρ^i]\rho(Z) = \sum_{i=1}^p KL[\rho^*||\hat{\rho}_i]

ものによっては、複数層からなるものでやってもよい。

Denoising Auto-Encoder

ロバスト性を高めるために、わざとNoiseを加えたうえで復元できるようする。高次元の画像などのデータでは冗長性は持っているのでこれは結構有意義なアプローチである。左が普通のAuto-Encoder。右がノイズを加えたDenoising Auto-Encoder。

Image in a image block

確率密度推定

観測されたサンプルから、確率密度関数をうまく推定したい。

パラメトリック密度推定

事前知識によって、特定の分布に従うとまず仮定し、そのパラメタを推定するということなる。

パラメタθ\thetaに従ってデータが得られたとすると、以下のようにサンプルを得るための確率の対数尤度は以下のようになる。

Image in a image block

正規分布、ディリクレ分布だとそれぞれ明示的に数式で解くことができる(略 前自分のノートに合ったのでさすがに書かない)

しかし、この手法は現実的には以下のような問題を抱えている。

  • モデル選択問題 現実の分布はかなり複雑なのでうまく表せていない可能性が非常に高い。」
  • 観測不能変量の場合 観測不能な隠れパラメタは重要だが、それを捉えることはできない(EMアルゴリズム
  • 次元の呪い 高次元のデータのパラメタの推定は非常に難しい。過学習が簡単に起きる。

ノンパラメトリック密度推定

NN個のサンプルのうち、確率ppで想定の区間内に現れるときは、二項分布に従う確率となる。KKは想定区間内に実際に現れたサンプルの数。

NCKpK(1p)1K_N C_K p^K (1-p)^{1-K}

二項分布の性質上E[K/N]=p,var(K/N)=p(1p)/N\mathbb{E}[K/N] = p, \mathrm{var}(K/N) = p(1-p)/Nとなる。NNが十分に大きいときは、pK/Np \approx K/Nと仮定することができる。(仮定1)

また、ppの確率で想定の区間RR内に出現する条件は具体的にはRp(x)dx=p\int_R p(x)dx = pであるが、十分にRRが小さくその中で一様分布に近似できるという(仮定2)。このとき、RRの体積をVVだとすると、pp(x)Vp \approx p(x)Vが成り立つともいえる。この2つの仮定によって次の等式を得ることができる。

p(x)KNVp(x) \approx \frac{K}{NV}

この式でうまく推定するときには、NNを大きくしてVVを小さくしたい感じ。しかし、実際はそれだと十分にサンプルが集まらないので、以下のような手段が一般的。

  1. VVの大きさを固定して、体積VVの各セクションに含まれている数を数える。
  2. RRの大きさを各セクションごとに変更して、どのセクションにもちょうどKK個のサンプルが含まれるようにしたい。
区間のサイズ固定する手法

1の方法。実現させるにはヒストグラムを使ってもいいが、必要サンプル数が次元の呪いに直面する。ここでは、Kernel Density Estimationという手法を使うのが良い

次のように、Kernel Functionを定義する。右辺の意味はサンプルが各次元においてしっかりと区間内に収まっているかどうかの指示関数である。

Image in a image block

NN個のサンプルが与えられたとき、上のKernel Functionを使うことでサンプル数KKを計算できるので、密度関数の計算もできる。HDH^Dは超立方体の体積。

Image in a image block
Image in a image block

ここでは超立方体によるKernel Functionを選んでいるが、正直扱いにくい(微分できないし…)。そこで、Gaussian Kernel Functionを使うこともできる。

Image in a image block
Image in a image block

k Nearest Neighbor(kNN)

超立方体のサイズを固定しちゃうと、密度の高低によって過疎、過密が起きてしまう。そこで、x\mathbf{x}についての密度を知りたいときは、x\mathbf{x}を中心にした超球体を選び、ちょうどKK個のサンプルがそこに入るようにする。そこから、p(x)KNVp(\mathbf{x}) \approx \frac{K}{NV}を用いて計算するのである。

つまり、x\mathbf{x}の周辺KK個のサンプルを見ることになり、その中で最も確率が高いもの=最も多いクラスをそのラベルとして扱うという応用ができるKK \to \inftyとなったとき、分類誤り律はベイズ分類器の2倍よりは悪化しないことが証明されているらしい。

ただ、現実的にはKKは選び方次第でかなり変わるアルゴリズムでもある。小さすぎると密度推定ができないし、大きすぎると過度に大域的にとらえてしまう上計算コストも高い。