<?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>きのこる庭</title>
	<atom:link href="http://kinokoru.jp/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>DockerでAngular+Nodeのサーバを立てた話</title>
		<link>http://kinokoru.jp/archives/1557</link>
		<comments>http://kinokoru.jp/archives/1557#comments</comments>
		<pubDate>Thu, 01 Mar 2018 12:54:02 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[サーバ・インフラ系]]></category>
		<category><![CDATA[ツール系]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Node]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1557</guid>
		<description><![CDATA[<p>最近Win機を購入して 仮想環境どうしようかなーと思っていたのだが、「せっかくだし使い慣れたVagrantではなく思い切ってDockerでつくってみるか」と思い立ったので 勉強がてらDockerでサーバを立ててみた。 前 [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1557">DockerでAngular+Nodeのサーバを立てた話</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>最近Win機を購入して 仮想環境どうしようかなーと思っていたのだが、「せっかくだし使い慣れたVagrantではなく思い切ってDockerでつくってみるか」と思い立ったので 勉強がてらDockerでサーバを立ててみた。</p>
<h2>前提となる環境</h2>
<p>* Windows 10 Home Edition<br />
* Docker Toolbox</p>
<h2>やったこと</h2>
<p>1. Angular+Node用のDockerfile及びimageの作成<br />
2. 1で作成したimageをもとにコンテナを作成しつつ、ホストマシン上でコードをいじれるようマウント<br />
3. 実際にサーバを立ち上げてみる<br />
4. ホスト上からコードに修正を加えてみる<br />
<span id="more-1557"></span></p>
<h2>1. Angular+Node用のDockerfile及びimageの作成</h2>
<p>とりあえずNodeでサーバを立てて Angular動かしてみるかということになった。</p>
<p><a href="https://hub.docker.com/r/monostream/nodejs-angular-cli/" target="_blank">https://hub.docker.com/r/monostream/nodejs-angular-cli/</a></p>
<p>ひとまず ↑を参考にして以下のような感じでDockerfileを作成。</p>
<pre class="brush: plain; title: ; notranslate">
FROM node:alpine

RUN apk add --quiet --no-cache bash &amp;&amp; \
    yarn global add @angular/cli &amp;&amp; \
    yarn cache clean &amp;&amp; \
    rm -rf /var/cache/* /tmp/*

EXPOSE 4200

WORKDIR /home/node

COPY ng_apps ng_apps

CMD [&quot;/bin/sh&quot;]
</pre>
<p>Angularでserveした際のデフォルトのポートが4200なので、4200番を開放している。<br />
また、ng_apps という空ディレクトリをコピーしているが、これはホストマシンとの共有を想定したディレクトリ。Angularアプリケーションを配下に置いておくことでホストマシンから直接コードをいじれるようにしたかった。Dockerfileを作成したら、同ディレクトリにて以下コマンドを実行。</p>
<pre class="brush: plain; title: ; notranslate">
docker build -t angular-test .
</pre>
<p><b>Successfully tagged angular-test:latest</b>という文言とともにイメージが作成される。</p>
<h2>2. 1で作成したimageをもとにコンテナを作成しつつ、ホストマシン上でコードをいじれるようマウント</h2>
<p>以下のようにdocker run でコンテナを作成する。</p>
<pre class="brush: plain; title: ; notranslate">
docker run --name angular_test_server -d -it -p 80:4200 -v $(pwd)/ng_apps:/home/node/ng_apps angular-test
</pre>
<p>-v オプションにて ng_appsディレクトリをマウントしつつ、ポートは80番で叩けるようにした。<br />
引き続き以下のコマンドを実行し、作成したコンテナに入り、Angularが適切にインストールされているかどうかを確認する。</p>
<pre class="brush: plain; title: ; notranslate">
docker exec -it angular_test_server /bin/sh
ng --version
</pre>
<p><a href="http://kinokoru.jp/wp-content/uploads/2018/03/angular_cli_1.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2018/03/angular_cli_1.jpg" alt="angular_cli_1" width="781" height="377" class="aligncenter size-full wp-image-1560" /></a></p>
<h2>3. 実際にサーバを立ち上げてみる</h2>
<p>コンテナに入ったままng_appsディレクトリに移動し、ng new コマンドによって myappというアプリケーションを立ち上げる。<br />
ここで一つ問題が発生する。Windowsの場合、Virtualbox経由で共有ディレクトリをつくった場合ゲストマシン側でそのディレクトリにシンボリックリンクを貼ることができない。これにより<b>共有ディレクトリ上で npm install が通らず、結果的に ng new myapp がコケる</b>という事態に陥る。そこで npm install の際に <b>&#8211;no-bin-links</b> オプションをつける必要があるのだが、Angularでこれをやりたい場合は以下のようにする模様。</p>
<pre class="brush: plain; title: ; notranslate">
ng new myapp --skip-install
cd myapp
npm install --no-bin-links
</pre>
<p>これによって共有ディレクトリ上でも無事Angularアプリケーションを置くことができた。あとはnpm installが完了したら以下のコマンドでサーバの立ち上げを行う。</p>
<pre class="brush: plain; title: ; notranslate">
ng serve --host 0.0.0.0
</pre>
<p>今回はDockerのデフォルトネットワーク経由のため、ホストマシンのブラウザから 192.168.99.100 にアクセス。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2018/03/voila.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2018/03/voila-1024x627.jpg" alt="voila" width="1024" height="627" class="aligncenter size-large wp-image-1561" /></a></p>
<p>表示された。</p>
<h2>4. ホスト上からコードに修正を加えてみる</h2>
<p>せっかくマウントしたわけだし、ホスト上からコードをいじってみる。とりあえず簡単な例として初期に表示されるページのタイトルを変えてみることにする( パスはmyapp/src/index.html )。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2018/03/koushin.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2018/03/koushin.jpg" alt="koushin" width="856" height="345" class="aligncenter size-full wp-image-1562" /></a></p>
<p>こんな感じでいじって再度ゲストマシン側にて<b>ng serve &#8211;host 0.0.0.0</b>を実行すると…</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2018/03/voila2.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2018/03/voila2-1024x725.jpg" alt="voila2" width="1024" height="725" class="aligncenter size-large wp-image-1563" /></a></p>
<p>無事更新が反映された模様。</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1557">DockerでAngular+Nodeのサーバを立てた話</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1557/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Character-level Convolutional Neural Networkについて調べてみた</title>
		<link>http://kinokoru.jp/archives/1548</link>
		<comments>http://kinokoru.jp/archives/1548#comments</comments>
		<pubDate>Mon, 12 Feb 2018 06:20:24 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[ML/AI/DL/NLP/統計]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1548</guid>
		<description><![CDATA[<p>元論文 Character-level Convolutional Networks for Text Classification ( arxiv ) 概要 One-Hot表現に変換した入力値をEmbeddingした後 [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1548">Character-level Convolutional Neural Networkについて調べてみた</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<h2>元論文</h2>
<p><a href="https://arxiv.org/abs/1509.01626" target="_blank">Character-level Convolutional Networks for Text Classification ( arxiv )</a></p>
<h2>概要</h2>
<p>One-Hot表現に変換した入力値をEmbeddingした後、6層のConvolution(+Max Pooling)→平滑化して3層からなる全結合層(出力層は問題に応じて適宜変える)という流れ。<br />
カーネル数やパラメータ数は論文中に記載されているので割愛。<br />
<span id="more-1548"></span></p>
<h2>特徴</h2>
<p>ざっくり論文を読んでみた所、以下のような感じであることがわかった。</p>
<p>・ <strong>データセットが大きい( 1000000以上 )場合に有効</strong>。データセットが小さい場合は、やはり古典的ながらn-gram+TFIDFが全般的に良い精度を出している。<br />
・ アルファベットの大文字・小文字の区別に関しては、<strong>大きなデータセットでは区別しない方が良い結果だが、小さなデータセットに関しては区別した方が良い結果となる</strong>( 厳密に検証はされていないものの、正則化の役割を果たすのではないかという仮説が立てられている )<br />
・ 問題ごとで精度の差異は無い模様。</p>
<p>特に面白かったのが以下の特徴。</p>
<p>・character-level ConvNets work better for less curated user-generated texts.<br />
つまり、<strong>形の整った綺麗なテキストではなく、日頃ユーザが書いているような雑な文章に特に強い</strong>模様。確かに 単語単位ではなく文字単位で学習するので、表記揺れやよくあるtypo、はたまた単語辞書では拾いきれないような特有の表現とかに強そうな感じはする。使い道によってはチャットボットとも相性が良さそうな気がした。</p>
<h2>応用</h2>
<p><a href="https://github.com/mhjabreel/CharCnn_Keras" target="_blank">CharCnn_Keras (Github)</a><br />
KerasによるCharacter-level CNNの実装。</p>
<p><a href="https://www.slideshare.net/palloc/character-level-convolutional-neural-network" target="_blank">Character Level Convolutional Neural Networkによる悪性文字列検知手法 (SlideShare)</a><br />
フィルタつくるのにも便利そう。</p>
<p><a href="http://sssslide.com/speakerdeck.com/bokeneko/retty-tech-night-number-1-bokeneko" target="_blank">Retty Tech Night #1 bokeneko (SSSSLIDE)</a><br />
Character-level CNNに興味を持つきっかけになったスライド。キャッチコピーの自動生成がかなり面白いなーと思った。<br />
(文章の自動生成でよくWord2vec→RNNやLSTMあたりが挙げられるものの、こちらは結構壊滅的な文章が生成されてしまうケースが多い印象)</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1548">Character-level Convolutional Neural Networkについて調べてみた</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1548/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>
	</channel>
</rss>
