« WindowsのRubyのバージョン管理はuruを使う | トップページ | Windows上でJRuby9+Redmine3.3.1を構築した時のメモ »

2016/12/18

Pythonの記事のリンク~道具が理論にようやく追いついてきた

最近のバズワード「ビッグデータ」「機械学習」が知りたくて、Pythonの記事のリンクをメモ。
自分用の参照記事。
ラフなメモ書き。

【参考1】
Pythonでプログラミングを始めよう:新刊ピックアップ|技術評論社

(引用開始)
「もしコンピュータ言語をひとつも知らないのなら,まずPythonを学ぶことを勧める」。これは『How to become a hacker』(Eric S. Raymond著)の一節です。なぜ,Pythonを勧めるのか,それには様々な理由がありますが,筆者の経験や,世の中の動向を踏まえて説明してみます。
(中略)
工学系のエンジニアにとっても,プログラミングのスキルは設計作業に必要不可欠です。筆者もメーカーに勤務するエンジニアですが,入社以来様々な言語を使ってきました。シェルスクリプト,sed,Perl,C言語,C++,MATLAB/Simulink,Octave,Scilab,Mathematicaなど,作業内容に応じて使い分けています。テキストデータの整形をsedで行ったのち,C言語のプログラムから読み込んで処理し,その結果をMATLABで解析・可視化する,といった具合です。
(中略)
このような状況を変えつつあるのがPythonです。Pythonは,テキストデータの整形も,数値計算とその結果の可視化も得意です。すべての作業でPythonを使えば事足りる,という場面が多いのです。そのため,Pythonを使って設計をする機会が,日増しに増えています。

また,エンジニアにとって大切なことは,自分の設計内容や検討内容を完全に把握しておくことです。その点,MATLABのような有償のソフトを使うと,ライブラリのソースコードが公開されていないことが問題になる場合があります。Pythonと,Pythonの主要なライブラリの場合は,ほとんどがオープンソースプロジェクトです。そのため,すべてを自分のコントロール下に置いて,開発を進めることが可能です。
(引用終了)

(引用開始)
ディープ・ラーニングとビッグデータ解析での活用

次に,Pythonが実際に活用されている場面を見ていきます。

AlphaGoの快挙を支えたPython
ぶつからない車もPython!?
ビッグデータ解析でもPython
(引用終了)

【感想1】
R言語を色々触ってみたが、何か使いづらい。
たぶん関数型言語の特有の考え方に僕が慣れていなからだろう。
Pythonなら、RubyやJavaにも似ているので書きやすそう。

データの統計処理だけでなく、ファイル読み込み、グラフ表示、正規表現も一つの言語で処理できるのは便利。
プログラミングは歴史や英語のような暗記は不要だけど、APIの使い方とかテクニックは最終的には覚えるしか無い部分がある。

「エンジニアにとって大切なことは,自分の設計内容や検討内容を完全に把握しておくことです」という指摘は同意する。
「すべてを自分のコントロール下に置いて,開発を進める」ことが重要だから。
自分が使っている道具の特徴、癖を知っておかないと、自分が解決したい問題に適用する時に、落とし穴に落ちる時があるから。

道具の制約が、問題解決の可能性を制限する。
道具の制約が、問題解決の発想、アイデアの範囲や質を制限するから。

【参考2】
akipiiさんのツイート: "「断片的な情報を地図にまとめて大局的な視点を持つ」「人に何かやって貰いたい時は具体的に指示をだす」「今あるものを工夫して新しい道具を作り出す」といったエンジニアにとって大事なことがストーリーに織り込まれています。ルビィのぼうけんhttps://t.co/OaZHqw2E0w"

ルビィのぼうけん」のAmazon書評コメント欄に、下記のコメントがあってすごく納得した。

Amazon.co.jp: ルビィのぼうけん こんにちは! プログラミングの deko-papaさんのレビュー

(引用開始)
翔泳社の特設サイトで見つけて、帰宅途中で書店にて購入。10歳の娘に買って読ませてみました。
 夢中になって読んで、あっという間に前半のストーリー部分は読破。後半の練習問題は、夜遅かったので翌日へ。さらに寝るまでお母さんに読み聞かせを強請っていました。

 私はさわりの部分しかまだ読んでいませんが、それでも「断片的な情報を『地図』にまとめて、大局的な視点を持つ」「人に何かやって貰いたい時は、具体的に指示をだす」「今あるものを工夫して新しい道具を作り出す」といったエンジニアにとって大事なことがさりげなくストーリーに織り込まれているのが分かります。

 さらに、絵の中にさらっとプログラミング言語のキーワードが描かれています。もちろんそれについての説明は一切ありませんが、将来プログラミングに触れたとき、「あ!見たことある!」とこの絵を思い出す子どもが大勢いることでしょう。
(引用終了)

【感想2】
「プログラミングは実現したいことの手段に過ぎない」意見もあるが、僕はむしろ、プログラミングという道具が思考方法を規定してしまう側面の方を強く感じる。
既に確立した理論はあり、その理論の内容を実現したいのに、プログラミング言語やそのライブラリが貧弱であれば、やりたいことを表現するのにすごく手間がかかって、イライラしてしまう。

たとえば、配列やハッシュにデータを一時的に退避するとか、ファイルを読み込んで文字列を正規表現でマッチする部分を抽出するとか、そういうコンピュータの基盤に近い部分の処理は手短に書きたい。
そして、理論が本来言いたい部分をプログラミング言語で的確に表現したいのだ。

プログラミングにおいて、「断片的な情報を地図にまとめて大局的な視点を持つ」考え方は、理論で本来実現したい結果を得るための登山ルートを詳細に具体化する能力に対応するのではないか。
「今あるものを工夫して新しい道具を作り出す」考え方は、プログラミング言語とライブラリという「道具」で工夫して、理論で実現したい結果を得るためのアルゴリズムを作りだすのに使う、ことに相当するのではないか。

