''same_kind'>>>ということで、backward()したとたんに叱られた。要素数1だと大丈夫だったのだが、複数個に対してはダメなんだ。何か悪いことをしたらしい。次回までに原因を考えることにし、今日はここまで。TweetDLするためには、微分して勾配を求める必要がある。いうことで、まず、簡単な微分をしてみよう。Chainerを動かすためには、まず最初に色々なものをimportしなければならない。「おまじない」だと思って、プログラムの最初に書いておこう。L微分するためには、まず変数を作らないといけない。それも、Pythonの変数ではなく、Chainerの変数として作らないといけない。そのために、ちゃんとVariableをimportしているので、さっそくやってみよう。'float'>>>>エラーメッセージから、Variableに直接5.0を与えてはだめで、型がnumpy.ndarrayかcuda.ndarrayになっていないとダメらしい。微分は、y.backward()にて行われている。forward処理が行われ、y.dataに値が求まっていて、f(5)=16が確認できる。x.gradに入り、yのメンバーの何かに入るのではない。今回は、yに含まれる変数がxただ1つだったが、DLでは多変数の微分(偏微分)が行われ、それぞれの変数の.gradに偏微分(微分係数)が入る。x=5のときの微分係数が求まるだけである。x=5のときの微分係数が8であることは、次のようにしても確かめられる。'numpy.float64'>という風に、全部float64になってしまった。DLでは精度はそれほど要らないので、とりあえずfloat32と思ったが、float16も用意されているので、使ってみた。'numpy.float16'>今回は簡単過ぎる微分だったので、次はもうちょっと高度な微分をやらせてみよう。Tweet新年を迎えたので、何か新しいことをしようということで選んでみたのがChainerである。Learing』がやたらに売れている。4万部を突破しているようだが、あの本を4万人もの人が読んで理解できるなら、日本のIT技術者の層は予想より遥かに厚かったことになるが、実際には人工知能ブームに流されて買っただけで積読状態ではないかと思っている。Learning(以下DL)でよく利用されている言語がPythonである。いっても、Pythonの基本部分ではなく、NumPyを始めとする拡張部分を使いまくってDLを実現している。Pythonの基本部分を使いこなすだけでDLのコードが書けるわけではない。勉強し、拡張機能を使えば、かなり簡単にDLを実現できるが、もっともっと安直に横着に怠惰に使いたいという人間の本性を満たすために、さまざまなフレームワークが提供されている。Googleが開発し公開したTensorFlowが一番有名で、日本語でも書籍が複数冊出ているようだ。ネット上でも、色々な情報が出ているようだ。いうことで、TensorFlowは避けることにした(笑)それで、何か別のものはないかと探して見つかったのがChainerというDLのフレームワークである。本家(http://chainer.org/)を知っておくべきだ。Networks社が作っている。スピンアウトといっても、役員が一緒なので、ベンチャーの企業内ベンチャーみたいなものだろうか。いう62ページのプレゼン資料もある。著者の得居誠也氏は、現役の東大の情報科学専攻の大学院生である。その他にもいろいろ資料がネット上にあるので、そのうち紹介しようと思う。DLでは海外のソフトが圧倒的に強いのだが、そういうのは避けて、日本発のを弄ることにした。インストールしなければいけないのだが、pipで簡単にインストールできる。バージョンを確認してみた。これで、とりあえず動いているらしいことが分かった。Tweet去年からAIブームが続いているが、同時に「データサイエンス」さらには「データサイエンティスト」という言葉もよく聞く。データサイエンスを学習するための本として、以前は統計学などの本が紹介されていたのだが、最近はタイトルに「データサイエンス」が直接入ることが多くなった。データサイエンスの本というと、やはり以下の、岩波書店の「岩波データサイエンス」を思い出す。全6巻の予定で刊行中であり、今までに4巻出ており、4ヶ月に1冊のペースで毎回データサイエンスにちなんだ特集を組んでいる。各冊、144ページが標準で、税込み1500円と、岩波書店にしては珍しいページ数であり、価格なのだ。データサイエンスをきっちり順番に勉強していくための学習書というより、データサイエンスとはどんなもので、どんな利用のされ方をしているかを紹介しているような、ちょっと雑誌的な構成になっている。毎回、異なるメンバーが、様々なトピックを紹介している。トピックを始めると難度が高くなり過ぎるので、最初に2,3本くらいの記事は、特集分野についての概説やら入門やらになっていて、この部分はかなり読みやすいことが多い。執筆者は、最先端の現場で働いているデータサイエンティストが多く、実例の紹介が並んでいる。こまかい説明が無かったりして、この本だけで理解するのは困難なことが多かったり、統計学の基礎ができていないと落ちこぼれたりすることもあるが、さまざまな情報源の紹介などもあるので、目を通すだけでも相当有益ではないかと思う。研究者などが協力して多様な分野をカバーしている。毎回出版記念トークショーを行い、多数の来場者が参加している。参加者の中には、本物のデータサイエンティストも多く、トークショーに参加することで、データサイエンスの現状、雰囲気を味わうことができる。トークショーはニコニコ動画で配信され、また過去の動画や、関連情報は「岩波データサイエンス・サポートページ」で見ることができる。いうことで、とても書評といえるような解説ではないが、内容が広範過ぎて、しっかり読んで書評を書くというのは最初からあきらめた。関係者の末席に傍観者としてトークショーを聞きに行くくらいなのだ。あ、忘れるところだった。弊社からも、毎回寄稿している。普段は2ページなのだが、第2巻では長いのを寄稿していた。本シリーズの内容のレベルの高さ、質などを考えると、なぜ増刷を重ねるほど売れてしまったのか、これが一番の謎である。データサイエンティストを目指している人がとても多いのではないか推察している。実際、データサイエンスがらみのショーに行くと、データサイエンティストという人がいて、いろいろコンサルしますという場面に去年くらいから出くわすことが多くなった。特集「スパースモデリングと多変量データ解析」で、2月中旬に発売のはずだ。Tweet前回、Boardクラスの説明をしたが、実はそれでほんとんど準備は済んでいる。前回のBoardクラスを利用することで、問題を解くのがSolverクラスで、初期化と解くクラスのたった2つのメソッドがあるだけ。コンストラクタについて。self.board.makeblanklist()問題が入った状態のBoardオブジェクトを与えて初期化が行われる。このとき、問題の空きマスのリストをsearchorderに入れる。searchorderは、名前の通り、マスをどの順番で調べるか(埋めていくか)の情報が入っている。solveには引数idxがあるが、このidxは最初に作った空きマスリスト(searchorder)の何番目の要素(空きマス)を次に調べるかを伝えている。Solver(bd).solve(0)と呼ばれていたが、solve(0)で、searchorderの最初のマスを試すことになる。searchorderを全部使いきっていたら全部埋まっているはずなので解が出来上がっているはずなのでプリントする。なければ、次に数字を試すマス(x,y)を求め、マス(x,y)に入れることができる数字のリストをpossiblesとし、可能な数字すべてについてforループで調べる。forループの中は、ます(x,y)に調べている数字cを置いて、次の空きマスを指示するためにidx+1を引数にして再帰呼出しをする。戻ってきたら、元の状態に戻すために、マス(x,y)からcを取り除く。これだけで、ちゃんと動く。再帰を使えば、簡単である。次の盤面は途中の状態をプリントしたものである。最初の空きマス(_)は、(7,6)のマスであるが、ここには1〜9のいずれも入れられないので、再帰はこの先に進まず、戻っていく。いうことで、ナンプレを解くプログラムの説明は終える。実際にナンプレを解くプログラムを作る場合、このような再帰呼出しで虱潰しはしない。これでは難易度が分からないし、それに遅い。各マス、各グループ(タテ列、ヨコ列、ブロック)に何が入っているかを集合で実現したが、もちろん集合は遅いので使わないのが普通だ。実際のナンプレ関連のプログラムでは、ビット演算を多用し高速化を実現する。使った数字を集合に入れていたが、実際は使える数字(まだ使っていない数字=候補)を管理することで解いていく。9x9のナンプレを解くのはとても簡単で、プログラミング初歩の練習問題である。頑張ってみたい場合は、16x16、25x25の問題を解くプログラムを作ってみよう。ナンプレを自動生成するプログラムを作ってみよう。Tweet盤面をクラスとして書く部分を今日は紹介する。クラス名はわかりやすく、Boardとした。最初に5つのメンバー変数を用意した。hconstのconstは定数ではなく制約constraintの省略形である。ヨコの制約が9組、タテの制約が9組、ブロックの制約が9組あるのを、集合のリストで表現し、使われている数字を集合に入れる。あとは、メソッドを色々用意した。Boardの初期化は、最初から数字のあるところをリストでもらい、setnumで順番にその数字を盤面にセットしていく。これで、初期化を終えることにする。問題を解くために、数字の入っていないマスをリストで持っておき、そのリストを見ながら数字を埋めたり剥いだりするとよい。そのために数字の入っていないマスのリストを作るのがmakeblanklistメソッド。xy2bは、(x,y)のマスが属するブロックの番号を返す。isusedは、(x,y)に数字nを入れられるかどうかを調べる。bconst[xy2b(x,y)])setnumは、(x,y)に数字nをセットする。盤面boardの(x,y)にnを入れる。タテ、ヨコ、ブロックの制約にもnを追加しておく。rmnumは、setnumの逆操作を行う。self.bconst[self.xy2b(x,y)].remove(n)possiblesは、(x,y)に入れられる数字の集合を返す。getは、盤面のboard[(x,y)]に入っている数字を返すのだが、存在しないとエラーになるので、存在チェックが行われている。0盤面をプリントするメソッドがprintである。説明の必要はないであろう。print()これだけ道具を用意し、あとは次回、解くためのクラスSolverを説明する。Tweet新年明けましておめでとうございます本年も技術的に尖ったこと、変なこと、色々紹介できればと思っております。正月休みということで、変なプログラミング三昧のエンジニアも多いかと思いますが、ちょっとプログラミングの話はお休みにして、プログラムを使って作っているものを紹介します。右の写真は、この12月16日に発売になったばかりの『VS人工知能難問ナンプレ』です。このナンプレ問題集は、タイトルにもあるように実際に人工知能、要するにプログラムを使って自動生成して作りました。いうより、我々というか、パズルの問題の既に多くの問題が人工知能技術により自動生成されています。将棋、囲碁が人工知能の脅威にさらされている昨今ですから、パズルの問題が人工知能によって作られていることに何の不思議もないでしょう。パズルの問題は人間が作るから良いという人も未だにいますが、もう遠い過去の思い出になってしまいました。人工知能が作った問題とパズル作家が頑張って作った問題の区別はできません。いや、凄い問題の方が人工知能で、普通のが作家という判断はかなり正しいのです。これは、囲碁や将棋で、人工知能が指す手が意味不明でプロ棋士も解説できないけれど、結局人工知能が勝ってしまうのと同様といえます。本書は、パズル作家と呼ばれる人々ではほとんど作るのが困難なような問題をできるだけ多く入れています。問題の数字の個数(ヒント数)が少ないだけの問題集は他にもありますが、ヒント数が少ない状態で難易度をきちんと調整し、配置にも美を重視しています。ヒント数が少ないと必ず難問になるという誤解も多いですが、そんなことはありません。難易度の調整が難しくなるだけで、本書でも、全部が難問ではなく、かなりやさしい中級レベルの問題から、本当に難しい問題まで、人工知能によりバランスよく作らせています。今は、人工知能と言うと何でもディープラーニングという考えがありますが、パズル問題の自動生成は別のタイプの人工知能を使うのが一般的です。人工知能は生物、人間をモデルにすることが多いのですが、超大雑把に言って、脳をモデルにしたのがディープラーニングで、生物の進化をモデルにしたのが進化的計算で、なかでも遺伝的アルゴリズムが有名です。遺伝的アルゴリズムはアルゴリズムや人工知能の授業でも普通に教えられることで、そのタイプの人工知能を利用してこの問題集も作られました。Pythonでナンプレを解く方法を書いている最中ですが、ナンプレを作るにはナンプレを解くプログラム(ソルバー)が必要ですが、問題作成中にソルバーを延々と呼び出すので、ソルバーはできるだけ高速でないといけません。そのため、Pythonは使っておらず、JavaやC/C++を利用しています。1ミリ秒程度で問題を解けないと、良い問題集を作るのは無理でしょう。いう背景を知った上で、本書で正月休み、さらにはその後の暇つぶしに本書を利用していただければ嬉しいかぎりです。お年寄りのボケ防止にもなるでしょう。母親がパズル好きというパターンは非常に多くなっています。親孝行にぜひ1冊いかがでしょうか。最初の2枚の写真は、本ができて送られてきた200冊の本をつかって、パズルタワーを作ったところです。昔、大手書店のスーパー書店員が多数売りたい本をこんな風に積み上げていたのを思い出して、つい作ったものです。本書を入手希望の方は、弊社入り口ロビーにこのタワーがありますので、タワーが倒れないように1冊持っていってください。万一倒れた場合には、積み直しておいていただければ助かります。検索このアーカイブについてこのページには、2017年1月に書かれたブログ記事が新しい順に公開されています。前のアーカイブは2016年12月です。次のアーカイブは2017年2月です。最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。