【ラビットチャレンジ】実装演習レポート⑦深層学習day4

<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.min.js">
</script>
<script type="text/x-mathjax-config">
 MathJax.Hub.Config({
 tex2jax: {
 inlineMath: [['$', '$'] ],
 displayMath: [ ['$$','$$'], ["\\[","\\]"] ]
 }
 });
</script>

# 概要
E資格受験のための認定講座「ラビットチャレンジ」の実装演習レポート、深層学習day4編です。
確認テストと実装演習は省略しています。情報の網羅性は低いですがご理解ください。
外部資料からの内容は※をつけています。
※１：「ゼロから作るDeep Learning」

# Section1 強化学習
* 機械学習の一分野
* 長期的に報酬を最大化できるように環境の中で行動を選択できるエージェントを作ることが目標
* 不完全な知識をもとに行動しながらデータを収集し、最適な行動を見つけていく
* 報酬とは「見込みの報酬」である※１
  * ゲームであればスコアなど明確な指標から逆算して決める必要がある（教師あり学習であれば正しい評価が受けられる）
* 価値関数
  * 状態価値関数：ある状態のみの価値に注目
  * 行動価値関数：状態と価値を組み合わせた価値に注目
* 方策関数
  * 方策ベースの強化学習手法において、ある状態でどのような行動をとるのかの確率を与える関数
* Q学習
  * 行動価値関数を行動するごとに更新して学習を進める方法
* 関数近似法
  * 価値関数や方策関数を関数近似する手法
* 方策勾配法
  * 方策をモデル化して最適化する手法
  * 方策の良さの定義（平均報酬、割引報酬和）に対応して行動価値関数の定義を行い、方策勾配定理が成り立つ
  $$
  \nabla_\theta J(\theta) = E_{\pi_\theta}[(\nabla_\theta \log\pi_\theta(a|s)Q^\pi(s,a))]
  $$
* TD学習
  * 動的計画法とモンテカルロ法のいいとこどりをした手法
  * エピソードを進めながら各ステップで価値推定を更新
  * エピソードが終了するのを待つ必要がなく高速、環境に対する知識も不要

# Section2 AlphaGo
* 強化学習モデル
* AlphaGo Lee
  * 最初にRollOutPolicy（線形の方策関数）の教師あり学習を行う
  * 方策関数：PolicyNet
  * 価値関数：ValueNet
* モンテカルロ木探索
  * 統計的に勝つ確率が高い一手を計算するアルゴリズム※ 
  * 末端評価値（勝敗など）のみで探索ができないかという発想の探索法
  * 現局面から末端局面までPlayOutというランダムシミュレーションを多数回行い、勝敗を集計して着手の優劣を決定する
  * 該当手のシミュレーション数が一定を超えたら、その後の局面をシミュレーション開始局面とするように探索木を成長させる
  * 勝算が低い手のときは早く切り上げるため効率的※
* AlphaGo Zero
  * 教師あり学習をせず、強化学習のみ
  * PolicyNetとValueNetを統合
  * Residual Net
    * ネットワークにショートカット構造を追加して、勾配の爆発と消失を抑える
  * 木探索時にRollOutを行わない
    * 現状のネットワークでモンテカルロ木探索を用いて自己対局し、その教師データを使って学習する
* 対局時には探索、盤面評価、戦術予測の３つのAIが同時に働いている※

# Section3 軽量化・高速化技術
* 分散深層学習
  * 複数の計算資源を使用して並列的にニューラルネットワークを構成して効率化する
* データ並列化
  * 親モデルを各ワーカーに子モデルとしてコピー
  * データを分割し、各ワーカーごとに計算させる
  * 同期型：全ワーカーの勾配を平均して親モデルのパラメータを更新
  * 非同期型：ワーカーごとに更新し、学習が終わった子モデルはパラメータサーバにpush
  * 非同期型の方が処理が早いが最新のモデルのパラメータが利用できず、精度は同期型の方がいいことが多い
* モデル並列化
  * 親モデルを各ワーカーに分割してそれぞれのモデルを学習させる
  * 全データで学習が終わったらひとつのモデルに復元
  * モデルのパラメータ数が多いほど、スピードアップ効率も向上
  * モデルかデータ、大きい方を並列化すればよい
