【ラビットチャレンジ】深層学習 Day4 レポート


# はじめに

ラビットチャレンジの「深層学習後編（day4）レポート」になります。最後のレポートです。


✅　応用数学レポート　
✅　機械学習レポート
✅　深層学習前編（day1）レポート
✅　深層学習前編（day2）レポート
✅　深層学習後編（day3）レポート
⭐ "深層学習後編（day4）レポート"




## Section1: 強化学習 (Reinforcement Learning)


#### 1-1. 要点

- 強化学習
    - 長期的に報酬を最大化できるように環境のなかで行動を選択できるエージェントを作ることを目標とする機械学習の一分野
    - 行動の結果として与えられる利益(報酬)をもとに、行動を決定する原理を改善していく仕組み

- 種類
※ポイントは以下に優れた方策を決定するか

![スクリーンショット 2023-11-25 15.53.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223559/ca683c50-d15c-05aa-4c5a-67dc96610874.png)

※引用先 : https://taketake2.com/N66.html


- 方策の学習方法 (更新対象)
    - ①価値ベース (Value-Based Method)
        - 強化学習においてエージェントがある状態に存在したり、行動を選択したりすることにどれくらい価値があるかを定量化
    - ②方策ベース (Policy-Based Method)
        - 方策の条件付き確率を "方策勾配法" などにより学習し、価値関数を求めることなく直接的に方策を決定


- 方策勾配法
    - 方策をあるパラメータで表された関数とし、そのパラメータを学習することで方策を学習する方法
    - ※方策 (=戦略、ポリシーとかも言う)

#### 1-2. 関連学習 
※強化学習はあまり今まで触れてこなかったので用語の調査

- モデル
    - モデルベース
    - モデルフリー
- 学習に使う経験
    - 実測値 (モンテカルロ法)
    - 予測値 (TD法)
- Q学習 (モデルフリーの行動価値関数を求めるアルゴリズム)
    - 強化学習手法TD学習の一つで、Q値(状態行動価値)をエージェントが行動するたびに更新する手法
    - ゴール
        - 正しい行動価値関数 $ Q(s,a)$ を求めること
        - $ Q(s,a)$ は、状態sの時に行動aをした場合、その先最大で得られるであろう報酬合計R(t)を返す関数
## Section2: AlphaGo


#### 2-1. 要点

- AlphaGo
    - DeepMind社によって開発
    - 打つ手の探索にモンテカルロ木探索法を使用し、基盤の状況認識にCNNを使用
    - 2017年10月に、AlphaGoの強化版AlphaGo Zeroが発表
    - AlphaGo Zeroの最大の特徴は、完全自己対局(self-play)で学習
    - 最初から自分自身と戦うことで得られたデータのみを使って深層強化学習
    - 参考
        - https://gri.jp/media/entry/732

- 参考記事
    - https://qiita.com/pocokhc/items/785e7b021c7c15794dbc


## Section3: 軽量化・高速化技術

#### 3-1. 要点

- 分散深層学習
    - 深層学習は高速な計算が求められる
    - 複数の計算資源を使用し、並列的にNNを構成することで、効率の良い学習を行いたい
    - データ並列化、モデル並列化、GPUによる高速技術は不可欠である

- データ並列化
    - 親モデルを各ワーカーに子モデルとしてコピー
    - データを分割し、各ワーカーごとに計算させる
    - 同期型と非同期型がある
        - 処理スピードは非同期の方が早い
        - 非同期は最新のモデルのパラメータを利用できないので、学習が不安定になりやすい (Stale Gradient Problem)
        - 同期型の方が精度が良いので現在の主流

- モデルの軽量化
    - 計算の高速化と省メモリ化を行うためモバイル、IoT機器と相性が良い手法


- 軽量化の手法
    - 量子化(Quantization)
        - 通常のパラメータの64bit浮動小数点を32bitなど下位の精度に落とすことでメモリと演算処理の削減を行う
        - (+) 計算の高速化、省メモリ化 (-)精度の低下
    - 蒸留(Distillation)
        - 規模の大きなモデルの知識を使い軽量なモデルの作成を行う
        - 知識の継承により、軽量でありながら複雑なモデルに匹敵する精度のモデルを得ることができる
        - 教師モデルと生徒モデルと言われる
    - プルーニング(Pruning)
        - モデルの精度に寄与が少ないニューロンを削減することでモデルの軽量化、高速化が見込まれる


