「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
について思う事。
について
について
ビビらなくて良い。
【応用数学】 ◆線形代数 ◇特異値分解 【機械学習】 ◆機械学習の基礎 ◇教師あり学習アルゴリズム ◇教師なし学習アルゴリズム ◇確率的勾配降下法 【深層学習】 ◆順伝播型ネットワーク ◇アーキテクチャの設計 ◇誤差逆伝搬法およびその他の微分アルゴリズム ※以下のみ ・全結合 MLP での誤差逆伝搬法 ◆深層モデルのための最適化 ◇基本的なアルゴリズム ※以下のみ ・ネステロフのモメンタム ◆畳み込みネットワーク ◇構造出力 ◇データの種類 ◇効率的な畳み込みアルゴリズム ◆回帰結合型ニューラルネットワークと再帰的ネットワーク ◇回帰結合型のニューラルネットワーク ※以下のみ ・教師強制と出力回帰のあるネットワーク ・有向グラフィカルモデルとしての回帰結合型のネットワーク ・RNNを使った文脈で条件付けされた系列モデリング ◇深層回帰結合型のネットワーク ◇再帰型ニューラルネットワーク ◇複数時間スケールのための Leaky ユニットとその他の手法 ※以下のみ ・時間方向にスキップ接続を追加 ・接続の削除 ◆深層学習の適応方法 ◇画像認識 ・VGG
※ 個人的には、以下の理由で数学的項目は今後も減って行くと思う。
シラバスにはない。
線形代数からの唯一の項も削除されたので線形代数の出題はナシ。
機械学習の最適化とは「経験損失最小化」で純粋な最適化とは異なる。
cross_entropyの実装にパターンあるけどコレ同じなの?
return -np.sum(tk * np.log(yk + 1e-7))
return - np.sum(t * np.log(y + 1e-8)) / y.shape[0]
return np.mean(-y*np.log(p)-(1-y)*np.log(1-p))
適切なバッチサイズを選ぶことが、学習を上手く行うために必要になる。
※loss(損失)とacc(正解率)の進捗を確認する。
def im2col(input_data, filter_h, filter_w, stride=1, pad=0): """ Parameters ---------- input_data : (データ数, チャンネル, 高さ, 幅)の4次元配列からなる入力データ filter_h : フィルターの高さ filter_w : フィルターの幅 stride : ストライド pad : パディング Returns ------- col : 2次元配列 """ N, C, H, W = input_data.shape # 何気に割り算は[//]なんだな。 out_h = (H + 2*pad - filter_h)//stride + 1 out_w = (W + 2*pad - filter_w)//stride + 1 # 画像をパティングして取り出す、 # 第1引数には元データ、第2引数には前・後の文字詰め量、第2引数のconstantは0埋め # ちなみに、第2引数はinput_dataの[高さ, 幅]の(上or前, 下or後)の部分以外を0指定。 img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant') # 2次元配列の意味だろうか? col = np.zeros((N, C, filter_h, filter_w, out_h, out_w)) # フィルターに対応する入力データの要素を抽出 for y in range(filter_h): # 最大値はOHを使って逆算 y_max = y + stride*out_h for x in range(filter_w): # 最大値はOWを使って逆算 x_max = x + stride*out_w # N, CH, H, F # ↓ # N, CH, FH, FW, OH, OW # a:b:c の指定はa~b-1までcステップずつと言う実装で、 # フィルターの[y, x要素]に対応する入力データの要素を抽出 # 各フィルタが適用される要素、1回目は左上...右上...左下...n回目は右下で、 # 1回のステップで取得される要素数は特徴マップのサイズと等しくなる。 col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride] # 絵的にイメージ困難だが並びを替えて # N, CH, FH, FW, OH, OW # ↓ # N, OH, OW, CH, FH, FW # 行数を指定して、行列に展開すれば意図した出力になる。 col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1) return col
...
# Wは (フィルタ数, チャンネル, 高さ, 幅)の4次元配列からなるデータ # フィルタ毎、「チャンネル, 高さ, 幅」の行ベクトルに展開後に列ベクトルに転置する。 col_W = self.W.reshape(FN, -1).T
...
スマホ用CNNで、ボトルネックの畳み込みの分割で計算量を減らす。
log ab = log a + log b
log 1/a = log a^-1 = - log a
┌a b┐ A =└c d┘ ┌ d -b ┐ A^-1 = 1/(ab-cd)└ -c a ┘
┌a b c┐ A = │d e f│ └g h i┘ ┌a b c┐ ┌a b c | 1 0 0┐ ┌1 0 0 | r s t┐ │d e f│→│d e f | 0 1 0│→│0 1 0 | u v w│ └g h i┘ └g h i | 0 0 1┘ └0 0 1 | x y z┘ ┌r s t┐ A^-1 = │u v w│ └x y z┘
細工されたサイコロの出る目の確率分布表 | ||||||
確率変数 X | 1 | 2 | 3 | 4 | 5 | 6 |
確率 P | 0.5 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 |
確率変数 Y(X1=X2) | 1 | |||||
確率 P | 0.5*(0.5)=0.25 | 0.1*(0.1)=0.01 | ||||
確率変数 Y(X1≠X2) | 0 | |||||
確率 P | 0.5*(1-0.5)=0.25 | 0.1*(1-0.1)=0.09 |
log(1 / 0.1) = -log0.1
= - (0.5 * log0.5) - (0.1 * log0.1)*5 = -0.5 * log0.5 - 0.1 * (log0.1)*5
= - {(0.25 * log 0.25)*2 + (0.01 * log 0.01)*5 + (0.09 * log 0.09)*5}
= H(X1) - H(X1|Y)
= H(X1) - H(X1|Y)
f(x) = 1/(1+e^-x)
f'(x) = f(x)(1-f(x))
= 1/n Σ|tk-yk|^2 k
= 1/n Σ(tk-yk)^2 k
= 1/n Σ(log(yk+1)-log(tk+1))^2 k
= -Σ tk log yk k
p(A|B) = p(B|A)p(A) / p(B)
p(x) = Σ p(x|Ck)p(Ck) p(Ck|x) = p(x|Ck)p(Ck) / p(x)
p(Ck|x)
SVMとかDNNとか?
𝒇(𝒙) = 𝒔𝒊𝒈𝒏(𝒘𝒙 + 𝒃)
∥w∥1=(|w1|^1+|w2|^1+...+|wd|^1)^(1/1) = |w1|+|w2|+...+|wd| =Σ|wi|
∥w∥2=(|w1|^2+|w2|^2+...+|wd|^2)^(1/2) = √(w1^2+w2^2+...+wd^2) = √(Σwi^2)
ゼロ除算防止
@、dot、matmul (違いは?)
演算子は「*」になる(RNN)。
k = 4 #クラスタ数 n = 200 # データ数 data = np.random.randn(n, 2) # 200行2列 # 初期値のcentroidをdataの中からランダムに4 index選択。 centroids = data[np.random.choice(np.arange(n), size=(k,))]
for 1 in range(10): indexes = np.zeros(data.shape[0]) # dataの行数と同じ配列 for centroid in centroids: for i, x in enumerate(data): # 最も近いセントロイドのindex番号をindexesに入れる。 indexes[i] = np.argmin(np.sum((x - centroids) ** 2, axis=1))
# セントロイドを再計算した重心に更新する。 for i in range(k): centroids[i] = data[indexes==i].mean(axis=0)
for i in range(k): # probabilitiesの確率にしたがってセントロイドとなる点をdataから選ぶ。 centroids[i] = data[np.random.choice(np.arange(n), p=probabilities, size=(1))] # data centroidsの距離の二乗をとる。 distances[:, i] = np.sum((data centroids[i]) ** 2, axis=1) # probabilitiesを0から1の値に正規化する。 probabilities = np.sum(distances, axis=1) / np.sum(distances)
def forward(self, x): self.x = x return np.dot(x, self.params["w"]) + self.params["b"]
def backward(self, dout): self.grads["w"] = np.dot(self.x.T, dout) self.grads["b"] = np.sum(dout, axis=0) return np.dot(dout, self.params["w"].T)
def forward(self, x): self.mask = (x <= 0) out = x.copy() out[self.mask] = 0 return out
def backward(self, dout): dout[self.mask] = 0 dx = dout return dx
λ⋅sign(W)
λ⋅W
for key in params.keys(): self.h[key] += grads [key] * grads [key] params[key] -= self.lr * grads[key] * (1/np.sqrt(self.h [key] + 1e-7))
for key in params.keys(): self.v[key] = self.momentum * self.v[key] - self.lr * grads[key] params[key] += self.v[key]
for key in params.keys(): self.h[key] *= self.decay_rate self.h[key] += (1 - self.decay_rate) * (grads [key] ** 2) params [key] -= self.lr * grads [key] / (np.sqrt(self.h[key]) + 1e-7)
金額が易いプログラムはそれなり。
(ゼロから作るDeep Learning)
徹底攻略ディープラーニングE資格エンジニア問題集 第2版 - インプレスブックス
https://book.impress.co.jp/books/1120101184
(E資格対策)
深層学習ではないんだけど深層学習系の生成モデルばっかなのでココ