再帰的ネットワークRNN

RNN

RNNは時系列データ処理に適したNNで、1時刻前のリカレント層の状態を、次の時刻のリカレント層へ伝播する.
特徴:勾配消失や爆発を防ぐため、勾配クリッピングを行う.閾値より大きい時、勾配のノルムを閾値に正規化するため、勾配×(閾値/勾配のノルム)と計算する.
RNNの課題:入力された情報の影響が長期的に及ぶ場合と短期にしか及ばない場合を区別できない (LSTM).<順伝播の式>

# RNNレイヤの実装
class RNN:
    # 初期化メソッドの定義
    def __init__(self, Wx, Wh, b):
        self.params = [Wx, Wh, b] # パラメータ
        self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)] # 勾配
        self.cache = None # 変数の保存用
    
    # 順伝播メソッドの定義
    def forward(self, x, h_prev):
        
        # パラメータを取得
        Wx, Wh, b = self.params
        
        # 順伝播を計算:式(5.10)
        t = np.dot(h_prev, Wh) + np.dot(x, Wx) + b # 重み付き和
        h_next = np.tanh(t) # 活性化
        
        # 逆伝播に用いる変数を保存
        self.cache = (x, h_prev, h_next)
        
        #隠れ層の状態の保存、隠れ層の出力を次時刻の入力に使用するため
        return h_next
    
    # 逆伝播メソッドの定義
    def backward(self, dh_next):
        # 変数を取得
        Wx, Wh, b = self.params # パラメータ
        x, h_prev, h_next = self.cache # データ
        
        # 勾配を計算
        dt = dh_next * (1 - h_next ** 2)
        db = np.sum(dt, axis=0)
        dWh = np.dot(h_prev.T, dt)
        dh_prev = np.dot(dt, Wh.T)
        dWx = np.dot(x.T, dt)
        dx = np.dot(dt, Wx.T)
        
        # 結果を格納
        self.grads[0][...] = dWx
        self.grads[1][...] = dWh
        self.grads[2][...] = db
        
        return dx, dh_prev

実装したクラスを確認する.

# インスタンスを作成
layer = RNN(Wx, Wh, b)

# 順伝播の計算
h1 = layer.forward(x1, h0)
print(h1.shape)

# 逆伝播の計算
dx1, dh0 = layer.backward(dh1)
print(dx1.shape)
print(dh0.shape)
for grad in layer.grads:
    print(grad.shape)
  • BPTT(BackPropagation Through Time)で時間展開した上での誤差逆伝播と同じ、一階微分である.
  • 全結合NNより、RNNは勾配消失や勾配爆発がおきやすい(系列長が長くなる).
  • 勾配消失や勾配爆発の起きやすさは、活性化関数による変わる.
  • 勾配爆発を防ぐため、ReLU関数よりも、Sigmoid関数やTanh関数が適している.→勾配消失の回避のため、勾配クリッピング

RNNでのSGDによって最適化を行う.最も単純に全時刻にわたって誤差逆伝搬を行うBPTTという手法がある.
サンプルコード

def bptt(xs, ys, W, U, V):
    hiddens, outputs = rnn_net(xs, W, U, V)
    dW = np.zeros_like(W)
    dU = np.zeros_like(U) 
    dV = np.zeros_like(V)
    do = _calculate_do(outputs, ys) #
    batch_size, n_seq = ys.shape[:2]
    for t in reversed(range(n_seq)):
          dV += np.dot(do[:,t].T, hiddens[:,t]) / batch_size
          delta_t = do[:, t].dot(V)
          for bptt_step in reversed(range(t+1)):
               dW += np.dot(delta_t.T, xs[:, bptt_step]) / batch_size
               dU += np.dot(delta_t.T, hiddens[:, bptt_step-1]) / batch_size
               delta_t = delta_t.dot(U) 
    # RNNでは中間層の出力h_tが過去の中間層出力 h_{t-1}...h_{1}に依存する.
    #   RNNにおいて損失関数をWとUに関して偏微分するとき、それを考慮する必要あり、 dh_{t} / dh_{t-1} = Uである 
    return dW,dU,dV
