Memorandums?

This blog is written about technical-discoveries and daily-events.

「MLP深層学習」の誤植?

はじめに

お久しぶりです!
更新頻度が少なくすみません。

今回は、MLPの深層学習本を読んでいて、疑問に思った点・誤植と思われる点をまとめたいと思います。


まずは、本の紹介です。

第7刷です。
ちなみに第1刷・第2刷の誤植情報は、
http://www.kspub.co.jp/download/1529021a.pdf
に掲載されています。

[5/9]1つ誤植を追加しました。

p37(3.3)とその次の式

元の式:
{\displaystyle
\textbf{w}^{(t+1)}=\textbf{w}^{(t)}-\epsilon\Delta E_t + \mu \Delta \textbf{w}^{(t-1)}
}

Momentumは、過去の重みの修正量を今回の重みの修正量に反映させる方法です。
更新後の重みベクトルを \textbf{w}^{(t+1)}とするならば、
1つ前の重みベクトルは、 \textbf{w}^{(t)}のはずです。
ですので、
{\displaystyle
\textbf{w}^{(t+1)}=\textbf{w}^{(t)}-\epsilon\Delta E_t + \mu \Delta \textbf{w}^{(t)}
}
となると思います。
また、その次のページの式(3.3)の書き換えは、

元の式:

{\displaystyle
\Delta\textbf{w}^{(t)} = \mu \Delta \textbf{w}^{(t-1)}-\epsilon\Delta E_t
}

となっていますが、 \Delta\textbf{w}^{(t-1)}\equiv \textbf{w}^{(t-1)}-\textbf{w}^{(t-2)}
の定義にしたがって、先ほどの式を変形すれば、

{\displaystyle
\Delta\textbf{w}^{(t+1)}=\mu \Delta \textbf{w}^{(t)} - \epsilon \Delta E_t
}
となるはずです。


p42(4.1)の前の文中の式

これは小さな誤植と思われます。

文中抜粋:

{\displaystyle
バイアスb_jをそのユニットと各ユニットjとの結合の重みw_{0j}^{(l)}=b_j^{(l)}と考えることとします。
}

(l-1)層目からl層目への重み行列は、行方向にl層目のユニット、列方向に(l-1)層目のユニットが並びます。
これは、l層目への総入力は、(l-1)層目のユニットの総和で表されるためです。
そして、ここでは、バイアスも(l-1)層目の0番目のユニットの1つと考えてしまおう!としています。
よって、この式は、

{\displaystyle
w_{j0}^{(l)}=b_j^{(l)}
}
でしょう。


p51(4.15)の前の文中の式

元の式:
{\displaystyle
デルタの逆伝播計算は {\Delta}^{(L)}=\textbf{D}-\textbf{Y}とした後,...
}

デルタつまり、 \delta_j^{(l)}=\frac{\partial E_n}{\partial u_j^{(l)}}を成分に持つ行列を求めれば、
逆伝播計算が出来ます。
 \delta^{(l)}を求めるには、\delta^{(l+1)}を求める必要があり、
つまりは、 \delta^{(L)}を最初に求める必要があります。
 \delta^{(L)}は、ErrorFunc.やActivationFunc.によって異なりますが、
回帰やクラス分類において、ErrorFunc.に二乗誤差やCrossEntropy、ActivationFunc.にLogistic関数やSoftmax関数を使用する場合は、
計算式が同じになります。それが、 \delta_j^{(L)}=y_j-d_jです。
よって、デルタ(行列)は、

{\displaystyle
{\Delta}^{(L)}=\textbf{Y}-\textbf{D}
}
となると思います。


p85 特徴マップのサイズの式

元の式:
{\displaystyle
(W-2 \lfloor H/2 \rfloor) \times (W-2 \lfloor H/2 \rfloor)
}

CNNで畳込みを行ったときに、出力される特徴マップのサイズは、元画像のサイズ(画素数)とフィルタのサイズ(画素数)で決まります。
画像内にフィルタ全体が収まる範囲内でフィルタを動かしたとき、単純に考えれば、特徴マップのサイズは、

{\displaystyle
(W-(H-1)) \times (W-(H-1))
}
となる気がします。
元の式の間違いのパターンを示します。
元画像サイズW=10, フィルタサイズH=4のとき、
元の式では、 6\times 6となります。
ですが、実際には、 7\times 7です。