* GPGPU（General-Purpose on GPU）
  * グラフィック以外の用途で使用されるGPUの総称
  * 開発環境はCUDA、OoenCLなど
* CPUは複雑で連続な処理が得意、GPUは簡単な並列処理が得意
* im2col方式の実装はGPUにとって都合がいい※１
  * 巨大な行列の内積としてまとめて計算することでGPUの本領発揮
* ディープラーニングでは畳み込み層に多くの時間が費やされるため、そこで行われる積和演算の高速処理が重要になり、GPUの強みが出る※１
* 軽量化
  * 量子化
    * 通常のパラメータの64bit浮動小数点を32bitなど精度を落として使用するメモリと演算処理を削減する
    * 表現力は下がるため誤差が大きくなるかもしれない
    * ディープラーニングでは数値精度のビット数をそこまで必要としない※１（ニューラルネットワークは入力画像に小さなノイズがのっても出力結果が変わらないロバスト性がある）
  * 蒸留
    * 大規模モデルの知識を使って軽量なモデルを作成する
    * 教師モデル（精度の高い複雑なモデル）の重みを固定して生徒モデルを更新していく
  * プルーニング
    * 寄与の少ないニューロンを削減してモデルを圧縮する
    * 重みが閾値以下のニューロンを削減
    * 閾値を高くすると制度も減少する
# Section4 応用技術
* MobileNet
  * ディープラーニングモデルの軽量化・高速化・高精度化をしたネットワーク
  * 通常の畳み込みは空間方向とチャネル方向の計算を同時に行うが、MobileNetでは個別に行い計算量を減らす
  * Depthwise Convolution
    * 入力マップのチャネルごとに空間方向へ畳み込み
    * 出力マップと入力マップのチャネル数が同じになる
  * Pointwise Convolution
    * 入力マップのポイントごとにチャネル方向へ畳み込み
    * フィルタ数分だけ出力マップ（チャネル数）が作成可能
* Dense Net
  * CNNのアーキテクチャの一種
  * Dense Block
    * 出力層に前の層の入力を足し合わせる
    * 層間の情報の伝達を最大にするために同特徴量サイズの層を結合する
    * Growth Rateが大きくなるほどネットワークが大きくなる
  * Transition Layer
    * 中間層でダウンサンプリング
  * ResNetでは前一層の入力のみ後方へ入力したが、Dense Blockでは前方の各層からの出力全てが用いられる
* WaveNet
  * 生の音声波形を生成する深層学習モデル
  * Dilated convolution
    * 時系列データに対して畳み込みを適用する
    * パラメータに対する受容野が広い
  * 結合確率を効率的に学習できる

# ResNet（転移学習）
* 転移学習
  * 教師あり学習において、目的とするタスクでの教師データが少ない場合に、別の目的で学習済みのモデルを再利用する
* ResNet
  * 事前学習で利用するモデル
  * SkipConnection（中間層）
    * 勾配消失・爆発を回避して深い層の積み重ねが可能
  ![alt text](<スクリーンショット 2024-11-28 1.34.53.png>)
    * 学習部分を$F(x)$、中間層の部分出力を$H(x)$とすると残差ブロックは$H(x)=F(x)+x$
    * 入力データをそのまま流すだけなので、逆伝播時も上流からの勾配を変えずにそのまま下流へ流すため、信号の減衰による勾配消失などを軽減できる※１
    * Bottleneck構造で計算コストを変えずに畳み込みを一層多くできる
* WideResNet
  * ResNetのフィルタ数をk倍に（層を広く）、層数を浅くしたもの
  * 畳み込みチャンネル数増加
  * GPUの特性に合った動作
  * Dropoutを導入
* VGG※１
  * 基本的な形のCNN（畳み込み層とプーリング層）
  * 畳み込み層を２〜４回連続し、プーリング層でサイズを半分にするという処理を繰り返す
* GoogLeNet※１
  * ネットワークが横方向にも広がっている
  * インセプション構造
    * サイズの異なるフィルターとプーリングを複数適用し、結果を結合する
  * １×１のフィルター
    * 畳み込み演算でチャンネル方向にサイズを減らす
    * パラメータの削減や処理の高速化
* ファインチューニング
  * 事前学習結果を初期値としてモデルを再学習する

