blogこの広告は、90日以上更新していないブログに表示しています。去る2018年12月10日に港区芝はポケットチェンジにてShibuya.lisp運営で集まって今年の振り返りと来年の活動方針について相談したのでまとめます。今年やったこと、達成できたことがんばらないこれは昨年1月に「Shibuya.lispの今後を考える会」で前運営からの引き継ぎにあたって基本方針として出てきたものなんですが、月例のLispmeetupはあくまで場を提供し続けることが重要であって、運営の負担は極力少なくして、とにかく続けられるようにしようというものがありました。その辺の方針については以下の記事に詳しく触れられています。4年間続いたShibuya.lispのLispMeetUpなぜShibuya.lispは成功し続けているのかここにも書かれていますが、会場を安定的に確保できたことは定期開催する上で非常に助かりました。最近ではほとんど五反田にあるサイボウズスタートアップスさんに会場を提供して頂いています。会場でそのまま懇親会を開くことができ、しかも軽食(ピザor寿司!)も出るという素晴しい会場です(感謝!)。ここはClojureの会社なので、懇親会中にClojureエンジニア募集のための会社紹介が入ります。そんなこんなでLispmeetupも70回を越え、Shibuya.lisp自体も今年で10周年に当たるそうです。今後もゆるい感じで続けていければと思います。発足十周年おめでとうポジションペーパーをやり始めたLispmeetupでは毎回最初に簡単な自己紹介の時間を取っています。口頭での自己紹介だけだと顔とID(アイコン)がなかなか一致しないという声があり、自己紹介スライド(ポジションペーパー)を一人一枚書いてもらい、それを映しながら話してもらうという試みを始めました。ここでネタを仕込んでもらうと発表の前に場が暖まってやりやすくなるなどと一部で好評です。これは続けていこうという話になりました。Lispもくもく会をやり始めた週末の午後などに多めに時間を取ってLisp関係の作業をするもくもく回を開催しています。5回ほど開催しており、今後は隔月開催で第二土曜に固定しようという話が出ています。参加者が少ないので周知が足りない気がする。リモート参加も可ですが、こちらはまだまだやり方など試行錯誤している状態のようです。会でもポジションペーパーを書いてもらってはどうか、など。Youtubeチャンネルを作った毎月のLispmeetupの模様は発表者の同意が得られれば録画しています。今までUstreamで配信していたのですが、このほどYoutubeに移行しました。生配信よりは録画に残すことに重点を置いています。音声がちゃんと録れていなかったりと試行錯誤しながらも徐々にちゃんと録画できるようになってきました。www.youtube.comチャンネル登録お願いします!来年やっていくことひきつづき、がんばらないがんばらないを、がんばる。開催日は毎月最終週木曜で固定した方が告知を早めに出しやすいし、発表者が予定を立てやすい。(Shibuya.lispアカウントに限らず)。実際よく発表している人はTwitterなどでせっつかれている印象です。発表者が固定してきた感があるので、新たな人を呼び込む策を講じる必要があるという話になりました。そのためには、軽くて短い発表をするLT枠を作るなどして、気軽に発表できる雰囲気を作っていかないといけないのでは?とか、会場を変えてみることで参加者層が変わるのでは?などといった意見が出ました。このうちのいくつかは実行に移していきたいと思っています。お知らせSlackを作りましたこれまでも運営用の連絡チャットはありましたが、プログラミング言語コミュニティではSlackなどを用意しているところも多く、Shibuya.lispでもSlackを公開することにしました。Lispに興味のある方であれば以下のリンクからどなたでも参加できます。Chromeで激遅問題Chromeでの表示が遅すぎる。pagesが使えるしかも無料で使える。pagesで公式サポートされているというjekyll-bootstrapを使う最近だとHugoというより生成が高速なGo製のツールもあるらしい記事はmarkdownで書く。org-modeで書きたいまとめ読み込みが長いと途中でタブを閉じてしまうユーザは多い。pagesに引っ越してChromeでの読み込み時間は0.5秒になった。機械学習ランダムフォレストは決定木ベースの分類/回帰モデルで、ニューラルネットやSVMなどと同様に非線形モデルなので線形分離不可能な問題にも使える。SVMはデータ数に対して指数的に計算時間がかかる一方、ランダムフォレストはデータ数をnとしてn*log(n)のオーダであり、軽い。SVMは基本的に二値分類器なので複数の学習器を組み合わせてマルチクラス分類することが多いが、ランダムフォレストは元からマルチクラスに対応していて追加のコストがかからない。並列化も簡単にできるなど、扱いやすい性質をたくさん備えているので現実世界でよく使われている。参考にしたランダムフォレストについての記事いろいろ実務でRandomForestを使ったときに聞かれたことパッケージユーザーのための機械学習(5):ランダムフォレスト【Hivemall入門】RandomForestで毒キノコ推定モデルを作るCLMLにランダムフォレストの実装があったので試してみる。Lisp用の機械学習パッケージ集であり、Quicklispからインストールできる。処理系のdynamic-space-sizeを2560以上にして起動しておく必要があることに注意する。先に必要ライブラリを読み込んでおく。:alexandria)データの読み込みまずはデータの読み込みの例。サンプルデータをネットからダウンロードしてきて読み込む。2)ここから分かるように、データセットは特徴量の各次元の名前のリストと、データ点を表すベクタのベクタを持っている。以下のようにして新たにデータセットを作れる。20))))データ点のベクタにラベルの文字列と数値が混在しているのが遅そう。LIBSVMデータセットのデータを読み込む今読んでるランダムフォレストのオンライン版の論文に出てくるものと同じデータセットで比較したいので、LIBSVMのデータセット集からmushroomsデータを読み込む。cl-online-learningのread-data関数で読み込んでCLMLの形式に変換する。予測したい特徴の名前が後で必要になってくるので、クラスラベルに"class"と名前を付けて、残りの特徴名には単に連番を振っておく。*mushrooms-test*))ランダムフォレストの学習lparallelを使って並列化しているので、まずカーネルサイズの設定をしておく。データセットから学習する。予測対象のクラスラベルの特徴名をここで指定する。consed4コアCPUで計算しているが、かなり時間がかかってしまっている。置き換えたものを学習済みのモデルとともにpredict-forest関数に与える。"nega"テストセットをまとめて予測するには、forest-validation関数を使う。0.04708098この返り値は、例えば"nega"のものを"posi"と判定したケースが100件あったということを意味する。残りは正解しているので正答率は95.3%程度となる。論文では99%くらい出るとあるのでちょっと低い。Hivemailでも99%くらい出る模様。0.041902073となってかなり高速になり、精度も若干上がった。consedこのデータセットではSCW-Iが比較的良い性能を出した。過学習しがちなので早めに止める必要がある。LispでかんたんWebスクレイピングLISPWebスクレイピングとはWebから情報を自動的に集めてくるクローラを実装するということである。これを実現するにはHTTPクライアントとHTMLパーサ、そしてパースされた木構造から必要な情報を探索、抽出するセレクタがあればいい。Lispにはそれぞれに複数のライブラリがあるが、今回はHTTPクライアントにDexador、HTML/XMLパーサにPlump、CSSセレクタにCLSSを使う。これらのライブラリは全てQuicklispから入る。DexadorまずHTTPクライアントでHTMLを取ってくる。これにはdexadorのget関数を使う。"http://jp.reuters.com/article/idJPL3N0U325520141219"))dex:getは取得したHTML文字列、ステータス、メタ情報のハッシュ表、URI、ストリームを多値で返す。Plump次に、plumpのparse関数でHTML文字列をパースする。これは木構造のルートに相当するCLOSオブジェクトを返す。{1006274133}>)このうちtext-nodeオブジェクトが文字列を持っている。木構造を走査してtext-nodeの持つ文字列だけを連結する関数を定義してみるとこうなる。text-list))))普通に再帰で書いても行数はあまり変わらないと思うが、せっかくtraverse関数が用意されていたので使ってみた。CLSSjQueryのように木構造からCSS要素を指定して部分木を抜いてくることができる。Plumpでパースした木からarticleTextというIDを持つ最初のノードを取り出すには以下のようにする。0))この部分木に対して先ほど定義したnode-textを使うと記事の本文が得られる。来週の東京株式市場は堅調な地合いが続く見通しだ。"同様に記事タイトルやジャンルなども取ってこられる。"Markets"まとめとか実際のページのソースを見てみると本文の部分はdivやspanが入り乱れているので単純な文字列のパターンマッチだとめんどくさそうに思えるが、HTMLをパースして木構造とすることで一気に扱いやすくなる。ブラウザのインスペクタでクラス/IDを調べてclss:selectで指定するだけなので簡単。ロイターの場合、サイトマップのXMLファイルがあるので上と同様に分析してURLのリストを取り出すことができる。2016参加記事ここ数年ディープラーニングの出現をきっかけにAIが再び盛り上がっているので、いよいよLispの復権があるかと思いきや、ないので(泣)、多少なりともLispに興味を持ってもらえるように、LispとAIの関係について私見を述べておこうと思う。Lispというとどうしても過去の記号処理的AIと結びつけられてしまい、機械学習を駆使するような現代のAIでは役に立たないように思われがちなのだが、これは大体誤解である。Lispは現代的なAI開発に適した特徴を備えている。AI実装のためのプログラミング言語に必要とされる特徴は何なのかを明らかにするために、AIの歴史から考えてみたい。初期の記号処理的AI(以降は記号AIと呼ぶ)ではLispやPrologが実装言語として広く採用されてきた歴史がある。記号処理とはその名の通り記号を操作対象とする処理のことで、具体的には、エキスパートシステム、数式処理、プログラミング言語のコンパイラなど、論理的な推論や構造の変換を伴うものが多い。それらの記号ベースのデータ構造はリストで表現されることが多かったので、リストの取り扱いを得意とするLispが採用されてきたわけだ。記号AIは一定の成功をおさめたが、現実世界の複雑な問題に適用しようとするとフレーム問題や記号接地問題の壁にぶち当たった。結局、古典的な記号AIでは事物の特徴をどのように取り出し、抽象化し、関連付ければいいのか、それをどこまでやったらいいのかといったことを解決できなかったのだ。現実世界でも適用可能な妥当なルールベースを作りこむことが難しいことが分かってきたので、その後は大量のデータからボトムアップ的に学習して自動的に知識表現を獲得してやろうという流れになり、ニューラルネットなどの機械学習手法が発達した。最近のディープラーニングなどはその延長線上にある。機械学習は数値計算ほとんどの機械学習のアルゴリズムは何らかの目的関数を最適化することによって学習を実現している。ニューラルネットの学習であれば、モデルからの予測値と実測値の誤差を目的関数として、その勾配(微分)を取り、誤差を最小化させる方向にモデルパラメータを少し動かすことを繰り返す。このことからも分かるように、記号AIのプログラミングはリスト処理が中心だったのに対して、機械学習AIのプログラミングは数値計算が中心となる。従って、複雑な数値計算をいかに簡潔に記述でき、いかに効率的に計算できるかがキモになる。