def rnn_net(xs, W, U, V):
    batch_size, n_seq = xs.shape[:2]
    hidden_size = W.shape[0]
    hiddens = np.zeros((batch_size, n_seq, hidden_size), dtype=xs.dtype)
    for t in xs.shape[1]:
         hiddens[:, t] = _activation(x[:, t].dot(W.T) + hiddens[:, t-1].dot(U.T)) 
    #入力xから中間層への重みW、1ステップ前の中間層出力h_{t-1}から中間層h_{t}への重みU、それを合わせた中間層出力
    outputs = _activations(hiddens.dot(V.T))
    return hiddens, outputs
def clip_grads(grads, max_norm):
     total_norm = 0
     for grad in grads: # Gradsは各パラメータの勾配をまとめたList
           total_norm += np.sum(grad ** 2) ##
     total_norm = np.sqrt(total_norm)  # 勾配のL2ノルムを取った値をまとめている変数
     rate = max_norm / (total_norm + 1e-6) 
     if rate < 1:
          for grad in grads:
               grad *= rate

RNN派生モデル<エコーステートネットワーク>
入力の重みUと隠れ層の重みVをランダム値で固定し、出力の重みのみを学習する。勾配消失が発生しにくく、学習が速くなる.<リーキーユニット>
隠れ層に線形結合を導入して移動平均の効果を得る.

双方向 RNN

文章内の文字の穴埋めタスクや過去から現在だけでなく未来から現在までの系列情報を用いることが有効である.
中間層の出力を、未来への順伝播と過去への逆伝播の両方向に伝播する.

同じ場所に同じものを合体する.一つの特徴が得られる.

def bindirectional_rnn_net(xs, W_f, U_f, W_b, U_b, V):
     xs_f = np.zeros_like(xs)
     xs_b = np.zeros_like(xs)
     for i, x in enumrate(xs):
          xs_f[i] = x
          xs_b[i] = x[ : :-1]
     hs_f = _rnn(xs_f, W_f, U_f)
     hs_b = _rnn(xs_b, W_b, U_b)
     hs = [np.concatenatie([h_f], h_b[::-1]], axis=1)] for h_f, h_b in zip(hs_f, hs_b)] ## 順方向と逆方向に伝播した時の中間層表現を合わせたものが特徴量となる
     ys = hs.dot(V.T)
     return ys

RNN Encoder-Decoder と Seq2Seq

長期依存性の課題

ゲート付きRNN

LSTM

構成要素:CEC、入力ゲート、出力ゲート、覗き穴結合

入力ゲート  i_t = \sigma (W_i X_t + U_i h_{t-1} +b_i) 
 W_i :今回の入力   X_t:今回の重み
 U_i :前回の出力   h_{t-1} :前回の重み

出力ゲート  O_t = \sigma (W_o X_t + U_o h_{t-1} +b_o)
 W_o :今回の入力   X_t:今回の重み
 U_o :前回の出力   h_{t-1} :前回の重み

忘却ゲート  f_t = \sigma (W_f X_t + U_f h_{t-1} +b_f)
 W_f :今回の入力   X_t:今回の重み
 U_f :前回の出力   h_{t-1} :前回の重み

入力と隠れ状態結合状態 
 Z_t = {\tanh} (W_g X_t + U_z h_{t-1} +b_z)

セルの値 
 C_t = f_t \circ C_{t-1} + i_t \circ z_t 今回覚えておくべき割合と判断した情報
 C_t = f_t \circ C_{t-1} + i_t \circ (W_g X_t + U_z h_{t-1}) (tanhは恒等写像に置き換え、バイアス省略)

出力値
 h_t = O_t \circ tanh(C_t)

CEC
中間層に記憶をため込む(記憶機能のみ).学習機能がない.
入力ゲート:CECの覚え方を身に付ける学習
出力ゲート:どんな感じでCECの情報を使うを学習
しかし、ずっと過去の情報が削除できないため、忘却ゲートを入れる

