tag:blogger.com,1999:blog-68710164668644987112024-03-13T11:39:25.009+09:00人間と計算機Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-6871016466864498711.post-48160173895487495322017-06-26T19:48:00.003+09:002017-06-26T20:02:48.185+09:00TensorFlowのRNNのチュートリアル、translateの動作確認<h2>
概要</h2>
<p><a href="https://www.tensorflow.org/tutorials/seq2seq">Sequence-to-Sequence Models | TensorFlow</a>に記された通り、TensorFlow main repoとTensorFlow models repoをcloneした。続けてmodels/tutorials/rnn/translate/のtranslate.pyを実行しコーパスのダウンロード後、訓練を行った。3日前後<sup>*1</sup>でbucket 0、bucket 1のperplexity<sup>*2</sup>が1桁となったため、--decode引数を付加しtranslate.pyを実行した所、英文の仏訳が得られた。
</p>
<ul>
<li><sup>*1</sup> Mac Mini (Intel Core i5 2.3 GHz / Mem: 16GB / GPUなし)上で実行</li>
<li><sup>*2</sup> 言語モデルにおける次の単語の確率分布のばらつき see:「<a target="_blank" href="https://www.amazon.co.jp/gp/product/4061529242/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4061529242&linkCode=as2&tag=humansandco06-22&linkId=461af6be2ade93767e35da2ba2377b2c">深層学習による自然言語処理 (機械学習プロフェッショナルシリーズ)</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=humansandco06-22&l=am2&o=9&a=4061529242" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" class="noshadow"/>」p.53</li>
</ul>
<a name='more'></a><br />
<h3>
訓練開始時引数</h3>
<p>上掲TensorFlowチュートリアル内 <a href="https://www.tensorflow.org/tutorials/seq2seq#lets_run_it">Let's run it</a> 章で紹介された通りのパラメータを指定し、訓練を開始した。
</p>
<pre class="brush:shell; gutter:false">$ python translate.py --data_dir data --train_dir checkpoints --size=256 --num_layers=2 --steps_per_checkpoint=50
Preparing WMT data in data
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
Creating 2 layers of 256 units.
Created model with fresh parameters.
Reading development and training data (limit: 0).
reading data line 100000
(後略)
</pre>
<p>SSE4.1やAVX命令への非対応を示す警告が表示されているが、対応するにはTensorFlowのコンパイルに時間がかかるため、今回は無視した。
</p>
<h3>perplexityがsingle digitsに</h3>
<p>三日三晩訓練を続け <a href="https://www.tensorflow.org/tutorials/seq2seq#lets_run_it">Let's run it</a> に書かれた通り、perplexityが1桁になるまで待った。
</p>
<pre class="brush:shell; gutter:false">global step 5000 learning rate 0.4477 step-time 6.66 perplexity 44.09
eval: bucket 0 perplexity 26.66
eval: bucket 1 perplexity 27.62
eval: bucket 2 perplexity 38.82
eval: bucket 3 perplexity 41.83
(中略)
global step 10000 learning rate 0.4173 step-time 6.64 perplexity 17.19
eval: bucket 0 perplexity 14.07
eval: bucket 1 perplexity 15.41
eval: bucket 2 perplexity 16.36
eval: bucket 3 perplexity 18.33
(中略)
global step 25250 learning rate 0.2377 step-time 7.41 perplexity 8.76
eval: bucket 0 perplexity 8.25
eval: bucket 1 perplexity 8.48
eval: bucket 2 perplexity 8.10
eval: bucket 3 perplexity 9.54
</pre>
<p>bucket 0のperplexityが8.25、bucket 1は8.48まで減少した。</p>
<h3>decode結果</h3>
<pre class="brush:shell; gutter:false">$ python translate.py --decode --data_dir data --train_dir checkpoints --size=256 --num_layers=2
Reading model parameters from checkpoints/translate.ckpt-25250
> Who is the president of the United States?
Qui est la présidence des États-Unis ?
</pre>
<p>英文 "Who is the president of the United States?"が仏訳された。</p>
<h2>
注意点</h2>
<p>2017年6月23日時点で、このコードはTensorFlow バージョン1.2に対応していないので、下記のコマンド等でバージョン1.0を指定しインストールする。</p>
<br />
<pre class="brush:shell; gutter:false">$ pip install tensorflow==1.0
</pre>
decode時に訓練時に指定した引数、--size=256 --num_layers=2を忘れると、下記エラーとなるので注意。
<br />
<pre class="brush:shell; gutter:false">InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [2048,2048] rhs shape= [512,512]
[[Node: save/Assign_31 = Assign[T=DT_FLOAT, _class=["loc:@embedding_attention_seq2seq/rnn/multi_rnn_cell/cell_1/gru_cell/gates/weights"], use_locking=true, validate_shape=true, _device="/job:localhost/replica:0/task:0/cpu:0"](embedding_attention_seq2seq/rnn/multi_rnn_cell/cell_1/gru_cell/gates/weights, save/RestoreV2_31)]]
</pre>
<pre class="brush:shell; gutter:false">NotFoundError (see above for traceback): Key embedding_attention_seq2seq/rnn/multi_rnn_cell/cell_2/gru_cell/candidate/biases not found in checkpoint
[[Node: save/RestoreV2_32 = RestoreV2[dtypes=[DT_FLOAT], _device="/job:localhost/replica:0/task:0/cpu:0"](_recv_save/Const_0, save/RestoreV2_32/tensor_names, save/RestoreV2_32/shape_and_slices)]]
</pre>
Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-33915633471828482892016-05-04T22:41:00.001+09:002016-05-08T00:09:57.339+09:00Rでtwitterの検索結果から同表記異義語をフィルタする その3 集計とRStudio Projectファイル<p>この記事は<a href="http://humansandcomputers.blogspot.com/2016/05/word-sense-disambiguation-of-tweets-w-wikipedia-in-R-2.html">Rでtwitterの検索結果から同表記異義語をフィルタする その2 Wikipediaの記事抽出</a>のつづきです。</p>
<p>対象となる文書が集められたら、あとは集計するのみ。</p>
<h3>各クラスを特徴づける語彙のスコアを算出する</h3>
<p>RMeCabパッケージの <code>docMatrix</code> 関数を使用した。想像以上に簡単。</p>
<pre class="brush:r;">
tf_idf <- docMatrix(WIKIPEDIA_CONTENT_DIR, weight="tf*idf")
</pre>
<h3>データフレームから関心のない列を取り除く</h3>
<p>Rの <code>intersect(arg1, arg2)</code> 関数を使い、<code>arg1</code>と<code>arg2</code>双方に存在する文字列を名前にもつ列だけを取り出す。</p>
<pre class="brush:r;">
tf_idf <- tf_idf[,intersect(colnames(tf_idf),kTargetClasses)]
</pre>
<h3>データフレームにおいて特定の行名を持つ列のデータを操作する</h3>
<pre class="brush:r;">
tf_idf[Term=target_word,] <- (tf_idf[Term=target_word,] * 0)
</pre>
<h3>結果</h3>
<div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-usRcbog42fc/Vyn6V3DSkjI/AAAAAAAAI6Y/u4Wo7lqzGTg57jB8kWWrZUPdz1aBfIqFgCLcB/s1600/ogasawara-twitter-tfidf-classtering-result.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://2.bp.blogspot.com/-usRcbog42fc/Vyn6V3DSkjI/AAAAAAAAI6Y/u4Wo7lqzGTg57jB8kWWrZUPdz1aBfIqFgCLcB/s400/ogasawara-twitter-tfidf-classtering-result.png" class="noshadow"/></a></div>
<p>そのクラスに所属する確度(全クラスのスコアの合計で正規化した値)に対しヒューリスティックに設定した値(0.27)でフィルタリングした結果。検索結果に含まれるツイートを一つ一つ人手で分類するよりかは生産性が高そう。</p>
<h3 id="3391563347182848289-rproject-file">GitHubで公開したRStudio Projectファイルについて</h3>
<p>今回作成したRファイルをGitHubで公開しました。<br/><a href="https://github.com/arumtaunsaram/twitter-word-sense-disambiguation-w-tf-idf-of-wikipedia">twitter-word-sense-disambiguation-w-tf-idf-of-wikipedia
</a><br/>
<code>constants.R</code>ファイルを編集すると、お好きなキーワードで試すことができます。使い方については<code>README.md</code>ファイルとこの連載記事(<a href="http://humansandcomputers.blogspot.com/2016/05/word-sense-disambiguation-of-tweets-w-wikipedia-in-R-1.html">初回</a>)を参考にしてください。</p>
<h3>課題</h3>
<ul>
<li>Wikipediaに記事がない地味に有名な固有名詞は識別することができない。</li>
<li>抽出したい意味が、他の同表記語と比べて明らかに違う分類(例:抽出対象は地名で、他の同表記語は人名など)である場合、格フレームを活用した分類も有効に働くのではないか。</li>
</ul>
<h3>備忘</h3>
<ul>
<li>Rのapply関数便利。cbind等でテーブルを作ろうとすると、matrixができあがる。matrixだと複数のデータタイプを持たせるのに向いてない(numericだったmatrixに文字列から構成されるmatrixをcbindすると、numericだったデータがfactor型になって不等号を使用したフィルタリングができなくなる)</li>
<li>1行のみのデータに対しapplyを掛けたいときはlapply関数(list-apply?)を使用する。applyを使おうとすると次元数が足りないというエラーが出力されて止まる。</li>
</ul>Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-84228182828218065412016-05-03T21:10:00.002+09:002016-05-06T11:32:45.464+09:00Rでtwitterの検索結果から同表記異義語をフィルタする その2 Wikipediaの記事抽出<p>この記事は<a href="http://humansandcomputers.blogspot.com/2016/05/word-sense-disambiguation-of-tweets-w-wikipedia-in-R-1.html">Rでtwitterの検索結果から同表記異義語をフィルタする その1</a>のつづきです。</p>
<h3>RでWikipediaの記事を抽出する</h3>
<p><a href="https://cran.r-project.org/web/packages/WikipediR/">WikipediR</a> という便利なRパッケージがあったため、それを使う。WikipediR が提供する <code>text</code> というプロパティを使うと、Wikipediaの記事のヘッダやサイドバーを取り除いたHTMLが簡単に取得できるので便利。</p>
<p>それでも <code>text</code> が返却する文字には<a></a>の様なタグが含まれ、文章が途切れるので、<a href="https://cran.r-project.org/web/packages/xml2/">xml2</a> パッケージを使い、テキストのみを抽出した。</p>
<p>この後、RMeCabパッケージを使い、各記事に書かれた文書の特徴となる語彙リスト(tf-idf)を作成するが、この作業では対象となる文書をファイルで指定する必要があるため、変数<code>texts</code> に記憶されたデータをファイルに書き出した。</p>
<pre class="brush:r;">
install.packages("WikipediR")
install.packages("xml2")
library(WikipediR)
library(xml2)
page_name <- "小笠原諸島"
wp_html <- page_content("ja", "wikipedia", page_name=page_name)
# page_content関数は独自のpccontentクラスを返すため、
# その中のparse->text->"*"プロパティを明示しxml2ライブラリに文字列を渡す
tree <- read_html(wp_html$parse$text$"*", encoding="UTF-8")
content_text <- xml_find_all(tree, "//body//text()")
# content_text はxmlnode型のリストなので、テキストに変換する
# (xml2パッケージが提供するxml_text関数を使用)
texts <- sapply(content_text, xml_text)
# 改行のみ含まれる要素を削除する
texts <- texts[texts != "\n"]
# 保存先パスを生成する
file_path_and_name = file.path(WIKIPEDIA_CONTENT_DIR,
# 保存先ファイル名
paste(page_name, ".txt", sep=""))
# ファイルに保存する
write.table(texts, file=file_path_and_name, row.names=FALSE, quote=FALSE)
</pre>
<h3>備忘</h3>
<ul>
<li>最初はWikipediRを使わず、Wikimediaが提供する記事一覧のアーカイブ(<a href="https://dumps.wikimedia.org/jawiki/latest/">ここ</a>の jawiki-latest-pages-articles.xml.bz2)をダウンロードし、それを使用する予定であったが、Wiki文法を取り除き平文にするシンプルな方法がみつからなかった。</li>
<li>最終的にファイルに書き出すのであれば、ここの部分だけpythonなどで書いたほうが早かった気がする。</li>
</ul>
<h3>RでWikipediaの記事をランダムに抽出する</h3>
<p>扱う文書量が少ない場合、一般的な名詞、たとえば「りんご」がたまたまクラスAの文書だけに出現していると、たとえ「りんご」とクラスAとの関連が弱い場合でも「りんご」が出現するツイートはクラスAに重み付けされて評価されてしまう。</p>
<p>こういった事態を避けるため、収集する文書を増やし、各クラスに含まれる一般的な語彙はなるべく打ち消されるようにした(tf-idf)。</p>
<p>WikipediRはランダムにWikipediaの記事を取得する <code>random_page</code> という関数を提供しており、これを利用した。はじめ <code>namespace</code> 引数の指定を省略して実行すると、Wikipediaの改版履歴など意図とは異なるページも取得したため、<a href="https://www.mediawiki.org/wiki/Manual:Namespace#Built-in_namespaces">Built-in namespaces</a> を参考に、記事(0)のみを指定するようにした。</p>
<pre class="brush:r;">
wp_html <- random_page("ja", "wikipedia",
# 記事のみを対象とする(会話ノートやテンプレートページを含めない)
namespaces = list(0))
</pre>
<p><a href="http://humansandcomputers.blogspot.jp/2016/05/word-sense-disambiguation-of-tweets-w-wikipedia-in-R-3.html">Rでtwitterの検索結果から同表記異義語をフィルタする その3 集計とRStudio Projectファイル</a>に続きます。</p>Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-21907133230115280392016-05-03T20:35:00.001+09:002016-10-10T12:00:03.521+09:00Rでtwitterの検索結果から同表記異義語をフィルタする その1<h2>背景</h2>
<p>
twitterにおいて検索キーワードを指定し、そのキーワードを含むツイート一覧結果を受け取っても、違う意味の言葉が入ってくる。たとえば、検索したい人物を指し示す固有名詞を入力しても、同じ名字を持つ他の人物や、地名もヒットしてしまう。なんとかして固有名詞を更に詳細に区分できないだろうか。</p>
<p>今回は、東京都の小笠原に関するツイート調べるつもりで「小笠原」で検索した場合、野球やサッカーの小笠原選手に関するツイートもヒットしてしまう問題を取り扱い、小笠原選手に関するツイートを取り除く方法を考察する。</p>
<h2>方針</h2>
<div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Xqzgj-otCv8/VynfPvLzriI/AAAAAAAAI6M/9o5JlW0Tl7EFoI87enkvqArq2Ww1MBcagCKgB/s1600/ogasawara.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://1.bp.blogspot.com/-Xqzgj-otCv8/VynfPvLzriI/AAAAAAAAI6M/9o5JlW0Tl7EFoI87enkvqArq2Ww1MBcagCKgB/s320/ogasawara.png" class="noshadow"/></a></div>
<p>(検証中)Wikipediaの記事を使い、東京都の小笠原と一緒に出現しやすい語彙一覧、野球の小笠原選手と一緒に出現しやすい語彙一覧、サッカーの小笠原選手と一緒に出現しやすい語彙一覧をそれぞれ作成する。</p>
<p>その後「小笠原」を含むツイートにて、そのツイート内の語彙から、どの小笠原に所属するツイートかを判定する。</p>
<p>自然言語処理の分野において、この手のタスクは曖昧語義性解消(Word Sense Disambiguation)と呼ばれる。Wikipediaを用いたアルゴリズムも既にいくつか発表されてるようだが、一方である書籍によれば「(意味解析は)実用レベルの性能には達しておらず,フリーのツールというものもいまのところ存在しない<sup>1</sup>」と記され、実際すぐに使えるツールというのもないようだ。<br />
<sup>1</sup>奥村 2010 p.81<br />
</p>
<h2>ツール</h2>
<p>
PythonでもRでも達成できそうで、どちらを使うか迷ったが、今後個人的にRを使う予定があるので勉強の意味も兼ねRを採用した。<br />
</p>
<h2>手順</h2>
<h3>twitteRのセットアップ</h3>
<p>フィルタリング対象となるツイートを収集するため、パッケージを利用する。
</p>
<pre class="brush:r;">install.packages("twitterR")
Warning in install.packages :
package ‘twitterR’ is not available (for R version 3.2.4)
</pre>
<p>
早速twitterのデータ取得に使うライブラリが利用不可のようで、あせる。
問題は単純で、パッケージ名は "twitter R" ではなく "twitteR" 。</p>
<p>
<a href="http://www.r-bloggers.com/setting-up-the-twitter-r-package-for-text-analytics/" target="_blank">Setting up the Twitter R package for text analytics | R-bloggers</a> を参考にtwitter appを新規作成し、そのappのconsumer keyなどを setup_twitter_oauth 関数を使い twitteR に設定。下記コマンドでツイートが収集できることを確認した。</p>
<pre class="brush:r;">
searchTwitter("小笠原")
</pre>
<p><a href="http://humansandcomputers.blogspot.jp/2016/05/word-sense-disambiguation-of-tweets-w-wikipedia-in-R-2.html">Rでtwitterの検索結果から同表記異義語をフィルタする その2 Wikipediaの記事抽出</a>に続きます。</p>
<p>今回使用したRファイルをGitHubで公開しました。<a href="http://humansandcomputers.blogspot.jp/2016/05/word-sense-disambiguation-of-tweets-w-wikipedia-in-R-3.html#3391563347182848289-rproject-file">その3 集計とRStudio Projectファイル</a></p>
<h2>参考書籍</h2>
<ul>
<li>奥村学(2010)『<a href="//www.amazon.co.jp/gp/product/4339024511/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4339024511&linkCode=as2&tag=humansandco06-22">自然言語処理の基礎</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=humansandco06-22&l=as2&o=9&a=4339024511" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" class="noshadow"/>』コロナ社</li>
</ul>
<iframe src="//rcm-fe.amazon-adsystem.com/e/cm?t=humansandco06-22&o=9&p=8&l=as1&asins=4339024511&ref=tf_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-74487857506557531252016-01-03T14:15:00.002+09:002016-05-08T00:11:29.676+09:00再帰型ニューラルネットの一種、LSTMをsynaptic.jsで試す<h2>再帰型ニューラルネット</h2>
<p>再帰型ニューラルネットは回帰(型)ニューラルネット、あるいは循環ニューラルネットと訳されることもあるがどちらも同じもの<sup>1</sup>。再帰型ニューラルネットワークとは、内部に閉路をもつニューラルネットの総称<sup>2</sup>。<br/>
<br />
<sup>1</sup>岡谷 2015 p.112<br />
<sup>2</sup>岡谷 2015 p.114<br />
</p>
<h2>synaptic.js</h2>
<p>synaptic.jsはアーキテクチャによらないJavaScriptのnode.jsおよびブラウザ向けのライブラリ。<br/>
今回はDemoとして公開されている下記Discrete Sequence Recallを試す。</p>
<p><a href="http://synaptic.juancazala.com/#/dsr">Discrete Sequence Recall</a> (処理に時間が掛かるためPCブラウザでの閲覧を推奨)</p>
<p>このデモでは入力として色で分けられた●からなるSequenceを受け取り、灰色<span style="color:#808080">●</span>、黒色●(いずれもPromptsクラス)を受け取った時に水色<span style="color:#3A87AD">●</span>と緑色<span style="color:#468847">●</span>(Targets)を、Sequence内の<strong>順番通り</strong>に出力する。Sequenceの中には、Targets、Promptsいずれにも含まれないDistractors(<span style="color:#C09853">●</span><span style="color:B94A48">●</span>)が含まれる。このネットワークはどれがTargetsか、Promptsか、Distractorsかを事前に知らない。
</p>
<pre class="brush:javascript; gutter:false">
var LSTM = new Architect.LSTM(6,7,2);
LSTM.trainer.DSR({
targets: [2,4],
distractors: [3,5],
prompts: [0,1],
length: 10
});
</pre>
<h2>Architest.LSTM</h2>
<p>
<a href="https://github.com/cazala/synaptic/blob/master/src/architect.js#L51">ソースコード</a><br/>
Synaptic.jsが提供する<a href="https://github.com/cazala/synaptic/blob/master/src/layer.js">Layerオブジェクト</a>を活用し、ネットワークの構築が下記の様に行われる。peepholesが何を意味しているのかは不明。<br/>
architest.js 90行目-159行目<br/>
<script src="https://gist-it.appspot.com/github/cazala/synaptic/blob/master/src/architect.js?slice=90:159"></script>
architest.js 165行目-173行目<br/>
<script src="https://gist-it.appspot.com/github/cazala/synaptic/blob/master/src/architect.js?slice=165:173"></script>
165行目以降で新たに作成するTrainerオブジェクトのプロパティ値を用意する。new Trainer()の第一引数として指定された値は、Trainerのnetworkプロパティとなる。
</p>
<h2>Trainer.DSR</h2>
<p>
<a href="https://github.com/cazala/synaptic/blob/master/src/trainer.js#L334">ソースコード</a><br/>
iterationの値(規定値:100000)の数だけ、シーケンスの作成、訓練を行う。
</p>
<h2>"TRY ANOTHER SEQUENCE"ボタンをクリックした時の挙動</h2>
<a href="http://synaptic.juancazala.com/scripts/controllers/dsr.js">ソースコード</a>
<p>validate関数が呼び出される。その後一連の手続きを経て(next関数に入る)新たなinput配列が生成され、それを引数として <a href="https://github.com/cazala/synaptic/blob/master/src/network.js#L24">LSTM.activate</a>が呼び出される。LSTM.activateはpredictionを返却し、このpredictionを引数としvalue関数を呼び出すと、その戻り値としてLSTMの出力が何番目のTargetsに当たるのかが得られる(Targetの出力がない場合はvalue関数の戻り値が"none"となる)。<br/>
next関数はinput, output行を出力する度に呼び出される。そのためnext関数内で実行されるLSTM.activateもその分だけ呼び出しを受ける。
</p>
<h2>参考書籍</h2>
<ul>
<li>岡谷貴之(2015)『<a href="//www.amazon.co.jp/gp/product/4061529021/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4061529021&linkCode=as2&tag=humansandco06-22">深層学習 </a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=humansandco06-22&l=as2&o=9&a=4061529021" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" class="noshadow" />
』(機械学習プロフェッショナルシリーズ)講談社</li>
</ul>
<iframe src="//rcm-fe.amazon-adsystem.com/e/cm?t=humansandco06-22&o=9&p=8&l=as1&asins=4061529021&ref=qf_sp_asin_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-72525941308826191232015-08-22T22:59:00.000+09:002016-05-03T22:36:37.002+09:00Deep Learning のフレームワーク Chainer を使った画像分類 その4<p>前回記事: <a href="http://humansandcomputers.blogspot.jp/2015/07/deep-learning-chainer-3.html">Deep Learning のフレームワーク Chainer を使った画像分類 その3</a></p>
<p>最初から: <a href="http://humansandcomputers.blogspot.jp/2015/07/deep-learning-chainer-1.html">Deep Learning のフレームワーク Chainer を使った画像分類 その1</a></p>
<h2>Optimizer</h2>
<p>train_mnist.py 58-60行目</p>
<pre class="brush:python; gutter:false">
# Setup optimizer
optimizer = optimizers.Adam()
optimizer.setup(model.collect_parameters())
</pre>
<p>
optimizerはこの後、訓練中に前述の関数 forward より返却された F.softmax_cross_entropy() の戻り値(オブジェクト)に対し backward() された(83行目)後に optimizer.update() される(関数名末尾の括弧は関数の実行を示す)。<a href="http://chainer.readthedocs.org/en/latest/reference/core/optimizer.html#chainer.Optimizer">Optimizerはパラメータと勾配からなりたち、update()を実行するたびに、対応する勾配にもとづき、パラメータを更新する。</a></p>
<p>勾配について、学習のゴールは、誤差関数 E(w) に対し最小値を与える重み w を求める事だが、E(w) は一般に凸関数ではなく、大域的な最小解を直接得るのは通常不可能<sup>1</sup>。
代わりに E(w) の局所的な極小点 w を考えるが、E(w) の極小点は一般に多数存在するので、たまたまみつけた局所的な極小点が E(w) の大域的な極小解とは限らない<sup>1</sup>。それでも E(w) の値がある程度小さいなら、クラス分類の問題をそれなりにうまく解決できるという様に考える<sup>1</sup>。このとき、勾配とは<br/>
<img src="http://chart.apis.google.com/chart?chf=bg,s,fffff0&cht=tx&chl=%5Cnabla%20E%20%5Cequiv%20%5Cfrac%7B%5Cpartial%20E%7D%7B%5Cpartial%20w%7D%20%3D%20%5Cbegin%7Bbmatrix%7D%20%5Cfrac%7B%5Cpartial%20E%7D%7B%5Cpartial%20w_%7B1%7D%7D%20%5C%5C%20%5Cvdots%20%5C%5C%20%5Cfrac%7B%5Cpartial%20E%7D%7B%5Cpartial%20w_%7BM%7D%7D%5Cend%7Bbmatrix%7D" class="noshadow"/><br/>
というベクトル(Mはwの成分数)<sup>1</sup>。
<!-- TODO: ベクトルが勾配ということはどういうことか -->
</p>
<p>今回、train_mnist.py は Optimizer として <a href="http://arxiv.org/abs/1412.6980">Adam法</a>を使用する。理由、その他理論については不明。<a href="http://chainer.readthedocs.org/en/latest/tutorial/basic.html#optimizer">なお、Chainer のチュートリアルにおいてはSGD(確率的勾配降下法)が利用されている。</a>
</p>
<p><a href="http://chainer.readthedocs.org/en/latest/reference/core/optimizer.html?highlight=setup#chainer.Optimizer.setup">setup 関数は与えられたパラメータ/勾配に対し状態(?)を準備する</a>。<a href="http://chainer.readthedocs.org/en/latest/tutorial/basic.html#optimizer">Optimizerはパラメータと勾配を実際に管理している関数を知らないので、一度パラメータと勾配を指定したら、forword と backward を通して同じパラメータと勾配を使用する必要がある。</a>
<p><sup>1</sup>岡谷 2015 p.24</p>
<h2>エポックの走査(パラメータの更新)・訓練・訓練結果のテスト</h2>
<h3>訓練</h3>
<p>train_mnist.py 62-90行目</p>
<pre class="brush:python; gutter:false">
# Learning loop
for epoch in six.moves.range(1, n_epoch + 1):
print('epoch', epoch)
# training
perm = np.random.permutation(N)
sum_accuracy = 0
sum_loss = 0
for i in six.moves.range(0, N, batchsize):
x_batch = x_train[perm[i:i + batchsize]]
y_batch = y_train[perm[i:i + batchsize]]
if args.gpu >= 0:
x_batch = cuda.to_gpu(x_batch)
y_batch = cuda.to_gpu(y_batch)
optimizer.zero_grads()
loss, acc = forward(x_batch, y_batch)
loss.backward()
optimizer.update()
sum_loss += float(cuda.to_cpu(loss.data)) * batchsize
sum_accuracy += float(cuda.to_cpu(acc.data)) * batchsize
print('train mean loss={}, accuracy={}'.format(
sum_loss / N, sum_accuracy / N))
</pre>
<p>train_mnist.py 24行目で指定されたエポック回数(20回)分、訓練と訓練の評価を繰り返す(forループ)。<a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.permutation.html#numpy.random.permutation">np.random.permutation</a> 関数を使い毎回N(=60000← train_mnist.py 35行目より, =訓練用データの量)までの数値をランダムに並び替えた順列を生成し、その順列 perm を使い x_train および y_train よりデータセットを選択しているため、毎回対象となるデータが異なる。エポックとは岡谷 2015 p.28 によると「パラメータ更新回数」と同義の様に読み取れる。</p>
<p>np.random.permutation(N) より訓練が開始される。</p>
<p>訓練の結果のネットワークの性能を代入する sum_accuracy および sum_loss 変数の0による初期化に続き、さらに内側の forループが開始される。このループは0〜N(=60000)までを batchsize (=100) で刻んだ分だけ繰り返し、i には繰り返すごとに、0, 100, 200, .. , 59000 までの値が代入される。</p>
<p>訓練用データ x_train、y_train から x_batch および y_batch にランダムに batchsize (=100) 分のデータが代入される。GPU(一部のPCに入っている並列計算が得意なCPU)を使う場合は、データをGPUに転送する。</p>
<p>optimizer.zero_grad 関数で<a href="http://docs.chainer.org/en/stable/tutorial/basic.html?highlight=zero_grads#optimizer"> optimizer が管理する勾配のベクトルをゼロで初期化し</a>、あらかじめ train_mnist.py の中で定義した forward 関数を実行する。</p>
<p>forward 関数では、その第一戻り値として <a href="http://docs.chainer.org/en/stable/reference/functions.html#chainer.functions.softmax_cross_entropy">F.softmax_cross_entropy</a> の実行時の戻り値を指定した。そのため、変数 loss は関数 F.softmax_cross_entropy が返却する <a href="http://docs.chainer.org/en/stable/reference/core/variable.html#chainer.Variable">chainer.Variable</a>型となる。loss.backward()では chainer.Variable が提供する関数 <a href="http://docs.chainer.org/en/stable/reference/core/variable.html#chainer.Variable.backward">chainer.Variable.backward</a> が実行される。この backward 関数は誤差逆伝搬を行う。「誤差逆伝搬」とは「順伝播」型ネットワークよりも効率的にネットワークの重みとバイアスに関する誤差関数の微分を計算する方法の1つ<sup>1</sup>。この前に forward 関数を使い順伝播を行っているにも関わらず、あらためて「逆」伝搬を行う事に違和感も感じるが、「順伝播(各層における入力 u = Wx + B、出力 z = f(u) の計算)を行った後に最終層の出力を使い、逆方向に(デルタを使い<sup>2</sup>)各層のパラメータに関する微分の式を求める」のが、誤差逆伝搬による誤差勾配の計算手順<sup>3</sup>。</p>
<p>その後 optimizer に対し、関数 <a href="http://docs.chainer.org/en/stable/reference/core/optimizer.html#chainer.Optimizer.update">update</a> を実行し、対応する勾配を使いすべてのパラメータと状態(?)を更新する。</p>
<p>内包されたforループの最後の処理として、今回の損失と正確さを変数、sum_loss と sum_accuray にあらかじめ代入されていた値に加算する形で記録する。</p>
<p><sup>1</sup>参考: 岡谷 2015 p.41, <sup>2</sup>岡谷 2015 p.46, <sup>3</sup>岡谷 2015 p.48</p>
<h3>訓練結果のテスト</h3>
<p>train_mnist.py 92-100行目</p>
<pre class="brush:python; gutter:false">
# forループ内手続き宣言の続き
# evaluation
sum_accuracy = 0
sum_loss = 0
for i in six.moves.range(0, N_test, batchsize):
x_batch = x_test[i:i + batchsize]
y_batch = y_test[i:i + batchsize]
if args.gpu >= 0:
x_batch = cuda.to_gpu(x_batch)
y_batch = cuda.to_gpu(y_batch)
loss, acc = forward(x_batch, y_batch, train=False)
sum_loss += float(cuda.to_cpu(loss.data)) * batchsize
sum_accuracy += float(cuda.to_cpu(acc.data)) * batchsize
print('test mean loss={}, accuracy={}'.format(
sum_loss / N_test, sum_accuracy / N_test))
</pre>
<p>訓練で調整されたパラメータを持つネットワークを使い、テスト用データでネットワークの性能のチェックを行う。forward関数を実行する際に、訓練時とは異なり train 引数の値として False を指定する。Falseを指定した場合、関数 forward の内部にて関数 <a href="http://docs.chainer.org/en/stable/reference/functions.html#chainer.functions.dropout">F.dropout</a> の引数 train の値がFalseとなり、ドロップアウトが無効化される。</p>
<h2>参考書籍</h2>
<ul>
<li>岡谷貴之(2015)『<a href="http://www.amazon.co.jp/gp/product/4061529021/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4061529021&linkCode=as2&tag=humansandco06-22">深層学習 </a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=humansandco06-22&l=as2&o=9&a=4061529021" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" class="noshadow" />
』(機械学習プロフェッショナルシリーズ)講談社</li>
</ul>
<iframe src="//rcm-fe.amazon-adsystem.com/e/cm?t=humansandco06-22&o=9&p=8&l=as1&asins=4061529021&ref=qf_sp_asin_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-70051885076505882852015-08-09T21:26:00.000+09:002015-08-22T23:11:20.458+09:00Deep Learning のフレームワーク Chainer を使った画像分類 その3<p>前回記事: <a href="http://humansandcomputers.blogspot.jp/2015/07/deep-learning-chainer-2.html">Deep Learning のフレームワーク Chainer を使った画像分類 その2</a></p>
<p>最初から: <a href="http://humansandcomputers.blogspot.jp/2015/07/deep-learning-chainer-1.html">Deep Learning のフレームワーク Chainer を使った画像分類 その1</a></p>
<h2>ネットワーク内伝搬手順の定義</h2>
<p>train_mnist.py 51-56行目</p>
<pre class="brush:python; gutter:false">
# Neural net architecture
def forward(x_data, y_data, train=True):
x, t = chainer.Variable(x_data), chainer.Variable(y_data)
h1 = F.dropout(F.relu(model.l1(x)), train=train)
h2 = F.dropout(F.relu(model.l2(h1)), train=train)
y = model.l3(h2)
return F.softmax_cross_entropy(y, t), F.accuracy(y, t)
</pre>
<p>このforward関数はこの後、<!-- イテレーション回数はまどろこしくなるので省略:エポックにつき、訓練時は訓練データ数(今回は60000データ, train_mnist.py 32行目で指定)をバッチサイズで割った回数、訓練後の評価時は全体の数から60000を引いたあまりをバッチサイズで割った回数直接実行される。エポックとは岡谷 2015 p.25にてエポック学習(=バッチ学習)の紹介があるが、この場合、一般名詞としての試行回数位の意味かと推測される。バッチサイズについては後述(予定)。-->train_mnist.py内82, 102行目で直接参照し実行される。実行時、第一引数 x_data には画像データが指定され、第二引数 y_data には分類の答えのデータが指定される。</p>
<p>forward関数内ではまず、引数 x_data と y_data 両方をchainer.Variable()で包み込み、追跡可能としている(→<a href="http://chainer.readthedocs.org/en/latest/reference/core/variable.html#chainer.Variable">chainer.Variable</a>)。x_data はl1〜l3層を通り、最終的に変数 y となる。l1〜l2を通る際、relu関数を使った活性化とドロップアウトがなされる。</p>
<p>活性化関数とは、ユニットが受け取る入力u=w<sub>1</sub>x<sub>1</sub>+w<sub>2</sub>x<sub>2</sub>+w<sub>3</sub>x<sub>3</sub>+w<sub>4</sub>x<sub>4</sub>+bより出力zを生成する関数f。z=f(u)。活性化関数は古くは出力が0~1に収まる、ロジスティックシグモイド関数あるいはロジスティック関数と呼ばれる<img class="noshadow" src="http://chart.apis.google.com/chart?chf=bg,s,fffff0&cht=tx&chl=f(x)%3D%5Cfrac%7B1%7D%7B1%2Be%5E%7B-u%7D%7D"/>が使われてきたが、近年では入力が0以上であれば出力もそれに従って増加する(0以下の場合は0となる)正規化線形関数(Rectified linear function)<img class="noshadow" src="http://chart.apis.google.com/chart?chf=bg,s,fffff0&cht=tx&chl=f(x)%3Dmax(u%2C%200)">がより良い結果が得られ、また計算量が小さいためよく用いられている<sup>1</sup>。この関数をもつユニットはReLU(Rectified Linear Unit)と呼ばれる<sup>1</sup></p>
<p>ドロップアウトとは学習時にネットワークの自由度を強制的に小さくし、過適合を避ける方法の1つ。具体的には学習時に出力層以外の層のユニットについて決まった割合pで選出しその他を無効化する。pは層ごとに異なる値を指定しても構わない<sup>2</sup>。過適合(=過剰適合, 過学習)とは訓練後にネットワークの性能をテストした際に、パラメータ更新回数を増やすにつれ、テストの誤差が大きくなってしまう状態<sup>3</sup>。</p>
<p>forward関数は最終的に、多クラス分類の誤差関数(損失関数, loss function, とも呼ばれる<sup>4</sup>)である交差エントロピー式の算出結果と、<a href="http://chainer.readthedocs.org/en/latest/tutorial/basic.html#example-multi-layer-perceptron-on-mnist">このミニバッチの分類の正確さ</a>を返却(return)する。</p>
<p><sup>1</sup>参考: 岡谷2015 p.10-11, <sup>2</sup>岡谷2015 p.31, <sup>3</sup>岡谷2015 p.28, <sup>4</sup>岡谷2015 p.15</p>
<p>次回、<a href="http://humansandcomputers.blogspot.jp/2015/08/auto-image-classification-w-deep-learning-framework-chainer-4.html">Optimizerとは何か、学習と学習結果の評価手順を紐解く。→Deep Learning のフレームワーク Chainer を使った画像分類 その3</a></p>
<h2>参考書籍</h2>
<ul>
<li>岡谷貴之(2015)『深層学習』(機械学習プロフェッショナルシリーズ)講談社</li>
</ul>
<iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=humansandco06-22&o=9&p=8&l=as1&asins=4061529021&ref=qf_sp_asin_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-72195488479686113242015-07-20T21:11:00.001+09:002016-05-03T22:36:03.744+09:00Deep Learning のフレームワーク Chainer を使った画像分類 その2<h2>入力データの構造</h2>
<h3>six パッケージ</h3>
<p><a href="http://humansandcomputers.blogspot.jp/2015/07/deep-learning-chainer-1.html">前回、Deep Learning のフレームワーク Chainer を使った画像分類その1</a>にてインストールしたパッケージ、sixとは何だったのか。train_mnist.py 内にてファイル mnist.pkl の読み込みに使われていたので調査。結論としては six は <a href="https://pythonhosted.org/six/">Python 2 と Python 3 の違いを吸収するユーティリティ</a>。恐らく 2 と 3 を乗算して six (推測)。</p>
<h3>データフォーマット</h3>
<p>ファイル mnist.pkl は下記のように読み込まれている(train_mnist.py 30行目)。</p>
<pre class="brush:python; gutter:false">
mnist = six.moves.cPickle.load(mnist_pickle)
</pre>
<p><a href="https://docs.python.org/2/library/pickle.html">PickleはPythonオブジェクトのシリアライズを行うモジュール</a>で、<a href="https://docs.python.org/2/library/pickle.html#module-cPickle">cPickleはC言語でそれが実装された高速版</a>。</p>
<p>なお、<a href="https://en.wikipedia.org/wiki/MNIST_database">MNISTとはアメリカ国立標準技術研究所が提供するデータを元に作られた手書き数字のデータベース</a>。(→<a href="http://yann.lecun.com/exdb/mnist/">配布元</a>)</p>
<h2>多層パーセプトロンの作成</h2>
<p>(train_mnist.py 43-45行目)</p>
<pre class="brush:python; gutter:false">
# Prepare multi-layer perceptron model
model = chainer.FunctionSet(l1=F.Linear(784, n_units),
l2=F.Linear(n_units, n_units),
l3=F.Linear(n_units, 10))
</pre>
<p>
<a href="http://chainer.readthedocs.org/en/latest/tutorial/basic.html#parameterized-functions">Chainerが提供するLinear関数は数式<br/>
<img class="noshadow" src="http://chart.apis.google.com/chart?cht=tx&chl=f(x)%3DWx%2Bb"><br/>
(行列Wとベクトルbはパラメータ)を示す。</a>ニューラルネットワークのうち、「最も基本的かつ最もよく使われている」順伝播型ネットワーク(=多層パーセプトロン)において、ある層のあるユニットの入力をx<sub>1</sub>〜x<sub>4</sub>とすると、このユニットが受け取る受け取る総入力uは<br />
u = w<sub>1</sub>x<sub>1</sub>+w<sub>2</sub>x<sub>2</sub>+w<sub>3</sub>x<sub>3</sub>+w<sub>4</sub>x<sub>4</sub>+b<br>
と表される<sup>1</sup>。wは重み(weight)とよばれ、各入力に異なる重みづけがなされる。これにバイアスbを足したものが総入力<sup>1</sup>。第1層のユニットをi=1,...,I、第2層のユニットをj=1,...,Jで表すと、第1層のユニットの出力xと第2層のユニットの入力uは、ベクトルと行列を用いて表記すると<br/>
<img class="noshadow" src="http://chart.apis.google.com/chart?cht=tx&chl=u%3DWx%2Bb"><br/>
この時、<br/>
<!-- 2つの画像を1つにしようとするとURLが長すぎ画像が生成されないため分割 -->
<img class="noshadow" src="http://chart.apis.google.com/chart?cht=tx&chl=u%3D%5Cbegin%7Bbmatrix%7Du_%7B1%7D%5C%5C%5Cvdots%5C%5Cu_%7BJ%7D%5Cend%7Bbmatrix%7D%2C%20x%3D%5Cbegin%7Bbmatrix%7Dx_%7B1%7D%5C%5C%5Cvdots%5C%5Cx_%7BI%7D%5Cend%7Bbmatrix%7D%2C%20b%3D%5Cbegin%7Bbmatrix%7Db_%7B1%7D%5C%5C%5Cvdots%5C%5Cb_%7BJ%7D%5Cend%7Bbmatrix%7D%2C"><img class="noshadow" src="http://chart.apis.google.com/chart?cht=tx&chl=W%3D%5Cbegin%7Bbmatrix%7Dw_%7B11%7D%26%5Ccdots%26w_%7B1I%7D%5C%5C%5Cvdots%26%5Cddots%26%5Cvdots%5C%5Cw_%7BJ1%7D%26%5Ccdots%26w_%7BJI%7D%5Cend%7Bbmatrix%7D"><br/><sup>2</sup>。<br/>
<a href="http://chainer.readthedocs.org/en/latest/tutorial/basic.html#parameterized-functions">Liner関数はデフォルトの挙動ではWはランダムに初期化されるが、bはゼロで初期化される</a>。また<a href="http://chainer.readthedocs.org/en/latest/reference/functions.html#chainer.functions.Linear">Liner関数の第一引数は入力ベクトルの次元数、第二引数は出力ベクトルの次元数。</a>
</p>
<p>
<a href="">Chainerが提供するFunctionSet関数は、複数のパラメータ化された関数の管理を行う。この関数は単純なオブジェクトの様に振るまい、指定されたキーワード引数は下記のようにそのオブジェクトの属性となる。</a>
</p>
<pre class="brush:python; gutter:false">
model = FunctionSet(
l1 = F.Linear(4, 3),
l2 = F.Linear(3, 2))
model.l1
// <chainer.functions.linear.Linear object at..>
</pre>
<p>以上より、下記の形のネットワークが形成された。</p>
<a href="http://1.bp.blogspot.com/-NL63dgc3zx0/VazhG6G6UgI/AAAAAAAAIyE/beJQiWTU65A/s1600/deep-learning-chainer-train_mnist-network.png" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-NL63dgc3zx0/VazhG6G6UgI/AAAAAAAAIyE/beJQiWTU65A/s320/deep-learning-chainer-train_mnist-network.png" /></a><br />
<p>次回、<strike>Optimizerと</strike><a href="http://humansandcomputers.blogspot.jp/2015/08/deep-learning-chainer-3.html">ドロップアウト、交差エントロピーをはじめとする伝搬手順の定義。→Deep Learning のフレームワーク Chainer を使った画像分類 その3</a></p>
<p><sup>1</sup>参考: 岡谷2015 p.7-8, <sup>2</sup>参考: 岡谷2015 p.9</p>
<h2>参考書籍</h2>
<ul>
<li>岡谷貴之(2015)『<a href="http://www.amazon.co.jp/gp/product/4061529021/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4061529021&linkCode=as2&tag=humansandco06-22">深層学習 </a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=humansandco06-22&l=as2&o=9&a=4061529021" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" class="noshadow" />
』(機械学習プロフェッショナルシリーズ)講談社</li>
</ul>
<iframe src="https://rcm-fe.amazon-adsystem.com/e/cm?t=humansandco06-22&o=9&p=8&l=as1&asins=4061529021&ref=qf_sp_asin_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-83525526913204204472015-07-18T00:29:00.000+09:002015-07-18T00:40:31.275+09:00C言語における局所変数とグローバル変数の確保過程<h2>
きっかけ</h2>
C言語にて構造体を新規作成し返却する関数を書いてた際、malloc関数で領域を確保する必要があると聞いた。もし確保しなければ、戻り先でこの関数が作成した構造体が使えないとのこと。<br />
例:<br />
<pre class="brush:cpp; gutter:false">struct str1 func1(void)
{
struct str1 target;
memset(&target, 0 sizeof(str1));
target.member = 1;
return target;
}
int main(void)
{
struct str1 retval = func1();
// str1 は使えない
}
</pre>
参照さえあれば変数が生き延びるJavaと大分勝手が違う。また「〜と聞いた」と濁してるのは、私がC言語の言語仕様の当たり方に慣れていないため。C99 にあたる <a href="http://www.jisc.go.jp/app/pager?id=64626">JISX3010</a> は探し当てることができたが、いずれ「どの言語仕様」が理由で「malloc関数で領域を確保する必要がある」と言い切りたい。<a name='more'></a>
<h2>結論</h2>
関数内変数(自動変数と呼ばれる<sup>1</sup>)はその関数が呼び出された際にアプリケーションのメモリ空間中スタック内に確保され、関数を抜ける時にleave命令が下されるとスタックから削除される。mallocが行われた場合どうなるかは宿題。<br />
<sup>1</sup> 参考: 橋本他 p.189<br />
<h2>アセンブラにおける関数呼び出し</h2>
<p>下記の様なC言語のコードを考える。</p>
<pre class="brush:cpp; gutter:false">int main(void)
{
func(2, 3);
}
</pre>
<p>funcが実行される時、スタック領域に対し次の手順が行われる。</p>
<ol>
<li>右(最後尾)から順に引数をスタック領域に積み上げる(push OPコード)</li>
<li>funcの実行を終えた後の戻り先コード領域のアドレスをさらにスタック領域に積み上げ、%eip を func の命令コードに移動させる(call OPコード)<sup>6</sup></li>
<li>func内容の実行に先立ち、現在の %esp の内容が %ebp にコピーされる<sup>8</sup></li>
<li>funcの中で自動変数(static変数は含まれない)の確保が行われている場合、スタック領域の上に追加されていく。この時自動変数は%ebp+nの形で表現される。<sup>8</sup></li>
<li>ret OPコードの前段階としてleave OPコードが実行される。これに伴い %ebp が元に戻り自動変数が解放される<sup>9</sup></li>
<li>func内の処理がreturnに至った時、スタック領域に保存された戻り先に %eip を戻す(ret OPコード)<sup>6</sup></li>
<li>引数の数(上記コードの場合2と3の2つ)だけpopを行いスタック領域の帳尻合わせを行う。このコードはアセンブラで引数の数に基づき手動で調整される必要がある<sup>7</sup></li>
</ol>
<dl>
<dt>スタック領域</dt>
<dd>OSが実行中のプログラムに割り当てるメモリ空間の内訳にはコード領域、データ領域、スタック領域が存在する<sup>2</sup>。</dd><dd></dd>
<dt>レジスタ</dt>
<dd>CPUについてる演算用メモリ<sup>1</sup></dd><dd></dd>
<dt>%esp</dt>
<dd>Stack Pointer<sup>3</sup>. x86のレジスタ名称の一つ<sup>4</sup>。先頭の%はGAS(The GNU Assembler)において後に続く表現がレジスタ名であることを示す<sup>5</sup>。</dd>
<dt>%ebp</dt>
<dd>Base Pointer<sup>3</sup>. x86のレジスタ名称の一つ<sup>4</sup>。先頭の%は%espと同じ。
</dd>
<dt>%eip</dt>
<dd>x86のレジスタ名称の一つ<sup>4</sup>。Instruction Pointer. 「どこの命令をいま現在実行しているのかを指し示すレジスタである」。PC(Program Counter)と呼ばれることもある<sup>3</sup>。先頭の%は%espと同じ。</dd>
</dl>
<p><sup>1</sup> 参考: 橋本他 p.48-49 / <sup>2</sup> 参考: 橋本他 p.110 / <sup>3</sup> 参考: 橋本他 p.27 / <sup>4</sup> 参考: 橋本他 p.42 / <sup>5</sup> 参考: 橋本他 p.33 / <sup>6</sup> 参考: 橋本他 p.113 / <sup>7</sup> 参考: 橋本他 p.117 / <sup>8</sup> 参考: 橋本他 p.193 / <sup>9</sup> 参考: 橋本他 p.194</p>
<h2>
参考書籍</h2>
<ul>
<li>橋本洋志, 小林裕之, 冨永和人(平22)『組込みユーザのためのアセンブリ/C言語読本』オーム社</li>
</ul>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-fe.amazon-adsystem.com/e/cm?t=humansandco06-22&o=9&p=8&l=as1&asins=4274208710&ref=tf_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 240px; width: 120px;"></iframe>Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-84209711026582159902015-07-05T23:01:00.001+09:002015-07-06T19:45:01.727+09:00デフォルト・モード・ネットワーク (Default Mode Network)<span style="font-size: x-small;">この記事は、<a href="http://creativecommons.org/licenses/by-sa/3.0/">クリエイティブ・コモンズ・表示・継承ライセンス3.0</a>のもとで公表されたWIKIPEDIAの項目<a href="https://en.wikipedia.org/wiki/Default_mode_network">"Default Mode Network"</a> <a href="https://en.wikipedia.org/w/index.php?title=Default_mode_network&oldid=662460443">15:43, 15 May 2015版</a> の一部を邦訳し二次利用しています。この記事の著作権も同ライセンスを継承しますが、<b>明示的、暗示的問わず内容に関するいかなる保証もありません</b>。</span><br />
<br />
<br />
<div>
神経科学において、デフォルト・モード・ネットワーク(以下DMN)とは個人が外界に注意を払っていなく、かつその脳がウェイクフルな休憩にある時に活性化される脳の領域。デフォルト・ネットワーク、デフォルト・ステート・ネットワーク、タスク・ネガティブ・ネットワークとも呼ばれるDMNは、0.1Hz以下のコヒーレントな神経振動によって特徴付けられる。目標志向的な活動中、DMNは非活性化され、タスク・ポジティブ・ネットワーク(以下TPN)と呼ばれる別のネットワークが活性化される。DMNはタスクから独立した内観あるいは自己言及的な思考に相当し、一方でTPNは行動に相当する可能性がある。ゆえにDMNとTPNは「反相関関係にあるコンポーネントをもった一つのデフォルト・ネットワークの要素群と考えられる」可能性がある。
</div>
<div>
<br /></div>
<h2>
解剖学
</h2>
<div>
DMNは相互に結ばれ、かつ解剖学的に次のように定義される脳のシステム: 個人が白昼夢そして未来の予測、記憶の想起、他者の視点の推測のような、内省的なタスク取り組む時に優先して活性化される―。DFNは外界の視覚的な信号に注意を向ける脳のシステムと負の相関関係にある。DFNは記憶のために内側側頭葉の一部を、心の理論のために内側前頭前皮質の一部を、統御のために後帯状皮質を、隣接する腹側楔前部と内側、外側、下頭頂葉皮質と共に利用する。構造的そして機能的な接続性でDFNは極めて高い一致を示しているとみられており、これは脳の構造的な基本的設計は、この特定のネットワークが他の精神的な活動が処理されてない限り通常状態で活性化されるという様な方針の上に成り立っていることを示唆している。幼児の脳においてはこのデフォルトネットワークの証拠は限定的だが、デフォルトネットワークの接続性は9歳~12歳では強固となり、デフォルトネットワークは発達にともなう変化を行うことが示されている。</div>
<h2>
機能
</h2>
<div>
DMNの機能ははっきりしていない。しかしこのネットワークの活動は、注意や遂行機能に使用される領域の活動と負の相関関係がある。ヒトにおいてはこのDMNは心が散漫としている(mind-wandering)時の自発的な思考を創出すると仮説付けられ、また想像力に関連する可能性がある。一方で、デフォルトモードの活動は特定のどの思考にも結びつかない、脳内をゆく潜在的な生理学上の過程を示しているかもしれない。</div>
<h2>
病態生理学
</h2>
<div>
DMNはアルツハイマー病、自閉症、統合失調症、うつ、慢性疼痛などの病気と関連すると仮説付けられている。特に、認識的に困難な課題におけるDMNの非活性化の失敗は自閉症に、活動過剰時の失敗は統合失調症に関連付けられている。アルツハイマー病ではこのデフォルト・ネットワークはアミロイドβの生成によって優先的に破壊される。児童虐待等の長期のトラウマを経験した人においては、このデフォルト・ネットワークの低い接続性が発見されている。PTSDを経験した人の間では後部帯状回において、活性度の低調がみられた。このデフォルト・ネットワークの過剰な結合はうつ病の反芻思考と慢性疼痛に結び付けられている。</div>
<h2>
批判
</h2>
<div>
「デフォルト・ネットワーク」の考えは例外なく受け入れられているわけではない。特定の「困難な」課題を行っている脳よりも休んでいる脳がより処理していることに対するより単純な仮説があるということ、また休んでいる脳の活動と本質的な違いがないという理由から脳の機能を理解するにあたり、このデフォルト・モードのコンセプトは有用ではないという批判が2007年になされた。</div>
<h3>
更新履歴
</h3>
<table>
<tr>
<th>版</th>
<th>更改内容</th>
<th>更改日付(JST)</th>
<th>更改内容</th>
</tr>
<tr>
<td>1</td>
<td>新規作成</td>
<td>2015年7月5日</td>
<td>新規作成</td>
</tr>
<tr>
<td>2</td>
<td>更新</td>
<td>2015年7月6日</td>
<td>demanding taskの訳を修正</td>
</tr>
</table> Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-44345331960963672112015-07-04T21:55:00.000+09:002016-06-07T21:45:40.259+09:00神経科学・脳科学・心理学略語集学習の過程で登場した用語を整理するためまとめてます。
<br />
<h2>
部位</h2>
<table>
<tbody>
<tr>
<th>省略形</th>
<th>原形</th>
<th>日本語</th>
<th>簡単な説明</th>
</tr>
<tr>
<td>IPS</td>
<td>Intraparietal Sulcus</td>
<td><ruby>頭頂間溝<rp>(</rp><rt>とうちょうかんこう</rt><rp>)</rp></ruby></td>
<td><a href="https://ja.wikipedia.org/wiki/%E9%A0%AD%E9%A0%82%E9%96%93%E6%BA%9D" target="_blank">Wikipedia</a></td>
</tr>
<tr>
<td>FEF</td>
<td>Frontal Eye Fields</td>
<td>前頭眼野</td>
<td>サッケード運動の発生に関与する</td>
</tr>
<tr>
<td>MT area</td>
<td>(Middle Temporal lobe: 中側頭葉, ※MT野はマカクザルの中側頭葉内に存在することに由来する領野)</td>
<td>MT野</td>
<td>=V5野. 対象物の動きの視覚処理を行っていると考えられる。</td>
</tr>
<tr>
<td>MT+</td>
<td>MT complex</td>
<td>MT+野</td>
<td>MTとMT+の違いについては <a href="http://glial.psych.wisc.edu/vision/research.php" target="_blank">The Rokers Vision Laboratory at the University of Wisconsin - Madison</a> 内記述より推測</td>
</tr>
<tr>
<td>MPF</td>
<td>Medial Prefrontal Cortex</td>
<td><ruby>内側前頭前野<rp>(</rp><rt>ないそくぜんとうぜんや</rt><rp>)</rp></ruby></td>
<td><a href="https://en.wikipedia.org/wiki/MPF" target="_blank">MPF - Wikipedia</a></td>
</tr>
<tr>
<td>PCC</td>
<td>Posterior Cingulate Cortex</td>
<td><ruby>後帯状皮質<rp>(</rp><rt>こうたいじょうひしつ</rt><rp>)</rp></ruby></td>
<td><a href="https://ja.wikipedia.org/wiki/%E5%BE%8C%E5%B8%AF%E7%8A%B6%E7%9A%AE%E8%B3%AA" target="_blank">Wikipedia</a></td>
</tr>
<tr>
<td>LP</td>
<td>Lateral Preoptic nucleus?</td>
<td>外側視索前核?</td>
<td><a href="https://books.google.co.jp/books?id=Nog4A-F54ZMC&lpg=PA681&ots=Wf3-D2IFCE&dq=area-LP%20brain&pg=PA681#v=onepage&q&f=false" target="_blank">LP = Lateral Proptic area?</a> <a href="https://en.wikipedia.org/wiki/Preoptic_area" target="_blank">Preoptic Area</a> 視索前核を含む<a href="https://ja.wikipedia.org/wiki/%E8%A6%96%E5%BA%8A%E4%B8%8B%E9%83%A8" target="_blank">視床下部</a></td>
</tr>
<tr>
<td>SMA</td>
<td>Supplementary motor area</td>
<td>補足運動野</td>
<td><a href="https://en.wikipedia.org/wiki/Supplementary_motor_area">Supplementary motor area - Wikipedia</a> <a href="http://www.nips.ac.jp/sysnp/kiteikaku/top04.htm" target="_blank">大脳基底核の神経回路網</a></td>
</tr>
<tr>
<td>RLPFC</td>
<td>Rostrolateral prefrontal cortex</td>
<td><ruby>吻側外側<rp>(</rp><rt>ふんそくがいそく</rt><rp>)</rp></ruby>の前頭前野皮質</td>
<td>
関連記事:<br>
<a href="http://neurosciencenews.com/rlpfc-task-cognition-neuroscience-2717/">Neural Taskmaster: How the Rostrolateral Prefrontal Cortex Keeps Us on Task</a>
</td>
</tr>
<tr>
<td>SC</td>
<td>Superior colliculus</td>
<td>上丘</td>
<td>
関連記事:<br>
<a href="http://neurosciencenews.com/sensory-simultaneity-neuroscience-4367/">How Judgment of Sensory Simultaneity May Develop in the Brain</a>
</td>
</tr>
</tbody></table>
<h2>
物質</h2>
<table>
<tbody>
<tr>
<th>省略形</th>
<th>原形</th>
<th>日本語</th>
<th>簡単な説明</th>
</tr>
<tr>
<td>CSF</td>
<td>Cerebrospinal Fluid</td>
<td><ruby>脳脊髄液<rp>(</rp><rt>のうせきずいえき</rt><rp>)</rp></ruby></td>
<td><a href="http://www.amazon.co.jp/gp/product/4890133569/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4890133569&linkCode=as2&tag=humansandco06-22" target="_blank">カラー版 ベアー コノーズ パラディーソ 神経科学―脳の探求</a> 初版 p.139</td>
</tr>
<tr>
<td>BDNF</td>
<td>Brain-derived Neurotrophic Factor</td>
<td>脳由来神経栄養因子</td>
<td><a href="https://ja.wikipedia.org/wiki/%E8%84%B3%E7%94%B1%E6%9D%A5%E7%A5%9E%E7%B5%8C%E6%A0%84%E9%A4%8A%E5%9B%A0%E5%AD%90" target="_blank">Wikipedia</a><br/>関連記事:<br>
<a href="neurosciencenews.com/bdnf-exercise-neuroscience-4362/">Mice on Wheels Show How Exercise Benefits the Brain</a></td>
</tr>
<tr>
<td>DBHB</td>
<td>Beta-hydroxybutyrate</td>
<td>βヒドロキシ酪酸メチル</td>
<td>腎臓内で作られBDNF遺伝子を活性化させる。<a href="https://ja.wikipedia.org/wiki/%E8%84%B3%E7%94%B1%E6%9D%A5%E7%A5%9E%E7%B5%8C%E6%A0%84%E9%A4%8A%E5%9B%A0%E5%AD%90" target="_blank">Wikipedia</a><br/>関連記事:<br>
<a href="neurosciencenews.com/bdnf-exercise-neuroscience-4362/">Mice on Wheels Show How Exercise Benefits the Brain</a></td>
</tr>
<tr>
<td>HDAC</td>
<td>Histone Deacetylase Complexes</td>
<td></td>
<td>DBHBは、「HDACがBDNF遺伝子環境を変化させBDNFの生成を抑制し」ない様にすると<a href="neurosciencenews.com/bdnf-exercise-neuroscience-4362/">主張されている</a></td>
</tr>
</tbody></table>
<h2>
機能</h2>
<table>
<tbody>
<tr>
<th>省略形</th>
<th>原形</th>
<th>日本語</th>
<th>簡単な説明</th>
</tr>
<tr>
<td>DMN</td>
<td>Default Mode Network</td>
<td>デフォルト・モード・ネットワーク</td>
<td></td>
</tr>
<tr>
<td>TPN</td>
<td>Task Positive Network</td>
<td>タスク・ポジティブ・ネットワーク</td>
<td></td>
</tr>
</tbody></table>
<h2>
関連部位</h2>
<h2>
関連物質</h2>
<h2>
関連機能</h2>Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-83933700882917441442015-07-01T21:31:00.001+09:002015-08-09T21:33:27.279+09:00Deep Learning のフレームワーク Chainer を使った画像分類 その1<h4>Chainerについては下記</h4>
<ul>
<li><a href="http://chainer.org/">Chainer</a></li>
<li><a href="http://research.preferred.jp/2015/06/deep-learning-chainer/">Deep Learning のフレームワーク Chainer を公開しました</a></li>
</ul>
<h4>環境</h4>
<ul>
<li>Mac OSX 10.7.5</li>
<li>Chainer 1.0.1</li>
</ul>
<h4>
セットアップからサンプルコード挙動確認まで</h4>
<pre class="brush:bash; gutter:false">
$ sudo pip install virtualenv
$ virtualenv .
$ source bin/activate
$ # Pythonの参照先が書き換わる事を確認
$ which python
~/Documents/chainer_workspace/bin/python
# Pythonのバージョン確認。Chainerで[必要とされるのは Python 2.7+](http://research.preferred.jp/2015/06/deep-learning-chainer/)
$ python --version
Python 2.7.1
$ # QUICK START (http://chainer.org/) を参考にChainerをインストール
$ pip install chainer
~~省略~~
Successfully built chainer
Installing collected packages: numpy, chainer
Successfully installed chainer-1.0.1 numpy-1.9.2
$ # サンプルコードの実行
$ git clone https://github.com/pfnet/chainer.git
$ python chainer/examples/mnist/train_mnist.py
Traceback (most recent call last):
File "chainer/examples/mnist/train_mnist.py", line 11, in <module>
import six
ImportError: No module named six
$ # とりあえず QUICK START で必要 (requires) と記載されたパッケージをインストール
$ pip install scikit-learn
~~省略~~
Installing collected packages: scikit-learn
Successfully installed scikit-learn-0.16.1
$ pip install scipy
~~省略~~
Installing collected packages: scipy
Successfully installed scipy-0.15.1
$ python chainer/examples/mnist/train_mnist.py
Traceback (most recent call last):
File "chainer/examples/mnist/train_mnist.py", line 11, in <module>
import six
ImportError: No module named six
$ # フォーラムを探索。[Can't run the MNIST example](https://groups.google.com/forum/#!topic/chainer/pkIVsfPtL4c) それっぽいのを発見。sixというパッケージをインストールする必要があるよう。
$ pip install six
~~省略~~
Installing collected packages: six
Successfully installed six-1.9.0
$ python chainer/examples/mnist/train_mnist.py
load MNIST dataset
Traceback (most recent call last):
File "chainer/examples/mnist/train_mnist.py", line 29, in <module>
with open('mnist.pkl', 'rb') as mnist_pickle:
IOError: [Errno 2] No such file or directory: 'mnist.pkl
$ find . -name "mnist.pkl"
$ # mnist.pklは存在せず
$ ls chainer/examples/mnist/
README.md train_mnist.py
download_convert.py train_mnist_model_parallel.py
$ # download_convert.py がデータを取得するスクリプトと思われるので実行
$ cd chainer/examples/mnist/
$ python download_convert.py
Downloading train-images-idx3-ubyte.gz...
Done
Downloading train-labels-idx1-ubyte.gz...
Done
Downloading t10k-images-idx3-ubyte.gz...
Done
Downloading t10k-labels-idx1-ubyte.gz...
Done
Converting training data...
Done
Converting test data...
Done
Save output...
Done
Convert completed
$ python train_mnist.py
load MNIST dataset
('epoch', 1)
train mean loss=0.27741594178, accuracy=0.914916668298
test mean loss=0.117256106085, accuracy=0.963500005007
('epoch', 2)
train mean loss=0.138578489823, accuracy=0.957850001852
test mean loss=0.0929322862427, accuracy=0.970500005484
...
$ # 動いた
</pre>
次回、<a href="http://humansandcomputers.blogspot.jp/2015/07/deep-learning-chainer-2.html">train_mnist.py で行われていることの解析。→Deep Learning のフレームワーク Chainer を使った画像分類 その2</a>Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-45423009924838427502015-04-15T15:33:00.002+09:002015-04-15T20:07:49.278+09:00脳で浮気心をコントロールしうる神経伝達物質、バゾプレッシン<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.freedigitalphotos.net/images/Couplespartners_g216-Love_Triangle_p112052.html" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img class="eyecatch-with-attribution" border="0" src="http://2.bp.blogspot.com/-6Rd_mD_K2Rc/VS3vIoGYpQI/AAAAAAAAIvs/jvjODmnyZ2k/s1600/ID-100112052-affair.jpg" height="320" width="212" data-attribution="Image courtesy of marin at FreeDigitalPhotos.net" /></a></div>
<p>周囲の状況により関心の対象が変わるのは人として自然なことですが、大切な時はパートナーには一人の人間に集中してほしいもの。なぜ関心が移ろうのか、移ろう瞬間脳には何が起こっているのか、それを解明しようと以下の様な研究が行われたことがあります。</p>
<h3>
浮気症と一途な性格の比較</h3>
<p>まず、浮気症とそうでない性格に明確な区別があるのか、研究にあたってはこの差が重要になります。おもしろいことに、ハタネズミは体の構造は似通っていながら、住む地域によりその行動に明らかな差がみられます。草原に住むハタネズミは出産後、雌雄共に1つの巣に居住し、お互い協力して長い間子供の世話を見る一方、山地に住むハタネズミは出産後、男は子育てをまったくせず、女もまた子供が自立する前に限り子育てを行うという特徴があります。</p>
<h3>
男を一途にする物質とは?</h3>
<p>この性格の違いはどの様に生まれるのでしょう。脳の研究において、この問題を究明していく中で神経伝達物質の一つであるバゾプレッシンに注目が集まりました。バゾプレッシンはニューロン(神経細胞)間の情報の伝達に使われる物質の一種で、また同時に体内の血圧の降下と塩分濃度の上昇をきっかけに脳内の視床下部で血中に放出される物質です。</p>
<p>他の神経伝達物質の受容体の分布は草原に住む個体と浮気症の山地に住む個体の間で差は見られなかったものの、バゾプレッシン受容体の分布には草原に住む個体は一箇所に集中している一方で、浮気症の山地に住む個体では幅広い箇所に分布<sup>*1</sup>していました。</p>
<p>また驚くことに、草原に住む雄に新しい雌と出会った時にバゾプレッシンを投与すると、通常は交尾の後に雌と強い絆を形成しますが、この時は交尾することなしに強い絆が生まれたそうです。</p>
<p>まだ研究は未解明な部分が多いものの、この傾向は人間でも見られる様です。脳の状態をfMRIを使い調べてみると、母親が自分の子供の写真を見た時、脳内のバゾプレッシン受容体を多く含む部位が活性化された<sup>*2</sup>一方、知人の子供の写真ではバゾプレッシン受容体の活性化はみられなかったそうです。</p>
<br />
<br />
*1 分布図: <a href="http://www.cell.com/trends/neurosciences/abstract/S0166-2236(97)01167-3">Young LJ, Wang Z, Insel TR. 1998. Neuroendocrine bases of monogamy. Trends in Neurosciences 12:71-75</a><br />
*2 同様の研究がすすめられているオキシトシンの受容体にも同じ様な活性化がみられた。<br />
<br />
[学習メモ]<br />
<br />
[参考文献]<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-fe.amazon-adsystem.com/e/cm?t=humansandcomp-22&o=9&p=8&l=as1&asins=4890133569&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 240px; width: 120px;"></iframe>
Mark F. Bear, Barry W. Connors, Michael A. Paradiso, 加藤宏司(訳), 後藤薫(訳), 藤井聡(訳), 山崎良彦(訳), 金子健也(訳)『神経科学 脳の探求』西村書店 2012Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0tag:blogger.com,1999:blog-6871016466864498711.post-72029776860390788402015-01-01T20:27:00.000+09:002015-07-18T00:20:04.953+09:00はじめに<br />
<ul>
<li>ヒトの感情やその生理的基盤に興味を持った1人のSEの学習の記録です。</li>
<li>医学部を出たわけでも生物学を専攻していたわけでもありません。訳の間違いや論理の飛躍等も多分にあるかと思います。内容については保証できませんのであしからず。 </li>
<li>手持ちの本やアクセス可能なWebサイトをベースにまとめています。原典が示されていれば一緒に掲載していきたい方針ですが、原文の確認はしたいと思った時にしていきます。</li>
<li>PCやスマートフォンをはじめとする液晶画面で眼精疲労が溜まる生活です。将来的にもっと自然な形で、知識のインプットができるようになるといいです。</li>
</ul>
Yuki Kumazawahttp://www.blogger.com/profile/02732359089477018247noreply@blogger.com0