Hatena::Groupbugrammer

蟲!虫!蟲!

Esehara Profile Site (by Heroku) / Github / bookable.jp (My Service)
過去の記事一覧はこちら

なにかあったら「えせはら あっと Gmail」まで送って頂ければ幸いです。
株式会社マリーチでは、Pythonやdjango、また自然言語処理を使ったお仕事を探しています

2013-07-03

[] この日記をはてなブログに移転します 21:25

 いつも見てくれている人はありがとうございます。本日を持って、技術系をメモするために使っていたこのブログは、はてなブログに移転しようと思います。アドレスは下になります。

 Line 1: Error: Invalid Blog('by Esehara' )

 単純に、書く場所が変わるだけです。はてなグループについては、いろいろと思うことはありますが、またの機会に書こうと思います。

2013-07-01

[]株式会社マリーチというPythonを扱うIT企業に入社してから一年となりました 21:16

 ふとしたキッカケで、「そういえば会社用のメールアドレスを頂いたのは何時頃だったっけなー」みたいなことを思って、会社用のメールボックスの一番最初のメールを見た処、6/28になっていました。なので、ほぼ一年ということになります。

 とはいえ、マリーチに入社する前は正社員の経験など一切無く、実は社員として継続的に働くのはこれが始めてであり、社員として働かせるのは、勇気があるなーとも思ってはしまいました。基本的には自由にさせてもらっているので、その部分に関しては、とても感謝しています。

 当然のことながら、一年間働けば、思いが違うところであったり、あるいは「それどうなの」みたいな不満があるところもありますが、それはともかくとして、今回は「会社と俺はどういう関係を持っているのか」という辺りのことと、あとはマリーチという会社に興味を持ってくれる人が増えて、何か面白げな仕事が入ることを祈りつつ、一社員として思うことを書きます。

f:id:nisemono_san:20130701211344p:image

 おっと、その前に株式会社マリーチについて説明すると、Pythondjangoを基本とし、自然言語処理であったり、あるいは検索周りのことを技術として勉強したりしています。その辺に関して、何かお仕事がございましたら、よろしくお願いします。

ピープルウェアという思想

 創造性とオフィスの関係については、難しいところではありますが、少なくとも人間というのは環境によって、モチベーションであったり、生産性が変わるものであるという部分はあるかと思われます。また、多少なりとも生物である以上、その生物的な構造によって支配されている部分は少なくともあるかと思います。

 なものだから、仕事をする上において、自分にとってモチベーションが上がるような環境というのはいったいなんだろう、ということを考えています。自分自身は、あまり意志の力というのを信じておらず、むしろ環境によって志向付けされるという考え方のほうが好きだったりします。

 その辺を解説している本として、有名なところだと『ピープルウエア 第2版 - ヤル気こそプロジェクト成功の鍵』があります。

 そんな感じで、自分がプログラマーとしてやっていくとするならば、まず何が必要かなーと考えた結果、『東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS』を使ったりしています。とりあえずは、毎日触りたくなるキーボードが必要であるな、という判断からでした。ちなみに、会社に鎮座するキーボードの姿は下から見ることが可能です。

f:id:nisemono_san:20130701210354p:image

空気は読まない/読めない

 マリーチでは一ヶ月に一回、社長が社員に対して振り返りをするのですが、そのときに「似非原さんは、いい意味で空気を読まないタイプだよね」という話をされました。

 「空気を読む」という行為については難しいところがありますが、まず「俺は空気が読めないんだぞーガオー」ということを認めながら、しかしその「空気の読まなさ」をどのように欠点ではなく、長所として使うべきなのか、ということを考えたりしていました。

 まず一つに、会社の習慣として、何か取り入れたら上手く廻りそうなことに関しては、率先して自分から一人でやり続けるということをやっています。例えば、以前のTry Paperテンプレートを作ったので公開します - 蟲!虫!蟲! - #!/usr/bin/bugrammer を会社のところに貼り付けたりしています。自分の仮説として、基本的に人と言うのは、自分の目標が達成されないというのを恥ずかしいと思うため、目標を貼り付ければ、その恥ずかしいという気持ちから、目標をなんとか達成しようとするのではないか、と思ったからなのでした。