つまり、今ある道具を工夫する手間が少ないほど、コンピュータレベルではなく、もっと高次のレベルで物事を思考することが容易になるはず。

たとえば、統計学の理論は基礎数学で確立しているけれど、経済学者や心理学者は「大数の法則」「中心極限定理」「正規分布」などの定理や概念を数学的に証明するのに使いたいわけではない。
それらの定理や概念という道具を使って、経済現象や人間の心理現象を分析して、問題を解決したり、新たな観点をもたらしたいのだ。
昔は計算能力が貧弱だったので、統計処理はいかに簡便な手計算でやるか、という技術の説明をする本ばかりだったけれど、今は、優れたプログラミング言語やライブラリは揃っているから、計算処理はコンピュータに任せることが楽になった。

すると、理論がどのプログラミングのモデルに適用できるか、理論をどのプログラミングのモデルに適用すると手短にたどり着けるか、という考え方に発展するだろう。
つまり、問題のレベルが、単にプログラムが書ける、というレベルではなく、プログラムが表現するモデルが理論や現象を上手く説明できているか、というレベルに上がるだろう。
そこが面白くなってくる。

【参考3】
いまさら聞けないDeep Learning超入門(1):ニューラルネットワーク、Deep Learning、Convolutional Neural Netの基礎知識と活用例、主なDeep Learningフレームワーク6選 (1/2) - @IT

(引用開始)
 筆者がデータ解析に従事し始めた2010年ごろ、Deep Learningという言葉は一部のアカデミックな分野では流行していましたが、ユーザー企業でその言葉を聞くことはあまりありませんでした。

 今あらためて、Deep Learningの歴史をひも解いてみると、その歴史は決して明るいものではなかったことが分かります。Deep Learningの構成要素である、ニューラルネットワークとそれを単純に多層に組み合わせたものに関しては、それこそ1980~1990年代前後から盛んに研究されていました。しかし、その精度や処理量の問題から、同じく分類推定モデル構築によく利用される機械学習ロジックである「ベイジアンネットワーク」「サポートベクターマシン」の裏に隠れてしまい、冬の時代が長く続くことになったのです。

 再び脚光を浴びるようになったのは2000年代に入ってから。2006年にDeep Learningが発表され、その後2012年にトロント大学のHinton氏が「ImageNet」と呼ばれる画像セットを用いた画像識別コンペティションでDeep Learningを用いて2位以下を大きく引き離す精度を記録したことがきっかけです。このあたりからグーグルをはじめ、マイクロソフトやフェイスブックなどが注目し、ビッグデータのブームやGPUサーバーなどのハードウエア面の進化も伴ってDeep Learningは広くデータ解析者に広がっていきました。

 Deep Learningの最大のウリは何といっても、「人手で特徴量を抽出する必要がない」という点です。
(引用終了)

深層学習(ディープラーニング)を素人向けに解説(前編)―基礎となるニューラルネットワークについて

(引用開始)
ディープラーニングとは、適切な特徴抽出能力を持つ教師なしニューラルネットワークを多層にして構築したものです。
(中略)
まず、ディープラーニングを理解するためには、ニューラルネットワークを理解しなければなりません。逆に、ニューラルネットワークを理解してしまえば、ディープラーニングの概要自体はかなり分かりやすくなります。

ニューラルネットワークと言うのは、人の神経を模したネットワーク構造のことです。それを踏まえて、そう言う構造を持った人工知能のこともそう呼びます。このニューラルネットワークでは、神経細胞を模したパーセプトロンと言う小さな計算機をたくさん用意し、一つの計算を協力して行わせるように作られています。
(引用終了)

【感想3】
最近、囲碁でコンピュータが人間に勝ったニュースが流れたが、Deep Learningのアルゴリズムはニューラルネットワークであることは初めて知った。
30年以上前にニューラルネットワークは流行したけど、なかなか実用に至らなかった、という話は随分聞いた。
僕は、Deep Learningのアルゴリズムはベイズ統計かなと思っていたので、意外だった。

そんな話を聞くと、昔に確立した理論が、ようやく時代に追いついて花開いた、と感じる。
今ようやく、プログラミング言語の科学技術ライブラリ、統計処理ライブラリ、クラウドなどの開発基盤がそろってきたから、ニューラルネットワークのような理論が実際にプログラム上で実現できたわけだ。

ニューラルネットワークの理論は僕も詳細は知らないけど、古くから研究されて確立している理論なので、その理論をバックにした技術はそう簡単には廃れないだろうと直感する。
今後も、たくさんの応用用途も見つかるだろう。

実際、Deep Learningは、車の自動運転、顔認証システムなどにも使われている。
アイデアさえあれば、もっといろんなことが出来るはず。

技術の背後に数学の理論があると廃れない: プログラマの思索

数学や物理は背景にある思想を知らなければ理解できない: プログラマの思索

【感想4】
僕は「新しいアイデアとは、古いアイデアを新しい場所に置いたアイデアのこと」という言葉が好き。
既に知られた理論や知見(例:統計学、ニューラルネットワーク)は、新しい場所(例:人工知能、深層学習、自動運転、顔認証)で使われると、新たな発見を呼び起こす。
そういうことをやってみたい。

|

« WindowsのRubyのバージョン管理はuruを使う | トップページ | Windows上でJRuby9+Redmine3.3.1を構築した時のメモ »

プログラミング」カテゴリの記事

統計学・機械学習・深層学習」カテゴリの記事

Python」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« WindowsのRubyのバージョン管理はuruを使う | トップページ | Windows上でJRuby9+Redmine3.3.1を構築した時のメモ »