# EfficientNet
* CNNモデルを大規模にスケールアップしたもの
* 精度向上
* パラメータ数の減少
* 複合係数（Compound Coefficient）に基づいて深さ・広さ・解像度を最適化
* 転移学習でも性能を発揮
* 複合スケーリング手法
  * Depth、Width、Resolution、ある程度まで増やすと精度向上は横ばいになる
  * 畳み込み演算の演算量FLOPSはd、w^2、 r^2に比例
* EfficientNetV2※
  * EfficientNetからパラメータ効率を維持しながらどレーニング速度向上
  * トレーニング時に使用する画像サイズを段階的に大きくする
  * Fused-MBConv：depthwise convolutionsと畳み込み層を結合して置き換える
  * レイヤーの数、カーネルサイズ、畳み込みの種類など探索してステージごとに異なるスケールアップ

# Vision Transformer
* 言語処理用に開発されたTransformerを画像分類タスクに応用したモデル
* ViTアーキテクチャ
  * 入力画像をバッチに分割
  * バッチごとにFlatten処理：トークン（単語）化
  * Enbedding表現に変換
* 大規模データセットでの事前学習
* ファインチューニングで事前学習より高解像度な画像を入力
* ViTの入力処理はCNNの特殊な場合である※
  * 局所領域ごとにカーネル（フィルタ）ではなく線形層を適用
  * ストライドはカーネルと同じサイズ
  * パディングは通常は無し
* ViTはCNNよりも物体の形状に注目しており、人間の認識と相関する※

# 物体検知とSS解説
* IoU（Intersection over Union） 
  * クラスラベルだけでなく物体位置の予測制度も評価したい
  $$
  IoU = \frac{TP}{TP+FP+FN}
  $$
* AP（Average Precision）
  * PR曲線の下側曲線を意味する
$$
AP=\int_{0}^{1} P(R)dR
$$
* mAP（mean AP）
  * APのクラス平均
  * MS COCOではIoU閾値を0.5から0.95まで0.05刻みでAPとmAPを計算して平均を出す
* SSD（Single Shot Detector）
  * Default Boxを用意し、変形してconf.を出力
  * ネットワークはVGG16と似ている

  * 多数のDefault Boxを用意して生じる問題への対処
    * IoU値が一定以上のものだけ残す
    * 背景クラスが増えすぎないように非背景クラスの比を制限する
* Semantic Segmentation
  * VGGの最終盤のFullyConnected層をFullyConvolution層にすることでヒートマップのようなものが出力される
  * Up-sampling
    * プーリングで下がった解像度を上げる
    * Deconvolution：pixel間隔を空け、余白を作り、畳み込み演算
  * 画像を正しく認識するためには受容野の大きさが必要
    * 畳み込み層を深くする
    * プーリングとストライド
    * Dilated Convolution：間隔をあけて畳み込む
* R-CNN※１
  * CNNを用いた物体検出手法
  * 候補領域抽出とCNN特徴計算がメインパート
  * 画像を正方形にしたり、分類にSVMを使用したりする
  * Faster R-CNNでは全ての処理をひとつのCNNで行う

# Mask R-CNN
* セマンティックセグメンテーション
  * 物体領域を画素単位で切り出し、各画素にクラスを割り当てる手法
  * 工業検査や医療解析など精密な分割に応用される
  * VOC2012やMSCOCOが重要データセット
  * FNC（完全畳み込みネットワーク）
    * 全てが畳み込み層で全結合層がない
    * 画素ごとにラベル付けした教師データで学習
    * 入力画像のサイズは可変
  * R-CNN
    * 物体検出と物体認識を順次行う
    * 重くて遅い
  * Fast R-CNN
    * 関心領域ごとでなく画像ごとに一回の畳み込み操作をして計算量を減らす
  * Faster R-CNN
    * 関心領域の切り出しもCNNで行う
    * RoI Pooling
  * YORO
    * ワンステップで物体検出を行うアルゴリズム
    * バウンディングボックスで候補領域を抽出すると同時にグリッドごとにクラス分類を行い、情報を組み合わせる
  * SSD