さらに、CEC自身の値は、ゲート制御に影響を与えないため、覗き穴結合を入れる.
  Z_t = {\tanh} (W_g X_t + U_z h_{t-1} +C^{t-1} W_c+b_g)
記憶セルの状態 C^{t-1}を結合させる.

サンプルコード

def lstm(x, h_prev, c_prev, W_in, W, b):
    n, m = h_prev.shape
    A= np.dot(x, Wx) + np.dot(h_prev,Wn) +b
    #全部の行と変数mの値分の列を指定
    f=A[ : ,     :    m]
    g=A[ : , m: 2*m]
    i=A[ : , 2*m: 3*m]
    o=A[ : , 3*m:     ]

    f = sigmoid(f) # forgetゲート
    g = np.tanh(g) # 新しい記憶ゲート
    i = sigmoid(i)  #inputゲート
    o = sigmoid(o) # outputゲート

    c = f * c_prev+ g * i #次の時刻の記憶セル
    h = o * np.tanh(c) #次の時刻の隠れ層におけるoutput

    return h, c

GRU

Gated Recurrent Unit
LSTMはゲートが3つで計算負荷が高い課題がある.
パラメータを大幅に削減し、精度はLSTMと同等.
記憶ゲートがなく、リセットゲートと更新ゲートがある.

GRU (Gated Recurrent Unit) | CVMLエキスパートガイド

リセットゲート r_t = \sigma (W_r X_t + U_r h_{t-1} +b_t)

更新ゲート  Z_t = \sigma (W_z X_t + U_z h_{t-1} +b_z)

次、仮の隠れ状態  \tilde{h_t} = {\tanh} (W_h X_t + U_h h_{t-1} r_t +b_t h_t)
出力値  h_t = Z_t \circ h_{t-1} + (1-Z_t) \circ \tilde{h_t}

前回:  Z_t \circ h_{t-1}
今回:  (1-Z_t) \circ \tilde{h_t}

サンプルコード

def gru(x, h_prev, W_in, W):
     n,m = W_in.shape
     W_in_z, W_in_r, W_in = W_in[:, :n], W_in[:, :n],W_in[:, 2*n:] 
     W_z, W_r, W = W[:, :n], W[:, n:2*n], W[:, 2*n:] 

     z = _sigmoid(np.dot(x, W_in_z) + np.dot(h_prev, W_z))  # updataゲートの出力値
     r = _sigmoid(np.dot(x, W_in_r) + np.dot(h_prev, W_r))  # resetゲートの出力値
     h_hat = np.tanh(np.dot(x, W_in) + np.dot(r*h_prev, W))  #過去の隠れ状態とリセットゲートの出力のアダマール積 r * h_prev
     h= (1-z) * h_prev + z * h_hat   #更新ゲートの出力を混合比とする過去の隠れ状態と仮の隠れ状態の混合が入る
     # or h_next = z*h_pre + (1-z) * h_hat 
     return h

長期依存性の最適化

Attention

  • Soft attention :

softmax関数で確率分布を求めてその確率分布を用いて重みつき平均を求める方法である.

  • Hard attention:

softmax関数で確率分布を求めてその確率分布に従って抽出された1点だけを得る方法である.


1.Source target attention: keyとValueがエンコーダ側の情報、Queryがデコーダ側の情報で分ける。2つの系列間の対応関係をとらえる.
2. Self attention:同じ情報源から計算するもの、同じ文章内の単語間の関係をとらえる.
3. Global attention:Attentionを使わない系列変換モデルでは長系列データ学習は難しい、エンコーダの初期に入力された情報がデコーダまで伝わりづらい
デコーダの対象時刻の隠れ層の出力」と「エンコーダの各時刻の隠れ層の出力」から重みベクトルを算出して、
その重みベクトルと掛け算して、Ctが得られる.<コード>
デコーダの隠れ状態のサイズ Nx H
h.reshape(N,1,H).repeat(T, axis=1)