f:id:nisemono_san:20130701210619p:image

 実際に、これは本当に一人しかやっていなかったことではあるのですが、最近だったりすると同僚もなにか目標を見つけて張り出しています。

 よくイノベーションを起こすコツとして引用される動画の一つに、「社会運動はどうやって起こすか」というTEDプレゼンがあります。どういう内容であるかは、記事に飛べば概要を掴んで頂けると思いますが、要するにまず何か一人でコツコツとやっていると、それが面白かったら周りの人が集まってくるというやつです。

 これは言われてみると、とても簡単なことではあるのですが、実際のところでどれだけ実践できるのかと言われると非常に難しいところではあります。たぶん、こういうのは本当に「空気が読めない」人間のほうが向いている気がするので、まあ自分がやるのがベターだなあ、なんてことを考えながら日々を過ごしています。

道具について考える

 その一方で、今の会社に入った理由みたいなのを考えると、オフィシャルページにある通り、基本的には「人間の知識というものに対してどのような形を与えるのか」ということに、自分の興味関心があったからでした。会社のオフィシャルページを見る限りだと、例えば僕はマーブルというプロダクトは好きだったからというのも一つの理由です。

 現状としての、自分の考えとして、インターネットと僕たち、私たちを考えるということは、結果としてその「道具」をどのようにして使うのかに関して関わってくるな、ということを思っています。例えば、普段使っている文房具について、紹介させて頂ければと思います。

f:id:nisemono_san:20130701210352p:image

 単純に自分が文房具マニアなだけなので、こういう風に集めてしまったというのもありますが、一覧すると、下のようになります。

 実は、このカードは京大カードではないのですが、あえてこちらにリンクを。

 自分の文房具オタクっぷりについては、また別の記事のときに語らせて頂くとして、どういう道具を使うのか、というのは、ユーザーインターフェイスの問題であったり、あるいは知識を如何にして形にするかということを考える上において、考えるのに有効であるなと。

 また、ノートに関しては、コーネル式のノートの取り方を参考にしています。コーネル式ノートの取り方については、この記事を参考にするといいかもしれません。

 また、そういう意味では、編集という技術についても、少し興味があります。というのは、編集というのは、知識が知識として姿を見せる有り方みたいなものを作り上げるものだから、という印象があるからです。なもんだから、工作舎の本などを置いたりしています。

小さい会社で働くということ

 他のトップスターエンジニアと違い、自分の場合は、あまり有名ではない会社で働いています。

 大きな会社と小さな会社の違いというのは、実は大企業というものに勤めたことが無いので全くわからないのですが、現状だと、やはり自分が動くことによる、その影響力の大きさであったりする部分にあるのかもしれませんし、それを伝えやすいという部分もあるのかなあ、と考えました。

意識の高さというよりは、自分のために

 こういう風にまとめていくと、なんだか言いかたは悪いですが、意識の高さという感じを受けるのかもしれません。あるいは「会社のため」という言葉を思い浮かぶかもしれません。

 一応、目標設定として「会社の利益や効率化、生産性」というのを建前として説得することは多くありますし、その部分は必要だと思いますが、何よりも効率化したり、あるいはそういう伸びしろみたいなところがあったほうが、絶対的に自分が働いていて楽しい筈だし、楽になる部分がある。

 プログラマーの三大美徳に「怠惰」「短気」「傲慢」というのがありますが(元ネタはLarry Wallらしいですが)、自分の場合も当てはまります。

 なぜこれらが美徳になるのか。

 例えば「怠惰」について、自分なりに言われてきたことを整理するならば、つまり仕事を出来るだけ楽に終わらせることができるように工夫することだと思います。

 「自分が手を抜くために最大限の努力をする人」というのはいます。当然のことながら、「自分が手を抜くためにやったコスト」よりも、普通にこなしたほうがよいこともあるのですが、そういう努力を楽しんでやってしまう。短気の場合も似たようなところがあるとは思います。

 そういったところで、「会社のため」と「自分のため」みたいなところを接続していければいいなあというのは、ここ一年間思ったことでした。