* インスタンスセグメンテーション
  * 同じクラスの物体も区別
  * YOLACT
    * ワンステップでインスタンスセグメンテーションを行う
  * Mask R-CNN
    * Faster R-CNNの物体検出にセグメンテーションの機能を付加したイメージ
    * 物体検出結果の領域についてのみセグメンテーションを行う
    * RoI Align：補完処理で推定
  * PANet（Path Aggregation Network）※
    * FPN（Feature Pyramid Network）にBottom-Up層を４段追加し、RoI矩形内の４レベル全体を合成して領域特徴をプーリングする
  * Mask Scoring R-CNN※
    * Mask R-CNNに推定マスクの質を表すスコアMask IoUを追加し、クラス信頼度と相関が強いマスク信頼度も出力できる

# Faster-RCNN,YORO
* RPN（Region Proposal Network）
  * Faster R-CNNのアイデア
  * 物体候補領域の提案処理にCNNを使用し、End-To-Endなネットワークを可能にした
  * 入力された画像は、VGG16により特徴マップに変換される（最後のプーリング層の一個手前）
  * 特徴マップにAnchor Pointsを仮視し、PointごとにAnchor Boxesを作成
  * 各Anchor BoxesをGrandTruth Boxesと比較し、含まれるものが背景か物体か、どれくらいズレているか出力
* YOLO（You Only Look Once）
  * Faster R-CNNと違い、ひとつのネットワークで物体候補領域の提案とクラス分類が同時にできる
  * 処理が高速
  * 画像全体を一度で見るため背景と物体を間違えない
  * 汎化性が高い
  * 精度はFaster R-CNNに劣る
  * 候補領域の提案
    * 入力画像をGridsに分割し、各Gridの真ん中を中心とするBBを複数個生成
  * クラス分類
    * 各Gridごとに、含む物体のクラスを分類
  * 出力は各BBの中心、高さ、横、信頼度スコアの５つと各クラスに対応する特徴マップ（同時）
  * SSDは形状が固定された複数のBBを使用するがYOLOは学習の過程で形状が最適化される
  * YOLOはクラスの予測確率の二乗誤差を損失としているが、SSDはクロスエントロピーかつ背景クラスに対する予測確率の損失も考慮
  * Gridのサイズは固定で、Grid内で識別クラスはひとつまで、検出対象の物体はふたつまで※
  * サイズの小さな物体の検出は苦手※
    * 高解像度の画像を使用する
    * 画像のスケールを変更する
  * 動画を含むリアルタイムな検出が可能※
    * CTや内視鏡などの物体検出の自動化
    * 異常行動検知などセキュリティ対策
    * 行動パターンの識別

# FCOS
* アンカーボックスのデメリット
  * ハイパーパラメータの設定に敏感
  * サイズやアスペクト比が固定されている
    * 向き・角度による形の変化が大きい物体に対応できない
    * 小型の物体に対応できない
  * ポジティブサンプル（検出したい物体が含まれる領域）とネガティブサンプルが不均衡
    * アンカーボックスのほとんどがネガティブサンプルである
* FCOS
  * 複数のサイズの特徴マップを生成する手法
  * アンカーボックスを使わない
  * FPN（Feature Pyramid Networks）を使う
    * 重なったオブジェクトは異なる特徴レベルで予測されやすくなり、曖昧なサンプルが減る

# Transformer
* Encoder-Decoder × Attention
* 言語モデルとは、単語の並びに確率を与える
* Attentionは辞書オブジェクト
  * query（検索クエリ）に一致するkeyを索引し、対応するvalueを取り出す操作だとみなせる
* Transformer-Encoder
  * 自己注意機構により文脈を考慮して各単語をエンコード
* Scaled dot product Attention
  * 全単語に関するAttentionをまとめて計算する
* Multi-Head attention
  * 重みの異なる8個のScaled dot product Attentionの出力をConcat
* Decoder
  * Encoderと同じく６層
  * 自己注意機構
  * 対象単語より右にAttentionが加わらないようにしている
* 位置エンコード
  * 再帰や畳み込みといった単語の位置関係を捉えられる要素がないため、単語の順番の情報を与える必要がある
  * 最初にこのモデルに単語の分散表現を入力するときに単語位置に一意の値を各分散表現に加算する
  * 単語に一意な値を出力するような関数を使う（sinとcos）
