株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。
2018年7月27日のイベントでは「プログラミング未経験でもOK!Pythonで体験するAI(ディープラーニング)と独学でプログラミングをマスターする方法」と題して、書籍『わかるPython[決定版]』や『100問でわかるPython』などの著者、松浦健一郎さんをお迎えして、AIプログラミングとPythonの独学方法について教えていただきました。
■今回のイベントのポイント
・今、どのプログラミング言語を学ぶべきか?
・ディープラーニングを体験しよう
・Pythonはここがキモ~この機能を使え!
・独学でプログラミングスキルを身に付けるには
今、どのプログラミング言語を学ぶべきか?
これまでに多数のプログラミング言語を学び、使いこなしてきた松浦さんは、言語の学び方にもいくつかオススメの方法があるそうです。それは次のようなもの。
・そのとき必要な言語を学ぶ
・目的のものが作れる言語を学ぶ
・短期間で学ぶ
そして、仕事をしながら学ぶ(仕事に育ててもらう)というのがポイント。Pythonを学ぶなら、Pythonの仕事をするのがベストということになります。
いくつもの言語を学ぶのは大変と思うかもしれませんが、共通の概念を学んでおけば、大丈夫。各言語で共通の概念とは次のような項目です。
・アルゴリズム
・計算機アーキテクチャ
松浦さんがPythonをオススメする理由の一つとして紹介してくれたのが、「活きのいい言語を選ぶ」というものでした。
たとえば、大ヒットした映画の続編となるパート2が面白くないという評価を受けることが多いのは、オリジナルの作者が制作から離れていることがあるから。プログラミング言語も同様で、その言語の作者が今でもバージョンアップに関わっているものが、オリジナルの設計思想が失われていない「活きのいい」言語だそうです。Python開発者のグイド・ヴァンロッサムは62歳とメジャーな言語の開発者としては若いので、今後もPythonに関わり続けてくれることを期待したいです。
※本イベントが開催された2018年7月、グイド・ヴァンロッサム氏はPythonの機能拡張に関する議論の調停役からの引退を発表したが、当面の間はPythonの開発に携わるとのこと。
一方で、コンピュータアーキテクチャを理解するのに役立つ機械語も、オススメの言語とのこと。
ディープラーニングを体験しよう
Pythonといえば機械学習。そこで実際にディープラーニング(深層学習)を体験してみることに。
ディープラーニングを知るために、まずはニューラルネットワークの基礎を学びます。
結合されたノードとノードの間を、信号が伝わっていきます。結合には「重い結合」と「軽い結合」があり、重い結合は次のノードに信号を強く伝え、軽い結合は弱く伝えます。入力層に入力された信号は、中間層に伝わり、続いて出力層に伝わります。出力層に伝わった信号が、ニューラルネットワークが出した「答え」に相当するのだそうです。
ある層のノードと次の層のノードをすべて結合させたものを「全結合のニューラルネットワーク」と呼び、中間層が2層以上のものを「ディープニューラルネットワーク」と呼びます。
ニューラルネットワークの結合の強さを調整する作業を「学習」と呼び、ディープニューラルネットワークの結合の強さを調整することを「ディープラーニング」と呼ぶそうです。最近、いろいろな場所で「ディープラーニング」という言葉は耳にしますが、その意味は今回のイベントで初めて知った、という方もいらっしゃったのではないでしょうか。
結合の強さを決めるのが「重み」と「バイアス」です。下図の例では、入力Aに重みAXをかけ、入力BにBXをかけ、バイアスXを足したものが出力Xに、同様にAにAYをかけ、BにBYをかけ、バイアスYを足したものが出力Yになります。
Pythonのディープラーニングのサンプルとしてよく紹介されるのが手書き文字認識。MNISTと呼ばれる手書き数字のデータを使います。
このデータはグレースケールの画像で、輝度0~255の256段階の階調で表されています。本来、MNISTのデータはピクセル数も多いのですが、松浦さんは、参加者が手計算でもできるように、4×4ピクセルのデータを例に、処理をわかりやすく紹介してくれました。
まず、入力データに重みを適用する「畳み込み」という処理を行います。これは「畳み込みニューラルネットワーク(CNN)」で行う処理の一部です。
4×4の入力データに対して3×3の重みを適用するには、3×3の重みをずらしながら演算します。しかし、これでは結果が2×2のデータになってしまい、入力データの4×4に比べると情報量が減少してしまいます。
そこで、入力データの周囲を0で埋める「パディング」という処理を行います。これにより、元のサイズの出力が得られます。
畳み込みの後に「プーリング」という演算を行います。典型的なプーリングの手法は、マックスプーリングといって、2×2の4つのマトリックスの中から、それぞれの最大値を取り出します。
さらに、過学習を防ぐための「ドロップアウト」という処理を経て、最終的な出力を行います。こうした処理を何段階も組み合わせて、次のようなMNISTを認識するためのCNNを構築するそうです。
Pythonはここがキモ~この機能を使え!
ここからは、松浦さんオススメのPythonのキモとなる機能について。まずはデータ型からです。Pythonでは次のようなデータ型が使えます。
(値,値,……)
・リスト:値を追加・変更・削除可能
[値,値,……]
・集合:重複しない値の集まり、高速検索
{値,値,……}
・辞書:重複しないキーと値の組の集まり、高速検索
{キー:値,キー:値,……}
これらのデータ型の特性を把握し、適切に使い分けることで、プログラムを簡潔にしたり、プログラムの実行速度を高めたりといった、効果的なプログラミングができるようになるとのことです。
また、プログラムを短く書けることも、Pythonの特長だそうです。
特に「内包表記」は、for文よりもプログラムを短く簡潔に書くのに役立つそうです。
独学でプログラミングスキルを身に付けるには
最後に、独学でプログラミングスキルを身に付けるためのアドバイスもいただきました。
開発を成功させるには、開発を小さなステップに分けるのがコツだそうです。たとえば、最終目標までの道筋を設計し、目標1→目標2→目標3……→最終目標というように、細かな目標を立て、一つ一つクリアしていく。実際にプログラミングするときも、目標ごとにプログラムの動作を確認しながら進めます。
目標2を作成→目標2の動作を確認する→修正する→完成
最終目標までの道筋を設計した上で、この作業を繰り返していくと良いとのことでした。
今回のイベントでは、ディープラーニングがどんなことをしているのか、その片鱗に触れられたのがとても印象的でした。AI関連のプログラムを開発する予定はなくとも、色々な処理を短く簡潔に書けるなど、Pythonの新たな魅力を知ることができました。Pythonに関しては、今注目の言語ということもあり、勉強している方も多いと思います。ぜひ、松浦さんの著書『わかるPython[決定版]』も活用してみましょう。