アテンションの重みは N X Nとなる.
H方向に合計np.sum(t, axis=2)

参考文献
LSTM (Long Short-Term Memory) | CVMLエキスパートガイド

深層学習_画像認識_応用

AlexNet(2012年)

2012年のILSVRCの優勝モデル

GoogLeNet(2014年)

2014年のILSVRCの優勝モデル
フィルタサイズの異なる畳み込み層を並列に配置、それぞれの結果をチャンネル方向に結合して出力するInceptionを多層に積み重ねた構造を持つ.
Inception:
①フィルタの値を各画素値にかけ、すべて足し合わせたものが最終出力値となる.
②ネットワークの途中から補助的分類器と呼ばれるサブネットワークにおいても予測し、逆伝播で勾配消失を回避する.
③サイズの異なる畳み込みを並列に重ね、複数のスケールの特徴を抽出することができる.層を深くして複雑の特徴を表現できるようになる.
④Inceptionのバージョン:Inception-ResNetはResNetアーキを採用した;Inception-v3はBatch Normalizationを採用した;Inception-v2はInceptionモジュールで使用される畳み込みフィルタの大きさを変更した.

GAP(Global Average Pooling)の採用:最終の全結合層の代わりに取り入れた手法である。各チャンネルの値の平均を求めて、各チャンネルの平均値を要素とするベクトルに変換することで過学習を抑制する.全結合層ですべての画素値を使う場合より大幅に計算量を削減できる.

VGG(2014年)

2014年のILSVRCの準優勝モデル
特徴:AlexNetより深い層で、小さな 3×3フィルタ(全部3x3に統一)中心の構造にして、プーリングを行う.畳み込み層と全結合層を連結したシンプル構造である.
問題点:層が深くなったことで勾配消失問題

YOLO(2016年)

YOLOシリーズの著者とリンク集(2023/01のv8まで) - Qiita
特徴:入力画像を複数の小領域に分割し、各小領域ごとにクラス分類とbboxの位置や大きさの回帰を行う

SSD(2016年)

特徴:大きさの異なる複数の特徴マップを使って、クラス分類やbbox回帰を行う

ResNet(2016年)

ResNet

F(x)は、入出力の差分 H(x)-xを学習

WideResNet(2017年)

<特徴>

  • モデルパラメータを増加させてモデルの表現力を上げている
  • 移転学習に用いてることを考える、do_fine_tuning = False

残差ブロックについて

  • 畳み込み層の出力と残差ブロックへの入力は同じサイズと限らない
  • 残差ブロックに含まれる畳み込み層のカーネルサイズは全て3x3
  • 残差ブロックの出力は、畳み込み層側の出力と残差ブロックへの入力の差である
  • 残差ブロックに含まれる畳み込み層は2層である

R-CNN, Fast R-CNN, Faster R-CNN

R-CNN (2014年)

特徴

選択的探索(Selective Search)を使って物体が存在する候補領域を求めて、その領域を切り抜き、畳み込み層による特徴抽出を行う.
②NMS(Non Maximum Supression)を使って、IoUと呼ばれる評価指標を基準に画像を認識する.
SVMによるクラス分類と全結合層のbbox座標の回帰を行う.
CNNのインプットに合うように候補領域の画像をリサイズする.

課題

課題1:候補領域ごとに畳み込みによる特徴抽出が必要となる (→Fast R-CNNでは)
課題2:選択的探索による候補領域すべての決定にCNNの順伝播計算で検出時間がかかる (→Faster R-CNNでは)

Fast R-CNN(2015年)

2015年のILSVRCの優勝モデル、初めて人間のエラー率 5% を上回る精度を達成した.バッチ正則化を導入した.
R-CNNの課題1に対して、画像全体を複数解畳み込んで特徴マップを生成し、選んだ特徴マップから各候補領域に該当する部分を抜き出す.
物体候補領域の大きさにかかわらず固定サイズの特徴マップを抽出するROIプーリングを行う.
処理フロー:入力画像⇒CNNで特徴マップの作成+Selective Searchで候補領域の作成⇒候補領域に従って特徴マップを切り出す⇒固定サイズにプーリング⇒全結合層⇒Softmax関数でクラス分類