ただ、元の式は、「ふち」の量 \lfloor H/2 \rfloorを計算式に含めるといった意味があるともとれます。
この後にpaddingの話がありますが、この時に「ふち」の分だけ画像をサイズを大きくするという作業があるため、
+1程度は誤差とみなし、 \lfloor H/2 \rfloorの式を使おうという意図があるのかもしれません。(?)

また、paddingやstrideも考慮すると、特徴マップのサイズは、
padding量を P、stride量を Sとすると、

{\displaystyle
\lfloor \frac{W+2P-(H-1)}{S} \rfloor
}
になるのではないかと考えています。


[5/9追記] p92,p93 画素ごとの平均の式

元の式:

{\displaystyle
\tilde{x}_{ijk}=\sum^N_{n=1}x_{ijk}^{(n)}
}

これは明らかに間違っていると思うのですが...
平均なので、1/Nがいるはずです。
よって、正しい式は、

{\displaystyle
\tilde{x}_{ijk}=\frac{1}{N}\sum^N_{n=1}x_{ijk}^{(n)}
}

93ページの文中の式も同じです。
元の式:

{\displaystyle
\bar{x}_{ij}=\sum_{(p,q)\in P_{ij}}x_{i+p,j+q}
}

正しい式:

{\displaystyle
\bar{x}_{ij}=\frac{1}{H^2}\sum_{(p,q)\in P_{ij}}x_{i+p,j+q}
}


おわりに

以上が誤植?と思った箇所です!
本に誤植があると、間違いを見つけるまでにかなり時間がかかりますが、
本の間違いを見つけられるほど、内容を理解し、間違いについて調べるからこそ力がつくのかなとも思います!
ただ、間違いをカンペキに理解するほどの時間がないので困りますが...(汗)

この訂正が合っているのか間違っているのか、詳しいかた、教えていただけると嬉しいです。
ではではー

電験3種 体験記と勉強法

平成28年度の第三種電気主任技術者試験を受験し、
翌日の公式解答で自己採点した結果、おそらく合格することができました!
試験時間が余ってマークミスなども念入りにチェックはしているのでたぶん、たぶん大丈夫だと思います。

忘れないように、合格までの道のりと自分の勉強法をまとめておきます。


11/6追記
10/24ごろに合格通知が届きました!
改めて見返すと、文章がハチャメチャだったので、少し記事を修正しました。

[受験年度]
平成26年度・平成27年度・平成28年

[合格科目]
理論→電力→機械・法規

[合格した点数]
理論: 65点(正確には不明)
電力: 55点
機械: 80点
法規: 62点

[使用したテキスト]
完全マスター理論・電力・機械・法規
電験三種過去問題集(10年分)(電気書院)

完全マスターは本当に網羅されていて頼りになりました。
この過去問題集は10年分も収録されている&左側問題/右側解説でとても勉強しやすかったです。
ただ、やっぱり電験の場合は、過去問よりも圧倒的にテキストでの勉強が重要です。
その他、参考書やセミナーなどは利用していません。

[専門分野]
電子情報系(情報寄り)

[得意分野]
数学・情報・単相電気回路・物理(電磁気・基本的な力学)

[勉強時間]
時間は測ってはいません。
学生なので、3年間の春休み・夏休み期間中を利用しました。

[自身にとっての難易度]
法規 >> 機械 > 電力 >> 理論

[感想]
正直なところ、1年目・2年目は電験3種を甘く見ていたかもしれません。
というよりも、1・2年目は、初めから「すべてを理解しよう」として、「暗記」をほとんどしようとしなかったのが最大の反省点だったと思います。

ここからは年ごとに振り返っていきます。

[1年目]
1年目は「目指せ!全科目合格!」と意気込んでいました。
ところが、実際勉強を始めてみると、電力・機械・法規の内容が全くと言っていいほど、頭に入りませんでした。
理論に関しては、学校の授業(電気回路・数学・電磁気学)や趣味の電気・電子工作によって、既知の部分が非常に多く、三相交流以外は問題ありませんでした。
そのため、理論は無事合格できましたが、その他の科目は、実力通り撃沈しました。