次の一年間に向けて

 最近、マリーチに関しては、今後の一年間について語るということをやっていますが、自分の過去を振り返ると、その「一年」というスパンで何かを成し遂げたことがないので、あまり実感がないというのはありますし、もしかしたら転職してたり、またぶっ倒れて無職になっているかもしれません。

 ただ、やはりこういう形でトライエラーしやすい形でいろんなことが出来る環境と言うのは貴重だと思うし、その部分でなにかしらの結果を残せることが出来れば、と思っています。そういう意味では、自分がどうなるのであれ、マリーチという会社に感謝しています。

 それでは、三ヶ月後の自分の誕生日にまたこういう話を書くかと思います。それでは!また、株式会社マリーチもよろしくお願いします。

風景

f:id:nisemono_san:20130701211016p:image

自分の興味がある本やら、あるいは他の人が購入した文房具などが共有されているテーブル。レゴもある。

f:id:nisemono_san:20130701210356p:image

ホワイトボード。こういう形でいろんなことを書き込んでいる。

f:id:nisemono_san:20130701210355p:image

次、社外用ブログに乗る予定の漫画。

danliondanlion2013/07/03 13:09「まず何か一人でコツコツと」 いいね!

2013-06-30

[] 人工無能について興味を持ち始める 03:12

始めに

 実は、ちょこちょこと機械学習について調べているのですが、元文系である自分としては、数式であったりとか、アルゴリズムの理解とかが大変な感じで、理解がなかなか追いつかない感じです。

 「機械学習」は、一般的には「人工知能」の分野の一つ、みたいに捉えていますが、その一方で「人工無能」と呼ばれる一連のシステムがあります。

 もちろん、「人工知能」と「人工無能」という概念は、よく調べる限りだと余り対立するわけではなく、どのように、「知能」というものに対してアプローチしていくかという違いになるようです。

 例えば、wikipediaを見てみると、「人工知能」がボトムアップ、つまり普段から人間がやっているような、

トライアンドエラーであったり、フィードバックをしたりしながら、知能を形成していくようにアルゴリズムを組むのに対して、「人工無能」の場合であるならば、「トップダウン」で、「知能というのはこういうものである」というように組んであげるといった違いがある、と言えるのでしょうか。

 最も簡単な「人工無能」の最小単位というものを考えてみましょう。ある出力が入ってきたら、自分が所持する文字列のリストから、ランダムに結果を返すというものだと思います。簡単に、Pythonの場合の実装を考えてみましょう。

# -*- coding: utf-8 -*-
import random


def reply():
    answers = [
        u'ふむふむ',
        u'それで?',
        u'もっと具体的には?',
        u'ちょっと違うと思うな',
        u'別の観点から考えよう',
        u'とてもいい視点だね',
        u'あとは何が足りないかな']
    print answers[random.randint(0, len(answers) - 1)]


def start():
    while 1:
        command = raw_input('>>>')
        reply()
        if command == 'exit':
            break


if __name__ == '__main__':
    start()
    print 'Bye :) .'

 さて、ここで人工無能が突きつける一つの事実があります。それは、人工無能の、この単純なアルゴリズム自体が、順番によって、一瞬だけ「知能がある」という錯覚を私たちに与えてしまうということです。要するに、「知能があるかどうか」ということを、判断しているのは、私たちの側であるということに気がつかされます。

 例えば、文章の場合、人工知能的なアプローチだと、如何に与えられた言葉を解析するのか、という問題が出てきます。いわゆる自然言語処理と呼ばれる分野です。そこから色々なアプローチを使って、重要そうな文章であったり、あるいは、その中からトピックを探し出したり、ということを行なったりします。

 しかし、人工無能の場合、果たして、私たちが入力している文章自体を理解するべきなのかといった問題も含まれて来ます。もちろん、それだけでは何にも使えないので、何かの単語が入っていたならば、という条件であったり、あるいは「こういう文章の並びならこうしろ」というような条件を与えます。

