昨年合格した、JDLA E資格の復習のつぶやきをまとめました。
来月のE資格を受験される方の参考にしていただければと思います。
今日は、 #E資格 に向けて、順伝播型ネットワークの復習を実施しました。尤度関数や活性化関数の名称と数式を見直しましたが、結構忘れてる(^_^;)選択肢が+-の違いのような、結構似たような選択肢だったら絶対間違う…丸暗記じゃなく、しっかり意味から把握せねば。
— 俺人〜Oregin〜 (@Oregin2) 2019年7月7日
今日は、 #E資格 に向けて、勾配法の最適化手法を復習しました。momentumにネステロフAG,AdaGrad,AdaDelta,RMSprop,Adamと、名前を覚えるだけでも大変なのに、書籍によって数式の表現が異なっていて、なかなかに手強い。でも、コード見ながら進めると意外と入ってくる(^^)
— 俺人〜Oregin〜 (@Oregin2) 2019年7月9日
今日は、 #E資格 に向けて、バッチ正則化を復習しました。順伝播は、バッチサイズの入力を対象に、平均を求める=>分散を求める=>標準化する=>γ倍してβ平行移動。γとβが、学習するパラメータ。逆伝播時の計算グラフも書けるようにならねば。
— 俺人〜Oregin〜 (@Oregin2) 2019年7月10日
今日は、 #E資格 に向けて、逆伝播時の勾配を復習。伝播されてきた勾配に、シグモイドはy(1-y)をかける、アフィンレイヤーの重みには入力の転置を前からかける、入力には、重みの転置を後ろからかける。#JDLA
— 俺人〜Oregin〜 (@Oregin2) 2019年7月11日
今更ですが、 #E資格 に向けて、ゼロから作るDeep Learning 2 自然言語処理編 を購入!苦手とするRNNやLSTMをこれで攻略するぞ! #JDLA pic.twitter.com/9Mu20xtYZo
— 俺人〜Oregin〜 (@Oregin2) 2019年7月12日
#E資格 に向けて、逆伝播時の勾配を復習その2. 足し算の場合は、伝播されてきた勾配に1を書けるだけ。掛け算の場合は入れ替えて掛ける。(a × bの場合、aの勾配は、伝播されてきた勾配にbを掛ける。bの勾配は、伝播されてきた勾配にaを掛ける。) #JDLA
— 俺人〜Oregin〜 (@Oregin2) 2019年7月14日
#E資格 に向けて、確率変数の期待値を復習。関数f(x)の離散的な確率分布がP(x)の時、期待値E(f)=Σf(x)P(x)になる。値かける確率が期待値のイメージ。離散的な場合は足し算。ちなみに連続的な場合は、シグマのところが積分になる。 #JDLA
— 俺人〜Oregin〜 (@Oregin2) 2019年7月14日
#E資格 に向けて、確率変数の期待値を復習その2。期待値の性質。定数Cの時、期待値Eは、
— 俺人〜Oregin〜 (@Oregin2) 2019年7月15日
E(C)=C
E(X+C)=E(X)+C
E(kX)=kE(X)
E(X+Y)=E(X)+E(Y)
となる。
直感的にわかりやすい。#JDLA
#E資格 に向けて、自然言語処理を復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年7月15日
[分布仮説]
単語の意味は、周囲の単語によって形成される。という考え方。単語自体に意味はなく、”drink”であれば、”beer”や”wine”の前に出現するとか、”I”や”we”の後ろに出現するといったような表現。これによって単語をベクトル化する。#JDLA
#E資格 に向けて、自然言語処理を復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年7月15日
[コンテキスト]
ある単語の周囲にある単語。ウィンドウサイズで、何語分含めるか表現。”you say yes and I say no.”の文章で、ウィンドウサイズ2の”yes”のコンテキストは、前にyou,say後ろにand,Iの4つ。#JDLA
#E資格 に向けて、自然言語処理を復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年7月15日
[共起行列]
単語毎に、周囲にどんな単語が現れるか数えたベクトルを、全単語分つなげた行列。
"you say Yes and I say No"(2つのsayの扱いに注意)
[0,1,0,0,0,0]you
[1,0,1,0,1,1]say
[0,1,0,1,0,0]Yes
[0,0,1,0,1,0]and
[0,1,0,1,0,0]I
[0,1,0,0,0,0]No#JDLA
#E資格 に向けて、自然言語処理を復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年7月16日
[コサイン類似度]
単語のベクトル表現に良く用いられる類似度。ベクトルXとYのコサイン類似度は、以下の通り。
nx= X/numpy.sqrt(numpy.sum(X**2))
ny= Y/numpy.sqrt(numpy.sum(Y**2))
cos_similarity = https://t.co/kJCMkS6zQv(nx,ny)#JDLA
#E資格 に向けて、自然言語処理を復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年7月17日
[相互情報量]
共起行列の弱点(高頻度単語(“the”)などに強い関連性が出てしまうこと)の防止策。x,yの出現回数をC(x),C(y),共起回数をC(x,y)とし、コーパス全体の単語数をNとすると、以下で求められる。
相互情報量(x,y)=numpy.log2(C(x,y)*N/(C(x)*C(y)))
#JDLA #E資格 に向けて自然言語処理を復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年7月20日
[特異値分解]SVD
次元削減の方法の1つ。任意の行列を3つの行列の積に分解。
X=U・S・V.T
U,Vは直交行列。Sは対角行列で特異値(対応する軸の重要度)が降順に並んでいる。Sの上位に対応するUの列を残すことで、次元削減ができる。Xを単語のPMMI行列にする
#JDLA #E資格 に向けて自然言語処理を復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年7月29日
[CBOW]
コンテキスト(周りの単語)から、ターゲット(目的の単語)を推論するNNモデル。コンテキストの単語数の入力層と、1つの中間層、出力層で構成。各入力層の全結合で変換後の値を平均したものが中間層になる。出力層の値をsoftmax関数で確率に変化する
#JDLA #E資格 に向けてGoodfellow先生の深層学習の復習開始!暑さと厚さに負けるな! pic.twitter.com/HSAu7vs9fh
— 俺人〜Oregin〜 (@Oregin2) 2019年8月1日
以前投稿した、特異値分解に関連して、線形代数の法則を復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月4日
・ベクトルが直交<=>内積ゼロ
・直交行列の列ベクトルは直交し、ノルムが1
・固有値の積は行列式に等しい
これを使えば、#JDLA から出ている、#E資格 例題の特異値分解の問題も解けそう(^_^)v https://t.co/JnUvOh4h6S
#JDLA #E資格 に向けて最適化の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月6日
[モメンタム]
過去の勾配の移動平均を蓄積することで、勾配を加速させる。
v=momentum*v - lr*grad
w = w+v
momentumは、0〜1の実数。gradは勾配。
#JDLA #E資格 に向けて最適化の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月7日
[AdaGrad]
学習率が小さいと時間がかかり、大きいと発散してしまうためゴールにたどり着けない。改善策として過去の勾配のアダマール積の平方根で学習率を割ることで学習率を徐々に小さくする方式。
h=h+grad*grad
w=w-lr/(np.sqrt(h))*grad
#JDLA #E資格 に向けて最適化の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月8日
[RMSprop]
AdaGradの一度学習率が小さくなってしまうと、学習が進まなくなる弱点の改善版。移動平均を取ることで、過去の勾配の影響を減衰させる方式。
h=α*h+(1-α)*grad*grad
w=w-lr/(np.sqrt(h))*grad
αは、0〜1の実数。0.99辺りを使うことが多い。
#JDLA #E資格 に向けて最適化の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月8日
[Adam]
AdaGradとRMSpropの合体版。学習率も勾配も移動平均を取りながら減衰させていく。
m=ρ1*m+(1-ρ1)*grad
v=ρ2*v+(1-ρ2)*grad**2
m=m/(1-ρ1**iter)
v=v/(1-ρ2**iter)
w=w-lr/(np.sqrt(v))*m
ρ1,ρ2は減衰率で0〜1の値。ρ1=0.9,ρ2=0.999辺りが使われる。
#JDLA #E資格 に向けて重みの初期値の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月10日
0から離れると、収束するのに時間がかかる、0に近づきすぎると、差が少なくなり、初期値がほぼ同じになってしまう。
各層のノード数を増やしても、初期値が同じだと、全ノードの出力が同じになるので、1ノードとなってしまう。
=>初期値はバラバラがよい
#JDLA #E資格 に向けて重みの初期値の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月10日
[Xavierの初期値]
Xavier Glorotらが提案。
np.sqrt(2/(前の層のノード数+後の層のノード数))を標準偏差とする乱数を初期値に使う。
活性化関数がsigmoidやtanhのように原点を中心に点対称で、原点付近が線形に近い関数の時に効果的。
#JDLA #E資格 に向けて重みの初期値の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月11日
[Heの初期値]
Kaming Heらが提案。
np.sqrt(2/前の層のノード数)を標準偏差とする乱数を初期値に使う。
Xavierの初期値に比べて、広がりを持った初期値。
活性化関数がReLUの時に効果的。
#JDLA #E資格 に向け物体検出の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月12日
[NMS]非最大値抑制
同一物体に対して複数BB(バウンディングボックス)がある場合に一つに絞る。(1)スコアが最も高いBBに「採用」フラグ.(2)このBBに一定以上重複したBBはすべて「非採用」フラグ.(3)重複BBがなくなったらフラグがないBBの中で(1),(2)実施。
#JDLA #E資格 に向け物体検出の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月12日
[IoU] Intersection over Union
予測したバウンドボックス(BB1)と目的とするバウンドボックス(BB2)の一致度を定量化する指標。
IoU=(BB1かつBB2の領域の面積)÷(BB1またはBB2の領域の面積)
0.5を超えるとよい評価。
#JDLA #E資格 に向け物体検出の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月13日
[mAP]
クラスの一致は、平均適合率(Average Precision)を全クラスで平均したmAPで評価する。
mAP=1/N * ΣAPk
Nはクラス数。APkは、平均適合率AP1〜APN。
#JDLA #E資格 に向けてゲート付きRNNの復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月17日
[GRU]
LSTMよりシンプルでパラメータが少ない。
<リセットゲート>過去の隠れ層を弱める割合決める。
過去の隠れ層: H_pre
係数: R=sigmoid(Affine(X,H_pre))
弱めた過去の隠れ層: R*H_pre
===(続く)===
#JDLA #E資格 に向けてゲート付きRNNの復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月17日
[GRU]
==(続き)==
<更新ゲート>過去の隠れ層と仮の隠れ層の混合割合を決める.
混合割合:Z=sigmoid(Affine(X,H_pre))
仮の隠れ層:H_bar=tanh(Affin(X,R*H_pre))
<出力>
H=Z*H_pre+(1-Z)*H_bar
*は、アダマール積。
#JDLA #E資格 に向けてゲート付きRNNの復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月18日
[LSTM]
RNNで問題となる勾配消失、勾配爆発の対策として、記憶セルと3つのゲートを用いる。
<忘却ゲート>過去の記憶セルを弱める割合を決める。
忘れる割合: F=sigmoid(Affine(X,H_pre))
弱めた記憶セル:
C_pre*F
*は、アダマール積
===(続く)===
#JDLA #E資格 に向けてゲート付きRNNの復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月18日
[LSTM]
===(続き)===
<入力ゲート>記憶セルに追加する要素を弱める割合を決める。
弱める割合:
I=sigmoid(Affine(X,H_pre))
追加する要素:
G=sigmoid(Affine(X,H_pre))
弱めた追加する要素:
G*I
<更新後記憶セル>
C=C_pre*F+G*I
===(続く)===
#JDLA #E資格 に向けてゲート付きRNNの復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月18日
[LSTM]
===(続き)===
<出力ゲート>更新した記憶セルを出力に反映する割合を決める。
反映する割合:
O = sigmoid(Affine(X,H_pre))
出力:
H = O * tanh(C_pre*F+G*I)
*は、アダマール積
H_pre,C_preは、過去の隠れ層、過去の記憶セル
#JDLA #E資格 に向け物体検出の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月20日
[YOLO]you only look once
画像全体をグリッドに分割し、グリッド毎にバウンディングボックス(BB)を求める。
クラス分類とBBの回帰を同じネットワークで学習。
グリッドサイズは指定。。
グリッド内で出力できるクラスは1つ。検出できる物体の数は指定。
#JDLA #E資格 に向け物体検出の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月20日
[YOLO]===続き===
精度については、Faster R-CNNより劣るが、検出速度は高速化。
グリッド内に大量の物体がある場合は精度が低くなる。
#JDLA #E資格 に向け物体検出の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月20日
[SSD] Single Shot multibox Detector
様々な階層の出力層から様々な大きさの検出枠を出力。
出力層に近いほど大きな物体を検知、入力層に近いほど小さな物体を検知。
YOLOより高速で、Faster R-CNNと同等の精度
#JDLA #E資格 に向け一般的な確率分布の復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月23日
[ベルヌーイ分布]
2値の確率変数における分布。
P(X=1)=φ、P(X=0)=1-φ
1つの式で表すと
P(X=x)=φ**x × (1-φ)**(1-x)
期待値 E[X]=φ
分散 Var[X]=φ × (1-φ)
#JDLA #E資格受験に向けて最適化(optimizer)を自分なりに整理してブログに投稿しました。ご参考にしていただければと思います。 https://t.co/PPBL8CGmPd
— 俺人〜Oregin〜 (@Oregin2) 2019年8月23日
#JDLA #E資格 に向けてattentionの復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月24日
[GNMT]
attention,encoder,decoderで構成される機械翻訳システム。
多層LSTM、encoderで双方向LSTM1層、skip connectionの活用、複数のGPUで分散学習、量子化による推測の高速化などの工夫により、2016年より実用化https://t.co/WNm54RMGW2 @googleaiより
#JDLA #E資格 受験に向けてCNNを復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月25日
[im2col]
畳み込みの効率化。for文を行列計算に置き換える(image to column)
1)imをパディング
2)colを初期化
3)filter内の1要素に該当する画素毎に4)を繰り返す。
4)col[:,:,y,x,:,:]=img[:,:,y:y_lim:stride,x:x_lim:stride]
5)軸を入れ替えて2次元にreshape
#JDLA #E資格 受験に向けてCNNを復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月25日
[col2im]
im2colの逆(column to image)
1)colを2次元→6次元にreshapeして軸を入替
2)imを初期化(padとstride分余分にとる)
3)filter内の1要素に該当する画素毎に4)を繰り返す
4)img[:, :, y:y_lim:stride, x:x_lim:stride] = col[:, :, y, x, :, :]
5)pad分除去
#JDLA #E資格 受験に向けてCNNを復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月25日
[Comvolutionレイヤ]
im2col,col2imを利用して順伝播、逆伝播を実装する
<順伝播>
1)入力xをcolに変換
col=im2col(入力x,フィルタ縦,フィルタ横,ストライド,パディング)
2)フィルタWもcol_wにreshapeして転置
col_w=W.reshape(フィルタ数,-1).T
===続く===
#JDLA #E資格 受験に向けてCNNを復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月25日
[Comvolutionレイヤ]
=順伝播続き=
3)出力を行列積で計算
out=https://t.co/k5Q7zBcegs(col,col_w)+b
4)reshapeして軸を入れ替えてバッチ数,チャネル,縦,横にする
out=out.reshape(バッチ数,縦,横,-1).transpose(0,3,1,2)
5)x,col,col_wを残してoutを返す
=続く=
#JDLA #E資格 受験に向けてCNNを復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月25日
[Comvolutionレイヤ]
<逆伝播>
1)doutをバッチ数,チャネル,縦,横からバッチ数*縦*横,フィルタ数(=チャネル数)に変換する
dout=dout.transpose(0,2,3,1).reshape(-1,フィルタ数)
2)バイアスの勾配を0軸で加算
db=np.sum(dout,axis=0)
==続く==
#JDLA #E資格 受験に向けてCNNを復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月25日
[Comvolutionレイヤ]
=逆伝播続き=
3)フィルタWの勾配を求める※転置に注意
dW=https://t.co/k5Q7zBcegs(col.T,dout)
4)フィルタWの勾配もフィルタWの形に変換
dW=dW.transpose(1,0).reshape(フィルタ数,チャネル数,縦,横)
==続く==
#JDLA #E資格 受験に向けてCNNを復習。
— 俺人〜Oregin〜 (@Oregin2) 2019年8月25日
[Comvolutionレイヤ]
=逆伝播続き=
5)colの勾配を求める※転置に注意
dcol=https://t.co/k5Q7zBcegs (dout,col_w.T)
6)col2imで,dxに変換
dx=col2im(dcol,x.shape,フィルタ縦,フィルタ横,ストライド,パディング,逆伝播フラグ=True)
7)dxを返す
=以上=
12/20(金)よりE資格の受験申し込みが始まりましたね!講習を修了された方は、申し込みをお忘れなく。
— 俺人〜Oregin〜 (@Oregin2) 2019年12月19日
受験される方向けに、試験で頻出の固有値周りをまとめました。ご参考にしていただけると幸いです。#JDLA #E資格https://t.co/1Bd6Qk83Hm
E資格受験時に整理した最適化の進化図です。
— 俺人〜Oregin〜 (@Oregin2) 2019年12月21日
これから受験される方の参考になれば幸いです。#JDLA #E資格https://t.co/PPBL8CGmPd
E資格受験時に勉強した応用数学のうち情報理論の振り返りです。
— 俺人〜Oregin〜 (@Oregin2) 2019年12月22日
頻出の自己情報量、エントロピー、カルバック・ライブラー情報量、クロスエントロピーについて、振り返りました。#JDLA #E資格https://t.co/0Spxj1l3kk