学習レポート: 深層学習(Day 4)

# 強化学習
- 長期的に報酬を最大化できるように環境のなかで行動を選択できるエージェントを作ることを目標とする機械学習の一分野
    - 行動の結果として与えられる利益(報酬)をもとに、行動を決定する原理を改善していく仕組み
        1. エージェントは時刻$t$において環境から状態$s_t$を受け取る
        1. エージェントは状態$s_t$から、方策($π$)に基づき行動$a_t$を選択して実行する
        1. 環境が新しい状態$s_{t+1}$に遷移する
        1. エージェントは遷移で生じた価値$V$に応じた報酬$r_{t+1}$を獲得する
        1. エージェントは得られた報酬をもとに、選択した行動の良し悪しを学習する
        1. ステップ1へ
    - 数学的に表される二つの関数(関数近似法)の最適化を目指す
        - 方策関数π(s, a)
        - 行動価値関数Q(s, a)
- 価値関数
    - 2種類の価値関数
        - 状態価値関数(state-value function): ある環境の状態の価値
            - $ V^π(s) $
        - 行動価値関数(action-value function): 状態とエージェントがとった行動を組み合わせた価値
            - $ Q^π(s, a) $
    - 最近の主流は行動価値関数
        - 行動価値関数、すなわちQ値の最適化を目指すのがQ学習
- 方策関数
    - エージェントがある状態でどのような行動をとるのかの確率を与える関数
        - $ π(s) = a $
        - 行動価値関数が最大化されるように方策関数を学習する
- エージェントは方策に基づいて行動する
    - $ π(s, a) $: VやQを元にどういう行動をとるか
        - $ π(s, a \vert θ) $: 方策関数をNNで表現する際の重みを$θ$とする
- 方策関数の学習
    - 方策勾配法
        - $ θ^{(t+1)} = θ^{(t)} + ε∇J(θ) $
        - $J$とは、方策の良さ
            - NNでは誤差関数であり目指すのは最小化だったが、強化学習では期待収益であり、目指すのは最大化(だからマイナスではなく、プラスする)
    - 方策勾配定理
        - $ ∇_θJ(θ) = \mathbb{E}_{π_θ}[( ∇_θlog π_θ（a \vert s)Q^π(s, a))] $
        - 展開する元は以下の通り
            - $ ∇_θJ(θ) = ∇_θ　\displaystyle \sum_{a \in A} π_θ（a \vert s)Q^π(s, a) $
                - ここで$ π_θ（a \vert s)Q^π(s, a) $はある行動をとる時の報酬

## AlphaGo
- AlphaGo Lee： 2つのNNで構築された関数をもつ
    - PolicyNet(方策関数)
        - CNN
            - 入力は19*19の交点*48チャンネル(自石の位置、敵石の位置など)
            - 畳み込みとReLUの繰り返し
            - 出力はSoftmaxで19*19の交点それぞれの着手予想確率を出力する
    - ValueNet(価値関数)
        - CNN
            - 構成はPolicyNetに似ているが、入力は49チャンネルとPolicyNetより1チャンネル多い
            - 出力は原局面の勝率(Flattenで1次元化されたもの)をtanh関数によって-1〜1で表したものが出力される
    - 学習のステップ
        1. 教師あり学習によるRollOutPolicyとPolicyNetの学習
            - RollOutPolicyはNNではなく線形の方策関数
                - 探索中に高速に着手確率を出すために使用される
            - 教師は人間同士の対局の棋譜データ
        1. 強化学習によるPolicyNetの学習
        1. 強化学習によるValueNetの学習
            - モンテカルロ木探索
- AlphaGo Zero
    - いくつかAlphaGo Leeから進化
        - 教師あり学習を行わず、強化学習のみで構成
        - PolicyNetとValueNetを一つのネットワークに統合
        - Residual Netを導入
    - 一つのネットワークから2つの出力(Policy出力とValue出力)を得る
    - Residual Network
        - ネットワークにショートカット構造を追加して、勾配の爆発、消失を抑える効果を狙ったもの
            - Residula Networkを使うことにより、 100層を超えるネットワークでの安定した学習が可能となった
            - Resisual Network を使うことにより層数の違うNetworkのアンサンブル効果が得られている
        - AlphaGo Zeroでは、Residual Blockを39個つなげて使っている
    - Residual Blockでの工夫としてBottleneck、PreActivation、Network構造の工夫としてWideResNet、PyramidNetがある


# 軽量化・高速化技術
- 毎年10倍のペースで必要な処理能力が増えている
    - 一方でコンピューターの進化は18~24ヶ月で2倍
    - 分散深層学習: 台数を増やして処理能力を高める

## 分散深層学習
- データ並列化
    - 親モデルを各ワーカーに小モデルとしてコピー
    - データを分割し、各ワーカーごとに計算させる
    - 同期型
        - 各ワーカーの計算が終わるのを待ち、全ワーカーの勾配が出たところで勾配の平均を計算し、親モデルのパラメーターを更新
    - 非同期型
        - 各ワーカーはお互いの計算を待たず、各小モデルごとに更新を行う
        - 学習が終わった小モデルはパラメーターサーバーにpushされる
        - 新たに学習を始めるときは、新たに学習を始める時は、パラメーターサーバからPopしたモデルに対して学習していく
    - 非同期型の方がスピードは早いが、学習が安定化しやすいのは同期型
        - 現在は同期型の方が主流
    
- モデル並列化
    - 親モデルを各ワーカーに分割し、それぞれのモデルを学習させる
        - 層の塊で分割することもあれば、分岐で分割することもある
        - 今多いのは分岐での分割
    - 全てのデータで学習が終わった後で、一つのモデルに復元する
    - モデルが大きい時はモデル並列化を、データが大きい時はデータ並列化をすると良い
    - モデルのパラメータ数が多いほど、モデル並列化によるスピードアップの効率も向上する
        - 小さななモデルでは、並列化によるオーバーヘッドが上回ってしまう

## ハードウェアによる高速化
- GPU: 簡単な並列処理が得意
- GPGPU開発環境
    - CUDA: GPU 上で並列コンピューティングを行うためのプラットフォーム、NVIDIA専用
    - OpenCL: オープンだが、Deel Learning用に特化している話kではない、結果的にあまり使われていない

## モデルの軽量化
- 量子化(Quantization)
    - 通常のパラメーターの64 bit(倍精度)浮動小数点を32 bit(単精度)、16 bit(半精度)など下位の精度に落とすことで使用メモリと演算処理の削減を行う
    - 比較的よく使われている
        - 例えば倍精度から単精度に落としてもモデルの性能はそこまで下がらない
        - ただしメモリの節約にはなるが、ハードウェアとして対応していないとスピードの向上にはつながらない
    - 16 bitだと指数部に5 bitなので、$ 2^5 = 32 $桁までの表現ができる
        - 指数部は15のオフセット表現(-14〜15)
        - 表現できる正の数の範囲は$6×10^{－5}〜6×10^4$程度
        - 16 bitにしつつ、指数部と仮数部のbit数の割り当てを変えることもある
    - 32 bitでは指数部が8bit
        - 正規数として表現できる範囲は、およそ$±10^{-38}〜±10^{38}$
    - これが64 bitでは指数部が11 bit
        - 正規数として表現できる範囲は、およそ$±10^{-308}〜±10^{308}$
    
