ディープラーニングG検定の勉強中 その25(全微分と合成関数)

ディープラーニングG検定まで1ヶ月を切りました。
いよいよ試験に向けてということで、問題集に取り組んでみて、とりあえずは1周しました。
公式テキストの読了から日が経っていたことから、正答率は6~7割程度でした。
このままだと合格は厳しいので、間違っていたところを復習して、10月中には正答率が9割以上になるように頑張ります。

それとJDLAの推薦図書も読んでいます。
手始めに「人工知能は人間を超えるか  ディープラーニングの先にあるもの」を読了しました。
ディープラーニングの歴史と概要と未来について分かりやすく書かれてました。これを要約したものが公式テキストという感じです。
あとは、AI白書(2019)も暇があるときに読んでいます。かなりボリュームのある本なので、こちらは読めるところまで読む、というところでしょうか。


という感じで、今回も
書籍「最短コースでわかるディープラーニングの数学」の内容に沿って勉強してみました。

今回は、全微分と合成関数について見ていきます。

参考サイト
アタリマエ!(行列のかけ算のやり方まとめ。例題から分かる行列の積の考え方)


図1のようなパーセプトロンに、

図1
4-4-1.png

入出力層の他に中間層(隠れ層)がある場合は、関数を微分した結果を使ってさらに微分して出力することになります。これは合成関数の考え方と同じです。

合成関数の微分は、式1となりますが、

式1
4-4-2.png

この式と、多変数関数の全微分

式2 全微分の公式
4-4-3.png

を組み合わせて図1のパーセプトロンについて、ノード x1についての出力結果を出します。


図1の入力層のノードは、x1, x2, x3で、その仮出力先が u1とu2、最終的な出力層が L なので、これを式3で表します。

式3
4-4-4.png

入力層のノード x と重み w の内積は式4なので、

式4
4-4-6.png

これを計算することで、中間層全体の値が算出されます。

式5
4-4-7.png

式6
4-4-8.png

これを中間層のノードごとに書き換えると、式7になります。

式7 青い部分はx1 以外の変数なので偏微分のときに「定数」とみなします。
4-4-9.png


次に、各中間層のノードから、出力層の内積を算出する場合ですが、パーセプトロンでは入力層とその重みで算出した結果(今回はx1の偏微分)を使うので(つまりは合成関数)、式8の計算となります。

式8
4-4-10.png

これで計算が終わりましたので、各算出内容を全微分の合成関数の公式である式9に当てはめます。

式9
4-4-5.png

上記の各算出結果を微分して当てはめると、式10となるので、

式10
4-4-11.png

これを計算して式11となります。

式11 ノード x1 の 出力結果
4-4-12.png

なお、式9を多変数関数の一般式にすると式12となります。

式12
4-4-13.png


次に、中間層のノードが1つの場合について、見ていきます。

図2
4-4-14.png

中間層の変数が1つ(1次元)の場合はこれをスカラーと言います。
このスカラーでの合成関数は式13となります。

式13
4-4-15.png

これをノード x1 について算出する式は式14となります。

式14
4-4-16.png

具体的に計算してみると、式15、16となり、

式15
4-4-17.png

式16
4-4-18.png

この算出結果を式17のように当てはめると、

式17
4-4-19.png

式18の出力結果となります。

式18
4-4-20.png

式18を多変数関数に一般化したものが式19となります。

式19
4-4-21.png


今回は理解するのに時間がかかりました。でも、実際に計算してみると、なぜそうなるのかが分かったので良かったです。
ベクトル・行列の積についても再度確認できたのも良かったです。

忙しい人のための幻想郷シリーズを振り返る

東方Projectには膨大な2次創作があります。ジャンルも音楽、漫画やイラスト、ゲーム、コスプレ等いろんなものがありますが、ニコニコ動画で動画作品として2次創作を発表したものも多数あります。

今回リンクを張っていく「忙しい人のための幻想郷」動画シリーズは、本体は2次創作のゲームなのですが、半分はゲームの宣伝、もう半分はファンアートとして多くの東方ファンを楽しませてくれました。

特に過去作品の面白さは今見てもなかなかなものなので、以下張っていきます。



































という感じで、久しぶりに各話を閲覧して楽しい気分になりました。今年もこの動画のうぷ主さんはアップを続けてますので、他の動画も観てみるとよいかと思います☆