中国人の部屋の問題

 ところで、ジョン・サールという哲学者が、文章を理解することについての思考実験をしています。それを『知能の謎 認知発達ロボティクスの挑戦 (ブルーバックス)』という本から引用してみましょう。

 部屋に閉じ込められたサールは、外部から中国語で書かれた質問カードを与えられる。まったく中国語を知らないサールは、この質問を中国語で応えて外部にカードを出力しなければならない。この部屋には質問に応えるためのたくさんの中国語カードが常備されており(これを常識的知識のデータベースとよんでもよいだろう)、また「こういう中国語記号が来たらこういった中国語のカードを並べよ」などと細かく示されたルールブックもある。ルールブックは英語でかかれているのでサールも読めるとしよう。もしサールがこのルールブックに乗っとってきちんと作業をすれば、外部にいる人は「ここには中国語に堪能な人が入っているに違いない」と思うだろう。だが、サール自信が中国語を理解しているとはいえないのではないか?サールはこの思考実験で、チューリング・テストに合格するような機械であっても「考えている」とはいえないのではないか、と反論したのである。(p.80)

 長くなりましたが、ざっくりとまとめてしまうならば、ここで提起されている問題は、「ルールの束を運用すること」と「理解する」ということには隔たりがあるのではないか、ということです。

 人工知能の場合において、この問題がどのように扱われているのかはわかりませんが、しかし人工無能というのは、むしろ「中国人の部屋」の問題に近い状態です。人工無能の場合は、単なる「ルールの束」を運用しているに過ぎません。ですが、私はむしろ、この「ここには中国語に堪能な人が入っているに違いない」という錯覚のほうが重要のように感じるのです。

 そのことについて、次に書いてみましょう。

問題解決と問題発見

 ちょっとした、人工知能関連の本を読んだ人ならわかる通り、人工知能の最初の関心というのは、問題解決と、それにまつわる検索の問題がまっさきに来ます。人工知能の本っぽく言うならば、「問題の表現」であり、そのために状態空間表現というのが使われます。「問題」は「初期状態」と「目標状態」と「規則」によって定義されます。

 ちょっとややこしいですが、例えば降順ソートのことを考えてみましょう。目の前にランダムに引かれたトランプのカードを、小さい数の順に並べるといったことを考えた場合を考えてみます。

 例えば、カードが[1, 12, 9, 5]という形で渡された場合、これが初期状態になります。目標状態は[1, 5, 9, 12]になるでしょう。この場合は、どちらかというと、一番効率の良い規則を考えることになるかと思われます。

 ソートアルゴリズムに関しては色々とあると思うのですが、ここは一つ、人工無能が持ちうる実装の一つとして、ランダム性というのを取り上げてみようと思います。それは、ネタアルゴリズムとして有名なボゴソートです。

 ボゴソートというのは、初期状態である配列をランダムに並べなおし、それをソートされているかどうかチェックし、もしソートされていないならまた配列をランダムにしなおす、といったようなことをするソートのことで、非常に効率の悪いソートとして良く知られています。下に、サンプルコードを載せておきます。

# -*- coding: utf-8 -*-
import random


def _bogosort(init_array, times):
    work_array = []
    while len(init_array) > 0:
        target_pop = random.randint(0, len(init_array) - 1)
        work_array.append(init_array.pop(target_pop))
    if not check_sorted(work_array):
        return False, work_array, times
    else:
        print "Times: %d" % times
        print work_array
        return True, work_array, times