- 蒸留(Distillation)
    - 規模の大きなモデルの知識を使い、軽量なモデルの作成を行う
        - 一度精度が高い(=重い)モデルを作り、それを教師モデルとして使う
        - 教師モデルの重みを固定し生徒モデルの重みを更新していく
    
- プルーニング(Pruning)
    - モデルの精度に寄与が少ないニューロンを削減することで、モデルの軽量化、高速化を図る
        - 重みが閾値以下の場合、そのニューロンを削減し、再学習を行う
    - 軽量化されるにもかかわらず、精度は極端に下がらない


# 画像識別モデル

## 効率的な学習方法
- 転移学習: 教師あり学習において、目的とするタスクでの教師データが少ない場合に、別の目的で学習した学習済みモデルを再利用する
- 事前にImageNetのように大量のデータセットで学習したモデルを再利用し、その上で転移学習を行う
    - ImageNetは1,400万件以上の写真のデータセット
    - ImageNetで学習済みのモデルも多く公開されている
    - 事前学習では、1,000分類に分類した教示データを利用し、ResNetで学習

## ResNet(Residual Network)
- 中間層にSkip Connectionを持つ
    - 層を飛び越えた結合
        - 勾配消失や勾配爆発を回避し、深い層の積み重ねでも学習が可能に
        - 結果的に様々な形のネットワークのアンサンブル学習になっている
    - 通常の畳み込み層とSkip connectionを組み合わせたのがResidual block(残差ブロック)
- Bottleneck構造をもつ
    - 3×3の畳み込みを2回行う代わりに、1×1→3×3→1×1の3層とする
        - 計算コストは変わらないが1層増やすことができる
- WideResNet
    - ResNetにおけるフィルタ数をk倍する
        - 畳み込みチャンネル数が増加
        - GPUの特性に合った動作
        - 結果的に高速・高精度の学習が可能になる
    - その反面、ResNetと比べ、層数は浅くする
    - また、DropoutをResidual blockに導入
