konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

【DeepLearning特訓】MLPの基礎 学習のいろいろな工夫

E資格向けの自習アウトプット
自分用メモ

学習の工夫して、汎化性能をあげつつ学習速度の向上、計算リソースの削減をしたり対策していく
取り組む問題によって、組み合わせてみたり

パラメータ拘束とパラメータ共有

パラメータ拘束

パラメータの適切な値がわからない場合は、近いモデルを参考にすると良いのでは、という考え方
互いのパラメータの近さを表現する手法
L2正則化(重み減衰)で、0から遠ざかることに対してペナルティをかける

例として、タスクが似ている2つのモデルA, Bは、パラメータも近いと想定できる
下記をノルムペナルティとする
f:id:konchangakita:20210110002857p:plain
(L2ノルム以外でも可能)
この値に上限を設けて、互いにパラメータ拘束する

パラメータ共有

複数のモデルである部分のパラメータを同じにする
メモリの節約にもなる
CNNのフィルタが典型的な例

アンサンブル学習

複数のモデル(弱学習器)で個々に学習させる

バギング(bootstrap aggregation)

複数モデルを組み合わせ汎化誤差を減少させる
有名どころ:ランダムフォレスト
f:id:konchangakita:20210110013235p:plain

ブースティング

確率分布に基づいて分割、逐次計算していく
f:id:konchangakita:20210110013309p:plain

ドロップアウトとドロップコネクト

ドロップアウト

中間層での出力をランダムで削除(0にする)する。削除する割合はハイパーパラメータとして設定
計算量が少なく、非常に実用性が高い
訓練データが少なすぎるとダメ

# ドロップアウト
# まずはマスクを作る
ratio = 0.2 # 20% 削除
x = np.random.randn(3,10)
randammatrix = np.random.rand(*x.shape)
mask = randammatrix > ratio

# 出力を0にする
x = x * mask

# 勾配は同じマスクする
dout = dout * mask
ドロップコネクト

中間層の重みをランダムに0、性能面ではドロップアウトより優れているが、乱数の値で同じ性能を出す難しいので、実用的でない

その他の工夫

ノイズの注入
スパース表現:ベクトルの多くを0にする
 ・L1正則化:重みをスパース
 ・ReLU:表現をスパース
教師あり学習
 ・最初の段階では教師あり学習、そのあと教師なし学習に移行
マルチタスク学習
 ・タスクの類似性を活かしながら、全タスクを同時に解く。
蒸留
 ・教師モデルの入出力を用いて、軽量な生徒モデルで学習
 ・精度は落ちるが、計算リソースの削減
早期終了
プルーニング
 ・貢献度の低い重みを枝切り

まとめ

実用性的には、ドロップアウトが多いのかな
実際のところはいろんなフレームワークに組み込まれていたりするので、関数呼び出すだけで使えることが多い
ここは試験対策用に用語まとめ的な意味合い
次は、正規化(正則化は前回やった)