* 複数ヘッドの方が良いが、ヘッド数が多すぎると逆効果※
* keyとvalueの次元を下げると性能劣化※
* DropoutやLabel Smoothingが有効※
* 位置エンコードの代わりに位置エンべディングも有効※
* Label Smoothing※
  * one-hotでの正解ラベル[0,0,1]を[0.1,0.1,0.8]のように優しさを与える
  * 正解に忠実すぎて過学習することを防ぐ

# BERT
* Fine-tuningアプローチの事前学習に工夫を加えたもの
* 双方向Transformer
  * tensorを入力としtensorを出力
  * 未来情報のリークを防ぐマスクがないため、事前学習タスクにおいて工夫する必要がある
* 3種類のEnbeddingのSumを入力とする
  * Token埋め込み
  * 文区別（Segment）埋め込み
  * 単語位置（Position）埋め込み
* 事前学習タスク
  * 空欄語予測（MLM）と隣接文予測（NSP）を同時に事前学習する
  * 単語分散表現と文章分散表現を同時に獲得できる
* ファインチューニング※
  * 公開されている学習済みのモデルに独自のデータを追加で学習させて新たな知識を蓄えたモデルを作り出す技術
  * 事前学習したモデルの重みを新しいデータで訓練する転移学習のひとつの手法
  * 転移学習では出力層だけ初期化するが、ファインチューニングは最終出力層を付け替える
  * 教師データが不足していてもAIを運用できる

# GPT
* 事前学習モデル
* 構造はTransformerを基本とする
* ある単語の次に来る単語を予測し、自動的に文章を完成できるように教師なし学習を行う
* 双方向ではない
* GPT-3
  * fine-tuningをしない（改めて勾配を更新し直すことをしない）
  * zero-shot：何のタスクか指定したあとすぐ推論させる
  * one-shot：何のタスクか指定したあとラベル付きの例をひとつだけ教えてから推論させる
  * few-fhot：二つ以上の例を教える
* BERTはTransformerのエンコーダ部分を使うが、GPTはデコーダ部分を使う
* Prompt based Learning
* BERTは文脈理解や文章比較が得意だが、GPTは文章生成が得意※
* prompt-based finetuningによって自然言語のテキスト分類における、否定の理解の性能が上がる※

# 音声認識
* 標本化
  * 連続時間信号を離散時間信号に変換
* 量子化
  * 等分した振幅にサンプルの振幅を合わせる
* サンプリング周波数
  * １秒間で処理することができるサンプルの個数
* サンプリングの法則
  * 周波数hの離散時間信号を測るには、最低2hのサンプリング周波数が必要
* フーリエ変換
  * 波形の振幅と周波数を機械学習の入力とするために行う
  * 標本化、量子化と併用する
  * 周期的波形は離散スペクトル、非周期的波形は連続スペクトルに変換できる
* スペクトログラム
  * 非周期音声データの分析が目的
  * 波形を特定の時間区間（窓）で区切る
    * 窓関数は窓の繋ぎ目を滑らかにするために区間ごとの波形関数にかける関数
    * 矩形窓、ハミング窓
* DFT（離散フーリエ変換）
  * サンプルの個数分、振幅と周波数のペアがある
* FFT（高速フーリエ変換）
  * 窓のサンプルのうち、偶数と奇数番目を別々に測定
  * 窓のサンプルN個のうちN/2個だけ測定することで高速化
* メル尺度
  * 人間の聴覚に基づいて周波数から変換する尺度
  * 低周波数の音の違いには敏感、高い周波数の音の違いには鈍感
* デジタルサンプリングは、ナイキスト定理によって読み取りと読み取りの合間のサンプルも完全に復元できる※
* RNNにオーディオ片を与えることで次の文字の予測をしながら書き起こせる※
* 特徴量抽出：フーリエ変換によって、複雑な音を要素（周波数帯）ごとに分解して取り出す※

# CTC
* 音声認識モデル
  * 音声特徴量から、音響モデル、発音辞書、言語モデルを介して認識結果が出る
* End-to-Endモデル
  * 複数モデルをひとつのDNNで表現するモデル
  * HMM（隠れマルコフモデル）を介さずに直接ラベル列の確率を出力できる
* blankラベルの導入
  * ラベル系列をテキスト系列に変換する際は、連続して出現するラベルをひとつにまとめ、ブランクを削除する
  * 同一ラベルの並びを表現
  * 厳密にアライメントを決定させず認識結果の精度を上げる