#### 3-2. 関連学習

- 以前PyTorchでPruningは実装したことある
- Pruningは学習途中で行うものと出来上がったモデルに対して行う手法がある
- PyTorchのPruningチュートリアル
    - https://pytorch.org/tutorials/intermediate/pruning_tutorial.html
- 少し古いがPruningの動向がまとまっている記事
    - https://iblog.ridge-i.com/entry/2021/02/24/115105
     


## Section4: 応用技術

#### 4-1. 要点

- MobileNets
    - 論文タイトル MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

    - 提案手法
        - 一般的な畳み込みレイターは計算量が多いが、MobileNetは "Depthwise Conv" と "Pointwise Conv"　を組み合わせて軽量化を実現
        - 通常の畳み込みが空間方向とチャネル方向の計算を同時に行うが、Depthwise Separable Convでは分けて計算を行なっている
        - Depthwiseでチャネル毎に空間方向へ畳み込んで、その後にPointwiseでチェネル方向へ畳み込む

- DenseNet
    - 論文タイトル : Densely Connected Convolutional Networks. G. Huang et., al. 2016
    - 提案手法
        - Residual Blockでは前1層の入力のみ後方へインプットするが、DenseBlockでは前方の各層からの出力全てが後方の層へ入力として用いられる

- Wavenet
    - 生の音声波形を生成する深層学習モデル
    - Pixel CNNを音声に応用したもの
    - メインアイデアは時系列データに対して畳み込みを適用

#### 4-2. 関連学習

- 以前工場で推論するモデルをMobileNetで構築した経験あり。ResNetを中心にモデル構築していたがやはり層が深い分、推論に時間がかかるのが問題であった。ある程度の精度が担保されながら推論は早い印象。畳み込みの工夫でここまで変わるのかと思っていたような気がする
- MobileNetもv1,v2,v3とあるのでアーキテクチャ構造はしっかり抑えておきたいところ
    - https://qiita.com/omiita/items/77dadd5a7b16a104df83
- MobileNetは実用されているイメージはあるが、DenseNetはあまりないイメージ。調べてもあまり出てこなかった



## 5. ResNet (Residual Neural Network)

#### 5-1. 要点