- [参考資料: Residual Network(ResNet)の理解とチューニングのベストプラクティス](https://deepage.net/deep_learning/2016/11/30/resnet.html)

## MobileNet
- ディープラーニングモデルの軽量化・高速化・高精度化を実現
- 畳み込み演算での工夫
    - Depthwise Separable Convolutionという手法を用いて計算量を削減している
        - 通常の畳込みが空間方向とチャネル方向の計算を同時に行うのに対し、MobileNetでは、Depthwise Convolution とPointwise Convolutionと呼ばれる演算によって個別に行う
    - 一般的な畳み込みレイヤーでの計算量: $H×W×K×K×C×M$
        - Kはカーネルサイズ(高さ、幅が同じ想定)、Mはフィルタ数($K×K×C$がM枚)
        - 入力のチャンネルは統合されるが、フィルタ数Mだけの出力マップが得られる($H×W×M$)
    - Depthwise Convolution
        - フィルタ数は1に固定
        - チャンネルごとに畳み込み(RGBをまとめて畳み込むことはしない)
        - 出力マップは入力マップのチャンネル数と同じになる($H×W×C$)
        - 計算量は$H×W×K×K×C$(Mが1なので)
    - Pointwise Convolution
        - 1×1　convとも呼ばれる
        - Depthwiseと逆で、カーネルサイズを1×1とするかわりにチャンネル分用意、さらにフィルタ数はM枚($1×1×C$がM枚)
        - フィルタ数Mだけの出力マップが得られる($H×W×M$)
        - 計算量は$H×W×C×M$(Kが1なので)

## DenseNet
- DenseBlockの中で、出力層に前の層の入力を足し合わせる
    - 特徴マップの入力に対し、Batch正規化、ReLu、3×3 Convで出力を得る
    - 上記の出力に入力特徴マップを足し合わせる
        - 入力特徴マップのチャンネル数が$l×k$だった場合、出力は$(l+1)×k$となる
            - ここでkをネットワークのgroth rateと呼ぶ(一回ごとにkチャンネル増えていくので)
- DenseBlockの後ろにTransition Layerを接続する
    - Transition Layerの中でConvolution/Pooling処理を行いチャンネル数を元に戻す
- DenseNetとResNetの違い
    - DenseBlockでは前方の各層からの出力全てが後方の層への入力として用いられる
    - これに対し、Ressidual Blockでは前1層の入力のみ後方の層へ入力

## EfficientNet
- 深さ、幅、解像度といった変数を闇雲にスケールアップするのではなく、Compound Coefficient(複合係数)に基づいて効率的にスケールアップする
    - 精度が向上すると同時に、パラメーター数が大幅に減少
    - モデルがシンプルであり、転移学習でも性能を発揮する
- 畳み込み演算の演算量FLOPSは$d, w^2, r^2$に比例する
    - 深さ(Depth, d): レイヤーの数
    - 幅(Width, w): 1レイヤーのサイズ(ニューロンの数)
    - 解像度(Resolution, r): 入力画像の大きさ
- Compound Scaling Methodでは、上記パラメーターの最適化問題として定式化


# 物体検知モデル

## 概論
- 入力は画像
- 出力はタスクによる
    - 分類(Classification): (画像に対し)単一または複数のクラスラベル
    - 物体検知(Object Detection): Bounding Box(BB)
        - 物体検知では、物体の位置(BB)とそのクラス分類、コンフィデンスレベルを出力する
    - 意味領域分割(Semantic Segmentation): (各ピクセルに対し)単一のクラスラベル 
    - 個体領域分割(Instance Segmentation): (各ピクセルに対し)単一のクラスラベル
- 学習に利用される代表的なデータセット
    - VOC12, ILSVRC17, MS COCO18, OICOD18など
    - データセットによってクラス数や画像当たりのBox数が異なる
        - MS COCO18やOICOD18は画像当たりのBox数が多く、現実的な画像に近い
- 物体検知における評価指標
    - 一般的なクラス分類の場合、閾値を変えても、Confusion Matrixに入るサンプル数は変わらないが、物体検知の場合、閾値が変わると、検出されるBBoxの数が変わる
    - 物体検出においては、クラスラベルだけでなく、物体位置の予測制度も評価したい: IoU(別名Jaccard係数)
        - $IoU = \dfrac{Area &ensp; of &ensp; Overlap}{Area &ensp; of &ensp;Union} $
            - Area of Overlapは検知した領域(Predicted bounding box)のうち正しい領域(Ground-truth bounding box)(Overlapしている領域)
            - Area of Unionは、検知した領域と正しい領域を合体させたもの
        - $IoU = \dfrac{TP}{TP + FP + FN} $
    - 物体検知ではConfidenceだけでなく、IoUにも閾値を設定する
        - さらにConfidence/IoUともに閾値を超えていても、同じものが先に(別に検出されていれば)、よりConfidence/IoUが低い方はFalse Positiveと判定される
    - Confidenceの閾値を変えると、(クラスごとに)Precision-Recall curveが描ける
        - PR曲線の下側の面積がAverage Precision
        - APが大きいのが良いモデル
        - APはクラスごとなので、クラスを通じたmean APも評価される
            - IoUの閾値も0.5から0.95まで0.05ずつ引き上げてAP&mAPを計算する$mAP_{COCO}$という指標もある
    - 検出精度に加え、検出速度も問題となる
        - 指標としてはFPS(Flames per Second)
- 物体検知の二つのフレームワーク
    - 2段階検出器: RCNNなど
        - 候補領域の検出とクラス推定を別々に行う
        - 相対的に精度が高い傾向
        - 相対的に計算量が大きく推論も遅い傾向
    - 1段階検出器: YOLOなど
        - 候補領域の検出とクラス推定を同時に行う
        - 相対的に精度が低い傾向
        - 相対的に計算量が少なく推論も早い傾向
- SSD: Single Shot Detector
    - Default boxを用意した上で、Default boxを変形し、Confidenceを出力する
    - 画像処理のベースモデルはVGG16
    - マルチスケール特徴マップを採用
        - 特徴マップを少しずつ小さくしていく
            - 一番大きいのは38×38、一番小さいのは1×1
                - 大きな特徴マップでは小さな物体を、小さな特徴マップでは大きな物体を検出する
        - 特徴マップからの出力はk × (クラス数+オフセット項)　× mn
            - kはDefault boxの数
            - オフセット項はDefault boxと本来あるべきBound boxのずれを4つのパラメーター(Δx, Δy, Δw, Δh)で示す
            - mnは特徴マップのサイズ(m×n)
    - 多数のDefault boxを用意したことによる問題への対処
        - Non-Maximum Suppression
            - 一つの物体が複数のBounding boxで検出されてしまう
                - Bounding boxのIoUを計算し、Confidenceの低いものを排除
        - Hard Negative Mining
            - 背景のクラスが多く発生し、非背景のクラスとのバランスが崩れる
                - 背景のクラスの割合を一定に制約する
    - 損失関数はConfidenceに対する損失と検出位置に対する損失の合算
- Semantic Segmentation
    - ピクセルごとにクラスラベルを出力する
    - Upsampling、すなわちConvolutionとPoolingで落ちた解像度を戻す処理が必要になる
        - Poolingは受容野を広くとるために必要(Convでも可能だが、そのためには深い階層 = 多くの計算量が必要)
        - Deconvolution/Transposed convolutionでUpsamplingを実現する
            - 特徴マップのピクセル間隔をstride分だけ空けた上で畳み込み演算を行う
                - 逆畳み込みではなく、失われた情報が復元される訳ではない
                - ただ、このままではローカルな情報(輪郭)が失われたまま
            - FCNでは、低レイヤープーリング層の出力をelement-wiseで合算することで、ローカルな情報を補完しつつUpsamplingする
            - ある意味Encoder-Decoderモデル
        - Convolutionの段階で受容野を広げる工夫としてDilated Convolutionがある
            - Convolutionの際に畳み込む対象のピクセルの間隔をあけることで、同じフィルターサイズでもより広くの領域をカバーできる
- Instance Segmentation
    - 画像のピクセルをどのクラスに属するかに分類するのに加えて、検出したそれぞれの物体を見分け、クラスIDに加えインスタンスID(それぞれの物体のID)を予測する
        - 同じクラスであっても個々の物体を区別する
    - 有名なアプローチはYOLACT
        - ワンステップ
    - もう一つ代表的なアルゴリズムがMask R-CNN

## R-CNN(Regional CNN)
- 物体検出タスクと物体認識タスクを順次に行う
    - 関心領域(RoI, Region of Interest)を切り出す
        - この際はDLを使っていない(Selective Search)
    - 関心領域のサイズを揃えた上で、CNNで特徴量を求める
    - 物体認識(クラス分類)はSVM
- 多数の物体領域に対し複雑な処理を行うため、処理が重くて遅いのが課題
- 改良版のFast R-CNNは、、関心領域ごとに畳み込み層に通すのではなく、画像ごとに一回の畳み込み操作を行うことによって、計算量を大幅に減少させている
- さらに改良版のFaster R-CNNでは関心領域の切り出しもCNNで行う
    - ほぼリアルタイムで動作し、動画認識にも応用できるように

## Faster R-CNN
- 物体候補領域の提案の処理にCNNを使用するRPN(Region Proposal Network)を提案
    - 物体候補領域の選定から物体のクラス分類までEnd-to-endでの一括処理が可能になり、ほぼリアルタイムで動作できるようになった
- 処理
    - 特徴マップへの変換はVGG16
    - 特徴マップにAnchor Pointsを想定し、PointごとにAnchor Boxesを作成する
    - 各Anchor BoxesをGround-truthのBoxesと比較し、含まれているものが背景か物体か、どれくらいズレてるか出力

## YOLO(You Only Look Once)
- Faster R-CNNでは物体候補領域の提案とクラス分類を異なるネットワークで処理するが、YOLO(V1)では、物体候補領域の提案とクラス分類を
一つのネットワークで処理
- 利点
    - 高速な処理
    - 画像全体を一度に見るため、背景を物体と間違えることがない
    - 汎化性が高い
- 欠点
    - 精度はFaster R-CNNに劣る
- 処理
    - Grid cell
        - 入力画像をS×SのGridsに分割
        - 各Gridにおいて、そのGridの真ん中を中心とするB個の Bounding Boxを生成
        - 各Gridごとに、含む物体のクラスを分類

## FCOS(Fully Convolutional One-Stage Object Detection)
- アンカーベースの手法のデメリットを回避し、アンカーベースに匹敵もしくは超える精度を出す
- アンカーボックス: Bounding boxの候補
    - しかしアンカーボックスはハイパーパラメーターの設定に敏感
        - 例えば、アンカーボックスのサイズ、アスペクト比、数
    - アンカーボックスのサイズやアスペクト比が固定されている
        - 向きや角度などによる形の変化が大き物体に対応できない
        - 小型の物体に対応できない
    - ポジティブサンプルとネガティブサンプル(検出したい物体が含まれていない領域)のバランスが崩れる
        - アンカーボックスのほとんどがネガティブサンプルのため、均衡が崩れ学習がうまくいかなくなる
- FCOSはアンカーフリーの手法
    - YOLO V1もアンカーフリーだが、画像の中央付近の点からのBounding boxのみ予測するため、精度が低くなる
    - これに対し、FCOSは全てのピクセルから四次元ベクトルを予測する
    - FPN(Feature Pyramid Networks): 複数のサイズの特徴マップを生成する
        - 低解像度の特徴は全体の特徴を捉えやすく、意味に強い
        - 高解像度の特徴は細かい部分に強いが、意味に弱い
        - 両方の良いところを両立させたのがFPN
        - FPNだと、重なったオブジェクトは異なる特徴レベルで予測されやすくなるため、ambiguous sampleを大きく減らせる

## Mask R-CNN
- Faster R-CNNを拡張したアルゴリズム
    - Mask R-CNN はインスタンスセグメンテーションに対応するので、 Faster R-CNNの物体検出機能にセグメンテーションの機能を付加したイメージ
    - バウンディングボックス内の画素単位でクラス分類を行うため、物体の形も推定可能
    - 画像全体ではなく、物体検出の結果として得られた領域についてのみセグメンテーションを行うことで効率アップ
        - 「物体らしさ」が閾値以上の領域にのみ絞り、領域毎に最も確率が高いクラスを採用
- 構造としてもFaster R-CNNと類似
    - Faster R-CNNでは畳み込みで得られた特徴マップから、バウンディングボックス(回帰の結果)と物体クラス(分類の結果)を出力する
    - Mask R-CNNでは、これに加え、物体領域マスクの推定(ピクセルの分類)を出力する
- RoI(Region of Interest)の作成の仕方の違い
    - Fast/Faster R-CNNではRoI Poolingを使用
        - 畳み込み処理後の特徴マップから、region proposal領域を固定サイズの特徴マップとして抽出
        - 高速化できる反面、高精度の推定が難しい
    - Mask R-CNNでは、RoI Poolingの代わりに、RoI Alignを導入している
        - Alignment （位置合わせ）を重視したRoI特徴の作成
        - 特徴マップをただ間引くのではなく、 補間処理(bilinear interpolationなど)によって、より多くのピクセルの情報を使うことで推定の精度を上げられた


# 自然言語処理
## Seq2seq
- 系列(Sequence)を入力として、系列を出力する
- Encoder-Decoderモデル
    - 入力系列がEncode(内部状態に変換)され、内部状態からDecode(系列に変換)する
        - 内部状態のことを隠れ状態とも表現する
    - 翻訳(言語A→言語B)、音声認識(波形→テキスト)、チャットボット(テキスト→テキスト)などに利用される
- RNNを利用し、系列情報をなめて内部状態に変換する
- 言語モデルは単語の並びに確率を与える
    - 単語の並びに対して尤度(それがどれだけ起こり得るか)、すなわち文章として自然かを確率で評価する
    - 数式的には同時確率を事後確率に分解して表せる
        - $ P(w_1, \cdots  , w_m) = \displaystyle \prod_{i=1}^m P(w_i \vert w_1, \cdots , w_{i-1}) $
        - 時刻t-1までの情報で、時刻tの事後確率を求める
            - それによって同時確率が計算できる
- Seq2seqでは、EncoderからDecoderに渡される内部状態ベクトルが鍵
    - EncoderもDecoderもそれぞれ独立したRNNだが、Decoderは内部状態(隠れ状態)の初期値として、Encoderで生成された内部状態を受け取る
    - Decoderのoutput側に正解を当てれば、教師あり学習がEnd2endで行える
- 実装上の工夫
    - Teacher Forcing
        - RNNでは、時刻tの出力を時刻t+1の入力とすることができるが、この方法でDecoderを学習させると連鎖的に誤差が大きくなっていき、学習が不安定になったり収束が遅くなったりする問題が発生する
        - この対策として、Teacher Forcingでは、訓練時にはDecoder側の入力に、教師データをそのまま使うという
        - しかし、それだけでは評価時の動きが安定しない
        - このため、Teacher Forcingの拡張として、教師データを入力とするか生成された結果を入力とするかを確率的にサンプリングするScheduled Samplingという手法がある

## Transfomer
- Encoder-Decoder × Attention
- ニューラル機械翻訳の問題点は長さに弱いということ
    - 翻訳元の文の内容を一つのベクトルで表現するため、文が長くなると表現力が足りなくなる
- これに対して、Attention(注意機構)は、翻訳先の各単語を選択する際に、翻訳元の文中の各単語の隠れ状態を利用する
    - 各単語に重みをつける
        - 重みを全て足すと1
        - 重みはFFNN(Feed Forward NN)で求める
    - Attentionは辞書オブジェクト
        - query(検索クエリ)に一致するkeyを索引し、対応するvalueを取り出す操作であると見做すことができる
    - Attention機構には二種類ある
        - Source Target Attention
            - QueryはTarget、Key, ValueはSource
            - TransformerではDecoderがEncoderから内部状態を受け取る際に使われる
        - Self Attention
            - Query, Key, Valueが全てSource由来
            - 自分の入力だけでどこに注目すべきか(重み)を決める
            - ある意味Convolutionに近い処理
            - Transformerでは、Encoderが内部状態を生成する際、またDecoderが教師データを処理する際に使われる
- TransformerはAttention機構のみを使い、RNNは使わない
    - 計算量が圧倒的に少ない
- 特徴的なモジュール
    - [Encoder] Positional Encodingで単語ベクトルに単語の位置を追加
        - 単語の位置情報をエンコード
        - (ソフトな)2進数表現
    - [Encoder] Multi-Head Attentionは複数のヘッドで行うDot Product Attention
        - Scaled dot product attention: 全単語に関するAttentionをまとめて計算する
            - $ Attention(Q, K, V) = softmax(\dfrac{QK^T}{\sqrt{d_k}})V $
            - $ \sqrt{d_k} $でスケールを調整している
        - Multi-Head Attentionでは重みパラメーターの異なる8個のヘッドを使用
            - それぞれ異なる種類の情報を収集8つのヘッドの出力をconcat
    - [Encoder] Feed Forwardで単語の位置ごとに独立処理する全結合
        - Point-Wise Feed-Forward Networks: 位置情報を保持したまま順伝播させる
    - [Decoder] Masked Multi-Head Attentionで未来の単語を見ないようにマスク
        - Decoderでは教師データを受け取るが、その際に最初から正解を見ないようにマスクした上でAttentionを得る
    - その他、各層にAdd(Residual Connection)、Norm(Layer Normalization)をかけている

## BERT
- BidirectionalでDeepなTransformer
    - 事前学習タスクとして、マスク単語予測タスク、隣接文判定タスクを与えた
    - 複数のタスクで性能を発揮できる(特定のタスクに特化していない)
- もともと自然言語処理タスクにおいては、事前処理が有効とされていた
    - 文レベルのタスク: 文同士の関係性
    - トークンレベルでのタスク: トークンレベルで良い出力が求められる
    - 事前学習の種類
        - Feature-based(特徴量ベース): 何らかの方法で文章の特徴量を抽出する
            - 古くはN-gramやここ10年ではWord2Vecなど
            - 最近ではContext sensitiveなモデルもある(ElMoが有名)
        - Fine-tuning
            - 事前学習の後に、使いたいタスクの元で教師あり学習を行う
                - つまり事前学習はパラメタの初期値として利用されるFine-tuningの中で更新される
            - BERTもこのアプローチ
    - BERTはFine-tuningアプローチの事前学習に工夫を加えた
        - 双方向Transformerだが、モデルの中に未来情報のリークを防ぐためのマスクが存在しない
        - 空欄語予測(Masked Language Prediction)と隣接語予測の2タスクを行う
            - これによって単語分散表現と文章分散表現を同時に獲得できる
    - 空欄語予測
        - 単語全体の15%をマスクして予測させる
        - 一般的には双方向にすると、間接的に自分自身を見てしまう(カンニングしてしまう)ため、発想を変え、次の単語ではなく、ランダムに抜かれた単語を予測するモデルにした(CBOWの発想)
        - ただし、全体の15%しか学習材料に使えないため学習に時間がかかる
    - 隣接文予測
        - ２つの連なる文章ペアに対して、隣接文を50%の確立でシャッフルする
        - これを入力として、隣接文であるかどうか(True/False)を出力する
- BERTはそこまで重くないので、Fine-tuningは比較的容易に行える
    - タスクにあわせてのFine-tuning学習が可能
        - タスクに合わせて、必要な蛇口をつけるイメージ
    - ハイパーパラメーターの探索も可能

## GPT
- 巨大な文章のデータセット（コーパス）を用いて 事前学習（pre-trained)を実施
    - 汎用的な特徴量を習得済みで、 転移学習（Transfer learning)に使用可能
    - 転用する際にはネットワーク（主に下流）のファインチューニングを行う