def bogosort(init_array):
    is_sorted, result, times = _bogosort(init_array, 1)
    while not is_sorted:
        is_sorted, result, times = _bogosort(result, times + 1)
    return times


def check_sorted(check_array):
    previous = None
    for i in check_array:
        if previous is None:
            previous = i
            continue
        if previous > i:
            return False
        previous = i
    return True


if __name__ == "__main__":
    times = []
    for i in range(100):
        times.append(
            bogosort([4, 9, 2, 1, 5, 12]))
    bogosum = sum(times)
    print "Means:"
    print bogosum / len(times)

 このように、ランダム性自体が、問題解決としてはあまりいいものではない、という側面があることが確認できると思います。

 しかし、逆に問題を作る側としてはどうでしょうか?

 例えば、Haskellのテストの方法に、QuickCheckというテスト方法があります。どういうものなのか、については本物のプログラマはHaskellを使う - 第17回 QuickCheckでデータ駆動型テストを行う:ITproを見ていくとして、要するにテストデータをランダムに作成して、それらをデータとして使うわけです。これらの問題をあぶり出していくときには、むしろこういうランダム性のほうが有効であることがあります。

 また、Loguelikeと言われるゲームがあります。有名なところだと、Nethack、あるいは「トルネコの大冒険」ときけばピンと来るでしょう。殆どのゲームに関してはランダムが関わっています。よりよいランダムを実装することによって、問題を作ることには長けている部分があるように感じます*1

 他にも、Twitterの初期のころからマルコフ連鎖を使うことによって、面白い文章を生成するという圧縮新聞もあります。マルコフ連鎖が出てくると、少し確率の話も出てくるのですが、このあたりのアルゴリズムの不完全さを利用して、逆にコンテンツを作り出すという部分は面白いかもしれません。

遺伝的アルゴリズムによる突然変異

 とはいえ、人工知能のことに対してランダム性がない、というのはフェアではないでしょう。上記で「問題を解決するさいに〜」という話をしましたが、遺伝的アルゴリズムでは、ランダム性を上手く取り入れています。その部分はどういうところかというと、突然変異の部分です。

 実装したことがないので、詳しいところはよくわからないのですが、解説書を読む限りだと、遺伝子に類似するデータを、選択・交叉していくのが基本なんだそうですが、しかしこれだけだと、もしものときに偏りが生じる可能性が出てくる。なので、たまに突然変異をしてあげることによって、その偏りを無くそうというアプローチだそうです。

 ここはまだ全然勉強していない半端者の想像でしかないのですが、例えばある経路を最適解として実行していた場合、実際の最適解は、実はその実行とは全く違う形をとっていたとき、「ある経路」にいつまでもこだわり続けると、最適解にたどり着くことができない。なので、乱数を与えてあげることによって、その最適解へと飛ぶのだそうです。

まとめ:ランダム性をどのように取り入れるのか

 だんだんまとまりが無くなってきましたし、もう長すぎるので、今日は一度筆を起きたいと思いますが、自分がなぜ「人工無能」に惹かれるのかといえば、上記のように、いわゆる「推論」であったり「解決」であったり「分析」といったような部分ではない、もう少し創造的な関わりとして、人工無能的なアプローチは使えそうなのではないか、というのがするわけです。

 きっかけがあったらアイデアが出てくるのですが、そのきっかけを作るのが案外難しいというのがあります。そのきっかけを作るという意味では、上記の意味でのランダム性という部分に惹かれるわけです。

 このあたりについては、「エキスパートシステム」、つまり専門家の代わりをして、必要な知識を見付け出してユーザーに与えるといったような分野の問題とも絡んでくるのかなあ、とは思うのですが、今日は夜が遅くなりましたので、またの機会に書ければと思います。

*1:ただ、本当にランダムのほうがいいのか。例えば、レベルデザイナーがちゃんと設計したステージのほうが、ランダムで生成されるものよりも満足度が高いという話はあるそうです