[2年目]
2年目は「目指せ!電力・機械合格!」という目標を立てました。
勉強を始めると、
電力科目は、発電所の話がとても面白く感じ、用語などは比較的すんなり頭に入ってきました。
また、ベルヌーイの定理や出力計算なども物理が好きだったので、基礎から理解できました。
電力科目の最大の問題点は、理論でも立ちはだかった、「三相交流」でした。
これがどうにも理解できませんでした。
機械科目の中でも、情報系分野は専門分野だったため、全く勉強する必要がありませんでした。
電動機・発電機分野は、実務経験がないため感覚が非常に掴みにくく、仕組みや原理がさっぱり理解できませんでしたが、基本的な計算のみ頭に叩きこみました。
そして、2年目の試験は、電力はB問題の三相交流計算はほとんど間違ってしまいましたが、A問題の正答率の高さでカバーし、55点というヒヤヒヤする点数ではありましたが、なんとか合格できました。
機械科目は、「電動機・発電機の原理を理解していないこと」・「三相交流が苦手なこと」この2つの理由で40点程度しか取れず受かることはできませんでした。

ちなみに、1・2年目はほとんど「暗記」をしようとしなかったため、
ほぼ全てが暗記科目である法規はまったく太刀打ちできませんでした。(法規の計算もあまり対策していなかった)

[3年目]
3年目は、ここで受からなければ理論が失効してしまうことや、専門が情報系であるのでいつまでも電験に時間を取られるわけにはいかないというプレッシャーから
「絶対に機械と法規を取らなければいけない!」と考えていました。
「2年間曲がりなりにも勉強してきたことによる慣れ」と「意味が分からないこともとりあえず暗記することを決心したこと」によって、理解量が圧倒的に増えました。
機械科目は、三相交流はパターンを押さえることによって得意になっていき、誘導機の原理などもとりあえず覚えることによって、徐々に理解できるようになりました。
そして、計算問題ならほぼ間違えることはないと思えるようになりました。原理も大体は理解できました。
法規科目は、暗記が苦手だったので本当に時間がかかりましたが、なんとか頭に叩き込むうちに徐々に他の知識などと結びついて楽しくなっていき、
基本的な条文や数値だけはなんとか覚えました。
また、三相交流が理解できるようになってから法規の計算が格段に解けるようになり、試験直前には、計算問題はどんな問題が来ても絶対に解けると思えるようになっていました。
そして、3回目の試験では、機械科目は問題自体が簡単であったことや、計算が多かったことから、かなりの数の問題を自身をもって解け、結果的にも80点を取ることができました。
法規科目は、計算問題が少なく難化傾向にあった上に、覚えた条文などはほとんど出ませんでしたが、計算は100%正解し、文章問題も基礎的な理論や計算の知識から選択肢を2択程度に絞り込むことができ、62点でなんとか合格できました。
自己採点で合格が分かったときはもう...感激でした(泣)

[まとめ]
この3年間を振り返ると、初めは理論を重視しすぎるあまり、難しくて結局理解できず、あきらめてしまっている状態でした。
これを、とりあえず暗記して、あとから理解につなげる方針に変えたところ、徐々に頭の中でさまざまな理論がつながり、一気に理解の幅が増えました。

「薄くでもいいので、基礎を広く」が電験のコツ(?)かもしれません。

自分は暗記が大の苦手だったからで、暗記が得意な方は、ある程度は理解しなくても突破できるかもしれません。
ただ、やはり、実際の様々な場面で生かしたいのなら理解は欠かせないと思います。

また、当たり前ではありますが「三相交流」が最も大事です
ですが、理論として三相交流を勉強してもあまり面白くないので、機械や電力の過去問などによって、どんな感じに使うのかのイメージを掴んでいくのがいいかなと思います。
法規に関しては、「計算問題を完璧にすること」が重要です。
条文はいくらでもありますし、覚えるのはキリがなく、条文問題を本番で確実に解くというのは極めて厳しいです。そのため、計算問題で稼ぎ、あとは条文問題で点数を補填するのがベストかなと感じました。

2年目までの浅い理解のまま、たまたま合格できていても、正直、今後の役にはほとんど立たなかったと思いますし、
原理がある程度わかって楽しくなった状態で合格できたのはとてもとても大きかったです。
電験2種/1種と上はまだまだありますが、電験3種の勉強で、電気の楽しさが分かり、根気も鍛えられたので、自分にとっては本当に良かったです。
...というわけで、情報系の研究者になりたいので、電験2種以上は目指しませんが、
知識などを忘れないように、今後も定期的に電験の問題解説や電気系の原理・計算の解説をしていきたいです