- GPTは2019年にOpenAIが開発
    - その後GPT-2、GPT-3、GPT-4が発表されている
    - パラメーター数は飛躍的に増加し、GPT-3ではパラメーター数が1,750億個となっている
        - 約45TBのコーパスで事前学習
    - GPT-4のパラメーター数は非公開だが、5,000億〜1兆個と言われている
- 基本構造はTransformer
    - 「ある単語の次に来る単語」を予測し、自動的に文章を完成できるように、教師なし学習を行う
        - 出力値は「その単語が次に来る確率」
- フェイクニュースなどの悪用リスク、学習や運用のコストの制約、機能の限界(文法は正しいが、内容に違和感や矛盾があることがある)などがある
- GPT-3の推論には、zero-shot(例示なし)、one-shot(例示一つ)、few-shots(例示複数)がある
- BERTとGPTの違い
    - BERTはTransformerのエンコーダー部分を使っている、これに対し、GPTはTransformerのデコーダー部分を使っている
    - BERTは双方向Transformerで、GPTは単一方向のTransformer
    - BERTは新しいタスクに対してファインチューニングが必要だが、GPT-3はファインチューニングをしない


# 音声処理

## 音声認識
- 音声とは空気の振動というアナログ信号であり、これをパルス符号変調(PCM: Pulse Code Modulation)という方法でデジタルデータに変換する
    - PCMの3ステップ
        1. 標本化(サンプリング): 連続的な信号を一定時間ごとに観測する離散時間信号に変換する
        1. 量子化: 観測された波の強さを予め決められた値に近似する(当分した振幅にサンプルの振幅を合わせる)
        1. 符号化: 量子化された値をビット列で表現する
        - サンプリング周波数： 1秒間で処理することができるサンプルの個数
        - サンプリングの法則(標本化定理)
            - アナログ信号をデジタル信号に正確に変換するには、元の信号の最大周波数の2倍のサンプリング周波数が必要
                - 周波数h[kHz]の離散時間信号を測るには，最低2h[kHz] のサンプリング周波数が必要
                - 16kHzのサンプリング周波数で8kHzの標本化ができる