ドラゴンズクラウンPROをプレイ中 その2

皆さんこんにちは。eの人@シュレーディンガーのレゾンデートルです。

PS4でサイドビューのRPGアクションゲームをプレイしています。


ドラゴンズクラウンPROのタイトル画面
20191006-1.jpg

本格的にプレイし始めたことで、だんだんとプレイが進んできました。

物理攻撃が効かない幽霊とか、

いったいどうしたらいいんだ(棒)
20191006-3.jpg

出てきて、パーティに魔法使いが必要になってきたりします。

古城には、敵に連れ去られた村娘などもおり、

ん? 今何でもするって言ったよね?
20191006-5.jpg

キャンディーズかな?(もっと今風の喩えをだな…)
20191006-6.jpg

彼女らを死なせないようにして脱出しなければならない場合もあります。

場所によっては、人魚に会ったりして、

友好的なマーメイドと遭遇。[戦わずに立ち去る] [戦う]
20191006-8.jpg

ストーリーに広がりが見えています。

あと、ダンジョンでは、冒険者の亡骸を見つけることもあるのですが、寺院に預けることができる亡骸には限りがあるため、復活させてあげられない冒険者は埋葬することになります。

ウィズっぽい
20191006-7.jpg

という感じで、あたらしいダンジョンに挑みつつ、

20191006-9.jpg

プレイを続けていきます。










最近聴いた曲

サムネで選んだ。少女病を思い出した。


いい感じ


このアーティストの曲は名曲が多い






HI! VEVO Vol.171

Ellie Goulding, Diplo, Swae Lee - Close To Me (Official Video)


頻出するclo--------se to me! って部分のメロディがいい感じ。







クラシック曲を忘れない Vol.71

交響組曲 シェヘラザード


リムスキー=コルサコフ作曲。千夜一夜物語を題材とした組曲です。
第1楽章:海とシンドバッドの船(第290-315夜)
第2楽章:カランダール王子の物語(第9-18夜)
第3楽章:若い王子と王女(第998-1001夜)
第4楽章:バグダッドの祭り。海。船は青銅の騎士のある岩で難破。終曲(第290-315夜)
無慈悲な王と美しく聡明なシェヘラザードのテーマの掛け合いが特徴的。








ニコニコ動画のリンク

フランスのゲームってことで、かなり変わった雰囲気のゲームだった




高画質。平和主義プレイでないのもいい




実際の霊夢と咲夜ってこんな感じなのかも



アズレンのアニメを早く観たい!(今はまだdアニメストアのみ)

ディープラーニングG検定の勉強中 その24(全微分)

書籍「最短コースでわかるディープラーニングの数学」の内容に沿って勉強しています。

今回は、全微分を見ていきます。


参考サイト
理系大学生の数学駆け込み寺(全微分の定義と公式【基礎から丁寧に学ぼう!】)

前回は、2変数関数から

式1
4-2-1.png

各変数における偏微分を算出しました。

式2
4-3-1.png

この各偏微分は、それぞれ u 方向、v 方向の傾きを表しています。

このことから、u 方向の傾きと、v 方向の傾きを足すことで、2変数関数の接する面(接平面)の傾きを算出することができます。
この平面の接点の傾きを全微分と言います。

全微分の公式は式3となります。

式3
4-3-2.png

式1を偏微分したあとに全微分すると、式4となります。

式4
4-3-3.png


ちなみに、1変数関数の連続した滑らかな曲線にある接線は、

図1
4-3-7.png

接点の場所を拡大し続けたものと同じになるように、
2変数関数の連続した滑らかな曲面にある接平面は、

図2
4-3-8.png

接点を拡大し続けたものと同じになります。


なお、全微分の公式である式3を一般的な式に直すと式5になります。

式5
4-3-9.png

さらに、全微分は3変数以上の多変数関数でも可能で、式6のときの、

式6
4-3-10.png

多変数関数の全微分の総和∑は、式7となります。

式7
4-3-11.png


それでは、式8の2変数関数を全微分したときの、点(p, q)が接点のグラフをPythonで作成してみます。
p = 1、q = 1 とします。

式8
4-3-4.png

式9 偏微分と全微分の結果
4-3-5.png