Faster R-CNN(2015年) paper

R-CNNの課題2に対して、領域提案ネットワーク(Region Proposal Network)というサブネットワークで候補領域を選ぶ.検出時間が短縮できた.

各スライディング・ウィンドウには、k個のアンカーボックスを設定する.
k個のアンカーボックスは、それぞれ異なるスケールとアスペクト比を持つ矩形領域である.

RPNへ入力される特徴マップの(H,W,C)の場合、HxW個のスライディング・ウィンドウごとにk個のアンカーボックスが存在するため、アンカーボックスの個数はHxWxkとなる.

RPNの訓練の時の損失関数の式:
\mathcal{L}_{RPN} (\{p_i\},\{t_i\}) = \frac{1}{N_{cls}}\mathcal{L}_{cls}(\tilde{p_i},p_i)  + \lambda \frac{1}{N_{reg}} \sum_i  \tilde{p_i}^* \mathcal{L}_{reg}(\tilde{t_i},t_i)

i: バッチ内のアンカーボックスのインデックス.
pi: 番目アンカーボックスの物体らしさ(Objectness)確率の[1: 物体, 0: 背景]の正解値.
piハット: piの予測値.
ti: 番目アンカーボックスの修正量の真の座標ベクトル
tiハット: アンカーボックスの修正量の予測の座標ベクトル
 p^*は、回帰損失にかかる係数.正例(物体)のアンカーボックスの場合のみ回帰損失を加味するため

分かりやすい説明:
Faster R-CNNにおけるRPNの世界一分かりやすい解説. 今更ですがFaster… | by Kai | LSC PSD | Medium
Faster R-CNN: 2ステージ型の物体検出CNNの元祖 | CVMLエキスパートガイド

FCN(2015年)

特徴

①全結合層の代わりに畳み込み層を使用するため、入力画像サイズが異なっていても単一のモデルで予測できる
②大きさの違う複数の特徴マップを転置畳み込み(transposed conv)で拡大し、大きさを揃えた上で各画素ごとに足し合わせることで、物体の詳細な情報を捉えることができる.

SegNet(2017年)

エンコーダとデコーダにより構成された、自己符号化器型のCNNである.

特徴

エンコーダ側の最大値プーリングで取得した値の場所を記録して、その情報をデコーダ側のアップサンプリングに利用する.
FCNはアップサンプリングである特徴マップ上の値が元々あった場所のみを利用するため、SegNetはFCNより省メモリである.

UNet(2015年)

SegNet,FCNよりも高精度である.

特徴

エンコーダ側が持つ入力の位置情報をデコーダに渡すとき、DenseNetのようにエンコーダ側の特徴マップとデコーダの特徴マップをチャンネル方向に結合する方法である.
画像変換を行う生成モデルpix2pixの生成器にも利用される.

MobileNet(2017年)

特徴

「depthwise convolution」と「pointwise convolution」の組み合わせで軽量化を実現している

  • 通常の畳み込み層のパラメータθ数 (H \times W \times C)\times M \times K^2
  • depthwise convolutionのパラメータθ数 (H \times W \times C) \times K^2
  • pointwise convolutionのパラメータθ数 (H \times W \times C) \times M


計算コストは以下のパラメータの大きさに乗算的に依存していること

  • 入力特徴マップのチャネル数  C_{in}
  • カーネルサイズ f ×f
  • 出力チャネル数  C_{out}
  • 特徴マップサイズ DF × DF

通常の畳み込み層のパラメータθ数  C_{in} C_{out} f^2
depthwise convolutionのパラメータθ数  C_{in} f^2
pointwise convolutionのパラメータθ数  C_{in} C_{out}

