TweetせっかくChainerについて書いているのだが、微分とか、まるで数学の基礎を説明していると読んでいて飽きるだろう。方法が知りたいであろう。いうことで、突然ではあるが、紹介した『Chainerによる実践深層学習』は、書籍中のプログラムも公開されているので、それを利用しながら話を進めようと思う。どこへ行ってもIrisの種の分類だ。簡単に使えるようになっているので、Chainerに限らず、多数の書籍の最初のDLのデータがIrisになっている。ここでも、そのままIrisのデータを用い、3種のIrisの種の分類をやってみる。プログラム全体はここでは示さない。『Chainerによる実践深層学習』から、プログラムのアーカイブをダウンロードして見て欲しい。いう短い簡単なプログラムについて説明する。以下に、そのプログラムの、初期化、学習ループ、学習結果の評価の部分だけを掲載する。適当に変更しているので、オリジナルとは若干違う。3で動くように、printのところは変更している。こんな感じで、プログラムを走らせる度に、学習成果(テストデータの正解率)が異なった。いっても、いずれも90%を超える正解率になっているので、かなり良い正解率といえるのではないだろうか。Learningでよく見る階層に分かれ、層間を多数の線で結んだ図を良く見るであろうが、それに対応するモデルの部分は示さなかった。プログラムの意味を解説するよりも、プログラムを勝手に変更したり、別のデータを入れるとどんなことになるかなど、真面目に勉強したい人はさっさと書籍を読むであろうから、興味の向くまま勝手な実験を進め、紹介しようと思っている。Tweetどうやら微分ができることが分かった。いっても、公式として覚えておくべきような簡単なものであった。今回は、もうちょっと複雑なのをやって、本当に微分できているか確かめよう。疑い深いのは重要なことである。難しい式を急に用意しようと思っても、思いつかない。いう時は、何かの本のを利用しよう。思って背面の本箱を見たら、何とマセマの『微分積分』があった。マセマについては、そのうち紹介しよう。p77の実践問題9の(2)の微分をしてみよう。cos(sin(x))以下、前回と同じで、式の部分が異なる。区間を20等分してxに入れる。以下、前回と同じで、式の部分が異なる。dtype=float16)これで、ちゃんと微分ができているような気がする。cos(sin(x))の微分を計算してみよう。・・・ん、どうすれば良いのだろう。いう時のために、ネットがある。WolframAlphaを使えば、式だけ与えれば、微分だけでなく積分もしてくれる。WolframAlphaによると、となる。これ以外にも、ネット上にはこんな便利なモノがいっぱい転がっている。これを元に、検算をしてみた。dy.data))0.0複雑なのでもできるようだ。この微分で重要なことは、普通のPythonの関数を使うのではなく、chainerで用意されている関数を使わないといけない。1変数関数をやってきたが、DLは多変数関数というか、超多変数関数を偏微分しないといけないのだ。次は、そういうことをしようか、でもどうなるかは気分次第。Tweet前回、変数を配列にしたらエラーがでてしまった。それで、やはりマニュアル、イントロなどを読まねばと非常にまともなことを考えて読み始めた。Computationに、配列を与えた場合の微分の例が見つかった。いうときは、初期勾配(全要素が1.0)を用意してからbackward()をやらないといけないらしい。それで、このように変更してみた。dtype=float16)これで、配列xの各値に対するsin(x)の微分係数が求まっているはず。sin(x)の微分はcos(x)なので確認しよう。dtype=float16)どうやら一致しているようだが、目視確認なんて面倒くさい。いうことで、こうやって確認した。dtype=float16)Lazyはプログラマの最大の美徳であることを忘れてはいけない。Lazyな確認方法により信頼性が一気に向上した。これで、どうやらsin(x)の微分はできているみたいだが、こんな簡単な微分ができたから、Chainerの微分がちゃんと動作していると考えるのは甘いだろう。次からは、もっと複雑な関数を微分してみよう。書籍があるので紹介する。いっても、まだ一部しか試していない状況なので、とりあえず概要を書いておく。なんといっても、薄い。基本と、Chainerの基本的な使い方が示されているだけで50ページほどが終る。いっても、これだけのことを50ページで書いているので、かなりハイペースである。第2章のタイトルが「ニューラルネットのおさらい」であり、ニューラルネットのプログラミングに関してある程度の知識があることが前提になっていることが伺える。知識をある程度身につけていないと厳しいと思われる。Learning』などをまず読むと良いだろう。本書のプログラムは公開されており、とても便利である。変更が必要になるが、エラーを頼りに修正すれば簡単に済む範囲だ。いっても、まだ一部のプログラムを確かめただけだが。プログラムは、突然本格的なものを見せられると訳がわからなくなると思うが、本書には比較的簡単な例があり、自分で確かめることが容易である。ページ数が少ないので、道草をあまりしていない本になっている。プログラミングの実力をつけるためには、勝手にプログラムをあれこれ変更してみる必要があるのだが、そのベースとして使うにはとても都合が良さそうだ。最後は、ChainerからGPUを利用する方法の説明もある。CuPyの説明があり、これだけ使って、PythonからGPUを使えるようになると便利かも知れない。この技術者ブログでは、本書のプログラムも大いに参考にし、勝手に大幅にいじって、どんなことになってしまうか、紹介しようと思っている。要するに、本書は、この技術者ブログのネタ本の1つである。Tweet前回、特定の値に対する微分係数を求めた。Variable(np.array([5.0],dtype=np.float16))として変数xを用意したのだが、np.array([5.0])で、スカラーを要素数1個の配列でわざわざ与えた。いうことは、配列に対しても、そのまま動くのではないだろうか。区間内の複数の点に対して一気に計算してみよう。3.14159265])この配列を与えて、chainerの変数xを配列で作ってしまおう。dtype=float16)値が少々違うが、これはnp.float16としたため、精度が落ちているのでやむを得ないだろう。F.sin(x)にて配列xの各値に対して、まとめてsin(x)が求まるはずである。