* 前向き・後ろ向きアルゴリズムを用いてRNNで学習
* 損失関数は、縮約すると正解と一致するような音素列の確率和の対数にマイナスをつけ、最小化する
* End-to-Endモデルの発展により複合的なタスク処理ができるようになる※
  * 高音と低音を別音源で流すマルチチャネル信号に対応
  * 発話に発話を重ねるオーバーラップに対応
* Mask-CTC※
  * CTCの出力トークンのうち信頼度の低いトークンをマスキングし、TransformerのMask-Predictionを用いて誤りを修正することで精度を改善する

# DCGAN
* GAN（Generative Adversarial Nets）
  * 生成器と識別器を競わせて学習する生成&識別モデル
  * Generator：乱数からデータを生成
  * Discriminator：入力データが真であるかを識別
* ２プレイヤーのミニマックスゲーム
  * ひとりが自分の勝利する確率を最大化、もうひとりは相手が勝利する確率を最小化する
  * 価値関数に対してDiscriminatorが最大化、Generatorが最小化を行う
  $$
  min_Gmax_DV(D,G)
  $$
  $$
  V(D,G)=E_x[logD(x)]+E_z[log(1-D(G(z)))]
  $$
  * 単一データのバイナリクロスエントロピー
$$
L=-ylog\hat y+(1-y)log(1-\hat y)
$$
を真データ、生成データについて足し合わせる
  * 複数データのため期待値をとる
  * 最適化はGとDのそれぞれのパラメータを固定して勾配上昇・降下法で更新する
  * 価値関数が$p_g=p_{data}$で確率分布が一致するとき最小化され学習終了
* モード崩壊
  * GANにおいて識別器を騙す特定の画像形式（モード）を学習し、生成画像の多様性が消滅すること
* DCGAN（Deep Convolution GAN）
  * GANを利用した画像生成モデル
  * GANにCNNを適用しネットワークを深くした
  * Generator
    * Pooling層の代わりに転置畳み込み層を使用
    * 乱数を画像にアップサンプリング
  * Discriminator
    * Pooling層の代わりに畳み込み層を使用
    * 画像から特徴量を抽出
  * 中間層に全結合層を使わない
  * バッチノーマライゼーションを適用
* SAGAN（Self-Attention GAN）※
  * 従来のGANの、転置畳み込みを繰り返しても局所的な情報の拡大にしかならないという問題を解決し、画像全体の大域的な特徴量を考慮する
  * Generatorで徐々に生成画像を拡大する際、レイヤー間にて出力を調整して次のレイヤーに入力する$(y=x+γ_0)$
  * １×１の畳み込み層で入力の次元圧縮

# Conditional GAN
* GANの生成したいデータにラベル条件をつける
  * 入力ベクトルの末尾に条件ベクトルをくっつける（手書き数字であればone-hotベクトルなど）
  * 生成器に最初に与えるノイズ（重み）に情報を持たせる
* Discriminatorは画像とラベルのペアを用いて識別する
* GにもDにもそれぞれラベル情報を与えて、「正しい条件が紐づいている本物」のみを本物とみなす

# Pix2Pix
* CGANの考え方で、条件ラベルに画像を用いる
* 条件画像が入力され、変換を施した画像を出力する
* 画像の変換方法を学習する
* Discriminatorは、条件画像からGeneratorが生成した画像G(z|x)の変換と条件画像から真の変換が施された画像yの変換が正しい変換かどうか識別する
* U-Net
  * Generatorに使用
  * 物体の位置を抽出
* L1正則化項
  * Discriminatorの損失関数に使用
  * 条件画像と生成画像の視覚的一致性のため、色の変化が顕著な部分を学習し生成画像のぼやけを防ぐ
* PatchGAN
  * 条件画像をパッチに分けて各パッチにPix2Pixを適用
  * 正確な高周波成分の強調による視覚的一致性の向上（GANによる識別器は高周波構造のみをモデル化し、低周波はL1項に依存することとする※）
* 従来のGANでは生成画像に多様性を持たせるためにノイズベクトルを加えて学習させるが、pix2pixではノイズを無視して学習してしまう※
* pix2pixでは関連性が明らかな2枚の画像を使うが、cycleGANは関連性がない2枚から新しい画像を作り出すためより大きく変えられる※