MobileNet モデルは、これらの各項とその乗算的関係に対応することで計算コストを削減する.
具体的には、depthwise convolutions convolutionsを用いることで、出力チャネル数とカーネルサイズが乗算されることを解消する.
E資格合格に向けて 深層学習day4 (応用モデル) - Qiita
軽量モデルに新風を巻き起こした代表格!MobileNetV1 を詳細解説! | DeepSquare

Segmanticのように広い領域を参照する必要があるタスクの場合、単にフィルタサイズを大きくすると、パラメータ数が増加する.
そのため、少ないパラメータ数で広い領域を参照できる畳み込みはDilated convolutionである.
生成モデルのように小さな画像から大きな画像を生成する場合に使う畳み込みはtransposed convolutionである.

DenseNet (2018年)

  • 特徴

①DenseBlock
DenseNetでは前にある全てのノードに対してスキップ接続を行う.
DenseNetのスキップ接続では、ResNetの入力と出力を加算するのではなく、連結するため、チャンネル数が変わる.
(一方、ResNetでは画像の要素同士を加算するため、チャンネル数は増えない)
②Transition Layer
Dense Blockの間にプーリング層を挿入して画像サイズを変更する.

FCOS(2019年) paper

Fully Convolutional One-Stage Object Detection

RetinaNet,SSD,YOLOV2,V3やFasterR-CNNでの問題点:

  • ハイパーパラメータ(サイズ、アスペクト比、数)の設定に敏感
  • アンカーボックスのサイズとアスペクト比が固定
  • ポジティブサンプルとネガティブサンプル(背景)で均衡が崩れる学習

従って、アンカーボックスフリーが必要となる
one-stage:bboxの候補領域の選定とクラス判別を一括で行う→計算コスト小

center-ness 目的は物体中心に近い位置での誤差を大きくする
ラベルと予測されたCenter-nessを、Binary Cross Entropy関数(BCELoss)で計算

損失関数では、分類計算 LclsはFocal Loss損失関数;四次元ベクトル LregはIoU Loss損失関数

ai-kenkyujo.com

JDLA_全体リスト

応用数学

応用数学 - ディープランニング E資格

行列計算

行列の特異値分解

確率・統計

①確率問題 条件付き確率
ベイズ則の概要
③期待値と分散
④様々な確率分布 ベルヌーイ分布、二項分布、ガウス分布

情報理論

情報量
自己情報量
平均情報量、エントロピー(シャノンエントロピー、自己情報量の期待値)
結合エントロピー(同時エントロピー)
相互情報量
KL-ダイバージェンス
JS-ダイバージェンス

機械学習

機械学習の基礎

機械学習_基礎と課題 - ディープランニング E資格

学習アルゴリズム

教師あり学習(線形回帰、ロジスティック回帰)
教師なし学習
教師あり学習
転移学習

機械学習課題

能力、過剰適合(過学習)、過少適合(未学習)
次元の呪い

ハイパーパラメータ
検証集合

学習データ、検証データ、テストデータ
ホールドアウト法
k-分割交差検証

最尤推定

平均二乗誤差(MSE)
条件付き対数尤度

実用的な方法論

性能指標 (損失関数)
ハイパーパラメータの選択
  • 手動でのハイパーパラメータ調整
  • グリッドサーチ
  • ランダムサーチ
  • ベイズ最適化
  • モデルに基づくハイパーパラメータの最適化

方法

強化学習

①方策勾配法
②価値反復法


深層学習

画像認識CNN_基礎 - ディープランニング E資格

順伝播型ネットワーク

深層モデルのための正則化

①パラメータノルムペナルティー
L2パラメータ正則化= Ridge正則化 L1正則化=Lasso正則化
②データ集合の拡張 
Data Augmentation Random Flip・Erase・Crop・Contrast・Brightness・Rotate, MixUp
③ノイズに対する頑健性 主力目標へのノイズ注入
マルチタスク学習
⑤早期終了
⑥スパース表現
⑦バギングやその他のアンサンブル手法
ドロップアウト