- ResNet (論文:https://arxiv.org/abs/1512.03385)
    - 従来より層が深いモデル
    - ResNetの Skip connection (identity) はパラメータがないので軽量&過学習や勾配消失発生しにくい

- Wide ResNet
    - フィルタ数をk倍したResNet
    - パラメータを増やす方法として、層を深くするのではなく、各層を広くした

#### 5-2. 関連学習

- ResNetは派生系が色々存在していると認識している
- ResNeXt
    - ResNetの残差ブロックをワイド化したもの
    - Grouped Conv が特徴的
    - 全体の深さや全体の幅を増やさずに，残差ブロック単位で，その中のグループ分割数を増やすだけで，計算効率性をモデル精度を向上したResNetの発展型の１つである
    - 参考記事
        - https://cvml-expertguide.net/terms/dl/cnn/cnn-backbone/resnext/
    

#### 5-3. 実装演習

```py 
import tensorflow as tf
import numpy as np
import tensorflow_datasets as tfds
import tensorflow_hub as hub
tf_flowers = tfds.image_classification.TFFlowers()
tf_flowers.download_and_prepare()

(train_ds, test_ds) = tf_flowers.as_dataset(as_supervised=True, split=['train[:70%]', 'train[70%:]'], shuffle_files=True)
fig = tfds.show_examples(train_ds, tf_flowers.info)
fig = tfds.show_examples(test_ds, tf_flowers.info)
class_num = tf_flowers.info.features['label'].num_classes

IMAGE_RES = 224

def format_image(image, label):
    image = tf.image.resize(image, (IMAGE_RES, IMAGE_RES)) / 255.0
    label = tf.one_hot(label, depth=class_num)

    return image, label

BATCH_SIZE = 16

train_batches = train_ds.map(format_image).batch(BATCH_SIZE).prefetch(1)
test_batches = test_ds.map(format_image).batch(BATCH_SIZE).prefetch(1)

print(train_batches)
print(test_batches)

histories = []

EPOCHS = 20

model = tf.keras.Sequential([
    tf.keras.layers.InputLayer(input_shape=(224, 224, 3)),
    hub.KerasLayer("https://tfhub.dev/google/imagenet/resnet_v1_50/feature_vector/5", trainable=False),
    tf.keras.layers.Dense(class_num, activation='softmax')
])
model.compile(optimizer=tf.keras.optimizers.Adam(), loss='categorical_crossentropy', metrics=['acc'])
model.summary()

history = model.fit(
    train_batches,
    epochs=EPOCHS,
    batch_size=BATCH_SIZE,
    validation_data=test_batches,
    callbacks=[
        tf.keras.callbacks.EarlyStopping(monitor='val_acc', patience=2, mode='max')
    ]
)
histories.append(history)



import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10, 8))
method_names = [
  'ResNet Transfer lerning',
  'ResNet Fine-Tune',
  'ResNetWide Transfer lerning',
  'ResNetWide Fine-Tune',
]

plot_df = pd.DataFrame()

for i, history in enumerate(histories):
    # method_name = str(method_names[i])
    method_name = str(i)
    history_df = pd.DataFrame(history.history)
    history_df['method_name'] = method_name
    history_df['Epochs'] = history_df.index
    plot_df = pd.concat([plot_df, history_df], ignore_index=True)

sns.lineplot(data=plot_df, x=plot_df['Epochs'], y='acc', hue='method_name')
val_plot_df = plot_df
val_plot_df['method_name'] = plot_df['method_name'].apply(lambda x: 'val_' + x)
sns.lineplot(data=val_plot_df, x=plot_df['Epochs'], y='val_acc', hue='method_name', linestyle='dashed')



```
![スクリーンショット 2023-11-28 0.00.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223559/0d393e5f-afe6-ad22-231d-21c061cd5581.png)

- 考察
    - ResNetのfine-tuningを実装してみた。フレームワークを利用するととても楽に実装できるのを改めて体感した。`model.summary()` が使えるのは便利だと思った。確かPyTorchだとなくてライブラリをインストールして使用してやっていた経験あり。学習曲線も可視化してみたがepochが大きくになるにつれて精度は向上していた。


## 6. EfficientNet
#### 6-1. 要点

- EfficientNet (2019 from Google Brain)
    - 論文 : https://arxiv.org/abs/1905.11946
    - 効率的なスケールアップの規則を採用することで当時の最高水準の精度を上回り、同時にパラメータ数を大幅に減少
    - **「幅、深さ、解像度」などを何倍増やすかは、複合係数(Compound Coefficient)を導入することで最適化**
    - 従来のモデルよりパラメータが1/8ぐらい小さい
    - 転移学習の最適
    - その割にモデルが複雑でない
    - 参考記事
        - https://qiita.com/omiita/items/83643f78baabfa210ab1
        

## 7. 物体検知とSS解説


#### 7-1. 要点

- 物体検出モデル
    - YOLO
    - SSD
    - RCNN
    - Fast RCNN
    - RetinaNet
    - CornerNet
- 指標
    - IoU(Intetsection over Union)
        - 物体検出で利用できる評価指標
    - mAP(mean Average Precision)
        - APを全てのクラスについてさらに平均したもの
- セマンティックセグメーテーション (Semantic Segmentation)
    - 物体領域を画素単位で切り出し、各画素にクラスを割り当てる手法
    - 工業検査や医療画像解析など、精密な領域分割に応用される
    - モデル
        - FCN(Fully Convolutional Network)
            - 完全畳み込みニューラルネットワーク
            - 全ての層が畳み込み層、全結合層がない
            - 任意のインプットサイズでOKなので特徴
        - UNet
            - アーキテクチャがUの字に見えるから "U-Net"
            - 生物医科学の画像セグメンテーションを行うために2015年に発表
            - Skip Connectionを用いて畳み込みによって失われる位置情報を保持している
    - その他
        - Dilated Conv
            - https://cvml-expertguide.net/terms/dl/layers/convolution-layer/dilated-convolution/
        - Deconvolution/Transposed Convolution


#### 7-2. 関連学習

- U-Netも実装した経験があり、医療データのセグメンテーションに利用
- U-Netの改良版で "U-Net++" がある
- U-Net++
    - 論文 : https://arxiv.org/abs/1807.10165
    - 各スケールのEncoder部分からDecodeを行い、それらをskip connectionによってDecoderに連結
    - これによって、Encoder-Decoder間の特徴マップの表現上のギャップを減らすことができる
![スクリーンショット 2023-11-26 10.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223559/d049d4ac-4b1a-d051-8787-c81064b1a09b.png)


## 8. Mask R-CNN

#### 8-1. 要点

- R-CNN (Regional CNN)
    - 物体検出タスクと物体認識タスクを順次に行う
    - 関心領域(ROI: Region of Interest)
    - R-CNNは処理が重くて遅いのが問題
        - →改良版 : Fast R-CNN (ROI毎に畳み込み層に通すのではなく、画像毎に一回の畳み込み操作を行う)
        - →さらに改良版 : Faster R-CNN (ROIの切り出しもCNNで行う)

- Mask R-CNN
    - Faster R-CNNを拡張
    - インスタンスセグメンテーションに対応するので、Faster R-CNNの物体検出機能にセグメンテーションの機能を追加したイメージ
    - BB内の画素単位でクラス分類を行うため、物体の形も推定可能
    - Mask R-CNNは "ICCV2017 Best Paper"

#### 8-2. 関連学習

- 物体検出と言うとYOLOが一番最初に出てくる。そもそも今はYOLOの最新はv8ということに驚いた(ここ数年キャッチアップしてなかったので)
- YOLOv3(2023/01)
    - 速度と精度の面でUp
    - 物体検出だけでなく、セグメンテーションタスクや画像分類タスク、姿勢推定タスクでも利用することできる
    - 詳細
        - https://learnopencv.com/ultralytics-yolov8/
        

## 9. FCOS(Fully Convolutional One-Stage Object Detection)
#### 9-1. 要点


- FCOS
    - アンカーベースの手法のデメリットを回避し、アンカーベースに匹敵するもしくは超える精度を出した (アンカーフリー)
    - FPN(Feature Pyramid Network)を使用して特徴マップを作成し、「head」と言う拡張部分を各特徴マップの後に追加して、分類、バウンディングボックス回帰とCenter-nessと言う新しいインデックスを学習するモデル
    - 複数のサイズの特徴マップを生成する手法
    - アンカーボックス欠点
        - 事前設定するハイパラの数
        - ポジティブサンプルとネガティブサンプル数の不均衡


![スクリーンショット 2023-11-26 10.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223559/58cd444d-f4ce-5047-8b06-542884360a25.png)


#### 9-2. 関連学習

- Feature Pyramid Network
    - 論文 : https://arxiv.org/abs/1612.03144
    - 物体検出などにおいて，マルチスケール画像認識へと効率的に対応するために，CNN-EncoderにDecoderを加えて，U-Net的なスキップ接続つき砂時計型Encoder-Decoder構造へと拡張する機構
    - FPNの発展手法の 代表例として，Path Aggregation Networkや，EfficinentDetのFPN，Deep Layer Aggregationなど
    - 参考記事
        - https://cvml-expertguide.net/terms/dl/object-detection/fpn/
        

## 10.Transformer
#### 10-1. 要点

- Transformer
    - 論文: "Attention is all you need" (https://arxiv.org/abs/1706.03762)
    - RNNもCNNも使わずに "Attention" を使用したEncoder-Decoderモデル
        - 入力と出力の文章同士の広範囲な依存関係を捉えられる
    - 並列化がかなりしやすく訓練時間が圧倒的に削減できる
    - アーキテクチャポイント
        - Encoder-Decoder Model
        - Attention
        - Multi-Head attention
        - Position Encoding


#### 10-2. 関連学習

※ TransformerがVisionの方にも出てきたもの。Transformerがとんでもなく優秀だなと当時は思っていた

- ViT (Vision Transformer)
    - 論文:https://openreview.net/forum?id=YicbFdNTTy 
    - 完全に畳み込みとさよならしてSOTAになったモデル
    - SOTAを上回る性能を約1/15のコストで実現
    - ポイント
        - 画像パッチを単語のように扱う
        - アーキテクチャはTransformerのEncoder部分
        - 巨大なデータセットJFT-300Mで事前学習

![スクリーンショット 2023-11-26 11.09.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223559/456ffc85-6c3d-fe99-b3f5-b7b472cfcdae.png)


## 11. BERT
#### 11-1. 要点

- BERT
    - 論文: Pre-training of Deep Bidirectional　Transformers for Language Understanding
    - 2018年にGoogleが発表したNLP（自然言語処理）のモデルの一つ
    - Bidirectional Transformerをユニットにフルモデルで構成したモデル
    - 肝は事前学習
        - MLM(Masked Language Modeling)
            - 複数箇所が穴になっている単語予測
        - NSP(Next Sentence Prediction)
            - 2つの文が連続したものかどうか判定


#### 11-2. 関連学習

BERTは色んな場面で活用されているイメージがあります。
- BERTの活用事例
    - Googleの検索エンジン
    - チャットボット
    - 機械翻訳
    - 大量データテキストの分類
    - 文章要約
    - スマートスピーカー
    - 音声認識AI
    - 等


## 12. GPT 

#### 12-1. 要点

- GPT(Generatibe Pre-Training)
    - 2019年にOpenAIが開発した有名な事前学習モデル
    - GPT-3のパラメータ数は1750億個にもなり、約45TBのコーパスで事前学習
    - Transformerアーキテクチャをベースにし、巨大なデータセットで事前訓練された後、さまざまな自然言語処理タスクに対してファインチューニングが可能
    - GPTはトークン単位での処理を行うため、長文になるほど計算リソースが増加し、生成される文章の品質も低下する傾向がある


#### 12-2. 関連学習

※面白い論文を見つけたのでメモしておきます

- 論文 : GPTs are GPTs (https://arxiv.org/abs/2303.10130)
    - OpenAIがアメリカの労働者市場におけるGPTの影響を評価した
    - アメリカの約80%の労働者がGPTの導入によって少なくてもタスクの10%へ影響
    - 約19%の労働者が自身のタスクの50%に影響
    - 影響範囲は全ての賃金レベルに及び、高収入の職が潜在的により高い影響を受ける

![スクリーンショット 2023-11-26 11.26.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223559/89c17fc7-6e69-f748-1097-b2577142222b.png)


## 13. 音声認識
#### 13-1. 要点


- 波形の扱い
    - 標本化
        - アナログの波形データを一定間隔に抽出
    - 量子化
        - 標本化で抜き出したデータをデータをそれぞれ数値に変換する
    - サンプリング周波数
        - どのような間隔でデータを区切るか
- フーリエ変換
    - 簡単に言うと、非周期的なアナログ信号（連続的な波形）にどんな周波数成分が，どんな大きさで含まれているかを知りたいときに使用する手法
    - 参考 : https://rikeinotame.com/fourier2/ 
- 窓関数
    - ある区間の信号を取り出すために，もとの信号列からある区間を取り出す際にかけ合わせる関数のこと
    - FFT(Fast Fourier Transform)解析をする前には，信号の周期性を確保するためにもとの信号に窓関数をかけてからFFTを行うことが多い
    - 例 : 矩形窓 (Rectangular),ハミング窓 (Hamming)
- メル尺度
    - 人間の聴覚に基づいた尺度
- ケプストラム
    - 音声波形をフーリエ変換して得たパワースペクトルについて， その値の対数をとり，さらに逆フーリエ変換した結果を指す





## 14. CTC(Connectionist Temporal Classification)
#### 14-1. 要点

- 音声認識
    - 入力信号を音声特徴ベクトルに変換、その音声特徴ベクトルから対応する単語列を推定するタスク
    - RNNでは入力と出力が一致する必要があるが、音声認識では必ずしも一致しない問題
    - →このギャップを解消するのが "CTC"



## 15. DCGAN
#### 15-1. 要点

- DCGANはGANの生成器と識別器として畳み込みニューラルネットワークを用いたもの
- バッチ正規化の利用
- LeakyReLUの利用。GANでの学習で勾配消失にならないようにLeakyReLUを使用。ReLUでは、逆伝搬での重み更新で、0以下の誤差が上層に伝搬できない。- LeakyReLUでは、0以下でも出力が0にならない。その分LeakyReLUのハイパラが増える。
- Pooling層がない
- 技術のキモはバッチ正規化
#### 15-2. 関連学習

- Unrolled GAN(2016.7)
    - 論文:Arxiv: https://arxiv.org/abs/1701.07875
    - GANやDCGANでは学習の際に識別器が早く学習してしまう
    - UnrolledGANでは、生成器の学習の際にKステップ学習した後の識別器を利用して勾配を計算
    - 生成器に先取り学習させて、識別器とのバランスをとるイメージ
    - 参考書籍
        - 実践GAN 敵対的ネットワークによる深層学習

- 以前にGANについて個人的にまとめた記事
    - https://qiita.com/tatsuya11bbs/items/e74eb2de6b1cd1474076


## 16. Conditional GAN (CGAN)
#### 16-1. 要点

- 生成器と識別器にいくつかの追加情報を与えて、条件づけができるように訓練を行う敵対性ネットワーク
- 生成器は訓練データ内の各ラベルに応じたリアルなサンプルを学習
- 識別器は偽のサンプルとラベルの組、本物のサンプルとラベル組を見分ける
- 識別器を騙すためには、CGANの生成器はリアルな画像を生成するだけではダメでラベルにもマッチしなくてはいけない
- 生成器の訓練が終われば自分が生成したい画像を生成することができる




## 17. Pix2Pix
#### 17-1. 要点

- 教師ペアが必要なドメイン間の変換
- CGANの一種で条件として画像を与える
- 生成器の出力を正解ラベルとなるようにL1Lossを採用
- L1Lossは、ピクセル単位で正解画像に近いような画像を生成
- U-Netを利用して画像変換を行う。画像変換では、変換前と変換後で画像は一定レベルで同じ要素を持つのでU-Netのencoderで圧縮した情報だけでなく、skip connectionの情報も加え合わせることでより具体的な情報をもとにデコードした。
- 識別器による判定を画像全体を見て一度だけでなく、小さい領域に分割して判定を行う(PatchGAN)



## 18. A3C (Asynchronous Advantage Actor-Critic)
#### 18-1. 要点

- A3C
    - 強化学習の学習法の一つ
    - 複数エージェントが同一の環境で非同期に学習
    - ※ Actor-Criticとは
        - 行動を決めるActorを直接改善しながら、方策を評価するCritic(評価器)を同時に学習させるアプローチ
    - 並列分散エージェントで学習を行うA3Cのメリット
        - ①学習が高速化
        - ②学習が安定化
    - A3Cはオンポリシー手法であり、サンプルを集めるエージェントを並列化することで自己相関を低減することに成功

- A2C
    - A3Cの後にA2Cという手法が発表
    - A2Cは同期処理を行い、Pythonでも実装しやすい





## 19. Metric-learning
#### 19-1. 要点

- 距離学習
    - データ間の距離を学習する
    - データ間の距離を適切に測ることができれば距離が近いデータ同士をまとめてクラスタリングできたり、他のデータ要素から距離が遠いデータを異常と判定することで異常検知したりと様々な応用可能
    - 手法
        - **Siamese Network**(シャムネットワーク)
            - 2つの画像の似ている似ていないという指標となる距離を学習するCNNを利用したニューラルネットワーク
            - 2つのCNNは重みが共有されていてそれらの出力を距離を計算するネットワークに入力する
            - 画像の似ているかどうかを算出できるため、少ない画像を用いて画像の分類を簡易に行うことができる
        - **Triplet Network**
            - 3つのCNNでどちらの画像に近いかを算出するネットワーク
            - SiameseNetを引き合いに出しており、Triplet Networkはその欠点を改善した手法である
            - **TripletLoss** の場合は、基準となる画像に対して、類似度が低い方を、もう一方よりも相対的に遠ざける形となるため、コンテキストの考慮は必要なし
- 参考記事
    - https://tech-blog.optim.co.jp/entry/2021/10/01/100000#Triplet-loss
    




## 20. MAML(Model-Agonostic Meta-Learning)
#### 20-1. 要点

- MAMLが解決いたい課題
    - DLの開発に必要なデータ量を削除したい
- コンセプト
    - タスクに共通する重みを学習し、新しいモデルの学習に活用したい
- MAML
    - メタ学習アルゴリズム
    - 2つの特徴
        - Model-Agnostic
            - 微分可能である以外、モデルや損失関数の具体的な形式を仮定しない
        - Task-Agnostic
            - 回帰、分類、強化学習など、様々なタスクに応用できる



## 21. グラフ畳み込み(GCN)
#### 21-1. 要点

- 畳み込み
    - もとの関数にフィルターをかけること
    - 何のために？→例えば、"特徴をはっきりさせるため"
    - これを2次元にやる→ CNN, グラフにやる→GCN
- グラフ
    - ノードとエッジで構成されているもの
- GCN
    - CNNのようにフィルタの畳込みをグラフ上で行うことでグラフやノードの潜在ベクトルを得る方法
    - 畳込みの定義の仕方にはグラフフーリエ変換を用いるアプローチとより直接的なアプローチの2種類
    - モデル
        - Spectral GCN
            - グラフをスペクトルに分解して畳み込む
        - Spatial GCN
            - 「グラフ」を空間的に考えて畳み込む 




## 22. Grad-CAM, LIME, SHAP
#### 22-1. 要点


- なぜ解釈性が重要なのか？
    - DLは「ブラックボックス」
    - 判断の根拠を説明できない
- モデル解釈に使われる4つ手法
    - **CAM**(Class Activation Mapping)
        - 2016のCVPRにて発表されたCNNの判断根拠可視化の手法
        - "Global Average　Pooling" を使用するモデルに適応できる手法として提案された
        - 
    - **Grad-CAM**
        - CNNモデルに判断根拠を持たせ、モデルの予測根拠を可視化する手法
        - 名前の由来は "Gradient" = 勾配情報
        - 最後の畳み込み層の予測クラスの出力値に対する勾配を使用
        - 勾配が大きいピクセルに重みを増やす
    - **LIME** (Local Interpretable Model-agnostic Explanations)
        - 単純で解釈しやすいモデルを用いて、複雑なモデルを近似することで解釈を行う
    - **SHAP**（SHapley Additive exPlanations）
        - 予測した値に対して、「それぞれの特徴変数がその予想にどのような影響を与えたか」を算出するもの
        - モデルのアルゴリズムの種類(決定木・線形回帰など)に限定されていないので様々な場面で使用できる点からも人気の高い手法



#### 23-2. 関連学習

※この分野に関しても、Grad-CAM, Grad-CAM++は実装した記憶があります。医療データを判断根拠の可視化ということでこのような技術は非常に重要になってくると当時は感じてました。

- Grad-CAM++
    - 2018年のWACVに採択されたGrad-CAMの改良手法
    - 勾配に加えてへシアンや3回微分を用いて重みを計算している
    - Grad-CAMとの違い
        - 特徴マップにReLUを通す
        - 各重みがスコアの寄与を反映している

- 他には以下のようなものもあるみたい
    - Score-CAM
    - Eigen-CAM
    - Albation-CAM
    - Layer-CAM

## 23. Docker
#### 23-1. 要点

- Dockerとは
    - 軽量で高速に動作するコンテナ型仮想環境用のプラットフォーム
    - Docker利用メリット
        - 手軽かつスピーディに―アプリケーションの実行環境を確保できる
        - 処理速度が速い(CPUやメモリーの使用量を節約できる)
        - アプリケーション実行環境の移転が簡単
    - 基本要素
        - イメージ
        - コンテナ
        - Dockerfile
    - 他
        - DockerHub
        - Docker Engine
        - Docker CLI
        - Docker Compose 

#### 23-2. 関連学習

- Dockerの関連で言うとk8sがまず出てくるだろう
- 簡単だが用語だけ整理しておく


- kubernetes
    - Googleによって開発されたコンテナ運用管理を支援するオープンソースのソフトウェア


▪️ 4分類10種類のリソース

| 分類 | リソース |
|:-:|:-:|
|  ワークロード | Pod, ReplicaSet, Deployment, StatefulSet  |
| サービス  |  Service, Ingress |
| 設定  |  ConfigMap, Secret |
| ストレージ  | PersistentVolume, PersisentVolumeClaim  |


# 終わりに

久しぶりにDLにどっぷり浸かった気がします。強化学習はあまりやってこなかったので初見のものが少しありましたが他は以前学習していたこともあり懐かしい内容のものばかりでした。この内容プラス最近のトレンドを抑えておきたいので後でもう少しキャッチアップしておきたいです。