- フーリエ変換(Fourier Transform)
    - あらゆる波形(周期的でも非周期的でも)は正弦波(sine wave)・余弦波(cosine wave)の組み合わせとして表現できる
        - 振幅h, 角周波数wの正弦波: $h\sin w $
        - 振幅h, 角周波数wの余弦波: $h\cos w $
        - 振幅が大きいと大きい音、周波数が低い(波長が大きい)と低い音
    - フーリエ変換とは、ある波形$f(t)$から振幅・角周波数を表す関数$F(w)$に変換する作業
        - フーリエ変換によって、横軸に含まれる波の角周波数、縦軸に各波の振幅で描かれるスペクトルを得ることができる
            - 周期的な波形は離散スペクトルに、非周期的な波形は連続スペクトルになる(現実は基本的に非周期的な波)
- 音声データを分析する際には、波形を特定の時間区間(窓)で区切る必要がある
    - この際に、非周期的がゆえに窓の繋ぎ目が非連続的になるのが問題
    - これを解消するために、ハミング窓などの窓関数をかける
- 離散フーリエ変換(DFT, Discrete Fourier Transform)
    - フーリエ変換に類似したものであり、信号処理などで離散化されたデジタル信号を三角関数の和に分解する変換
        - デジタル信号の周波数解析などによく使われる