深層モデルのための最適化

①学習と純粋な最適化の差異
②基本的なアルゴリズム 確率的勾配降下法SGD)モメンタム法
③パラメータの初期化戦略
④適応的な学習率を持つアルゴリズム (パラメータ更新の方法) NAG AdaGradRMsrop AdaDelta Adam
⑤最適化戦略とメタアルゴリズ バッチ正規化 Layer正規化 Instance正規化 教師あり事前学習

畳み込みネットワーク

①畳み込み処理
②プーリング

回帰結合型ニューラルネットワーク再帰的ネットワーク

再帰的ネットワーク - ディープランニング E資格

①回帰結合型のニューラルネットワーク
②双方向 RNN
③Encoder-Decoder と Seq2Seq
④長期依存性の課題
⑤ゲート付きRNN LSTM GRU
⑥長期依存性の最適化 勾配のクリッピング
⑦Attention

生成モデル

深層学習を用いた生成モデル - ディープランニング E資格

①識別モデルと生成モデル
②オートエンコーダ(VAE 、VQ-VAE)
③GAN(DCGAN、 Conditionnal GAN)

深層学習の適用方法

機械学習_応用 - ディープランニング E資格

画像認識

画像認識CNN_Detection - ディープランニング E資格

GoogLeNet MobilNet ResNet, WideResNet DenseNetEfficientNet

画像の局在化・検知・セグメンテーショ

FasterR-CNN YOLO SSD MaskRーCNN FCOS

音声処理

WaveNet サンプリング、短時間フーリエ変換、メル尺度 CTC

様々な深層学習

グラフニューラルネットワーク

グラフ畳み込み GCN

スタイル変換

pix2pix

距離学習 Metric Learning

①2サンプルによる比較 SiameseNet
②3サンプルによる比較 TripletLoss

メタ学習(Meta Learning)

初期値の獲得 MAML

深層学習の説明性

①判断根拠の可視化 Grad-CAM
②モデルの近似 LIME, SHAP

開発・運用環境

1)ミドルウェア
2)エッジコンピューティング
モデルの軽量化
    プルーニング
蒸留
量子化
3)分散処理
  モデル並列
データ並列
4)アクセラレータ(デバイスによる高速化)
5)環境構築 コンテナ型仮想化 Docker

深層モデルのための最適化

目次

SGD

データ1つだけ をサンプルし、最急降下法にランダム性を入れる。
更新式
        {\mathbf{w}  \gets  \mathbf{w} - \eta \frac{\partial L}{\partial \mathbf{w}}}

サンプルコード

param[key] -= self.lr * grad[key]     

lr: 学習率

特徴(課題)
 SGDの非効率な探索経路による。それは勾配の方向が本来の最小値ではない方向を指しているため。(それを解決するため、Momentum)

Momentum

パラメータθの更新式
        {\mathbf{v}  \gets  \alpha \mathbf{v} - \eta \frac{\partial L}{\partial \mathbf{w}}}
        {\mathbf{w}  \gets  \mathbf{w}  + \mathbf{v}}

サンプルコード

self.v[key] = self.momentum[key] * self.v[key] - self.lr * grads[key]
param[key] += self.v[key]     

lr: 学習率

特徴
大域的な最適解。学習率の値が重要である。小さすぎると学習時間が長い、大きいと発散する。大きく学習して、どんとん小さく学習する(学習係数を徐々に下げていく)

Nesterov

パラメータθの更新式 
      v_{t+1} =  \alpha v_t - \eta \frac{\partial L}{\partial(\eta_t + \alpha v_t)}
 \theta_{t+1} = \theta_t + \alpha v_{t+1}

  • >  \Theta_{t+1} = \Theta_t + \alpha^2 v_t - (1+ \alpha)\eta\frac{\partial L}{\partial\Theta_t}


サンプルコード

self.v[key] *= self.momentum
self.v[key]-=self.lr * grads[key]
param[key] += self.momentum* self.momentum* self.v[key]
param[key] -= (1+self.momentum) * self.lr * grads[key]    

