E資格勉強scrap
前置き
個人用の資格勉強メモとして残しております!
数式表現のやり方
シソーラスとは
- 単語の意味が似ているものをコンピューターにわかる形式でまとめたもの
- car: SUV, automobile, motorcar,, など
- 種類
- 単純に似た単語をまとめたもの
- 構造上に整理したもの
- 有名なシソーラス
- word net
- 単語ネットワークも利用可能なもの
- word net
- シソーラスの課題
- 時代の変化への対応が困難
- スラングなどで常に意味が変わるものがある
- 作業コストが高い
- 人がそれらを構築するのには大量な人的コスト
- 単語の細かなニュアンスが表現できない
- 時代の変化への対応が困難
コーパス
特定の目的のために収集されたテキストデータの集合を指す。
データサイエンスや機械学習の分野では、特に自然言語処理(NLP)のタスクにおいて頻繁に使用される概念である
python:テキストをwordsにしてコーパスに変換する前処理が以下
def preprocess(text):
text = text.lower()
#ピリオドの前にスペースをいれて一つのトークンとして扱う
text = text.replace('.', ' .')
words = text.split()
word_to_id ={}
id_to_word = {}
for word in words:
if word not in word_to_id:
new_id = len(word_to_id)
id_to_word[new_id] = word
word_to_id[word] = new_id
corpus = np.array([word_to_id[w] for w in words])
return corpus, word_to_id, id_to_word
分布仮説
-
単語をベクトル要素として表現したいモチベーションがある
- 画像を例にとると色の名前で表現するよりも、RGB=(x, y, z)のような形で表現するほうが
簡潔でわかりやすい - 単語も同じように意味をベクトル表現したい
- 画像を例にとると色の名前で表現するよりも、RGB=(x, y, z)のような形で表現するほうが
-
分布仮説とは?
- 単語の意味は、周囲の単語の分布によって形成されるというもの
- どゆこと?
- 単語自体には意味がなく、」その単語のコンテキスト(文脈)に意味があるという考え
- 単語自体には意味がなく、」その単語のコンテキスト(文脈)に意味があるという考え
- コンテキストのサイズのこと
- 周りのどのくらいの単語をコンテキストとして認識するかを定義する
共起行列
- 分布仮説に基づいて、単語をベクトル表現するための行列のことを指す。
- 考え方はシンプルで、ある単語に注目するとき(ある単語をベクトル化するとき)
その単語の周囲の単語(コンテキスト)をカウントする。 - これは、カウントベースの手法、統計的手法などと呼ばれる。
実装はskip
ベクトル間の類似度
- ベクトルの類似度計算には、内積やユークリッド距離などが代表例としてある
- 単語ベクトルの類似度計算にはcos類似度がよく用いられる
分子にベクトルの内積、分母に各ベクトルのノルムを計算している
ノルムはベクトルの大きさを表していてここではL2ノルムを計算している
def cos_similarity(x, y):
nx = x / np.sqrt(np.sum(x**2))
ny = y / np.sqrt(np.sum(y**2))
return np.dot(nx, ny)
厳密にはゼロ除算対策でイプシロンを足してあげる必要がある
カウントベース手法の改善
- カウントベース手法の問題点とは?
- 共起行列はコンテキスト内の2つの単語が共起した回数を形状している
- The という単語を考えたとき、theというのはそもそもの出現回数が多いため
例えば、car という単語の関係を考えたときに、drive の単語は非常に関係性が強い単語だが
単純に回数カウントで考えると the car などの生起回数は非常に高く
carに対して driveよりもtheの方が関係性が強いと表現される
→望まない状況
- どうしたらいいの?
- それぞれの単語の単独での生起確率を考慮してあげればよいのでは?
相互情報量
相互情報量(PMI)とは、xとyという確率変数に対して、下記で定義される
このまま使うと、同時確率P(x, y)がゼロのときに、-∞になってしまうので
実用上は下記のように、PMIが0以下の場合は0として扱う。これをPPMIと呼ぶ
相互情報量、カウントベース手法の問題点
ここまで改善しましたが、まだ問題点がある。
それは共起行列、PPMI行列の場合も、コーパスをもとに
単語のユニーク数*単語のユニーク数の行列ができるが、コーパスの語彙数分の次元数が当然必要になる。
これは非常に疎な行列でほとんどが0の行列になり、ノイズに弱く頑健性に乏しい。
次元削除
カウントベース手法、PPMIの問題点である
生成した行列の次元が大きすぎる問題点には次元削除という手法で対応できる
数学的な解釈は別途参照。
要点は、元の行列から必要な要素を抜いて次元を落としましたというところ。
word2vec
単語をベクトル化するために、カウントベース、PPMI、その次元削除などがあったが
結局膨大なコーパスに対して、行列を求めてそれをSVDで次元削除することは非現実的。
→推論ベースの手法が発案
推論ベースの手法の何が嬉しいか
- コーパスすべてを一気に扱う必要がない
- カウントベースの手法は一気にコーパスを学習する必要がある
- コーパス全体から行列算出→一気にSVD処理
- 推論ベースでは、ミニバッチの形でニューラルネットワークで逐次的に学習できる
- カウントベースの手法は一気にコーパスを学習する必要がある
推論ベース手法の概要
-
推論ベースの手法では周辺の単語(コンテキスト)から該当の単語を推測するよう学習し
その結果として単語ベクトルを得る。
- Word2vecでは下記2つのモデルが使用される
- CBOW(continuous bag-of-words)
-前後いくつかの単語の間の単語を予測する - skip-gram
- 1単語の前後の単語を予測する
- CBOW(continuous bag-of-words)
- Word2vecでは下記2つのモデルが使用される
CBOW(Continuous Bag of Words)
CBOWは、周辺の単語(文脈)から中心の単語を予測するモデル
特徴
入力:周辺の単語
出力:中心の単語
効率:計算効率が高い
学習速度:高速
- 具体例
-
例えば、次のような文章があるとします。
The quick brown fox jumps over the lazy dog -
ここで、「fox」が中心の単語だとすると、CBOWは周辺の単語である「The quick brown」と「jumps over the lazy dog」を使って「fox」を予測します。
-
周辺の単語 → 中心の単語
- (the, quick, brown, jumps, over, the, lazy, dog) → fox
-
Skip-gram
Skip-gramは、中心の単語から周辺の単語(文脈)を予測するモデルです。
特徴
入力:中心の単語
出力:周辺の単語
効率:計算効率がやや低い
学習速度:遅いが、精度が高い
- 具体例
- The quick brown fox jumps over the lazy dog
- ここで、「fox」が中心の単語だとすると、Skip-gramは「fox」から周辺の単語である「The quick brown」と「jumps over the lazy dog」を予測する
- 中心の単語 → 周辺の単語
- fox → (the, quick, brown, jumps, over, the, lazy, dog)
CBOWとSkip-gramの違い
- 予測方法
- CBOW:周辺の単語から中心の単語を予測
- Skip-gram:中心の単語から周辺の単語を予測
- 計算効率
- CBOW:計算効率が高く、学習が高速
- Skip-gram:計算効率は低いが、精度が高い
- データ利用
- CBOW:文脈全体を一度に利用して中心の単語を予測するため、大量のデータに対して適用しやすい
- Skip-gram:一つの中心の単語から複数の周辺単語を予測するため、少量のデータでも高い精度が得られる
損失関数の工夫
課題として、コーパスが膨大となった場合
単語数分の損失を計算する必要が出てくる
損失関数の例(soft-max)
実際はほぼ負例なので、negative からいくつかもってくるnegative samplingで対応可能である
詳細は下記がわかりやすかった
RNN(再帰型ネットワーク)
RNNとは
- RNN(リカレントニューラルネットワーク)は、時系列データやシーケンスデータの処理に特化したニューラルネットワーク。
- 一般的なニューラルネットワーク(例えば、全結合層や畳み込み層)とは異なり、RNNは過去の情報を保持しながら現在の入力を処理することができる。
- これにより、時間的な依存関係を考慮した処理が可能
RNNの挙動
通常のNNではそれぞれのインプットに対して独立で答えを出すが、
時系列的な情報を保有できない。
RNNでは再帰的に前層の情報を渡してあげるので、時系列的な要素を考慮できる。
RNNの具体的な挙動
x(t)に前の層の隠れ層であるh(t-1)がconcatされたものがinputになり、h(t)を出力する。
その層のoutputはh(t)に重みをかけたものになる、それに対して損失計算する
次の層では、x(t+1)にh(t)をconcatしたものがinputになり、、の繰り返し!
誤差逆伝搬
誤差逆伝搬の図や式や複雑そうに見えるが、行列の掛け算、tanhなどの誤差逆伝搬を
落ち着体追えばそこまで難しいものではない。
BPTT
- BPTTとは
- BPTTはBackpropagation Through Timeの略
- 上で紹介した再帰型のネットワークを、一本のネットワークに伸ばした形で表現し時間方向に誤差逆伝搬も行うというもの
- BPTTの問題点
- 長期時系列の問題を扱う場合に扱いづらい
- 計算コストが大きい
- 勾配が不安定、消失してしまう
- 長期時系列の問題を扱う場合に扱いづらい
- 対策:Truncated BPTT
- ネットワークのつながりを適当な長さで断ち切る
- 小さなネットワークを複数作り、誤差逆伝搬を行う
- ネットワークの逆伝搬のつながりだけを断ち切る(順伝播のつながりは残す)
- 順伝播の入力はシーケンシャル(順番通り)に入力する
- 逆伝搬はブロックで考える
- ミニバッチ学習の場合は?
- 各バッチでデータを与える開始位置をずらして学習順序を守った形で実装する
1000個の長さの系列データで、10件区切りでtrucateし、バッチサイズ2で学習する場合の例が下記。
開始位置を1と500でずらして学習を勧めていく点がポイント!
- 各バッチでデータを与える開始位置をずらして学習順序を守った形で実装する
- ネットワークのつながりを適当な長さで断ち切る
参考
RNNの問題点への対応
RNNの問題点とは?
- 長期依存性の課題
- 長い文章を入力したときに、前半の記憶が薄れてあてにならない
- 長期的な依存関係を学習するためには?
- 勾配爆発
- 勾配消失
勾配クリッピング
- 勾配爆発に対する対策
- 何をしているか
- 逆伝搬の実行時に、勾配の上限を定める
- 勾配クリッピングの手順
スキップ接続
- 1層飛ばす(粗い時間スケールでの学習)
- 勾配爆発の可能性は残る
leaky接続
- 前時刻からの入力をα倍、入力層からの接続を1-α倍するような接続を持つ中間層をleakyユニット\
- αが1に近ければ、過去の情報を長期間記憶する
- αが0に近いならば、過去の情報は急速に破棄される
LSTM
LSTMとは
- なぜLSTM??
- RNNの問題点である勾配消失を解決するには根本的なアーキテクチャの変更が必要である
- ここで"ゲート付きRNN"を導入する
- RNNとLSTMの違い
大きな違いはLSTMにはcの経路があること
Cは記憶セル と呼ばれ、LSTMの記憶部に相当する- 記憶セルの特徴
- 自分自身(LSTMレイヤ内)だけでデータの受け渡しをする
- LSTMレイヤ内だけで記憶の保持を完結できる
- 隠れ状態hはRNNと同じく、別のレイヤ(上の方に抜ける)で出力される
- つまり
- LSTMの出力を受け取る側からみると、LSTMの出力は隠れ状態hのみで
記憶セルcは出力されないため、その存在を考える必要はない
- LSTMの出力を受け取る側からみると、LSTMの出力は隠れ状態hのみで
- 記憶セルの特徴
前提、注意点
- 説明の簡略化のために下記のように表現を省略した形で、以後の議論や説明を進める
LSTMの組み立て
- 記憶セルctには何が入っているか
- 時刻tにおけるLSTMの記憶
- 過去から時刻tまでの必要な情報すべてが格納されrている
- どのようにLSTMは出力をするか
- 記憶セルctの情報を下に、外部レイヤや次のLSTMレイヤに対して隠れ状態htを出力する
- 出力は記憶セルをtanh関数で変換したものを出力する
- cとhの要素数
- 記憶セルcと隠れ状態hの関係は要素ごとにtanhを適用しただけ
- 要素数はcとhで等しくなる
- ゲートという概念
- ゲートのイメージ
- 水門をどれだけ開けるか?が直感的なイメージ
- LSTMにおけるゲート
- 開く/閉じるの二択でなく、どれだけ開けるか/閉じるかを定義する
- 0.0~1.0の実数で表現される
- ゲートの開き具体にはsigmoid関数がよく使われる
- 値域が0-1なので
- ここまでの、隠れ状態htは記憶セルctに対してtanhを適用しただけだった
- それに対して、sigmoid関数を適用し、ゲートの要素を付け足す
htはoとtanh(ct)の積によって計算される。
この積は要素ごとの積であり、アダマール積と呼ばれる。
- ゲートのイメージ
forgetゲート
記憶セルに対して”何を忘れるか”を明示的に指示して上げる必要がある
ここでもゲートを利用する
ct-1の記憶から、不要な記憶を忘れるためのゲートを追加する(forgetゲート)
新しい記憶セル
forgetゲートの導入により、前時刻の記憶セルから忘れるべきものを削除できた。
しかし、このままでは記憶セルは忘れることしかできない。
新しく覚えるべき情報を記憶セルに追加する処理を加えていく。
inputゲート
新しい記憶セルgに対してゲートを加える事を考える。
記憶セルにinputする割合を決めるゲートをinputゲートと呼ぶ。
GRU
LSTMの派生版
LSTMの問題点
- LSTMはパラメータ数が多く、計算コストが高い
→LSTMを簡略化したインターフェースのGRUが登場
GRUとは
- GRUはLSTMの表現力を保ちつつ、計算コストを低くした
- 残った機能
- 隠れ状態に忘却機能と記憶機能を付与
- 勾配消失が起きずらくなる
- 隠れ状態に忘却機能と記憶機能を付与
- 失った機能
- 忘却機能と記憶機能がトレードオフ
- CECがなく、メモができない
- 過去の情報が残りづらい
双方向RNN
順方向へ接続するRNNと逆方向へ接続するRNNを両方使い、結果をマージする
- メリット
- 例えば、英語を読むときに後ろから訳す場面はあり、
機械も後ろからの文脈情報を知りたがっているので、逆方向のRNNも適用したらよいのでは?
- 例えば、英語を読むときに後ろから訳す場面はあり、
CNN
畳み込みニューラルネットワーク(CNN)は、特に画像認識や画像分類の分野で非常に強力なツールである
畳み込みの基本概念
- 畳み込み(Convolution)は、入力データとフィルタ(カーネル)を使って特徴を抽出する操作
- 具体的には、入力画像に対して小さなフィルタをスライドさせて、フィルタと重なった部分の要素ごとの積和を計算します。この操作により、特定のパターンや特徴を強調する
フィルタ(カーネル)
- フィルタは通常、3x3や5x5などの小さな行列で表される
- 各フィルタは異なる特徴を捉えるために学習される
- 例えば、エッジ検出やテクスチャの抽出など
- カーネルは入力チャネル数分必要、特徴マップはカーネル適用後の出力を足し合わせたものになる
畳み込みの具体的なステップ
-
入力画像の準備:
入力画像は通常、3次元のテンソル(高さ x 幅 x チャネル)で表されます。例えば、カラー画像であれば、チャネル数は3(RGB)です。 -
フィルタの適用:
フィルタ(カーネル)を画像の左上から右下へとスライドさせます。このとき、フィルタと重なる部分の要素ごとの積和を計算します。
-
ストライド(Stride):
フィルタをスライドさせるステップサイズです。ストライドが1の場合、フィルタは1ピクセルずつ移動します。ストライドが2の場合、2ピクセルずつ移動します。 -
パディング(Padding):
入力画像の周りにゼロを追加して、フィルタが画像の端にも完全に適用されるようにします。これにより、出力画像のサイズを調整することができます。- ゼロパディング:ゼロを追加する。
- 有効パディング:パディングなし。
特殊な畳み込みについて
CNNは便利かつ優秀な機能だが、計算コストが課題となる。
計算コスト抑えるためのいくつかの方法について紹介する
通常の畳み込み
- チャンネル方向と平面方向に畳み込み演算を行う
- フィルター次元数= (縦、横、チャネル数)
Pointwise Convolution
- チャンネル方向のみの畳み込み
- フィルター次元数=(1, 1, チャネル数)
Depthwise Convolution
- 平面方向の畳み込み
- フィルター次元数= (縦、横)
Depthwise Separable Convolution
pointwiseとdepthwiseを組み合わせて、畳み込みを実現する方法
計算コストを抑えられるなどのメリットがある。
利点
-
計算量の削減
- 通常の畳み込み:フィルタサイズが3x3、入力チャネルが3、出力チャネルがNの場合、計算量は (3 * 3 * 3 * N)
- Depthwise Separable Convolution:3つの3x3フィルタと3つの1x1フィルタを使用するため、計算量は(3 * 3 * 3 + 1 * 1 * 3 * N) となり、通常の畳み込みに比べて大幅に減少します。
-
パラメータ数の削減
- 通常の畳み込み:フィルタサイズが3x3、入力チャネルが3、出力チャネルがNの場合、パラメータ数は (3 * 3 * 3 * N)となる。
- Depthwise Separable Convolution:3つの3x3フィルタ(計9個のパラメータ)と3つの1x1フィルタ(計3N個のパラメータ)を使用するため、パラメータ数は (9 + 3N) となり、通常の畳み込みに比べて大幅に減少します。
-
メモリ効率の向上
- 計算量とパラメータ数が減少することで、メモリ消費も減少します。これにより、モデルのトレーニングや推論時のメモリ使用量が削減されます。
-
速度の向上
- 計算量が削減されるため、トレーニングと推論の速度が向上します。特にモバイルデバイスや組み込みシステムなどのリソースが限られた環境での応用に有利です。
CNNの概要
- 入力画像に対して畳みこみ演算やプーリング処理を行なっていく
- 畳み込みとは
- 特徴量を抽出するフェーズ
- シンプル、局所的な特徴量を抽出する
- この部分にエッジがある、この部分が白っぽい
- プーリングとは
- 画像を圧縮し、複雑かつ大域的な情報を捉える
- 白い花っぽい、細長い
- 画像を圧縮し、複雑かつ大域的な情報を捉える
プーリング
縦、横の空間を小さくする演算のことを指す
プーリングの例
- 最大値プーリング
- 各領域の最大値を取り出す
- 平均値プーリング
- 各領域の平均値を取り出す
プーリングのポイント
- 学習するパラメータがない
- 対象領域の最大値や平均値をとるだけなので学習するパラメータは存在しない
- チャネル数が変化しない
- チャネルごとに独立して計算が
- 微小な変化に対してロバスト
- 入力データの小さなずれをプーリングが吸収するので、入力データが横に1ピクセルだけずれた場合も出力は同じような結果となる。
im2col
image 2 columnの略で、画像を列形式に扱いやすくしましょうねという話。
CNNの畳み込み演算をそのまま実装すると、for文を複雑に組み合わせる必要があるが、numpyではfor文の処理が遅い課題がある
→入力とフィルターにim2colという関数を適用し、行列の内積を算出することで一気に畳み込み演算を行うという発想
im2colの仕組み
入力データを横方向の1行に、フィルターを縦方向で1列に展開して並べ、2つの行列の積を計算、出力データを適正な形状にreshapeする。
タスクの工夫
ワンショット学習
- ラベル付きデータを一つだけ与えて学習する
- ラベルなしで潜在的なクラスを分ける
- 例)顔画像を1例入力し、どの方向を向いた顔でも認識できるよう学習
ゼロショット学習
- ゼロショット学習の基本的なアイデア
- 既知のクラスと未知のクラスの間に共通の特徴や属性を利用して、新しいクラスを予測
- 既知の情報のベクトルとの距離を利用する
半教師あり学習
教師あり学習を拡張し、一部データのみラベルありのデータセットを学習すること
self-training
- ラベルがついたデータで学習しモデル作成
- ラベルなしデータを推論
- 信頼度が高いデータにはラベルを付け、再度データを増やして学習する
co-training
流れはself-trainingと同等だが、2のフェーズでアンサンブルモデルを用いる
マルチタスク学習
1つのモデルで複数のタスクを同時にこなせるように学習することで、メインタスクの汎化性能の向上を目指す
能動学習
アノテーションの半自動化を行う
モデルが自動でラベル付けを行うが、一部人間が担当する
- 分類を人間に手伝ってもらう場合のデータの選び方
- ucertainly sampling
- 自身がないデータのアノテーションを人間に任せる
- diversity sampling
- データの分布を代表するような点を取り出してアノテーションを人間にさせる
- ucertainly sampling
距離学習
- 距離学習(Metric Learning)は、データポイント間の距離や類似度を学習する手法です。距離学習の主な目的は、データポイントを埋め込み空間にマッピングし、その空間内で類似のデータポイントが近く、異なるデータポイントが遠くに配置されるようにすることです。これにより、分類やクラスタリング、検索などのタスクが容易になります。
- 具体例
- 顔認識のタスクで、距離学習を利用する。
- 同一人物の顔画像は埋め込み空間内で近くに配置され、異なる人物の顔画像は遠くに配置されるように学習できます。これにより、新しい顔画像が追加された際にも、モデルは類似度に基づいて正確に認識することができます
Siamese network
同じネットワークを2つ使用して、入力データペアを処理し、それぞれの出力埋め込みを比較します。出力埋め込み間の距離が近いほど、入力データペアが類似しているとみなす。
例: 顔認識タスクで、同一人物の顔画像ペアに対して出力埋め込みが近くなるように学習
- 学習手順
- データセットから2つの入力のペアセット(xi, xj)を作る
- ペアを同一のNetworkに入れ、出力(yi, yj)を計算
- その出力とペアの類似性 t を使って損失関数を計算し学習
- 23を繰り替えす
Triplet Network
Tripletはランダムに3つの入力ペアを作成
- 入力の種類
- 基準サンプル(アンカー)
- 正例(ポジティブ)
- 負例(ネガティブ)
- アンカーとポジティブの距離、アンカーとネガティブの距離を2種類求め
損失関数を計算する
Siamese と Tripletの比較
- Tripeletのほうがラベル間を離そうとする力が強い
- TripeletはSiameseに比べ、positiveとnegativeを必ず用意するので
近づけることと離すことをバランスよくできる。 - ペアの作り方次第ではSiameseに比べてよい精度が出る可能性もあり、ペアを作るサンプリングにも議論の余地がある。
Batch Normalization
バッチ方向にデータ正規化する。
ベクトルXをd次元のベクトルと考えると、あるj次元のベクトルに対して
バッチ方向に平均や分散をとり、データの次元数ごとにスケーリングする
バッチ正規化の概要
バッチ正規化は、ニューラルネットワークの各層の出力を正規化し、スケーリングとシフトを行う技術です。これにより、学習の効率を高め、ネットワークの安定性を向上させることができます。バッチ正規化は2015年にS. IoffeとC. Szegedyによって提案され、その後、多くのディープラーニングモデルで広く採用されています。
バッチ正規化のメリット
- 勾配消失・勾配爆発の問題の緩和
バッチ正規化は各層の出力を正規化することで、入力データのスケールを均一に保ちます。これにより、勾配が極端に小さくなったり、大きくなったりする「勾配消失」や「勾配爆発」の問題を緩和し、より安定した学習が可能になります。 - 学習速度の向上
バッチ正規化を使用することで、大きな学習率(learning rate)を使用しても安定した学習が可能になります。これにより、学習の収束速度が向上し、トレーニング時間が短縮されます。 - 初期化の依存性の軽減
バッチ正規化はネットワークの重みの初期化に対する依存性を軽減します。これにより、初期化の影響を受けにくくなり、異なる初期化方法でも安定した学習が期待できます。 - 過学習の抑制
バッチ正規化はミニバッチごとにデータを正規化するため、トレーニング時にランダムなノイズが導入されます。これが一種の正則化(Regularization)効果を持ち、過学習を抑制するのに役立ちます。 - モデルの汎化性能の向上
バッチ正規化の正則化効果により、モデルの汎化性能(generalization performance)が向上します。これは、テストデータや実際のデータに対しても高い精度を維持することができるという意味です。
Layer Normalization
方向性:
レイヤー正規化は「レイヤー方向」に沿って平均と分散を計算します。すなわち、各データポイントの全次元に対して計算を行います。
適用場所:
レイヤー正規化はバッチ正規化の代替として提案され、特にリカレントニューラルネットワーク(RNN)や自然言語処理(NLP)のタスクで効果的です。各データポイントごとに統計量を計算し、その後に正規化とスケーリング・シフトを行います。
メリット:
ミニバッチサイズに依存せず、バッチサイズが1の場合でも効果を発揮します。
バッチ正規化と異なり、トレーニング時と推論時で動作が同じです。
欠点:
バッチ正規化に比べて学習速度が遅くなる場合があります。
勾配消失・勾配爆発の問題に対する効果はバッチ正規化ほど強力ではありません。
VAE
VAEとは?
まず、オートエンコーダ(Autoencoder)というのは、入力データを圧縮して(エンコード)、その圧縮されたデータから元のデータに復元(デコード)するためのニューラルネットワークです。VAEはこのオートエンコーダをちょっと賢くしたものです。
例えるならば…
オートエンコーダを「普通のカメラ」と考えてください。このカメラは写真を撮って、その写真をデジタルデータとして保存し、再びそのデータから写真を表示します。
一方、VAEは「予測機能付きのカメラ」です。このカメラは、写真を撮って保存するだけでなく、その写真がどんな風景かを予測して、似たような新しい写真を生成することもできます。
VAEの仕組み
エンコーダ(Encoder):
エンコーダ部分は、入力データを圧縮して「潜在変数(latent variables)」と呼ばれる少数の変数に変換します。これが普通のオートエンコーダと同じ部分です。 しかし、VAEではこの潜在変数を「確率分布」として表現します。つまり、ただ1つのデータポイントに圧縮するのではなく、データがどのような範囲に存在するかを示します。
リパラメータトリック(Reparameterization Trick):
確率分布を使って潜在変数をサンプリング(抽出)します。このステップがVAEの特殊な部分で、簡単に言うと「変数をランダムに選ぶ」ことです。
デコーダ(Decoder):
デコーダ部分は、サンプリングされた潜在変数から元のデータを再構成します。これにより、新しいデータを生成することもできます。例えば、新しい画像や新しいテキストを生成することができます。
VAEのメリット
データ生成:
VAEは新しいデータを生成する能力があります。例えば、顔写真のデータセットを学習したVAEは、新しい顔写真を生成できます。
データの圧縮:
データを有効に圧縮し、潜在変数として保存することができます。これにより、重要な情報を少数の変数にまとめることができます。
VAEの損失関数ってなに?
VAEの損失関数の構成
VAEの損失関数は、大きく分けて2つの部分から構成されています:
KLダイバージェンスでエンコーディング後の分布と、事前分布の正規分布を比較する理由は?
尤度ってなんだっけ
基本概念
尤度は、観測されたデータがあるモデル(分布)の下でどれだけ「ありそうか」を示す指標です。具体的には、モデルのパラメータが与えられたときに、そのパラメータの値が観測データを生成する確率を測定します。
VAEの課題
posterior collapse
PixelCNNなどの高い表現力がある、Decoderを使うときに潜在変数を無視した生成が行われてしまう現象
VQ VAE
潜在変数をVAEの時と異なり、離散的なベクトルとして扱う
VAEでは連続と仮定していたが、本来文章や画像は離散的なため。