- 高速フーリエ変換(FFT, Fast Fourier Transform）は、離散フーリエ変換を計算機上で高速に計算するアルゴリズム
    - 窓のサンプルのうち，偶数番目と奇数番目を別々に測定
    - 窓に含まれるサンプルN個(Nは２の冪乗： 8,16,32,…,1024,2048, …)のうちN/2個のサンプルを測定することによって高速化が実現する
- その他の技術
    - メル尺度: 人間の聴覚に基づいた尺度
        - 周波数の低い音の違いに対して敏感(分解能が高い)で、周波数の高い音に対して鈍感(分解能が低い)であるという性質がある
    - 逆フーリエ変換
        - 振幅・周波数から元の波形を構築する作業
    - ケプストラム(メル周波数ケプストラム係数、MFCC)
        - フーリエ変換したものの絶対値の対数を逆フーリエ変換して得られるもの
            - 音声認識の特徴量として利用される

## CTC(Connectionist Temporal Classification)
- 音声認識モデルの一つ
- 音声認識モデルは三つの要素が直列につながっている
    - 入力は音声特徴量、出力は認識結果
    1. 音響モデル: 音声特徴量と音素列の間の確率を計算するモデル
    1. 発音辞書: 音素列と単語との対応を扱うモデル
    1. 言語モデル: ある単語に対して、その単語が発話される確率を計算する
    - 音響モデルについては、2010年頃までは隠れマルコフモデルと混合正規分布と呼ばれるモデルの組み合わせが一般的だった
    - 深層学習技術の発展に伴い、混合正規分布がDNNに置き換えられるようになった
    - しかし、三つの要素で構成するのは実装が難しい
    - 2015年頃からは、音響モデル、発音辞書、言語モデルを1つのDNNで表現する、いわゆるEnd-to-Endモデル(E2Eモデル)の研究が進んできた
        - CTCもその一種
- CTCにおける重要な発明
    - ブランク(blank)と呼ばれるラベルの導入
        - 同一ラベルが連続するテキスト系列を表現する
        - 厳密にアライメントを決定させない
    - 前向き・後向きアルゴリズム(forward-backward algorithm)を用いたDNNの学習
        - DNNとしては、RNNやLSTMのような時系列を考慮したDNNを用いる
- CTCでの処理
    - RNNに音声系列を入力すると、フレーム数だけ出力値(確率)が最も高いラベル(音素)を出力する
    - フレーム単位のラベル系列を以下の手順で最終的なテキスト系列に変換(縮約)する
        - 連続して出現している同一ラベルを一つのラベルにまとめる
        - ブランク「-」を削除する
        - 例: [a,-,-,b,b,-,c,c]→[a,-,b,-,c]→[a,b,c]
    - 入力音声系列$\boldsymbol{x}$に対して縮約後の出力テキスト系列が$\boldsymbol{l}=[a,b,c]$となる事後確率$P(\boldsymbol{l} \vert \boldsymbol{x})$を求め、正解テキスト系列$\boldsymbol{l}^*　$における確率$P(\boldsymbol{l}^* \vert \boldsymbol{x})$が最大となるように学習を行う
    - この際に、全てのパスを計算するのは非効率的であるため、より効率的な計算方法である前向き・後ろ向きアルゴリズム(forward-backward algorithm)を用いる
- 学習されたネットワークを用いてCTCでどのように音声認識(デコーディング)が行われるか
    - 推論時には、学習時とはことなり正解ラベル系列$\boldsymbol{l}^*$は与えられていないため、仮説ごとに尤度を計算して比較を行うことになるが、これは計算量が多い
    - このため、best path decoding では、各フレームで最も出力値(確率)が高い頂点を通るパス(best path)のみに注目し、このbest pathを縮約して得られるテキスト系列を認識結果として出力する
    - より改善されたbeam search decodingという方法も存在する

## WaveNet
- 音声の生成モデル
    - 時系列データに対して畳み込み(Dilated convolution)を適用するCNNモデル
    - Dilated convolution
        - 層が深くなるにつれて、畳み込むリンクを離す(飛び飛びに畳み込む)
            - 受容野を簡単に増やすことができる

# 生成モデル

## GAN(Generative Adversarial Nets)
- Generator(生成器)とDiscriminator(識別器)を競わせて学習する生成&識別モデル
    - Generator: 乱数からデータを作成
    - Discriminator: 入力データが真データ(学習データ)であるかを識別
- Dは正しく判別したいし、GはDにご判断させたいという2プレイヤーのミニマックスゲーム
    - 一人は自分の勝利する確率を最大化する作戦を取る
    - もう一人は相手が勝利する確率を最小化する作戦を取る
- GANでは価値関数$V$に対し、Dが最大化、Gが最小化を行う
    - $ min_g max_d V(D, G) = $
        - $ \mathbb{E}_{\boldsymbol{x}〜p_d(\boldsymbol{x})}[log D(\boldsymbol{x})] + $
        - $ \mathbb{E}_{\boldsymbol{z}〜p_z(\boldsymbol{z})}[log(1- D((G(\boldsymbol{z}))] $
        - $\boldsymbol{z}$が乱数(Gへの入力)、$G(\boldsymbol{z})$は生成データ
        - $\boldsymbol{x}$が真データ(Dへの入力)
        - $p_d(\boldsymbol{x})$は正しくは$p_{data}(\boldsymbol{x})$
    - バイナリークロスエントロピーと似ている
        - $ L = -\sum y \log \hat{y} + (1-y) \log (1 - \hat{y})$
        - 真データを扱う時($y=1$)は、第一項が残り、生成データを扱う時($y=0$)は第二項が残る
- 最適化手法
    - Discriminatorの更新
        - Generatorのパラメーター$θ_g$を固定
        - 真データと生成データをm個ずつサンプル
        - $θ_d$を勾配上昇法(Gradient Ascent)で更新(Dは価値関数を最大化しようとしているので「上昇法」)
            - $ \dfrac{∂}{∂θ_d}\dfrac{1}{m}[\log[D(\boldsymbol{x})] + \log[1 - D(G(\boldsymbol(z))]] $
    - Generatorの更新
        - Discriminatorのパラメーター$θ_d$を固定
        - 生成データをm個ずつサンプル
        - $θ_g$を勾配降下法(Gradient Descent)で更新
            - $ \dfrac{∂}{∂θ_g}\dfrac{1}{m}[\log[1 - D(G(\boldsymbol(z))]] $
    - Discriminatorの更新を複数回行うごとに、Generatorの更新を1回行う(毎回ペアで行うわけではない)
    - 生成データと真データがそっくりな状況とは、$p_g = p_{data}$
        - この時に価値関数が最適化されており、$min_g V$は最小値となっている

## DCGAN(Deep Convolutional GAN)
- GANを利⽤した画像⽣成モデル
- いくつかの構造制約により⽣成品質を向上
    - Generator
        - Pooling層の代わりに転置畳み込み層(Transposed Convolution)を使用し、乱数を画像にアップサンプリング
        - 最終層はtanh(-1~1)、その他はReLU関数で活性化
    - Discriminator
        - Pooling層の代わりに畳み込み層を使用
        - Leaky ReLU関数で活性化、最終層はsigmoid(0~1)
    - 共通事項
        - 中間層に全結合層を使わない
        - バッチノーマライゼーションを適用
- 応用技術
    - Fast Bi-layer Neural Synthesis of One-Shot Realistic Head Avatars: 1枚の顔画像から動画像(Avatar)を高速に生成するモデル
        - 初期化部と推論部からなる
            - 初期化: ⼈物の特徴を抽出、1アバターにつき⼀回の計算コスト
            - 推論: 所望の動きを付ける、時間フレーム分だけの計算コスト
        - 初期化の計算コストは重いが、推論の計算コストが小さいのでリアルタイムで推論できる
            - 推論部は緻密な輪郭と粗い顔画像を別々に生成し結合することで、計算コストを下げている

## Conditional GAN(CGAN)
- GANの生成したいデータに条件をつける
    - 条件はラベルで指定(例: 「犬」という条件で犬の画像を生成する)
- 基本的なネットワークはGANと同様
    - ただし、DおよびG双方に新しい入力(条件パラメーター)が追加となる

## Pix2pix
- CGANと同様の考え方
- 条件としてラベルではなく、画像を用いる
    - 条件画像が入力され、何らかの変換を施した画像を出力する
    - つまり、画像の変換方法を学習
- 条件画像xと真の何らかの変換が施された画像yのペアが学習データとなる
- CGANと同様に、DおよびG双方に新しい入力(条件画像)が追加となる
- Pix2pixにおける工夫
    - GeneratorでU-Netを使用し、物体の位置を抽出
        - U-Netはセマンティックセグメンテーションを実現するEncoder-decoder
            - スキップ接続で物体の位置情報をDecoderに伝達
    - 損失関数にL1正則化項を追加
        - 画像の高周波部分(色の変化が顕著な部分)を学習し、Generatorが生成した画像がぼやけることを防ぐ
    - PatchGAN
        - 条件画像をパッチに分けて，各パッチにPix2pixを適応
            - 正確な高周波成分の強調による視覚的一致性の向上
            - L1正則化項の効果を向上


# 深層強化学習

## A3C(Asynchronous Advantage Actor-Critic)
- 強化学習の学習法の一つ
    - 特徴は複数のエージェントが同一の環境で非同期に学習すること
    - Asynchronous: 複数のエージェントによる非同期な並列学習
    - Advantage: 複数ステップ先を考慮して更新する手法
    - Actor: 方策によって行動を選択
    - Critic: 状態価値関数に応じて方策を修正
        - Actor-Criticとは、行動を決めるActor(行動器)を直接改善しながら、方策を評価するCritic(評価器)を同時に学習させるアプローチ
- A3Cによる非同期学習の詳細
    - 複数のエージェントが並列に自律的に、rollout(ゲームプレイ)を実行し、勾配計算を行う
    - その勾配情報をもって、好き勝手なタイミングで共有ネットワーク(パラメーターサーバー)を更新する
    - 各エージェントは定期的に自分のネットワーク(local network) の重みをglobal networkの重みと同期する
- 並列分散エージェントで学習を行うA3Cのメリット
    - 学習が高速化
    - 学習を安定化
        - 経験の自己相関が引き起こす学習の不安定化は、強化学習の長年の課題
        - A3Cはオンポリシー手法(直接方策を評価する)であり、サンプルを集めるエージェントを並列化することで自己相関を低減することに成功
- A3Cの課題
    - Python言語の特性上、非同期並行処理を行うのが面倒
    - パフォーマンスを最大化するためには、大規模なリソースを持つ環境が必要
- A3Cのロス関数
    - 一般的なActor-Criticでは、方策ネットワークと価値ネットワークを別々に定義し、別々のロス関数（方策勾配ロス/価値ロス）でネットワークを更新する
    - これに対し、A3Cはパラメーター共有型のActor Criticであり、１つの分岐型のネットワークが、方策と価値の両方を出力し、たった１つの「トータルロス関数」でネットワークを更新
    - トータルロス関数は、アドバンテージ方策勾配、価値関数ロス、方策エントロピーの組み合わせ
- A2C
    - A3Cの後に、同期処理を行うA2Cが発表された
        - 同期処理なので、Pythonでも実装しやすい
    - 性能がA3Cに劣らないことがわかったので、その後よく使われるようになった

# 様々な研究

## Metric-learning(距離学習)
- 距離学習ではデータ間の metric、すなわち「データ間の距離」を学習する
    - データ間の距離を適切に測ることができれば、距離が近いデータ同士をまとめてクラスタリングができたり、他のデータ要素から距離が遠いデータを異常と判定することで異常検知したりと様々な応用が可能となる
    - 深層距離学習(deep metric learning)は、ディープラーニング技術を利用した距離学習の手法
- CNN等で出力された特徴ベクトル(feature vector)の属する空間は埋め込み空間(embedding space)と呼ばれるが、この埋め込み空間内で類似サンプルの特徴ベクトルは近くに、非類似サンプルの特徴ベクトルは遠くに配置されるように学習を行う
- Siamese network
    - 2つのサンプルをペアで入力しそれらのサンプル間の距離を明示的に表現して調整する
        - CNNにペア画像を入力し、その出力である特徴ベクトルを得る
        - 埋め込み空間内での2つの特徴ベクトルの距離Dが「最適」となるようにネットワークのパラメータを学習する
        - ペア画像が同じクラスの場合には距離Dが小さくなるように、逆に異なるクラス
の場合には大きくなるように損失関数Lを設計し、学習を行う
    - 損失関数contrastive lossの最小化を図る
        - $ L = \dfrac{1}{2}[yD^2 + (1-y)max(m - D), 0)^2] $
        - $y$は入力サンプルのペアが同じクラスに属する場合には1, 異なるクラスの場合には0
        - $D$はユークリッド距離(L2距離)を使うことが多い
        - $y=1$の場合には第一項で近付ける方向に、$y=0$の場合には第二項で遠ざける(マージン$m$まで)方向に働く
- Siamese networkの欠点は、同じクラスのデータに対しては$D = 0$となるまで、つまり埋め込み空間中のある1点に埋め込まれるまで最適化し続けてしまう点
    - 類似度を反映した良い埋め込み空間を得ることが難しい
- Triplet network
    - Triplet networkでは3つのサンプルを一組で入力する
        - 3つのサンプルは、基準となるサンプル$x_a$(アンカーサンプル)と、その類似サンプル$x_p$、および非類似サンプル$x_n$
    - 損失関数triplet lossの最小化を図る
        - $ L = max(D_p - D_n + m, 0) $
        - $ D_p + m > D_n $の場合に損失関数が正の値を持ってペナルティーが課される構造になっている
        - これは非類似サンプルの特徴ベクトル$f(x_n)$が、類似サンプルの特徴ベクトル$f(x_p)$+マージン$m$より内側にある状態
- Triplet networkのメリット(特にSiamese networkと比較して)
    - Triplet networkは、類似サンプルについて、$D = 0$となるまでの最適化をしないので、類似度を反映した良い埋め込み空間を得ることができる
    - またTriplet networkは類似/非類似サンプルを用いるため、何が類似かがはっきりと示されている
        - この点、Siamese networkはコンテクストを考慮する必要がある
- Triplet networkの課題
    - 学習がすぐに停滞してしまう
        - 学習データセットのサイズが増えてくると考えうる入力の組み合わせが膨大になり、かつその殆どの組み合わせが学習が進むにつれてパラメータ更新に影響を及ぼさなくなるため
        - このため、学習に有効な入力セットを厳選する必要がある(triplet selection/triplet mining)
    - クラス内距離がクラス間距離より小さくなることを保証しない
        - 4つのサンプルを使うQuadrupt lossという損失関数が提案されている

## MAML(Model-Agnostic Meta-Learning, メタ学習)
- 深層学習モデルの開発に必要なデータ量を削減したい
- MAMLのコンセプト: タスクに共通する重みを学習し、新しいモデルの学習に活用
    - タスクごとの学習を行った結果を共通重みに反映させ学習
- 学習手順
    - まず共通重み$θ$をランダムに初期化
    - Inner loopでタスク集合から個別タスクを取り出し、そのタスクで最適化された重みを得る
    - これをタスクの個数分繰り返す
    - ここのタスクで得られた重みを集め、SGDで共通重み$θ$を更新する
    - これをOuter loopとして、$θ$が収束するまで繰り返す
- 効果があることは確認されているが、タスクごとの勾配計算と共通パラメータの勾配計算の2回が必要となるため、計算量が多い
    - また実用的にはInner loopのステップ数を大きくできない
    - これらについては、計算コストを削減する近似方法が提案されている

## グラフ畳み込み(GCN)
- 元の関数にフィルターをかける
    - $ y(t) = g(t) * x(t) $
    - 用途は様々だが、グラフ畳み込みにおいては特徴をはっきりさせるため
    - 2次元画像に対してフィルターをかけるのがCNN
    - グラフ(ノードとエッジの結びついたデータ構造)に対してフィルターをかけるのがGCN
        - 畳み込みで関数の特徴を際立たせている
- 畳み込みの一般的な形
    - 連続的な関数に適用
        - $ y(t) = (f*g)(t) = \int f(𝜏)g(t, 𝜏)d𝜏 $
    - 離散的な関数に適用
        - $ y(m) = (f*g)(m) = \displaystyle \sum_n f(n)g(m, n) $
        - $ g(t, 𝜏) $や$ g(m, n) $が重み
        - 元の関数に重みをかけて、強調するところと、捨象するところの区別をする
- 二つのアプローチ
    - Spatial(空間的)な場合
        - グラフにクラスタリングを繰り返す
        - ノイズが目立たなくなり、形をはっきりさせる
    - Spectral(スペクトル的)な場合
        - スペクトルに分解することで、特徴的な成分を明らかにする
        - グラフ畳み込みにフーリエ変換を応用する(グラフフーリエ変換)
        - 計算量が多いのが課題

# 深層学習の説明性
- ディープラーニング活用の難しいことの１つは 「ブラックボックス性」
    - 判断の根拠を説明できない
    - モデルの解釈性 に注目し、 「ブラックボックス性」の解消 を目指した研究が進められている

## CAM
- Global Average Pooling(GAP)は通常学習の過学習を防ぐ、正則化の役割として使われてきたが、CNNが潜在的に注目している部分を可視化できるようにする役割も持っていることがわかった
- CAMとは、出力層の重みを畳み込み特徴マップに投影することで、画像領域の重要性を識別する
- 実装としては、出力層につながっている重みのうち、どのクラスかを指定し、最後の畳み込み層の特徴マップとの内積をとる

## Grad-CAM
- CNNモデルに判断根拠を持たせ、モデルの予測根拠を可視化する手法
    - 名称の由来は ”Gradient” = 「勾配情報」
        - 最後の畳み込み層の予測クラスの出力値に対する勾配を使用
    - 勾配が大きいピクセルに重みを増やす： 予測クラスの出力に大きく影響する重要な場所
- 特徴マップと重み係数を線形結合し、ReLU関数で出力する
- CAMはモデルのアーキテクチャにGAPがないと可視化できなかったのに
対し、Grad CAM はGAPがなくても可視化できる
    - また、出力層が画像分類でなくてもよく、様々なタスクで使える

# LIME(Local Interpretable Model-agnostic Explanations)
- 特定の入力データに対する予測について、その判断根拠を解釈・可視化するツール
    - 表形式データ： 「どの変数が予測に効いたのか」
    - 画像データ： 「画像のどの部分が予測に効いたのか」
- 単純で解釈しやすいモデルを用いて、複雑なモデルを近似することで解釈を行う
    - LIMEへの入力は１つの個別の予測結果
        - モデル全体の近似は複雑すぎる
    - 対象サンプルの周辺のデータ空間からサンプリングして集めたデータセットを教師データとして、データ空間の対象範囲内でのみ有効な近似用モデルを作成
    - 近似用モデルから 予測に寄与した特徴量を選び 、解釈を行うことで、本来の難解なモデルの方を解釈したことと見なす

# SHAP
- 協力ゲーム理論の概念であるshapley value（シャープレイ値）を機械学習に応用
    - Shapey valueは、プレイヤーが協力し、それによって獲得した
報酬を分配する環境において、平均的な限界貢献度を意味する
    - 機械学習においては、モデルから出力された予測値を、貢献度が異なる特徴量にどう分配するか
        - 機械学習において、ある順序における、予測値への特徴量の貢献度を表す

# 開発・運用環境

## Docker
- コンテナ仮想化は仮想マシンに対してより軽量
    - コンテナ仮想化はアプリケーションの仮想化を実現する
- Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンプラットフォーム
    - Dockerはコンテナ仮想化を用いたOSレベルの仮想化によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする
    - その環境自体をアプリケーションと同じようにコード（イメージ）として管理可能にする
    - Dockerを開発・テスト・デプロイに用いることで「コードを書く」と「コードが製品として実行される」間の時間的ギャップを大きく短縮できる
- 以上の出所は[Wikipedia](https://ja.wikipedia.org/wiki/Docker)


## Batch Normalization(バッチ正規化)
- バッチ正規化ではバッチ単位で正規化する
    - ミニバッチに含まれる全サンプルの同一チャネルが同一分布に従う
    - しかし、バッチ正規化はミニバッチのサイズを大きく取れない場合には、効果が薄くなってしまう
        - また、ミニバッチのサイズが学習環境(演算器の性能)によって変わることもあり、何が効果なのか見えにくい
        - このため実際にはあまり活用したくない
- 代替的な手法としてLayer Normalization、Instance Normalizationがある
    - これらはミニバッチのサイズの影響を受けない
    - レイヤー正規化では、それぞれのサンプルのH×W×C全てのpixelを正規化する
        - 入力データのスケールに対してロバスト
        - 重み行列のスケールやシフトに関してロバスト
    - インスタンス正規化では、各サンプルの各チャネルごとに正規化する
        - コントラストの正規化に寄与する
        - 画像のスタイル転送やテクスチャ合成タスクなどで利用される


# 参考文献
- [ディープラーニング入門 Chainer チュートリアル](https://tutorials.chainer.org/ja/tutorial.html)
- ディープラーニングE資格エンジニア問題集
- ゼロから作るDeep Learning
- ゼロから作るDeep Learning 2 自然言語処理編
- ゼロから作るDeep Learning 4 強化学習編
- 機械学習のエッセンス -実装しながら学ぶPython,数学,アルゴリズム- (Machine Learning)