<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>きのこる庭 &#187; 雑記</title>
	<atom:link href="http://kinokoru.jp/archives/category/%e9%9b%91%e8%a8%98/feed" rel="self" type="application/rss+xml" />
	<link>http://kinokoru.jp</link>
	<description></description>
	<lastBuildDate>Wed, 09 Jan 2019 03:18:33 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.2</generator>
		<item>
		<title>AI・IoT等新技術等をめぐる法規制を緩和する「規制のサンドボックス制度」についてまとめてみた</title>
		<link>http://kinokoru.jp/archives/1571</link>
		<comments>http://kinokoru.jp/archives/1571#comments</comments>
		<pubDate>Wed, 09 Jan 2019 02:51:25 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1571</guid>
		<description><![CDATA[<p>ちょうど昨日、こんな記事が公開された。 インフルエンザのオンライン受診勧奨サービスを実証へ、MICIN &#8211; 日経デジタルヘルス 医療方面というととにかくあらゆる方面で規制が多く革新的な技術や新たな仕組みの導入 [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1571">AI・IoT等新技術等をめぐる法規制を緩和する「規制のサンドボックス制度」についてまとめてみた</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>ちょうど昨日、こんな記事が公開された。</p>
<p><a href="https://tech.nikkeibp.co.jp/dm/atcl/news/16/010711848/?ST=health&#038;fbclid=IwAR3RH38uNkTXyHPkXfLFOsNuT7nzC7vNX64j6ncIb2tS5bFFkoZCsSt_v7E" target="_blank">インフルエンザのオンライン受診勧奨サービスを実証へ、MICIN &#8211; 日経デジタルヘルス</a></p>
<p>医療方面というととにかくあらゆる方面で規制が多く革新的な技術や新たな仕組みの導入がスピーディに進みづらい分野の一つであるという認識だったので、MICIN社が医療分野の第一号として規制周りでのこうした特例措置を受けたというのが個人的に印象的だった。<br />
記事によるとこの特例措置の背景にあるのが「サンドボックス制度」になるわけだけど、一体このサンドボックス制度とは何なのか。ネット上を調べてみてもあまり情報が無いので詳しく調べてみることにした。</p>
<h2>規制のサンドボックス制度(新技術等実証制度)とは</h2>
<p>2018年6月6日にスキームが公表され、窓口が設置された模様。公式の資料*1にて制度の概要が書かれていたのでこちらを抜粋すると、<br />
<br />
<b>AI、IoT、ブロックチェーン等の革新的な技術の実用化の可能性を検証し、実証により得られたデータを用いて規制制度の見直しに繋げる制度</b><br />
<br />
とのことだった。もうすこし簡単に言うと、<br />
<b>「AIとかIoTとかそういう技術周りで色々既存の規制があるけど、あなたの事業に対して必要に応じて規制を一部緩和するからどの部分の規制を緩和してほしいのか教えてね」という感じの制度</b><br />
<br />こうした規制緩和制度は他国でも事例があるようで、イギリスやシンガポールでも採用されている模様*2。<br />
制度誕生の背景を想像するのは比較的想像に難くない。昨今世界的にやれAIだIoTだブロックチェーンだシェアリングエコノミーだと言われているものの、<br />
日本の場合他国に比べて既存の法制度等が障壁となって国内で新技術を実証しづらい現状にあるように思われる。<br />
医療方面で言うと中国では2018年11月に既に薬剤まで処方する無人診療の診療所が出現していたり*3、世界的に広く利用されているUberのようなライドシェアサービス方面で言うと日本はいまひとつ歩みが遅い。<br />
そうした中でのサンドボックス制度の登場は現代の急速な世界の変化に対応するための必然だったも言えそうな気がする。<br />
<span id="more-1571"></span></p>
<h2>仕組み</h2>
<p><a href="http://kinokoru.jp/wp-content/uploads/2019/01/sandbox_structure.png"><img src="http://kinokoru.jp/wp-content/uploads/2019/01/sandbox_structure.png" alt="sandbox_structure" width="723" height="315" class="aligncenter size-full wp-image-1573" /></a></p>
<p>図にするとこんな感じ。<br />
事業者が「一元的な窓口」に対して相談・申請を行う。申請を行う際には「事業概要は？」「どの法令のどの部分の特例措置を受けるのか？」「法令規定されている代替措置は？」「実証期間は？」といった内容がまとめられた資料を提出する *4。<br />
ここでいう「一元的な窓口」というのは<a href="http://www.kantei.go.jp/jp/singi/keizaisaisei/regulatorysandbox.html#testing" target="_blank">新技術等社会実装推進チーム</a>にあたる模様。</p>
<p>
資料が提出された後は提出後1ヵ月以内に「革新的事業活動評価委員会」を通して話し合いが行われ、話し合いから1ヶ月以内に主務大臣が承認是非の判断を下す模様。<br />
なお、革新的事業活動評価委員会の構成人員に関しては公式の資料*4を参考にすると、さまざまな意見・学識・経験を持つ人が公平・均衡となるように構成されている模様。<br />
具体的にどういう人員で構成されているかは<a href="http://www.kantei.go.jp/jp/singi/keizaisaisei/committee/dai2/siryou2.pdf" target="_blank">公式の名簿</a>を参照するとよさげ。</p>
<p>その他特筆すべき事項としては、<br />
・規制が緩和されてもなお他の規制がひっかかって実証実験が進みにくい場合に緩和措置の追加申請が可能。<br />
・また、事業者は主務大臣に対して定期的な報告を行い、実証実験中に問題が発生した場合は速やかに主務大臣に報告を行う 等のレポート体制が敷かれている模様 等。</p>
<h2>MICIN社は実際にどの部分の緩和を受けたのか？</h2>
<p><a href="http://www.kantei.go.jp/jp/singi/keizaisaisei/project/gaiyou2.pdf" target="_blank">診断キットとビデオ通話を組み合わせたインフルエンザ罹患時のオンライン受診勧奨（計画の概要）- 首相官邸ホームページ</a></p>
<p>上記リンクにて実際の申請内容を確認することができる(P2 &#8211; P3)。ポイントとしては医師法第二十条と第三十七条一項の模様。<br />
(自分は法律周りに関しては素人のため、誤った情報を発信しないよう当ブログでは内容が記載されている部分のみを記載し、個人での解説は控える)</p>
<h2>おわりに</h2>
<p>個人的には 日本がDeepLearning方面等含め、最先端の技術で遅れを取る中でこうした制度が整備されたのはとても良いことなのではないかなと思うし、今後この制度が産業の各方面にてうまく機能していくことを願う。<br />
なお、もし当記事の内容が筆者が独自に情報をかき集めてまとめたものになるため、もし内容や解釈に誤りがある場合お手数ですが<a href="https://twitter.com/irration" target="_blank">@irration</a>宛にご連絡いただけましたら幸いです(加筆修正させていただきます)。</p>
<h2>参考資料</h2>
<p>*1 <a href="http://www.kantei.go.jp/jp/singi/keizaisaisei/committee/dai1/siryou3.pdf" target="_blank">規制のサンドボックス制度及び革新的事業活動評価委員会の概要 &#8211; 首相官邸ホームページ</a><br />
*2 <a href="https://mainichi.jp/articles/20170720/ddm/002/070/203000c" target="_blank">「規制のサンドボックス」って？ &#8211; 毎日新聞</a><br />
*3 <a href="https://36kr.com/p/5161412.html?fbclid=IwAR1MoQWG4m6sYsp0uc0zayErYLBQB6mg79CTBI0FBbDGHVyurIY8iqSNZzg" target="_blank">平安好医生“无人诊所”亮相乌镇 ，打造一小时医疗服务圈</a><br />
*4 <a href="https://www.kantei.go.jp/jp/singi/keizaisaisei/pdf/underlyinglaw/basicpolicy.pdf" target="_blank">新技術等実証の総合的かつ効果的な推進を図るための基本的な方針 &#8211; 首相官邸ホームページ</a></p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1571">AI・IoT等新技術等をめぐる法規制を緩和する「規制のサンドボックス制度」についてまとめてみた</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1571/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TensorFlowでモデル構築して学習させる際のイメージ</title>
		<link>http://kinokoru.jp/archives/1507</link>
		<comments>http://kinokoru.jp/archives/1507#comments</comments>
		<pubDate>Tue, 26 Sep 2017 22:16:04 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[ツール系]]></category>
		<category><![CDATA[雑記]]></category>
		<category><![CDATA[DeepLearning]]></category>
		<category><![CDATA[TensorFlow]]></category>
		<category><![CDATA[ニューラルネットワーク]]></category>
		<category><![CDATA[機械学習]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1507</guid>
		<description><![CDATA[<p>　なんとなく機械学習周りのツールをいじってみて、いざ学習モデルを組んでみようとTensorFlowのコードを見てみた所、なにやら奇妙で膨大な処理がつらつらと書き連ねられていて圧倒された…なんて経験をされた方も少なくないと [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1507">TensorFlowでモデル構築して学習させる際のイメージ</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>　なんとなく機械学習周りのツールをいじってみて、いざ学習モデルを組んでみようとTensorFlowのコードを見てみた所、なにやら奇妙で膨大な処理がつらつらと書き連ねられていて圧倒された…なんて経験をされた方も少なくないと思われます。確かにTensorFlowのコードは一見すると複雑怪奇ですが、プログラムの背景に存在している以下の4つの概念を抑えてしまえば 膨大なコードもうまく紐解いてゆくことが可能です。</p>
<div style="backgdound: #EEE; padding: 10px; border: 1px solid #CCC; font-size: 12px;">
・モデル<br />
・モデルを用いた計算<br />
・学習<br />
・データセット
</div>
<p>　この記事ではTensorFlowによる学習のコードを見て どこでどういう処理が行われているのかなんとなくイメージできる事を目標として、簡単なモデルの例からTensorFlowにおける学習の導入まで段階的に議論を進めていきます。<br />
<span id="more-1507"></span></p>
<h2>モデル</h2>
<p>　TensorFlowでモデル構築…といえばよくある多層パーセプトロンがパッと頭に思い浮かびそうですが、TensorFlowで構築できるモデルは何もニューラルネットに限ったものではありません。例えば以下のコードを見てみましょう。</p>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf-8 -*-
import tensorflow as tf

x = tf.placeholder(dtype=tf.float32)
y = tf.placeholder(dtype=tf.float32)
addition = tf.add(x, y)
</pre>
<p>　このコードを図で表すと以下のようなグラフ構造になります。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/09/neural_network_3.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/09/neural_network_3.jpg" alt="neural_network_3" width="553" height="320" class="aligncenter size-large wp-image-1510" /></a></p>
<p>　この addition は「二つの数を足し算する」という単純なものですが、これも立派なモデルと言えます。ここで重要な事として、<strong>このモデル自体は「学習」や「実行」の意味合いを持ちません</strong>。実際の所、具体的にどのような2つの数を足し算するかも定められていませんし、ただ「二つの数を足し算する」という事を表しているだけです。このことに注目すると、TensorFlow関連の書籍でモデル構築をする際によく出てくる以下のようなコード(以下は単純な多層パーセプトロンの例)がどういうものか、何となく分かってきますね。</p>
<pre class="brush: python; title: ; notranslate">
x1 = tf.placeholder(dtype=tf.float32) # 入力層
w1 = tf.Variable(dtype=tf.float32)
b1 = tf.Variable(dtype=tf.float32)
h = tf.nn.relu(tf.add(tf.matmul(x1, w1), b1)) # 隠れ層

w2 = tf.Variable(dtype=tf.float32)
b2 = tf.Variable(dtype=tf.float32)
y = tf.nn.softmax(tf.add(tf.matmul(h, w2), b2)) # 出力層
</pre>
<p>　隠れ層の部分を見てみましょう。これを言葉にすると「x1とw1を掛け合わせたものにb1を足し算したものを ReLUという関数で変換する」というグラフ構造です。これをhとして、今度は出力層を見てみましょう。出力層では、「hとw2を掛け合わせたものにb2を足し算したものを softmaxという関数で変換する」というグラフ構造になります。この y をモデルとして採用したものがいわゆる多層パーセプトロンです。</p>
<p>　このように、様々な計算を処理するための雛形となるものがモデルです。以下は様々なモデルのイメージです。このようにTensorFlowではグラフ構造に基づく柔軟なモデル構築が可能です。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/09/neural_network_11.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/09/neural_network_11.jpg" alt="neural_network_1" width="599" height="425" class="aligncenter size-full wp-image-1517" /></a></p>
<h2>モデルを用いた計算</h2>
<p>　一旦先ほど定義した単純なモデルである addition の例に戻りましょう。モデルを構築した所で、今度は実際に何かしらの入力を加えて実際にモデルを使ってみます。以下の例では additionモデルを使って5+3の結果を出力しています。</p>
<pre class="brush: python; title: ; notranslate">
sess = tf.Session()
output = sess.run(addition, feed_dict = {
  x: 5.,
  y: 3.
})
print(output) # 結果は8.0
</pre>
<p>　sess.run() にて 実際に計算に使用するモデルを定義し、その際に入力値を与えています。この時点でも、上記計算に「学習」という意味合いは存在しておらず、ただ単純にモデルとデータを元に計算を実行しただけであることに注意してください。</p>
<h2>学習</h2>
<p>　ただ計算を実行するだけだと味気ないので、今度は学習を行ってみましょう。先ほどadditionモデルを「二つの数の和を計算するモデル」として定義しましたが、今回はこのモデルにちょっと変更を加えて「入力xと変数yを足し算する」というようにしてみましょう。</p>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf-8 -*-
import tensorflow as tf

x = tf.placeholder(dtype=tf.float32)
y = tf.Variable(tf.constant(1.))
addition = tf.add(x, y)
</pre>
<p>　最初のadditionモデルと異なる点として、最初のadditionモデルでは モデルを用いて計算する際にxとyの両方を入力していましたが、新しいadditionモデルで入力するのは xだけである点です。yには初期値として1が代入されているので、このadditionモデルは最初の段階で「x + 1.0」を計算するものとなります。x = 5.0 なら additionの出力は6.0、という具合です。</p>
<p>　さて、ここで この新しいadditionモデルを用いて、どんな実数値xを入れても「x + y = 8.0」となるようなモデルを得たいとしましょう。しかし、このモデルにおけるyはそのままだと初期値 1.0 のままなので、x = 7.0の時以外では理想の結果が得られません。理想の結果を得るためには yの値がうまいこと増減しないといけません(例えばx=12なら、12.0 + y = 8.0 を得るために yの値は初期値である1.0よりも小さい方向にずらす必要がある…等といった具合です)。</p>
<p>　この時点で初めて「<strong>学習</strong>」という概念を導入します。…とすると、additionはここで初めて「学習前のモデル」という形で認識できます。では y の学習はどのようにして行われるのでしょうか？</p>
<p>　ここで「<strong>損失</strong>」という概念を導入してみましょう。学習中のモデルによって予測値を計算した際、当然本当の値との誤差があります。この誤差が大きければ大きいほど損失も大きく、小さければ小さいほど損失も小さいと考えます。値が正解から離れれば離れる程損失が大きくなっていく…という仕組みを定量化するために機械学習ではよく二乗誤差を用います。というわけで慣例に従って以下のように損失関数を定義します。</p>
<pre class="brush: python; title: ; notranslate">
loss = tf.square(tf.subtract(addition, 8))
</pre>
<p>　学習の目的はこの損失を限りなく少なくしていくことです。ここで損失が限りなく少なくなるということは、予測値が実際の値に限りなく近づいていくことと考えて下さい( ただし、適切でない損失関数の設定が行われた場合等はこの限りではありません )。</p>
<p>　損失を算出する方法はlossによってうまく定義できたものの、「lossによって算出された損失をもとに yの値を修正する」という仕組みが無ければ学習が行えません。幸い、TensorFlowでは予めデフォルトでこの機能を提供してくれます。それが以下のコードにて示す <strong>GradientDescentOptimizer</strong> という機構です。</p>
<pre class="brush: python; title: ; notranslate">
optimizer = tf.train.GradientDescentOptimizer(0.2)
train_step = optimizer.minimize( loss )
</pre>
<p>　GradientDescentOptimizerの引数にある 0.2 というのは<strong>学習率</strong>のことで、イメージとしては損失関数からの情報を一回の学習でどれだけ参考にして取り入れるかを示すものです( 学習率が高すぎると予測値が振動・発散してしまうリスクが高くなるし、低すぎるといつまでも予測値が正解に近づかないため、状況に応じて適切な学習率の設定が必要です。ただこの辺りの議論に関しては本題の範疇を超えてしまうためここまでにしておきます )。</p>
<p>　ここで、前述の「モデル」の項にて説明した通り、この時点でのtrain_stepはグラフ構造として定義されているだけで、まだ実際の入力値を与えられてもいないし、学習自体も行われていないことを思い出して下さい。実際に計算をする場合は以下のようにします。</p>
<pre class="brush: python; title: ; notranslate">
sess = tf.Session()
sess.run( tf.global_variables_initializer() ) # 変数の初期化

output = sess.run(train_step, feed_dict = { x: 5.  }) # モデルの学習を行う
y_val = sess.run(y, feed_dict = {x: 5. }) # 学習済のモデルを使って y の値を計算
print(&quot;y = %f&quot; % ( y_val )) # y = 1.800000
</pre>
<p>　x = 5.0 の場合、 y = 3.0 が正解となりますが、train_stepにより一回学習を回してみた所、yは初期値の 1.0 から 1.8 となり、確かに正解に近づいていることが分かります。<br />
　ところで、基本的に学習は複数回数行うものなので、前の例では単純化のためtrain_stepを一回だけ実行するような形にしていましたが、以下のコードのような形に修正して 30回程train_stepによるイテレーションを回してみることにします。この時、yの値はどのように遷移するか見てみましょう。</p>
<pre class="brush: python; title: ; notranslate">
sess = tf.Session()
sess.run( tf.global_variables_initializer() ) # 変数の初期化

for i in range(30):
  output = sess.run(train_step, feed_dict = { x: 5.  })
  y_val = sess.run(y, feed_dict = {x: 5. })
  addition_val = sess.run(addition, feed_dict = {x: 5. })
  print(&quot;5.0 + %f = %f&quot; % ( y_val, addition_val ))
</pre>
<p>　このコードを実行した結果は以下のようになります。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/09/Screen-Shot-2017-09-27-at-01.45.59.png"><img src="http://kinokoru.jp/wp-content/uploads/2017/09/Screen-Shot-2017-09-27-at-01.45.59.png" alt="Screen Shot 2017-09-27 at 01.45.59" width="189" height="424" class="aligncenter size-full wp-image-1522" /></a></p>
<p>　学習を重ねるにつれて確かにyの値が 3.0 に近づいていることが確認できます。では今度は入力値を変えてみて、 x=11 とした場合どうなるでしょう。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/09/Screen-Shot-2017-09-27-at-01.52.37.png"><img src="http://kinokoru.jp/wp-content/uploads/2017/09/Screen-Shot-2017-09-27-at-01.52.37.png" alt="Screen Shot 2017-09-27 at 01.52.37" width="200" height="423" class="aligncenter size-full wp-image-1527" /></a></p>
<p>　x=11にしても、ごく僅かな誤差はあるもののほぼ正解に近い値になっています。これがTensorFlowによる学習です。</p>
<h2>データセット</h2>
<p>　今回の学習モデルでは簡単のため 入力値・正解をただ一つだけ設けましたが、実際にTensorFlowで学習を行う際には 一般的にまとまった複数の入力値・正解のセットをモデルに与えて学習させていきます。<br />
　実際のデータセットを扱う上で重要な観点の一つが、一つのデータセットを「<strong>学習用データ</strong>」「<strong>テスト用データ</strong>」の二つのデータ群に分離することです。これは、学習させたモデルで実際でどれくらいの精度が出るのかを確かめるためのデータが必要となるからです。<br />
　一つのデータセットを学習用データ群・テスト用データ群に分ける上で手動でプログラムを構築する必要はなく、scikit-learnがこれに相当する機能を提供してくれているので、こうしたものを使用するのが懸命です。</p>
<pre class="brush: python; title: ; notranslate">
from sklearn.cross_validation import train_test_split

:
x_train, x_test, y_train, y_test = train_test_split(dataset_x, dataset_y, test_size=0.2, random_state=42)
:
</pre>
<p>ここで、dataset_x, dataset_y はそれぞれ 入力データ群、入力データに対する正解の群を表しています。</p>
<h2>まとめ</h2>
<p>　というわけで、一つの塊として見ると膨大で複雑なTensorFlowのコードですが、一つ一つ丁寧に要素を分解して見ていくと意外とそこまで複雑ではありません。ここで説明した概念は単純な多層パーセプトロンに止まらず再帰ニューラルネット等様々なモデルにも適用可能な基礎となるものなので、ぜひ抑えておきたい所です。</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1507">TensorFlowでモデル構築して学習させる際のイメージ</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1507/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kerasで多層パーセプトロンのモデル構築する際のイメージ(数式無し)</title>
		<link>http://kinokoru.jp/archives/1470</link>
		<comments>http://kinokoru.jp/archives/1470#comments</comments>
		<pubDate>Thu, 27 Jul 2017 11:10:53 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[ツール系]]></category>
		<category><![CDATA[雑記]]></category>
		<category><![CDATA[Keras]]></category>
		<category><![CDATA[ニューラルネットワーク]]></category>
		<category><![CDATA[機械学習]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1470</guid>
		<description><![CDATA[<p>最近Kerasに関して勉強をする機会があったためまとめました。 Kerasで多層パーセプトロンを構築されている方は 幾何的な理解の助けにご利用下さい。 ( どちらかというと学習メモ用に走り書きしただけなので 難解な部分, [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1470">Kerasで多層パーセプトロンのモデル構築する際のイメージ(数式無し)</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>最近Kerasに関して勉強をする機会があったためまとめました。<br />
Kerasで多層パーセプトロンを構築されている方は 幾何的な理解の助けにご利用下さい。<br />
( どちらかというと学習メモ用に走り書きしただけなので 難解な部分, 認識の誤り等残っている可能性があります。<br />
その際にはお手数ですがTwitter(<a href="https://twitter.com/irration" target="_blank">@irration</a>)までご連絡いただけましたら幸いです )</p>
<p>また、今回はモデル構築部の幾何的な理解を目標としているため、実際のKeras部分を用いた学習に関しては省略しております。ご了承下さい。</p>
<p><span id="more-1470"></span></p>
<h2>通常の多層パーセプトロンの場合</h2>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf-8 -*-
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
</pre>
<p>何はともあれインポート。これらのインポートしたものがそれぞれどういう意味を持つのかは後述します。</p>
<pre class="brush: python; title: ; notranslate">
num_input_layer  = 3 # 入力層のニューロンの数
num_hidden_layer = 4 # 隠れ層のニューロンの数
num_output_layer = 3 # 出力層のニューロンの数
</pre>
<p>入力層、隠れ層、出力層のニューロンの数を変数として持たせておきます。</p>
<pre class="brush: python; title: ; notranslate">
model = Sequential()
</pre>
<p>Sequentialインスタンスを作成しました。<br />
このSequentialというやつは、以下の画像のような複数の層を持つデータをモデル化するためのインスタンスです。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/07/neural5.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/07/neural5.jpg" alt="neural5" width="600" height="400" class="aligncenter size-full wp-image-1480" /></a></p>
<p>ネットワークの左側の緑色は「入力層」、右側の緑色が「出力層」、(存在する場合)入力層と出力層の間に挟まれているのが「隠れ層」です。<br />
普通のKerasの用途としては隠れ層を複数導入してディープニューラルネットワークのように使うのが通常かと思われますが、一応モデルとして隠れ層を持たない入力層・出力層だけのネットワークのモデル(図の左側に浮いているやつ)も定義できるっぽいです。</p>
<p>というわけで、インスタンスを定義したので早速ですが多層パーセプトロンをつくってみます。</p>
<pre class="brush: python; title: ; notranslate">
model.add(Dense(num_hidden_layer, input_dim=num_input_layer))
</pre>
<p>DenseというのはDensely-Connected なニューラルネットの層を指す。<br />
Densely-Connected の イメージとしては上図のようにそれぞれの層の入力と出力同士が全て互いにくっついている感じ。認識が間違っていなければ Fully-Connectedと同義のはず。<br />
( 一応確かめました: <a href="http://forums.fast.ai/t/dense-vs-convolutional-vs-fully-connected-layers/191/2" target="_blank">dense-vs-convolutional-vs-fully-connected-layers</a> )</p>
<p>今回は入力層が3つ、隠れ層が4つのニューロンからなるため上記のコードにより以下のような図のネットワークができたことになります。<br />
( 因みに この時点で定義されているネットワークにおいて、下記にて隠れ層として描かれているものは モデル上では隠れ層でなく出力層となっています )</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/07/neural6.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/07/neural6.jpg" alt="neural6" width="600" height="400" class="aligncenter size-full wp-image-1483" /></a></p>
<p>次は活性化関数を追加します。活性化関数というのは、あるニューロンが複数の(各ニューロンごとに重みがついた)ニューロンからの入力を受け取り、受け取った値を合計した後 そのニューロン自身を0～1の間の値に落とし込むための関数です。これは連続値の場合もありますし、離散値(0,1)の場合もあります。離散値の場合は「ステップ関数」と言われており、ニューロンが「発火」= 他のニューロンからの入力の合計が閾値を上回りステップ関数が1になる というイメージのものです。活性化関数に関する具体的な議論に関しては他の方の記事に譲ります。</p>
<pre class="brush: python; title: ; notranslate">
model.add(Activation('sigmoid'))
</pre>
<p>今回は活性化関数によく使われるシグモイド関数という関数を使用しました。<br />
( なお、最近だとReLU関数というのが使われるのが割とメジャーな方法になってきているっぽいですね )</p>
<p>これにより、ネットワークは以下のような状態になりました。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/07/neural7.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/07/neural7.jpg" alt="neural7" width="600" height="400" class="aligncenter size-full wp-image-1484" /></a></p>
<p>今回は多層パーセプトロンを組みたいので、隠れ層の次に出力層を追加します。</p>
<pre class="brush: python; title: ; notranslate">
model.add(Dense(num_output_layer))
model.add(Activation('softmax'))
</pre>
<p>出力層の活性化関数には「ソフトマックス関数」を使用します。ソフトマックス関数は多クラス分類問題においてよく使われる関数で、「これが一番大きい！」と最大の1つを決定する挙動をより緩やかにして、「これが全体の中で結構大きいよね。5つのアウトプットを相対的に表現すると ( 0, 0, 0.03, 0.94, 0.03 ) くらいかな。といった形で「マックス」を「ソフト」にする効用があるため「ソフトマックス」と呼ばれています。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/07/neural4.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/07/neural4.jpg" alt="neural4" width="600" height="400" class="aligncenter size-full wp-image-1486" /></a></p>
<p>上記コードの追加により、最終的にこんな感じのネットワーク構造ができました。<br />
最後にこのネットワーク構造をコンパイルします。</p>
<pre class="brush: python; title: ; notranslate">
model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01),metrics=['accuracy'])
</pre>
<p>( このあたりのコードは後述の書籍(『詳解ディープラーニング』)を参考にさせていただいております。 )<br />
コンパイル時に、どのようにネットワークの学習に際して必要となる情報を併せて引数として渡します。</p>
<p><strong>loss</strong> は誤差関数です。テスト時に予測が実際の結果とどれくらいずれていたかをはかる指標です。</p>
<p style="color:#999;">【発展的な議論】<br />
因みに誤差関数は何でも良いというわけではなく、活性化関数と対応させる必要があります。<br />
例えば多クラス分類問題を解く際にはソフトマックス関数を活性化関数として選びますが、この場合多クラス用のクロスエントロピー誤差関数を選ぶのが一般的です。<br />
( その他 最小二乗法を用いた回帰問題であれば二乗誤差関数、2クラス分類ならクロスエントロピー誤差関数等 )</p>
<p><strong>optimizer</strong>というのは学習の際どのように精度を高めていくかを表す関数です。今回は<strong>SGD(Stochastic Gradient Descent; 確率的勾配降下法)</strong>という最適化問題における有名な手法を使用します。またこの際<strong>lr</strong>という引数をSGDに渡していますが、これはlearning rate、すなわち学習率を表し、学習率が大きいほど 誤差をより大きく修正しようという方向で動きます。</p>
<p><strong>metrics</strong>はモデルの評価指標です。Kerasではmetrics=['accuracy']という形で設定して、訓練時・テスト時にモデル精度の高さを測る方法がよく使われるようです。</p>
<p>まとめると、以下のようになります。</p>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf-8 -*-

from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD

num_input_layer  = 3 # 入力層のニューロンの数
num_hidden_layer = 4 # 隠れ層のニューロンの数
num_output_layer = 3 # 出力層のニューロンの数

model = Sequential()

model.add(Dense(num_hidden_layer, input_dim=num_input_layer))
model.add(Activation('sigmoid'))

model.add(Dense(num_output_layer))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01),metrics=['accuracy'])
</pre>
<h2>隠れ層を増やしてみる</h2>
<p>上記コードの入力層と出力層との間に同じ手順でもう一つ追加するだけです。</p>
<pre class="brush: python; title: ; notranslate">
model.add(Dense(num_hidden_layer))
model.add(Activation('sigmoid'))
</pre>
<p>なお、今回は 隠れ層に含まれるニューロンの数をいずれも num_hidden_layer で固定していますが、隠れ層の各層によってニューロンの数を変化させても問題ありません。</p>
<p>結果的にどういうネットワーク構造になるかというと…</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/07/neural2.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/07/neural2.jpg" alt="neural2" width="600" height="400" class="aligncenter size-full wp-image-1490" /></a></p>
<p>こんな感じです。<br />
コードをまとめると、</p>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf-8 -*-

from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD

num_input_layer  = 3 # 入力層のニューロンの数
num_hidden_layer = 4 # 隠れ層のニューロンの数
num_output_layer = 3 # 出力層のニューロンの数

model = Sequential()

model.add(Dense(num_hidden_layer, input_dim=num_input_layer))
model.add(Activation('sigmoid'))

model.add(Dense(num_hidden_layer))
model.add(Activation('sigmoid'))

model.add(Dense(num_output_layer))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01),metrics=['accuracy'])
</pre>
<p>となります。Keras、ちょっと触っただけだけど、割と直感的に書けていいな～と思いました。</p>
<p>※ 一部コードは以下の書籍を参考にさせていただいております。RNN, LSTM, BRNN, seq2seq 等の話題も豊富で、且つコードの例も豊富に載っているためオススメです。</p>
<p><a href="https://www.amazon.co.jp/詳解-ディープラーニング-TensorFlow-Kerasによる時系列データ処理-巣籠-悠輔/dp/4839962510/" target="_blank">詳解-ディープラーニング-TensorFlow-Kerasによる時系列データ処理 &#8211; 巣籠 悠輔(著)</a></p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1470">Kerasで多層パーセプトロンのモデル構築する際のイメージ(数式無し)</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1470/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>機械学習に本気で取り組むためにやった数学周り 後半戦結果</title>
		<link>http://kinokoru.jp/archives/1425</link>
		<comments>http://kinokoru.jp/archives/1425#comments</comments>
		<pubDate>Tue, 20 Jun 2017 10:00:30 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[数学]]></category>
		<category><![CDATA[機械学習]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1425</guid>
		<description><![CDATA[<p>　前回の「機械学習に本気で取り組むためにやった数学周り 前半戦結果」の記事から早くも半年近くが経過しました(覚えてくれている人いるだろうか…)。本当に時間が過ぎるのは早い。とりあえず2017年前半の締め括りの季節として良 [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1425">機械学習に本気で取り組むためにやった数学周り 後半戦結果</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p><a href="http://kinokoru.jp/wp-content/uploads/2017/06/ai_study_kikaigakusyu_2.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/06/ai_study_kikaigakusyu_2.jpg" alt="ai_study_kikaigakusyu_2" width="640" height="400" class="aligncenter size-full wp-image-1445" /></a></p>
<p>　前回の<a href="http://kinokoru.jp/archives/1289" target="_blank">「機械学習に本気で取り組むためにやった数学周り 前半戦結果」</a>の記事から早くも半年近くが経過しました(覚えてくれている人いるだろうか…)。本当に時間が過ぎるのは早い。とりあえず2017年前半の締め括りの季節として良い時期になってきたので少々早いですが後半戦結果を書きました。後半戦では 色々な軌道修正・計画の調整を行ったため 前半戦に記載している流れになっていない部分がありますがご了承下さい。<br />
<span id="more-1425"></span></p>
<h2>● 2017年1月 &#8211; 6月 後半戦結果</h2>
<h3>2017年1月後半 &#8211; 線形代数復習</h3>
<p> 昨年8月にやっていたのだけれど、幾何的な理解はできていたが理論的な理解が浅いままで割と苦労したので改めて時間を設けて固めることにした。</p>
<p>　【勉強時間: 35時間】</p>
<h3>2月 &#8211; 最適化数学</h3>
<p>　<strong>→ これなら分かる最適化数学―基礎原理から計算手法まで</strong><br />
　ラグランジュの未定乗数法とか最適化問題の考え方の基本はこの本で習得した。未定乗数法は機械学習理論の本で割とあらゆる所に「え？知ってるよね？」くらいのライトさでサラッと出てくるのでここで習得しておいて良かったと思う。勾配法とかニュートン法とかそのあたりの考え方もこの本で抑えられた。</p>
<p>　【勉強時間: 55時間】</p>
<h3>3月 &#8211; 基礎的な多変量解析 + 統計学</h3>
<p>　<strong>→　心理統計学の基礎</strong><br />
　多変量解析も載ってるけど、どちらかというと統計本って感じも。<br />
　本当は 多変量解析法入門 (ライブラリ新数学大系) に入る予定だったが、当時の自分に若干敷居が高かったため、背伸びして現状の自分の身の丈に合わない本をやるよりも 現状の自分より少しハードルの高いくらいのレベル感で着実に実務に活かせる実力をつけた方が良いだろうという判断でこちらの本にした(「心理」という名前がついているけれど、良質な統計書としても評判らしい )。結果的に線形と統計に関しては想定していたより結構な時間がかかってしまった感があるけれど、その分時間をかけたおかげで 機械学習に取り組む上での最低限の地盤が固まったかなという感覚を得るがひとまずできた。</p>
<p>　この頃になると深夜帯(0:00～2:00)メインで勉強していたが、この辺りから 机に座ると眠気が襲ってくるようになったので、深夜帯の勉強 → 朝早く起きて会社の最寄駅のカフェで1～2時間勉強してから出社する習慣に切り換えた。</p>
<p>　【勉強時間: 52時間】</p>
<h3>4月 ～ 5月前半 &#8211; 機械学習理論</h3>
<p>　<strong>→　パターン認識と機械学習(PRML) 上巻</strong><br />
　仮に進捗がどのような状況であっても 4月～6月の間の3ヶ月は1年の総仕上げとして機械学習理論に入ろうと決めていたため、ラスボスとして位置づけていたPRMLに突入。<br />
　結果として上巻は5月の前半で決着がついたし 機械学習・生成モデルの基礎的な概念周りに関して大分良い理解が得られたと思う。同時にこの時期に機械学習理論の事を「数学」と呼ぶことについて、厳密に学生時代数学を学んで来た人たちが「うーむ」と思う部分があるということを知った( 機械学習周辺の論文の数学はざっくばらんすぎてイラつくことがあるらしい )のでタイトルでは「機械学習に本気で取り組むためにやった数学周り」となっているが、今後機械学習理論の事を安易に数学と表現するのは控えようと思った。</p>
<p>　【勉強時間: 82時間】</p>
<h3>5月後半 &#8211; PRML下巻 途中まで</h3>
<p>　<strong>→ パターン認識と機械学習(PRML) 下巻</strong><br />
 　8章 グラフィカルモデル　終了<br />
 　9章 混合モデルとEMアルゴリズム　終了</p>
<p>　6, 7章のカーネル法に関してはひとまず概要だけの理解にとどめておいた。というのも、カーネル法自体がそこそこ大きなトピックで且つPRMLだけでは不足な点があるという評価が見られたので、必要になったタイミングで『カーネル多変量解析』等の本とともに勉強する方針にした。</p>
<p>　また、この時期より勉強だけに留まらず少しずつ外にも出ていく事を意識し始め、<a href="http://www.team-ai.com/eventin-a-world-where-valuesare-hard-to-differentiate/" target="_blank" rel="noopener noreferrer">TeamAI</a>さん主催の交流会やKaggle勉強会に参加させていただきました。渋谷付近で毎日AI関連のイベントを開催されており、個人的にとても素敵なコミュニティだと思うので こちらの記事にて併せて紹介してみました。現在機械学習・AI周りの勉強をされている方等オススメです。</p>
<p>　【勉強時間: 20時間】</p>
<h3>6月 ～ 現在</h3>
<p>　<strong>→ Pythonで体験するベイズ推論 PyMCによるMCMC入門</strong><br />
　<strong>→ トピックモデル(機械学習プロフェッショナルシリーズ)</strong><br />
　当初の目標としての最低限のベースの理論の習得は達成できたため計画修正。本格的な業務上での応用を優先し、これまで習得した知見をもとにトピックモデル周りの勉強をメインとして、PRMLを補助的な教材として利用する方針に推移( 特にギブスサンプリング、変分推論 などはトピックモデル周辺の勉強において不可欠なため、その進捗に応じて PRMLで補填的に学習 )。</p>
<p>　本当は「PRML全部終わりました！」という状態で気持ちよくプロジェクトを締め括ることができればよかったのですが、現在の自分のベース部分における習熟度や、今の自分が求められている役割等を総合的に考えた結果、今現在実務において得られる成果の最大化を優先するという形で軌道修正した感じになります。</p>
<h2>● 勉強時間まとめ</h2>
<p>・前半戦: 250 ～ 300時間程度<br />
・後半戦: 250時間程度<br />
・<strong>計: 500 ～ 550時間程度</strong></p>
<p>※ だらだら勉強した時間、効率の悪かった時間は計算に入れておらず、集中的に取り組んでいた時間のみを計算しています。なお、ここでかかった時間は飽くまで自分の場合なので 当然ながら500時間の勉強で得られる内容や密度は人によって全然変わってきます。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/06/study_wakaru_boy.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/06/study_wakaru_boy.jpg" alt="study_wakaru_boy" width="640" height="400" class="aligncenter size-full wp-image-1451" /></a></p>
<h2>● この1年間で習得できた事 まとめ</h2>
<p>人に説明できるレベル &#038; 実際に実務で扱えるレベルを基準としています。多分もうちょっと色々あったと思うけど、思い出したら追加する感じで。思い浮かぶ限り書いたので分野や各項目の粒度はごっちゃ煮です、スミマセン…。全体として取り組んだ分野としては 数II・Bの復習、数III・C、解析学、線形代数、統計学、最適化数学、機械学習理論 って感じです。</p>
<div style="background:DDD; border: 1px solid #CCC; color: #333; font-size: 11px; padding: 10px; line-height: 24px;">
生成モデル・識別モデル・識別関数の違い, 最小二乗法, 過学習, 正則化, 正則化最小二乗法, 尤度, 対数尤度, 最尤推定, MAP推定, 予測分布, 事前分布, 事後分布, 共役事前分布, パーセプトロン, 誤差逆伝播, ベルヌーイ分布, 二項分布, 多項分布, ガウス分布, 対数正規分布, 指数分布, ポアソン分布, ガンマ分布, ベータ分布, カテゴリ分布, ディリクレ分布, 標本平均 / 標本分散, 1-of-K符号化法, t分布, 大数の法則, 中心極限定理, 標準化, 確率密度, 条件付き確率, 確率の加法定理・乗法定理, ベイズの定理, 周辺化, 超パラメータ, 汎関数, デルタ関数, 次元の呪い, n-gram, 線形回帰, 行列式, 形態素解析, 係り受け解析, ラグランジュの未定乗数法, Ridge回帰, Lasso回帰, テイラー展開・マクローリン展開, 一次形式・二次形式, pandas / sklearn / numpy / matplotlib, jupyter notebook, KLダイバージェンス / JSダイバージェンス, コサイン類似度, 共分散, 指数・対数等の微積分, step関数, ロジスティックシグモイド関数, ソフトマックス関数, ロジスティック回帰, 多クラスロジスティック回帰, 交差エントロピー誤差関数, 勾配降下法, ニュートン法, ナイーブベイズ, 一次独立（線形独立） / 一次従属, 固有値 / 固有ベクトル, ベクトル空間, 正定値, ヤコビ行列, ユークリッド距離 / マハラノビス距離, 決定理論, 棄却域・棄却オプション, パラメトリック手法 / ノンパラメトリック手法の違い, 線形写像, 核と像, Σ計算, Π計算, 指数/対数等の微積分, 偏微分, ベイジアンと頻度論の違い, TF-IDF, グラフィカルモデル, ベイジアンネットワーク, マルコフ過程, kmeans, EMアルゴリズム, 混合モデル, イェンゼンの不等式, 人工無脳（辞書型), ニューラルネットワーク(多層パーセプトロン), ユニグラムモデル, 混合ユニグラムモデル
</div>
<h2>● 目標の振り返り</h2>
<p>　前回(前半戦)の報告記事で書いていた目標を振り返りたいと思います。</p>
<p><strong>・個人的な数学コンプレックスに決着をつけたい</strong><br />
　→　決着がついた。学生時代ガチで勉強してきた理系の人達に比べるとまだまだ毛程にも満たない実力だと思うし そういう人たちから見たらまだまだニワカ感が拭えないけれど、少なくとも「数学がネックで…」という数年前からずっと胸に抱いていた心のつかえを払拭することはできたし 実務に応用できるレベルまで引き上げる事ができたので目標は達成された。</p>
<p><strong>・機械学習・人工知能周辺で採用されている各種法がどういう理屈で動いているのか分かるようにしたい</strong><br />
　→　なんというか今改めて見返すと結構雑な目標だな。とりあえずこれに関しては前述の項目「この1年間で習得できた事 まとめ」を参考にしていただけましたら幸いです。</p>
<p><strong>・機械学習・人工知能周辺の最新手法とか論文の数式をストレス無く追えるようになりたい</strong><br />
　→　論文の数式を追うための下地は整ったかなという感覚。少なくとも機械学習周りの論文に出てくる数式に理不尽にわからん殺しされることは無くなった。あとは慣れだろうか。正直これは大分助かるし、1年間頑張ってきて本当によかったと思う。</p>
<p><strong>・文系で社会人でも、後天的に機械学習周辺分野の数学的な素養・下地をつくることは可能である事を証明し、そのロールモデルになりたい(意識高め)</strong><br />
　→　結論から言うとロールモデルになれたかというと正直微妙な所です。　</p>
<p>　これについては、まず自分の特性について説明する必要があり、まず僕は自分自身に対する評価として<br />
　<strong>・頭の回転: 特別速いわけではなく、人並み<br />
　・習慣化能力・継続能力・忍耐力: かなり高い</strong><br />
　という自己認識を持っています。ので、計画段階においては この特性にあわせて自分の強みである習慣化能力・継続能力・忍耐力をフルに活用して 焦らず一歩一歩理解を深めていくことで頭の回転の平凡さをカバーする という戦い方をしました。</p>
<p>　こうして自分の選んだ戦い方における土俵の特徴ですが、勉強している途中に泣きたくなるような途方もない大きな壁が数日おきにやってきますし、割と自分の至らなさに何度も心を折られ続けます。ただ時折自分の勉強してきた道を振り返った時にふと自分が以前より大分先の道を歩いていて、今まで分からなかった事がスッと理解できるようになっていることに気づいて言葉に表せない喜びを感じる…という経験ができるので、辛い状態と楽しい状態がシュレーディンガーの猫よろしく同時に存在し続けている土俵です。慣れない数学的表現で精一杯頑張って表すと: </p>
<div style="background:DDD; border: 1px solid #CCC; color: #333; font-size: 11px; padding: 10px; line-height: 24px;">
x1 = 辛み, x2 = 楽しみ ( x1は負の実数、x2は正の実数 )<br />
w1 = 辛みにかけられる重み, w2 = 楽しみにかけられる重み ( w1, w2 ともに正の実数 )<br />
wTx < 0 のとき 「もう無理だ諦めよう」となると仮定すると、<br />
自分の選んだ土俵は x1 = -0.8, x2 = 0.2 くらいの土俵で、w1 = 0.4, w2 = 0.6 くらいを想定した感覚で臨むと普通に潰される土俵です。<br />
自分の場合ドMで w1 = 0.05, w2 = 0.95 くらいだったので続けられた感じです。
</div>
<p>　…みたいな感じです。この観点から言うと、自分の選んだ土俵は相当特殊な土俵で、自分のような変態魔人でもないと確実に撃沈するため ロールモデルとして参考になったかというと「うーん…」といわざるを得ない という感じです。人それぞれ自分に合った勉強の仕方があり、一律に万人に当てはまる効率的な勉強の仕方というのは無いと思うので、計画段階で自分の強みを分析した上で どういう風な学び方が自分に合っているかによって計画を立てて進めつつ、効率が落ちてきた頃合いに再度計画を見直し修正して…と勉強法を軌道修正しながら進めていくのが良いのではないかと思います。</p>
<h2>● TODO </h2>
<p>　一先ず自分がこの後何をすべきか、チームにおいてどういう役回りで立ち回れそうか見えてきたので、今後は実務に活きてくるアウトプットを意識した形でその周りの技術的知見を中心にどんどん強化していく予定。実務では自然言語処理周りを扱う事が多いので主にそちらの方をメインで見る感じになってくるかなーという感じ。</p>
<p>・LDA, CNN, RNN, GAN, LSTM, seq2seq, &#8230; 周りの論文を一通りおさえる。<br />
・TensorFlow, chainer, Keras 周りの、理論を実際のシステムに落とし込むための技術をおさえる。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/06/juuryoku_newton.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/06/juuryoku_newton.jpg" alt="juuryoku_newton" width="640" height="400" class="aligncenter size-full wp-image-1454" /></a></p>
<h2>● 実際にどういう実りがあったのか</h2>
<p>　ここまで聞いた感じただただ辛そうな経験でしかなさそうだけど、前述の通り楽しさが辛みに勝っていたのでとても楽しかった( 更に言うと 時間が許すならばもっとやっていたい所 )し、業務でも勉強したことをガンガン役立てることができているので、個人的な感想としてはやはり理論から着実にやっておいて良かったと思う。</p>
<h3>理論的な発想の引き出しが増えた</h3>
<p>　特に「こういう回帰モデルに落ち着かせられそうだな」とか「こういう特徴量を取って一旦アプローチをかけてみるか」とか「こういう風に前処理をかけて混合モデルとして表現して確率的に分類してみたらどうだろう」とかそういう日常の何気ない発想の引き出しが増えた気がする。あとは「精度があまりに良すぎるので過学習を疑った方が良いのでは」とか「そもそも適切なモデルじゃないな」とか基本的なミスを自然と避けられるようになったのも良かったと思う。</p>
<h3>幾何的なイメージがツール習得の手助けに</h3>
<p>　NumPyとかいじる時で言えば、代数周りの幾何的なイメージを事前に持っているのでエラーが出ても「ああ、確かに無理がある行列計算だな」等当たりをつけることができて、不必要な部分で変に詰まる事があまり無くなった。<br />
　また、TensorFlowとかいじる時で言えば、 モデルフィッティングやら予測周りやらの一連の流れについて 予め理論面の勉強によってある程度腹落ちしていたので その辺りも「どうしてこういう流れなんだ？」とか悩まず円滑に理解することができた。<br />
　というように、新しいツールをいじる時 理論的土台がある程度できているのであまり変なはまり方をして時間を消耗することが無くなりかなりストレスは軽減した。</p>
<h3>専門分野として 学んだ事がそのままビジネス成果に繋がる喜び</h3>
<p>　数式がうわーって並ぶ論文周りとかを読んで、それを実際の仕事に活かして何らかのビジネス成果を達成したり課題解決をしたりするまでの一連のフローをつくるのが個人的にとても憧れだったので、そういう形で段々と実務に携われるようになってきたのがとても嬉しい。</p>
<h3>朝型になった</h3>
<p>　完全にネタなのだけど、これに関しては全く意図したことではないし 正直機械学習の勉強で得られた実りと言うべきか疑問ではあるけど、夜の勉強が眠すぎて朝型に切り換えてからというものの調子がすごく良いし1日にメリハリがついた。</p>
<p>( …なんだか全体的にフワッとした感じになってしまったので、実際に実りがあった事を定量的に示せるよう今後はガンガンアウトプットしていきたいと思います )</p>
<h2>● 感謝の言葉</h2>
<p>　チャットボット周りで機械学習の一連の導入フローを体験させて頂いたり統計解析的な仕事の機会を頂いたり、様々なアウトプット面で数々の機会を頂いた上司やチーム、会社の方々には正直どれだけ感謝してもし切れませんし、同様に 勉強に追われる中毎日健康的な食事・お弁当を用意してくれたり激励してくれた奥さんにも本当に頭が上がりません。<br />
　本当に周りに恵まれていると思いますし、頂いた分ちゃんと返さねばと思いつつ今後も頑張ります！</p>
<h2>● おまけ: 学生の方々に一言</h2>
<p>　社会人になってからこういうインプットを1からしようと思うととにかく結構大変なので、やりたい分野がハッキリしている場合は学生のうちにできる限り理論面の勉強を惜しまずやっておいた方が良いと個人的に思います。<br />
　集中的に何かをインプットをできる時期というのは人生で本当に限られていて、社会人になって役職がついたり守るべき家族ができたりするとなおさらですし、勉強のための体力や集中力も一生続く無限のリソースでは無いです。<br />
　学校におけるコミュニティにも大きな価値があります。同じ分野の課題で、更には(カリキュラムの性質上)比較的同じくらいの進度の部分で相談できる友人が比較的探しやすい環境だと思います。社会人になってからは まず同時期に同じ分野の課題に取り組んでいる人を見つけるハードルも学生時代より格段に上がりますし、更に見つけられたとしても課題に対する学習の進み具合も往々にしてバラバラです。加えてそれぞれが個々の仕事や家庭等様々な事情を持っているため その人達と継続的に同じ課題を取り組み続けられるとも限りません。ので学校にいる間に思う存分羽を伸ばして勉強に打ち込むと良いのではないかというのが自分の意見です。<br />
( 何というか偉そうに先輩風吹かせる感じで締めくくってしまいスミマセン )</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1425">機械学習に本気で取り組むためにやった数学周り 後半戦結果</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1425/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>機械学習に本気で取り組むためにやった数学周り 前半戦結果</title>
		<link>http://kinokoru.jp/archives/1289</link>
		<comments>http://kinokoru.jp/archives/1289#comments</comments>
		<pubDate>Sun, 22 Jan 2017 22:20:45 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[数学]]></category>
		<category><![CDATA[機械学習]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1289</guid>
		<description><![CDATA[<p>自分と同じようなバックグラウンドで「機械学習周辺の数学まわりの勉強をしたい」という人の助けに少しでもなれればと思い、半年間の勉強の軌跡を公開することにした。 ● 前提 ・数学の勉強と言える勉強は高校数学で言う所の数II・ [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1289">機械学習に本気で取り組むためにやった数学周り 前半戦結果</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p><a href="http://kinokoru.jp/wp-content/uploads/2017/01/job_suugakusya.png"><img src="http://kinokoru.jp/wp-content/uploads/2017/01/job_suugakusya.png" alt="job_suugakusya" width="367" height="400" class="aligncenter size-full wp-image-1293" /></a></p>
<p>自分と同じようなバックグラウンドで「機械学習周辺の数学まわりの勉強をしたい」という人の助けに少しでもなれればと思い、半年間の勉強の軌跡を公開することにした。</p>
<h2>● 前提</h2>
<p>・<strong>数学の勉強と言える勉強は高校数学で言う所の数II・Bまで</strong>しかやってこなかった。<br />
・<strong>数学が超得意だったかというとそういうわけではなく、まあ普通なライン</strong>。<br />
・大学は情報系で文理一緒だけど、正直<strong>大学数学らしい数学はあまりやってこなかった</strong>。<br />
・社会人になって以来ずっと数学コンプレックスで「大学の時もっと理系の勉強をしておけばよかった」と後悔する日々だった。<br />
・「とにかくツールとか沢山触りまくって慣れた方が良い」という意見も沢山頂いていたのだけど、<br />
 &#8211; やはり専門の文献を読むとブワーッと数式が出て来て「うっ」となる自分が情けなく感じる経験をした<br />
 &#8211; このまま勉強しないで年をとった後に「あの時やっておけば」という後悔はしたくなかった<br />
 &#8211; 「機械学習やってます」と言うならばせめてバックグラウンドをしっかり固めて胸を張って言いたい<br />
等様々な思いや経験が交錯して、個人的な趣向としてどうしても先に数学周りの補強をせずにはいられなかったため <strong>約1年がかりの個人的な大プロジェクト(2016年6月〜2017年6月)</strong>として補強計画を立てることにした。<br />
・<strong>勉強時間の平均は1日1〜2時間程度でほぼ毎日実施。休日等時間のあるときは4〜5時間程度</strong>。<br />
<span id="more-1289"></span></p>
<h2>● 目標とする所</h2>
<p>・個人的な数学コンプレックスに決着をつけたい<br />
・機械学習・人工知能周辺で採用されている各種法がどういう理屈で動いているのか分かるようにしたい<br />
・機械学習・人工知能周辺の最新手法とか論文の数式をストレス無く追えるようになりたい<br />
・<strong>文系で社会人でも、後天的に機械学習周辺分野の数学的な素養・下地をつくることは可能である事を証明し、そのロールモデルになりたい(意識高め)</strong></p>
<h2>● 2016年6月 &#8211; 2017年1月 前半戦 結果</h2>
<h3>2016年6月前半 &#8211; 数II・B復習(主に三角関数、対数、数列)</h3>
<p>　→ <strong>黄チャート</strong>、<strong>青チャート</strong>。<br />
　三角関数は解析学勉強する上で障害になりそうだったので一緒に潰しておいた。<br />
　数列は機械学習本でΣとかΠとかしょっちゅう出てくるので丁寧にやった。<br />
　対数も機械学習本でよく出てくるので丁寧にやった。</p>
<h3>6月後半 &#8211; 数III・C( 主に行列、極限、微積分 周辺 )</h3>
<p>　→ あまり難問とか深入りする必要はないかなと感じたのでこちらも<strong>黄チャート</strong>と<strong>青チャート</strong>くらいに。<br />
　大学以降にまさかチャート式を手に取ることになろうとは。</p>
<h3>7月 &#8211; 解析学</h3>
<p>　→ <strong>ラング解析入門</strong>・<strong>ラング続解析入門</strong><br />
　解析学の本としてはそこそこカジュアルで比較的やさしめ？とにかく練習問題を解いて色々な微分積分に慣れた。三角関数、対数、自然対数の微分積分とか 置換積分とか部分積分とか マクローリン展開とかテイラー展開とか。</p>
<h3>8月 &#8211; 線形代数</h3>
<p>　→ <strong>プログラミングのための線形代数</strong> / <strong>キーポイント線形代数</strong><br />
　プログラミングのための線形代数は　行列がどのようにグイーンビヨーンするのか本当に分かりやすく説明してくれてとても有難かった。一次独立とかその辺りは割としっかり理解できたけど、標準形の辺りとか若干自信無いので最適化数学の勉強に入る前にまた要復習。</p>
<h3>9月 &#8211; 確率・統計 ( 途中で挫折 )</h3>
<p>　→ <strong>統計学入門(東京大学出版会)</strong> / <strong>確率・統計入門(小針 アキ宏)</strong> / <strong>プログラミングのための確率・統計</strong> / <strong>キーポイント確率統計</strong><br />
　兎に角最初は確率論のイメージがあまりにも掴めなさすぎて色々な参考書を横断。<br />
　頭をひねって時間を費やすも、結果的に挫折(条件付き確率とか確率分布の式とかその辺りで挫折した記憶が)</p>
<h3>9月後半 &#8211; ベイズ統計学</h3>
<p>　→ <strong>図解ベイズ統計「超」入門</strong>。あとはWeb上の情報を漁っていた。<br />
　主に哲学的な部分。理論的な部分はベイズ更新とかナイーブベイズとかそのあたり。</p>
<h3>2017年1月前半 &#8211; 確率・統計 再挑戦</h3>
<p>　→ <strong>統計学入門(東京大学出版会)</strong><br />
　紆余曲折あって1月に再開。 統計学入門を再開して撃破。</p>
<h2>● ここまでの結果</h2>
<p>・累積学習時間: <strong>大体250〜300時間くらい</strong> …後半戦ではきちんと正確に記録します )<br />
・<strong>「数学やっておけばよかった」という数年来の後悔にひとまず終止符を打てたと思う</strong><br />
・<strong>Σ計算</strong>、<strong>Π計算</strong>は特にストレスなく普通に解釈できるようになった<br />
・<strong>偏微分</strong>とか特にストレスなく普通に解釈できるようになった<br />
・<strong>尤度</strong>とかその辺りの概念も特にストレスなく普通に解釈できるようになった<br />
・<strong>線形性</strong>のありがたみがなんとなく分かった<br />
・<strong>対数</strong>がどれほどありがたい存在か分かった<br />
・「こういう事象の時はこういう確率分布が応用できそう」という引き出しが増えた<br />
・<strong>最尤推定</strong>ならびに基本的な<strong>検定</strong>とかその周りの事は理解できた<br />
・主要な<strong>確率分布</strong>( 超幾何分布、ベルヌーイ分布、二項分布、幾何分布、負の二項分布、ポアソン分布、一様分布、ガンマ分布、正規分布、指数分布、カイ二乗分布、t分布、F分布 )はそれぞれ確率密度関数 及びどういう特徴があってどういう時に使うものなのかしっかり理解できた<br />
・機械学習関連分野の基本的な数式は(ものによるけど)とりあえず「うっ」とならずに追えるようになった</p>
<h2>● 思ったこと・感じたこと</h2>
<h3>解析学について</h3>
<p>　・<strong>勾配</strong>は最適化問題や機械学習で何かと出てきそうな概念なのでしっかりやっておくと良さそう。<br />
　・<strong>マクローリン展開</strong>・<strong>テイラー展開</strong>あたりは統計の勉強する時に何かと重宝する。</p>
<h3>線形代数について</h3>
<p>　・<strong>プログラミングのための線形代数</strong>は幾何的な理解を促進する意味合いでも早い段階で読んでおくと良さげな感じがした。</p>
<h3>確率・統計について</h3>
<p>　・<strong>母集団分布</strong>と<strong>標本分布</strong>とで使う記号が違ったり分散やら標準化変数やらが違ったりするので しっかり区別して勉強するとよいなと思った。<br />
　・<strong>ベイジアン</strong>と<strong>頻度論</strong>の二つの立場が存在していて二つの立場で手法・観点が変わってくるのは面白かったし 理解を深めておくと良さそう。</p>
<h3>その他全体を通して</h3>
<p>　・ある分野で詰まったら別の近しい分野の勉強して戻ってくると割とスンナリ理解できたりして良かった(お互いに少なからず関連しているため)。勾配とかモーメントとか条件付き確率とか対数尤度とか。<br />
　・直交とかそういう系の話で色々な分野で何かと<strong>内積</strong>をよく使う気がするので慣れておくと便利そう<br />
　・結構複雑な数式で面食らうけど、ちゃんと順を追ってやれば 複雑な公式が 単純な公式のモデルの延長線だったりする事に気づく。逆に基礎的な部分を何となくうやむやな理解にしてしまうと後で詰まる。<br />
　・1日1〜2時間の勉強時間をつくれることが保証されているのであれば、意外と社会人を続けながらでも少しずつだけどコツコツ前進できるなと思った。<br />
　・<strong>高校数学の美しい物語</strong>←一体何十回お世話になっただろう…神。</p>
<h2>● 2017年1月後半 &#8211; 2017年6月後半 のタスク(予定)</h2>
<p>・<strong>線形代数の復習 (最適化数学の学習準備)　← 次ココ</strong><br />
・科学と証拠 読了<br />
・統計学を拓いた異才たち 読了<br />
・最適化数学 (凸計画問題、ラグランジュの未定乗数法とか)<br />
・自然言語処理のための機械学習入門(書籍)<br />
・情報理論 (エントロピーとかその周り)<br />
・多変量解析<br />
・PRML(ラスボス)　〜 ここまで6月末くらい目処にできれば…という感じ。</p>
<p>本当はルベーグ積分とか測度論とか この他にもやりたい勉強がまだまだ沢山あるけれど、社会人として時間も限られている以上 一旦理論的な部分はPRMLで打ち止めにして それ以降は暫くアウトプット中心型に切り替えようと思う。</p>
<h2>● 余談: 2016年10月〜12月にやっていたこと</h2>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/01/shigoto_desk_nobi_man.png"><img src="http://kinokoru.jp/wp-content/uploads/2017/01/shigoto_desk_nobi_man.png" alt="shigoto_desk_nobi_man" width="400" height="400" class="aligncenter size-full wp-image-1304" /></a></p>
<p>会社の方でバンバン手を動かしながら色々経験する機会を頂いていた関係で そっち方面の勉強に力を入れていた。魅力的な機会を沢山頂きつつ、要所要所で沢山サポートして下さった上司に頭が上がらない…。</p>
<p>以下理解・習得した内容。<br />
・形態素解析／係り受け解析周り (neologd神)<br />
・n-gram<br />
・TF-IDF法<br />
・チャットボット / 人工無脳周辺技術<br />
・隠れマルコフモデル<br />
・ナイーブベイズフィルタ</p>
<p>(機械学習というよりどちらかというと自然言語処理周辺)</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1289">機械学習に本気で取り組むためにやった数学周り 前半戦結果</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1289/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