AdaGrad

更新式
       h \gets h +  (\frac {\partial L} {\partial \mathbf{w}})^{2}
        \mathbf{w}  \gets  \mathbf{w} -  \eta \frac{1}{\sqrt{h}} \frac{\partial L}{\partial \mathbf{w}}

サンプルコード

for key in params.keys():
    self.h[key]   += grads[key] * grads[key]
    params[key]  -= self.lr * (1/np.sqrt(self.h[key]+1e-7)) * grads[key]  

特徴
AdaGradの更新量が0に近づく、パラメータは更新しない
AdaGradは各パラメータの要素ごとに学習率を調整して学習する。各要素の学習率を決めるため変数hとする。勾配の絶対値の大きい要素に更新量を小さくし、勾配の絶対値の小さい要素に更新量を大きくすることで、学習率を調整する。

RMSProp

 過去のすべての勾配を均一に加算しない。過去の勾配を徐々に忘れて、新しい勾配情報を大きく反映されるように加算する(指数移動平均

更新式
        \mathbf{h}  \gets  \mathbf{h} * decay
        \mathbf{h}  \gets  \mathbf{h}  +  (1-decay) \frac{\partial L}{\partial \mathbf{w}} \frac{\partial L}{\partial \mathbf{w}}
        \mathbf{w}  \gets  \mathbf{w}  -   \eta \frac{1}{\sqrt{h}} \frac{\partial L}{\partial \mathbf{w}}

サンプルコード

self.h[key] *= self.decay_rate
self.h[key] += (1-self.decay_rate)*grads[key]*grads[key]
params[key] -= self.lr * (1/np.sqrt(self.h[key]+1e-7)) * grads[key] 

特徴

AdaDelta

ニュートン法を勾配降下法で近似することでロバストな学習率
更新式

サンプルコード

特徴

Adam

更新式
        m_{t+1} = \rho_{1} m_{t} + (1 - \rho_{1}) \frac{\partial L}{\partial \mathbf{w}}
        v_{t+1} = \rho_{2} v_{t} + (1 - \rho_{2}) \frac{\partial L}{\partial \mathbf{w}}  \frac{\partial L}{\partial \mathbf{w}}
        \mathbf{w}_{t+1} = \mathbf{w}_{t} - \eta \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon}

サンプルコード

self.m[key] = self.rho1 * self.m[key] + (1-self.rho1)* grads[key]
self.v[key] = self.rho2 * self.v[key] + (1-self.rho2)* grads[key]*grads[key]
params[key] -= self.lr * m/ (np.sqrt(v) +self.epsilon) 

特徴

勉強メモ_TROS

TROS

  1. 多重割り込みを処理するTROSの割り込みハンドラ:
    割り込み禁止状態での処理を極力減らして割り込み可能状態で動作する。
  2. TROSが行うサービスで、割り込み禁止による排他制御が必要なもの 
    ①多重割り込みのスケーティング
    ②割り込み処理
    システムコール処理
    ④タスクのスケーティング という優先順位のため、①は排他制御
  3. TROSにおけるコンテキストの使用方法
    割り込み処理を、割り込み処理ごとのコンテキストで実行させる
    各処理特有のレジスタの内容、プログラムのモードや状態処理の実行に必要な環境情報(プログラムカウンタ、ステータスレジスタ

Jetsonロボット

Jetson nano を用いてロボット作製

 

YDLiDAR G4 

  • 本体重さ: 270g
  • 最大起動電流: 550mA
  • 定格電圧電流:5V450mA
  • 検知距離: 16m 
  • 回転周波数: 5Hz~12Hz
  • レンジ周波数:4kHz~9kHz
  • 距離精度: <0.5mm(0.10~2.0m)、距離の1%以下(2.0m~16m) 
  • 角度精度:0.3度(回転周波数7Hz)

 ROS SLAM

    https://www.slideshare.net/hara-y/ros-nav-rsj-seminar