参考サイト
Jenga 妄想の大気開放(オライリーの『ゼロから作るDeep Learning』、第4章の偏微分、式4.6 f(x0,x1)=x0^2+x1^2 に接平面を追記する)

--------------------
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)

#計算範囲
u = np.arange(-5.0, 6.00, 0.5)
v = np.arange(-5.0, 6.00, 0.5)

u, v = np.meshgrid(u, v)
Z = -(u ** 2) -(v ** 2) # 2変数関数


#与えられたデータから点を打つ
p=[1] # 点p
q=[1] # 点q
dL=[2] # 全微分の解 (p^2+q^2=2)

#接点の描画 (赤い点)
ax.scatter3D(p, q, dL, color="red",marker="o", s=100)

#接平面の描画
ud = np.arange(-3.55, 6.50, 0.7)
vd = np.arange(-3.55, 6.50, 0.7)
ud, vd = np.meshgrid(ud, vd)
PD = -(2*ud) -(2*vd) + 6 # 接平面の方程式 (z-f(p,q)=fu(p,q)(u-p)+fv(p,q)(v-q))
ax.plot_wireframe(ud, vd, PD, color = "orange")

# 軸ラベルの設定
ax.set_xlabel("u-axis")
ax.set_ylabel("v-axis")
ax.set_zlabel("Z-axis")

# 表示範囲の設定
ax.set_xlim(-7, 10)
ax.set_ylim(-8, 5)
ax.set_zlim(-40, 10)

#角度(上下、回転)
ax.view_init(40, -30)

#2変数関数の描画
ax.plot_wireframe(u, v, Z, color = "blue")

plt.show()

--------------------
出力結果
4-3-8.png


多変数関数と接平面の両方の3Dグラフを出す方法を載せたサイトはあまりないので、今回の参考サイトは特に重宝しました。

ディープラーニングG検定の勉強中 その23(偏微分)

書籍「最短コースでわかるディープラーニングの数学」の内容に沿って勉強しています。

今回は、偏微分を見ていきます。


参考サイト
Sci-pursuit(偏微分の意味とやり方)

多変数関数の変数のうち、1つの変数の変化だけを追うようにして、他の変数は定数とみなす方法が偏微分です。

偏微分の計算は、微分の公式

式1
4-2-2.png

を使って行います。

それでは、式2の2変数関数について、

式2
4-2-1.png

それぞれ u と v の偏微分をしてみます。
ここでの( )は、定数として扱う部分、という意味で使っています。

式3 変数 u に対する偏微分
4-2-3.png

式3では微分の対象ではない v を定数とみなすことができるものの、どんなときでも消去できるわけではないことに注意する必要があります。微分の公式に則って、ピンク色の部分のように微分することになります。

式4 変数 v に対する偏微分
4-2-4.png


偏微分は、3種類以上の変数の関数に対しても行うことができます。

ここでは3種類のそれぞれの変数に対する微分を見ていきます。

式5 3変数関数
4-2-5.png

式6 変数 u に対する偏微分
4-2-6.png

式7 変数 v に対する偏微分
4-2-7.png

式8 変数 w に対する偏微分
4-2-8.png


この3変数関数に対する偏微分をPythonでも確認してみます。

参考サイト
SYSTEM GUARDIAN(Python 偏微分で大満足カレーを作る Matplotlib)

--------------------
import sympy as sym
sym.init_printing()
from IPython.display import display

(u,v,w) = sym.symbols("u,v,w")

targetFunc = (2 * u**3) + (7 * v**2) + (5 * w**4) - (3 * u * v) + (2 * v * w**2) + u + (4 * v) + 5

def PartialDiff(PD):
 du = sym.diff(PD, u)    # uで偏微分
 dv = sym.diff(PD, v)    # vで偏微分
 dw = sym.diff(PD, w)   # wで偏微分
 return du, dv, dw

def main():
 du, dv, dw = PartialDiff(targetFunc)
 print("3変数関数:")
 display(targetFunc)
 print("uで偏微分:")
 display(du)
 print("vで偏微分:")
 display(dv)
 print("wで偏微分:")
 display(dw)

if __name__ == '__main__':
 main()

--------------------
出力結果
4-2-9.png


偏微分は思ったほど難しくなくてよかったです。
でも、次の全微分はややこしそうw