# A3C（Asynchronous Advantage Actor-Critic）
* 強化学習の学習法のひとつ
* Asynchronous
  * 複数のエージェントによる非同期な並列学習
  * 各エージェントは勾配情報を持って自由なタイミングで共有ネットワーク（パラメータサーバ）を更新する
  * 各エージェントは定期的に自分のネットワークの重みをglobal networkの重みと同期する
* Advantage
  * 複数ステップ先を考慮して更新する手法
  * ある行動が平均的な行動よりもどれだけ良いか評価
* Actor-Critic
  * 行動を決めるActor（行動器）を直接改善しながら、方策を評価するCritic（評価器）を同時に学習させるアプローチ
  * 一般的には方策と価値それぞれ別のロス関数でネットワークを更新するが、A3Cはパラメータ共有型でひとつの分岐型ネットワーク
* A2C
  * 同期処理を行う
  * Pythonでも実装しやすい
  * 各エージェントは中央司令部からの指示で一斉にワンステップ進行し、遷移先状態の報告をもとに次の行動を指示

# Metric-learning（距離学習）
* データ間の距離を学習する
* 深層距離学習
  * CNNを通して入力データの重要な情報を抽出した特徴ベクトルを得る
  * 埋め込み空間（特徴ベクトル空間）内で類似サンプル同士は近くに、非類似サンプル同士は遠くに置くように学習する
* Siamese network
  * 二つのサンプルをペアで入力しそれらのサンプル間距離を明示的に表現して調整する
  * contrastive loss（損失関数）
$$
L=\frac{1}{2}[yD^2+(1-y)max(m-D,0)^2]
$$
y：識別ラベル（入力サンプルが同じクラスなら１、違うなら０）
D：データ間距離
m：マージン（どの程度の距離までペナルティを課すかのパラメータ）
* Triplet network
  * アンカーサンプル（基準）、類似サンプルp、非類似サンプルnの三つを一組で入力する
  * triplet loss（損失関数）
  $$
  L=max(D_p-D_n+m,0)
  $$
    * $D_p+m>D_n$すなわち非類似サンプルがアンカーサンプルから類似サンプル＋マージンの距離内にあり十分離れていないときは損失関数が正となりペナルティを課す
    * $D_p+m<D_n$すなわち異なるサンプル同士が十分離れているときは損失関数が０
  * 組み合わせが膨大かつパラメータ更新への影響が少なく学習がすぐ停滞してしまう
    * 難しい入力セットを選ぶtriplet selectionが必要
  * クラス内距離がクラス間距離よりも小さくなるとは限らない
* ユークリッド距離と角度系どちらの手法かは使い分ける必要がある※
* ArcFace※
  * 角度系の手法（異なるクラス間の角度分離をより大きくする）
  * 正規化された特徴ベクトルとクラスの代表ベクトルのコサイン類似度から二つのベクトルがなす角を計算し、角度マージンを加えてコサインに戻す
  * ソフトマックス損失関数からクラス間の境界を学習する
  * グローバルな情報（クラス中心位置）を利用できる
* AdaCos※
  * 角度系の手法
  * ハイパーパラメータを必要としない

# MAML（メタ学習）
* モデルの開発に必要なデータ量を削減したい
* タスクに共通する重みを学習し、新しいモデルの学習に活用する
* 初期化された共通重みに対して、タスクごとに重みを最適化するように学習し、集めた結果から共通重みを更新し、再びタスクごとに学習することを重みが収束するまで繰り返す
* クラス分類、回帰、強化学習などでも効果あり
* タスクごとの勾配計算と共通パラメータの勾配計算があり計算量が多い
  * 2次以上の勾配を無視する
  * 逆伝播を行わず学習前後のパラメータの差を利用する
などの近似が可能
* 擬似的に学習データとテストデータを作成して期待検証誤差を評価できる※
* finetuningの問題点※
  * 元のタスクでの学習は、目的タスクの初期値にされることを考慮しないため、目的タスクの性能が向上するとは限らない
* MAMLは学習方法を学習するモデルベースの手法※
  * メトリックベース：タスク間の類似性を学習する
  * メモリベース：過去の経験を保存して利用する