MonteCarloアルゴリズムの実装

概要

モンテカルロアルゴリズムでπの近似値が出せるよ!」
とか今まで言っておきながら、実際シミュレーションしたことがありませんでした(恥)

なので、とても簡単ですが、R言語で実装してみます。
コードはGitHubに置いておきます。

github.com

シミュレーション方法

モンテカルロ法でπを近似してみます。
方法はおなじみの一辺が2の正方形の的の中に、半径1の円を書き、
乱数(Mersenne Twister)をプロットし、円の中に入った数/入らなかった数を数えるというシンプルなものです。


ApproximatePI = 4 \times \frac{IN}{IN + OUT}

で計算し、出力します。

また、初めは、エンターキーを押すたびに1ステップずつ進むようにしていましたが、面倒なので、
精度を入力し、その精度に達した時に入力受付状態(一時停止)になるようにしました。

シミュレーション結果

初期画面はこのような感じです。

f:id:meriyasu_blog:20160403061730p:plain

シミュレーション開始します。すると、、

f:id:meriyasu_blog:20160403062103p:plain

ここで、止まりました。
 3.141592 \leq ApproximatePI \leq 3.141593 精度で、1356ステップかかり、
 \pi \sim 3.141593と近似できました。

感想

思っていたより早く収束し、驚きました。
しかし、もう一桁精度をあげようとすると、全く終わりません。
有効数字7桁と8桁の壁は大きいようです。

2変数関数の極値問題

次の2変数関数の極値を考えます。

f(x,y) = {(ax+by+c)}^2 \ \ \ \ \ (a, b\neq 0)

まず、x,yそれぞれについての偏微分を計算します。

f_{x} = 2a^2 x + 2aby + 2ac \\
f_{y} = 2abx + 2b^2 y + 2bc \\

x,yどちらの偏微分も0となる(x,y)の組み合わせを探します。
これが停留点であり、極値・最小値・最大値の候補となります。
つまり、

2a^2 x + 2aby + 2ac = 0\\
2abx + 2b^2 y + 2bc = 0\\
を解きます。 a, b \neq 0 であるため、
1つ目の式をaで、2つ目の式をbで割ります。
すると、

ax + by = -c
を満たす(x,y)が解であることが分かります。
 y=k \ \ \ ({}^\forall k \in \mathbb{R})
とすれば、

\left(
\begin{array}{c}
  x \\
  y
\end{array}
\right)
=
\left(
\begin{array}{c}
  -\frac{c}{a} \\
  0
\end{array}
\right)
+
\left(
\begin{array}{c}
  -\frac{b}{a} \\
  1
\end{array}
\right)
k
となります。

Hessian: H(a,b)=0
となるため、
停留点がどのような点であるかは、近傍点を代入するなどの方法で確かめるしかありません。

先ほど求まった極値の候補を元の関数に代入してみます。すると、

f(x,y) = 0
となります。
したがって、求まった停留点は、全て関数値が0になるということです。
ここで、問題に戻ると、

f(x,y) = {(ax+by+c)}^2 = {(\cdot)}^2 \geq 0
となります。よって、先ほどの極値の候補は、全て最小値であり、0になります。

ちなみに、

{f(x,y) = \displaystyle \sum_{i=1}^{n}{(a_i x+b_i y+c_i)}^2}
の場合も、展開後に x^2, y^2, xy, x, y で括るだけなので、
停留点が最小値であるということに変わりありません。

三角関数の諸式の証明

三角関数の様々な等式を証明していきます。
(TeX表記を久しぶりに使いたかったからなんていう理由は内緒( ̄b ̄))


tan(x/2 + π/4) = tanx + 1/cosx

命題:  \tan({\frac{x}{2}+\frac{\pi}{4}}) = \tan{x}+\frac{1}{\cos{x}}

証明には、ピタゴラスの定理( (\sin{x})^2+(\cos{x})^2=1)と加法定理しか使いません。
加法定理は、

\left\{
  \begin{array}{l}
    \sin({\alpha+\beta}) = \sin{\alpha}\cos{\beta} + \cos{\alpha}\sin{\beta} \\
    \cos({\alpha+\beta}) = \cos{\alpha}\cos{\beta} - \sin{\alpha}\sin{\beta}
  \end{array} \right. \\

  \beta = \alphaのとき、\\
\left\{
  \begin{array}{l}
    \sin{2\alpha} = 2\sin{\alpha}\cos{\alpha} \\
    \cos{2\alpha} = (\cos{\alpha})^2 - (\sin{\alpha})^2
  \end{array} \right. \\
です。
 \alpha = \beta のときは、倍角の公式と呼ぶこともあります。
では、証明です。

証明


(左辺) = \frac{\sin({\frac{x}{2}+\frac{\pi}{4}})}{\cos({\frac{x}{2}+\frac{\pi}{4}})} \\ = 
  \frac{\sin{\frac{x}{2}}\cos{\frac{\pi}{4}}+\cos{\frac{x}{2}}\sin{\frac{\pi}{4}}}{\cos{\frac{x}{2}}\cos{\frac{\pi}{4}}-\sin{\frac{x}{2}}\sin{\frac{\pi}{4}}} \\ =
  \frac{\frac{1}{\sqrt{2}}(\sin{\frac{x}{2}}+\cos{\frac{x}{2}})}{\frac{1}{\sqrt{2}}(\cos{\frac{x}{2}}-\sin{\frac{x}{2}})} \\ =
  \frac{\sin{\frac{x}{2}}+\cos{\frac{x}{2}}}{\cos{\frac{x}{2}}-\sin{\frac{x}{2}}} \\ =
  \frac{(\sin{\frac{x}{2}}+\cos{\frac{x}{2}})(\cos{\frac{x}{2}}+\sin{\frac{x}{2}})}{(\cos{\frac{x}{2}}-\sin{\frac{x}{2}})(\cos{\frac{x}{2}}+\sin{\frac{x}{2}})} \\ =
  \frac{(\sin{\frac{x}{2}})^2+(\cos{\frac{x}{2}})^2+2\sin{\frac{x}{2}}\cos{\frac{x}{2}}}{(\cos{\frac{x}{2}})^2-(\sin{\frac{x}{2}})^2} \\ =
  \frac{1+\sin(\frac{x}{2}+\frac{x}{2})}{\cos(\frac{x}{2}+\frac{x}{2})} \\ =
  \tan{x} + \frac{1}{\cos{x}} = (右辺)

まず、加法定理で展開し、有理化を行い、加法定理の逆やピタゴラスの定理を使うことによって、求めています。
このほかにも図形的解法や二乗して計算する方法もあります。
ただ二乗する方法は符号の問題が絡むので多少ややこしいかもしれません。

ノートを作るべきか作るべきでないか

記事の修正は度々していましたが、投稿は久しぶりになります。

いろいろな本を読んでいると、ノートを作るべきか作らないべきか迷うときがあります。
そんなときにどう判断しているかについて考えたことを書いてみます。

まず、ノートを作るか作らないかは、読む本・読む目的の2つの条件で決まります。
場合分けして考えてみます。
前提として、ノートは後で読むのに役に立つために書くものとします。(問題を解くだけのノートとは別)

Read more

Conway's game of life Software!!

ライフゲームとは

まだ一日も経っていないですが、ソフトウェアを更新しました(9/21)

ライフゲームソフトウェアを製作しました!!!
ライフゲーム(Conway's game of life)とは...

ライフゲームとは2次元のセルオートマトンである。
n✕mのマスがあり、
白色状態を死、黒色状態を生とするならば、
生コマの周りに生コマが2〜3コマあるならば、そのコマは生き続ける。
死コマの周りに生コマが3コマあるならば、そのコマは復活する。
その他の条件のとき、そのコマは、死亡する。
つまり、程度な人数が周りにいれば、生まれ、
多すぎてもダメ、少なすぎても寂しくて死んでしまうというものである。

このようなルールに基づき、シミュレーションを行うのが、ライフゲームである。

このように、通常は、死→生(Born)が3、生→生(Survives)が2,3となっています。
これをB3/S23と表記します。
この標準ルールを含む様々なルールでシミュレーションを行います。
実装言語はRです。

Read more