# グラフ畳み込み（GCN）
* 畳み込みでは、元の関数にフィルターをかける
* 特徴をはっきりさせたいという目的で二次元画像に使うのがCNN、グラフ（ネットワーク）に対して使うのがGCN
* 隣接するノードを畳み込むイメージ
* Spatial GCN
  * グラフを空間的に考えて畳み込む
  * グラフにクラスタリングを繰り返す
  * 次元が低く近傍のある場所が限られると広範囲に重みを持たせにくい
* Spectral GCN
  * グラフをスペクトルに分解する（フーリエ変換）
  * グラフラプラシアンによって対応するベクトルの組み合わせを見つけ、グラフ全体まで拡張する
  * 計算量が多い
  * サイズと構造が変わるとパラメータの使い回しができない
  * グラフ畳み込み演算の定義
* GCNを数式で表すと※
  $$
  H^{(l+1)}=f(H^{(l)},A)
  $$
  * $l=0$について$f(X,A)=ReLU(AX・W)$となるが、$AX$は隣接行列×特徴行列であり、あるノードと繋がっているノードたちの特徴量を足したものである
  * $\hat A=A+I$として自身ノードの情報を入れる
  * 隣接行列$\hat A$を正規化する

# Grad-CAM,LIME,SHAP
* モデルの解釈に使う手法
* CAM
  * Global Average Poolingは、CNNが潜在的に注目している部分を可視化できるようにする
  * どこに注目して判断しているか強調したマップが出力できる
  * モデルのアーキテクチャにGAPがないと可視化できない
* Grad-CAM
  * CAMモデルに判断根拠を持たせ、モデルの予測根拠を可視化する
  * 最後の畳み込み層の予測クラスの出力値に対する勾配を使用
  * 勾配が大きいピクセルに重みを増やす（予測に重要な場所と判断）
  * モデルにGAPがなくても可視化できる
  * 画像分類だけでなく様々なタスクで使える
* LIME
  * 予測の判断根拠を解釈・可視化する
  * 単純なモデルで近似し、予測に寄与した特徴量を選び出す
  * 目標関数
  $$
  \xi (x) = argmin\mathcal L(f,g,\pi_x)+\Omega (g)
  $$
  は$\pi_x$が定義する指標を使って$g$が$f$を近似する際どれだけ不正確か、と使っているモデル$g$がどれだけ複雑で解釈しづらいか、を表す
  * 説明したい例の周辺のデータのみをサンプリングして近似するだけでもそのデータを説明したことになる
  $$
  \mathcal L(f,g,\pi_x)=\sum \pi_x(z)(f(z)-g(z'))^2
  $$
* SHAP
  * 協力ゲーム理論のshapley valueの概念を機械学習に応用した
  * プレイヤーが協力し、獲得した報酬を分配する
  * モデルから出力された予測値を、限界貢献度をもとに貢献度が異なる特徴量に分配する

# Docker
* 仮想環境
  * ハードウェア上で独立した複数の環境を実行する技術
  * ホスト型：物理的なホストOS上で動作
  * ハイパーバイザー型：ハードウェア上で直接実行
  * コンテナ型：単一のOSカーネルで複数のコンテナ実行
* Docker
  * コンテナ型仮想化ソリューション
  * アプリケーションと依存関係をコンテナとしてパッケージ化し、開発、テスト、本番、どの環境でも一貫した動作を保証する
  * アプリケーション開発とテストのワークフローの簡素化と加速に繋がっている
  * 基本コマンドを用いてコンテナの作成、運用、管理を効率的に行う
  * Dockerfile：コンテナイメージを作成するための指示書
  * DockerがGPUサポートを強化
  * コンテナオーケストレーション
    * 大規模アプリなどで複数のコンテナ管理を行うソリューション
    * コンテナのデプロイ、スケーリング、運用の自動化プロセスのこと
* 従来の仮想環境より軽量に起動できる※
  * 従来は仮想化ソフトウェア→ゲストOS→ミドルウェア等
  * Dockerではコンテナエンジン→ミドルウェア等
* バージョン管理が楽※
* セキュリティスキャンツールと統合しやすい※
* Docker Composeで指示書に基づいて複数コンテナを同時に起動※